@nvidia-elements/core 0.0.10 → 0.0.12
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 +33 -0
- package/dist/accordion/accordion.examples.json +11 -11
- package/dist/accordion/accordion2.js +4 -4
- package/dist/alert/alert-group2.js +1 -1
- package/dist/alert/alert.examples.json +12 -12
- package/dist/alert/alert2.js +1 -1
- package/dist/avatar/avatar-group2.js +1 -1
- package/dist/avatar/avatar.examples.json +6 -6
- package/dist/avatar/avatar2.js +1 -1
- package/dist/badge/badge.examples.json +12 -12
- package/dist/badge/badge2.js +1 -1
- package/dist/breadcrumb/breadcrumb.examples.json +3 -3
- package/dist/breadcrumb/breadcrumb2.js +1 -1
- package/dist/bundles/index.js +4 -4
- package/dist/button/button.examples.json +24 -24
- package/dist/button/button2.js +1 -1
- package/dist/button-group/button-group.d.ts +1 -1
- package/dist/button-group/button-group.examples.json +11 -11
- package/dist/button-group/button-group2.js +1 -1
- package/dist/button-group/button-group2.js.map +1 -1
- package/dist/card/card.examples.json +10 -10
- package/dist/card/card2.js +4 -4
- package/dist/chat-message/chat-message.examples.json +7 -7
- package/dist/chat-message/chat-message2.js +1 -1
- package/dist/checkbox/checkbox-group2.js +1 -1
- package/dist/checkbox/checkbox.examples.json +7 -7
- package/dist/checkbox/checkbox2.js +1 -1
- package/dist/color/color.examples.json +4 -4
- package/dist/color/color2.js +1 -1
- package/dist/combobox/combobox.examples.json +24 -24
- package/dist/combobox/combobox2.js +1 -1
- package/dist/copy-button/copy-button.examples.json +9 -9
- package/dist/copy-button/copy-button2.js +1 -1
- package/dist/custom-elements-jsx.d.ts +1 -1
- package/dist/custom-elements-vue.d.ts +1 -1
- package/dist/custom-elements.json +15 -73
- package/dist/data.html.json +2 -2
- package/dist/date/date.examples.json +7 -7
- package/dist/date/date2.js +1 -1
- package/dist/datetime/datetime.examples.json +4 -4
- 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/dialog.examples.json +21 -21
- package/dist/dialog/dialog2.js +1 -1
- package/dist/divider/divider.examples.json +5 -5
- package/dist/divider/divider2.js +1 -1
- package/dist/dot/dot.examples.json +5 -5
- 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/drawer.examples.json +13 -13
- 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/dropdown.examples.json +14 -14
- package/dist/dropdown/dropdown2.js +1 -1
- package/dist/dropdown-group/dropdown-group.examples.json +4 -4
- package/dist/dropdown-group/dropdown-group.js +1 -1
- package/dist/dropzone/dropzone.examples.json +3 -3
- package/dist/dropzone/dropzone2.js +1 -1
- package/dist/file/file.examples.json +3 -3
- package/dist/file/file2.js +1 -1
- package/dist/format-datetime/format-datetime.examples.json +9 -9
- package/dist/format-datetime/format-datetime2.js +1 -1
- package/dist/format-relative-time/format-relative-time.examples.json +7 -7
- package/dist/format-relative-time/format-relative-time2.js +73 -53
- package/dist/format-relative-time/format-relative-time2.js.map +1 -1
- package/dist/forms/actions.examples.json +3 -3
- package/dist/forms/control/control.examples.json +11 -11
- 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/forms/forms.examples.json +8 -8
- package/dist/forms/validation.examples.js.map +1 -1
- package/dist/forms/validation.examples.json +5 -5
- 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/grid.examples.json +43 -43
- package/dist/grid/grid2.js +1 -1
- package/dist/grid/header/header2.js +2 -2
- package/dist/grid/header/header2.js.map +1 -1
- package/dist/grid/placeholder/placeholder2.js +1 -1
- package/dist/grid/row/row2.js +1 -1
- package/dist/icon/icon.examples.json +8 -8
- package/dist/icon/icon2.js +2 -2
- package/dist/icon-button/icon-button.examples.json +13 -13
- package/dist/icon-button/icon-button2.js +1 -1
- package/dist/index.js +1 -1
- package/dist/input/input-group.examples.json +2 -2
- package/dist/input/input-group2.js +1 -1
- package/dist/input/input.examples.json +8 -8
- package/dist/input/input2.js +1 -1
- package/dist/internal/controllers/i18n.controller.examples.json +1 -1
- package/dist/internal/controllers/keynav-grid.controller.examples.json +2 -2
- package/dist/internal/controllers/keynav-grid.controller.js +15 -7
- package/dist/internal/controllers/keynav-grid.controller.js.map +1 -1
- package/dist/internal/controllers/keynav-list.controller.examples.json +4 -4
- package/dist/internal/controllers/keynav-list.controller.js +11 -5
- package/dist/internal/controllers/keynav-list.controller.js.map +1 -1
- package/dist/internal/controllers/popover.examples.json +8 -8
- package/dist/internal/controllers/type-button.controller.examples.json +1 -1
- package/dist/internal/controllers/type-popover.controller.examples.json +2 -2
- package/dist/internal/controllers/type-touch.controller.examples.json +1 -1
- package/dist/internal/services/global.service.js +1 -1
- package/dist/internal/utils/objects.js +17 -9
- package/dist/internal/utils/objects.js.map +1 -1
- package/dist/logo/logo.examples.json +6 -6
- package/dist/logo/logo2.js +1 -1
- package/dist/menu/menu-item2.js +1 -1
- package/dist/menu/menu.examples.json +15 -15
- package/dist/menu/menu2.js +1 -1
- package/dist/month/month.examples.json +4 -4
- package/dist/month/month2.js +1 -1
- package/dist/notification/notification-group2.js +1 -1
- package/dist/notification/notification.examples.json +15 -15
- 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/page.examples.js.map +1 -1
- package/dist/page/page.examples.json +37 -35
- package/dist/page/page2.js +1 -1
- package/dist/page-header/page-header.examples.json +9 -9
- package/dist/page-header/page-header2.js +1 -1
- package/dist/page-loader/page-loader.examples.json +2 -2
- package/dist/page-loader/page-loader2.js +1 -1
- package/dist/pagination/pagination.examples.json +16 -16
- package/dist/pagination/pagination2.js +1 -1
- package/dist/panel/panel.examples.json +7 -7
- package/dist/panel/panel2.js +4 -4
- package/dist/password/password.examples.json +3 -3
- package/dist/password/password2.js +1 -1
- package/dist/preferences-input/preferences-input.examples.json +3 -3
- package/dist/preferences-input/preferences-input2.js +1 -1
- package/dist/progress-bar/progress-bar.examples.json +8 -8
- package/dist/progress-bar/progress-bar2.js +1 -1
- package/dist/progress-ring/progress-ring.examples.json +8 -8
- package/dist/progress-ring/progress-ring2.js +1 -1
- package/dist/progressive-filter-chip/progressive-filter-chip.examples.json +7 -7
- package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
- package/dist/pulse/pulse.examples.json +4 -4
- package/dist/pulse/pulse2.js +1 -1
- package/dist/radio/radio-group2.js +1 -1
- package/dist/radio/radio.examples.json +5 -5
- package/dist/radio/radio2.js +1 -1
- package/dist/range/range.examples.json +9 -9
- package/dist/range/range2.js +1 -1
- package/dist/resize-handle/resize-handle.examples.json +7 -7
- package/dist/resize-handle/resize-handle2.js +1 -1
- package/dist/search/search.examples.json +5 -5
- package/dist/search/search2.js +1 -1
- package/dist/select/select.examples.json +18 -18
- package/dist/select/select2.js +1 -1
- package/dist/skeleton/skeleton.examples.json +4 -4
- package/dist/skeleton/skeleton2.js +1 -1
- package/dist/sort-button/sort-button.examples.json +3 -3
- package/dist/sort-button/sort-button2.js +1 -1
- package/dist/sparkline/sparkline.examples.json +13 -13
- package/dist/sparkline/sparkline.utils.d.ts +26 -5
- package/dist/sparkline/sparkline.utils.js +30 -30
- package/dist/sparkline/sparkline.utils.js.map +1 -1
- package/dist/sparkline/sparkline2.js +21 -6
- package/dist/sparkline/sparkline2.js.map +1 -1
- package/dist/star-rating/star-rating.examples.json +4 -4
- package/dist/star-rating/star-rating2.js +1 -1
- package/dist/steps/steps.examples.json +5 -5
- package/dist/steps/steps2.js +2 -2
- package/dist/switch/switch-group2.js +1 -1
- package/dist/switch/switch.examples.json +7 -7
- package/dist/switch/switch2.js +1 -1
- package/dist/tabs/tabs-group2.js +9 -6
- package/dist/tabs/tabs-group2.js.map +1 -1
- package/dist/tabs/tabs.examples.json +14 -14
- package/dist/tabs/tabs2.js +2 -2
- package/dist/tag/tag.examples.json +8 -8
- package/dist/tag/tag2.js +1 -1
- package/dist/textarea/textarea.examples.json +5 -5
- package/dist/textarea/textarea2.js +1 -1
- package/dist/time/time.examples.json +4 -4
- package/dist/time/time2.js +1 -1
- package/dist/toast/toast.examples.json +11 -11
- 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/toggletip.examples.json +12 -12
- package/dist/toggletip/toggletip2.js +1 -1
- package/dist/toolbar/toolbar.examples.json +8 -8
- package/dist/toolbar/toolbar2.js +1 -1
- package/dist/tooltip/tooltip.examples.json +22 -22
- package/dist/tooltip/tooltip2.js +1 -1
- package/dist/tree/tree-node2.js +1 -1
- package/dist/tree/tree.examples.json +13 -13
- package/dist/tree/tree2.js +1 -1
- package/dist/week/week.examples.json +5 -5
- package/dist/week/week2.js +1 -1
- package/package.json +5 -5
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"entrypoint": "@nvidia-elements/core/select/select.examples.json",
|
|
4
4
|
"items": [
|
|
5
5
|
{
|
|
6
|
-
"id": "
|
|
6
|
+
"id": "select",
|
|
7
7
|
"name": "Default",
|
|
8
8
|
"template": "<nve-select>\n <label>label</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message>message</nve-control-message>\n</nve-select>\n",
|
|
9
9
|
"summary": "Basic select component with label, options, and message.",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"tags": []
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
|
-
"id": "
|
|
15
|
+
"id": "select-custom-option-render",
|
|
16
16
|
"name": "CustomOptionRender",
|
|
17
17
|
"template": "<nve-select>\n <label>label</label>\n <select id=\"complex\">\n <option value=\"1\">Debugger</option>\n <option value=\"2\">Task Manager</option>\n <option value=\"3\">CI Services</option>\n </select>\n <div slot=\"option-1\" nve-layout=\"row gap:xs align:vertical-center\">\n <nve-logo color=\"pink-rose\">Db</nve-logo>\n <p nve-text=\"body\" nve-layout=\"column gap:xs\">\n <span nve-text=\"label\">Debugger</span>\n <span nve-text=\"body muted\">some details on option 1</span>\n </p>\n </div>\n <div slot=\"option-2\" nve-layout=\"row gap:xs align:vertical-center\">\n <nve-logo color=\"blue-cobalt\">TM</nve-logo>\n <p nve-text=\"body\" nve-layout=\"column gap:xs\">\n <span nve-text=\"label\">Task Manager</span>\n <span nve-text=\"body muted\">some details on option 2</span>\n </p>\n </div>\n <div slot=\"option-3\" nve-layout=\"row gap:xs align:vertical-center\">\n <nve-logo color=\"green-mint\">CI</nve-logo>\n <p nve-text=\"body\" nve-layout=\"column gap:xs\">\n <span nve-text=\"label\">CI Services</span>\n <span nve-text=\"body muted\">some details on option 3</span>\n </p>\n </div>\n <nve-control-message>message</nve-control-message>\n</nve-select>\n",
|
|
18
18
|
"summary": "Rich option rendering with custom slots containing logos and descriptions for each option.",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
]
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
|
-
"id": "
|
|
26
|
+
"id": "select-prefix",
|
|
27
27
|
"name": "Prefix",
|
|
28
28
|
"template": "<nve-select>\n <nve-button container=\"flat\" readonly>location</nve-button>\n <select aria-label=\"location\">\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n</nve-select>\n",
|
|
29
29
|
"summary": "Select with a prefix button to provide extra context or categorization.",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"tags": []
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
|
-
"id": "
|
|
35
|
+
"id": "select-flat",
|
|
36
36
|
"name": "Flat",
|
|
37
37
|
"template": "<div nve-layout=\"column gap:xl align:stretch\">\n <nve-select container=\"flat\">\n <label>label</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n <nve-select container=\"flat\">\n <label>multiple</label>\n <select multiple>\n <option selected value=\"1\">Option 1</option>\n <option selected value=\"2\">Option 2</option>\n <option selected value=\"3\">Option 3</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n <nve-select container=\"flat\">\n <label>multiple + size</label>\n <select multiple size=\"5\">\n <option selected value=\"1\">Option 1</option>\n <option selected value=\"2\">Option 2</option>\n <option selected value=\"3\">Option 3</option>\n <option value=\"4\">Option 4</option>\n <option value=\"5\">Option 5</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n</div>\n",
|
|
38
38
|
"summary": "Flat container style for single and multi select, providing a minimal visual treatment.",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"tags": []
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
|
-
"id": "
|
|
44
|
+
"id": "select-vertical",
|
|
45
45
|
"name": "Vertical",
|
|
46
46
|
"template": "<div nve-layout=\"column gap:lg align:stretch\">\n <nve-select>\n <label>label</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n <nve-select>\n <label>disabled</label>\n <select disabled>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n <nve-select>\n <label>success</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message status=\"success\">message</nve-control-message>\n </nve-select>\n <nve-select>\n <label>error</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message status=\"error\">message</nve-control-message>\n </nve-select>\n</div>\n",
|
|
47
47
|
"summary": "Vertical layout showcasing states: default, disabled, success, and error.",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
]
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
|
-
"id": "
|
|
55
|
+
"id": "select-horizontal",
|
|
56
56
|
"name": "Horizontal",
|
|
57
57
|
"template": "<div nve-layout=\"column gap:lg align:stretch\">\n <nve-select layout=\"horizontal\">\n <label>label</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n <nve-select layout=\"horizontal\">\n <label>disabled</label>\n <select disabled>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n <nve-select layout=\"horizontal\">\n <label>success</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message status=\"success\">message</nve-control-message>\n </nve-select>\n <nve-select layout=\"horizontal\">\n <label>error</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message status=\"error\">message</nve-control-message>\n </nve-select>\n</div>\n",
|
|
58
58
|
"summary": "Horizontal layout showcasing states: default, disabled, success, and error.",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
]
|
|
64
64
|
},
|
|
65
65
|
{
|
|
66
|
-
"id": "
|
|
66
|
+
"id": "select-multiple",
|
|
67
67
|
"name": "Multiple",
|
|
68
68
|
"template": "<nve-select>\n <label>label</label>\n <select multiple>\n <option value=\"1\">Option 1</option>\n <option value=\"2\" selected>Option 2</option>\n <option value=\"3\" selected>Option 3</option>\n <option value=\"4\" selected>Option 4</option>\n <option value=\"5\">Option 5</option>\n </select>\n <nve-control-message>message</nve-control-message>\n</nve-select>\n",
|
|
69
69
|
"summary": "Many-selection mode allowing users to select many options simultaneously.",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"tags": []
|
|
73
73
|
},
|
|
74
74
|
{
|
|
75
|
-
"id": "
|
|
75
|
+
"id": "select-multiple-disabled",
|
|
76
76
|
"name": "MultipleDisabled",
|
|
77
77
|
"template": "<nve-select>\n <label>label</label>\n <select multiple disabled>\n <option value=\"1\">Option 1</option>\n <option value=\"2\" selected>Option 2</option>\n <option value=\"3\" selected>Option 3</option>\n <option value=\"4\" selected>Option 4</option>\n <option value=\"5\">Option 5</option>\n </select>\n <nve-control-message>message</nve-control-message>\n</nve-select>\n",
|
|
78
78
|
"summary": "Multi-selection in disabled state, showing read-only selected options.",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"tags": []
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
|
-
"id": "
|
|
84
|
+
"id": "select-multiple-overflow",
|
|
85
85
|
"name": "MultipleOverflow",
|
|
86
86
|
"template": "<nve-select style=\"--width: 250px\">\n <label>label</label>\n <select multiple>\n <option value=\"1\">Option 1</option>\n <option value=\"2\" selected>Option 2</option>\n <option value=\"3\" selected>Option 3</option>\n <option value=\"4\" selected>Option 4</option>\n <option value=\"5\" selected>Option 5</option>\n </select>\n <nve-control-message>message</nve-control-message>\n</nve-select>\n",
|
|
87
87
|
"summary": "Multi-selection with constrained width to show overflow handling of selected options.",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"tags": []
|
|
91
91
|
},
|
|
92
92
|
{
|
|
93
|
-
"id": "
|
|
93
|
+
"id": "select-size",
|
|
94
94
|
"name": "Size",
|
|
95
95
|
"template": "<div nve-layout=\"column gap:xl\">\n <nve-select>\n <label>label</label>\n <select size=\"5\">\n <option value=\"1\">Option 1</option>\n <option value=\"2\" selected>Option 2</option>\n <option value=\"3\">Option 3</option>\n <option value=\"4\">Option 4</option>\n <option value=\"5\">Option 5</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n <nve-select>\n <label>label</label>\n <select size=\"3\">\n <option value=\"1\">Option 1</option>\n <option value=\"2\" selected>Option 2</option>\n <option value=\"3\">Option 3</option>\n <option value=\"4\">Option 4</option>\n <option value=\"5\">Option 5</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n</div>\n",
|
|
96
96
|
"summary": "Size attribute controls the number of visible options without scrolling.",
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
"tags": []
|
|
100
100
|
},
|
|
101
101
|
{
|
|
102
|
-
"id": "
|
|
102
|
+
"id": "select-height",
|
|
103
103
|
"name": "Height",
|
|
104
104
|
"template": "<div nve-layout=\"column gap:lg align:stretch\">\n <nve-select style=\"--scroll-height: 150px\">\n <label>label</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n <option value=\"4\">Option 4</option>\n <option value=\"5\">Option 5</option>\n <option value=\"6\">Option 6</option>\n <option value=\"7\">Option 7</option>\n <option value=\"8\">Option 8</option>\n <option value=\"9\">Option 9</option>\n <option value=\"10\">Option 10</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n <nve-select>\n <label>label</label>\n <select>\n <option>Option 1</option>\n <option>Option 2</option>\n <option>Option 3</option>\n <option>Option 4</option>\n <option>Option 5</option>\n <option>Option 6</option>\n <option>Option 7</option>\n <option>Option 8</option>\n <option>Option 9</option>\n <option>Option 10</option>\n <option>Option 11</option>\n <option>Option 12</option>\n <option>Option 13</option>\n <option>Option 14</option>\n <option>Option 15</option>\n <option>Option 16</option>\n <option>Option 17</option>\n <option>Option 18</option>\n <option>Option 19</option>\n <option>Option 20</option>\n <option>Option 21</option>\n <option>Option 22</option>\n <option>Option 23</option>\n <option>Option 24</option>\n <option>Option 25</option>\n <option>Option 26</option>\n <option>Option 27</option>\n <option>Option 28</option>\n <option>Option 29</option>\n <option>Option 30</option>\n <option>Option 31</option>\n <option>Option 32</option>\n <option>Option 33</option>\n <option>Option 34</option>\n <option>Option 35</option>\n <option>Option 36</option>\n <option>Option 37</option>\n <option>Option 38</option>\n <option>Option 39</option>\n <option>Option 40</option>\n <option>Option 41</option>\n <option>Option 42</option>\n <option>Option 43</option>\n <option>Option 44</option>\n <option>Option 45</option>\n <option>Option 46</option>\n <option>Option 47</option>\n <option>Option 48</option>\n <option>Option 49</option>\n <option>Option 50</option>\n <option>Option 51</option>\n <option>Option 52</option>\n <option>Option 53</option>\n <option>Option 54</option>\n <option>Option 55</option>\n <option>Option 56</option>\n <option>Option 57</option>\n <option>Option 58</option>\n <option>Option 59</option>\n <option>Option 60</option>\n <option>Option 61</option>\n <option>Option 62</option>\n <option>Option 63</option>\n <option>Option 64</option>\n <option>Option 65</option>\n <option>Option 66</option>\n <option>Option 67</option>\n <option>Option 68</option>\n <option>Option 69</option>\n <option>Option 70</option>\n <option>Option 71</option>\n <option>Option 72</option>\n <option>Option 73</option>\n <option>Option 74</option>\n <option>Option 75</option>\n <option>Option 76</option>\n <option>Option 77</option>\n <option>Option 78</option>\n <option>Option 79</option>\n <option>Option 80</option>\n <option>Option 81</option>\n <option>Option 82</option>\n <option>Option 83</option>\n <option>Option 84</option>\n <option>Option 85</option>\n <option>Option 86</option>\n <option>Option 87</option>\n <option>Option 88</option>\n <option>Option 89</option>\n <option>Option 90</option>\n <option>Option 91</option>\n <option>Option 92</option>\n <option>Option 93</option>\n <option>Option 94</option>\n <option>Option 95</option>\n <option>Option 96</option>\n <option>Option 97</option>\n <option>Option 98</option>\n <option>Option 99</option>\n <option>Option 100</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n</div>\n",
|
|
105
105
|
"summary": "Custom scroll height for dropdown with many options to control vertical space usage.",
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
]
|
|
111
111
|
},
|
|
112
112
|
{
|
|
113
|
-
"id": "
|
|
113
|
+
"id": "select-fit-text",
|
|
114
114
|
"name": "FitText",
|
|
115
115
|
"template": "<nve-select fit-text>\n <label>label</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 1234</option>\n <option value=\"3\">Option 1234567809</option>\n </select>\n <nve-control-message>message</nve-control-message>\n</nve-select>\n",
|
|
116
116
|
"summary": "Select width dynamically adjusts to fit the currently selected option text.",
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
]
|
|
122
122
|
},
|
|
123
123
|
{
|
|
124
|
-
"id": "
|
|
124
|
+
"id": "select-fit-content",
|
|
125
125
|
"name": "FitContent",
|
|
126
126
|
"template": "<div nve-layout=\"column gap:lg\">\n <nve-select fit-content>\n <label>label</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 1234</option>\n <option value=\"3\">Option 1234567809</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n <nve-select fit-content layout=\"horizontal\">\n <label>label</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 1234</option>\n <option value=\"3\">Option 1234567809</option>\n </select>\n <nve-control-message>message</nve-control-message>\n </nve-select>\n</div>\n",
|
|
127
127
|
"summary": "Select width adjusts to fit the longest option in both vertical and horizontal layouts.",
|
|
@@ -132,7 +132,7 @@
|
|
|
132
132
|
]
|
|
133
133
|
},
|
|
134
134
|
{
|
|
135
|
-
"id": "
|
|
135
|
+
"id": "select-placeholder",
|
|
136
136
|
"name": "Placeholder",
|
|
137
137
|
"template": "<nve-select>\n <label>label</label>\n <select>\n <option value selected disabled hidden>Select Option</option>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message>message</nve-control-message>\n</nve-select>\n",
|
|
138
138
|
"summary": "Placeholder text prompts users to make a selection when no option exists yet.",
|
|
@@ -141,7 +141,7 @@
|
|
|
141
141
|
"tags": []
|
|
142
142
|
},
|
|
143
143
|
{
|
|
144
|
-
"id": "
|
|
144
|
+
"id": "select-placeholder-multiple",
|
|
145
145
|
"name": "PlaceholderMultiple",
|
|
146
146
|
"template": "<nve-select>\n <label>label</label>\n <select multiple>\n <option value selected disabled hidden>Select Option</option>\n <option value=\"1\">Option 1</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message>message</nve-control-message>\n</nve-select>\n",
|
|
147
147
|
"summary": "Placeholder text in multi-selection mode guides users before they select any options.",
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
"tags": []
|
|
151
151
|
},
|
|
152
152
|
{
|
|
153
|
-
"id": "
|
|
153
|
+
"id": "select-disabled",
|
|
154
154
|
"name": "Disabled",
|
|
155
155
|
"template": "<nve-select>\n <label>label</label>\n <select>\n <option value=\"1\">Option 1</option>\n <option value=\"2\" disabled>Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n <nve-control-message>message</nve-control-message>\n</nve-select>\n",
|
|
156
156
|
"summary": "Disable individual options to prevent selection while keeping them visible.",
|
|
@@ -159,7 +159,7 @@
|
|
|
159
159
|
"tags": []
|
|
160
160
|
},
|
|
161
161
|
{
|
|
162
|
-
"id": "
|
|
162
|
+
"id": "select-viewport-overflow",
|
|
163
163
|
"name": "ViewportOverflow",
|
|
164
164
|
"template": "<nve-select layout=\"horizontal-inline\" style=\"margin: 30vh 0 0 60vw; max-width: 500px\">\n <label>label</label>\n <select>\n <option value=\"1\">Option 1 asfd asdf asdf asdf asdf asdf asdfasdf asdf asdf asdf asdf asdf asdf asdf</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n</nve-select>\n<nve-select layout=\"horizontal-inline\" style=\"margin: 55vh 0 0 60vw; max-width: 500px\">\n <label>label</label>\n <select>\n <option value=\"1\">Option 1 asfd asdf asdf asdf asdf asdf asdfasdf asdf asdf asdf asdf asdf asdf asdf</option>\n <option value=\"2\">Option 2</option>\n <option value=\"3\">Option 3</option>\n </select>\n</nve-select>\n",
|
|
165
165
|
"summary": "Viewport overflow test for select element",
|
|
@@ -170,7 +170,7 @@
|
|
|
170
170
|
]
|
|
171
171
|
},
|
|
172
172
|
{
|
|
173
|
-
"id": "
|
|
173
|
+
"id": "select-performance",
|
|
174
174
|
"name": "Performance",
|
|
175
175
|
"template": "<nve-select id=\"performance-select\">\n <label>1000 options</label>\n <select></select>\n</nve-select>\n<script type=\"module\">\n const select = document.querySelector(\"#performance-select select\");\n const options = new Array(1000).fill(\"\").map((_, i) => {\n const option = document.createElement(\"option\");\n option.value = i;\n option.textContent = i + \" item\";\n return option;\n });\n select.append(...options);\n</script>\n",
|
|
176
176
|
"summary": "Performance test for select element with 1000 options",
|
package/dist/select/select2.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"entrypoint": "@nvidia-elements/core/skeleton/skeleton.examples.json",
|
|
4
4
|
"items": [
|
|
5
5
|
{
|
|
6
|
-
"id": "
|
|
6
|
+
"id": "skeleton",
|
|
7
7
|
"name": "Default",
|
|
8
8
|
"template": "<div nve-layout=\"column gap:xs align:stretch\">\n <nve-skeleton></nve-skeleton>\n <nve-skeleton style=\"width: 90%\"></nve-skeleton>\n <nve-skeleton style=\"width: 80%\"></nve-skeleton>\n</div>\n",
|
|
9
9
|
"summary": "Basic skeleton component for text content. Placeholder lines appear while content loads.",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"tags": []
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
|
-
"id": "
|
|
15
|
+
"id": "skeleton-effect",
|
|
16
16
|
"name": "Effect",
|
|
17
17
|
"template": "<div nve-layout=\"column gap:xs align:stretch\">\n <nve-skeleton></nve-skeleton>\n <nve-skeleton effect=\"pulse\"></nve-skeleton>\n <nve-skeleton effect=\"shimmer\"></nve-skeleton>\n</div>\n",
|
|
18
18
|
"summary": "Skeleton loading effects including pulse and shimmer animations. Use pulse for subtle breathing motion or shimmer for a scanning highlight that conveys active content loading.",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"tags": []
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
|
-
"id": "
|
|
24
|
+
"id": "skeleton-shape",
|
|
25
25
|
"name": "Shape",
|
|
26
26
|
"template": "<div nve-layout=\"column gap:xs align:stretch\">\n <nve-skeleton></nve-skeleton>\n <nve-skeleton shape=\"pill\"></nve-skeleton>\n <nve-skeleton shape=\"round\" style=\"width: 40px; height: 40px\"></nve-skeleton>\n</div>\n",
|
|
27
27
|
"summary": "Skeleton shape variants including default rectangle, pill, and round. Use pill for button or tag placeholders and round for avatar or icon placeholders to match the final content shape.",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
]
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
|
-
"id": "
|
|
35
|
+
"id": "skeleton-slotted",
|
|
36
36
|
"name": "Slotted",
|
|
37
37
|
"template": "<div nve-layout=\"column gap:xs align:stretch\">\n <nve-skeleton></nve-skeleton>\n <nve-skeleton effect=\"shimmer\">slotting content will hide the skeleton</nve-skeleton>\n <nve-skeleton effect=\"shimmer\"> </nve-skeleton>\n</div>\n",
|
|
38
38
|
"summary": "Skeleton with slotted content that automatically hides the placeholder when real content arrives. Use to wrap lazy-loaded content so the skeleton disappears once data loads without manual state management.",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"entrypoint": "@nvidia-elements/core/sort-button/sort-button.examples.json",
|
|
4
4
|
"items": [
|
|
5
5
|
{
|
|
6
|
-
"id": "
|
|
6
|
+
"id": "sort-button",
|
|
7
7
|
"name": "Default",
|
|
8
8
|
"template": "<nve-sort-button></nve-sort-button>\n",
|
|
9
9
|
"summary": "Basic sort button in its default unsorted state for column header sorting controls.",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"tags": []
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
|
-
"id": "
|
|
15
|
+
"id": "sort-button-light-theme",
|
|
16
16
|
"name": "LightTheme",
|
|
17
17
|
"template": "<div nve-theme=\"root light\" nve-layout=\"row gap:md pad:md align:wrap\">\n <nve-sort-button></nve-sort-button>\n <nve-sort-button sort=\"ascending\"></nve-sort-button>\n <nve-sort-button sort=\"descending\"></nve-sort-button>\n</div>\n",
|
|
18
18
|
"summary": "Sort button states (unsorted, ascending, descending) displayed on light theme background.",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
]
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
|
-
"id": "
|
|
26
|
+
"id": "sort-button-dark-theme",
|
|
27
27
|
"name": "DarkTheme",
|
|
28
28
|
"template": "<div nve-theme=\"root dark\" nve-layout=\"row gap:md pad:md align:wrap\">\n <nve-sort-button></nve-sort-button>\n <nve-sort-button sort=\"ascending\"></nve-sort-button>\n <nve-sort-button sort=\"descending\"></nve-sort-button>\n</div>\n",
|
|
29
29
|
"summary": "Sort button states (unsorted, ascending, descending) displayed on dark theme background.",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"entrypoint": "@nvidia-elements/core/sparkline/sparkline.examples.json",
|
|
4
4
|
"items": [
|
|
5
5
|
{
|
|
6
|
-
"id": "
|
|
6
|
+
"id": "sparkline",
|
|
7
7
|
"name": "Default",
|
|
8
8
|
"template": "<nve-sparkline id=\"default\"></nve-sparkline>\n<script type=\"module\">\n const sparkline = document.querySelector(\"nve-sparkline#default\");\n sparkline.data = [18, 22, 20, 24, 19, 28, 25, 30];\n</script>\n",
|
|
9
9
|
"summary": "Basic sparkline from numeric array values. Use as a compact trend indicator.",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"tags": []
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
|
-
"id": "
|
|
15
|
+
"id": "sparkline-marks",
|
|
16
16
|
"name": "Marks",
|
|
17
17
|
"template": "<div nve-layout=\"row gap:md\">\n <nve-sparkline data=\"[14, 18, 17, 20, 19, 24, 21]\"></nve-sparkline>\n <nve-sparkline mark=\"area\" data=\"[14, 18, 17, 20, 19, 24, 21]\"></nve-sparkline>\n <nve-sparkline mark=\"gradient\" data=\"[14, 18, 17, 20, 19, 24, 21]\"></nve-sparkline>\n <nve-sparkline mark=\"column\" data=\"[6, 10, 8, 16, 13, 18, 15]\"></nve-sparkline>\n <nve-sparkline mark=\"winloss\" data=\"[5, -3, 2, -1, 4, 0, 3]\"></nve-sparkline>\n</div>\n",
|
|
18
18
|
"summary": "Mark variants include line, area, gradient, column, and winloss to support trend and outcome signals.",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"tags": []
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
|
-
"id": "
|
|
24
|
+
"id": "sparkline-status",
|
|
25
25
|
"name": "Status",
|
|
26
26
|
"template": "<div nve-layout=\"row gap:md\">\n <nve-sparkline status=\"accent\" mark=\"area\" data=\"[3, 2, 10, 8, 4, 6, 9]\"></nve-sparkline>\n <nve-sparkline status=\"danger\" mark=\"area\" data=\"[15, 14, 12, 9, 8, 7, 5]\"></nve-sparkline>\n <nve-sparkline status=\"warning\" mark=\"area\" data=\"[8, 9, 7, 10, 9, 8, 9]\"></nve-sparkline>\n <nve-sparkline status=\"success\" mark=\"area\" data=\"[5, 7, 8, 9, 12, 14, 15]\"></nve-sparkline>\n</div>\n",
|
|
27
27
|
"summary": "Semantic statuses apply task, support, and trend color mappings.",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"tags": []
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
|
-
"id": "
|
|
33
|
+
"id": "sparkline-inline-with-text",
|
|
34
34
|
"name": "InlineWithText",
|
|
35
35
|
"template": "<div nve-layout=\"column gap:lg\">\n <p nve-text=\"body loose\">\n This week's lane keeping safety score trend\n <nve-sparkline\n mark=\"area\"\n status=\"success\"\n data=\"[86, 87, 86, 88, 89, 90, 92, 93]\"\n aria-label=\"lane keeping safety score trend\"\n ></nve-sparkline>\n shows a steady rise after an early dip, with decreasing interventions per shift:\n <nve-sparkline\n mark=\"column\"\n status=\"accent\"\n data=\"[16, 14, 15, 13, 12, 11, 10]\"\n aria-label=\"lane keeping interventions per shift\"\n ></nve-sparkline\n >, and predominantly successful route outcomes:\n <nve-sparkline\n mark=\"winloss\"\n status=\"success\"\n data=\"[1, 1, -1, 1, 0, 1, 1]\"\n aria-label=\"lane keeping route outcomes\"\n ></nve-sparkline\n >.\n </p>\n</div>\n",
|
|
36
36
|
"summary": "Sparklines inherit font size and flow inline with surrounding text and metrics.",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"tags": []
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
|
-
"id": "
|
|
42
|
+
"id": "sparkline-data-grid",
|
|
43
43
|
"name": "DataGrid",
|
|
44
44
|
"template": "<nve-grid>\n <nve-grid-header>\n <nve-grid-column>Autonomy Service</nve-grid-column>\n <nve-grid-column>Safety Score</nve-grid-column>\n <nve-grid-column>Interventions / Shift</nve-grid-column>\n <nve-grid-column>Route Outcome</nve-grid-column>\n </nve-grid-header>\n <nve-grid-row>\n <nve-grid-cell>Lane Keeping</nve-grid-cell>\n <nve-grid-cell>\n <nve-sparkline\n aria-label=\"Lane Keeping 30 day safety score trend\"\n mark=\"area\"\n status=\"success\"\n min=\"0\"\n max=\"100\"\n data=\"[86, 87, 86, 88, 89, 90, 92, 93]\"\n size=\"md\"\n ></nve-sparkline>\n </nve-grid-cell>\n <nve-grid-cell>\n <nve-sparkline\n aria-label=\"Lane Keeping interventions per shift\"\n mark=\"column\"\n status=\"success\"\n min=\"0\"\n max=\"50\"\n data=\"[12, 11, 12, 10, 9, 8, 7, 6]\"\n size=\"md\"\n ></nve-sparkline>\n </nve-grid-cell>\n <nve-grid-cell>\n <nve-sparkline\n aria-label=\"Lane Keeping route outcomes\"\n mark=\"winloss\"\n data=\"[1, 1, 1, 0, 1, 0, 1, 1]\"\n size=\"md\"\n ></nve-sparkline>\n </nve-grid-cell>\n </nve-grid-row>\n <nve-grid-row>\n <nve-grid-cell>Object Detection</nve-grid-cell>\n <nve-grid-cell>\n <nve-sparkline\n aria-label=\"Object Detection 30 day safety score trend\"\n mark=\"area\"\n status=\"warning\"\n min=\"0\"\n max=\"100\"\n data=\"[76, 88, 72, 79, 85, 70, 83, 74]\"\n size=\"md\"\n ></nve-sparkline>\n </nve-grid-cell>\n <nve-grid-cell>\n <nve-sparkline\n aria-label=\"Object Detection interventions per shift\"\n mark=\"column\"\n status=\"warning\"\n min=\"0\"\n max=\"50\"\n data=\"[18, 20, 17, 19, 20, 21, 19, 22]\"\n size=\"md\"\n ></nve-sparkline>\n </nve-grid-cell>\n <nve-grid-cell>\n <nve-sparkline\n aria-label=\"Object Detection route outcomes\"\n mark=\"winloss\"\n data=\"[1, 0, -1, 1, 0, -1, 0, 1]\"\n size=\"md\"\n ></nve-sparkline>\n </nve-grid-cell>\n </nve-grid-row>\n <nve-grid-row>\n <nve-grid-cell>Path Planning</nve-grid-cell>\n <nve-grid-cell>\n <nve-sparkline\n aria-label=\"Path Planning 30 day safety score trend\"\n mark=\"area\"\n status=\"danger\"\n min=\"0\"\n max=\"100\"\n data=\"[58, 54, 49, 45, 40, 36, 31, 27]\"\n size=\"md\"\n ></nve-sparkline>\n </nve-grid-cell>\n <nve-grid-cell>\n <nve-sparkline\n aria-label=\"Path Planning interventions per shift\"\n mark=\"column\"\n status=\"danger\"\n min=\"0\"\n max=\"50\"\n data=\"[24, 26, 29, 31, 34, 36, 39, 42]\"\n size=\"md\"\n ></nve-sparkline>\n </nve-grid-cell>\n <nve-grid-cell>\n <nve-sparkline\n aria-label=\"Path Planning route outcomes\"\n mark=\"winloss\"\n data=\"[1, -1, 0, -1, -1, -1, 0, -1]\"\n size=\"md\"\n ></nve-sparkline>\n </nve-grid-cell>\n </nve-grid-row>\n</nve-grid>\n",
|
|
45
45
|
"summary": "Embed sparklines in grid cells to add compact trend context to tabular data.",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"tags": []
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
|
-
"id": "
|
|
51
|
+
"id": "sparkline-explicit-size",
|
|
52
52
|
"name": "ExplicitSize",
|
|
53
53
|
"template": "<div id=\"sparkline-sizes\" nve-layout=\"row gap:md\">\n <nve-sparkline size=\"xs\"></nve-sparkline>\n <nve-sparkline size=\"sm\"></nve-sparkline>\n <nve-sparkline size=\"md\"></nve-sparkline>\n <nve-sparkline size=\"lg\"></nve-sparkline>\n <nve-sparkline size=\"xl\"></nve-sparkline>\n</div>\n<script type=\"module\">\n const sparklines = document.querySelectorAll(\"#sparkline-sizes > nve-sparkline\");\n for (const sparkline of sparklines) {\n sparkline.data = [9, 12, 11, 13, 15, 14, 16];\n }\n</script>\n",
|
|
54
54
|
"summary": "Explicit size tokens set fixed sparkline height independent of text context.",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"tags": []
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
|
-
"id": "
|
|
60
|
+
"id": "sparkline-default-size",
|
|
61
61
|
"name": "DefaultSize",
|
|
62
62
|
"template": "<div id=\"inline-sparkline-sizes\" nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:sm\" nve-text=\"heading\">\n <span>heading</span>\n <nve-sparkline></nve-sparkline>\n </div>\n <div nve-layout=\"row gap:sm\" nve-text=\"body\">\n <span>body</span>\n <nve-sparkline></nve-sparkline>\n </div>\n <div nve-layout=\"row gap:sm\" nve-text=\"label sm\">\n <span>label sm</span>\n <nve-sparkline></nve-sparkline>\n </div>\n</div>\n<script type=\"module\">\n const sparklines = document.querySelectorAll(\"#inline-sparkline-sizes > div[nve-text] > nve-sparkline\");\n for (const sparkline of sparklines) {\n sparkline.data = [9, 12, 11, 13, 15, 14, 16];\n }\n</script>\n",
|
|
63
63
|
"summary": "Without a size attribute, height scales with the parent text size for typographic alignment.",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"tags": []
|
|
67
67
|
},
|
|
68
68
|
{
|
|
69
|
-
"id": "
|
|
69
|
+
"id": "sparkline-interpolation",
|
|
70
70
|
"name": "Interpolation",
|
|
71
71
|
"template": "<div id=\"sparkline-interpolations\" nve-layout=\"row gap:md\">\n <nve-sparkline mark=\"area\" interpolation=\"linear\"></nve-sparkline>\n <nve-sparkline mark=\"area\" interpolation=\"smooth\"></nve-sparkline>\n <nve-sparkline mark=\"area\" interpolation=\"step\"></nve-sparkline>\n</div>\n<script type=\"module\">\n const sparklines = document.querySelectorAll(\"#sparkline-interpolations > nve-sparkline\");\n for (const sparkline of sparklines) {\n sparkline.data = [6, 10, 8, 16, 13, 18, 15];\n }\n</script>\n",
|
|
72
72
|
"summary": "Interpolation controls linear, smooth, or step transitions between points.",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"tags": []
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
|
-
"id": "
|
|
78
|
+
"id": "sparkline-symbols",
|
|
79
79
|
"name": "Symbols",
|
|
80
80
|
"template": "<div id=\"sparkline-symbols\" nve-layout=\"row gap:md\">\n <nve-sparkline denote-last></nve-sparkline>\n <nve-sparkline denote-first denote-last></nve-sparkline>\n <nve-sparkline denote-min denote-max></nve-sparkline>\n</div>\n<script type=\"module\">\n const sparklines = document.querySelectorAll(\"#sparkline-symbols > nve-sparkline\");\n for (const sparkline of sparklines) {\n sparkline.data = [12, 8, 15, 10, 18, 14, 11];\n }\n</script>\n",
|
|
81
81
|
"summary": "Symbols denote specific data points in line, area, and gradient marks.",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"tags": []
|
|
85
85
|
},
|
|
86
86
|
{
|
|
87
|
-
"id": "
|
|
87
|
+
"id": "sparkline-fixed-data-domain",
|
|
88
88
|
"name": "FixedDataDomain",
|
|
89
89
|
"template": "<div nve-layout=\"column gap:md align:left\" nve-text=\"body lg\">\n <nve-sparkline min=\"0\" max=\"100\" mark=\"area\" status=\"accent\" data=\"[80, 85, 90, 95, 100]\"></nve-sparkline>\n <nve-sparkline min=\"0\" max=\"100\" mark=\"area\" status=\"accent\" data=\"[40, 45, 50, 55, 60]\"></nve-sparkline>\n <nve-sparkline min=\"0\" max=\"100\" mark=\"area\" status=\"accent\" data=\"[0, 5, 10, 15, 20]\"></nve-sparkline>\n</div>\n",
|
|
90
90
|
"summary": "Fixed min and max values define a shared vertical domain to ensure comparability across adjacent sparklines.",
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
"tags": []
|
|
94
94
|
},
|
|
95
95
|
{
|
|
96
|
-
"id": "
|
|
96
|
+
"id": "sparkline-zero-line",
|
|
97
97
|
"name": "ZeroLine",
|
|
98
98
|
"template": "<div nve-layout=\"row gap:md\">\n <nve-sparkline aria-label=\"mixed values\" mark=\"area\" data=\"[-3, 2, 5, -1, 3, -2, 4]\"></nve-sparkline>\n <nve-sparkline aria-label=\"mostly negative values\" mark=\"gradient\" data=\"[-8, -5, -2, 1, -3, -6, -4]\"></nve-sparkline>\n <nve-sparkline aria-label=\"mixed values column\" mark=\"column\" data=\"[-3, 2, 5, -1, 3, -2, 4]\"></nve-sparkline>\n</div>\n",
|
|
99
99
|
"summary": "The chart renders a zero baseline when the data includes both positive and negative values.",
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"tags": []
|
|
103
103
|
},
|
|
104
104
|
{
|
|
105
|
-
"id": "
|
|
105
|
+
"id": "sparkline-interval-length",
|
|
106
106
|
"name": "IntervalLength",
|
|
107
107
|
"template": "<div id=\"sparkline-intervals\" nve-layout=\"row gap:md\">\n <nve-sparkline interval-length=\"0.3\"></nve-sparkline>\n <nve-sparkline interval-length=\"0.6\"></nve-sparkline>\n <nve-sparkline interval-length=\"2.0\"></nve-sparkline>\n</div>\n<script type=\"module\">\n const sparklines = document.querySelectorAll(\"#sparkline-intervals > nve-sparkline\");\n for (const sparkline of sparklines) {\n sparkline.data = [10, 20, 15, 25, 18];\n }\n</script>\n",
|
|
108
108
|
"summary": "Interval length adjusts spacing between points for line marks, from compact to spacious.",
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
"tags": []
|
|
112
112
|
},
|
|
113
113
|
{
|
|
114
|
-
"id": "
|
|
114
|
+
"id": "sparkline-custom-styling",
|
|
115
115
|
"name": "CustomStyling",
|
|
116
116
|
"template": "<nve-sparkline\n aria-label=\"custom sparkline\"\n mark=\"gradient\"\n interpolation=\"smooth\"\n data=\"[8, 14, 9, 17, 13, 21, 16]\"\n denote-last\n style=\"\n --height: 120px;\n --accent-color: var(--nve-sys-layer-canvas-background);\n --accent-radius: 5px;\n --accent-border-width: 3px;\n --line-width: 2.5px;\n --line-color: var(--nve-ref-color-blue-cobalt-1100);\n --gradient-max-color: color-mix(in oklab, var(--nve-ref-color-blue-cobalt-1100) 45%, transparent);\n --gradient-min-color: color-mix(in oklab, var(--nve-ref-color-blue-cobalt-1100), transparent 90%);\n \"\n></nve-sparkline>\n",
|
|
117
117
|
"summary": "CSS custom properties are available to adjust dimensions and visual styling.",
|
|
@@ -4,14 +4,35 @@ export declare const VIEW_HEIGHT = 100;
|
|
|
4
4
|
export declare const DEFAULT_INTERVAL_LENGTH_EM = 0.6;
|
|
5
5
|
export declare function toValidData(data: unknown): number[];
|
|
6
6
|
export declare function calculateViewBox(mark: SparklineMark, pointCount: number, intervalLength?: number): Dimensions;
|
|
7
|
-
export declare function calculateDomain(values: number[],
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
export declare function calculateDomain(values: number[], options?: {
|
|
8
|
+
explicitMin?: number;
|
|
9
|
+
explicitMax?: number;
|
|
10
|
+
includeZero?: boolean;
|
|
11
|
+
}): Scale | undefined;
|
|
12
|
+
export declare function valueToY(value: number, range: {
|
|
13
|
+
min: number;
|
|
14
|
+
max: number;
|
|
15
|
+
}, viewHeight?: number): number;
|
|
16
|
+
export declare function toPlotPoints(values: number[], range: {
|
|
17
|
+
min: number;
|
|
18
|
+
max: number;
|
|
19
|
+
}, view: {
|
|
20
|
+
width: number;
|
|
21
|
+
height?: number;
|
|
22
|
+
}): Point[];
|
|
23
|
+
export declare function calculateSymbolIndices(values: number[], denote: {
|
|
24
|
+
first: boolean;
|
|
25
|
+
last: boolean;
|
|
26
|
+
min: boolean;
|
|
27
|
+
max: boolean;
|
|
28
|
+
}): Set<number>;
|
|
11
29
|
export declare function toInterpolation(interpolation: unknown): Interpolation;
|
|
12
30
|
export declare function toLinePath(points: Point[], interpolation: Interpolation, viewWidth: number): string;
|
|
13
31
|
export declare function toAreaPath(points: Point[], interpolation: Interpolation, viewHeight?: number): string;
|
|
14
32
|
export declare function toColumnRects(points: Point[], baselineY: number, width: number): Rect[];
|
|
15
|
-
export declare function toWinLossRects(values: number[], baselineY: number,
|
|
33
|
+
export declare function toWinLossRects(values: number[], baselineY: number, dimensions: {
|
|
34
|
+
width: number;
|
|
35
|
+
height: number;
|
|
36
|
+
}): (Rect & {
|
|
16
37
|
className: 'win' | 'loss' | 'draw';
|
|
17
38
|
})[];
|
|
@@ -9,32 +9,32 @@ function a(n, r, i = e) {
|
|
|
9
9
|
height: 100
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
|
-
function o(e, t
|
|
12
|
+
function o(e, t = {}) {
|
|
13
13
|
if (e.length === 0) return;
|
|
14
|
-
let i = Math.min(...e),
|
|
14
|
+
let { explicitMin: n, explicitMax: r, includeZero: i = !1 } = t, a = Math.min(...e), o = Math.max(...e);
|
|
15
15
|
return {
|
|
16
|
-
min:
|
|
17
|
-
max:
|
|
16
|
+
min: n ?? (i ? Math.min(a, 0) : a),
|
|
17
|
+
max: r ?? (i ? Math.max(o, 0) : o)
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
|
-
function s(e, t, n
|
|
21
|
-
let
|
|
22
|
-
return
|
|
20
|
+
function s(e, t, n = 100) {
|
|
21
|
+
let r = t.max - t.min;
|
|
22
|
+
return r === 0 ? n / 2 : n - (e - t.min) / r * n;
|
|
23
23
|
}
|
|
24
|
-
function c(e, t, n
|
|
25
|
-
let
|
|
26
|
-
return e.map((e,
|
|
27
|
-
x:
|
|
28
|
-
y: s(e, t,
|
|
24
|
+
function c(e, t, n) {
|
|
25
|
+
let r = n.height ?? 100, i = e.length > 1 ? n.width / (e.length - 1) : 0;
|
|
26
|
+
return e.map((e, n) => ({
|
|
27
|
+
x: n * i,
|
|
28
|
+
y: s(e, t, r)
|
|
29
29
|
}));
|
|
30
30
|
}
|
|
31
|
-
function l(e, t
|
|
32
|
-
let
|
|
33
|
-
if (e.length === 0 || (t &&
|
|
34
|
-
let
|
|
35
|
-
return e.forEach((e,
|
|
36
|
-
|
|
37
|
-
}),
|
|
31
|
+
function l(e, t) {
|
|
32
|
+
let n = /* @__PURE__ */ new Set();
|
|
33
|
+
if (e.length === 0 || (t.first && n.add(0), t.last && n.add(e.length - 1), !(t.min || t.max))) return n;
|
|
34
|
+
let r = Math.min(...e), i = Math.max(...e);
|
|
35
|
+
return e.forEach((e, a) => {
|
|
36
|
+
t.min && e === r && n.add(a), t.max && e === i && n.add(a);
|
|
37
|
+
}), n;
|
|
38
38
|
}
|
|
39
39
|
function u(e) {
|
|
40
40
|
switch (e) {
|
|
@@ -87,28 +87,28 @@ function p(e, t, r) {
|
|
|
87
87
|
};
|
|
88
88
|
});
|
|
89
89
|
}
|
|
90
|
-
function m(e, t, n
|
|
91
|
-
let { bandSize:
|
|
90
|
+
function m(e, t, n) {
|
|
91
|
+
let { bandSize: i, stepSize: a } = v(e.length, n.width, r), o = n.height / 2;
|
|
92
92
|
return e.map((e, n) => {
|
|
93
|
-
let r = n *
|
|
93
|
+
let r = n * a + (a - i) / 2;
|
|
94
94
|
return e > 0 ? {
|
|
95
95
|
className: "win",
|
|
96
96
|
x: r,
|
|
97
|
-
y: t -
|
|
98
|
-
width:
|
|
99
|
-
height:
|
|
97
|
+
y: t - o,
|
|
98
|
+
width: i,
|
|
99
|
+
height: o
|
|
100
100
|
} : e < 0 ? {
|
|
101
101
|
className: "loss",
|
|
102
102
|
x: r,
|
|
103
103
|
y: t,
|
|
104
|
-
width:
|
|
105
|
-
height:
|
|
104
|
+
width: i,
|
|
105
|
+
height: o
|
|
106
106
|
} : {
|
|
107
107
|
className: "draw",
|
|
108
108
|
x: r,
|
|
109
|
-
y: t -
|
|
110
|
-
width:
|
|
111
|
-
height:
|
|
109
|
+
y: t - o / 4,
|
|
110
|
+
width: i,
|
|
111
|
+
height: o / 2
|
|
112
112
|
};
|
|
113
113
|
});
|
|
114
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sparkline.utils.js","names":[],"sources":["../../src/sparkline/sparkline.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Dimensions, Interpolation, Point, Rect, Scale, SparklineMark } from '@nvidia-elements/core/internal';\n\nexport const PRECISION = 2;\nexport const VIEW_HEIGHT = 100;\nexport const DEFAULT_INTERVAL_LENGTH_EM = 0.6;\n\nconst HORIZONTAL_UNIT_WIDTH = VIEW_HEIGHT * DEFAULT_INTERVAL_LENGTH_EM;\nconst COLUMN_GAP_RATIO = 0.7;\nconst WINLOSS_GAP_RATIO = 0.85;\n\nexport function toValidData(data: unknown): number[] {\n if (!Array.isArray(data)) return [];\n return data.filter(Number.isFinite);\n}\n\nexport function calculateViewBox(\n mark: SparklineMark,\n pointCount: number,\n intervalLength = DEFAULT_INTERVAL_LENGTH_EM\n): Dimensions {\n const isIntervalBased = mark === 'line' || mark === 'area' || mark === 'gradient';\n const widthUnitCount = isIntervalBased ? Math.max(pointCount - 1, 1) : pointCount;\n const normalizedIntervalLength =\n Number.isFinite(intervalLength) && intervalLength > 0 ? intervalLength : DEFAULT_INTERVAL_LENGTH_EM;\n const width =\n mark === 'line' ? widthUnitCount * VIEW_HEIGHT * normalizedIntervalLength : widthUnitCount * HORIZONTAL_UNIT_WIDTH;\n\n return {\n width,\n height: VIEW_HEIGHT\n };\n}\n\nexport function calculateDomain(\n values: number[],\n explicitMin?: number,\n explicitMax?: number,\n includeZero = false\n): Scale | undefined {\n if (values.length === 0) return undefined;\n\n const dataMinimum = Math.min(...values);\n const dataMaximum = Math.max(...values);\n\n return {\n min: explicitMin ?? (includeZero ? Math.min(dataMinimum, 0) : dataMinimum),\n max: explicitMax ?? (includeZero ? Math.max(dataMaximum, 0) : dataMaximum)\n };\n}\n\nexport function valueToY(value: number, min: number, max: number, viewHeight = VIEW_HEIGHT): number {\n const range = max - min;\n if (range === 0) return viewHeight / 2;\n return viewHeight - ((value - min) / range) * viewHeight;\n}\n\nexport function toPlotPoints(\n values: number[],\n min: number,\n max: number,\n viewWidth: number,\n viewHeight = VIEW_HEIGHT\n): Point[] {\n const stepX = values.length > 1 ? viewWidth / (values.length - 1) : 0;\n return values.map((value, index) => ({\n x: index * stepX,\n y: valueToY(value, min, max, viewHeight)\n }));\n}\n\nexport function calculateSymbolIndices(\n values: number[],\n denoteFirst: boolean,\n denoteLast: boolean,\n denoteMin: boolean,\n denoteMax: boolean\n): Set<number> {\n const indices = new Set<number>();\n if (values.length === 0) return indices;\n\n if (denoteFirst) indices.add(0);\n if (denoteLast) indices.add(values.length - 1);\n\n const needsExtrema = denoteMin || denoteMax;\n if (!needsExtrema) return indices;\n\n const min = Math.min(...values);\n const max = Math.max(...values);\n\n values.forEach((value, index) => {\n if (denoteMin && value === min) indices.add(index);\n if (denoteMax && value === max) indices.add(index);\n });\n\n return indices;\n}\n\nexport function toInterpolation(interpolation: unknown): Interpolation {\n switch (interpolation) {\n case 'linear':\n return 'linear';\n case 'smooth':\n return 'smooth';\n case 'step':\n return 'step';\n default: {\n return 'linear';\n }\n }\n}\n\nexport function toLinePath(points: Point[], interpolation: Interpolation, viewWidth: number): string {\n if (points.length === 0) return '';\n if (points.length === 1) {\n const y = points[0]!.y.toFixed(PRECISION);\n return `M 0 ${y} L ${viewWidth.toFixed(PRECISION)} ${y}`;\n }\n\n switch (interpolation) {\n case 'step':\n return toStepOpenPath(points);\n case 'smooth':\n return toSmoothOpenPath(points);\n case 'linear':\n return toLinearOpenPath(points);\n default: {\n const exhaustiveCheck: never = interpolation;\n throw new Error(`Unhandled interpolation: ${exhaustiveCheck}`);\n }\n }\n}\n\nexport function toAreaPath(points: Point[], interpolation: Interpolation, viewHeight = VIEW_HEIGHT): string {\n if (points.length === 0) return '';\n\n let openPath = '';\n switch (interpolation) {\n case 'step':\n openPath = toStepOpenPath(points);\n break;\n case 'smooth':\n openPath = toSmoothOpenPath(points);\n break;\n case 'linear':\n openPath = toLinearOpenPath(points);\n break;\n default: {\n const exhaustiveCheck: never = interpolation;\n throw new Error(`Unhandled interpolation: ${exhaustiveCheck}`);\n }\n }\n\n const last = points[points.length - 1]!;\n const first = points[0]!;\n openPath += ` L ${last.x.toFixed(PRECISION)} ${viewHeight.toFixed(PRECISION)}`;\n openPath += ` L ${first.x.toFixed(PRECISION)} ${viewHeight.toFixed(PRECISION)} Z`;\n return openPath;\n}\n\nexport function toColumnRects(points: Point[], baselineY: number, width: number): Rect[] {\n const { bandSize: bandWidth, stepSize: stepX } = calculateBandSizing(points.length, width, COLUMN_GAP_RATIO);\n\n return points.map((point, index) => {\n const x = index * stepX + (stepX - bandWidth) / 2;\n const height = Math.abs(point.y - baselineY);\n const y = Math.min(point.y, baselineY);\n return { x, y, width: bandWidth, height };\n });\n}\n\nexport function toWinLossRects(\n values: number[],\n baselineY: number,\n width: number,\n height: number\n): (Rect & { className: 'win' | 'loss' | 'draw' })[] {\n const { bandSize: bandWidth, stepSize: stepX } = calculateBandSizing(values.length, width, WINLOSS_GAP_RATIO);\n const barHeight = height / 2;\n\n return values.map((value, index) => {\n const x = index * stepX + (stepX - bandWidth) / 2;\n\n if (value > 0) {\n return { className: 'win', x, y: baselineY - barHeight, width: bandWidth, height: barHeight };\n }\n\n if (value < 0) {\n return { className: 'loss', x, y: baselineY, width: bandWidth, height: barHeight };\n }\n\n return {\n className: 'draw',\n x,\n y: baselineY - barHeight / 4,\n width: bandWidth,\n height: barHeight / 2\n };\n });\n}\n\nfunction toLinearOpenPath(points: Point[]): string {\n return points.reduce((path, point, index) => {\n if (index === 0) {\n return `M ${point.x.toFixed(PRECISION)} ${point.y.toFixed(PRECISION)}`;\n }\n return `${path} L ${point.x.toFixed(PRECISION)} ${point.y.toFixed(PRECISION)}`;\n }, '');\n}\n\nfunction toSmoothOpenPath(points: Point[]): string {\n const segments = points.map((point, index) => {\n if (index === 0) {\n return `M ${point.x.toFixed(PRECISION)} ${point.y.toFixed(PRECISION)}`;\n }\n const previous = points[index - 1]!;\n const deltaX = (point.x - previous.x) / 3;\n const p = PRECISION;\n return `C ${(previous.x + deltaX).toFixed(p)} ${previous.y.toFixed(p)} ${(point.x - deltaX).toFixed(p)} ${point.y.toFixed(p)} ${point.x.toFixed(p)} ${point.y.toFixed(p)}`;\n });\n return segments.join(' ');\n}\n\nfunction toStepOpenPath(points: Point[]): string {\n let path = `M ${points[0]!.x.toFixed(PRECISION)} ${points[0]!.y.toFixed(PRECISION)}`;\n for (let index = 1; index < points.length; index++) {\n const point = points[index]!;\n path += ` H ${point.x.toFixed(PRECISION)} V ${point.y.toFixed(PRECISION)}`;\n }\n return path;\n}\n\nfunction calculateBandSizing(count: number, viewDimension: number, gapRatio: number) {\n if (count <= 0) return { bandSize: 0, stepSize: 0 };\n\n const stepSize = viewDimension / count;\n const bandSize = stepSize * gapRatio;\n return { bandSize, stepSize };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sparkline.utils.js","names":[],"sources":["../../src/sparkline/sparkline.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Dimensions, Interpolation, Point, Rect, Scale, SparklineMark } from '@nvidia-elements/core/internal';\n\nexport const PRECISION = 2;\nexport const VIEW_HEIGHT = 100;\nexport const DEFAULT_INTERVAL_LENGTH_EM = 0.6;\n\nconst HORIZONTAL_UNIT_WIDTH = VIEW_HEIGHT * DEFAULT_INTERVAL_LENGTH_EM;\nconst COLUMN_GAP_RATIO = 0.7;\nconst WINLOSS_GAP_RATIO = 0.85;\n\nexport function toValidData(data: unknown): number[] {\n if (!Array.isArray(data)) return [];\n return data.filter(Number.isFinite);\n}\n\nexport function calculateViewBox(\n mark: SparklineMark,\n pointCount: number,\n intervalLength = DEFAULT_INTERVAL_LENGTH_EM\n): Dimensions {\n const isIntervalBased = mark === 'line' || mark === 'area' || mark === 'gradient';\n const widthUnitCount = isIntervalBased ? Math.max(pointCount - 1, 1) : pointCount;\n const normalizedIntervalLength =\n Number.isFinite(intervalLength) && intervalLength > 0 ? intervalLength : DEFAULT_INTERVAL_LENGTH_EM;\n const width =\n mark === 'line' ? widthUnitCount * VIEW_HEIGHT * normalizedIntervalLength : widthUnitCount * HORIZONTAL_UNIT_WIDTH;\n\n return {\n width,\n height: VIEW_HEIGHT\n };\n}\n\nexport function calculateDomain(\n values: number[],\n options: { explicitMin?: number; explicitMax?: number; includeZero?: boolean } = {}\n): Scale | undefined {\n if (values.length === 0) return undefined;\n const { explicitMin, explicitMax, includeZero = false } = options;\n\n const dataMinimum = Math.min(...values);\n const dataMaximum = Math.max(...values);\n\n return {\n min: explicitMin ?? (includeZero ? Math.min(dataMinimum, 0) : dataMinimum),\n max: explicitMax ?? (includeZero ? Math.max(dataMaximum, 0) : dataMaximum)\n };\n}\n\nexport function valueToY(value: number, range: { min: number; max: number }, viewHeight = VIEW_HEIGHT): number {\n const span = range.max - range.min;\n if (span === 0) return viewHeight / 2;\n return viewHeight - ((value - range.min) / span) * viewHeight;\n}\n\nexport function toPlotPoints(\n values: number[],\n range: { min: number; max: number },\n view: { width: number; height?: number }\n): Point[] {\n const viewHeight = view.height ?? VIEW_HEIGHT;\n const stepX = values.length > 1 ? view.width / (values.length - 1) : 0;\n return values.map((value, index) => ({\n x: index * stepX,\n y: valueToY(value, range, viewHeight)\n }));\n}\n\nexport function calculateSymbolIndices(\n values: number[],\n denote: { first: boolean; last: boolean; min: boolean; max: boolean }\n): Set<number> {\n const indices = new Set<number>();\n if (values.length === 0) return indices;\n\n if (denote.first) indices.add(0);\n if (denote.last) indices.add(values.length - 1);\n\n const needsExtrema = denote.min || denote.max;\n if (!needsExtrema) return indices;\n\n const min = Math.min(...values);\n const max = Math.max(...values);\n\n values.forEach((value, index) => {\n if (denote.min && value === min) indices.add(index);\n if (denote.max && value === max) indices.add(index);\n });\n\n return indices;\n}\n\nexport function toInterpolation(interpolation: unknown): Interpolation {\n switch (interpolation) {\n case 'linear':\n return 'linear';\n case 'smooth':\n return 'smooth';\n case 'step':\n return 'step';\n default: {\n return 'linear';\n }\n }\n}\n\nexport function toLinePath(points: Point[], interpolation: Interpolation, viewWidth: number): string {\n if (points.length === 0) return '';\n if (points.length === 1) {\n const y = points[0]!.y.toFixed(PRECISION);\n return `M 0 ${y} L ${viewWidth.toFixed(PRECISION)} ${y}`;\n }\n\n switch (interpolation) {\n case 'step':\n return toStepOpenPath(points);\n case 'smooth':\n return toSmoothOpenPath(points);\n case 'linear':\n return toLinearOpenPath(points);\n default: {\n const exhaustiveCheck: never = interpolation;\n throw new Error(`Unhandled interpolation: ${exhaustiveCheck}`);\n }\n }\n}\n\nexport function toAreaPath(points: Point[], interpolation: Interpolation, viewHeight = VIEW_HEIGHT): string {\n if (points.length === 0) return '';\n\n let openPath = '';\n switch (interpolation) {\n case 'step':\n openPath = toStepOpenPath(points);\n break;\n case 'smooth':\n openPath = toSmoothOpenPath(points);\n break;\n case 'linear':\n openPath = toLinearOpenPath(points);\n break;\n default: {\n const exhaustiveCheck: never = interpolation;\n throw new Error(`Unhandled interpolation: ${exhaustiveCheck}`);\n }\n }\n\n const last = points[points.length - 1]!;\n const first = points[0]!;\n openPath += ` L ${last.x.toFixed(PRECISION)} ${viewHeight.toFixed(PRECISION)}`;\n openPath += ` L ${first.x.toFixed(PRECISION)} ${viewHeight.toFixed(PRECISION)} Z`;\n return openPath;\n}\n\nexport function toColumnRects(points: Point[], baselineY: number, width: number): Rect[] {\n const { bandSize: bandWidth, stepSize: stepX } = calculateBandSizing(points.length, width, COLUMN_GAP_RATIO);\n\n return points.map((point, index) => {\n const x = index * stepX + (stepX - bandWidth) / 2;\n const height = Math.abs(point.y - baselineY);\n const y = Math.min(point.y, baselineY);\n return { x, y, width: bandWidth, height };\n });\n}\n\nexport function toWinLossRects(\n values: number[],\n baselineY: number,\n dimensions: { width: number; height: number }\n): (Rect & { className: 'win' | 'loss' | 'draw' })[] {\n const { bandSize: bandWidth, stepSize: stepX } = calculateBandSizing(\n values.length,\n dimensions.width,\n WINLOSS_GAP_RATIO\n );\n const barHeight = dimensions.height / 2;\n\n return values.map((value, index) => {\n const x = index * stepX + (stepX - bandWidth) / 2;\n\n if (value > 0) {\n return { className: 'win', x, y: baselineY - barHeight, width: bandWidth, height: barHeight };\n }\n\n if (value < 0) {\n return { className: 'loss', x, y: baselineY, width: bandWidth, height: barHeight };\n }\n\n return {\n className: 'draw',\n x,\n y: baselineY - barHeight / 4,\n width: bandWidth,\n height: barHeight / 2\n };\n });\n}\n\nfunction toLinearOpenPath(points: Point[]): string {\n return points.reduce((path, point, index) => {\n if (index === 0) {\n return `M ${point.x.toFixed(PRECISION)} ${point.y.toFixed(PRECISION)}`;\n }\n return `${path} L ${point.x.toFixed(PRECISION)} ${point.y.toFixed(PRECISION)}`;\n }, '');\n}\n\nfunction toSmoothOpenPath(points: Point[]): string {\n const segments = points.map((point, index) => {\n if (index === 0) {\n return `M ${point.x.toFixed(PRECISION)} ${point.y.toFixed(PRECISION)}`;\n }\n const previous = points[index - 1]!;\n const deltaX = (point.x - previous.x) / 3;\n const p = PRECISION;\n return `C ${(previous.x + deltaX).toFixed(p)} ${previous.y.toFixed(p)} ${(point.x - deltaX).toFixed(p)} ${point.y.toFixed(p)} ${point.x.toFixed(p)} ${point.y.toFixed(p)}`;\n });\n return segments.join(' ');\n}\n\nfunction toStepOpenPath(points: Point[]): string {\n let path = `M ${points[0]!.x.toFixed(PRECISION)} ${points[0]!.y.toFixed(PRECISION)}`;\n for (let index = 1; index < points.length; index++) {\n const point = points[index]!;\n path += ` H ${point.x.toFixed(PRECISION)} V ${point.y.toFixed(PRECISION)}`;\n }\n return path;\n}\n\nfunction calculateBandSizing(count: number, viewDimension: number, gapRatio: number) {\n if (count <= 0) return { bandSize: 0, stepSize: 0 };\n\n const stepSize = viewDimension / count;\n const bandSize = stepSize * gapRatio;\n return { bandSize, stepSize };\n}\n"],"mappings":"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"}
|