@nvidia-elements/core 2.23.4 → 2.23.6

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 (358) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/accordion/accordion2.js +49 -49
  3. package/dist/accordion/accordion2.js.map +1 -1
  4. package/dist/alert/alert-group2.js +22 -21
  5. package/dist/alert/alert-group2.js.map +1 -1
  6. package/dist/alert/alert2.js +29 -28
  7. package/dist/alert/alert2.js.map +1 -1
  8. package/dist/avatar/avatar-group2.js +9 -9
  9. package/dist/avatar/avatar-group2.js.map +1 -1
  10. package/dist/avatar/avatar2.js +12 -11
  11. package/dist/avatar/avatar2.js.map +1 -1
  12. package/dist/badge/badge2.js +27 -26
  13. package/dist/badge/badge2.js.map +1 -1
  14. package/dist/breadcrumb/breadcrumb2.js +17 -17
  15. package/dist/breadcrumb/breadcrumb2.js.map +1 -1
  16. package/dist/bundles/index.js +10 -10
  17. package/dist/button/button2.js +12 -12
  18. package/dist/button/button2.js.map +1 -1
  19. package/dist/button-group/button-group2.js +18 -18
  20. package/dist/button-group/button-group2.js.map +1 -1
  21. package/dist/card/card2.js +28 -28
  22. package/dist/card/card2.js.map +1 -1
  23. package/dist/chat-message/chat-message2.js +15 -14
  24. package/dist/chat-message/chat-message2.js.map +1 -1
  25. package/dist/checkbox/checkbox-group2.js +8 -8
  26. package/dist/checkbox/checkbox-group2.js.map +1 -1
  27. package/dist/checkbox/checkbox2.js +8 -8
  28. package/dist/checkbox/checkbox2.js.map +1 -1
  29. package/dist/color/color2.js +21 -21
  30. package/dist/color/color2.js.map +1 -1
  31. package/dist/combobox/combobox2.js +37 -37
  32. package/dist/combobox/combobox2.js.map +1 -1
  33. package/dist/copy-button/copy-button.d.ts +1 -1
  34. package/dist/copy-button/copy-button2.js +21 -21
  35. package/dist/copy-button/copy-button2.js.map +1 -1
  36. package/dist/custom-elements.json +1032 -337
  37. package/dist/date/date2.js +19 -19
  38. package/dist/date/date2.js.map +1 -1
  39. package/dist/datetime/datetime2.js +19 -19
  40. package/dist/datetime/datetime2.js.map +1 -1
  41. package/dist/dialog/dialog-footer2.js +7 -7
  42. package/dist/dialog/dialog-footer2.js.map +1 -1
  43. package/dist/dialog/dialog-header2.js +7 -7
  44. package/dist/dialog/dialog-header2.js.map +1 -1
  45. package/dist/dialog/dialog2.js +25 -25
  46. package/dist/dialog/dialog2.js.map +1 -1
  47. package/dist/divider/divider2.js +12 -12
  48. package/dist/divider/divider2.js.map +1 -1
  49. package/dist/dot/dot2.js +17 -16
  50. package/dist/dot/dot2.js.map +1 -1
  51. package/dist/drag-handle/drag-handle2.js +12 -12
  52. package/dist/drag-handle/drag-handle2.js.map +1 -1
  53. package/dist/drawer/drawer-content2.js +7 -7
  54. package/dist/drawer/drawer-content2.js.map +1 -1
  55. package/dist/drawer/drawer-footer2.js +7 -7
  56. package/dist/drawer/drawer-footer2.js.map +1 -1
  57. package/dist/drawer/drawer-header2.js +7 -7
  58. package/dist/drawer/drawer-header2.js.map +1 -1
  59. package/dist/drawer/drawer2.js +21 -21
  60. package/dist/drawer/drawer2.js.map +1 -1
  61. package/dist/dropdown/dropdown-footer2.js +7 -7
  62. package/dist/dropdown/dropdown-footer2.js.map +1 -1
  63. package/dist/dropdown/dropdown-header2.js +7 -7
  64. package/dist/dropdown/dropdown-header2.js.map +1 -1
  65. package/dist/dropdown/dropdown2.js +21 -21
  66. package/dist/dropdown/dropdown2.js.map +1 -1
  67. package/dist/dropdown-group/dropdown-group.js +10 -10
  68. package/dist/dropdown-group/dropdown-group.js.map +1 -1
  69. package/dist/dropzone/dropzone2.js +19 -19
  70. package/dist/dropzone/dropzone2.js.map +1 -1
  71. package/dist/file/file2.js +8 -8
  72. package/dist/file/file2.js.map +1 -1
  73. package/dist/format-bytes/format-bytes2.js +13 -13
  74. package/dist/format-bytes/format-bytes2.js.map +1 -1
  75. package/dist/format-datetime/format-datetime2.js +14 -14
  76. package/dist/format-datetime/format-datetime2.js.map +1 -1
  77. package/dist/format-number/format-number2.js +20 -20
  78. package/dist/format-number/format-number2.js.map +1 -1
  79. package/dist/format-relative-time/format-relative-time2.js +11 -11
  80. package/dist/format-relative-time/format-relative-time2.js.map +1 -1
  81. package/dist/format-truncate/format-truncate2.js +21 -21
  82. package/dist/format-truncate/format-truncate2.js.map +1 -1
  83. package/dist/forms/control/control2.js +30 -29
  84. package/dist/forms/control/control2.js.map +1 -1
  85. package/dist/forms/control-group/control-group2.js +19 -18
  86. package/dist/forms/control-group/control-group2.js.map +1 -1
  87. package/dist/forms/control-message/control-message2.js +15 -15
  88. package/dist/forms/control-message/control-message2.js.map +1 -1
  89. package/dist/gauge/gauge2.js +20 -20
  90. package/dist/gauge/gauge2.js.map +1 -1
  91. package/dist/ghost/ghost2.js +10 -10
  92. package/dist/ghost/ghost2.js.map +1 -1
  93. package/dist/grid/cell/cell2.js +9 -9
  94. package/dist/grid/cell/cell2.js.map +1 -1
  95. package/dist/grid/column/column2.js +16 -16
  96. package/dist/grid/column/column2.js.map +1 -1
  97. package/dist/grid/footer/footer2.js +12 -12
  98. package/dist/grid/footer/footer2.js.map +1 -1
  99. package/dist/grid/grid2.js +30 -30
  100. package/dist/grid/grid2.js.map +1 -1
  101. package/dist/grid/header/header2.js +20 -20
  102. package/dist/grid/header/header2.js.map +1 -1
  103. package/dist/grid/placeholder/placeholder2.js +9 -9
  104. package/dist/grid/placeholder/placeholder2.js.map +1 -1
  105. package/dist/grid/row/row2.js +15 -15
  106. package/dist/grid/row/row2.js.map +1 -1
  107. package/dist/icon/icon2.js +40 -40
  108. package/dist/icon/icon2.js.map +1 -1
  109. package/dist/icon-button/icon-button2.js +17 -17
  110. package/dist/icon-button/icon-button2.js.map +1 -1
  111. package/dist/iframe/iframe2.js +7 -7
  112. package/dist/iframe/iframe2.js.map +1 -1
  113. package/dist/index.js +1 -1
  114. package/dist/input/input-group2.js +8 -8
  115. package/dist/input/input-group2.js.map +1 -1
  116. package/dist/input/input2.js +10 -10
  117. package/dist/input/input2.js.map +1 -1
  118. package/dist/internal/controllers/state-expanded.controller.js +1 -1
  119. package/dist/internal/controllers/state-expanded.controller.js.map +1 -1
  120. package/dist/internal/controllers/state-highlighted.controller.js +1 -1
  121. package/dist/internal/controllers/state-highlighted.controller.js.map +1 -1
  122. package/dist/internal/controllers/state-scroll.controller.js +1 -1
  123. package/dist/internal/controllers/state-scroll.controller.js.map +1 -1
  124. package/dist/internal/controllers/state-selected.controller.js +1 -1
  125. package/dist/internal/controllers/state-selected.controller.js.map +1 -1
  126. package/dist/internal/controllers/type-anchor.controller.js +1 -1
  127. package/dist/internal/controllers/type-anchor.controller.js.map +1 -1
  128. package/dist/internal/controllers/type-closable.controller.js +1 -1
  129. package/dist/internal/controllers/type-closable.controller.js.map +1 -1
  130. package/dist/internal/controllers/type-expandable.controller.js +1 -1
  131. package/dist/internal/controllers/type-expandable.controller.js.map +1 -1
  132. package/dist/internal/controllers/type-native-popover.controller.js +6 -6
  133. package/dist/internal/controllers/type-native-popover.controller.js.map +1 -1
  134. package/dist/internal/controllers/type-popover.controller.examples.js.map +1 -1
  135. package/dist/internal/controllers/type-selectable.controller.js +1 -1
  136. package/dist/internal/controllers/type-selectable.controller.js.map +1 -1
  137. package/dist/internal/index.d.ts +0 -1
  138. package/dist/internal/index.js +57 -61
  139. package/dist/internal/index.js.map +1 -1
  140. package/dist/internal/styles/index.d.ts +0 -1
  141. package/dist/internal/styles/index.js +5 -15
  142. package/dist/internal/styles/index.js.map +1 -1
  143. package/dist/internal/utils/a11y.d.ts +0 -3
  144. package/dist/internal/utils/a11y.js +6 -9
  145. package/dist/internal/utils/a11y.js.map +1 -1
  146. package/dist/joystick/joystick2.js +19 -19
  147. package/dist/joystick/joystick2.js.map +1 -1
  148. package/dist/logo/logo2.js +14 -13
  149. package/dist/logo/logo2.js.map +1 -1
  150. package/dist/menu/menu-group2.js +20 -20
  151. package/dist/menu/menu-group2.js.map +1 -1
  152. package/dist/menu/menu-item2.js +11 -11
  153. package/dist/menu/menu-item2.js.map +1 -1
  154. package/dist/menu/menu2.js +14 -14
  155. package/dist/menu/menu2.js.map +1 -1
  156. package/dist/month/month2.js +19 -19
  157. package/dist/month/month2.js.map +1 -1
  158. package/dist/notification/notification-group2.js +13 -13
  159. package/dist/notification/notification-group2.js.map +1 -1
  160. package/dist/notification/notification2.js +31 -31
  161. package/dist/notification/notification2.js.map +1 -1
  162. package/dist/page/page-panel/page-panel-content2.js +7 -7
  163. package/dist/page/page-panel/page-panel-content2.js.map +1 -1
  164. package/dist/page/page-panel/page-panel-footer2.js +9 -9
  165. package/dist/page/page-panel/page-panel-footer2.js.map +1 -1
  166. package/dist/page/page-panel/page-panel-header2.js +9 -9
  167. package/dist/page/page-panel/page-panel-header2.js.map +1 -1
  168. package/dist/page/page-panel/page-panel2.js +15 -15
  169. package/dist/page/page-panel/page-panel2.js.map +1 -1
  170. package/dist/page/page2.js +13 -13
  171. package/dist/page/page2.js.map +1 -1
  172. package/dist/page-header/page-header2.js +10 -10
  173. package/dist/page-header/page-header2.js.map +1 -1
  174. package/dist/page-loader/page-loader2.js +13 -13
  175. package/dist/page-loader/page-loader2.js.map +1 -1
  176. package/dist/pagination/pagination2.js +34 -34
  177. package/dist/pagination/pagination2.js.map +1 -1
  178. package/dist/panel/panel2.js +36 -36
  179. package/dist/panel/panel2.js.map +1 -1
  180. package/dist/password/password2.js +19 -19
  181. package/dist/password/password2.js.map +1 -1
  182. package/dist/preferences-input/preferences-input.d.ts +1 -1
  183. package/dist/preferences-input/preferences-input2.js +25 -25
  184. package/dist/preferences-input/preferences-input2.js.map +1 -1
  185. package/dist/progress-bar/progress-bar2.js +13 -13
  186. package/dist/progress-bar/progress-bar2.js.map +1 -1
  187. package/dist/progress-dot/progress-dot2.js +15 -15
  188. package/dist/progress-dot/progress-dot2.js.map +1 -1
  189. package/dist/progress-ring/progress-ring2.js +20 -20
  190. package/dist/progress-ring/progress-ring2.js.map +1 -1
  191. package/dist/progressive-filter-chip/progressive-filter-chip2.js +28 -28
  192. package/dist/progressive-filter-chip/progressive-filter-chip2.js.map +1 -1
  193. package/dist/pulse/pulse2.js +15 -15
  194. package/dist/pulse/pulse2.js.map +1 -1
  195. package/dist/radio/radio-group2.js +8 -8
  196. package/dist/radio/radio-group2.js.map +1 -1
  197. package/dist/radio/radio2.js +8 -8
  198. package/dist/radio/radio2.js.map +1 -1
  199. package/dist/range/range2.js +16 -16
  200. package/dist/range/range2.js.map +1 -1
  201. package/dist/resize-handle/resize-handle2.js +17 -17
  202. package/dist/resize-handle/resize-handle2.js.map +1 -1
  203. package/dist/search/search2.js +20 -20
  204. package/dist/search/search2.js.map +1 -1
  205. package/dist/select/select2.js +32 -32
  206. package/dist/select/select2.js.map +1 -1
  207. package/dist/skeleton/skeleton2.js +14 -14
  208. package/dist/skeleton/skeleton2.js.map +1 -1
  209. package/dist/sort-button/sort-button.d.ts +1 -1
  210. package/dist/sort-button/sort-button2.js +16 -16
  211. package/dist/sort-button/sort-button2.js.map +1 -1
  212. package/dist/sparkline/sparkline2.js +45 -44
  213. package/dist/sparkline/sparkline2.js.map +1 -1
  214. package/dist/star-rating/star-rating2.js +14 -14
  215. package/dist/star-rating/star-rating2.js.map +1 -1
  216. package/dist/steps/steps2.js +32 -32
  217. package/dist/steps/steps2.js.map +1 -1
  218. package/dist/switch/switch-group2.js +8 -8
  219. package/dist/switch/switch-group2.js.map +1 -1
  220. package/dist/switch/switch2.js +8 -8
  221. package/dist/switch/switch2.js.map +1 -1
  222. package/dist/tabs/tabs-group2.js +18 -18
  223. package/dist/tabs/tabs-group2.js.map +1 -1
  224. package/dist/tabs/tabs-item-group2.js +9 -9
  225. package/dist/tabs/tabs-item-group2.js.map +1 -1
  226. package/dist/tabs/tabs2.js +28 -28
  227. package/dist/tabs/tabs2.js.map +1 -1
  228. package/dist/tag/tag2.js +19 -18
  229. package/dist/tag/tag2.js.map +1 -1
  230. package/dist/textarea/textarea2.js +9 -9
  231. package/dist/textarea/textarea2.js.map +1 -1
  232. package/dist/time/time2.js +19 -19
  233. package/dist/time/time2.js.map +1 -1
  234. package/dist/toast/toast2.js +28 -28
  235. package/dist/toast/toast2.js.map +1 -1
  236. package/dist/toggletip/toggletip-footer2.js +7 -7
  237. package/dist/toggletip/toggletip-footer2.js.map +1 -1
  238. package/dist/toggletip/toggletip-header2.js +7 -7
  239. package/dist/toggletip/toggletip-header2.js.map +1 -1
  240. package/dist/toggletip/toggletip2.js +23 -23
  241. package/dist/toggletip/toggletip2.js.map +1 -1
  242. package/dist/toolbar/toolbar2.js +20 -19
  243. package/dist/toolbar/toolbar2.js.map +1 -1
  244. package/dist/tooltip/tooltip2.js +20 -20
  245. package/dist/tooltip/tooltip2.js.map +1 -1
  246. package/dist/tree/tree-node2.js +39 -39
  247. package/dist/tree/tree-node2.js.map +1 -1
  248. package/dist/tree/tree2.js +20 -20
  249. package/dist/tree/tree2.js.map +1 -1
  250. package/dist/week/week2.js +19 -19
  251. package/dist/week/week2.js.map +1 -1
  252. package/dist/workspace/controllers/workspace-composition.controller.d.ts +4 -1
  253. package/dist/workspace/controllers/workspace-composition.controller.js +69 -39
  254. package/dist/workspace/controllers/workspace-composition.controller.js.map +1 -1
  255. package/dist/workspace/controllers/workspace-rearrange.controller.js +27 -27
  256. package/dist/workspace/controllers/workspace-rearrange.controller.js.map +1 -1
  257. package/dist/workspace/controllers/workspace-restoration.controller.js +2 -2
  258. package/dist/workspace/controllers/workspace-restoration.controller.js.map +1 -1
  259. package/dist/workspace/panel/panel2.js +15 -15
  260. package/dist/workspace/panel/panel2.js.map +1 -1
  261. package/dist/workspace/panel-content/panel-content2.js +7 -7
  262. package/dist/workspace/panel-content/panel-content2.js.map +1 -1
  263. package/dist/workspace/panel-footer/panel-footer2.js +9 -9
  264. package/dist/workspace/panel-footer/panel-footer2.js.map +1 -1
  265. package/dist/workspace/panel-header/panel-header2.js +16 -16
  266. package/dist/workspace/panel-header/panel-header2.js.map +1 -1
  267. package/dist/workspace/utils/comparison.utils.d.ts +3 -0
  268. package/dist/workspace/utils/comparison.utils.js +13 -0
  269. package/dist/workspace/utils/comparison.utils.js.map +1 -0
  270. package/dist/workspace/utils/evaluation.utils.d.ts +65 -6
  271. package/dist/workspace/utils/evaluation.utils.js +334 -99
  272. package/dist/workspace/utils/evaluation.utils.js.map +1 -1
  273. package/dist/workspace/utils/geometry/allocation.utils.js +15 -13
  274. package/dist/workspace/utils/geometry/allocation.utils.js.map +1 -1
  275. package/dist/workspace/utils/geometry/sizing.utils.d.ts +2 -0
  276. package/dist/workspace/utils/geometry/sizing.utils.js +37 -17
  277. package/dist/workspace/utils/geometry/sizing.utils.js.map +1 -1
  278. package/dist/workspace/utils/interaction/boundary.utils.d.ts +2 -2
  279. package/dist/workspace/utils/interaction/boundary.utils.js +2 -2
  280. package/dist/workspace/utils/interaction/boundary.utils.js.map +1 -1
  281. package/dist/workspace/utils/interaction/drag-preview.utils.d.ts +3 -3
  282. package/dist/workspace/utils/interaction/drag-preview.utils.js.map +1 -1
  283. package/dist/workspace/utils/interaction/insertion-offers.utils.d.ts +11 -9
  284. package/dist/workspace/utils/interaction/insertion-offers.utils.js +37 -43
  285. package/dist/workspace/utils/interaction/insertion-offers.utils.js.map +1 -1
  286. package/dist/workspace/utils/interaction/placement-decision.utils.d.ts +6 -1
  287. package/dist/workspace/utils/interaction/placement-decision.utils.js +94 -87
  288. package/dist/workspace/utils/interaction/placement-decision.utils.js.map +1 -1
  289. package/dist/workspace/utils/model/layout.utils.d.ts +2 -1
  290. package/dist/workspace/utils/model/layout.utils.js +12 -10
  291. package/dist/workspace/utils/model/layout.utils.js.map +1 -1
  292. package/dist/workspace/utils/model/membership.utils.d.ts +4 -0
  293. package/dist/workspace/utils/model/membership.utils.js +13 -4
  294. package/dist/workspace/utils/model/membership.utils.js.map +1 -1
  295. package/dist/workspace/utils/model/operations.utils.d.ts +1 -0
  296. package/dist/workspace/utils/model/operations.utils.js +51 -46
  297. package/dist/workspace/utils/model/operations.utils.js.map +1 -1
  298. package/dist/workspace/utils/model/projection.utils.d.ts +4 -2
  299. package/dist/workspace/utils/model/projection.utils.js +49 -40
  300. package/dist/workspace/utils/model/projection.utils.js.map +1 -1
  301. package/dist/workspace/utils/model/value.utils.d.ts +4 -3
  302. package/dist/workspace/utils/model/value.utils.js +15 -50
  303. package/dist/workspace/utils/model/value.utils.js.map +1 -1
  304. package/dist/workspace/utils/placement/acquisition-sizing.utils.d.ts +2 -0
  305. package/dist/workspace/utils/placement/acquisition-sizing.utils.js +30 -22
  306. package/dist/workspace/utils/placement/acquisition-sizing.utils.js.map +1 -1
  307. package/dist/workspace/utils/placement/group-insertion.utils.d.ts +19 -13
  308. package/dist/workspace/utils/placement/group-insertion.utils.js +50 -47
  309. package/dist/workspace/utils/placement/group-insertion.utils.js.map +1 -1
  310. package/dist/workspace/utils/placement/planner.utils.d.ts +13 -2
  311. package/dist/workspace/utils/placement/planner.utils.js +79 -73
  312. package/dist/workspace/utils/placement/planner.utils.js.map +1 -1
  313. package/dist/workspace/utils/placement/preparation.utils.d.ts +5 -2
  314. package/dist/workspace/utils/placement/preparation.utils.js +45 -41
  315. package/dist/workspace/utils/placement/preparation.utils.js.map +1 -1
  316. package/dist/workspace/utils/placement/region.utils.js +32 -32
  317. package/dist/workspace/utils/placement/region.utils.js.map +1 -1
  318. package/dist/workspace/utils/placement/scope.utils.d.ts +34 -0
  319. package/dist/workspace/utils/placement/scope.utils.js +155 -0
  320. package/dist/workspace/utils/placement/scope.utils.js.map +1 -0
  321. package/dist/workspace/utils/placement/session.utils.d.ts +11 -0
  322. package/dist/workspace/utils/placement/session.utils.js +78 -0
  323. package/dist/workspace/utils/placement/session.utils.js.map +1 -0
  324. package/dist/workspace/utils/placement/split-sizing.utils.d.ts +2 -2
  325. package/dist/workspace/utils/placement/split-sizing.utils.js +19 -19
  326. package/dist/workspace/utils/placement/split-sizing.utils.js.map +1 -1
  327. package/dist/workspace/utils/presentation/composition.utils.d.ts +1 -1
  328. package/dist/workspace/utils/presentation/composition.utils.js +4 -2
  329. package/dist/workspace/utils/presentation/composition.utils.js.map +1 -1
  330. package/dist/workspace/utils/presentation/groups.utils.d.ts +3 -3
  331. package/dist/workspace/utils/presentation/groups.utils.js +40 -30
  332. package/dist/workspace/utils/presentation/groups.utils.js.map +1 -1
  333. package/dist/workspace/utils/presentation/measurements.utils.d.ts +1 -0
  334. package/dist/workspace/utils/presentation/measurements.utils.js +6 -14
  335. package/dist/workspace/utils/presentation/measurements.utils.js.map +1 -1
  336. package/dist/workspace/utils/presentation/offers.utils.d.ts +1 -1
  337. package/dist/workspace/utils/presentation/offers.utils.js +3 -3
  338. package/dist/workspace/utils/presentation/offers.utils.js.map +1 -1
  339. package/dist/workspace/utils/presentation/preview.utils.d.ts +6 -0
  340. package/dist/workspace/utils/presentation/preview.utils.js +14 -3
  341. package/dist/workspace/utils/presentation/preview.utils.js.map +1 -1
  342. package/dist/workspace/workspace.examples.js.map +1 -1
  343. package/dist/workspace/workspace.examples.json +4 -4
  344. package/dist/workspace/workspace.js +1 -1
  345. package/dist/workspace/workspace.js.map +1 -1
  346. package/dist/workspace/workspace2.js +233 -239
  347. package/dist/workspace/workspace2.js.map +1 -1
  348. package/package.json +2 -2
  349. package/dist/internal/decorators/scoped-registry.d.ts +0 -2
  350. package/dist/internal/decorators/scoped-registry.js +0 -36
  351. package/dist/internal/decorators/scoped-registry.js.map +0 -1
  352. package/dist/internal/styles/base.js +0 -5
  353. package/dist/internal/styles/base.js.map +0 -1
  354. package/dist/internal/styles/interaction-state.js +0 -5
  355. package/dist/internal/styles/interaction-state.js.map +0 -1
  356. package/dist/workspace/utils/placement/context.utils.d.ts +0 -36
  357. package/dist/workspace/utils/placement/context.utils.js +0 -135
  358. package/dist/workspace/utils/placement/context.utils.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"preview.utils.js","names":["shouldEmphasizeReservedDestination","preview","getRegionCornerStyle","corners","styles","corner","right","bottom","x","rect","y","regions","group","node"],"sources":["../../../../src/workspace/utils/presentation/preview.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Rect } from '@nvidia-elements/core/internal';\n\nimport type { WorkspacePlacedRegion } from '../geometry/allocation.utils.js';\nimport type { WorkspaceDragPreview } from '../interaction/drag-preview.utils.js';\n\nexport function shouldEmphasizeReservedDestination(preview: WorkspaceDragPreview) {\n return (\n !preview.blocked &&\n 'allocation' in preview &&\n preview.allocation === 'reserved' &&\n (preview.intent.kind === 'order' ||\n preview.intent.kind === 'insert' ||\n (preview.phase === 'detached' && preview.intent.kind === 'invalid' && preview.cue.kind === 'group'))\n );\n}\n\n/** Rounds only corners shared with the visible group geometry. */\nexport function getRegionCornerStyle(rect: Rect, regions: WorkspacePlacedRegion[]): string {\n const corners = [\n ['top-left', 0, 0],\n ['top-right', 1, 0],\n ['bottom-right', 1, 1],\n ['bottom-left', 0, 1]\n ] as const;\n const styles = ['border-radius:var(--_workspace-border-radius)'];\n for (const [corner, right, bottom] of corners) {\n const x = rect.x + right * rect.width;\n const y = rect.y + bottom * rect.height;\n const rounded = regions.some(\n ({ node, rect: group }) =>\n node.type === 'group' &&\n Math.abs(x - group.x - right * group.width) < 0.000001 &&\n Math.abs(y - group.y - bottom * group.height) < 0.000001\n );\n if (!rounded) {\n styles.push(`border-${corner}-radius:0px`);\n }\n }\n return styles.join(';');\n}\n"],"mappings":";AAQA,SAAgBA,EAAmC,GAA+B;CAChF,OACE,CAACC,EAAQ,WACT,gBAAgBA,KAChBA,EAAQ,eAAe,eACtBA,EAAQ,OAAO,SAAS,WACvBA,EAAQ,OAAO,SAAS,YACvBA,EAAQ,UAAU,cAAcA,EAAQ,OAAO,SAAS,aAAaA,EAAQ,IAAI,SAAS;AAEjG;AAGA,SAAgBC,EAAqB,GAAY,GAA0C;CACzF,IAAMC,IAAU;EACd;GAAC;GAAY;GAAG;EAAC;EACjB;GAAC;GAAa;GAAG;EAAC;EAClB;GAAC;GAAgB;GAAG;EAAC;EACrB;GAAC;GAAe;GAAG;EAAC;CACtB,GACMC,IAAS,CAAC,+CAA+C;CAC/D,KAAK,IAAM,CAACC,GAAQC,GAAOC,MAAWJ,GAAS;EAC7C,IAAMK,IAAIC,EAAK,IAAIH,IAAQG,EAAK,OAC1BC,IAAID,EAAK,IAAIF,IAASE,EAAK;EAOjC,AANgBE,EAAQ,MACrB,EAAE,SAAM,MAAMC,QACbC,EAAK,SAAS,WACd,KAAK,IAAIL,IAAII,EAAM,IAAIN,IAAQM,EAAM,KAAK,IAAI,QAC9C,KAAK,IAAIF,IAAIE,EAAM,IAAIL,IAASK,EAAM,MAAM,IAAI,IAE/C,KACHR,EAAO,KAAK,UAAUC,EAAO,YAAY;CAE7C;CACA,OAAOD,EAAO,KAAK,GAAG;AACxB"}
1
+ {"version":3,"file":"preview.utils.js","names":["preparePreviewBoundaries","getAllocatedScopes","catalogRegions","placedRegions","sourcePanelIds","scope","getRegionCornerStyle","shouldEmphasizeReservedDestination","preview","corners","styles","corner","right","bottom","x","rect","y","regions","group","node"],"sources":["../../../../src/workspace/utils/presentation/preview.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Rect } from '@nvidia-elements/core/internal';\n\nimport { getAllocatedScopes } from '../placement/scope.utils.js';\n\nimport type { WorkspacePlacedRegion } from '../geometry/allocation.utils.js';\nimport type { WorkspaceDragPreview } from '../interaction/drag-preview.utils.js';\n\nexport interface PreviewBoundary {\n key: string;\n rect: Rect;\n style: string;\n}\n\nexport function preparePreviewBoundaries(\n catalogRegions: WorkspacePlacedRegion[],\n placedRegions: WorkspacePlacedRegion[],\n sourcePanelIds: string[]\n): PreviewBoundary[] {\n return getAllocatedScopes({\n catalog: catalogRegions,\n allocation: placedRegions,\n source: sourcePanelIds\n }).map(scope => ({\n ...scope,\n style: `left:${scope.rect.x}px;top:${scope.rect.y}px;width:${scope.rect.width}px;height:${scope.rect.height}px;${getRegionCornerStyle(scope.rect, placedRegions)}`\n }));\n}\n\nexport function shouldEmphasizeReservedDestination(preview: WorkspaceDragPreview) {\n return (\n !preview.blocked &&\n 'allocation' in preview &&\n preview.allocation === 'reserved' &&\n (preview.intent.kind === 'order' ||\n preview.intent.kind === 'insert' ||\n (preview.phase === 'detached' && preview.intent.kind === 'invalid' && preview.cue.kind === 'group'))\n );\n}\n\n/** Rounds only corners shared with the visible group geometry. */\nexport function getRegionCornerStyle(rect: Rect, regions: WorkspacePlacedRegion[]): string {\n const corners = [\n ['top-left', 0, 0],\n ['top-right', 1, 0],\n ['bottom-right', 1, 1],\n ['bottom-left', 0, 1]\n ] as const;\n const styles = ['border-radius:var(--_workspace-border-radius)'];\n for (const [corner, right, bottom] of corners) {\n const x = rect.x + right * rect.width;\n const y = rect.y + bottom * rect.height;\n const rounded = regions.some(\n ({ node, rect: group }) =>\n node.type === 'group' &&\n Math.abs(x - group.x - right * group.width) < 0.000001 &&\n Math.abs(y - group.y - bottom * group.height) < 0.000001\n );\n if (!rounded) {\n styles.push(`border-${corner}-radius:0px`);\n }\n }\n return styles.join(';');\n}\n"],"mappings":";;AAgBA,SAAgBA,EACd,GACA,GACA,GACmB;CACnB,OAAOC,EAAmB;EACxB,SAASC;EACT,YAAYC;EACZ,QAAQC;CACV,CAAC,CAAC,CAAC,KAAI,OAAU;EACf,GAAGC;EACH,OAAO,QAAQA,EAAM,KAAK,EAAE,SAASA,EAAM,KAAK,EAAE,WAAWA,EAAM,KAAK,MAAM,YAAYA,EAAM,KAAK,OAAO,KAAKC,EAAqBD,EAAM,MAAMF,CAAa;CACjK,EAAE;AACJ;AAEA,SAAgBI,EAAmC,GAA+B;CAChF,OACE,CAACC,EAAQ,WACT,gBAAgBA,KAChBA,EAAQ,eAAe,eACtBA,EAAQ,OAAO,SAAS,WACvBA,EAAQ,OAAO,SAAS,YACvBA,EAAQ,UAAU,cAAcA,EAAQ,OAAO,SAAS,aAAaA,EAAQ,IAAI,SAAS;AAEjG;AAGA,SAAgBF,EAAqB,GAAY,GAA0C;CACzF,IAAMG,IAAU;EACd;GAAC;GAAY;GAAG;EAAC;EACjB;GAAC;GAAa;GAAG;EAAC;EAClB;GAAC;GAAgB;GAAG;EAAC;EACrB;GAAC;GAAe;GAAG;EAAC;CACtB,GACMC,IAAS,CAAC,+CAA+C;CAC/D,KAAK,IAAM,CAACC,GAAQC,GAAOC,MAAWJ,GAAS;EAC7C,IAAMK,IAAIC,EAAK,IAAIH,IAAQG,EAAK,OAC1BC,IAAID,EAAK,IAAIF,IAASE,EAAK;EAOjC,AANgBE,EAAQ,MACrB,EAAE,SAAM,MAAMC,QACbC,EAAK,SAAS,WACd,KAAK,IAAIL,IAAII,EAAM,IAAIN,IAAQM,EAAM,KAAK,IAAI,QAC9C,KAAK,IAAIF,IAAIE,EAAM,IAAIL,IAASK,EAAM,MAAM,IAAI,IAE/C,KACHR,EAAO,KAAK,UAAUC,EAAO,YAAY;CAE7C;CACA,OAAOD,EAAO,KAAK,GAAG;AACxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.examples.js","names":["workspace_examples_default"],"sources":["../../src/workspace/workspace.examples.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html } from 'lit';\n\nimport '@nvidia-elements/core/button/define.js';\nimport '@nvidia-elements/core/dropdown/define.js';\nimport '@nvidia-elements/core/dropdown-group/define.js';\nimport '@nvidia-elements/core/icon/define.js';\nimport '@nvidia-elements/core/icon-button/define.js';\nimport '@nvidia-elements/core/menu/define.js';\nimport '@nvidia-elements/core/range/define.js';\nimport '@nvidia-elements/core/textarea/define.js';\nimport '@nvidia-elements/core/workspace/define.js';\n\nexport default { title: 'Elements/Workspace', component: 'nve-workspace' };\n\n/**\n * @summary Arrange panels in nested groups while retaining application content. Drag panel headers or tabs to move panels, group handles to move tabs together, and separators to resize.\n */\nexport const Default = {\n render: () => html`\n <nve-workspace\n groupable\n rearrangeable\n resizable\n style=\"height:600px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[1,4],\"children\":[{\"type\":\"group\",\"panels\":[\"workspace-outline\"],\"active\":\"workspace-outline\"},{\"type\":\"split\",\"axis\":\"vertical\",\"weights\":[3,2],\"children\":[{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[3,2],\"children\":[{\"type\":\"group\",\"panels\":[\"workspace-editor\"],\"active\":\"workspace-editor\"},{\"type\":\"group\",\"panels\":[\"workspace-preview\"],\"active\":\"workspace-preview\"}]},{\"type\":\"group\",\"panels\":[\"workspace-notes\",\"workspace-activity\",\"workspace-tasks\"],\"active\":\"workspace-notes\"}]}]}}'>\n <nve-workspace-panel id=\"workspace-outline\">\n <nve-workspace-panel-header>Outline</nve-workspace-panel-header>\n <nve-workspace-panel-content>Outline content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"workspace-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n <nve-workspace-panel-footer>Ready</nve-workspace-panel-footer>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"workspace-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"workspace-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"workspace-activity\">\n <nve-workspace-panel-header>Activity</nve-workspace-panel-header>\n <nve-workspace-panel-content>Activity content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"workspace-tasks\">\n <nve-workspace-panel-header>Tasks</nve-workspace-panel-header>\n <nve-workspace-panel-content>Tasks content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n `\n};\n\n/**\n * @summary Resize groups within a fixed arrangement and switch tabs while retaining application content.\n */\nexport const Resizable = {\n render: () => html`\n <nve-workspace\n resizable\n value='{\"version\":1,\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"editor\",\"notes\"],\"active\":\"editor\"},{\"type\":\"group\",\"panels\":[\"preview\"],\"active\":\"preview\"}]},\"closed\":[]}'\n style=\"height:420px\">\n <nve-workspace-panel id=\"editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n `\n};\n\n/**\n * @summary Rearrange panels while keeping tabbed panels together.\n */\nexport const Rearrangeable = {\n render: () => html`\n <nve-workspace\n rearrangeable\n resizable\n style=\"height:420px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"editor\",\"notes\"],\"active\":\"editor\"},{\"type\":\"group\",\"panels\":[\"preview\"],\"active\":\"preview\"}]}}'>\n <nve-workspace-panel id=\"editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n `\n};\n\n/**\n * @summary Join panels into tabbed groups or move individual tabs out.\n */\nexport const Groupable = {\n render: () => html`\n <div id=\"regroup-example\" nve-layout=\"column gap:md\">\n <nve-button>Reset layout</nve-button>\n <nve-workspace\n rearrangeable\n groupable\n resizable\n style=\"height:420px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"group-editor\",\"group-notes\"],\"active\":\"group-editor\"},{\"type\":\"group\",\"panels\":[\"group-preview\"],\"active\":\"group-preview\"}]}}'>\n <nve-workspace-panel id=\"group-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"group-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"group-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector('#regroup-example');\n const workspace = example.querySelector('nve-workspace');\n const initialValue = workspace.getAttribute('value');\n example.querySelector('nve-button').addEventListener('click', () => {\n workspace.value = initialValue;\n });\n </script>\n </div>\n `\n};\n\n/**\n * @summary Close and reopen panels while retaining their positions and application content.\n */\nexport const Closable = {\n render: () => html`\n <div id=\"open-close-example\" nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:wrap\">\n <nve-button id=\"reset-open-close\">Reset layout</nve-button>\n <div nve-layout=\"row gap:sm\">\n <nve-button command=\"--open\" commandfor=\"retained-editor\">Open editor</nve-button>\n <nve-button command=\"--close\" commandfor=\"retained-editor\">Close editor</nve-button>\n </div>\n </div>\n <nve-workspace\n closable\n groupable\n rearrangeable\n resizable\n style=\"height:420px\"\n value='{\"version\":1,\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"retained-editor\",\"retained-notes\"],\"active\":\"retained-editor\"},{\"type\":\"group\",\"panels\":[\"restorable-preview\"],\"active\":\"restorable-preview\"}]},\"closed\":[]}'>\n <nve-workspace-panel id=\"retained-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"restorable-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"retained-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector('#open-close-example');\n const workspace = example.querySelector('nve-workspace');\n const initialValue = workspace.getAttribute('value');\n example.querySelector('#reset-open-close').addEventListener('click', () => {\n workspace.value = initialValue;\n });\n </script>\n </div>\n `\n};\n\n/**\n * @summary Expand a group and its tabs to full screen.\n */\nexport const Fullscreenable = {\n render: () => html`\n <div id=\"fullscreen-example\" nve-layout=\"column gap:md\">\n <nve-button>Reset layout</nve-button>\n <nve-workspace\n fullscreenable\n closable\n rearrangeable\n groupable\n resizable\n style=\"height:420px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"fullscreen-editor\",\"fullscreen-notes\"],\"active\":\"fullscreen-editor\"},{\"type\":\"group\",\"panels\":[\"fullscreen-preview\"],\"active\":\"fullscreen-preview\"}]}}'>\n <nve-workspace-panel id=\"fullscreen-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"fullscreen-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"fullscreen-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector('#fullscreen-example');\n const workspace = example.querySelector('nve-workspace');\n const initialValue = workspace.getAttribute('value');\n example.querySelector('nve-button').addEventListener('click', () => {\n workspace.value = initialValue;\n });\n </script>\n </div>\n `\n};\n\n/**\n * @summary Add custom menus that use invoker commands to move, split, or close panels and toggle group fullscreen alongside application actions.\n */\n// eslint-disable-next-line local-typescript/example-template-size -- Keep the complete menu composition readable without compressing its markup.\nexport const CustomPanelActions = {\n render: () => html`\n <div nve-layout=\"column gap:md\">\n <nve-button id=\"a-reopen\" popovertarget=\"a-open\" disabled>Reopen</nve-button>\n <nve-workspace\n id=\"a-demo\"\n fullscreenable\n groupable\n rearrangeable\n closable\n resizable\n style=\"height:420px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"a-editor\",\"a-notes\"],\"active\":\"a-editor\"},{\"type\":\"group\",\"panels\":[\"a-preview\"],\"active\":\"a-preview\"}]}}'>\n <nve-workspace-panel id=\"a-editor\">\n <nve-workspace-panel-header>\n Editor\n <nve-icon-button slot=\"suffix\" icon-name=\"more-actions\" container=\"flat\" size=\"sm\"\n aria-label=\"Editor actions\" value=\"a-editor\" popovertarget=\"a-menu\"></nve-icon-button>\n </nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"a-notes\">\n <nve-workspace-panel-header>\n Notes\n <nve-icon-button slot=\"suffix\" icon-name=\"more-actions\" container=\"flat\" size=\"sm\"\n aria-label=\"Notes actions\" value=\"a-notes\" popovertarget=\"a-menu\"></nve-icon-button>\n </nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"a-preview\">\n <nve-workspace-panel-header>\n Preview\n <nve-icon-button slot=\"suffix\" icon-name=\"more-actions\" container=\"flat\" size=\"sm\"\n aria-label=\"Preview actions\" value=\"a-preview\" popovertarget=\"a-menu\"></nve-icon-button>\n </nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-dropdown-group>\n <nve-dropdown id=\"a-menu\">\n <nve-menu>\n <nve-menu-item command=\"--toggle-fullscreen\">Fullscreen</nve-menu-item>\n <nve-menu-item popovertarget=\"a-move\">\n Move to\n <nve-icon name=\"caret\" direction=\"right\" size=\"sm\" slot=\"suffix\"></nve-icon>\n </nve-menu-item>\n <nve-menu-item popovertarget=\"a-split\">\n Split\n <nve-icon name=\"caret\" direction=\"right\" size=\"sm\" slot=\"suffix\"></nve-icon>\n </nve-menu-item>\n <nve-menu-item command=\"--close\">Close</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n <nve-dropdown id=\"a-move\" position=\"right\">\n <nve-menu>\n <nve-menu-item command=\"--place\" data-target=\"a-editor\">Editor</nve-menu-item>\n <nve-menu-item command=\"--place\" data-target=\"a-notes\">Notes</nve-menu-item>\n <nve-menu-item command=\"--place\" data-target=\"a-preview\">Preview</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n <nve-dropdown id=\"a-open\" position=\"bottom\">\n <nve-menu>\n <nve-menu-item command=\"--open\" data-target=\"a-editor\">Editor</nve-menu-item>\n <nve-menu-item command=\"--open\" data-target=\"a-notes\">Notes</nve-menu-item>\n <nve-menu-item command=\"--open\" data-target=\"a-preview\">Preview</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n <nve-dropdown id=\"a-split\" position=\"right\">\n <nve-menu>\n <nve-menu-item command=\"--place\" data-side=\"left\">Left</nve-menu-item>\n <nve-menu-item command=\"--place\" data-side=\"right\">Right</nve-menu-item>\n <nve-menu-item command=\"--place\" data-side=\"top\">Above</nve-menu-item>\n <nve-menu-item command=\"--place\" data-side=\"bottom\">Below</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n </nve-dropdown-group>\n </nve-workspace>\n <script type=\"module\">\n const workspace = document.querySelector('#a-demo');\n const dropdownGroup = workspace.querySelector('nve-dropdown-group');\n const reopen = document.querySelector('#a-reopen');\n let panelId;\n\n function refresh() {\n const { root, closed } = JSON.parse(workspace.value);\n const labels = new Map(\n [...workspace.querySelectorAll(':scope > nve-workspace-panel')].map(panel => [\n panel.id,\n panel.querySelector('nve-workspace-panel-header').textContent.trim()\n ])\n );\n const groups = getOpenPanelGroups(root, labels, closed);\n const currentGroup = groups.find(ids => ids.includes(panelId));\n const splitTarget = currentGroup?.find(id => id !== panelId);\n\n updateMoveMenu(groups, currentGroup, labels);\n updateReopenMenu(closed, labels);\n\n for (const item of dropdownGroup.querySelectorAll('[command]')) {\n item.commandForElement = workspace;\n item.value = item.command === '--open' ? item.dataset.target : panelId;\n if (item.dataset.side) {\n item.placement = { operation: 'split', target: splitTarget, position: item.dataset.side };\n }\n item.disabled = item.style.display === 'none' || !workspace.isCommandAvailable(item.command, item);\n }\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 reopen.disabled = !closed.some(id => labels.has(id));\n }\n\n function getOpenPanelGroups(node, labels, closed) {\n if (!node) return [];\n if (node.type === 'group') {\n return [node.panels.filter(id => labels.has(id) && !closed.includes(id))];\n }\n return node.children.flatMap(child => getOpenPanelGroups(child, labels, closed));\n }\n\n function updateMoveMenu(groups, currentGroup, labels) {\n for (const item of dropdownGroup.querySelectorAll('#a-move [data-target]')) {\n const target = item.dataset.target;\n const members = groups.find(ids => ids[0] === target && ids !== currentGroup);\n item.style.display = members ? '' : 'none';\n item.placement = { operation: 'join', target };\n if (members) {\n item.textContent = members.map(id => labels.get(id)).join(', ');\n }\n }\n }\n\n function updateReopenMenu(closed, labels) {\n for (const item of dropdownGroup.querySelectorAll('#a-open [data-target]')) {\n const target = item.dataset.target;\n item.style.display = labels.has(target) && closed.includes(target) ? '' : 'none';\n }\n }\n\n dropdownGroup.addEventListener('beforetoggle', event => {\n if (event.newState !== 'open') return;\n if (event.target.id === 'a-menu') panelId = event.source?.value;\n refresh();\n }, true);\n workspace.addEventListener('commandavailabilitychange', refresh);\n workspace.addEventListener('command', () => dropdownGroup.close());\n </script>\n </div>\n `\n};\n\n/**\n * @summary Match the surrounding layout with inset, flat, or full container framing.\n * @tags test-case\n */\nexport const Container = {\n render: () => html`\n <div nve-layout=\"column gap:md\">\n <nve-workspace\n container=\"inset\"\n resizable\n style=\"height:220px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[1,1],\"children\":[{\"type\":\"group\",\"panels\":[\"container-inset\"],\"active\":\"container-inset\"},{\"type\":\"group\",\"panels\":[\"container-inset-preview\"],\"active\":\"container-inset-preview\"}]}}'>\n <nve-workspace-panel id=\"container-inset\">\n <nve-workspace-panel-header>Editor (inset)</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n <nve-workspace-panel-footer>Ready</nve-workspace-panel-footer>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"container-inset-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <nve-workspace\n container=\"flat\"\n resizable\n style=\"height:220px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[1,1],\"children\":[{\"type\":\"group\",\"panels\":[\"container-flat\"],\"active\":\"container-flat\"},{\"type\":\"group\",\"panels\":[\"container-flat-preview\"],\"active\":\"container-flat-preview\"}]}}'>\n <nve-workspace-panel id=\"container-flat\">\n <nve-workspace-panel-header>Editor (flat)</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n <nve-workspace-panel-footer>Ready</nve-workspace-panel-footer>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"container-flat-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <nve-workspace\n container=\"full\"\n resizable\n style=\"height:220px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[1,1],\"children\":[{\"type\":\"group\",\"panels\":[\"container-full\"],\"active\":\"container-full\"},{\"type\":\"group\",\"panels\":[\"container-full-preview\"],\"active\":\"container-full-preview\"}]}}'>\n <nve-workspace-panel id=\"container-full\">\n <nve-workspace-panel-header>Editor (full)</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n <nve-workspace-panel-footer>Ready</nve-workspace-panel-footer>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"container-full-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n </div>\n `\n};\n\n/**\n * @summary Customize header spacing, control sizes, and panel corners for a compact workspace.\n * @tags theme\n */\nexport const CustomHeaders = {\n render: () => html`\n <div id=\"compact-example\" nve-layout=\"column gap:md\">\n <nve-button>Reset layout</nve-button>\n <style>\n #condensed-workspace > nve-workspace-panel {\n --box-shadow: none;\n }\n #condensed-workspace nve-workspace-panel-header {\n --min-height: var(--nve-ref-size-800);\n --padding: var(--nve-ref-size-100) var(--nve-ref-size-100) var(--nve-ref-size-100) var(--nve-ref-size-250);\n }\n </style>\n <nve-workspace\n id=\"condensed-workspace\"\n rearrangeable\n groupable\n closable\n resizable\n fullscreenable\n style=\"--gap:0;--border-radius:0;--header-control-size:var(--nve-ref-size-600);--close-button-inset:var(--nve-ref-size-100);height:300px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"condensed-editor\",\"condensed-notes\"],\"active\":\"condensed-editor\"},{\"type\":\"group\",\"panels\":[\"condensed-preview\"],\"active\":\"condensed-preview\"}]}}'>\n <nve-workspace-panel id=\"condensed-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"condensed-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"condensed-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector('#compact-example');\n const workspace = example.querySelector('nve-workspace');\n const initialValue = workspace.getAttribute('value');\n example.querySelector('nve-button').addEventListener('click', () => {\n workspace.value = initialValue;\n });\n </script>\n </div>\n `\n};\n\n/**\n * @summary Save and restore groups, split proportions, and closed panels without recreating application content.\n */\nexport const SaveRestore = {\n render: () => html`\n <div nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:wrap\">\n <nve-button id=\"reset-arrangement\">Reset layout</nve-button>\n <div nve-layout=\"row gap:sm\">\n <nve-button id=\"save-arrangement\">Save layout</nve-button>\n <nve-button id=\"restore-arrangement\">Restore layout</nve-button>\n </div>\n </div>\n <nve-workspace\n id=\"saved-arrangement\"\n groupable\n rearrangeable\n closable\n resizable\n style=\"height:420px\"\n value='{\"version\":1,\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"saved-editor\",\"saved-notes\"],\"active\":\"saved-editor\"},{\"type\":\"group\",\"panels\":[\"saved-preview\"],\"active\":\"saved-preview\"}]},\"closed\":[]}'>\n <nve-workspace-panel id=\"saved-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"saved-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"saved-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const workspace = document.querySelector('#saved-arrangement');\n const save = document.querySelector('#save-arrangement');\n const restore = document.querySelector('#restore-arrangement');\n const reset = document.querySelector('#reset-arrangement');\n const initialValue = workspace.getAttribute('value');\n let savedValue = initialValue;\n save.addEventListener('click', () => {\n savedValue = workspace.value;\n });\n restore.addEventListener('click', () => {\n workspace.animateTo(savedValue);\n });\n reset.addEventListener('click', () => {\n workspace.animateTo(initialValue);\n });\n </script>\n </div>\n `\n};\n\n/**\n * @summary The workspace scrolls when panel minimum heights exceed the available space. Increasing its height restores resizing.\n * @tags test-case\n */\nexport const ConstrainedSpace = {\n render: () => html`\n <div id=\"constrained-example\" nve-layout=\"column gap:md\">\n <nve-range>\n <label>\n Workspace height:\n <output for=\"workspace-height\">180</output>\n px\n </label>\n <input id=\"workspace-height\" type=\"range\" min=\"180\" max=\"420\" value=\"180\" />\n </nve-range>\n <nve-button>Reset layout</nve-button>\n <nve-workspace\n groupable\n rearrangeable\n resizable\n style=\"height:180px\"\n value='{\"version\":1,\"root\":{\"type\":\"split\",\"axis\":\"vertical\",\"weights\":[1,1],\"children\":[{\"type\":\"group\",\"panels\":[\"top\"],\"active\":\"top\"},{\"type\":\"group\",\"panels\":[\"bottom\"],\"active\":\"bottom\"}]},\"closed\":[]}'>\n <nve-workspace-panel id=\"top\" min-height=\"110\">\n <nve-workspace-panel-header>Top</nve-workspace-panel-header>\n <nve-workspace-panel-content>Top content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"bottom\" min-height=\"110\">\n <nve-workspace-panel-header>Bottom</nve-workspace-panel-header>\n <nve-workspace-panel-content>Bottom content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector('#constrained-example');\n const workspace = example.querySelector('nve-workspace');\n const range = example.querySelector('input');\n const output = example.querySelector('output');\n const initialValue = workspace.getAttribute('value');\n const updateHeight = () => {\n workspace.style.height = range.value + 'px';\n output.value = range.value;\n };\n range.addEventListener('input', updateHeight);\n example.querySelector('nve-button').addEventListener('click', () => {\n workspace.value = initialValue;\n range.value = '180';\n updateHeight();\n });\n </script>\n </div>\n `\n};\n\n/**\n * @summary Keep tab titles readable in a narrow group with scrolling and keyboard selection.\n * @tags test-case\n */\nexport const TabOverflow = {\n render: () => html`\n <nve-workspace style=\"width:260px;height:260px\">\n ${[\n 'Editor',\n 'Preview',\n 'Terminal',\n 'Notes',\n 'Project outline',\n 'Recent activity',\n 'Task history',\n 'Search results'\n ].map(\n (title, index) => html`\n <nve-workspace-panel id=${`view-${index}`}>\n <nve-workspace-panel-header>${title}</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n ${title === 'Editor' ? html`<nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>` : `${title} content`}\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n `\n )}\n </nve-workspace>\n `\n};\n\n/**\n * @summary Adjust spacing between groups with --gap. Zero joins the group frames.\n * @tags test-case\n */\nexport const Gap = {\n render: () => html`\n <div id=\"workspace-gap-example\" nve-layout=\"column gap:md\">\n <nve-range>\n <label>\n Gap:\n <output for=\"workspace-gap-range\">0</output>\n px\n </label>\n <input id=\"workspace-gap-range\" type=\"range\" min=\"0\" max=\"24\" value=\"0\" />\n </nve-range>\n <nve-workspace\n container=\"full\"\n resizable\n style=\"--gap:0px;height:360px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[1,1],\"children\":[{\"type\":\"group\",\"panels\":[\"gap-editor\"],\"active\":\"gap-editor\"},{\"type\":\"group\",\"panels\":[\"gap-preview\"],\"active\":\"gap-preview\"}]}}'>\n <nve-workspace-panel id=\"gap-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"gap-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector('#workspace-gap-example');\n const workspace = example.querySelector('nve-workspace');\n const range = example.querySelector('input');\n const output = example.querySelector('output');\n range.addEventListener('input', () => {\n workspace.style.setProperty('--gap', range.value + 'px');\n output.value = range.value;\n });\n </script>\n </div>\n `\n};\n"],"mappings":";AAGA,IAAAA,IAAS"}
1
+ {"version":3,"file":"workspace.examples.js","names":["workspace_examples_default"],"sources":["../../src/workspace/workspace.examples.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html } from 'lit';\n\nimport '@nvidia-elements/core/button/define.js';\nimport '@nvidia-elements/core/dropdown/define.js';\nimport '@nvidia-elements/core/dropdown-group/define.js';\nimport '@nvidia-elements/core/icon/define.js';\nimport '@nvidia-elements/core/icon-button/define.js';\nimport '@nvidia-elements/core/menu/define.js';\nimport '@nvidia-elements/core/range/define.js';\nimport '@nvidia-elements/core/textarea/define.js';\nimport '@nvidia-elements/core/workspace/define.js';\n\nexport default { title: 'Elements/Workspace', component: 'nve-workspace' };\n\n/**\n * @summary Arrange panels in nested groups while retaining application content. Drag panel headers or tabs to move panels, group handles to move tabs together, and separators to resize.\n */\nexport const Default = {\n render: () => html`\n <nve-workspace\n groupable\n rearrangeable\n resizable\n style=\"height:600px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[1,4],\"children\":[{\"type\":\"group\",\"panels\":[\"workspace-outline\"],\"active\":\"workspace-outline\"},{\"type\":\"split\",\"axis\":\"vertical\",\"weights\":[3,2],\"children\":[{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[3,2],\"children\":[{\"type\":\"group\",\"panels\":[\"workspace-editor\"],\"active\":\"workspace-editor\"},{\"type\":\"group\",\"panels\":[\"workspace-preview\"],\"active\":\"workspace-preview\"}]},{\"type\":\"group\",\"panels\":[\"workspace-notes\",\"workspace-activity\",\"workspace-tasks\"],\"active\":\"workspace-notes\"}]}]}}'>\n <nve-workspace-panel id=\"workspace-outline\">\n <nve-workspace-panel-header>Outline</nve-workspace-panel-header>\n <nve-workspace-panel-content>Outline content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"workspace-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n <nve-workspace-panel-footer>Ready</nve-workspace-panel-footer>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"workspace-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"workspace-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"workspace-activity\">\n <nve-workspace-panel-header>Activity</nve-workspace-panel-header>\n <nve-workspace-panel-content>Activity content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"workspace-tasks\">\n <nve-workspace-panel-header>Tasks</nve-workspace-panel-header>\n <nve-workspace-panel-content>Tasks content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n `\n};\n\n/**\n * @summary Resize groups within a fixed arrangement and switch tabs while retaining application content.\n */\nexport const Resizable = {\n render: () => html`\n <nve-workspace\n resizable\n value='{\"version\":1,\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"editor\",\"notes\"],\"active\":\"editor\"},{\"type\":\"group\",\"panels\":[\"preview\"],\"active\":\"preview\"}]},\"closed\":[]}'\n style=\"height:420px\">\n <nve-workspace-panel id=\"editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n `\n};\n\n/**\n * @summary Rearrange panels while keeping tabbed panels together.\n */\nexport const Rearrangeable = {\n render: () => html`\n <nve-workspace\n rearrangeable\n resizable\n style=\"height:420px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"editor\",\"notes\"],\"active\":\"editor\"},{\"type\":\"group\",\"panels\":[\"preview\"],\"active\":\"preview\"}]}}'>\n <nve-workspace-panel id=\"editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n `\n};\n\n/**\n * @summary Join panels into tabbed groups or move individual tabs out.\n */\nexport const Groupable = {\n render: () => html`\n <div id=\"regroup-example\" nve-layout=\"column gap:md\">\n <nve-button>Reset layout</nve-button>\n <nve-workspace\n rearrangeable\n groupable\n resizable\n style=\"height:420px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"group-editor\",\"group-notes\"],\"active\":\"group-editor\"},{\"type\":\"group\",\"panels\":[\"group-preview\"],\"active\":\"group-preview\"}]}}'>\n <nve-workspace-panel id=\"group-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"group-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"group-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector('#regroup-example');\n const workspace = example.querySelector('nve-workspace');\n const initialValue = workspace.getAttribute('value');\n example.querySelector('nve-button').addEventListener('click', () => {\n workspace.value = initialValue;\n });\n </script>\n </div>\n `\n};\n\n/**\n * @summary Close and reopen panels while retaining their positions and application content.\n */\nexport const Closable = {\n render: () => html`\n <div id=\"open-close-example\" nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:wrap\">\n <nve-button id=\"reset-open-close\">Reset layout</nve-button>\n <div nve-layout=\"row gap:sm\">\n <nve-button command=\"--open\" commandfor=\"retained-editor\">Open editor</nve-button>\n <nve-button command=\"--close\" commandfor=\"retained-editor\">Close editor</nve-button>\n </div>\n </div>\n <nve-workspace\n closable\n groupable\n rearrangeable\n resizable\n style=\"height:420px\"\n value='{\"version\":1,\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"retained-editor\",\"retained-notes\"],\"active\":\"retained-editor\"},{\"type\":\"group\",\"panels\":[\"restorable-preview\"],\"active\":\"restorable-preview\"}]},\"closed\":[]}'>\n <nve-workspace-panel id=\"retained-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"restorable-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"retained-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector('#open-close-example');\n const workspace = example.querySelector('nve-workspace');\n const initialValue = workspace.getAttribute('value');\n example.querySelector('#reset-open-close').addEventListener('click', () => {\n workspace.value = initialValue;\n });\n </script>\n </div>\n `\n};\n\n/**\n * @summary Expand a group and its tabs to full screen.\n */\nexport const Fullscreenable = {\n render: () => html`\n <div id=\"fullscreen-example\" nve-layout=\"column gap:md\">\n <nve-button>Reset layout</nve-button>\n <nve-workspace\n fullscreenable\n closable\n rearrangeable\n groupable\n resizable\n style=\"height:420px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"fullscreen-editor\",\"fullscreen-notes\"],\"active\":\"fullscreen-editor\"},{\"type\":\"group\",\"panels\":[\"fullscreen-preview\"],\"active\":\"fullscreen-preview\"}]}}'>\n <nve-workspace-panel id=\"fullscreen-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"fullscreen-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"fullscreen-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector('#fullscreen-example');\n const workspace = example.querySelector('nve-workspace');\n const initialValue = workspace.getAttribute('value');\n example.querySelector('nve-button').addEventListener('click', () => {\n workspace.value = initialValue;\n });\n </script>\n </div>\n `\n};\n\n/**\n * @summary Add custom menus that use invoker commands to move, split, or close panels and toggle group fullscreen alongside application actions.\n */\n// eslint-disable-next-line local-typescript/example-template-size -- Keep the complete menu composition readable without compressing its markup.\nexport const CustomPanelActions = {\n render: () => html`\n <div nve-layout=\"column gap:md\">\n <nve-button id=\"a-reopen\" popovertarget=\"a-open\" disabled>Reopen</nve-button>\n <nve-workspace\n id=\"a-demo\"\n fullscreenable\n groupable\n rearrangeable\n closable\n resizable\n style=\"height:420px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"a-editor\",\"a-notes\"],\"active\":\"a-editor\"},{\"type\":\"group\",\"panels\":[\"a-preview\"],\"active\":\"a-preview\"}]}}'>\n <nve-workspace-panel id=\"a-editor\">\n <nve-workspace-panel-header>\n Editor\n <nve-icon-button slot=\"suffix\" icon-name=\"more-actions\" container=\"flat\" size=\"sm\"\n aria-label=\"Editor actions\" value=\"a-editor\" popovertarget=\"a-menu\"></nve-icon-button>\n </nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"a-notes\">\n <nve-workspace-panel-header>\n Notes\n <nve-icon-button slot=\"suffix\" icon-name=\"more-actions\" container=\"flat\" size=\"sm\"\n aria-label=\"Notes actions\" value=\"a-notes\" popovertarget=\"a-menu\"></nve-icon-button>\n </nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"a-preview\">\n <nve-workspace-panel-header>\n Preview\n <nve-icon-button slot=\"suffix\" icon-name=\"more-actions\" container=\"flat\" size=\"sm\"\n aria-label=\"Preview actions\" value=\"a-preview\" popovertarget=\"a-menu\"></nve-icon-button>\n </nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-dropdown-group>\n <nve-dropdown id=\"a-menu\">\n <nve-menu>\n <nve-menu-item command=\"--toggle-fullscreen\">Fullscreen</nve-menu-item>\n <nve-menu-item popovertarget=\"a-move\">\n Move to\n <nve-icon name=\"caret\" direction=\"right\" size=\"sm\" slot=\"suffix\"></nve-icon>\n </nve-menu-item>\n <nve-menu-item popovertarget=\"a-split\">\n Split\n <nve-icon name=\"caret\" direction=\"right\" size=\"sm\" slot=\"suffix\"></nve-icon>\n </nve-menu-item>\n <nve-menu-item command=\"--close\">Close</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n <nve-dropdown id=\"a-move\" position=\"right\">\n <nve-menu>\n <nve-menu-item command=\"--place\" data-target=\"a-editor\">Editor</nve-menu-item>\n <nve-menu-item command=\"--place\" data-target=\"a-notes\">Notes</nve-menu-item>\n <nve-menu-item command=\"--place\" data-target=\"a-preview\">Preview</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n <nve-dropdown id=\"a-open\" position=\"bottom\">\n <nve-menu>\n <nve-menu-item command=\"--open\" data-target=\"a-editor\">Editor</nve-menu-item>\n <nve-menu-item command=\"--open\" data-target=\"a-notes\">Notes</nve-menu-item>\n <nve-menu-item command=\"--open\" data-target=\"a-preview\">Preview</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n <nve-dropdown id=\"a-split\" position=\"right\">\n <nve-menu>\n <nve-menu-item command=\"--place\" data-side=\"left\">Left</nve-menu-item>\n <nve-menu-item command=\"--place\" data-side=\"right\">Right</nve-menu-item>\n <nve-menu-item command=\"--place\" data-side=\"top\">Above</nve-menu-item>\n <nve-menu-item command=\"--place\" data-side=\"bottom\">Below</nve-menu-item>\n </nve-menu>\n </nve-dropdown>\n </nve-dropdown-group>\n </nve-workspace>\n <script type=\"module\">\n const workspace = document.querySelector('#a-demo');\n const dropdownGroup = workspace.querySelector('nve-dropdown-group');\n const reopen = document.querySelector('#a-reopen');\n let panelId;\n\n function refresh() {\n const { root, closed } = JSON.parse(workspace.value);\n const labels = new Map(\n [...workspace.querySelectorAll(':scope > nve-workspace-panel')].map(panel => [\n panel.id,\n panel.querySelector('nve-workspace-panel-header').textContent.trim()\n ])\n );\n const groups = getOpenPanelGroups(root, labels, closed);\n const currentGroup = groups.find(ids => ids.includes(panelId));\n const splitTarget = currentGroup?.find(id => id !== panelId);\n\n updateMoveMenu(groups, currentGroup, labels);\n updateReopenMenu(closed, labels);\n\n for (const item of dropdownGroup.querySelectorAll('[command]')) {\n item.commandForElement = workspace;\n item.value = item.command === '--open' ? item.dataset.target : panelId;\n if (item.dataset.side) {\n item.placement = { operation: 'split', target: splitTarget, position: item.dataset.side };\n }\n item.disabled = item.style.display === 'none' || !workspace.isCommandAvailable(item.command, item);\n }\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 reopen.disabled = !closed.some(id => labels.has(id));\n }\n\n function getOpenPanelGroups(node, labels, closed) {\n if (!node) return [];\n if (node.type === 'group') {\n return [node.panels.filter(id => labels.has(id) && !closed.includes(id))];\n }\n return node.children.flatMap(child => getOpenPanelGroups(child, labels, closed));\n }\n\n function updateMoveMenu(groups, currentGroup, labels) {\n for (const item of dropdownGroup.querySelectorAll('#a-move [data-target]')) {\n const target = item.dataset.target;\n const members = groups.find(ids => ids[0] === target && ids !== currentGroup);\n item.style.display = members ? '' : 'none';\n item.placement = { operation: 'join', target };\n if (members) {\n item.textContent = members.map(id => labels.get(id)).join(', ');\n }\n }\n }\n\n function updateReopenMenu(closed, labels) {\n for (const item of dropdownGroup.querySelectorAll('#a-open [data-target]')) {\n const target = item.dataset.target;\n item.style.display = labels.has(target) && closed.includes(target) ? '' : 'none';\n }\n }\n\n dropdownGroup.addEventListener('beforetoggle', event => {\n if (event.newState !== 'open') return;\n if (event.target.id === 'a-menu') panelId = event.source?.value;\n refresh();\n }, true);\n workspace.addEventListener('commandavailabilitychange', refresh);\n workspace.addEventListener('command', () => dropdownGroup.close());\n </script>\n </div>\n `\n};\n\n/**\n * @summary Match the surrounding layout with inset, flat, or full container framing.\n * @tags test-case\n */\nexport const Container = {\n render: () => html`\n <div nve-layout=\"column gap:md\">\n <nve-workspace\n container=\"inset\"\n resizable\n style=\"height:220px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[1,1],\"children\":[{\"type\":\"group\",\"panels\":[\"container-inset\"],\"active\":\"container-inset\"},{\"type\":\"group\",\"panels\":[\"container-inset-preview\"],\"active\":\"container-inset-preview\"}]}}'>\n <nve-workspace-panel id=\"container-inset\">\n <nve-workspace-panel-header>Editor (inset)</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n <nve-workspace-panel-footer>Ready</nve-workspace-panel-footer>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"container-inset-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <nve-workspace\n container=\"flat\"\n resizable\n style=\"height:220px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[1,1],\"children\":[{\"type\":\"group\",\"panels\":[\"container-flat\"],\"active\":\"container-flat\"},{\"type\":\"group\",\"panels\":[\"container-flat-preview\"],\"active\":\"container-flat-preview\"}]}}'>\n <nve-workspace-panel id=\"container-flat\">\n <nve-workspace-panel-header>Editor (flat)</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n <nve-workspace-panel-footer>Ready</nve-workspace-panel-footer>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"container-flat-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <nve-workspace\n container=\"full\"\n resizable\n style=\"height:220px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[1,1],\"children\":[{\"type\":\"group\",\"panels\":[\"container-full\"],\"active\":\"container-full\"},{\"type\":\"group\",\"panels\":[\"container-full-preview\"],\"active\":\"container-full-preview\"}]}}'>\n <nve-workspace-panel id=\"container-full\">\n <nve-workspace-panel-header>Editor (full)</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n <nve-workspace-panel-footer>Ready</nve-workspace-panel-footer>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"container-full-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n </div>\n `\n};\n\n/**\n * @summary Customize spacing, controls, headers, and footers for a compact workspace.\n * @tags theme\n */\nexport const CompactStyling = {\n render: () => html`\n <div id=\"compact-example\" nve-layout=\"column gap:md\">\n <nve-button>Reset layout</nve-button>\n <style>\n #condensed-workspace > nve-workspace-panel {\n --box-shadow: none;\n }\n #condensed-workspace nve-workspace-panel-header {\n --min-height: var(--nve-ref-size-800);\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-workspace nve-workspace-panel-footer {\n --padding: var(--nve-ref-size-200) var(--nve-ref-size-250);\n }\n </style>\n <nve-workspace\n id=\"condensed-workspace\"\n rearrangeable\n groupable\n closable\n resizable\n fullscreenable\n style=\"--gap:0;--border-radius:0;--header-control-size:var(--nve-ref-size-600);--close-button-inset:var(--nve-ref-size-100);height:300px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"condensed-editor\",\"condensed-notes\"],\"active\":\"condensed-editor\"},{\"type\":\"group\",\"panels\":[\"condensed-preview\"],\"active\":\"condensed-preview\"}]}}'>\n <nve-workspace-panel id=\"condensed-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n <nve-workspace-panel-footer>\n <span nve-text=\"body sm trim:none\">Ready</span>\n </nve-workspace-panel-footer>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"condensed-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"condensed-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector('#compact-example');\n const workspace = example.querySelector('nve-workspace');\n const initialValue = workspace.getAttribute('value');\n example.querySelector('nve-button').addEventListener('click', () => {\n workspace.value = initialValue;\n });\n </script>\n </div>\n `\n};\n\n/**\n * @summary Save and restore groups, split proportions, and closed panels without recreating application content.\n */\nexport const SaveRestore = {\n render: () => html`\n <div nve-layout=\"column gap:md\">\n <div nve-layout=\"row gap:md align:space-between align:wrap\">\n <nve-button id=\"reset-arrangement\">Reset layout</nve-button>\n <div nve-layout=\"row gap:sm\">\n <nve-button id=\"save-arrangement\">Save layout</nve-button>\n <nve-button id=\"restore-arrangement\">Restore layout</nve-button>\n </div>\n </div>\n <nve-workspace\n id=\"saved-arrangement\"\n groupable\n rearrangeable\n closable\n resizable\n style=\"height:420px\"\n value='{\"version\":1,\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"saved-editor\",\"saved-notes\"],\"active\":\"saved-editor\"},{\"type\":\"group\",\"panels\":[\"saved-preview\"],\"active\":\"saved-preview\"}]},\"closed\":[]}'>\n <nve-workspace-panel id=\"saved-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"saved-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"saved-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const workspace = document.querySelector('#saved-arrangement');\n const save = document.querySelector('#save-arrangement');\n const restore = document.querySelector('#restore-arrangement');\n const reset = document.querySelector('#reset-arrangement');\n const initialValue = workspace.getAttribute('value');\n let savedValue = initialValue;\n save.addEventListener('click', () => {\n savedValue = workspace.value;\n });\n restore.addEventListener('click', () => {\n workspace.animateTo(savedValue);\n });\n reset.addEventListener('click', () => {\n workspace.animateTo(initialValue);\n });\n </script>\n </div>\n `\n};\n\n/**\n * @summary The workspace scrolls when panel minimum heights exceed the available space. Increasing its height restores resizing.\n * @tags test-case\n */\nexport const ConstrainedSpace = {\n render: () => html`\n <div id=\"constrained-example\" nve-layout=\"column gap:md\">\n <nve-range>\n <label>\n Workspace height:\n <output for=\"workspace-height\">180</output>\n px\n </label>\n <input id=\"workspace-height\" type=\"range\" min=\"180\" max=\"420\" value=\"180\" />\n </nve-range>\n <nve-button>Reset layout</nve-button>\n <nve-workspace\n groupable\n rearrangeable\n resizable\n style=\"height:180px\"\n value='{\"version\":1,\"root\":{\"type\":\"split\",\"axis\":\"vertical\",\"weights\":[1,1],\"children\":[{\"type\":\"group\",\"panels\":[\"top\"],\"active\":\"top\"},{\"type\":\"group\",\"panels\":[\"bottom\"],\"active\":\"bottom\"}]},\"closed\":[]}'>\n <nve-workspace-panel id=\"top\" min-height=\"110\">\n <nve-workspace-panel-header>Top</nve-workspace-panel-header>\n <nve-workspace-panel-content>Top content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"bottom\" min-height=\"110\">\n <nve-workspace-panel-header>Bottom</nve-workspace-panel-header>\n <nve-workspace-panel-content>Bottom content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector('#constrained-example');\n const workspace = example.querySelector('nve-workspace');\n const range = example.querySelector('input');\n const output = example.querySelector('output');\n const initialValue = workspace.getAttribute('value');\n const updateHeight = () => {\n workspace.style.height = range.value + 'px';\n output.value = range.value;\n };\n range.addEventListener('input', updateHeight);\n example.querySelector('nve-button').addEventListener('click', () => {\n workspace.value = initialValue;\n range.value = '180';\n updateHeight();\n });\n </script>\n </div>\n `\n};\n\n/**\n * @summary Keep tab titles readable in a narrow group with scrolling and keyboard selection.\n * @tags test-case\n */\nexport const TabOverflow = {\n render: () => html`\n <nve-workspace style=\"width:260px;height:260px\">\n ${[\n 'Editor',\n 'Preview',\n 'Terminal',\n 'Notes',\n 'Project outline',\n 'Recent activity',\n 'Task history',\n 'Search results'\n ].map(\n (title, index) => html`\n <nve-workspace-panel id=${`view-${index}`}>\n <nve-workspace-panel-header>${title}</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n ${title === 'Editor' ? html`<nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>` : `${title} content`}\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n `\n )}\n </nve-workspace>\n `\n};\n\n/**\n * @summary Adjust spacing between groups with --gap. Zero joins the group frames.\n * @tags test-case\n */\nexport const Gap = {\n render: () => html`\n <div id=\"workspace-gap-example\" nve-layout=\"column gap:md\">\n <nve-range>\n <label>\n Gap:\n <output for=\"workspace-gap-range\">0</output>\n px\n </label>\n <input id=\"workspace-gap-range\" type=\"range\" min=\"0\" max=\"24\" value=\"0\" />\n </nve-range>\n <nve-workspace\n container=\"full\"\n resizable\n style=\"--gap:0px;height:360px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[1,1],\"children\":[{\"type\":\"group\",\"panels\":[\"gap-editor\"],\"active\":\"gap-editor\"},{\"type\":\"group\",\"panels\":[\"gap-preview\"],\"active\":\"gap-preview\"}]}}'>\n <nve-workspace-panel id=\"gap-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"gap-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector('#workspace-gap-example');\n const workspace = example.querySelector('nve-workspace');\n const range = example.querySelector('input');\n const output = example.querySelector('output');\n range.addEventListener('input', () => {\n workspace.style.setProperty('--gap', range.value + 'px');\n output.value = range.value;\n });\n </script>\n </div>\n `\n};\n"],"mappings":";AAGA,IAAAA,IAAS"}
@@ -77,10 +77,10 @@
77
77
  ]
78
78
  },
79
79
  {
80
- "id": "workspace-custom-headers",
81
- "name": "CustomHeaders",
82
- "template": "<div id=\"compact-example\" nve-layout=\"column gap:md\">\n <nve-button>Reset layout</nve-button>\n <style>\n #condensed-workspace > nve-workspace-panel {\n --box-shadow: none;\n }\n #condensed-workspace nve-workspace-panel-header {\n --min-height: var(--nve-ref-size-800);\n --padding: var(--nve-ref-size-100) var(--nve-ref-size-100) var(--nve-ref-size-100) var(--nve-ref-size-250);\n }\n </style>\n <nve-workspace\n id=\"condensed-workspace\"\n rearrangeable\n groupable\n closable\n resizable\n fullscreenable\n style=\"--gap: 0; --border-radius: 0; --header-control-size: var(--nve-ref-size-600); --close-button-inset: var(--nve-ref-size-100); height: 300px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"condensed-editor\",\"condensed-notes\"],\"active\":\"condensed-editor\"},{\"type\":\"group\",\"panels\":[\"condensed-preview\"],\"active\":\"condensed-preview\"}]}}'\n >\n <nve-workspace-panel id=\"condensed-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"condensed-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"condensed-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector(\"#compact-example\");\n const workspace = example.querySelector(\"nve-workspace\");\n const initialValue = workspace.getAttribute(\"value\");\n example.querySelector(\"nve-button\").addEventListener(\"click\", () => {\n workspace.value = initialValue;\n });\n </script>\n</div>\n",
83
- "summary": "Customize header spacing, control sizes, and panel corners for a compact workspace.",
80
+ "id": "workspace-compact-styling",
81
+ "name": "CompactStyling",
82
+ "template": "<div id=\"compact-example\" nve-layout=\"column gap:md\">\n <nve-button>Reset layout</nve-button>\n <style>\n #condensed-workspace > nve-workspace-panel {\n --box-shadow: none;\n }\n #condensed-workspace nve-workspace-panel-header {\n --min-height: var(--nve-ref-size-800);\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-workspace nve-workspace-panel-footer {\n --padding: var(--nve-ref-size-200) var(--nve-ref-size-250);\n }\n </style>\n <nve-workspace\n id=\"condensed-workspace\"\n rearrangeable\n groupable\n closable\n resizable\n fullscreenable\n style=\"--gap: 0; --border-radius: 0; --header-control-size: var(--nve-ref-size-600); --close-button-inset: var(--nve-ref-size-100); height: 300px\"\n value='{\"version\":1,\"closed\":[],\"root\":{\"type\":\"split\",\"axis\":\"horizontal\",\"weights\":[2,1],\"children\":[{\"type\":\"group\",\"panels\":[\"condensed-editor\",\"condensed-notes\"],\"active\":\"condensed-editor\"},{\"type\":\"group\",\"panels\":[\"condensed-preview\"],\"active\":\"condensed-preview\"}]}}'\n >\n <nve-workspace-panel id=\"condensed-editor\">\n <nve-workspace-panel-header>Editor</nve-workspace-panel-header>\n <nve-workspace-panel-content>\n <nve-textarea><textarea aria-label=\"Editor\">Editor content</textarea></nve-textarea>\n </nve-workspace-panel-content>\n <nve-workspace-panel-footer>\n <span nve-text=\"body sm trim:none\">Ready</span>\n </nve-workspace-panel-footer>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"condensed-notes\">\n <nve-workspace-panel-header>Notes</nve-workspace-panel-header>\n <nve-workspace-panel-content>Notes content</nve-workspace-panel-content>\n </nve-workspace-panel>\n <nve-workspace-panel id=\"condensed-preview\">\n <nve-workspace-panel-header>Preview</nve-workspace-panel-header>\n <nve-workspace-panel-content>Preview content</nve-workspace-panel-content>\n </nve-workspace-panel>\n </nve-workspace>\n <script type=\"module\">\n const example = document.querySelector(\"#compact-example\");\n const workspace = example.querySelector(\"nve-workspace\");\n const initialValue = workspace.getAttribute(\"value\");\n example.querySelector(\"nve-button\").addEventListener(\"click\", () => {\n workspace.value = initialValue;\n });\n </script>\n</div>\n",
83
+ "summary": "Customize spacing, controls, headers, and footers for a compact workspace.",
84
84
  "description": "",
85
85
  "composition": true,
86
86
  "tags": [
@@ -1,5 +1,5 @@
1
1
  // src/workspace/workspace.css?inline
2
- var e = ":host{--gap: var(--nve-ref-size-150);--border-radius: var(--nve-ref-border-radius-lg);--tab-min-width: calc(3 * var(--nve-ref-size-1000));--tab-border: var(--nve-ref-border-width-sm) solid var(--nve-ref-border-color-muted);--close-button-inset: var(--nve-ref-size-200);--header-control-size: var(--nve-ref-size-700);--header-control-inset: var(--nve-ref-size-100);--_workspace-border-radius: var(--border-radius);--animation-duration: var(--nve-ref-animation-duration-150);--animation-easing: var(--nve-ref-animation-easing-100);--_placement-reserved-background: color-mix(in srgb, var(--nve-sys-accent-secondary-background) 28%, transparent);--gutter-background: transparent;--gutter-hover-background: var(--nve-sys-accent-secondary-background);display:grid;width:100%;width:stretch;grid-template-rows:minmax(0,1fr)}[internal-host]{position:relative;display:grid;grid-template-rows:minmax(0,1fr);min-width:0;min-height:0;contain:size;contain-intrinsic-block-size:var(--_minimum-height, 0)}.viewport{position:relative;min-width:0;min-height:0;overflow:auto}.canvas{width:100%;height:100%;position:relative;overflow:clip}::slotted(nve-workspace-panel){position:absolute}::slotted(nve-workspace-panel:not(:state(workspace-presented))){display:none!important}.group-chrome{position:absolute;overflow:clip;border-radius:var(--_workspace-border-radius);pointer-events:none}.tabs{direction:ltr;position:relative;display:flex;pointer-events:auto;background:var(--nve-sys-layer-container-background)}.tabs[data-carried-reservation]{visibility:hidden}.tablist{position:relative;flex:none;min-width:0;overflow:clip}.tablist[data-scrollable]{overflow:auto hidden;scrollbar-color:var(--nve-sys-scrollbar-thumb-color) var(--nve-sys-scrollbar-track-color);scrollbar-width:var(--nve-sys-scrollbar-width)}.tab-track{position:relative;height:100%;display:block;--gap: 0;--indicator-border-radius: var(--nve-ref-border-radius-none)}[internal-host][data-resizing] .tab-track,[internal-host][data-rearranging] .tab-track{--indicator-animation-duration: 0ms}.tab-entry{--padding: 0;--gap: 0;--border-radius: var(--nve-ref-border-radius-none)}:host([closable]) .tab-entry{--padding: 0 var(--close-button-inset) 0 0}.tab-entry nve-tabs-item{--padding: 0 var(--nve-ref-size-200)}.tablist .tab-entry{position:absolute;top:0;height:100%;--width: 100%;box-sizing:border-box}.tablist .tab-entry+.tab-entry,.tabs>nve-drag-handle+.tablist .tab-entry:first-child{border-inline-start:var(--tab-border)}[data-carried-tab]{visibility:hidden}[internal-host][data-rearranging] .tablist .tab-entry{transition:left var(--animation-duration) var(--animation-easing),width var(--animation-duration) var(--animation-easing)}.panel-entry{padding:var(--padding);display:flex;align-items:center}.panel-title{display:flex;align-items:center;flex:1;min-width:0;height:100%;box-sizing:border-box;padding:0 var(--nve-ref-size-200);overflow:hidden;white-space:nowrap;color:var(--nve-sys-text-emphasis-color);font-size:var(--nve-ref-font-size-100);font-weight:var(--nve-ref-font-weight-semibold);line-height:var(--nve-ref-font-size-500)}.fallback-title{display:block;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host([rearrangeable][groupable]) .tabs nve-tabs-item,:host([rearrangeable]) .tabs .panel-title{--cursor: grab;cursor:grab;touch-action:pan-x}.tabs nve-drag-handle{flex:0 0 auto;--cursor: grab;--height: 100%;--border-radius: var(--nve-ref-border-radius-none);touch-action:none}:is(.tabs,.chrome) nve-drag-handle{--width: calc(var(--header-control-size) + 2 * var(--header-control-inset))}nve-icon-button:is([part~=close-button],[part~=fullscreen-button]){--width: var(--header-control-size);--height: var(--header-control-size)}.group-actions{display:flex;align-items:center;flex:none;padding-inline:var(--header-control-inset) calc(var(--header-control-inset) + var(--nve-ref-border-width-sm));border-inline-start:var(--tab-border);box-sizing:border-box}.group-actions[data-authored-suffix]{border-inline-start-color:transparent}.gutter{position:absolute;background:var(--gutter-background);pointer-events:none}nve-resize-handle{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:auto;--background: transparent}nve-resize-handle:hover:not(:state(active))::part(_line){background:var(--gutter-hover-background)}.preview-layer{position:absolute;inset:0;overflow:clip;pointer-events:none;z-index:6}.destination{position:absolute;inset:0 auto auto 0;pointer-events:none;z-index:6;box-sizing:border-box;--background: transparent;background-color:color-mix(in srgb,var(--nve-sys-accent-secondary-background) 16%,transparent);border-radius:var(--border-radius);transition:background-color var(--animation-duration) var(--animation-easing),transform var(--animation-duration) var(--animation-easing),width var(--animation-duration) var(--animation-easing),height var(--animation-duration) var(--animation-easing)}.destination[data-reserved-placement]{background-color:var(--_placement-reserved-background)}.destination[data-cue-clipped]{visibility:hidden}.destination[data-drop-blocked]{--border: 2px solid var(--nve-sys-support-danger-emphasis-color)}.destination nve-icon{position:absolute;inset:var(--nve-ref-space-sm) auto auto var(--nve-ref-space-sm)}.carried{position:absolute;z-index:8;pointer-events:none;white-space:nowrap;--background: var(--nve-sys-layer-container-background);--border: var(--nve-ref-border-width-sm) solid var(--nve-sys-accent-secondary-background)}.context-boundary{position:absolute;box-sizing:border-box;pointer-events:none;opacity:0;box-shadow:inset 0 0 0 var(--nve-ref-border-width-md) var(--nve-sys-accent-secondary-background);z-index:4}.context-boundary[data-active]{opacity:1}.order-overlay{position:absolute;pointer-events:none;background:var(--_placement-reserved-background);z-index:7}.seam-badge{position:absolute;box-sizing:border-box;display:grid;place-items:center;width:var(--nve-ref-size-800);height:var(--nve-ref-size-800);border:var(--nve-ref-border-width-sm) solid var(--nve-ref-border-color-muted);border-radius:var(--nve-ref-border-radius-full);background:var(--nve-sys-layer-container-background);color:var(--nve-sys-accent-secondary-background);transform:translate(-50%,-50%);pointer-events:none}.seam-badge>svg{display:block;width:var(--nve-ref-size-500);height:var(--nve-ref-size-500);overflow:visible;pointer-events:none}[internal-host][data-rearranging] .context-boundary,[internal-host][data-rearranging] .group-chrome,[internal-host][data-rearranging] ::slotted(nve-workspace-panel){transition:left var(--animation-duration) var(--animation-easing),top var(--animation-duration) var(--animation-easing),width var(--animation-duration) var(--animation-easing),height var(--animation-duration) var(--animation-easing)}.chrome{animation-duration:var(--animation-duration);animation-timing-function:var(--animation-easing);position:absolute;visibility:hidden;pointer-events:none;width:max-content}.gap-probe{position:absolute;width:max(0px,var(--gap));height:0}.tab-min-probe{position:absolute;width:max(0px,var(--tab-min-width));height:0}.chrome-header{align-items:center;min-height:calc(var(--nve-ref-size-1000) + var(--nve-ref-size-200));direction:ltr;display:flex}:host(:fullscreen){width:100%;height:100%;background:var(--nve-sys-layer-container-background)}:host([container=\"flat\"]) .tabs{background:transparent}:host([container=\"flat\"]),:host([container=\"full\"]){--_workspace-border-radius: var(--nve-ref-border-radius-none)}";
2
+ var e = ":host{--gap: var(--nve-ref-size-150);--border-radius: var(--nve-ref-border-radius-lg);--tab-min-width: calc(3 * var(--nve-ref-size-1000));--tab-border: var(--nve-ref-border-width-sm) solid var(--nve-ref-border-color-muted);--close-button-inset: var(--nve-ref-size-200);--header-control-size: var(--nve-ref-size-700);--header-control-inset: var(--nve-ref-size-100);--_workspace-border-radius: var(--border-radius);--animation-duration: var(--nve-ref-animation-duration-150);--animation-easing: var(--nve-ref-animation-easing-100);--_placement-reserved-background: color-mix(in srgb, var(--nve-sys-accent-secondary-background) 28%, transparent);--gutter-background: transparent;--gutter-hover-background: var(--nve-sys-accent-secondary-background);display:grid;width:100%;width:stretch;grid-template-rows:minmax(0,1fr)}[internal-host]{position:relative;display:grid;grid-template-rows:minmax(0,1fr);min-width:0;min-height:0;contain:size;contain-intrinsic-block-size:var(--_minimum-height, 0)}.viewport{position:relative;min-width:0;min-height:0;overflow:auto}.canvas{width:100%;height:100%;position:relative;overflow:clip}::slotted(nve-workspace-panel){position:absolute}::slotted(nve-workspace-panel:not(:state(workspace-presented))){display:none!important}.group-chrome{position:absolute;overflow:clip;border-radius:var(--_workspace-border-radius);pointer-events:none}.tabs{direction:ltr;position:relative;display:flex;pointer-events:auto;background:var(--nve-sys-layer-container-background)}.tabs[data-carried-reservation]{visibility:hidden}.tablist{position:relative;flex:none;min-width:0;overflow:clip}.tablist[data-scrollable]{overflow:auto hidden;scrollbar-color:var(--nve-sys-scrollbar-thumb-color) var(--nve-sys-scrollbar-track-color);scrollbar-width:var(--nve-sys-scrollbar-width)}.tab-track{position:relative;height:100%;display:block;--gap: 0;--indicator-border-radius: var(--nve-ref-border-radius-none)}[internal-host][data-resizing] .tab-track,[internal-host][data-rearranging] .tab-track{--indicator-animation-duration: 0ms}.tab-entry{--padding: 0;--gap: 0;--border-radius: var(--nve-ref-border-radius-none)}:host([closable]) .tab-entry{--padding: 0 var(--close-button-inset) 0 0}.tab-entry nve-tabs-item{--padding: 0 var(--nve-ref-size-200)}.tablist .tab-entry{position:absolute;top:0;height:100%;--width: 100%;box-sizing:border-box}.tablist .tab-entry+.tab-entry,.tabs>nve-drag-handle+.tablist .tab-entry:first-child{border-inline-start:var(--tab-border)}[data-carried-tab]{visibility:hidden}[internal-host][data-rearranging] .tablist .tab-entry{transition:left var(--animation-duration) var(--animation-easing),width var(--animation-duration) var(--animation-easing)}.panel-entry{padding:var(--padding);display:flex;align-items:center}.panel-title{display:flex;align-items:center;flex:1;min-width:0;height:100%;box-sizing:border-box;padding:0 var(--nve-ref-size-200);overflow:hidden;white-space:nowrap;color:var(--nve-sys-text-emphasis-color);font-size:var(--nve-ref-font-size-100);font-weight:var(--nve-ref-font-weight-semibold);line-height:var(--nve-ref-font-size-500)}.fallback-title{display:block;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host([rearrangeable][groupable]) .tabs nve-tabs-item,:host([rearrangeable]) .tabs .panel-title{--cursor: grab;cursor:grab;touch-action:pan-x}.tabs nve-drag-handle{flex:0 0 auto;--cursor: grab;--height: 100%;--border-radius: var(--nve-ref-border-radius-none);touch-action:none}:is(.tabs,.chrome) nve-drag-handle{--width: calc(var(--header-control-size) + 2 * var(--header-control-inset))}nve-icon-button:is([part~=close-button],[part~=fullscreen-button]){--width: var(--header-control-size);--height: var(--header-control-size)}.group-actions{display:flex;align-items:center;flex:none;padding-inline:var(--header-control-inset) calc(var(--header-control-inset) + var(--nve-ref-border-width-sm));border-inline-start:var(--tab-border);box-sizing:border-box}.group-actions[data-authored-suffix]{border-inline-start-color:transparent}.gutter{position:absolute;background:var(--gutter-background);pointer-events:none}nve-resize-handle{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:auto;--background: transparent}nve-resize-handle:hover:not(:state(active))::part(_line){background:var(--gutter-hover-background)}.preview-layer{position:absolute;inset:0;overflow:clip;pointer-events:none;z-index:6}.destination{position:absolute;inset:0 auto auto 0;pointer-events:none;z-index:6;box-sizing:border-box;--background: transparent;background-color:color-mix(in srgb,var(--nve-sys-accent-secondary-background) 16%,transparent);border-radius:var(--border-radius);transition:background-color var(--animation-duration) var(--animation-easing),transform var(--animation-duration) var(--animation-easing),width var(--animation-duration) var(--animation-easing),height var(--animation-duration) var(--animation-easing)}.destination[data-reserved-placement]{background-color:var(--_placement-reserved-background)}.destination[data-cue-clipped]{visibility:hidden}.destination[data-drop-blocked]{--border: 2px solid var(--nve-sys-support-danger-emphasis-color)}.destination nve-icon{position:absolute;inset:var(--nve-ref-space-sm) auto auto var(--nve-ref-space-sm)}.carried{position:absolute;z-index:8;pointer-events:none;white-space:nowrap;--background: var(--nve-sys-layer-container-background);--border: var(--nve-ref-border-width-sm) solid var(--nve-sys-accent-secondary-background)}.scope-boundary{position:absolute;box-sizing:border-box;pointer-events:none;opacity:0;box-shadow:inset 0 0 0 var(--nve-ref-border-width-md) var(--nve-sys-accent-secondary-background);z-index:4}.scope-boundary[data-active]{opacity:1}.order-overlay{position:absolute;pointer-events:none;background:var(--_placement-reserved-background);z-index:7}.seam-badge{position:absolute;box-sizing:border-box;display:grid;place-items:center;width:var(--nve-ref-size-800);height:var(--nve-ref-size-800);border:var(--nve-ref-border-width-sm) solid var(--nve-ref-border-color-muted);border-radius:var(--nve-ref-border-radius-full);background:var(--nve-sys-layer-container-background);color:var(--nve-sys-accent-secondary-background);transform:translate(-50%,-50%);pointer-events:none}.seam-badge>svg{display:block;width:var(--nve-ref-size-500);height:var(--nve-ref-size-500);overflow:visible;pointer-events:none}[internal-host][data-rearranging] .scope-boundary,[internal-host][data-rearranging] .group-chrome,[internal-host][data-rearranging] ::slotted(nve-workspace-panel){transition:left var(--animation-duration) var(--animation-easing),top var(--animation-duration) var(--animation-easing),width var(--animation-duration) var(--animation-easing),height var(--animation-duration) var(--animation-easing)}.chrome{animation-duration:var(--animation-duration);animation-timing-function:var(--animation-easing);position:absolute;visibility:hidden;pointer-events:none;width:max-content}.gap-probe{position:absolute;width:max(0px,var(--gap));height:0}.tab-min-probe{position:absolute;width:max(0px,var(--tab-min-width));height:0}.chrome-header{align-items:center;min-height:calc(var(--nve-ref-size-1000) + var(--nve-ref-size-200));direction:ltr;display:flex}:host(:fullscreen){width:100%;height:100%;background:var(--nve-sys-layer-container-background)}:host([container=\"flat\"]) .tabs{background:transparent}:host([container=\"flat\"]),:host([container=\"full\"]){--_workspace-border-radius: var(--nve-ref-border-radius-none)}";
3
3
  export { e as default };
4
4
 
5
5
  //# sourceMappingURL=workspace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.js","names":["workspace_default"],"sources":["../../src/workspace/workspace.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 --gap: var(--nve-ref-size-150);\n --border-radius: var(--nve-ref-border-radius-lg);\n --tab-min-width: calc(3 * var(--nve-ref-size-1000));\n --tab-border: var(--nve-ref-border-width-sm) solid var(--nve-ref-border-color-muted);\n --close-button-inset: var(--nve-ref-size-200);\n --header-control-size: var(--nve-ref-size-700);\n --header-control-inset: var(--nve-ref-size-100);\n --_workspace-border-radius: var(--border-radius);\n --animation-duration: var(--nve-ref-animation-duration-150);\n --animation-easing: var(--nve-ref-animation-easing-100);\n --_placement-reserved-background: color-mix(in srgb, var(--nve-sys-accent-secondary-background) 28%, transparent);\n --gutter-background: transparent;\n --gutter-hover-background: var(--nve-sys-accent-secondary-background);\n display: grid;\n width: 100%; /* fallback safari */\n width: stretch;\n grid-template-rows: minmax(0, 1fr);\n}\n\n[internal-host] {\n position: relative;\n display: grid;\n grid-template-rows: minmax(0, 1fr);\n min-width: 0;\n min-height: 0;\n contain: size;\n contain-intrinsic-block-size: var(--_minimum-height, 0);\n}\n\n.viewport {\n position: relative;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n}\n\n.canvas {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: clip;\n}\n\n::slotted(nve-workspace-panel) {\n position: absolute;\n}\n\n::slotted(nve-workspace-panel:not(:state(workspace-presented))) {\n display: none !important;\n}\n\n.group-chrome {\n position: absolute;\n overflow: clip;\n border-radius: var(--_workspace-border-radius);\n pointer-events: none;\n}\n\n.tabs {\n direction: ltr;\n position: relative;\n display: flex;\n pointer-events: auto;\n background: var(--nve-sys-layer-container-background);\n}\n\n.tabs[data-carried-reservation] {\n visibility: hidden;\n}\n\n.tablist {\n position: relative;\n flex: none;\n min-width: 0;\n overflow: clip;\n}\n\n.tablist[data-scrollable] {\n overflow: auto hidden;\n scrollbar-color: var(--nve-sys-scrollbar-thumb-color) var(--nve-sys-scrollbar-track-color);\n scrollbar-width: var(--nve-sys-scrollbar-width);\n}\n\n.tab-track {\n position: relative;\n height: 100%;\n display: block;\n --gap: 0;\n --indicator-border-radius: var(--nve-ref-border-radius-none);\n}\n\n[internal-host][data-resizing] .tab-track,\n[internal-host][data-rearranging] .tab-track {\n --indicator-animation-duration: 0ms;\n}\n\n.tab-entry {\n --padding: 0;\n --gap: 0;\n --border-radius: var(--nve-ref-border-radius-none);\n}\n\n:host([closable]) .tab-entry {\n --padding: 0 var(--close-button-inset) 0 0;\n}\n\n.tab-entry nve-tabs-item {\n --padding: 0 var(--nve-ref-size-200);\n}\n\n.tablist .tab-entry {\n position: absolute;\n top: 0;\n height: 100%;\n --width: 100%;\n box-sizing: border-box;\n}\n\n.tablist .tab-entry + .tab-entry,\n.tabs > nve-drag-handle + .tablist .tab-entry:first-child {\n border-inline-start: var(--tab-border);\n}\n\n[data-carried-tab] {\n visibility: hidden;\n}\n\n[internal-host][data-rearranging] .tablist .tab-entry {\n transition:\n left var(--animation-duration) var(--animation-easing),\n width var(--animation-duration) var(--animation-easing);\n}\n\n.panel-entry {\n padding: var(--padding);\n display: flex;\n align-items: center;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n height: 100%;\n box-sizing: border-box;\n padding: 0 var(--nve-ref-size-200);\n overflow: hidden;\n white-space: nowrap;\n color: var(--nve-sys-text-emphasis-color);\n font-size: var(--nve-ref-font-size-100);\n font-weight: var(--nve-ref-font-weight-semibold);\n line-height: var(--nve-ref-font-size-500);\n}\n\n.fallback-title {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n:host([rearrangeable][groupable]) .tabs nve-tabs-item,\n:host([rearrangeable]) .tabs .panel-title {\n --cursor: grab;\n cursor: grab;\n touch-action: pan-x;\n}\n\n.tabs nve-drag-handle {\n flex: 0 0 auto;\n --cursor: grab;\n --height: 100%;\n --border-radius: var(--nve-ref-border-radius-none);\n touch-action: none;\n}\n\n:is(.tabs, .chrome) nve-drag-handle {\n --width: calc(var(--header-control-size) + 2 * var(--header-control-inset));\n}\n\nnve-icon-button:is([part~='close-button'], [part~='fullscreen-button']) {\n --width: var(--header-control-size);\n --height: var(--header-control-size);\n}\n\n.group-actions {\n display: flex;\n align-items: center;\n flex: none;\n padding-inline: var(--header-control-inset) calc(var(--header-control-inset) + var(--nve-ref-border-width-sm));\n border-inline-start: var(--tab-border);\n box-sizing: border-box;\n}\n\n.group-actions[data-authored-suffix] {\n /* Keep the measured control width while the authored suffix supplies the divider. */\n border-inline-start-color: transparent;\n}\n\n.gutter {\n position: absolute;\n background: var(--gutter-background);\n pointer-events: none;\n}\n\nnve-resize-handle {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n pointer-events: auto;\n --background: transparent;\n}\n\nnve-resize-handle:hover:not(:state(active))::part(_line) {\n background: var(--gutter-hover-background);\n}\n\n.preview-layer {\n position: absolute;\n inset: 0;\n overflow: clip;\n pointer-events: none;\n z-index: 6;\n}\n\n.destination {\n position: absolute;\n inset: 0 auto auto 0;\n pointer-events: none;\n z-index: 6;\n box-sizing: border-box;\n --background: transparent;\n background-color: color-mix(in srgb, var(--nve-sys-accent-secondary-background) 16%, transparent);\n border-radius: var(--border-radius);\n transition:\n background-color var(--animation-duration) var(--animation-easing),\n transform var(--animation-duration) var(--animation-easing),\n width var(--animation-duration) var(--animation-easing),\n height var(--animation-duration) var(--animation-easing);\n}\n\n.destination[data-reserved-placement] {\n background-color: var(--_placement-reserved-background);\n}\n\n.destination[data-cue-clipped] {\n visibility: hidden;\n}\n\n.destination[data-drop-blocked] {\n --border: 2px solid var(--nve-sys-support-danger-emphasis-color);\n}\n\n.destination nve-icon {\n position: absolute;\n inset: var(--nve-ref-space-sm) auto auto var(--nve-ref-space-sm);\n}\n\n.carried {\n position: absolute;\n z-index: 8;\n pointer-events: none;\n white-space: nowrap;\n --background: var(--nve-sys-layer-container-background);\n --border: var(--nve-ref-border-width-sm) solid var(--nve-sys-accent-secondary-background);\n}\n\n.context-boundary {\n position: absolute;\n box-sizing: border-box;\n pointer-events: none;\n opacity: 0;\n box-shadow: inset 0 0 0 var(--nve-ref-border-width-md) var(--nve-sys-accent-secondary-background);\n z-index: 4;\n}\n\n.context-boundary[data-active] {\n opacity: 1;\n}\n\n.order-overlay {\n position: absolute;\n pointer-events: none;\n background: var(--_placement-reserved-background);\n z-index: 7;\n}\n\n.seam-badge {\n position: absolute;\n box-sizing: border-box;\n display: grid;\n place-items: center;\n width: var(--nve-ref-size-800);\n height: var(--nve-ref-size-800);\n border: var(--nve-ref-border-width-sm) solid var(--nve-ref-border-color-muted);\n border-radius: var(--nve-ref-border-radius-full);\n background: var(--nve-sys-layer-container-background);\n /* eslint-disable-next-line @nvidia-elements/lint/no-unexpected-css-variable -- The seam badge uses the same accent as the operating outline. */\n color: var(--nve-sys-accent-secondary-background);\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n\n.seam-badge > svg {\n display: block;\n width: var(--nve-ref-size-500);\n height: var(--nve-ref-size-500);\n overflow: visible;\n pointer-events: none;\n}\n\n[internal-host][data-rearranging] .context-boundary,\n[internal-host][data-rearranging] .group-chrome,\n[internal-host][data-rearranging] ::slotted(nve-workspace-panel) {\n transition:\n left var(--animation-duration) var(--animation-easing),\n top var(--animation-duration) var(--animation-easing),\n width var(--animation-duration) var(--animation-easing),\n height var(--animation-duration) var(--animation-easing);\n}\n\n.chrome {\n animation-duration: var(--animation-duration);\n animation-timing-function: var(--animation-easing);\n position: absolute;\n visibility: hidden;\n pointer-events: none;\n width: max-content;\n}\n\n.gap-probe {\n position: absolute;\n width: max(0px, var(--gap));\n height: 0;\n}\n\n.tab-min-probe {\n position: absolute;\n width: max(0px, var(--tab-min-width));\n height: 0;\n}\n\n.chrome-header {\n align-items: center;\n min-height: calc(var(--nve-ref-size-1000) + var(--nve-ref-size-200));\n direction: ltr;\n display: flex;\n}\n\n:host(:fullscreen) {\n width: 100%;\n height: 100%;\n background: var(--nve-sys-layer-container-background);\n}\n\n:host([container='flat']) .tabs {\n background: transparent;\n}\n\n:host([container='flat']),\n:host([container='full']) {\n --_workspace-border-radius: var(--nve-ref-border-radius-none);\n}\n"],"mappings":""}
1
+ {"version":3,"file":"workspace.js","names":["workspace_default"],"sources":["../../src/workspace/workspace.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 --gap: var(--nve-ref-size-150);\n --border-radius: var(--nve-ref-border-radius-lg);\n --tab-min-width: calc(3 * var(--nve-ref-size-1000));\n --tab-border: var(--nve-ref-border-width-sm) solid var(--nve-ref-border-color-muted);\n --close-button-inset: var(--nve-ref-size-200);\n --header-control-size: var(--nve-ref-size-700);\n --header-control-inset: var(--nve-ref-size-100);\n --_workspace-border-radius: var(--border-radius);\n --animation-duration: var(--nve-ref-animation-duration-150);\n --animation-easing: var(--nve-ref-animation-easing-100);\n --_placement-reserved-background: color-mix(in srgb, var(--nve-sys-accent-secondary-background) 28%, transparent);\n --gutter-background: transparent;\n --gutter-hover-background: var(--nve-sys-accent-secondary-background);\n display: grid;\n width: 100%; /* fallback safari */\n width: stretch;\n grid-template-rows: minmax(0, 1fr);\n}\n\n[internal-host] {\n position: relative;\n display: grid;\n grid-template-rows: minmax(0, 1fr);\n min-width: 0;\n min-height: 0;\n contain: size;\n contain-intrinsic-block-size: var(--_minimum-height, 0);\n}\n\n.viewport {\n position: relative;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n}\n\n.canvas {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: clip;\n}\n\n::slotted(nve-workspace-panel) {\n position: absolute;\n}\n\n::slotted(nve-workspace-panel:not(:state(workspace-presented))) {\n display: none !important;\n}\n\n.group-chrome {\n position: absolute;\n overflow: clip;\n border-radius: var(--_workspace-border-radius);\n pointer-events: none;\n}\n\n.tabs {\n direction: ltr;\n position: relative;\n display: flex;\n pointer-events: auto;\n background: var(--nve-sys-layer-container-background);\n}\n\n.tabs[data-carried-reservation] {\n visibility: hidden;\n}\n\n.tablist {\n position: relative;\n flex: none;\n min-width: 0;\n overflow: clip;\n}\n\n.tablist[data-scrollable] {\n overflow: auto hidden;\n scrollbar-color: var(--nve-sys-scrollbar-thumb-color) var(--nve-sys-scrollbar-track-color);\n scrollbar-width: var(--nve-sys-scrollbar-width);\n}\n\n.tab-track {\n position: relative;\n height: 100%;\n display: block;\n --gap: 0;\n --indicator-border-radius: var(--nve-ref-border-radius-none);\n}\n\n[internal-host][data-resizing] .tab-track,\n[internal-host][data-rearranging] .tab-track {\n --indicator-animation-duration: 0ms;\n}\n\n.tab-entry {\n --padding: 0;\n --gap: 0;\n --border-radius: var(--nve-ref-border-radius-none);\n}\n\n:host([closable]) .tab-entry {\n --padding: 0 var(--close-button-inset) 0 0;\n}\n\n.tab-entry nve-tabs-item {\n --padding: 0 var(--nve-ref-size-200);\n}\n\n.tablist .tab-entry {\n position: absolute;\n top: 0;\n height: 100%;\n --width: 100%;\n box-sizing: border-box;\n}\n\n.tablist .tab-entry + .tab-entry,\n.tabs > nve-drag-handle + .tablist .tab-entry:first-child {\n border-inline-start: var(--tab-border);\n}\n\n[data-carried-tab] {\n visibility: hidden;\n}\n\n[internal-host][data-rearranging] .tablist .tab-entry {\n transition:\n left var(--animation-duration) var(--animation-easing),\n width var(--animation-duration) var(--animation-easing);\n}\n\n.panel-entry {\n padding: var(--padding);\n display: flex;\n align-items: center;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n height: 100%;\n box-sizing: border-box;\n padding: 0 var(--nve-ref-size-200);\n overflow: hidden;\n white-space: nowrap;\n color: var(--nve-sys-text-emphasis-color);\n font-size: var(--nve-ref-font-size-100);\n font-weight: var(--nve-ref-font-weight-semibold);\n line-height: var(--nve-ref-font-size-500);\n}\n\n.fallback-title {\n display: block;\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n:host([rearrangeable][groupable]) .tabs nve-tabs-item,\n:host([rearrangeable]) .tabs .panel-title {\n --cursor: grab;\n cursor: grab;\n touch-action: pan-x;\n}\n\n.tabs nve-drag-handle {\n flex: 0 0 auto;\n --cursor: grab;\n --height: 100%;\n --border-radius: var(--nve-ref-border-radius-none);\n touch-action: none;\n}\n\n:is(.tabs, .chrome) nve-drag-handle {\n --width: calc(var(--header-control-size) + 2 * var(--header-control-inset));\n}\n\nnve-icon-button:is([part~='close-button'], [part~='fullscreen-button']) {\n --width: var(--header-control-size);\n --height: var(--header-control-size);\n}\n\n.group-actions {\n display: flex;\n align-items: center;\n flex: none;\n padding-inline: var(--header-control-inset) calc(var(--header-control-inset) + var(--nve-ref-border-width-sm));\n border-inline-start: var(--tab-border);\n box-sizing: border-box;\n}\n\n.group-actions[data-authored-suffix] {\n /* Keep the measured control width while the authored suffix supplies the divider. */\n border-inline-start-color: transparent;\n}\n\n.gutter {\n position: absolute;\n background: var(--gutter-background);\n pointer-events: none;\n}\n\nnve-resize-handle {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n pointer-events: auto;\n --background: transparent;\n}\n\nnve-resize-handle:hover:not(:state(active))::part(_line) {\n background: var(--gutter-hover-background);\n}\n\n.preview-layer {\n position: absolute;\n inset: 0;\n overflow: clip;\n pointer-events: none;\n z-index: 6;\n}\n\n.destination {\n position: absolute;\n inset: 0 auto auto 0;\n pointer-events: none;\n z-index: 6;\n box-sizing: border-box;\n --background: transparent;\n background-color: color-mix(in srgb, var(--nve-sys-accent-secondary-background) 16%, transparent);\n border-radius: var(--border-radius);\n transition:\n background-color var(--animation-duration) var(--animation-easing),\n transform var(--animation-duration) var(--animation-easing),\n width var(--animation-duration) var(--animation-easing),\n height var(--animation-duration) var(--animation-easing);\n}\n\n.destination[data-reserved-placement] {\n background-color: var(--_placement-reserved-background);\n}\n\n.destination[data-cue-clipped] {\n visibility: hidden;\n}\n\n.destination[data-drop-blocked] {\n --border: 2px solid var(--nve-sys-support-danger-emphasis-color);\n}\n\n.destination nve-icon {\n position: absolute;\n inset: var(--nve-ref-space-sm) auto auto var(--nve-ref-space-sm);\n}\n\n.carried {\n position: absolute;\n z-index: 8;\n pointer-events: none;\n white-space: nowrap;\n --background: var(--nve-sys-layer-container-background);\n --border: var(--nve-ref-border-width-sm) solid var(--nve-sys-accent-secondary-background);\n}\n\n.scope-boundary {\n position: absolute;\n box-sizing: border-box;\n pointer-events: none;\n opacity: 0;\n box-shadow: inset 0 0 0 var(--nve-ref-border-width-md) var(--nve-sys-accent-secondary-background);\n z-index: 4;\n}\n\n.scope-boundary[data-active] {\n opacity: 1;\n}\n\n.order-overlay {\n position: absolute;\n pointer-events: none;\n background: var(--_placement-reserved-background);\n z-index: 7;\n}\n\n.seam-badge {\n position: absolute;\n box-sizing: border-box;\n display: grid;\n place-items: center;\n width: var(--nve-ref-size-800);\n height: var(--nve-ref-size-800);\n border: var(--nve-ref-border-width-sm) solid var(--nve-ref-border-color-muted);\n border-radius: var(--nve-ref-border-radius-full);\n background: var(--nve-sys-layer-container-background);\n /* eslint-disable-next-line @nvidia-elements/lint/no-unexpected-css-variable -- The seam badge uses the same accent as the operating outline. */\n color: var(--nve-sys-accent-secondary-background);\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n\n.seam-badge > svg {\n display: block;\n width: var(--nve-ref-size-500);\n height: var(--nve-ref-size-500);\n overflow: visible;\n pointer-events: none;\n}\n\n[internal-host][data-rearranging] .scope-boundary,\n[internal-host][data-rearranging] .group-chrome,\n[internal-host][data-rearranging] ::slotted(nve-workspace-panel) {\n transition:\n left var(--animation-duration) var(--animation-easing),\n top var(--animation-duration) var(--animation-easing),\n width var(--animation-duration) var(--animation-easing),\n height var(--animation-duration) var(--animation-easing);\n}\n\n.chrome {\n animation-duration: var(--animation-duration);\n animation-timing-function: var(--animation-easing);\n position: absolute;\n visibility: hidden;\n pointer-events: none;\n width: max-content;\n}\n\n.gap-probe {\n position: absolute;\n width: max(0px, var(--gap));\n height: 0;\n}\n\n.tab-min-probe {\n position: absolute;\n width: max(0px, var(--tab-min-width));\n height: 0;\n}\n\n.chrome-header {\n align-items: center;\n min-height: calc(var(--nve-ref-size-1000) + var(--nve-ref-size-200));\n direction: ltr;\n display: flex;\n}\n\n:host(:fullscreen) {\n width: 100%;\n height: 100%;\n background: var(--nve-sys-layer-container-background);\n}\n\n:host([container='flat']) .tabs {\n background: transparent;\n}\n\n:host([container='flat']),\n:host([container='full']) {\n --_workspace-border-radius: var(--nve-ref-border-radius-none);\n}\n"],"mappings":""}