@nvidia-elements/core 2.11.2 → 2.12.1
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 +16 -0
- package/dist/accordion/accordion.examples.json +1 -1
- package/dist/accordion/accordion2.js +4 -4
- package/dist/alert/alert-group2.js +1 -1
- package/dist/alert/alert.examples.json +6 -6
- 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/bundles/index.d.ts +473 -469
- package/dist/bundles/index.js +6 -6
- package/dist/button/button.examples.json +3 -3
- package/dist/button/button2.js +1 -1
- package/dist/button-group/button-group2.js +1 -1
- package/dist/card/card.examples.json +2 -2
- package/dist/card/card2.js +4 -4
- package/dist/chat-message/chat-message.examples.json +1 -1
- package/dist/chat-message/chat-message2.js +1 -1
- package/dist/checkbox/checkbox-group2.js +1 -1
- package/dist/checkbox/checkbox.examples.json +5 -5
- package/dist/checkbox/checkbox2.js +1 -1
- package/dist/color/color.examples.json +2 -2
- package/dist/color/color2.js +1 -1
- package/dist/combobox/combobox.examples.json +7 -7
- package/dist/combobox/combobox2.js +1 -1
- package/dist/copy-button/copy-button.examples.json +1 -1
- package/dist/copy-button/copy-button2.js +1 -1
- package/dist/custom-elements-jsx.d.ts +6 -2
- package/dist/custom-elements-vue.d.ts +6 -2
- package/dist/custom-elements.json +89 -17
- package/dist/data.html.json +10 -1
- package/dist/date/date.examples.json +3 -3
- package/dist/date/date2.js +1 -1
- package/dist/datetime/datetime.examples.json +2 -2
- 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 +7 -7
- 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/drawer.examples.json +5 -5
- 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 +3 -3
- package/dist/dropdown/dropdown2.js +1 -1
- package/dist/dropdown-group/dropdown-group.js +1 -1
- package/dist/dropzone/dropzone.examples.json +2 -2
- package/dist/dropzone/dropzone2.js +1 -1
- package/dist/file/file.examples.json +2 -2
- 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/format-truncate2.js +1 -1
- package/dist/forms/control/control.examples.json +3 -3
- 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 +7 -7
- package/dist/forms/validation.examples.json +4 -4
- package/dist/gauge/gauge.examples.json +2 -2
- 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/grid.examples.json +6 -6
- 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/icon.examples.json +1 -1
- package/dist/icon/icon2.js +2 -2
- package/dist/icon/icons.d.ts +2 -1
- package/dist/icon/icons.js.map +1 -1
- package/dist/icon-button/icon-button2.js +1 -1
- package/dist/index.js +1 -1
- package/dist/input/input-group.examples.json +3 -3
- package/dist/input/input-group2.js +1 -1
- package/dist/input/input.examples.json +2 -2
- package/dist/input/input2.js +1 -1
- package/dist/internal/controllers/gesture.controller.examples.json +1 -1
- package/dist/internal/controllers/popover.examples.json +5 -5
- package/dist/internal/controllers/type-popover.controller.examples.json +1 -1
- package/dist/internal/services/global.service.js +1 -1
- package/dist/internal/types/icons.d.ts +1 -0
- package/dist/internal/types/index.d.ts +1 -1
- package/dist/internal/types/index.js.map +1 -1
- package/dist/internal/utils/dom.js +18 -10
- package/dist/internal/utils/dom.js.map +1 -1
- package/dist/logo/logo2.js +1 -1
- package/dist/menu/menu-group2.js +1 -1
- package/dist/menu/menu-item2.js +1 -1
- package/dist/menu/menu.examples.json +1 -1
- package/dist/menu/menu2.js +1 -1
- package/dist/month/month.examples.json +2 -2
- package/dist/month/month2.js +1 -1
- package/dist/notification/notification-group2.js +1 -1
- package/dist/notification/notification.examples.json +5 -5
- 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.json +25 -25
- package/dist/page/page2.js +1 -1
- package/dist/page-header/page-header2.js +1 -1
- package/dist/page-loader/page-loader.examples.json +1 -1
- package/dist/page-loader/page-loader2.js +1 -1
- package/dist/pagination/pagination.examples.json +2 -2
- 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 +2 -2
- package/dist/password/password2.js +1 -1
- package/dist/preferences-input/preferences-input.examples.json +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-ring.examples.json +5 -5
- package/dist/progress-ring/progress-ring2.js +1 -1
- package/dist/progressive-filter-chip/progressive-filter-chip.examples.json +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/radio.examples.json +5 -5
- package/dist/radio/radio2.js +1 -1
- package/dist/range/range.examples.json +2 -2
- package/dist/range/range2.js +1 -1
- package/dist/resize-handle/resize-handle.examples.json +2 -2
- package/dist/resize-handle/resize-handle2.js +1 -1
- package/dist/search/search.examples.json +2 -2
- package/dist/search/search2.js +1 -1
- package/dist/select/select.examples.json +8 -8
- 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/switch.examples.json +5 -5
- package/dist/switch/switch2.js +1 -1
- package/dist/tabs/tabs-group2.js +1 -1
- package/dist/tabs/tabs.examples.json +1 -1
- package/dist/tabs/tabs2.js +2 -2
- package/dist/tag/tag2.js +1 -1
- package/dist/textarea/textarea.examples.json +2 -2
- package/dist/textarea/textarea2.js +1 -1
- package/dist/time/time.examples.json +2 -2
- package/dist/time/time2.js +1 -1
- package/dist/toast/toast.examples.json +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/toggletip.examples.json +5 -5
- package/dist/toggletip/toggletip2.js +1 -1
- package/dist/toolbar/toolbar.examples.json +4 -4
- package/dist/toolbar/toolbar2.js +1 -1
- package/dist/tooltip/tooltip.examples.json +6 -6
- package/dist/tooltip/tooltip2.js +1 -1
- package/dist/tree/tree-node2.js +1 -1
- package/dist/tree/tree.examples.json +2 -2
- package/dist/tree/tree2.js +1 -1
- package/dist/viewport/viewport-gridlines.d.ts +6 -2
- package/dist/viewport/viewport-gridlines.js +1 -1
- package/dist/viewport/viewport-gridlines.js.map +1 -1
- package/dist/viewport/viewport-gridlines2.js +39 -29
- package/dist/viewport/viewport-gridlines2.js.map +1 -1
- package/dist/viewport/viewport-minimap2.js +1 -1
- package/dist/viewport/viewport.examples.js.map +1 -1
- package/dist/viewport/viewport.examples.json +34 -16
- package/dist/viewport/viewport2.js +1 -1
- package/dist/week/week.examples.json +3 -3
- package/dist/week/week2.js +1 -1
- package/package.json +2 -1
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
{
|
|
26
26
|
"id": "toggletip-content",
|
|
27
27
|
"name": "Content",
|
|
28
|
-
"template": "<nve-toggletip anchor=\"btn\">\n <nve-toggletip-header>\n <h3 nve-text=\"heading sm\">Toggletip Header</h3>\n </nve-toggletip-header>\n <p nve-text=\"body\">some text content in a toggletip</p>\n <nve-toggletip-footer>\n <p nve-text=\"body\">Toggletip Footer</p>\n </nve-toggletip-footer>\n</nve-toggletip>\n<nve-button id=\"btn\">button</nve-button>\n",
|
|
28
|
+
"template": "<nve-toggletip anchor=\"btn\">\n <nve-toggletip-header>\n <h3 nve-text=\"heading sm\">Toggletip Header</h3>\n </nve-toggletip-header>\n <p nve-text=\"body\">some text content in a toggletip</p>\n <nve-toggletip-footer>\n <p nve-text=\"body\">Toggletip Footer</p>\n </nve-toggletip-footer>\n</nve-toggletip>\n\n<nve-button id=\"btn\">button</nve-button>\n",
|
|
29
29
|
"summary": "Toggletip with complete structure including header, content, and footer sections. Perfect for rich interactive content like quick forms, action menus, or detailed explanations that gain from organized layout.",
|
|
30
30
|
"description": "",
|
|
31
31
|
"composition": false,
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
{
|
|
35
35
|
"id": "toggletip-content-with-footer",
|
|
36
36
|
"name": "ContentWithFooter",
|
|
37
|
-
"template": "<nve-toggletip anchor=\"btn\">\n <p nve-text=\"body\">some text content in a toggletip</p>\n <nve-toggletip-footer>\n <p nve-text=\"body\">Toggletip Footer</p>\n </nve-toggletip-footer>\n</nve-toggletip>\n<nve-button id=\"btn\">button</nve-button>\n",
|
|
37
|
+
"template": "<nve-toggletip anchor=\"btn\">\n <p nve-text=\"body\">some text content in a toggletip</p>\n <nve-toggletip-footer>\n <p nve-text=\"body\">Toggletip Footer</p>\n </nve-toggletip-footer>\n</nve-toggletip>\n\n<nve-button id=\"btn\">button</nve-button>\n",
|
|
38
38
|
"summary": "Toggletip with footer for action buttons or supplementary links. Use when toggletip content needs follow-up actions, navigation, or extra context links without requiring a header section.",
|
|
39
39
|
"description": "",
|
|
40
40
|
"composition": false,
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
{
|
|
44
44
|
"id": "toggletip-content-with-header",
|
|
45
45
|
"name": "ContentWithHeader",
|
|
46
|
-
"template": "<nve-toggletip anchor=\"btn\">\n <nve-toggletip-header>\n <h3 nve-text=\"heading sm\">Toggletip Header</h3>\n </nve-toggletip-header>\n <p nve-text=\"body\">some text content in a toggletip</p>\n</nve-toggletip>\n<nve-button id=\"btn\">button</nve-button>\n",
|
|
46
|
+
"template": "<nve-toggletip anchor=\"btn\">\n <nve-toggletip-header>\n <h3 nve-text=\"heading sm\">Toggletip Header</h3>\n </nve-toggletip-header>\n <p nve-text=\"body\">some text content in a toggletip</p>\n</nve-toggletip>\n\n<nve-button id=\"btn\">button</nve-button>\n",
|
|
47
47
|
"summary": "Toggletip with header for titled content sections. Use when toggletip information benefits from a clear title or heading to establish context, improving content scannability and understanding.",
|
|
48
48
|
"description": "",
|
|
49
49
|
"composition": false,
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
{
|
|
97
97
|
"id": "toggletip-alignment",
|
|
98
98
|
"name": "Alignment",
|
|
99
|
-
"template": "<nve-toggletip anchor=\"card\" position=\"top\" alignment=\"start\">top start</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"top\">top center</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"top\" alignment=\"end\">top end</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"right\" alignment=\"start\">right start</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"right\">right center</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"right\" alignment=\"end\">right end</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"bottom\" alignment=\"start\">bottom start</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"bottom\">bottom center</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"bottom\" alignment=\"end\">bottom end</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"left\" alignment=\"start\">left start</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"left\">left center</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"left\" alignment=\"end\">left end</nve-toggletip>\n<nve-card id=\"card\" style=\"width: 400px; height: 200px\"></nve-card>\n",
|
|
99
|
+
"template": "<nve-toggletip anchor=\"card\" position=\"top\" alignment=\"start\">top start</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"top\">top center</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"top\" alignment=\"end\">top end</nve-toggletip>\n\n<nve-toggletip anchor=\"card\" position=\"right\" alignment=\"start\">right start</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"right\">right center</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"right\" alignment=\"end\">right end</nve-toggletip>\n\n<nve-toggletip anchor=\"card\" position=\"bottom\" alignment=\"start\">bottom start</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"bottom\">bottom center</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"bottom\" alignment=\"end\">bottom end</nve-toggletip>\n\n<nve-toggletip anchor=\"card\" position=\"left\" alignment=\"start\">left start</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"left\">left center</nve-toggletip>\n<nve-toggletip anchor=\"card\" position=\"left\" alignment=\"end\">left end</nve-toggletip>\n\n<nve-card id=\"card\" style=\"width: 400px; height: 200px\"></nve-card>\n",
|
|
100
100
|
"summary": "Precise toggletip alignment combined with positioning for optimal placement control. Use alignment to fine-tune toggletip placement relative to trigger edges, improving visual flow and reducing content overlap in dense layouts.",
|
|
101
101
|
"description": "",
|
|
102
102
|
"composition": false,
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
{
|
|
108
108
|
"id": "toggletip-cross-shadow-root-anchor-position",
|
|
109
109
|
"name": "CrossShadowRootAnchorPosition",
|
|
110
|
-
"template": "<nve-button popovertarget=\"root-toggletip\">document root anchor</nve-button>\n<nve-toggletip id=\"root-toggletip\">document root toggletip</nve-toggletip>\n<demo-shadow-root style=\"visibility: visible !important\">\n <template shadowrootmode=\"open\">\n <nve-toggletip id=\"cross-root-toggletip\" hidden>cross root toggletip</nve-toggletip>\n <slot></slot>\n </template>\n</demo-shadow-root>\n<nve-button popovertarget=\"cross-root-toggletip\">cross root anchor</nve-button>\n",
|
|
110
|
+
"template": "<nve-button popovertarget=\"root-toggletip\">document root anchor</nve-button>\n<nve-toggletip id=\"root-toggletip\">document root toggletip</nve-toggletip>\n\n<demo-shadow-root style=\"visibility: visible !important\">\n <template shadowrootmode=\"open\">\n <nve-toggletip id=\"cross-root-toggletip\" hidden>cross root toggletip</nve-toggletip>\n <slot></slot>\n </template>\n</demo-shadow-root>\n<nve-button popovertarget=\"cross-root-toggletip\">cross root anchor</nve-button>\n",
|
|
111
111
|
"summary": "Toggletip anchored to elements across shadow DOM boundaries.",
|
|
112
112
|
"description": "",
|
|
113
113
|
"composition": false,
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
{
|
|
42
42
|
"id": "toolbar-groups",
|
|
43
43
|
"name": "Groups",
|
|
44
|
-
"template": "<nve-toolbar>\n <nve-select fit-text>\n <select aria-label=\"element type\">\n <option value=\"1\">Heading 1</option>\n <option value=\"2\">Heading 2</option>\n <option value=\"p\">Paragraph</option>\n </select>\n <div slot=\"option-1\">\n <span nve-text=\"heading\">Heading 1</span>\n </div>\n <div slot=\"option-2\">\n <span nve-text=\"heading sm\">Heading 2</span>\n </div>\n <div slot=\"option-3\">\n <span nve-text=\"body sm\">Paragraph</span>\n </div>\n </nve-select>\n <nve-divider></nve-divider>\n <nve-button-group>\n <nve-icon-button pressed icon-name=\"bars-3-bottom-left\"></nve-icon-button>\n <nve-icon-button icon-name=\"bars-3-bottom-right\"></nve-icon-button>\n <nve-icon-button icon-name=\"bars-4\"></nve-icon-button>\n </nve-button-group>\n <nve-divider></nve-divider>\n <nve-button-group>\n <nve-icon-button icon-name=\"bold\" size=\"sm\"></nve-icon-button>\n <nve-icon-button icon-name=\"italic\" size=\"sm\"></nve-icon-button>\n <nve-icon-button icon-name=\"strikethrough\" size=\"sm\"></nve-icon-button>\n </nve-button-group>\n <nve-divider></nve-divider>\n <nve-button-group>\n <nve-icon-button icon-name=\"code\"></nve-icon-button>\n <nve-icon-button icon-name=\"fork\"></nve-icon-button>\n <nve-icon-button icon-name=\"merge\"></nve-icon-button>\n </nve-button-group>\n <nve-button slot=\"suffix\" container=\"flat\">Save</nve-button>\n</nve-toolbar>\n",
|
|
44
|
+
"template": "<nve-toolbar>\n <nve-select fit-text>\n <select aria-label=\"element type\">\n <option value=\"1\">Heading 1</option>\n <option value=\"2\">Heading 2</option>\n <option value=\"p\">Paragraph</option>\n </select>\n <div slot=\"option-1\">\n <span nve-text=\"heading\">Heading 1</span>\n </div>\n <div slot=\"option-2\">\n <span nve-text=\"heading sm\">Heading 2</span>\n </div>\n <div slot=\"option-3\">\n <span nve-text=\"body sm\">Paragraph</span>\n </div>\n </nve-select>\n\n <nve-divider></nve-divider>\n\n <nve-button-group>\n <nve-icon-button pressed icon-name=\"bars-3-bottom-left\"></nve-icon-button>\n <nve-icon-button icon-name=\"bars-3-bottom-right\"></nve-icon-button>\n <nve-icon-button icon-name=\"bars-4\"></nve-icon-button>\n </nve-button-group>\n\n <nve-divider></nve-divider>\n\n <nve-button-group>\n <nve-icon-button icon-name=\"bold\" size=\"sm\"></nve-icon-button>\n <nve-icon-button icon-name=\"italic\" size=\"sm\"></nve-icon-button>\n <nve-icon-button icon-name=\"strikethrough\" size=\"sm\"></nve-icon-button>\n </nve-button-group>\n\n <nve-divider></nve-divider>\n\n <nve-button-group>\n <nve-icon-button icon-name=\"code\"></nve-icon-button>\n <nve-icon-button icon-name=\"fork\"></nve-icon-button>\n <nve-icon-button icon-name=\"merge\"></nve-icon-button>\n </nve-button-group>\n\n <nve-button slot=\"suffix\" container=\"flat\">Save</nve-button>\n</nve-toolbar>\n",
|
|
45
45
|
"summary": "Complex toolbar with grouped controls including select dropdowns, button groups, and dividers for text editing scenarios.",
|
|
46
46
|
"description": "",
|
|
47
47
|
"composition": true,
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
{
|
|
51
51
|
"id": "toolbar-vertical",
|
|
52
52
|
"name": "Vertical",
|
|
53
|
-
"template": "<nve-toolbar orientation=\"vertical\">\n <nve-button-group>\n <nve-icon-button pressed icon-name=\"bars-3-bottom-left\"></nve-icon-button>\n <nve-icon-button icon-name=\"bars-3-bottom-right\"></nve-icon-button>\n <nve-icon-button icon-name=\"bars-4\"></nve-icon-button>\n </nve-button-group>\n <nve-divider></nve-divider>\n <nve-button-group>\n <nve-icon-button icon-name=\"bold\" size=\"sm\"></nve-icon-button>\n <nve-icon-button icon-name=\"italic\" size=\"sm\"></nve-icon-button>\n <nve-icon-button icon-name=\"strikethrough\"></nve-icon-button>\n </nve-button-group>\n</nve-toolbar>\n",
|
|
53
|
+
"template": "<nve-toolbar orientation=\"vertical\">\n <nve-button-group>\n <nve-icon-button pressed icon-name=\"bars-3-bottom-left\"></nve-icon-button>\n <nve-icon-button icon-name=\"bars-3-bottom-right\"></nve-icon-button>\n <nve-icon-button icon-name=\"bars-4\"></nve-icon-button>\n </nve-button-group>\n\n <nve-divider></nve-divider>\n\n <nve-button-group>\n <nve-icon-button icon-name=\"bold\" size=\"sm\"></nve-icon-button>\n <nve-icon-button icon-name=\"italic\" size=\"sm\"></nve-icon-button>\n <nve-icon-button icon-name=\"strikethrough\"></nve-icon-button>\n </nve-button-group>\n</nve-toolbar>\n",
|
|
54
54
|
"summary": "Vertical toolbar orientation with button groups and dividers for sidebar layouts.",
|
|
55
55
|
"description": "",
|
|
56
56
|
"composition": true,
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
{
|
|
60
60
|
"id": "toolbar-status",
|
|
61
61
|
"name": "Status",
|
|
62
|
-
"template": "<div nve-layout=\"column gap:lg align:horizontal-stretch full\">\n <nve-toolbar status=\"accent\">\n <nve-icon-button icon-name=\"cancel\" slot=\"prefix\"></nve-icon-button>\n <p nve-text=\"body\">123 selected</p>\n <nve-button slot=\"suffix\">delete</nve-button>\n <nve-icon-button icon-name=\"more-actions\" slot=\"suffix\"></nve-icon-button>\n </nve-toolbar>\n <nve-toolbar>\n <nve-icon-button icon-name=\"cancel\" slot=\"prefix\"></nve-icon-button>\n <p nve-text=\"body\">123 selected</p>\n <nve-button slot=\"suffix\">delete</nve-button>\n <nve-icon-button icon-name=\"more-actions\" slot=\"suffix\"></nve-icon-button>\n </nve-toolbar>\n</div>\n",
|
|
62
|
+
"template": "<div nve-layout=\"column gap:lg align:horizontal-stretch full\">\n <nve-toolbar status=\"accent\">\n <nve-icon-button icon-name=\"cancel\" slot=\"prefix\"></nve-icon-button>\n <p nve-text=\"body\">123 selected</p>\n <nve-button slot=\"suffix\">delete</nve-button>\n <nve-icon-button icon-name=\"more-actions\" slot=\"suffix\"></nve-icon-button>\n </nve-toolbar>\n\n <nve-toolbar>\n <nve-icon-button icon-name=\"cancel\" slot=\"prefix\"></nve-icon-button>\n <p nve-text=\"body\">123 selected</p>\n <nve-button slot=\"suffix\">delete</nve-button>\n <nve-icon-button icon-name=\"more-actions\" slot=\"suffix\"></nve-icon-button>\n </nve-toolbar>\n</div>\n",
|
|
63
63
|
"summary": "Toolbar with status styling showing selection state with accent status and default status variants for bulk actions.",
|
|
64
64
|
"description": "",
|
|
65
65
|
"composition": true,
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
{
|
|
69
69
|
"id": "toolbar-container",
|
|
70
70
|
"name": "Container",
|
|
71
|
-
"template": "<div nve-layout=\"column gap:lg\">\n <nve-toolbar>\n <nve-button><nve-icon name=\"copy\"></nve-icon> copy</nve-button>\n <nve-button><nve-icon name=\"copy\"></nve-icon></nve-button>\n <nve-icon-button icon-name=\"copy\"></nve-icon-button>\n <nve-copy-button></nve-copy-button>\n <nve-switch prominence=\"muted\">\n <input type=\"checkbox\" checked aria-label=\"switch\" />\n </nve-switch>\n <nve-checkbox prominence=\"muted\">\n <input type=\"checkbox\" checked aria-label=\"checkbox\" />\n </nve-checkbox>\n <nve-input>\n <input aria-label=\"input\" />\n </nve-input>\n </nve-toolbar>\n <nve-toolbar container=\"flat\">\n <nve-button><nve-icon name=\"copy\"></nve-icon> copy</nve-button>\n <nve-button><nve-icon name=\"copy\"></nve-icon></nve-button>\n <nve-icon-button icon-name=\"copy\"></nve-icon-button>\n <nve-copy-button></nve-copy-button>\n <nve-switch prominence=\"muted\">\n <input type=\"checkbox\" checked aria-label=\"switch\" />\n </nve-switch>\n <nve-checkbox prominence=\"muted\">\n <input type=\"checkbox\" checked aria-label=\"checkbox\" />\n </nve-checkbox>\n <nve-input>\n <input aria-label=\"input\" />\n </nve-input>\n </nve-toolbar>\n <nve-toolbar container=\"inset\">\n <nve-button><nve-icon name=\"copy\"></nve-icon> copy</nve-button>\n <nve-button><nve-icon name=\"copy\"></nve-icon></nve-button>\n <nve-icon-button icon-name=\"copy\"></nve-icon-button>\n <nve-copy-button></nve-copy-button>\n <nve-switch prominence=\"muted\">\n <input type=\"checkbox\" checked aria-label=\"switch\" />\n </nve-switch>\n <nve-checkbox prominence=\"muted\">\n <input type=\"checkbox\" checked aria-label=\"checkbox\" />\n </nve-checkbox>\n <nve-input>\n <input aria-label=\"input\" />\n </nve-input>\n </nve-toolbar>\n</div>\n",
|
|
71
|
+
"template": "<div nve-layout=\"column gap:lg\">\n <nve-toolbar>\n <nve-button><nve-icon name=\"copy\"></nve-icon> copy</nve-button>\n <nve-button><nve-icon name=\"copy\"></nve-icon></nve-button>\n <nve-icon-button icon-name=\"copy\"></nve-icon-button>\n <nve-copy-button></nve-copy-button>\n <nve-switch prominence=\"muted\">\n <input type=\"checkbox\" checked aria-label=\"switch\" />\n </nve-switch>\n <nve-checkbox prominence=\"muted\">\n <input type=\"checkbox\" checked aria-label=\"checkbox\" />\n </nve-checkbox>\n <nve-input>\n <input aria-label=\"input\" />\n </nve-input>\n </nve-toolbar>\n\n <nve-toolbar container=\"flat\">\n <nve-button><nve-icon name=\"copy\"></nve-icon> copy</nve-button>\n <nve-button><nve-icon name=\"copy\"></nve-icon></nve-button>\n <nve-icon-button icon-name=\"copy\"></nve-icon-button>\n <nve-copy-button></nve-copy-button>\n <nve-switch prominence=\"muted\">\n <input type=\"checkbox\" checked aria-label=\"switch\" />\n </nve-switch>\n <nve-checkbox prominence=\"muted\">\n <input type=\"checkbox\" checked aria-label=\"checkbox\" />\n </nve-checkbox>\n <nve-input>\n <input aria-label=\"input\" />\n </nve-input>\n </nve-toolbar>\n\n <nve-toolbar container=\"inset\">\n <nve-button><nve-icon name=\"copy\"></nve-icon> copy</nve-button>\n <nve-button><nve-icon name=\"copy\"></nve-icon></nve-button>\n <nve-icon-button icon-name=\"copy\"></nve-icon-button>\n <nve-copy-button></nve-copy-button>\n <nve-switch prominence=\"muted\">\n <input type=\"checkbox\" checked aria-label=\"switch\" />\n </nve-switch>\n <nve-checkbox prominence=\"muted\">\n <input type=\"checkbox\" checked aria-label=\"checkbox\" />\n </nve-checkbox>\n <nve-input>\n <input aria-label=\"input\" />\n </nve-input>\n </nve-toolbar>\n</div>\n",
|
|
72
72
|
"summary": "Example of toolbar containers and their different appearances with varying prominence levels.",
|
|
73
73
|
"description": "",
|
|
74
74
|
"composition": true,
|
package/dist/toolbar/toolbar2.js
CHANGED
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
{
|
|
37
37
|
"id": "tooltip-alignment",
|
|
38
38
|
"name": "Alignment",
|
|
39
|
-
"template": "<nve-tooltip anchor=\"card\" position=\"top\" alignment=\"start\">top start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"top\">top center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"top\" alignment=\"end\">top end</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"right\" alignment=\"start\">right start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"right\">right center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"right\" alignment=\"end\">right end</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"bottom\" alignment=\"start\">bottom start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"bottom\">bottom center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"bottom\" alignment=\"end\">bottom end</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"left\" alignment=\"start\">left start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"left\">left center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"left\" alignment=\"end\">left end</nve-tooltip>\n<nve-card id=\"card\" style=\"width: 400px; height: 200px\"></nve-card>\n",
|
|
39
|
+
"template": "<nve-tooltip anchor=\"card\" position=\"top\" alignment=\"start\">top start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"top\">top center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"top\" alignment=\"end\">top end</nve-tooltip>\n\n<nve-tooltip anchor=\"card\" position=\"right\" alignment=\"start\">right start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"right\">right center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"right\" alignment=\"end\">right end</nve-tooltip>\n\n<nve-tooltip anchor=\"card\" position=\"bottom\" alignment=\"start\">bottom start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"bottom\">bottom center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"bottom\" alignment=\"end\">bottom end</nve-tooltip>\n\n<nve-tooltip anchor=\"card\" position=\"left\" alignment=\"start\">left start</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"left\">left center</nve-tooltip>\n<nve-tooltip anchor=\"card\" position=\"left\" alignment=\"end\">left end</nve-tooltip>\n\n<nve-card id=\"card\" style=\"width: 400px; height: 200px\"></nve-card>\n",
|
|
40
40
|
"summary": "Fine-grained tooltip alignment combined with positioning for precise placement control. Use to align tooltips to specific edges of trigger elements, improving visual hierarchy and reducing overlap with other UI elements.",
|
|
41
41
|
"description": "",
|
|
42
42
|
"composition": false,
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
{
|
|
66
66
|
"id": "tooltip-dynamic-trigger",
|
|
67
67
|
"name": "DynamicTrigger",
|
|
68
|
-
"template": "<nve-tooltip id=\"dynamic-popover\"></nve-tooltip>\n<div nve-layout=\"row gap:sm align:center\">\n <nve-button interestfor=\"dynamic-popover\">one</nve-button>\n <nve-button interestfor=\"dynamic-popover\">two</nve-button>\n <nve-button interestfor=\"dynamic-popover\">three</nve-button>\n</div>\n<script type=\"module\">\n document.querySelector(\"#dynamic-popover\").addEventListener(\"toggle\", (e) => {\n if (e.newState === \"open\") {\n e.target.textContent = \"tooltip \" + e.source.textContent;\n }\n });\n</script>\n",
|
|
68
|
+
"template": "<nve-tooltip id=\"dynamic-popover\"></nve-tooltip>\n\n<div nve-layout=\"row gap:sm align:center\">\n <nve-button interestfor=\"dynamic-popover\">one</nve-button>\n <nve-button interestfor=\"dynamic-popover\">two</nve-button>\n <nve-button interestfor=\"dynamic-popover\">three</nve-button>\n</div>\n\n<script type=\"module\">\n document.querySelector(\"#dynamic-popover\").addEventListener(\"toggle\", (e) => {\n if (e.newState === \"open\") {\n e.target.textContent = \"tooltip \" + e.source.textContent;\n }\n });\n</script>\n",
|
|
69
69
|
"summary": "Single tooltip shared across many triggers with dynamic content updates. Use to reduce DOM nodes and improve performance when many similar elements need contextual help, updating tooltip content based on which trigger activated it.",
|
|
70
70
|
"description": "",
|
|
71
71
|
"composition": false,
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
{
|
|
104
104
|
"id": "tooltip-async-trigger",
|
|
105
105
|
"name": "AsyncTrigger",
|
|
106
|
-
"template": "
|
|
106
|
+
"template": "<div id=\"async-trigger-demo\">\n <nve-tooltip id=\"tooltip\">hello there</nve-tooltip>\n <template><nve-button interestfor=\"tooltip\">button</nve-button></template>\n</div>\n<script type=\"module\">\n import \"@nvidia-elements/core/button/define.js\";\n import \"@nvidia-elements/core/tooltip/define.js\";\n const template = document.querySelector(\"#async-trigger-demo template\");\n const instance = template.content.cloneNode(true);\n setTimeout(() => {\n document.querySelector(\"#async-trigger-demo\").appendChild(instance);\n }, 1000);\n</script>\n",
|
|
107
107
|
"summary": "Tooltip anchoring to a dynamically created anchor element.",
|
|
108
108
|
"description": "",
|
|
109
109
|
"composition": false,
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
{
|
|
126
126
|
"id": "tooltip-scroll-container",
|
|
127
127
|
"name": "ScrollContainer",
|
|
128
|
-
"template": "<style>\n #scroll-container {\n display: flex;\n flex-direction: column;\n height: 300px;\n width: 200px;\n overflow-y: auto;\n border: 1px solid #ccc;\n margin: 20vh;\n & > button {\n min-height: 50px;\n width: 100%;\n }\n }\n</style>\n<section id=\"scroll-container\">\n <button interestfor=\"tooltip\">1</button>\n <button interestfor=\"tooltip\">2</button>\n <button interestfor=\"tooltip\">3</button>\n <button interestfor=\"tooltip\">4</button>\n <button interestfor=\"tooltip\">5</button>\n <button interestfor=\"tooltip\">6</button>\n <button interestfor=\"tooltip\">7</button>\n <button interestfor=\"tooltip\">8</button>\n <button interestfor=\"tooltip\">9</button>\n <button interestfor=\"tooltip\">10</button>\n</section>\n<nve-tooltip id=\"tooltip\" position=\"left\">hello there</nve-tooltip>\n",
|
|
128
|
+
"template": "<style>\n #scroll-container {\n display: flex;\n flex-direction: column;\n height: 300px;\n width: 200px;\n overflow-y: auto;\n border: 1px solid #ccc;\n margin: 20vh;\n\n & > button {\n min-height: 50px;\n width: 100%;\n }\n }\n</style>\n<section id=\"scroll-container\">\n <button interestfor=\"tooltip\">1</button>\n <button interestfor=\"tooltip\">2</button>\n <button interestfor=\"tooltip\">3</button>\n <button interestfor=\"tooltip\">4</button>\n <button interestfor=\"tooltip\">5</button>\n <button interestfor=\"tooltip\">6</button>\n <button interestfor=\"tooltip\">7</button>\n <button interestfor=\"tooltip\">8</button>\n <button interestfor=\"tooltip\">9</button>\n <button interestfor=\"tooltip\">10</button>\n</section>\n<nve-tooltip id=\"tooltip\" position=\"left\">hello there</nve-tooltip>\n",
|
|
129
129
|
"summary": "Tooltip behavior within scrollable containers with automatic repositioning. Tooltips maintain visibility and proper positioning even when anchor elements scroll, ensuring consistent user experience in scrollable interfaces.",
|
|
130
130
|
"description": "",
|
|
131
131
|
"composition": false,
|
|
@@ -184,7 +184,7 @@
|
|
|
184
184
|
{
|
|
185
185
|
"id": "tooltip-legacy-open-delay",
|
|
186
186
|
"name": "LegacyOpenDelay",
|
|
187
|
-
"template": "<nve-tooltip behavior-trigger anchor=\"delay-tooltip-1\" trigger=\"delay-tooltip-1\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-1\">button</nve-button>\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-2\" trigger=\"delay-tooltip-2\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-2\">button</nve-button>\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-3\" trigger=\"delay-tooltip-3\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-3\">button</nve-button>\n",
|
|
187
|
+
"template": "<nve-tooltip behavior-trigger anchor=\"delay-tooltip-1\" trigger=\"delay-tooltip-1\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-1\">button</nve-button>\n\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-2\" trigger=\"delay-tooltip-2\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-2\">button</nve-button>\n\n<nve-tooltip behavior-trigger anchor=\"delay-tooltip-3\" trigger=\"delay-tooltip-3\" open-delay=\"500\" hidden>delayed tooltip</nve-tooltip>\n<nve-button id=\"delay-tooltip-3\">button</nve-button>\n",
|
|
188
188
|
"summary": "Legacy implementation combining behavior-trigger with open-delay for many tooltips. Older pattern for delayed tooltip appearance; prefer modern popovertarget with open-delay attribute.",
|
|
189
189
|
"description": "",
|
|
190
190
|
"deprecated": true,
|
|
@@ -216,7 +216,7 @@
|
|
|
216
216
|
{
|
|
217
217
|
"id": "tooltip-interest-invokers",
|
|
218
218
|
"name": "InterestInvokers",
|
|
219
|
-
"template": "<section nve-layout=\"row gap:md align:center\">\n <button popovertarget=\"dropdown\" interestfor=\"tooltip\">open</button>\n <nve-button popovertarget=\"dropdown\" interestfor=\"tooltip\">open</nve-button>\n <nve-dropdown id=\"dropdown\">dropdown content</nve-dropdown>\n <nve-tooltip id=\"tooltip\">tooltip content</nve-tooltip>\n <div id=\"div\">static</div>\n <nve-tooltip trigger=\"div\" hidden>static</nve-tooltip>\n</section>\n",
|
|
219
|
+
"template": "<section nve-layout=\"row gap:md align:center\">\n <button popovertarget=\"dropdown\" interestfor=\"tooltip\">open</button>\n <nve-button popovertarget=\"dropdown\" interestfor=\"tooltip\">open</nve-button>\n <nve-dropdown id=\"dropdown\">dropdown content</nve-dropdown>\n <nve-tooltip id=\"tooltip\">tooltip content</nve-tooltip>\n\n <div id=\"div\">static</div>\n <nve-tooltip trigger=\"div\" hidden>static</nve-tooltip>\n</section>\n",
|
|
220
220
|
"summary": "Tooltip functionality using interest invokers to control tooltip visibility on hover and focus.",
|
|
221
221
|
"description": "",
|
|
222
222
|
"composition": true,
|
package/dist/tooltip/tooltip2.js
CHANGED
package/dist/tree/tree-node2.js
CHANGED
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
{
|
|
80
80
|
"id": "tree-node-content",
|
|
81
81
|
"name": "NodeContent",
|
|
82
|
-
"template": "<nve-tree selectable=\"multi\" border behavior-expand behavior-select>\n <nve-tree-node expanded>\n text content\n <nve-tree-node>\n <a href=\".\" nve-text=\"link\">node link</a>\n </nve-tree-node>\n <nve-tree-node> inline content <nve-dot status=\"success\" size=\"sm\"></nve-dot> </nve-tree-node>\n <nve-tree-node>\n <div nve-text=\"body sm muted\" nve-layout=\"pad-bottom:xs\">block</div>\n <p nve-text=\"body sm\">content</p>\n </nve-tree-node>\n <nve-tree-node>\n long form content\n <div slot=\"content\" nve-layout=\"column gap:sm\">\n <a href=\"#\" nve-text=\"link\">This is some longer content in a tree node.</a>\n <a href=\"#\" nve-text=\"link\">This is some longer content in a tree node.</a>\n <a href=\"#\" nve-text=\"link\">This is some longer content in a tree node.</a>\n </div>\n </nve-tree-node>\n <nve-tree-node>\n interactive content\n <div slot=\"content\" nve-layout=\"column gap:sm\">\n <p nve-text=\"body sm\">This is some longer content in a tree node.</p>\n <nve-button>hello there</nve-button>\n </div>\n </nve-tree-node>\n <nve-tree-node>\n input control\n <div slot=\"content\" nve-layout=\"column gap:sm\">\n <nve-input>\n <label>label</label>\n <input type=\"text\" />\n </nve-input>\n <nve-input>\n <label>label</label>\n <input type=\"text\" />\n </nve-input>\n </div>\n </nve-tree-node>\n <nve-tree-node>\n node content checkbox group\n <nve-checkbox-group slot=\"content\">\n <label>label</label>\n <nve-checkbox>\n <label>checkbox 1</label>\n <input type=\"checkbox\" checked />\n </nve-checkbox>\n <nve-checkbox>\n <label>checkbox 2</label>\n <input type=\"checkbox\" />\n </nve-checkbox>\n <nve-checkbox>\n <label>checkbox 3</label>\n <input type=\"checkbox\" />\n </nve-checkbox>\n </nve-checkbox-group>\n </nve-tree-node>\n <nve-tree-node>\n node content radio group\n <nve-radio-group slot=\"content\">\n <label>label</label>\n <nve-radio>\n <label>radio 1</label>\n <input type=\"radio\" checked />\n </nve-radio>\n <nve-radio>\n <label>radio 2</label>\n <input type=\"radio\" />\n </nve-radio>\n <nve-radio>\n <label>radio 3</label>\n <input type=\"radio\" />\n </nve-radio>\n </nve-radio-group>\n </nve-tree-node>\n </nve-tree-node>\n</nve-tree>\n",
|
|
82
|
+
"template": "<nve-tree selectable=\"multi\" border behavior-expand behavior-select>\n <nve-tree-node expanded>\n text content\n <nve-tree-node>\n <a href=\".\" nve-text=\"link\">node link</a>\n </nve-tree-node>\n <nve-tree-node> inline content <nve-dot status=\"success\" size=\"sm\"></nve-dot> </nve-tree-node>\n <nve-tree-node>\n <div nve-text=\"body sm muted\" nve-layout=\"pad-bottom:xs\">block</div>\n <p nve-text=\"body sm\">content</p>\n </nve-tree-node>\n <nve-tree-node>\n long form content\n <div slot=\"content\" nve-layout=\"column gap:sm\">\n <a href=\"#\" nve-text=\"link\">This is some longer content in a tree node.</a>\n <a href=\"#\" nve-text=\"link\">This is some longer content in a tree node.</a>\n <a href=\"#\" nve-text=\"link\">This is some longer content in a tree node.</a>\n </div>\n </nve-tree-node>\n <nve-tree-node>\n interactive content\n <div slot=\"content\" nve-layout=\"column gap:sm\">\n <p nve-text=\"body sm\">This is some longer content in a tree node.</p>\n <nve-button>hello there</nve-button>\n </div>\n </nve-tree-node>\n <nve-tree-node>\n input control\n <div slot=\"content\" nve-layout=\"column gap:sm\">\n <nve-input>\n <label>label</label>\n <input type=\"text\" />\n </nve-input>\n <nve-input>\n <label>label</label>\n <input type=\"text\" />\n </nve-input>\n </div>\n </nve-tree-node>\n <nve-tree-node>\n node content checkbox group\n <nve-checkbox-group slot=\"content\">\n <label>label</label>\n <nve-checkbox>\n <label>checkbox 1</label>\n <input type=\"checkbox\" checked />\n </nve-checkbox>\n\n <nve-checkbox>\n <label>checkbox 2</label>\n <input type=\"checkbox\" />\n </nve-checkbox>\n\n <nve-checkbox>\n <label>checkbox 3</label>\n <input type=\"checkbox\" />\n </nve-checkbox>\n </nve-checkbox-group>\n </nve-tree-node>\n <nve-tree-node>\n node content radio group\n <nve-radio-group slot=\"content\">\n <label>label</label>\n <nve-radio>\n <label>radio 1</label>\n <input type=\"radio\" checked />\n </nve-radio>\n\n <nve-radio>\n <label>radio 2</label>\n <input type=\"radio\" />\n </nve-radio>\n\n <nve-radio>\n <label>radio 3</label>\n <input type=\"radio\" />\n </nve-radio>\n </nve-radio-group>\n </nve-tree-node>\n </nve-tree-node>\n</nve-tree>\n",
|
|
83
83
|
"summary": "Tree with rich node content including forms, controls, and interactive elements, enabling complex data management within hierarchical structures.",
|
|
84
84
|
"description": "",
|
|
85
85
|
"composition": true,
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
{
|
|
111
111
|
"id": "tree-bulk-creation",
|
|
112
112
|
"name": "BulkCreation",
|
|
113
|
-
"template": "<nve-tree>\n <nve-tree-node id=\"root\" expandable>Test</nve-tree-node>\n</nve-tree>\n<script type=\"module\">\n const rootEl = document.querySelector(\"nve-tree-node#root\");\n rootEl.addEventListener(\"open\", () => {\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < 400; i++) {\n rootEl.expanded = true;\n const childEl = document.createElement(\"nve-tree-node\");\n childEl.innerText = \"Child \" + i;\n fragment.append(childEl);\n }\n rootEl.append(fragment);\n });\n rootEl.addEventListener(\"close\", () => {\n rootEl.expanded = false;\n rootEl.replaceChildren(document.createTextNode(\"Test\"));\n });\n</script>\n",
|
|
113
|
+
"template": "<nve-tree>\n <nve-tree-node id=\"root\" expandable>Test</nve-tree-node>\n</nve-tree>\n<script type=\"module\">\n const rootEl = document.querySelector(\"nve-tree-node#root\");\n\n rootEl.addEventListener(\"open\", () => {\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < 400; i++) {\n rootEl.expanded = true;\n const childEl = document.createElement(\"nve-tree-node\");\n childEl.innerText = \"Child \" + i;\n fragment.append(childEl);\n }\n rootEl.append(fragment);\n });\n\n rootEl.addEventListener(\"close\", () => {\n rootEl.expanded = false;\n rootEl.replaceChildren(document.createTextNode(\"Test\"));\n });\n</script>\n",
|
|
114
114
|
"summary": "Tree with bulk node creation for performance testing, verifying efficient handling of large numbers of nodes and dynamic expansion.",
|
|
115
115
|
"description": "",
|
|
116
116
|
"composition": false,
|
package/dist/tree/tree2.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { LitElement, nothing, type PropertyValues } from 'lit';
|
|
2
2
|
/**
|
|
3
3
|
* @element nve-viewport-gridlines
|
|
4
|
-
* @description Renders origin-stable, zoom-adaptive
|
|
4
|
+
* @description Renders origin-stable, zoom-adaptive gridline patterns behind viewport content.
|
|
5
5
|
* @documentation https://nvidia.github.io/elements/docs/elements/viewport/
|
|
6
6
|
* @since 0.0.0
|
|
7
7
|
* @entrypoint \@nvidia-elements/core/viewport
|
|
8
|
-
* @cssprop --color - Sets the gridline
|
|
8
|
+
* @cssprop --color - Sets the gridline pattern color.
|
|
9
9
|
* @cssprop --line-width - Sets the approximate stroke width in CSS pixels.
|
|
10
|
+
* @cssprop --dot-radius - Sets the approximate dot radius in CSS pixels.
|
|
11
|
+
* @cssprop --cross-size - Sets the approximate full width and height of each cross in CSS pixels.
|
|
10
12
|
*/
|
|
11
13
|
export declare class ViewportGridlines extends LitElement {
|
|
12
14
|
#private;
|
|
@@ -19,6 +21,8 @@ export declare class ViewportGridlines extends LitElement {
|
|
|
19
21
|
slot: string;
|
|
20
22
|
/** @private */
|
|
21
23
|
protected accessibilityHidden: string;
|
|
24
|
+
/** Grid pattern to render. */
|
|
25
|
+
pattern: 'lines' | 'dots' | 'crosses';
|
|
22
26
|
/** Smallest gridline interval in content-space units. */
|
|
23
27
|
get step(): number;
|
|
24
28
|
set step(value: number);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/viewport/viewport-gridlines.css?inline
|
|
2
|
-
var e = ":host{--
|
|
2
|
+
var e = ":host{--color: var(--nve-ref-border-color-muted);--line-width: var(--nve-ref-border-width-sm);--dot-radius: var(--nve-ref-size-50);--cross-size: var(--nve-ref-size-200);--_scale: 1;position:absolute;inset:0;contain:none;pointer-events:none;user-select:none}svg{position:absolute;overflow:visible;pointer-events:none}path{fill:none;stroke:var(--color);stroke-width:calc(var(--line-width) / var(--_scale))}circle{fill:var(--color);r:calc(var(--dot-radius) / var(--_scale))}.cross{fill:var(--color)}.cross-horizontal{x:calc(var(--cross-size) / var(--_scale) / -2);y:calc(var(--line-width) / var(--_scale) / -2);width:calc(var(--cross-size) / var(--_scale));height:calc(var(--line-width) / var(--_scale))}.cross-vertical{x:calc(var(--line-width) / var(--_scale) / -2);y:calc(var(--cross-size) / var(--_scale) / -2);width:calc(var(--line-width) / var(--_scale));height:calc(var(--cross-size) / var(--_scale))}";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { e as default };
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewport-gridlines.js","names":[],"sources":["../../src/viewport/viewport-gridlines.css?inline"],"sourcesContent":["/* SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. */\n/* SPDX-License-Identifier: Apache-2.0 */\n\n:host {\n --
|
|
1
|
+
{"version":3,"file":"viewport-gridlines.js","names":[],"sources":["../../src/viewport/viewport-gridlines.css?inline"],"sourcesContent":["/* SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. */\n/* SPDX-License-Identifier: Apache-2.0 */\n\n:host {\n --color: var(--nve-ref-border-color-muted);\n --line-width: var(--nve-ref-border-width-sm);\n --dot-radius: var(--nve-ref-size-50);\n --cross-size: var(--nve-ref-size-200);\n\n --_scale: 1;\n\n position: absolute;\n inset: 0;\n contain: none;\n pointer-events: none;\n user-select: none;\n}\n\nsvg {\n position: absolute;\n overflow: visible;\n pointer-events: none;\n}\n\npath {\n fill: none;\n stroke: var(--color);\n stroke-width: calc(var(--line-width) / var(--_scale));\n}\n\ncircle {\n fill: var(--color);\n r: calc(var(--dot-radius) / var(--_scale));\n}\n\n.cross {\n fill: var(--color);\n}\n\n.cross-horizontal {\n x: calc(var(--cross-size) / var(--_scale) / -2);\n y: calc(var(--line-width) / var(--_scale) / -2);\n width: calc(var(--cross-size) / var(--_scale));\n height: calc(var(--line-width) / var(--_scale));\n}\n\n.cross-vertical {\n x: calc(var(--line-width) / var(--_scale) / -2);\n y: calc(var(--cross-size) / var(--_scale) / -2);\n width: calc(var(--line-width) / var(--_scale));\n height: calc(var(--cross-size) / var(--_scale));\n}\n"],"mappings":""}
|
|
@@ -5,17 +5,17 @@ import i from "../_virtual/_@oxc-project_runtime@0.147.0/helpers/esm/decorate.js
|
|
|
5
5
|
import { Viewport as a } from "./viewport2.js";
|
|
6
6
|
import o from "./viewport-gridlines.js";
|
|
7
7
|
import { createGridlineCoverage as s, gridlineCoverageNeedsUpdate as c, selectGridlineInterval as l } from "./viewport-gridlines.utils.js";
|
|
8
|
-
import { LitElement as u, html as d, nothing as f } from "lit";
|
|
9
|
-
import { property as
|
|
10
|
-
import { styleMap as
|
|
8
|
+
import { LitElement as u, html as d, nothing as f, svg as p } from "lit";
|
|
9
|
+
import { property as m } from "lit/decorators/property.js";
|
|
10
|
+
import { styleMap as h } from "lit/directives/style-map.js";
|
|
11
11
|
//#region src/viewport/viewport-gridlines.ts
|
|
12
|
-
var
|
|
12
|
+
var g = 10, _ = 64, v = class extends u {
|
|
13
13
|
constructor(...e) {
|
|
14
|
-
super(...e), this.slot = "background", this.accessibilityHidden = "true", this.#e =
|
|
14
|
+
super(...e), this.slot = "background", this.accessibilityHidden = "true", this.#e = g, this.#t = 0, this.#n = 0, this.#r = _, this.pattern = "lines", this.#c = () => {
|
|
15
15
|
let e = this.#i;
|
|
16
|
-
e && (this.style.setProperty("--_scale", `${e.scale}`), this.#
|
|
17
|
-
}, this.#
|
|
18
|
-
this.#
|
|
16
|
+
e && (this.style.setProperty("--_scale", `${e.scale}`), this.#u());
|
|
17
|
+
}, this.#l = () => {
|
|
18
|
+
this.#u({ forceCoverage: !0 });
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
21
|
static {
|
|
@@ -24,7 +24,7 @@ var h = 10, g = 64, _ = class extends u {
|
|
|
24
24
|
static {
|
|
25
25
|
this.metadata = {
|
|
26
26
|
tag: "nve-viewport-gridlines",
|
|
27
|
-
version: "2.
|
|
27
|
+
version: "2.12.1"
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
30
|
#e;
|
|
@@ -38,7 +38,7 @@ var h = 10, g = 64, _ = class extends u {
|
|
|
38
38
|
return this.#e;
|
|
39
39
|
}
|
|
40
40
|
set step(e) {
|
|
41
|
-
let t = r(e,
|
|
41
|
+
let t = r(e, g);
|
|
42
42
|
if (t === this.#e) return;
|
|
43
43
|
let n = this.#e;
|
|
44
44
|
this.#e = t, this.requestUpdate("step", n);
|
|
@@ -65,7 +65,7 @@ var h = 10, g = 64, _ = class extends u {
|
|
|
65
65
|
return this.#r;
|
|
66
66
|
}
|
|
67
67
|
set targetSpacing(e) {
|
|
68
|
-
let t = r(e,
|
|
68
|
+
let t = r(e, _);
|
|
69
69
|
if (t === this.#r) return;
|
|
70
70
|
let n = this.#r;
|
|
71
71
|
this.#r = t, this.requestUpdate("targetSpacing", n);
|
|
@@ -73,16 +73,16 @@ var h = 10, g = 64, _ = class extends u {
|
|
|
73
73
|
connectedCallback() {
|
|
74
74
|
super.connectedCallback();
|
|
75
75
|
let e = this.parentElement;
|
|
76
|
-
e instanceof a && (this.#i = e, this.style.setProperty("--_scale", `${e.scale}`), this.#i.addEventListener("viewportchange", this.#
|
|
76
|
+
e instanceof a && (this.#i = e, this.style.setProperty("--_scale", `${e.scale}`), this.#i.addEventListener("viewportchange", this.#c), typeof ResizeObserver < "u" && (this.#a = new ResizeObserver(this.#l), this.#a.observe(e)), this.#d({
|
|
77
77
|
forceCoverage: !0,
|
|
78
78
|
resetInterval: !0
|
|
79
79
|
}));
|
|
80
80
|
}
|
|
81
81
|
disconnectedCallback() {
|
|
82
|
-
this.#i && this.#i.removeEventListener("viewportchange", this.#
|
|
82
|
+
this.#i && this.#i.removeEventListener("viewportchange", this.#c), this.#a?.disconnect(), this.#a = void 0, this.#i = void 0, this.#o = void 0, super.disconnectedCallback();
|
|
83
83
|
}
|
|
84
84
|
willUpdate(e) {
|
|
85
|
-
super.willUpdate(e), (e.has("step") || e.has("targetSpacing")) && this.#
|
|
85
|
+
super.willUpdate(e), (e.has("step") || e.has("targetSpacing")) && this.#d({
|
|
86
86
|
forceCoverage: !0,
|
|
87
87
|
resetInterval: !0
|
|
88
88
|
});
|
|
@@ -90,15 +90,22 @@ var h = 10, g = 64, _ = class extends u {
|
|
|
90
90
|
render() {
|
|
91
91
|
let e = this.#o;
|
|
92
92
|
if (!e) return f;
|
|
93
|
-
let { coverage: t, interval: n } = e;
|
|
94
|
-
return d`<svg internal-host aria-hidden="true" focusable="false" preserveAspectRatio="none" style="${
|
|
93
|
+
let { coverage: t, interval: n } = e, r = this.pattern === "dots" || this.pattern === "crosses";
|
|
94
|
+
return d`<svg internal-host aria-hidden="true" focusable="false" preserveAspectRatio="none" style="${h(b(t))}" viewBox="${t.x} ${t.y} ${t.width} ${t.height}"><defs><pattern data-gridline-pattern id="gridlines" x="${this.#t - (r ? n / 2 : 0)}" y="${this.#n - (r ? n / 2 : 0)}" width="${n}" height="${n}" patternUnits="userSpaceOnUse">${this.#s(n)}</pattern></defs><rect x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" fill="url(#gridlines)"></rect></svg>`;
|
|
95
95
|
}
|
|
96
|
-
#s
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
#s(e) {
|
|
97
|
+
switch (this.pattern) {
|
|
98
|
+
case "dots": return p`<circle cx="${e / 2}" cy="${e / 2}" r="2"></circle>`;
|
|
99
|
+
case "crosses": return p`<g transform="translate(${e / 2} ${e / 2})"><clipPath id="cross-clip"><rect class="cross-horizontal"></rect><rect class="cross-vertical"></rect></clipPath><rect class="cross" x="${-e / 2}" y="${-e / 2}" width="${e}" height="${e}" clip-path="url(#cross-clip)"></rect></g>`;
|
|
100
|
+
default: return p`<path d="M ${e} 0 H 0 V ${e}"></path>`;
|
|
101
|
+
}
|
|
100
102
|
}
|
|
103
|
+
#c;
|
|
104
|
+
#l;
|
|
101
105
|
#u(e = {}) {
|
|
106
|
+
this.#d(e) && this.requestUpdate();
|
|
107
|
+
}
|
|
108
|
+
#d(e = {}) {
|
|
102
109
|
let t = this.#i;
|
|
103
110
|
if (!t) return !1;
|
|
104
111
|
let n = t.getVisibleRect();
|
|
@@ -108,7 +115,7 @@ var h = 10, g = 64, _ = class extends u {
|
|
|
108
115
|
scale: t.scale,
|
|
109
116
|
step: this.#e,
|
|
110
117
|
targetSpacing: this.#r
|
|
111
|
-
}), i =
|
|
118
|
+
}), i = y({
|
|
112
119
|
forceCoverage: e.forceCoverage === !0,
|
|
113
120
|
interval: r,
|
|
114
121
|
previous: this.#o,
|
|
@@ -117,30 +124,33 @@ var h = 10, g = 64, _ = class extends u {
|
|
|
117
124
|
return i ? (this.#o = i, !0) : !1;
|
|
118
125
|
}
|
|
119
126
|
};
|
|
120
|
-
i([e()],
|
|
127
|
+
i([e()], v.prototype, "slot", void 0), i([e({ attribute: "aria-hidden" })], v.prototype, "accessibilityHidden", void 0), i([m({
|
|
128
|
+
type: String,
|
|
129
|
+
reflect: !0
|
|
130
|
+
})], v.prototype, "pattern", void 0), i([m({
|
|
121
131
|
type: Number,
|
|
122
132
|
reflect: !0
|
|
123
|
-
})],
|
|
133
|
+
})], v.prototype, "step", null), i([m({
|
|
124
134
|
type: Number,
|
|
125
135
|
attribute: "origin-x",
|
|
126
136
|
reflect: !0
|
|
127
|
-
})],
|
|
137
|
+
})], v.prototype, "originX", null), i([m({
|
|
128
138
|
type: Number,
|
|
129
139
|
attribute: "origin-y",
|
|
130
140
|
reflect: !0
|
|
131
|
-
})],
|
|
141
|
+
})], v.prototype, "originY", null), i([m({
|
|
132
142
|
type: Number,
|
|
133
143
|
attribute: "target-spacing",
|
|
134
144
|
reflect: !0
|
|
135
|
-
})],
|
|
136
|
-
function
|
|
145
|
+
})], v.prototype, "targetSpacing", null);
|
|
146
|
+
function y({ forceCoverage: e, interval: t, previous: n, visible: r }) {
|
|
137
147
|
let i = e || c(n?.coverage, r), a = t !== n?.interval;
|
|
138
148
|
if (!(!i && !a)) return {
|
|
139
149
|
coverage: i || !n ? s(r) : n.coverage,
|
|
140
150
|
interval: t
|
|
141
151
|
};
|
|
142
152
|
}
|
|
143
|
-
function
|
|
153
|
+
function b(e) {
|
|
144
154
|
return {
|
|
145
155
|
height: `${e.height}px`,
|
|
146
156
|
left: `${e.x}px`,
|
|
@@ -149,6 +159,6 @@ function y(e) {
|
|
|
149
159
|
};
|
|
150
160
|
}
|
|
151
161
|
//#endregion
|
|
152
|
-
export {
|
|
162
|
+
export { v as ViewportGridlines };
|
|
153
163
|
|
|
154
164
|
//# sourceMappingURL=viewport-gridlines2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewport-gridlines2.js","names":[],"sources":["../../src/viewport/viewport-gridlines.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement, nothing, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { finiteOr, hostAttr, positiveFiniteOr, useStyles } from '@nvidia-elements/core/internal';\nimport styles from './viewport-gridlines.css?inline';\nimport {\n createGridlineCoverage,\n gridlineCoverageNeedsUpdate,\n selectGridlineInterval\n} from './viewport-gridlines.utils.js';\nimport { Viewport } from './viewport.js';\nimport type { ViewportRect } from './viewport.types.js';\n\nconst DEFAULT_STEP = 10;\nconst DEFAULT_TARGET_SPACING = 64;\n\ninterface GridlineProjection {\n readonly coverage: ViewportRect;\n readonly interval: number;\n}\n\ninterface ProjectionSyncOptions {\n readonly forceCoverage?: boolean;\n readonly resetInterval?: boolean;\n}\n\n/**\n * @element nve-viewport-gridlines\n * @description Renders origin-stable, zoom-adaptive gridlines behind viewport content.\n * @documentation https://nvidia.github.io/elements/docs/elements/viewport/\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/viewport\n * @cssprop --color - Sets the gridline stroke color.\n * @cssprop --line-width - Sets the approximate stroke width in CSS pixels.\n */\nexport class ViewportGridlines extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-viewport-gridlines',\n version: '0.0.0'\n };\n\n /** @private */\n @hostAttr() slot = 'background';\n\n /** @private */\n @hostAttr({ attribute: 'aria-hidden' }) protected accessibilityHidden = 'true';\n\n #step = DEFAULT_STEP;\n #originX = 0;\n #originY = 0;\n #targetSpacing = DEFAULT_TARGET_SPACING;\n #viewport?: Viewport;\n #resizeObserver?: ResizeObserver;\n #projection?: GridlineProjection;\n\n /** Smallest gridline interval in content-space units. */\n @property({ type: Number, reflect: true })\n get step(): number {\n return this.#step;\n }\n\n set step(value: number) {\n const next = positiveFiniteOr(value, DEFAULT_STEP);\n if (next === this.#step) return;\n const previous = this.#step;\n this.#step = next;\n this.requestUpdate('step', previous);\n }\n\n /** Content-space x coordinate of the grid origin. */\n @property({ type: Number, attribute: 'origin-x', reflect: true })\n get originX(): number {\n return this.#originX;\n }\n\n set originX(value: number) {\n const next = finiteOr(value, 0);\n if (next === this.#originX) return;\n const previous = this.#originX;\n this.#originX = next;\n this.requestUpdate('originX', previous);\n }\n\n /** Content-space y coordinate of the grid origin. */\n @property({ type: Number, attribute: 'origin-y', reflect: true })\n get originY(): number {\n return this.#originY;\n }\n\n set originY(value: number) {\n const next = finiteOr(value, 0);\n if (next === this.#originY) return;\n const previous = this.#originY;\n this.#originY = next;\n this.requestUpdate('originY', previous);\n }\n\n /** Target on-screen separation used to choose the adaptive gridline interval, in CSS pixels. */\n @property({ type: Number, attribute: 'target-spacing', reflect: true })\n get targetSpacing(): number {\n return this.#targetSpacing;\n }\n\n set targetSpacing(value: number) {\n const next = positiveFiniteOr(value, DEFAULT_TARGET_SPACING);\n if (next === this.#targetSpacing) return;\n const previous = this.#targetSpacing;\n this.#targetSpacing = next;\n this.requestUpdate('targetSpacing', previous);\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n const viewport = this.parentElement;\n if (!(viewport instanceof Viewport)) return;\n this.#viewport = viewport;\n this.style.setProperty('--_scale', `${viewport.scale}`);\n this.#viewport.addEventListener('viewportchange', this.#handleViewportChange);\n if (typeof ResizeObserver !== 'undefined') {\n this.#resizeObserver = new ResizeObserver(this.#handleViewportResize);\n this.#resizeObserver.observe(viewport);\n }\n this.#updateProjection({ forceCoverage: true, resetInterval: true });\n }\n\n disconnectedCallback(): void {\n if (this.#viewport) {\n this.#viewport.removeEventListener('viewportchange', this.#handleViewportChange);\n }\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = undefined;\n this.#viewport = undefined;\n this.#projection = undefined;\n super.disconnectedCallback();\n }\n\n protected willUpdate(changed: PropertyValues<this>): void {\n super.willUpdate(changed);\n if (changed.has('step') || changed.has('targetSpacing')) {\n this.#updateProjection({ forceCoverage: true, resetInterval: true });\n }\n }\n\n render() {\n const projection = this.#projection;\n if (!projection) return nothing;\n const { coverage, interval } = projection;\n return html`\n <svg\n internal-host\n aria-hidden=\"true\"\n focusable=\"false\"\n preserveAspectRatio=\"none\"\n style=${styleMap(coverageStyles(coverage))}\n viewBox=\"${coverage.x} ${coverage.y} ${coverage.width} ${coverage.height}\"\n >\n <defs>\n <pattern\n data-gridline-pattern\n id=\"gridlines\"\n x=${this.#originX}\n y=${this.#originY}\n width=${interval}\n height=${interval}\n patternUnits=\"userSpaceOnUse\"\n >\n <path d=\"M ${interval} 0 H 0 V ${interval}\"></path>\n </pattern>\n </defs>\n <rect\n x=${coverage.x}\n y=${coverage.y}\n width=${coverage.width}\n height=${coverage.height}\n fill=\"url(#gridlines)\"\n ></rect>\n </svg>\n `;\n }\n\n #handleViewportChange = (): void => {\n const viewport = this.#viewport;\n if (!viewport) return;\n this.style.setProperty('--_scale', `${viewport.scale}`);\n this.#requestProjectionUpdate();\n };\n\n #handleViewportResize = (): void => {\n this.#requestProjectionUpdate({ forceCoverage: true });\n };\n\n #requestProjectionUpdate(options: ProjectionSyncOptions = {}): void {\n if (this.#updateProjection(options)) this.requestUpdate();\n }\n\n #updateProjection(options: ProjectionSyncOptions = {}): boolean {\n const viewport = this.#viewport;\n if (!viewport) return false;\n const visible = viewport.getVisibleRect();\n if (visible.width <= 0 || visible.height <= 0) return false;\n const interval = selectGridlineInterval({\n current: options.resetInterval ? undefined : this.#projection?.interval,\n scale: viewport.scale,\n step: this.#step,\n targetSpacing: this.#targetSpacing\n });\n const projection = nextProjection({\n forceCoverage: options.forceCoverage === true,\n interval,\n previous: this.#projection,\n visible\n });\n if (!projection) return false;\n this.#projection = projection;\n return true;\n }\n}\n\nfunction nextProjection({\n forceCoverage,\n interval,\n previous,\n visible\n}: {\n forceCoverage: boolean;\n interval: number;\n previous?: GridlineProjection;\n visible: ViewportRect;\n}): GridlineProjection | undefined {\n const coverageChanged = forceCoverage || gridlineCoverageNeedsUpdate(previous?.coverage, visible);\n const intervalChanged = interval !== previous?.interval;\n if (!coverageChanged && !intervalChanged) return undefined;\n const coverage = coverageChanged || !previous ? createGridlineCoverage(visible) : previous.coverage;\n return { coverage, interval };\n}\n\nfunction coverageStyles(coverage: ViewportRect): Record<string, string> {\n return {\n height: `${coverage.height}px`,\n left: `${coverage.x}px`,\n top: `${coverage.y}px`,\n width: `${coverage.width}px`\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"viewport-gridlines2.js","names":[],"sources":["../../src/viewport/viewport-gridlines.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement, nothing, svg, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { finiteOr, hostAttr, positiveFiniteOr, useStyles } from '@nvidia-elements/core/internal';\nimport styles from './viewport-gridlines.css?inline';\nimport {\n createGridlineCoverage,\n gridlineCoverageNeedsUpdate,\n selectGridlineInterval\n} from './viewport-gridlines.utils.js';\nimport { Viewport } from './viewport.js';\nimport type { ViewportRect } from './viewport.types.js';\n\nconst DEFAULT_STEP = 10;\nconst DEFAULT_TARGET_SPACING = 64;\n\ninterface GridlineProjection {\n readonly coverage: ViewportRect;\n readonly interval: number;\n}\n\ninterface ProjectionSyncOptions {\n readonly forceCoverage?: boolean;\n readonly resetInterval?: boolean;\n}\n\n/**\n * @element nve-viewport-gridlines\n * @description Renders origin-stable, zoom-adaptive gridline patterns behind viewport content.\n * @documentation https://nvidia.github.io/elements/docs/elements/viewport/\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/viewport\n * @cssprop --color - Sets the gridline pattern color.\n * @cssprop --line-width - Sets the approximate stroke width in CSS pixels.\n * @cssprop --dot-radius - Sets the approximate dot radius in CSS pixels.\n * @cssprop --cross-size - Sets the approximate full width and height of each cross in CSS pixels.\n */\nexport class ViewportGridlines extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-viewport-gridlines',\n version: '0.0.0'\n };\n\n /** @private */\n @hostAttr() slot = 'background';\n\n /** @private */\n @hostAttr({ attribute: 'aria-hidden' }) protected accessibilityHidden = 'true';\n\n #step = DEFAULT_STEP;\n #originX = 0;\n #originY = 0;\n #targetSpacing = DEFAULT_TARGET_SPACING;\n #viewport?: Viewport;\n #resizeObserver?: ResizeObserver;\n #projection?: GridlineProjection;\n\n /** Grid pattern to render. */\n @property({ type: String, reflect: true }) pattern: 'lines' | 'dots' | 'crosses' = 'lines';\n\n /** Smallest gridline interval in content-space units. */\n @property({ type: Number, reflect: true })\n get step(): number {\n return this.#step;\n }\n\n set step(value: number) {\n const next = positiveFiniteOr(value, DEFAULT_STEP);\n if (next === this.#step) return;\n const previous = this.#step;\n this.#step = next;\n this.requestUpdate('step', previous);\n }\n\n /** Content-space x coordinate of the grid origin. */\n @property({ type: Number, attribute: 'origin-x', reflect: true })\n get originX(): number {\n return this.#originX;\n }\n\n set originX(value: number) {\n const next = finiteOr(value, 0);\n if (next === this.#originX) return;\n const previous = this.#originX;\n this.#originX = next;\n this.requestUpdate('originX', previous);\n }\n\n /** Content-space y coordinate of the grid origin. */\n @property({ type: Number, attribute: 'origin-y', reflect: true })\n get originY(): number {\n return this.#originY;\n }\n\n set originY(value: number) {\n const next = finiteOr(value, 0);\n if (next === this.#originY) return;\n const previous = this.#originY;\n this.#originY = next;\n this.requestUpdate('originY', previous);\n }\n\n /** Target on-screen separation used to choose the adaptive gridline interval, in CSS pixels. */\n @property({ type: Number, attribute: 'target-spacing', reflect: true })\n get targetSpacing(): number {\n return this.#targetSpacing;\n }\n\n set targetSpacing(value: number) {\n const next = positiveFiniteOr(value, DEFAULT_TARGET_SPACING);\n if (next === this.#targetSpacing) return;\n const previous = this.#targetSpacing;\n this.#targetSpacing = next;\n this.requestUpdate('targetSpacing', previous);\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n const viewport = this.parentElement;\n if (!(viewport instanceof Viewport)) return;\n this.#viewport = viewport;\n this.style.setProperty('--_scale', `${viewport.scale}`);\n this.#viewport.addEventListener('viewportchange', this.#handleViewportChange);\n if (typeof ResizeObserver !== 'undefined') {\n this.#resizeObserver = new ResizeObserver(this.#handleViewportResize);\n this.#resizeObserver.observe(viewport);\n }\n this.#updateProjection({ forceCoverage: true, resetInterval: true });\n }\n\n disconnectedCallback(): void {\n if (this.#viewport) {\n this.#viewport.removeEventListener('viewportchange', this.#handleViewportChange);\n }\n this.#resizeObserver?.disconnect();\n this.#resizeObserver = undefined;\n this.#viewport = undefined;\n this.#projection = undefined;\n super.disconnectedCallback();\n }\n\n protected willUpdate(changed: PropertyValues<this>): void {\n super.willUpdate(changed);\n if (changed.has('step') || changed.has('targetSpacing')) {\n this.#updateProjection({ forceCoverage: true, resetInterval: true });\n }\n }\n\n render() {\n const projection = this.#projection;\n if (!projection) return nothing;\n const { coverage, interval } = projection;\n const centered = this.pattern === 'dots' || this.pattern === 'crosses';\n return html`\n <svg\n internal-host\n aria-hidden=\"true\"\n focusable=\"false\"\n preserveAspectRatio=\"none\"\n style=${styleMap(coverageStyles(coverage))}\n viewBox=\"${coverage.x} ${coverage.y} ${coverage.width} ${coverage.height}\"\n >\n <defs>\n <pattern\n data-gridline-pattern\n id=\"gridlines\"\n x=${this.#originX - (centered ? interval / 2 : 0)}\n y=${this.#originY - (centered ? interval / 2 : 0)}\n width=${interval}\n height=${interval}\n patternUnits=\"userSpaceOnUse\"\n >\n ${this.#renderPattern(interval)}\n </pattern>\n </defs>\n <rect\n x=${coverage.x}\n y=${coverage.y}\n width=${coverage.width}\n height=${coverage.height}\n fill=\"url(#gridlines)\"\n ></rect>\n </svg>\n `;\n }\n\n #renderPattern(interval: number) {\n switch (this.pattern) {\n case 'dots':\n return svg`<circle cx=${interval / 2} cy=${interval / 2} r=\"2\"></circle>`;\n case 'crosses':\n return svg`\n <g transform=\"translate(${interval / 2} ${interval / 2})\">\n <clipPath id=\"cross-clip\">\n <rect class=\"cross-horizontal\"></rect>\n <rect class=\"cross-vertical\"></rect>\n </clipPath>\n <rect\n class=\"cross\"\n x=${-interval / 2}\n y=${-interval / 2}\n width=${interval}\n height=${interval}\n clip-path=\"url(#cross-clip)\"\n ></rect>\n </g>\n `;\n case 'lines':\n default:\n return svg`<path d=\"M ${interval} 0 H 0 V ${interval}\"></path>`;\n }\n }\n\n #handleViewportChange = (): void => {\n const viewport = this.#viewport;\n if (!viewport) return;\n this.style.setProperty('--_scale', `${viewport.scale}`);\n this.#requestProjectionUpdate();\n };\n\n #handleViewportResize = (): void => {\n this.#requestProjectionUpdate({ forceCoverage: true });\n };\n\n #requestProjectionUpdate(options: ProjectionSyncOptions = {}): void {\n if (this.#updateProjection(options)) this.requestUpdate();\n }\n\n #updateProjection(options: ProjectionSyncOptions = {}): boolean {\n const viewport = this.#viewport;\n if (!viewport) return false;\n const visible = viewport.getVisibleRect();\n if (visible.width <= 0 || visible.height <= 0) return false;\n const interval = selectGridlineInterval({\n current: options.resetInterval ? undefined : this.#projection?.interval,\n scale: viewport.scale,\n step: this.#step,\n targetSpacing: this.#targetSpacing\n });\n const projection = nextProjection({\n forceCoverage: options.forceCoverage === true,\n interval,\n previous: this.#projection,\n visible\n });\n if (!projection) return false;\n this.#projection = projection;\n return true;\n }\n}\n\nfunction nextProjection({\n forceCoverage,\n interval,\n previous,\n visible\n}: {\n forceCoverage: boolean;\n interval: number;\n previous?: GridlineProjection;\n visible: ViewportRect;\n}): GridlineProjection | undefined {\n const coverageChanged = forceCoverage || gridlineCoverageNeedsUpdate(previous?.coverage, visible);\n const intervalChanged = interval !== previous?.interval;\n if (!coverageChanged && !intervalChanged) return undefined;\n const coverage = coverageChanged || !previous ? createGridlineCoverage(visible) : previous.coverage;\n return { coverage, interval };\n}\n\nfunction coverageStyles(coverage: ViewportRect): Record<string, string> {\n return {\n height: `${coverage.height}px`,\n left: `${coverage.x}px`,\n top: `${coverage.y}px`,\n width: `${coverage.width}px`\n };\n}\n"],"mappings":"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"}
|