@nvidia-elements/core 2.23.6 → 2.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/accordion/accordion-group.js.map +1 -1
  3. package/dist/accordion/accordion.js.map +1 -1
  4. package/dist/accordion/accordion2.js +4 -4
  5. package/dist/alert/alert-group2.js +1 -1
  6. package/dist/alert/alert2.js +1 -1
  7. package/dist/avatar/avatar-group2.js +1 -1
  8. package/dist/avatar/avatar2.js +1 -1
  9. package/dist/badge/badge2.js +1 -1
  10. package/dist/breadcrumb/breadcrumb2.js +1 -1
  11. package/dist/bundle.d.ts +2 -0
  12. package/dist/bundles/index.d.ts +323 -56
  13. package/dist/bundles/index.js +9 -9
  14. package/dist/button/button2.js +1 -1
  15. package/dist/button-group/button-group2.js +1 -1
  16. package/dist/card/card2.js +4 -4
  17. package/dist/chat-message/chat-message2.js +1 -1
  18. package/dist/checkbox/checkbox-group2.js +1 -1
  19. package/dist/checkbox/checkbox2.js +1 -1
  20. package/dist/color/color2.js +1 -1
  21. package/dist/combobox/combobox2.js +1 -1
  22. package/dist/copy-button/copy-button2.js +1 -1
  23. package/dist/custom-elements-jsx.d.ts +167 -1
  24. package/dist/custom-elements-vue.d.ts +161 -1
  25. package/dist/custom-elements.json +4211 -233
  26. package/dist/dashboard/controllers/arrangement.controller.d.ts +30 -0
  27. package/dist/dashboard/controllers/arrangement.controller.js +68 -0
  28. package/dist/dashboard/controllers/arrangement.controller.js.map +1 -0
  29. package/dist/dashboard/controllers/command.controller.d.ts +28 -0
  30. package/dist/dashboard/controllers/command.controller.js +69 -0
  31. package/dist/dashboard/controllers/command.controller.js.map +1 -0
  32. package/dist/dashboard/controllers/composition.controller.d.ts +61 -0
  33. package/dist/dashboard/controllers/composition.controller.js +285 -0
  34. package/dist/dashboard/controllers/composition.controller.js.map +1 -0
  35. package/dist/dashboard/controllers/fullscreen.controller.d.ts +23 -0
  36. package/dist/dashboard/controllers/fullscreen.controller.js +46 -0
  37. package/dist/dashboard/controllers/fullscreen.controller.js.map +1 -0
  38. package/dist/dashboard/controllers/interaction.controller.d.ts +53 -0
  39. package/dist/dashboard/controllers/interaction.controller.js +407 -0
  40. package/dist/dashboard/controllers/interaction.controller.js.map +1 -0
  41. package/dist/dashboard/controllers/measurement.controller.d.ts +28 -0
  42. package/dist/dashboard/controllers/measurement.controller.js +77 -0
  43. package/dist/dashboard/controllers/measurement.controller.js.map +1 -0
  44. package/dist/dashboard/dashboard.d.ts +83 -0
  45. package/dist/dashboard/dashboard.examples.js +5 -0
  46. package/dist/dashboard/dashboard.examples.js.map +1 -0
  47. package/dist/dashboard/dashboard.examples.json +138 -0
  48. package/dist/dashboard/dashboard.js +5 -0
  49. package/dist/dashboard/dashboard.js.map +1 -0
  50. package/dist/dashboard/dashboard.types.d.ts +33 -0
  51. package/dist/dashboard/dashboard2.js +352 -0
  52. package/dist/dashboard/dashboard2.js.map +1 -0
  53. package/dist/dashboard/define.d.ts +10 -0
  54. package/dist/dashboard/define.js +9 -0
  55. package/dist/dashboard/define.js.map +1 -0
  56. package/dist/dashboard/index.d.ts +8 -0
  57. package/dist/dashboard/index.js +6 -0
  58. package/dist/dashboard/panel/panel.d.ts +88 -0
  59. package/dist/dashboard/panel/panel.js +5 -0
  60. package/dist/dashboard/panel/panel.js.map +1 -0
  61. package/dist/dashboard/panel/panel2.js +110 -0
  62. package/dist/dashboard/panel/panel2.js.map +1 -0
  63. package/dist/dashboard/panel-content/panel-content.d.ts +20 -0
  64. package/dist/dashboard/panel-content/panel-content.js +5 -0
  65. package/dist/dashboard/panel-content/panel-content.js.map +1 -0
  66. package/dist/dashboard/panel-content/panel-content2.js +22 -0
  67. package/dist/dashboard/panel-content/panel-content2.js.map +1 -0
  68. package/dist/dashboard/panel-footer/panel-footer.d.ts +25 -0
  69. package/dist/dashboard/panel-footer/panel-footer.js +5 -0
  70. package/dist/dashboard/panel-footer/panel-footer.js.map +1 -0
  71. package/dist/dashboard/panel-footer/panel-footer2.js +28 -0
  72. package/dist/dashboard/panel-footer/panel-footer2.js.map +1 -0
  73. package/dist/dashboard/panel-header/panel-header.d.ts +27 -0
  74. package/dist/dashboard/panel-header/panel-header.js +5 -0
  75. package/dist/dashboard/panel-header/panel-header.js.map +1 -0
  76. package/dist/dashboard/panel-header/panel-header2.js +28 -0
  77. package/dist/dashboard/panel-header/panel-header2.js.map +1 -0
  78. package/dist/dashboard/utils/action.utils.d.ts +17 -0
  79. package/dist/dashboard/utils/action.utils.js +144 -0
  80. package/dist/dashboard/utils/action.utils.js.map +1 -0
  81. package/dist/dashboard/utils/geometry.utils.d.ts +110 -0
  82. package/dist/dashboard/utils/geometry.utils.js +208 -0
  83. package/dist/dashboard/utils/geometry.utils.js.map +1 -0
  84. package/dist/dashboard/utils/intent.types.d.ts +67 -0
  85. package/dist/dashboard/utils/layout.utils.d.ts +20 -0
  86. package/dist/dashboard/utils/layout.utils.js +224 -0
  87. package/dist/dashboard/utils/layout.utils.js.map +1 -0
  88. package/dist/dashboard/utils/movement.utils.d.ts +7 -0
  89. package/dist/dashboard/utils/movement.utils.js +15 -0
  90. package/dist/dashboard/utils/movement.utils.js.map +1 -0
  91. package/dist/dashboard/utils/mutation.utils.d.ts +2 -0
  92. package/dist/dashboard/utils/mutation.utils.js +19 -0
  93. package/dist/dashboard/utils/mutation.utils.js.map +1 -0
  94. package/dist/dashboard/utils/packing.utils.d.ts +13 -0
  95. package/dist/dashboard/utils/packing.utils.js +421 -0
  96. package/dist/dashboard/utils/packing.utils.js.map +1 -0
  97. package/dist/data.html.json +141 -1
  98. package/dist/date/date2.js +1 -1
  99. package/dist/datetime/datetime2.js +1 -1
  100. package/dist/dialog/dialog-footer2.js +1 -1
  101. package/dist/dialog/dialog-header2.js +1 -1
  102. package/dist/dialog/dialog2.js +1 -1
  103. package/dist/divider/divider2.js +1 -1
  104. package/dist/dot/dot2.js +1 -1
  105. package/dist/drag-handle/drag-handle2.js +1 -1
  106. package/dist/drawer/drawer-content2.js +1 -1
  107. package/dist/drawer/drawer-footer2.js +1 -1
  108. package/dist/drawer/drawer-header2.js +1 -1
  109. package/dist/drawer/drawer2.js +1 -1
  110. package/dist/dropdown/dropdown-footer2.js +1 -1
  111. package/dist/dropdown/dropdown-header2.js +1 -1
  112. package/dist/dropdown/dropdown.examples.js.map +1 -1
  113. package/dist/dropdown/dropdown2.js +1 -1
  114. package/dist/dropdown-group/dropdown-group.js +1 -1
  115. package/dist/dropzone/dropzone2.js +1 -1
  116. package/dist/file/file2.js +1 -1
  117. package/dist/format-bytes/format-bytes2.js +1 -1
  118. package/dist/format-datetime/format-datetime2.js +1 -1
  119. package/dist/format-number/format-number2.js +1 -1
  120. package/dist/format-relative-time/format-relative-time2.js +1 -1
  121. package/dist/format-truncate/format-truncate2.js +1 -1
  122. package/dist/forms/control/control2.js +1 -1
  123. package/dist/forms/control-group/control-group2.js +1 -1
  124. package/dist/forms/control-message/control-message2.js +1 -1
  125. package/dist/gauge/gauge2.js +1 -1
  126. package/dist/ghost/ghost2.js +1 -1
  127. package/dist/grid/cell/cell2.js +1 -1
  128. package/dist/grid/column/column2.js +1 -1
  129. package/dist/grid/footer/footer2.js +1 -1
  130. package/dist/grid/grid.js.map +1 -1
  131. package/dist/grid/grid2.js +1 -1
  132. package/dist/grid/header/header2.js +1 -1
  133. package/dist/grid/placeholder/placeholder2.js +1 -1
  134. package/dist/grid/row/row2.js +1 -1
  135. package/dist/icon/icon2.js +1 -1
  136. package/dist/icon-button/icon-button2.js +1 -1
  137. package/dist/iframe/iframe2.js +1 -1
  138. package/dist/index.js +1 -1
  139. package/dist/input/input-group2.js +1 -1
  140. package/dist/input/input2.js +1 -1
  141. package/dist/internal/controllers/native-fullscreen.controller.d.ts +13 -0
  142. package/dist/internal/controllers/native-fullscreen.controller.js +73 -0
  143. package/dist/internal/controllers/native-fullscreen.controller.js.map +1 -0
  144. package/dist/internal/index.d.ts +1 -0
  145. package/dist/internal/index.js +59 -57
  146. package/dist/internal/index.js.map +1 -1
  147. package/dist/joystick/joystick2.js +1 -1
  148. package/dist/logo/logo2.js +1 -1
  149. package/dist/menu/menu-group2.js +1 -1
  150. package/dist/menu/menu-item2.js +1 -1
  151. package/dist/menu/menu2.js +1 -1
  152. package/dist/month/month2.js +1 -1
  153. package/dist/notification/notification-group2.js +1 -1
  154. package/dist/notification/notification2.js +1 -1
  155. package/dist/page/page-panel/page-panel-content2.js +1 -1
  156. package/dist/page/page-panel/page-panel-footer2.js +1 -1
  157. package/dist/page/page-panel/page-panel-header2.js +1 -1
  158. package/dist/page/page-panel/page-panel2.js +1 -1
  159. package/dist/page/page2.js +1 -1
  160. package/dist/page-header/page-header2.js +1 -1
  161. package/dist/page-loader/page-loader2.js +1 -1
  162. package/dist/pagination/pagination2.js +1 -1
  163. package/dist/panel/panel2.js +4 -4
  164. package/dist/password/password2.js +1 -1
  165. package/dist/preferences-input/preferences-input2.js +1 -1
  166. package/dist/progress-bar/progress-bar2.js +1 -1
  167. package/dist/progress-dot/progress-dot2.js +1 -1
  168. package/dist/progress-ring/progress-ring2.js +1 -1
  169. package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
  170. package/dist/pulse/pulse2.js +1 -1
  171. package/dist/radio/radio-group2.js +1 -1
  172. package/dist/radio/radio2.js +1 -1
  173. package/dist/range/range2.js +1 -1
  174. package/dist/resize-handle/resize-handle2.js +1 -1
  175. package/dist/search/search2.js +1 -1
  176. package/dist/select/select2.js +1 -1
  177. package/dist/skeleton/skeleton2.js +1 -1
  178. package/dist/sort-button/sort-button2.js +1 -1
  179. package/dist/sparkline/sparkline2.js +1 -1
  180. package/dist/star-rating/star-rating2.js +1 -1
  181. package/dist/steps/steps2.js +2 -2
  182. package/dist/switch/switch-group2.js +1 -1
  183. package/dist/switch/switch2.js +1 -1
  184. package/dist/tabs/tabs-group2.js +1 -1
  185. package/dist/tabs/tabs-item-group2.js +1 -1
  186. package/dist/tabs/tabs2.js +2 -2
  187. package/dist/tag/tag2.js +1 -1
  188. package/dist/textarea/textarea2.js +1 -1
  189. package/dist/time/time2.js +1 -1
  190. package/dist/toast/toast2.js +1 -1
  191. package/dist/toggletip/toggletip-footer2.js +1 -1
  192. package/dist/toggletip/toggletip-header2.js +1 -1
  193. package/dist/toggletip/toggletip2.js +1 -1
  194. package/dist/toolbar/toolbar2.js +1 -1
  195. package/dist/tooltip/tooltip2.js +1 -1
  196. package/dist/tree/tree-node2.js +1 -1
  197. package/dist/tree/tree2.js +1 -1
  198. package/dist/week/week2.js +1 -1
  199. package/dist/workspace/controllers/workspace-fullscreen.controller.d.ts +2 -4
  200. package/dist/workspace/controllers/workspace-fullscreen.controller.js +17 -47
  201. package/dist/workspace/controllers/workspace-fullscreen.controller.js.map +1 -1
  202. package/dist/workspace/panel/panel2.js +1 -1
  203. package/dist/workspace/panel-content/panel-content2.js +1 -1
  204. package/dist/workspace/panel-footer/panel-footer2.js +1 -1
  205. package/dist/workspace/panel-header/panel-header2.js +1 -1
  206. package/dist/workspace/workspace.js.map +1 -1
  207. package/dist/workspace/workspace2.js +1 -1
  208. package/package.json +16 -4
@@ -0,0 +1,138 @@
1
+ {
2
+ "element": "nve-dashboard",
3
+ "entrypoint": "@nvidia-elements/core/dashboard/dashboard.examples.json",
4
+ "items": [
5
+ {
6
+ "id": "dashboard",
7
+ "name": "Default",
8
+ "template": "<div id=\"default-dashboard-example\" nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:wrap\">\n <nve-button id=\"reset-default-layout\">Reset layout</nve-button>\n </div>\n <nve-dashboard\n id=\"default-dashboard\"\n rearrangeable\n style=\"height: 600px; --row-size: 90px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"hero-baseline\",\"column\":0,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"hero-candidate\",\"column\":3,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"hero-changes\",\"column\":0,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"hero-evidence\",\"column\":3,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"hero-notes\",\"column\":0,\"row\":4,\"columnSpan\":6,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"hero-baseline\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Baseline</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"hero-candidate\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"hero-changes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Changes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Comparison</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"hero-evidence\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Evidence</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Test cases</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"hero-notes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Notes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n </nve-dashboard>\n <script type=\"module\">\n const example = document.querySelector(\"#default-dashboard-example\");\n const dashboard = example.querySelector(\"nve-dashboard\");\n const reset = example.querySelector(\"#reset-default-layout\");\n const initialValue = dashboard.getAttribute(\"value\");\n reset.addEventListener(\"click\", () => {\n dashboard.value = initialValue;\n });\n </script>\n</div>\n",
9
+ "summary": "Arrange panels on a grid while retaining application content.",
10
+ "description": "",
11
+ "composition": true,
12
+ "tags": []
13
+ },
14
+ {
15
+ "id": "dashboard-rearrangeable",
16
+ "name": "Rearrangeable",
17
+ "template": "<div id=\"rearrangeable-dashboard-example\" nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:wrap\">\n <nve-button id=\"reset-rearrangeable-layout\">Reset layout</nve-button>\n <nve-switch id=\"toggle-rearrangeable\">\n <label>Rearrangeable</label>\n <input type=\"checkbox\" checked />\n </nve-switch>\n </div>\n <nve-dashboard\n id=\"rearrangeable-dashboard\"\n rearrangeable\n style=\"height: 600px; --row-size: 90px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"rearrangeable-baseline\",\"column\":0,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"rearrangeable-candidate\",\"column\":3,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"rearrangeable-changes\",\"column\":0,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"rearrangeable-evidence\",\"column\":3,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"rearrangeable-notes\",\"column\":0,\"row\":4,\"columnSpan\":6,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"rearrangeable-baseline\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Baseline</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"rearrangeable-candidate\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"rearrangeable-changes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Changes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Comparison</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"rearrangeable-evidence\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Evidence</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Test cases</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"rearrangeable-notes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Notes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n </nve-dashboard>\n <script type=\"module\">\n const example = document.querySelector(\"#rearrangeable-dashboard-example\");\n const dashboard = example.querySelector(\"nve-dashboard\");\n const toggle = example.querySelector(\"#toggle-rearrangeable input\");\n const initialValue = dashboard.getAttribute(\"value\");\n toggle.addEventListener(\"change\", () => {\n dashboard.rearrangeable = toggle.checked;\n });\n example.querySelector(\"#reset-rearrangeable-layout\").addEventListener(\"click\", () => {\n dashboard.value = initialValue;\n });\n </script>\n</div>\n",
18
+ "summary": "Rearrange and resize panels while retaining application content.",
19
+ "description": "",
20
+ "composition": true,
21
+ "tags": []
22
+ },
23
+ {
24
+ "id": "dashboard-flow",
25
+ "name": "Flow",
26
+ "template": "<div id=\"flow-example\" nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:vertical-center align:wrap\">\n <nve-button id=\"reset-flow-layout\">Reset layout</nve-button>\n <nve-select layout=\"horizontal-inline\" fit-content>\n <label>Flow</label>\n <select id=\"flow-mode\">\n <option value=\"vertical\" selected>Vertical</option>\n <option value=\"horizontal\">Horizontal</option>\n </select>\n </nve-select>\n </div>\n <nve-dashboard\n id=\"flow-dashboard\"\n rearrangeable\n style=\"height: 600px; --row-size: 90px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"flow-baseline\",\"column\":0,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"flow-candidate\",\"column\":3,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"flow-changes\",\"column\":0,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"flow-evidence\",\"column\":3,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"flow-notes\",\"column\":0,\"row\":4,\"columnSpan\":6,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"flow-baseline\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Baseline</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"flow-candidate\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"flow-changes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Changes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Comparison</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"flow-evidence\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Evidence</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Test cases</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"flow-notes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Notes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n </nve-dashboard>\n <script type=\"module\">\n const example = document.querySelector(\"#flow-example\");\n const dashboard = example.querySelector(\"nve-dashboard\");\n const select = example.querySelector(\"#flow-mode\");\n const initialLayout = JSON.parse(dashboard.getAttribute(\"value\"));\n // Transpose the cells, keeping application content in the same panels.\n function transposeForFlow(layout, flow) {\n if (layout.grid.flow === flow) return layout;\n return {\n ...layout,\n grid: { ...layout.grid, flow },\n items: layout.items.map((item) => ({\n ...item,\n column: item.row,\n row: item.column,\n columnSpan: item.rowSpan,\n rowSpan: item.columnSpan,\n })),\n };\n }\n select.addEventListener(\"change\", () => {\n const layout = JSON.parse(dashboard.value);\n dashboard.value = JSON.stringify(transposeForFlow(layout, select.value));\n });\n example.querySelector(\"#reset-flow-layout\").addEventListener(\"click\", () => {\n dashboard.value = JSON.stringify(transposeForFlow(initialLayout, select.value));\n });\n </script>\n</div>\n",
27
+ "summary": "Grow vertically within bounded columns or horizontally within bounded rows.",
28
+ "description": "",
29
+ "composition": true,
30
+ "tags": []
31
+ },
32
+ {
33
+ "id": "dashboard-sizing",
34
+ "name": "Sizing",
35
+ "template": "<div id=\"sizing-dashboard-example\" nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:vertical-center align:wrap\">\n <nve-button id=\"reset-sizing-layout\">Reset layout</nve-button>\n <div nve-layout=\"row gap:md align:vertical-center align:wrap\">\n <nve-select layout=\"horizontal-inline\" fit-content>\n <label>Sizing</label>\n <select id=\"sizing-mode\">\n <option value=\"fit\" selected>Fit</option>\n <option value=\"fixed\">Fixed</option>\n </select>\n </nve-select>\n <nve-range layout=\"horizontal-inline\" fit-content style=\"width: auto\">\n <label>Viewport width: <output for=\"sizing-width\">100</output>%</label>\n <input id=\"sizing-width\" type=\"range\" min=\"50\" max=\"100\" value=\"100\" />\n </nve-range>\n </div>\n </div>\n <div id=\"sizing-viewport\" style=\"width: 100%\">\n <nve-dashboard\n id=\"sizing-dashboard\"\n rearrangeable\n style=\"height: 600px; --row-size: 90px; --column-size: 140px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"sizing-baseline\",\"column\":0,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"sizing-candidate\",\"column\":3,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"sizing-changes\",\"column\":0,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"sizing-evidence\",\"column\":3,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"sizing-notes\",\"column\":0,\"row\":4,\"columnSpan\":6,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"sizing-baseline\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Baseline</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"sizing-candidate\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"sizing-changes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Changes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Comparison</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"sizing-evidence\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Evidence</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Test cases</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"sizing-notes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Notes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n </nve-dashboard>\n </div>\n <script type=\"module\">\n const example = document.querySelector(\"#sizing-dashboard-example\");\n const dashboard = example.querySelector(\"nve-dashboard\");\n const viewport = example.querySelector(\"#sizing-viewport\");\n const select = example.querySelector(\"#sizing-mode\");\n const range = example.querySelector(\"#sizing-width\");\n const output = example.querySelector(\"output\");\n const initialValue = dashboard.getAttribute(\"value\");\n select.addEventListener(\"change\", () => {\n dashboard.sizing = select.value;\n });\n range.addEventListener(\"input\", () => {\n viewport.style.width = range.value + \"%\";\n output.value = range.value;\n });\n example.querySelector(\"#reset-sizing-layout\").addEventListener(\"click\", () => {\n dashboard.value = initialValue;\n });\n </script>\n</div>\n",
36
+ "summary": "Compare tracks fitted to the viewport with fixed CSS cell dimensions.",
37
+ "description": "",
38
+ "composition": true,
39
+ "tags": []
40
+ },
41
+ {
42
+ "id": "dashboard-guides",
43
+ "name": "Guides",
44
+ "template": "<div id=\"guides-example\" nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:vertical-center align:wrap\">\n <nve-button id=\"reset-guides-layout\">Reset layout</nve-button>\n <nve-select layout=\"horizontal-inline\" fit-content>\n <label>Guides</label>\n <select id=\"guides-mode\">\n <option value=\"auto\">Auto</option>\n <option value=\"visible\" selected>Visible</option>\n <option value=\"hidden\">Hidden</option>\n </select>\n </nve-select>\n </div>\n <nve-dashboard\n id=\"guided-dashboard\"\n guides=\"visible\"\n rearrangeable\n style=\"height: 702px; --row-size: 90px; --guide-size: var(--nve-ref-size-200)\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"guided-baseline\",\"column\":0,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"guided-candidate\",\"column\":3,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"guided-changes\",\"column\":0,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"guided-evidence\",\"column\":3,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"guided-notes\",\"column\":0,\"row\":4,\"columnSpan\":6,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"guided-baseline\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Baseline</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"guided-candidate\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"guided-changes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Changes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Comparison</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"guided-evidence\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Evidence</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Test cases</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"guided-notes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Notes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n </nve-dashboard>\n <script type=\"module\">\n const example = document.querySelector(\"#guides-example\");\n const dashboard = example.querySelector(\"nve-dashboard\");\n const select = example.querySelector(\"#guides-mode\");\n const initialValue = dashboard.getAttribute(\"value\");\n select.addEventListener(\"change\", () => {\n dashboard.guides = select.value;\n });\n example.querySelector(\"#reset-guides-layout\").addEventListener(\"click\", () => {\n dashboard.value = initialValue;\n });\n </script>\n</div>\n",
45
+ "summary": "Choose when to show the grid guides.",
46
+ "description": "",
47
+ "composition": true,
48
+ "tags": []
49
+ },
50
+ {
51
+ "id": "dashboard-auto-settle",
52
+ "name": "AutoSettle",
53
+ "template": "<div id=\"auto-settle-example\" nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:vertical-center align:wrap\">\n <nve-button id=\"reset-settle-layout\">Reset layout</nve-button>\n <nve-switch id=\"toggle-auto-settle\">\n <label>Auto Settle</label>\n <input type=\"checkbox\" />\n </nve-switch>\n </div>\n <nve-dashboard\n id=\"settle-dashboard\"\n guides=\"visible\"\n rearrangeable\n style=\"height: 702px; --row-size: 90px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"settle-baseline\",\"column\":0,\"row\":1,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"settle-candidate\",\"column\":3,\"row\":1,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"settle-changes\",\"column\":0,\"row\":3,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"settle-evidence\",\"column\":3,\"row\":3,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"settle-notes\",\"column\":0,\"row\":5,\"columnSpan\":6,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"settle-baseline\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Baseline</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"settle-candidate\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"settle-changes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Changes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Comparison</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"settle-evidence\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Evidence</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Test cases</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"settle-notes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Notes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n </nve-dashboard>\n <script type=\"module\">\n const example = document.querySelector(\"#auto-settle-example\");\n const dashboard = example.querySelector(\"nve-dashboard\");\n const toggle = example.querySelector(\"#toggle-auto-settle input\");\n const initialValue = dashboard.getAttribute(\"value\");\n toggle.addEventListener(\"change\", () => {\n dashboard.autoSettle = toggle.checked;\n });\n example.querySelector(\"#reset-settle-layout\").addEventListener(\"click\", () => {\n dashboard.autoSettle = false;\n toggle.checked = false;\n dashboard.value = initialValue;\n });\n </script>\n</div>\n",
54
+ "summary": "Automatically close gaps along the growth axis.",
55
+ "description": "",
56
+ "composition": true,
57
+ "tags": []
58
+ },
59
+ {
60
+ "id": "dashboard-fullscreenable",
61
+ "name": "Fullscreenable",
62
+ "template": "<div id=\"fullscreen-dashboard-example\" nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:wrap\">\n <nve-button id=\"reset-fullscreen-layout\">Reset layout</nve-button>\n <nve-switch id=\"toggle-fullscreenable\">\n <label>Fullscreenable</label>\n <input type=\"checkbox\" checked />\n </nve-switch>\n </div>\n <nve-dashboard\n id=\"fullscreen-dashboard\"\n fullscreenable\n rearrangeable\n style=\"height: 600px; --row-size: 90px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"fullscreen-baseline\",\"column\":0,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"fullscreen-candidate\",\"column\":3,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"fullscreen-changes\",\"column\":0,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"fullscreen-evidence\",\"column\":3,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"fullscreen-notes\",\"column\":0,\"row\":4,\"columnSpan\":6,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"fullscreen-baseline\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Baseline</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"fullscreen-candidate\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"fullscreen-changes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Changes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Comparison</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"fullscreen-evidence\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Evidence</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Test cases</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"fullscreen-notes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Notes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n </nve-dashboard>\n <script type=\"module\">\n const example = document.querySelector(\"#fullscreen-dashboard-example\");\n const dashboard = example.querySelector(\"nve-dashboard\");\n const toggle = example.querySelector(\"#toggle-fullscreenable input\");\n const initialValue = dashboard.getAttribute(\"value\");\n toggle.addEventListener(\"change\", () => {\n dashboard.fullscreenable = toggle.checked;\n });\n example.querySelector(\"#reset-fullscreen-layout\").addEventListener(\"click\", () => {\n dashboard.value = initialValue;\n });\n </script>\n</div>\n",
63
+ "summary": "Present one panel in native fullscreen without changing the saved arrangement.",
64
+ "description": "",
65
+ "composition": true,
66
+ "tags": []
67
+ },
68
+ {
69
+ "id": "dashboard-custom-panel-actions",
70
+ "name": "CustomPanelActions",
71
+ "template": "<nve-dashboard\n id=\"actions-dashboard\"\n rearrangeable\n style=\"height: 600px; --row-size: 90px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"actions-baseline\",\"column\":0,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"actions-candidate\",\"column\":3,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"actions-changes\",\"column\":0,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"actions-evidence\",\"column\":3,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"actions-notes\",\"column\":0,\"row\":4,\"columnSpan\":6,\"rowSpan\":2}]}'\n>\n <nve-dashboard-panel id=\"actions-baseline\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>\n Baseline\n <nve-icon-button slot=\"suffix\" icon-name=\"more-actions\" container=\"flat\" size=\"sm\" aria-label=\"Baseline actions\" value=\"actions-baseline\" popovertarget=\"dashboard-actions-menu\"></nve-icon-button>\n </nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"actions-candidate\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>\n Candidate\n <nve-icon-button slot=\"suffix\" icon-name=\"more-actions\" container=\"flat\" size=\"sm\" aria-label=\"Candidate actions\" value=\"actions-candidate\" popovertarget=\"dashboard-actions-menu\"></nve-icon-button>\n </nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"actions-changes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>\n Changes\n <nve-icon-button slot=\"suffix\" icon-name=\"more-actions\" container=\"flat\" size=\"sm\" aria-label=\"Changes actions\" value=\"actions-changes\" popovertarget=\"dashboard-actions-menu\"></nve-icon-button>\n </nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Comparison</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"actions-evidence\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>\n Evidence\n <nve-icon-button slot=\"suffix\" icon-name=\"more-actions\" container=\"flat\" size=\"sm\" aria-label=\"Evidence actions\" value=\"actions-evidence\" popovertarget=\"dashboard-actions-menu\"></nve-icon-button>\n </nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Test cases</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"actions-notes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>\n Notes\n <nve-icon-button slot=\"suffix\" icon-name=\"more-actions\" container=\"flat\" size=\"sm\" aria-label=\"Notes actions\" value=\"actions-notes\" popovertarget=\"dashboard-actions-menu\"></nve-icon-button>\n </nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dropdown-group>\n <nve-dropdown id=\"dashboard-actions-menu\">\n <nve-menu>\n <nve-menu-item popovertarget=\"dashboard-move-menu\">\n Move\n <nve-icon name=\"caret\" direction=\"right\" size=\"sm\" slot=\"suffix\"></nve-icon>\n </nve-menu-item>\n <nve-menu-item popovertarget=\"dashboard-shrink-menu\">\n Shrink\n <nve-icon name=\"caret\" direction=\"right\" size=\"sm\" slot=\"suffix\"></nve-icon>\n </nve-menu-item>\n <nve-menu-item popovertarget=\"dashboard-grow-menu\">\n Grow\n <nve-icon name=\"caret\" direction=\"right\" size=\"sm\" slot=\"suffix\"></nve-icon>\n </nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n <nve-dropdown id=\"dashboard-move-menu\" position=\"right\">\n <nve-menu>\n <nve-menu-item commandfor=\"actions-dashboard\" command=\"--move-to-start\">To start</nve-menu-item>\n <nve-menu-item commandfor=\"actions-dashboard\" command=\"--move-left\">Left</nve-menu-item>\n <nve-menu-item commandfor=\"actions-dashboard\" command=\"--move-right\">Right</nve-menu-item>\n <nve-menu-item commandfor=\"actions-dashboard\" command=\"--move-up\">Up</nve-menu-item>\n <nve-menu-item commandfor=\"actions-dashboard\" command=\"--move-down\">Down</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n <nve-dropdown id=\"dashboard-shrink-menu\" position=\"right\">\n <nve-menu>\n <nve-menu-item commandfor=\"actions-dashboard\" command=\"--decrease-width\">Width</nve-menu-item>\n <nve-menu-item commandfor=\"actions-dashboard\" command=\"--decrease-height\">Height</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n <nve-dropdown id=\"dashboard-grow-menu\" position=\"right\">\n <nve-menu>\n <nve-menu-item commandfor=\"actions-dashboard\" command=\"--increase-width\">Width</nve-menu-item>\n <nve-menu-item commandfor=\"actions-dashboard\" command=\"--increase-height\">Height</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n </nve-dropdown-group>\n <script type=\"module\">\n const dashboard = document.querySelector(\"#actions-dashboard\");\n const dropdownGroup = dashboard.querySelector(\"nve-dropdown-group\");\n let panelId = \"actions-baseline\";\n function refresh() {\n for (const item of dropdownGroup.querySelectorAll(\"[command]\")) {\n item.value = panelId;\n item.disabled = !dashboard.isCommandAvailable(item.command, { value: panelId });\n }\n for (const trigger of dropdownGroup.querySelectorAll(\"[popovertarget]\")) {\n const items = trigger.popoverTargetElement.querySelectorAll(\"[command]\");\n trigger.disabled = [...items].every((item) => item.disabled);\n }\n }\n dropdownGroup.addEventListener(\n \"beforetoggle\",\n (event) => {\n if (event.newState !== \"open\") return;\n if (event.target.id === \"dashboard-actions-menu\") panelId = event.source?.value ?? panelId;\n refresh();\n },\n true,\n );\n dashboard.addEventListener(\"commandavailabilitychange\", refresh);\n dashboard.addEventListener(\"change\", (event) => {\n if (event.target === dashboard) dropdownGroup.close();\n });\n refresh();\n </script>\n</nve-dashboard>\n",
72
+ "summary": "Add custom menus that use invoker commands to move and resize panels.",
73
+ "description": "",
74
+ "composition": true,
75
+ "tags": []
76
+ },
77
+ {
78
+ "id": "dashboard-dynamic-panels",
79
+ "name": "DynamicPanels",
80
+ "template": "<div id=\"dynamic-panels-example\" nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:wrap\">\n <nve-button id=\"reset-dynamic-layout\">Reset layout</nve-button>\n <div nve-layout=\"row gap:sm\">\n <nve-button id=\"add-dynamic-notes\">Add Notes</nve-button>\n <nve-button id=\"remove-dynamic-notes\" disabled>Remove Notes</nve-button>\n </div>\n </div>\n <nve-dashboard\n id=\"dynamic-dashboard\"\n rearrangeable\n style=\"height: 400px; --row-size: 90px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"dynamic-baseline\",\"column\":0,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"dynamic-candidate\",\"column\":3,\"row\":0,\"columnSpan\":3,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"dynamic-baseline\" min-column-span=\"3\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Baseline</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"dynamic-candidate\" min-column-span=\"3\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n </nve-dashboard>\n <template id=\"dynamic-notes-template\">\n <nve-dashboard-panel id=\"dynamic-notes\" min-column-span=\"3\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Notes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n </template>\n <script type=\"module\">\n const example = document.querySelector(\"#dynamic-panels-example\");\n const dashboard = example.querySelector(\"nve-dashboard\");\n const add = example.querySelector(\"#add-dynamic-notes\");\n const remove = example.querySelector(\"#remove-dynamic-notes\");\n const notes = example.querySelector(\"#dynamic-notes-template\").content.firstElementChild;\n const initialValue = dashboard.getAttribute(\"value\");\n\n add.addEventListener(\"click\", () => {\n dashboard.append(notes);\n add.disabled = true;\n remove.disabled = false;\n });\n\n remove.addEventListener(\"click\", () => {\n notes.remove();\n add.disabled = false;\n remove.disabled = true;\n });\n\n example.querySelector(\"#reset-dynamic-layout\").addEventListener(\"click\", () => {\n dashboard.value = initialValue;\n });\n </script>\n</div>\n",
81
+ "summary": "Add and remove panels through the DOM while preserving application content.",
82
+ "description": "",
83
+ "composition": true,
84
+ "tags": []
85
+ },
86
+ {
87
+ "id": "dashboard-save-restore",
88
+ "name": "SaveRestore",
89
+ "template": "<div nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:wrap\">\n <nve-button id=\"reset-layout\">Reset layout</nve-button>\n <div nve-layout=\"row gap:sm\">\n <nve-button id=\"save-layout\">Save layout</nve-button>\n <nve-button id=\"restore-layout\">Restore layout</nve-button>\n </div>\n </div>\n <nve-dashboard\n id=\"saved-layout\"\n rearrangeable\n style=\"height: 600px; --row-size: 90px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"saved-baseline\",\"column\":0,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"saved-candidate\",\"column\":3,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"saved-changes\",\"column\":0,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"saved-evidence\",\"column\":3,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"saved-notes\",\"column\":0,\"row\":4,\"columnSpan\":6,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"saved-baseline\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Baseline</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"saved-candidate\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"saved-changes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Changes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Comparison</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"saved-evidence\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Evidence</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Test cases</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"saved-notes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Notes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n </nve-dashboard>\n <script type=\"module\">\n const dashboard = document.querySelector(\"#saved-layout\");\n const save = document.querySelector(\"#save-layout\");\n const restore = document.querySelector(\"#restore-layout\");\n const reset = document.querySelector(\"#reset-layout\");\n const initialValue = dashboard.getAttribute(\"value\");\n let savedValue = initialValue;\n save.addEventListener(\"click\", () => {\n savedValue = dashboard.value;\n });\n restore.addEventListener(\"click\", () => {\n dashboard.value = savedValue;\n });\n reset.addEventListener(\"click\", () => {\n dashboard.value = initialValue;\n });\n </script>\n</div>\n",
90
+ "summary": "Save and restore panel placement without recreating application content.",
91
+ "description": "",
92
+ "composition": true,
93
+ "tags": []
94
+ },
95
+ {
96
+ "id": "dashboard-container",
97
+ "name": "Container",
98
+ "template": "<div nve-layout=\"column gap:md\">\n <nve-dashboard\n container=\"inset\"\n rearrangeable\n style=\"height: 260px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":2},\"items\":[{\"id\":\"inset-baseline\",\"column\":0,\"row\":0,\"columnSpan\":1,\"rowSpan\":2},{\"id\":\"inset-candidate\",\"column\":1,\"row\":0,\"columnSpan\":1,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"inset-baseline\"\n ><nve-dashboard-panel-header>Baseline (inset)</nve-dashboard-panel-header><nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content\n ><nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer></nve-dashboard-panel\n >\n <nve-dashboard-panel id=\"inset-candidate\"\n ><nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header><nve-dashboard-panel-content>Current run</nve-dashboard-panel-content\n ><nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer></nve-dashboard-panel\n >\n </nve-dashboard>\n <nve-dashboard\n container=\"flat\"\n rearrangeable\n style=\"height: 260px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":2},\"items\":[{\"id\":\"flat-baseline\",\"column\":0,\"row\":0,\"columnSpan\":1,\"rowSpan\":2},{\"id\":\"flat-candidate\",\"column\":1,\"row\":0,\"columnSpan\":1,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"flat-baseline\"\n ><nve-dashboard-panel-header>Baseline (flat)</nve-dashboard-panel-header><nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content\n ><nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer></nve-dashboard-panel\n >\n <nve-dashboard-panel id=\"flat-candidate\"\n ><nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header><nve-dashboard-panel-content>Current run</nve-dashboard-panel-content\n ><nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer></nve-dashboard-panel\n >\n </nve-dashboard>\n <nve-dashboard\n container=\"full\"\n rearrangeable\n style=\"height: 260px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":2},\"items\":[{\"id\":\"full-baseline\",\"column\":0,\"row\":0,\"columnSpan\":1,\"rowSpan\":2},{\"id\":\"full-candidate\",\"column\":1,\"row\":0,\"columnSpan\":1,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"full-baseline\"\n ><nve-dashboard-panel-header>Baseline (full)</nve-dashboard-panel-header><nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content\n ><nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer></nve-dashboard-panel\n >\n <nve-dashboard-panel id=\"full-candidate\"\n ><nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header><nve-dashboard-panel-content>Current run</nve-dashboard-panel-content\n ><nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer></nve-dashboard-panel\n >\n </nve-dashboard>\n</div>\n",
99
+ "summary": "Match the surrounding layout with inset, flat, or full container framing.",
100
+ "description": "",
101
+ "composition": false,
102
+ "tags": []
103
+ },
104
+ {
105
+ "id": "dashboard-compact-styling",
106
+ "name": "CompactStyling",
107
+ "template": "<div id=\"compact-dashboard-example\" nve-layout=\"column gap:md\">\n <nve-button>Reset layout</nve-button>\n <style>\n #condensed-dashboard > nve-dashboard-panel {\n --box-shadow: none;\n --border-radius: 0;\n --control-width: var(--nve-ref-size-600);\n --control-height: var(--nve-ref-size-800);\n }\n #condensed-dashboard nve-dashboard-panel-header {\n --min-height: var(--nve-ref-size-800);\n --suffix-padding: var(--nve-ref-size-50);\n --padding: var(--nve-ref-size-100) var(--nve-ref-size-100) var(--nve-ref-size-100) var(--nve-ref-size-250);\n }\n #condensed-dashboard nve-dashboard-panel-footer {\n --suffix-padding: var(--nve-ref-size-50);\n --padding: var(--nve-ref-size-100) var(--nve-ref-size-250);\n }\n </style>\n <nve-dashboard\n id=\"condensed-dashboard\"\n rearrangeable\n style=\"height: 480px; --gap: 0px; --row-size: 80px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"condensed-baseline\",\"column\":0,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"condensed-candidate\",\"column\":3,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"condensed-changes\",\"column\":0,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"condensed-evidence\",\"column\":3,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"condensed-notes\",\"column\":0,\"row\":4,\"columnSpan\":6,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"condensed-baseline\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header><span nve-text=\"label sm semibold\">Baseline</span></nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer><span nve-text=\"body sm\">Complete</span></nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"condensed-candidate\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header><span nve-text=\"label sm semibold\">Candidate</span></nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer><span nve-text=\"body sm\">Complete</span></nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"condensed-changes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header><span nve-text=\"label sm semibold\">Changes</span></nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Comparison</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"condensed-evidence\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header><span nve-text=\"label sm semibold\">Evidence</span></nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Test cases</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"condensed-notes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header><span nve-text=\"label sm semibold\">Notes</span></nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n </nve-dashboard>\n <script type=\"module\">\n const example = document.querySelector(\"#compact-dashboard-example\");\n const dashboard = example.querySelector(\"nve-dashboard\");\n const initialValue = dashboard.getAttribute(\"value\");\n example.querySelector(\"nve-button\").addEventListener(\"click\", () => {\n dashboard.value = initialValue;\n });\n </script>\n</div>\n",
108
+ "summary": "Customize header and footer spacing, control sizes, and panel corners for a compact dashboard.",
109
+ "description": "",
110
+ "composition": true,
111
+ "tags": [
112
+ "theme"
113
+ ]
114
+ },
115
+ {
116
+ "id": "dashboard-gap",
117
+ "name": "Gap",
118
+ "template": "<div id=\"dashboard-gap-example\" nve-layout=\"column gap:md\">\n <nve-range>\n <label>\n Gap:\n <output for=\"dashboard-gap-range\">0</output>\n px\n </label>\n <input id=\"dashboard-gap-range\" type=\"range\" min=\"0\" max=\"24\" value=\"0\" />\n </nve-range>\n <nve-dashboard\n id=\"gap-dashboard\"\n container=\"full\"\n rearrangeable\n style=\"height: 600px; --row-size: 90px; --gap: 0px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"gap-baseline\",\"column\":0,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"gap-candidate\",\"column\":3,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"gap-changes\",\"column\":0,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"gap-evidence\",\"column\":3,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"gap-notes\",\"column\":0,\"row\":4,\"columnSpan\":6,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"gap-baseline\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Baseline</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"gap-candidate\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"gap-changes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Changes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Comparison</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"gap-evidence\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Evidence</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Test cases</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"gap-notes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Notes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n </nve-dashboard>\n <script type=\"module\">\n const example = document.querySelector(\"#dashboard-gap-example\");\n const dashboard = example.querySelector(\"nve-dashboard\");\n const range = example.querySelector('input[type=\"range\"]');\n const output = example.querySelector(\"output\");\n range.addEventListener(\"input\", () => {\n dashboard.style.setProperty(\"--gap\", range.value + \"px\");\n output.value = range.value;\n });\n </script>\n</div>\n",
119
+ "summary": "Adjust spacing between panels with --gap. Zero joins borders with matching widths.",
120
+ "description": "",
121
+ "composition": true,
122
+ "tags": [
123
+ "test-case"
124
+ ]
125
+ },
126
+ {
127
+ "id": "dashboard-right-to-left",
128
+ "name": "RightToLeft",
129
+ "template": "<div id=\"rtl-dashboard-example\" nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:wrap\">\n <nve-button id=\"reset-rtl-layout\">Reset layout</nve-button>\n </div>\n <nve-dashboard\n id=\"rtl-dashboard\"\n dir=\"rtl\"\n rearrangeable\n guides=\"visible\"\n style=\"height: 600px; --row-size: 90px\"\n value='{\"version\":1,\"grid\":{\"flow\":\"vertical\",\"tracks\":6},\"items\":[{\"id\":\"rtl-baseline\",\"column\":0,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"rtl-candidate\",\"column\":3,\"row\":0,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"rtl-changes\",\"column\":0,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"rtl-evidence\",\"column\":3,\"row\":2,\"columnSpan\":3,\"rowSpan\":2},{\"id\":\"rtl-notes\",\"column\":0,\"row\":4,\"columnSpan\":6,\"rowSpan\":2}]}'\n >\n <nve-dashboard-panel id=\"rtl-baseline\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Baseline</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Reference run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"rtl-candidate\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Candidate</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Current run</nve-dashboard-panel-content>\n <nve-dashboard-panel-footer>Complete</nve-dashboard-panel-footer>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"rtl-changes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Changes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Comparison</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"rtl-evidence\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Evidence</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>Test cases</nve-dashboard-panel-content>\n </nve-dashboard-panel>\n <nve-dashboard-panel id=\"rtl-notes\" min-column-span=\"2\" min-row-span=\"2\">\n <nve-dashboard-panel-header>Notes</nve-dashboard-panel-header>\n <nve-dashboard-panel-content>\n <nve-input>\n <input aria-label=\"Notes\" value=\"Review findings.\" />\n </nve-input>\n </nve-dashboard-panel-content>\n </nve-dashboard-panel>\n </nve-dashboard>\n <script type=\"module\">\n const example = document.querySelector(\"#rtl-dashboard-example\");\n const dashboard = example.querySelector(\"nve-dashboard\");\n const reset = example.querySelector(\"#reset-rtl-layout\");\n const initialValue = dashboard.getAttribute(\"value\");\n reset.addEventListener(\"click\", () => {\n dashboard.value = initialValue;\n });\n </script>\n</div>\n",
130
+ "summary": "Mirror panel placement and controls with the reading direction.",
131
+ "description": "",
132
+ "composition": true,
133
+ "tags": [
134
+ "test-case"
135
+ ]
136
+ }
137
+ ]
138
+ }
@@ -0,0 +1,5 @@
1
+ // src/dashboard/dashboard.css?inline
2
+ var e = ":host{--column-size: 160px;--row-size: 120px;--gap: var(--nve-ref-space-sm);--_geometry-border-width: 0px;--_authored-gap: max(0px, var(--gap));--_geometry-overlap: calc(var(--_geometry-border-width) * (1 - sign(var(--_authored-gap))));--_geometry-spacing: calc(var(--_authored-gap) - var(--_geometry-overlap));--guide-color: var(--nve-ref-border-color-muted);--guide-size: var(--nve-ref-size-200);--height: 400px;--animation-duration: var(--nve-ref-animation-duration-150);--animation-easing: var(--nve-ref-animation-easing-100);display:block;width:100%;width:stretch;height:var(--height);min-width:0;min-height:0;contain:none}[internal-host]{height:100%;position:relative}.viewport{height:100%;width:100%;overflow:auto;position:relative;scrollbar-width:var(--nve-sys-scrollbar-width);scrollbar-color:var(--nve-sys-scrollbar-thumb-color) var(--nve-sys-scrollbar-track-color)}.viewport[data-sizing=fit][data-flow=vertical]{overflow:hidden scroll}.viewport[data-sizing=fit][data-flow=horizontal]{overflow:scroll hidden}.canvas{--_pitch-x: calc(var(--column-size) + var(--_geometry-spacing));--_pitch-y: calc(var(--row-size) + var(--_geometry-spacing));--_guide-center-x: calc((100% - var(--_geometry-spacing)) / 2);position:relative;isolation:isolate;overflow:clip}.canvas>slot{display:block;reading-flow:source-order}::slotted(nve-dashboard-panel:not(:state(placed))){display:none}::slotted(nve-dashboard-panel){left:var(--_dashboard-inline-start);right:auto;reading-order:var(--_reading-order, 0)}:host(:dir(rtl)) ::slotted(nve-dashboard-panel){left:auto;right:var(--_dashboard-inline-start)}.viewport[data-sizing=fit][data-flow=vertical] .canvas{--_pitch-x: calc((100% + var(--_geometry-spacing)) / var(--_tracks))}.viewport[data-sizing=fit][data-flow=horizontal] .canvas{--_pitch-y: calc((100% + var(--_geometry-spacing)) / var(--_tracks))}:host(:not([guides=\"hidden\" i])) .canvas[data-arranging],:host([guides=\"visible\" i]) .canvas{background-image:radial-gradient(circle at var(--_guide-center-x) calc((100% - var(--_geometry-spacing)) / 2),var(--guide-color) calc(var(--guide-size) / 2),transparent calc(var(--guide-size) / 2));background-size:var(--_pitch-x) var(--_pitch-y)}:host(:dir(rtl)) .canvas{--_guide-center-x: calc((100% + var(--_geometry-spacing)) / 2);background-position:right top}.metric,.gap-metric{position:absolute;pointer-events:none;visibility:hidden;contain:strict;top:0;left:0}.metric{width:var(--column-size);height:var(--row-size)}.gap-metric{width:var(--_authored-gap);height:var(--_geometry-overlap)}nve-ghost{position:absolute;left:var(--_dashboard-inline-start);right:auto;pointer-events:none;z-index:1;transition-property:left,right,top,width,height;transition-duration:var(--animation-duration);transition-timing-function:var(--animation-easing)}:host(:dir(rtl)) nve-ghost{left:auto;right:var(--_dashboard-inline-start)}.announcement{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@media(prefers-reduced-motion:reduce){nve-ghost{transition-duration:0s}}.start-cue{position:absolute;inset:0 0 auto;height:var(--nve-ref-size-200);pointer-events:none;z-index:7;background-color:color-mix(in srgb,var(--nve-sys-accent-secondary-background) 16%,transparent)}.viewport[data-flow=horizontal] .start-cue{inset:0 auto;inset-inline-start:0;width:var(--nve-ref-size-200);height:auto}:host(:fullscreen){width:100%;height:100%;background:var(--nve-sys-layer-container-background)}.viewport[data-fullscreen][data-sizing]{overflow:hidden}.viewport[data-fullscreen] .canvas{background-image:none}";
3
+ export { e as default };
4
+
5
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","names":["dashboard_default"],"sources":["../../src/dashboard/dashboard.css?inline"],"sourcesContent":["/* SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. */\n/* SPDX-License-Identifier: Apache-2.0 */\n:host {\n --column-size: 160px;\n --row-size: 120px;\n --gap: var(--nve-ref-space-sm);\n --_geometry-border-width: 0px;\n --_authored-gap: max(0px, var(--gap));\n --_geometry-overlap: calc(var(--_geometry-border-width) * (1 - sign(var(--_authored-gap))));\n --_geometry-spacing: calc(var(--_authored-gap) - var(--_geometry-overlap));\n --guide-color: var(--nve-ref-border-color-muted);\n --guide-size: var(--nve-ref-size-200);\n --height: 400px;\n --animation-duration: var(--nve-ref-animation-duration-150);\n --animation-easing: var(--nve-ref-animation-easing-100);\n display: block;\n width: 100%;\n width: stretch;\n height: var(--height);\n min-width: 0;\n min-height: 0;\n contain: none;\n}\n\n[internal-host] {\n height: 100%;\n position: relative;\n}\n\n.viewport {\n height: 100%;\n width: 100%;\n overflow: auto;\n position: relative;\n scrollbar-width: var(--nve-sys-scrollbar-width);\n scrollbar-color: var(--nve-sys-scrollbar-thumb-color) var(--nve-sys-scrollbar-track-color);\n}\n\n.viewport[data-sizing='fit'][data-flow='vertical'] {\n overflow: hidden scroll;\n}\n\n.viewport[data-sizing='fit'][data-flow='horizontal'] {\n overflow: scroll hidden;\n}\n\n.canvas {\n --_pitch-x: calc(var(--column-size) + var(--_geometry-spacing));\n --_pitch-y: calc(var(--row-size) + var(--_geometry-spacing));\n --_guide-center-x: calc((100% - var(--_geometry-spacing)) / 2);\n position: relative;\n isolation: isolate;\n overflow: clip;\n}\n\n.canvas > slot {\n display: block;\n reading-flow: source-order;\n}\n\n::slotted(nve-dashboard-panel:not(:state(placed))) {\n display: none;\n}\n\n::slotted(nve-dashboard-panel) {\n left: var(--_dashboard-inline-start);\n right: auto;\n reading-order: var(--_reading-order, 0);\n}\n\n:host(:dir(rtl)) ::slotted(nve-dashboard-panel) {\n left: auto;\n right: var(--_dashboard-inline-start);\n}\n\n.viewport[data-sizing='fit'][data-flow='vertical'] .canvas {\n --_pitch-x: calc((100% + var(--_geometry-spacing)) / var(--_tracks));\n}\n\n.viewport[data-sizing='fit'][data-flow='horizontal'] .canvas {\n --_pitch-y: calc((100% + var(--_geometry-spacing)) / var(--_tracks));\n}\n\n:host(:not([guides='hidden' i])) .canvas[data-arranging],\n:host([guides='visible' i]) .canvas {\n background-image: radial-gradient(\n circle at var(--_guide-center-x) calc((100% - var(--_geometry-spacing)) / 2),\n var(--guide-color) calc(var(--guide-size) / 2),\n transparent calc(var(--guide-size) / 2)\n );\n background-size: var(--_pitch-x) var(--_pitch-y);\n}\n\n:host(:dir(rtl)) .canvas {\n --_guide-center-x: calc((100% + var(--_geometry-spacing)) / 2);\n background-position: right top;\n}\n\n.metric,\n.gap-metric {\n position: absolute;\n pointer-events: none;\n visibility: hidden;\n contain: strict;\n top: 0;\n left: 0;\n}\n\n.metric {\n width: var(--column-size);\n height: var(--row-size);\n}\n\n.gap-metric {\n width: var(--_authored-gap);\n height: var(--_geometry-overlap);\n}\n\nnve-ghost {\n position: absolute;\n left: var(--_dashboard-inline-start);\n right: auto;\n pointer-events: none;\n z-index: 1;\n transition-property: left, right, top, width, height;\n transition-duration: var(--animation-duration);\n transition-timing-function: var(--animation-easing);\n}\n\n:host(:dir(rtl)) nve-ghost {\n left: auto;\n right: var(--_dashboard-inline-start);\n}\n\n.announcement {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n@media (prefers-reduced-motion: reduce) {\n nve-ghost {\n transition-duration: 0s;\n }\n}\n\n.start-cue {\n position: absolute;\n inset: 0 0 auto;\n height: var(--nve-ref-size-200);\n pointer-events: none;\n z-index: 7;\n background-color: color-mix(in srgb, var(--nve-sys-accent-secondary-background) 16%, transparent);\n}\n\n.viewport[data-flow='horizontal'] .start-cue {\n inset: 0 auto;\n inset-inline-start: 0;\n width: var(--nve-ref-size-200);\n height: auto;\n}\n\n:host(:fullscreen) {\n width: 100%;\n height: 100%;\n background: var(--nve-sys-layer-container-background);\n}\n\n.viewport[data-fullscreen][data-sizing] {\n overflow: hidden;\n}\n\n.viewport[data-fullscreen] .canvas {\n background-image: none;\n}\n"],"mappings":""}
@@ -0,0 +1,33 @@
1
+ /** Zero-based grid placement. Columns count from inline start (right in RTL); rows count from the top. Spans are positive cell counts. */
2
+ export interface DashboardGridPlacement {
3
+ readonly column: number;
4
+ readonly row: number;
5
+ readonly columnSpan: number;
6
+ readonly rowSpan: number;
7
+ }
8
+ export interface DashboardItem extends DashboardGridPlacement {
9
+ readonly id: string;
10
+ }
11
+ /** Grid and placements of the currently owned panels. */
12
+ export interface DashboardLayout {
13
+ readonly version: 1;
14
+ readonly grid: {
15
+ readonly flow: 'vertical' | 'horizontal';
16
+ readonly tracks: number;
17
+ };
18
+ readonly items: readonly DashboardItem[];
19
+ }
20
+ /** Allowed panel spans in columns and rows, independent of pixel sizing. */
21
+ export interface DashboardSpanConstraints {
22
+ readonly id: string;
23
+ readonly minColumnSpan: number;
24
+ readonly minRowSpan: number;
25
+ readonly maxColumnSpan: number;
26
+ readonly maxRowSpan: number;
27
+ }
28
+ export interface DashboardCommandContext {
29
+ /** Panel ID when a command targets the containing dashboard. */
30
+ readonly value?: string;
31
+ /** Integer grid placement for --place; --move-to-start uses only its bounded-axis coordinate. */
32
+ readonly placement?: DashboardGridPlacement;
33
+ }