@patternfly/patternfly-doc-core 1.12.3 → 1.12.4

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 (183) hide show
  1. package/.astro/content-modules.mjs +20 -20
  2. package/dist/docs/_astro/{LiveExample.BOl02361.js → LiveExample.B5R4Dzng.js} +1 -1
  3. package/dist/docs/_astro/PageToggle.DBsLIFpI.js +1 -0
  4. package/dist/docs/_astro/{PropsTables.Cio9znJH.js → PropsTables.YkW1puJk.js} +1 -1
  5. package/dist/docs/_astro/SectionGallery.B0I2mi5J.js +1 -0
  6. package/dist/docs/_astro/{th-icon.DdLJBTr8.js → index.DGdw5tfb.js} +4 -4
  7. package/dist/docs/_worker.js/_@astrojs-ssr-adapter.mjs +1 -1
  8. package/dist/docs/_worker.js/chunks/{_@astrojs-ssr-adapter_CBRUgCDy.mjs → _@astrojs-ssr-adapter_B_x81DBq.mjs} +58 -49
  9. package/dist/docs/_worker.js/index.js +2 -2
  10. package/dist/docs/_worker.js/{manifest_BcWNteSS.mjs → manifest_87bGUcju.mjs} +1 -1
  11. package/dist/docs/components/about-modal/index.html +4 -4
  12. package/dist/docs/components/about-modal/react/index.html +4 -4
  13. package/dist/docs/components/accordion/index.html +6 -6
  14. package/dist/docs/components/accordion/react/index.html +6 -6
  15. package/dist/docs/components/action-list/index.html +5 -5
  16. package/dist/docs/components/action-list/react/index.html +5 -5
  17. package/dist/docs/components/alert/index.html +98 -98
  18. package/dist/docs/components/alert/react/index.html +98 -98
  19. package/dist/docs/components/avatar/index.html +7 -7
  20. package/dist/docs/components/avatar/react/index.html +7 -7
  21. package/dist/docs/components/back-to-top/index.html +8 -8
  22. package/dist/docs/components/back-to-top/react/index.html +8 -8
  23. package/dist/docs/components/backdrop/index.html +6 -6
  24. package/dist/docs/components/backdrop/react/index.html +6 -6
  25. package/dist/docs/components/background-image/index.html +6 -6
  26. package/dist/docs/components/background-image/react/index.html +6 -6
  27. package/dist/docs/components/badge/index.html +4 -4
  28. package/dist/docs/components/badge/react/index.html +4 -4
  29. package/dist/docs/components/banner/index.html +3 -3
  30. package/dist/docs/components/banner/react/index.html +3 -3
  31. package/dist/docs/components/brand/index.html +3 -3
  32. package/dist/docs/components/brand/react/index.html +3 -3
  33. package/dist/docs/components/breadcrumb/index.html +5 -5
  34. package/dist/docs/components/breadcrumb/react/index.html +5 -5
  35. package/dist/docs/components/button/index.html +15 -15
  36. package/dist/docs/components/button/react/index.html +15 -15
  37. package/dist/docs/components/calendar-month/index.html +3 -3
  38. package/dist/docs/components/calendar-month/react/index.html +3 -3
  39. package/dist/docs/components/card/index.html +84 -84
  40. package/dist/docs/components/card/react/index.html +84 -84
  41. package/dist/docs/components/checkbox/index.html +25 -25
  42. package/dist/docs/components/checkbox/react/index.html +25 -25
  43. package/dist/docs/components/chip/index.html +5 -5
  44. package/dist/docs/components/chip/react-deprecated/index.html +5 -5
  45. package/dist/docs/components/clipboard-copy/index.html +29 -29
  46. package/dist/docs/components/clipboard-copy/react/index.html +29 -29
  47. package/dist/docs/components/code-block/index.html +3 -3
  48. package/dist/docs/components/code-block/react/index.html +3 -3
  49. package/dist/docs/components/content/index.html +27 -27
  50. package/dist/docs/components/content/react/index.html +27 -27
  51. package/dist/docs/components/data-list/index.html +33 -33
  52. package/dist/docs/components/data-list/react/index.html +33 -33
  53. package/dist/docs/components/date-picker/index.html +25 -25
  54. package/dist/docs/components/date-picker/react/index.html +25 -25
  55. package/dist/docs/components/description-list/index.html +62 -62
  56. package/dist/docs/components/description-list/react/index.html +62 -62
  57. package/dist/docs/components/divider/index.html +22 -22
  58. package/dist/docs/components/divider/react/index.html +22 -22
  59. package/dist/docs/components/drag-and-drop/index.html +3 -3
  60. package/dist/docs/components/drag-and-drop/react-deprecated/index.html +3 -3
  61. package/dist/docs/components/drawer/index.html +46 -46
  62. package/dist/docs/components/drawer/react/index.html +46 -46
  63. package/dist/docs/components/dropdown/index.html +23 -23
  64. package/dist/docs/components/dropdown/react/index.html +23 -23
  65. package/dist/docs/components/dual-list-selector/index.html +7 -7
  66. package/dist/docs/components/dual-list-selector/react/index.html +25 -25
  67. package/dist/docs/components/dual-list-selector/react-deprecated/index.html +8 -8
  68. package/dist/docs/components/empty-state/index.html +20 -20
  69. package/dist/docs/components/empty-state/react/index.html +20 -20
  70. package/dist/docs/components/expandable-section/index.html +9 -9
  71. package/dist/docs/components/expandable-section/react/index.html +9 -9
  72. package/dist/docs/components/form/index.html +14 -14
  73. package/dist/docs/components/form/react/index.html +14 -14
  74. package/dist/docs/components/form-select/index.html +5 -5
  75. package/dist/docs/components/form-select/react/index.html +5 -5
  76. package/dist/docs/components/helper-text/index.html +4 -4
  77. package/dist/docs/components/helper-text/react/index.html +4 -4
  78. package/dist/docs/components/hint/index.html +13 -13
  79. package/dist/docs/components/hint/react/index.html +13 -13
  80. package/dist/docs/components/icon/index.html +28 -28
  81. package/dist/docs/components/icon/react/index.html +28 -28
  82. package/dist/docs/components/input-group/index.html +12 -12
  83. package/dist/docs/components/input-group/react/index.html +12 -12
  84. package/dist/docs/components/jump-links/index.html +14 -14
  85. package/dist/docs/components/jump-links/react/index.html +14 -14
  86. package/dist/docs/components/label/index.html +37 -37
  87. package/dist/docs/components/label/react/index.html +37 -37
  88. package/dist/docs/components/list/index.html +8 -8
  89. package/dist/docs/components/list/react/index.html +8 -8
  90. package/dist/docs/components/login-page/index.html +13 -13
  91. package/dist/docs/components/login-page/react/index.html +13 -13
  92. package/dist/docs/components/masthead/index.html +25 -25
  93. package/dist/docs/components/masthead/react/index.html +25 -25
  94. package/dist/docs/components/menu/index.html +103 -103
  95. package/dist/docs/components/menu/react/index.html +103 -103
  96. package/dist/docs/components/menu-toggle/index.html +70 -70
  97. package/dist/docs/components/menu-toggle/react/index.html +70 -70
  98. package/dist/docs/components/modal/index.html +55 -55
  99. package/dist/docs/components/modal/react/index.html +52 -52
  100. package/dist/docs/components/modal/react-deprecated/index.html +57 -57
  101. package/dist/docs/components/multiple-file-upload/index.html +3 -3
  102. package/dist/docs/components/multiple-file-upload/react/index.html +3 -3
  103. package/dist/docs/components/navigation/index.html +12 -12
  104. package/dist/docs/components/navigation/react/index.html +12 -12
  105. package/dist/docs/components/notification-badge/index.html +4 -4
  106. package/dist/docs/components/notification-badge/react/index.html +4 -4
  107. package/dist/docs/components/notification-drawer/index.html +4 -4
  108. package/dist/docs/components/notification-drawer/react/index.html +4 -4
  109. package/dist/docs/components/number-input/index.html +9 -9
  110. package/dist/docs/components/number-input/react/index.html +9 -9
  111. package/dist/docs/components/overflow-menu/index.html +6 -6
  112. package/dist/docs/components/overflow-menu/react/index.html +6 -6
  113. package/dist/docs/components/page/index.html +58 -58
  114. package/dist/docs/components/page/react/index.html +58 -58
  115. package/dist/docs/components/pagination/index.html +25 -25
  116. package/dist/docs/components/pagination/react/index.html +25 -25
  117. package/dist/docs/components/panel/index.html +2 -2
  118. package/dist/docs/components/panel/react/index.html +2 -2
  119. package/dist/docs/components/popover/index.html +13 -13
  120. package/dist/docs/components/popover/react/index.html +13 -13
  121. package/dist/docs/components/progress/index.html +19 -19
  122. package/dist/docs/components/progress/react/index.html +19 -19
  123. package/dist/docs/components/progress-stepper/index.html +9 -9
  124. package/dist/docs/components/progress-stepper/react/index.html +9 -9
  125. package/dist/docs/components/radio/index.html +23 -23
  126. package/dist/docs/components/radio/react/index.html +23 -23
  127. package/dist/docs/components/search-input/index.html +20 -20
  128. package/dist/docs/components/search-input/react/index.html +20 -20
  129. package/dist/docs/components/select/index.html +13 -13
  130. package/dist/docs/components/select/react/index.html +13 -13
  131. package/dist/docs/components/sidebar/index.html +25 -25
  132. package/dist/docs/components/sidebar/react/index.html +25 -25
  133. package/dist/docs/components/simple-file-upload/index.html +9 -9
  134. package/dist/docs/components/simple-file-upload/react/index.html +9 -9
  135. package/dist/docs/components/simple-list/index.html +12 -12
  136. package/dist/docs/components/simple-list/react/index.html +12 -12
  137. package/dist/docs/components/skeleton/index.html +6 -6
  138. package/dist/docs/components/skeleton/react/index.html +6 -6
  139. package/dist/docs/components/skip-to-content/index.html +6 -6
  140. package/dist/docs/components/skip-to-content/react/index.html +6 -6
  141. package/dist/docs/components/slider/index.html +28 -28
  142. package/dist/docs/components/slider/react/index.html +28 -28
  143. package/dist/docs/components/spinner/index.html +12 -12
  144. package/dist/docs/components/spinner/react/index.html +12 -12
  145. package/dist/docs/components/switch/index.html +17 -17
  146. package/dist/docs/components/switch/react/index.html +17 -17
  147. package/dist/docs/components/tabs/index.html +25 -25
  148. package/dist/docs/components/tabs/react/index.html +25 -25
  149. package/dist/docs/components/text-area/index.html +11 -11
  150. package/dist/docs/components/text-area/react/index.html +11 -11
  151. package/dist/docs/components/text-input/index.html +9 -9
  152. package/dist/docs/components/text-input/react/index.html +9 -9
  153. package/dist/docs/components/text-input-group/index.html +6 -6
  154. package/dist/docs/components/text-input-group/react/index.html +6 -6
  155. package/dist/docs/components/tile/index.html +32 -32
  156. package/dist/docs/components/tile/react-deprecated/index.html +32 -32
  157. package/dist/docs/components/time-picker/index.html +18 -18
  158. package/dist/docs/components/time-picker/react/index.html +18 -18
  159. package/dist/docs/components/timestamp/index.html +26 -26
  160. package/dist/docs/components/timestamp/react/index.html +26 -26
  161. package/dist/docs/components/title/index.html +3 -3
  162. package/dist/docs/components/title/react/index.html +3 -3
  163. package/dist/docs/components/toggle-group/index.html +6 -6
  164. package/dist/docs/components/toggle-group/react/index.html +6 -6
  165. package/dist/docs/components/toolbar/index.html +14 -14
  166. package/dist/docs/components/toolbar/react/index.html +14 -14
  167. package/dist/docs/components/tooltip/index.html +6 -6
  168. package/dist/docs/components/tooltip/react/index.html +6 -6
  169. package/dist/docs/components/tree-view/index.html +15 -15
  170. package/dist/docs/components/tree-view/react/index.html +15 -15
  171. package/dist/docs/components/truncate/index.html +2 -2
  172. package/dist/docs/components/truncate/react/index.html +2 -2
  173. package/dist/docs/components/wizard/index.html +21 -21
  174. package/dist/docs/components/wizard/react/index.html +21 -21
  175. package/dist/docs/components/wizard/react-deprecated/index.html +12 -12
  176. package/dist/docs/index.html +1 -1
  177. package/package.json +4 -4
  178. package/dist/docs/_astro/PageToggle.pXRgGXc2.js +0 -1
  179. package/dist/docs/_astro/SectionGallery.CzuHmX2s.js +0 -1
  180. /package/dist/docs/_worker.js/chunks/{_astro_assets_Dq7RALjT.mjs → _astro_assets_mEeJQNtn.mjs} +0 -0
  181. /package/dist/docs/_worker.js/chunks/{_astro_data-layer-content_B52INFW7.mjs → _astro_data-layer-content_DSexW0T9.mjs} +0 -0
  182. /package/dist/docs/_worker.js/chunks/{content-modules_CybmoSHK.mjs → content-modules_ByZ0SP-q.mjs} +0 -0
  183. /package/dist/docs/_worker.js/chunks/{sharp_BmN5pRz6.mjs → sharp_DD2qbOXY.mjs} +0 -0
@@ -1,8 +1,8 @@
1
1
  <!DOCTYPE html><html lang="en" data-astro-transition-scope="astro-iidcp2e2-1"> <head><script type="module">const n=e=>{requestAnimationFrame(()=>{document.documentElement.classList.toggle("pf-v6-theme-dark",e==="dark")})};document.addEventListener("astro:before-swap",()=>{const e=localStorage.getItem("theme-preference");n(e||"light")});const o=e=>{const t=document.querySelector(e);t&&t.scrollIntoView({behavior:"smooth"})};document.addEventListener("DOMContentLoaded",()=>{if(window.location.hash){const e=window.location.hash;history.replaceState(null,""," "),setTimeout(()=>{o(e),history.replaceState(null,"",e)},500)}});window.addEventListener("hashchange",()=>{window.location.hash&&o(window.location.hash)});</script><meta charset="utf-8"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><meta name="viewport" content="width=device-width"><meta name="generator" content="Astro v5.9.3"><title>Astro</title><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><script type="module" src="/_astro/ClientRouter.astro_astro_type_script_index_0_lang.CtSceO8m.js"></script><link rel="stylesheet" href="/_astro/_page_.BG_fQ4i5.css">
2
- <link rel="stylesheet" href="/_astro/_page_.DxJDkZPc.css">
3
- <link rel="stylesheet" href="/_astro/LiveExample.CxJsMvEq.css">
2
+ <link rel="stylesheet" href="/_astro/AutoLinkHeader.Chv_bGyU.css">
4
3
  <link rel="stylesheet" href="/_astro/PropsTables.D6ZI3FGj.css">
5
- <link rel="stylesheet" href="/_astro/AutoLinkHeader.Chv_bGyU.css"><style>[data-astro-transition-scope="astro-iidcp2e2-1"] { view-transition-name: astro-iidcp2e2-1; }@layer astro { ::view-transition-old(astro-iidcp2e2-1) { animation: none; opacity: 0; mix-blend-mode: normal; }::view-transition-new(astro-iidcp2e2-1) { animation: none; mix-blend-mode: normal; }::view-transition-group(astro-iidcp2e2-1) { animation: none } }[data-astro-transition-fallback="old"] [data-astro-transition-scope="astro-iidcp2e2-1"],
4
+ <link rel="stylesheet" href="/_astro/LiveExample.CxJsMvEq.css">
5
+ <link rel="stylesheet" href="/_astro/_page_.DxJDkZPc.css"><style>[data-astro-transition-scope="astro-iidcp2e2-1"] { view-transition-name: astro-iidcp2e2-1; }@layer astro { ::view-transition-old(astro-iidcp2e2-1) { animation: none; opacity: 0; mix-blend-mode: normal; }::view-transition-new(astro-iidcp2e2-1) { animation: none; mix-blend-mode: normal; }::view-transition-group(astro-iidcp2e2-1) { animation: none } }[data-astro-transition-fallback="old"] [data-astro-transition-scope="astro-iidcp2e2-1"],
6
6
  [data-astro-transition-fallback="old"][data-astro-transition-scope="astro-iidcp2e2-1"] { animation: none; mix-blend-mode: normal; }[data-astro-transition-fallback="new"] [data-astro-transition-scope="astro-iidcp2e2-1"],
7
7
  [data-astro-transition-fallback="new"][data-astro-transition-scope="astro-iidcp2e2-1"] { animation: none; mix-blend-mode: normal; }</style><style>[data-astro-transition-scope="astro-xikxfxwm-3"] { view-transition-name: astro-xikxfxwm-3; }@layer astro { ::view-transition-old(astro-xikxfxwm-3) {
8
8
  animation-duration: 180ms;
@@ -42,9 +42,9 @@
42
42
  animation-fill-mode: both;
43
43
  animation-name: astroFadeIn; }</style><style>[data-astro-transition-scope="astro-2e6ke2uy-4"] { view-transition-name: astro-2e6ke2uy-4; }@layer astro { ::view-transition-old(astro-2e6ke2uy-4) { animation: none; opacity: 0; mix-blend-mode: normal; }::view-transition-new(astro-2e6ke2uy-4) { animation: none; mix-blend-mode: normal; }::view-transition-group(astro-2e6ke2uy-4) { animation: none } }[data-astro-transition-fallback="old"] [data-astro-transition-scope="astro-2e6ke2uy-4"],
44
44
  [data-astro-transition-fallback="old"][data-astro-transition-scope="astro-2e6ke2uy-4"] { animation: none; mix-blend-mode: normal; }[data-astro-transition-fallback="new"] [data-astro-transition-scope="astro-2e6ke2uy-4"],
45
- [data-astro-transition-fallback="new"][data-astro-transition-scope="astro-2e6ke2uy-4"] { animation: none; mix-blend-mode: normal; }</style></head> <body> <div class="pf-v6-c-page"> <script>(()=>{var l=(n,t)=>{let i=async()=>{await(await n())()},e=typeof t.value=="object"?t.value:void 0,s={timeout:e==null?void 0:e.timeout};"requestIdleCallback"in window?window.requestIdleCallback(i,s):setTimeout(i,s.timeout||200)};(self.Astro||(self.Astro={})).idle=l;window.dispatchEvent(new Event("astro:idle"));})();</script><header class="pf-v6-c-masthead pf-m-display-inline-on-md"> <div class="pf-v6-c-masthead__main"> <span class="pf-v6-c-masthead__toggle"> <astro-island uid="169d0m" prefix="r5" component-url="/_astro/PageToggle.pXRgGXc2.js" component-export="PageToggle" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-u5p5alki-2&quot;]}" ssr client="idle" opts="{&quot;name&quot;:&quot;PageToggle&quot;,&quot;value&quot;:true}" data-astro-transition-persist="astro-u5p5alki-2" await-children><button id="nav-toggle" aria-expanded="true" aria-label="Global navigation" class="pf-v6-c-button pf-m-plain" type="button" data-ouia-component-type="PF6/Button" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Button-plain-79"><span class="pf-v6-c-button__text"><svg class="pf-v6-svg" viewBox="0 0 448 512" fill="currentColor" aria-hidden="true" role="img" width="1em" height="1em"><path d="M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z"></path></svg></span></button><!--astro:end--></astro-island> </span> <div class="pf-v6-c-masthead__brand"> <a class="pf-v6-c-masthead__logo" tabindex="0" href="/"> <img class="pf-v6-c-brand" style="--pf-v6-c-brand--Height:36px" src="/PF-HorizontalLogo-Color.svg" alt="PatternFly"/> </a> </div> </div> <div class="pf-v6-c-masthead__content"> <astro-island uid="Z1jH8yS" prefix="r7" component-url="/_astro/Toolbar.BNjGRsAQ.js" component-export="Toolbar" renderer-url="/_astro/client.DN8ES6L5.js" props="{}" ssr client="idle" opts="{&quot;name&quot;:&quot;ReactToolbar&quot;,&quot;value&quot;:true}" await-children><div class="pf-v6-c-toolbar pf-m-static" id="toolbar" data-ouia-component-type="PF6/Toolbar" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Toolbar-27"><div class="pf-v6-c-toolbar__content"><div class="pf-v6-c-toolbar__content-section"><div class="pf-v6-c-toolbar__group pf-m-action-group-plain pf-m-align-end pf-m-gap-none pf-m-gap-md-on-md"><div class="pf-v6-c-toolbar__item"></div><div class="pf-v6-c-toolbar__item"><div class="pf-v6-c-input-group ws-global-search"><div class="pf-v6-c-input-group__item"><button aria-expanded="false" aria-label="Expandable search input toggle" class="pf-v6-c-button pf-m-plain" type="button" data-ouia-component-type="PF6/Button" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Button-plain-80"><span class="pf-v6-c-button__icon"><svg class="pf-v6-svg" viewBox="0 0 512 512" fill="currentColor" aria-hidden="true" role="img" width="1em" height="1em"><path d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"></path></svg></span></button></div></div></div><div class="pf-v6-c-toolbar__item"><a href="//github.com/patternfly" target="top" aria-label="PatternFly GitHub page" class="pf-v6-c-button pf-m-plain" data-ouia-component-type="PF6/Button" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Button-plain-81"><span class="pf-v6-c-button__text"><svg class="pf-v6-svg" viewBox="0 0 496 512" fill="currentColor" aria-hidden="true" role="img" width="1em" height="1em"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg></span></a></div><div class="pf-v6-c-toolbar__item"><button class="pf-v6-c-menu-toggle" type="button" aria-expanded="false" data-ouia-component-type="PF6/MenuToggle" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-MenuToggle-27"><span class="pf-v6-c-menu-toggle__text">Release 6.1.0</span><span class="pf-v6-c-menu-toggle__controls"><span class="pf-v6-c-menu-toggle__toggle-icon"><svg class="pf-v6-svg" viewBox="0 0 320 512" fill="currentColor" aria-hidden="true" role="img" width="1em" height="1em"><path d="M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z"></path></svg></span></span></button></div></div></div></div><div class="pf-v6-c-toolbar__content pf-m-hidden" hidden=""><div class="pf-v6-c-toolbar__group"></div></div></div><!--astro:end--></astro-island> </div> </header> <astro-island uid="193Wv7" component-url="/_astro/Navigation.B2RHZcqO.js" component-export="Navigation" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;navData&quot;:[1,[[1,[[0,{&quot;id&quot;:[0,&quot;src/components/aboutmodal/examples/aboutmodal&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;About modal&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/accordion/examples/accordion&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Accordion&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/actionlist/examples/actionlist&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Action list&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/alert/examples/alert&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Alert&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/avatar/examples/avatar&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Avatar&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/backtotop/examples/backtotop&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Back to top&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/backdrop/examples/backdrop&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Backdrop&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/backgroundimage/examples/backgroundimage&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Background image&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/badge/examples/badge&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Badge&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/banner/examples/banner&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Banner&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/brand/examples/brand&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Brand&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/breadcrumb/examples/breadcrumb&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Breadcrumb&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/button/examples/button&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Button&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/calendarmonth/examples/calendarmonth&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Calendar month&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/card/examples/card&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Card&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/checkbox/examples/checkbox&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Checkbox&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/deprecated/components/chip/examples/chip&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Chip&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/clipboardcopy/examples/clipboardcopy&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Clipboard copy&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/codeblock/examples/codeblock&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Code block&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/content/examples/content&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Content&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/datalist/examples/datalist&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Data list&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/datepicker/examples/datepicker&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Date picker&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/descriptionlist/examples/descriptionlist&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Description list&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/divider/examples/divider&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Divider&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/deprecated/components/dragdrop/examples/dragdrop&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Drag and drop&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/drawer/examples/drawer&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Drawer&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/dropdown/examples/dropdown&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Dropdown&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/duallistselector/examples/duallistselector&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Dual list selector&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/emptystate/examples/emptystate&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Empty state&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/expandablesection/examples/expandablesection&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Expandable section&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/form/examples/form&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Form&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/formselect/examples/formselect&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Form select&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/helpertext/examples/helpertext&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Helper text&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/hint/examples/hint&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Hint&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/icon/examples/icon&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Icon&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/inputgroup/examples/inputgroup&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Input group&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/jumplinks/examples/jumplinks&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Jump links&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/label/examples/label&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Label&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/list/examples/list&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;List&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/loginpage/examples/loginpage&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Login page&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/masthead/examples/masthead&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Masthead&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/menu/examples/menu&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Menu&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/menutoggle/examples/menutoggle&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Menu toggle&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/modal/examples/modal&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Modal&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/multiplefileupload/examples/multiplefileupload&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Multiple file upload&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/nav/examples/nav&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Navigation&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/notificationbadge/examples/notificationbadge&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Notification badge&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/notificationdrawer/examples/notificationdrawer&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Notification drawer&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/numberinput/examples/numberinput&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Number input&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/overflowmenu/examples/overflowmenu&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Overflow menu&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/page/examples/page&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Page&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/pagination/examples/pagination&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Pagination&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/panel/examples/panel&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Panel&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/popover/examples/popover&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Popover&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/progress/examples/progress&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Progress&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/progressstepper/examples/progressstepper&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Progress stepper&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/radio/examples/radio&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Radio&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/searchinput/examples/searchinput&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Search input&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/select/examples/select&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Select&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/sidebar/examples/sidebar&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Sidebar&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/fileupload/examples/fileupload&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Simple file upload&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/simplelist/examples/simplelist&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Simple list&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/skeleton/examples/skeleton&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Skeleton&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/skiptocontent/examples/skiptocontent&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Skip to content&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/slider/examples/slider&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Slider&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/spinner/examples/spinner&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Spinner&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/switch/examples/switch&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Switch&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/tabs/examples/tabs&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Tabs&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/textarea/examples/textarea&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Text area&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/textinput/examples/textinput&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Text input&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/textinputgroup/examples/textinputgroup&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Text input group&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/deprecated/components/tile/examples/tile&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Tile&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/timepicker/examples/timepicker&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Time picker&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/timestamp/examples/timestamp&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Timestamp&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/title/examples/title&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Title&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/togglegroup/examples/togglegroup&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Toggle group&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/toolbar/examples/toolbar&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Toolbar&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/tooltip/examples/tooltip&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Tooltip&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/treeview/examples/treeview&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Tree view&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/truncate/examples/truncate&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Truncate&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/wizard/examples/wizard&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Wizard&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}]]]]],&quot;data-astro-transition-scope&quot;:[0,&quot;astro-xikxfxwm-3&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;ReactNav&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-scope="astro-xikxfxwm-3"></astro-island> <div class="pf-v6-c-page__main-container"> <main class="pf-v6-c-page__main"> <section class="pf-v6-c-page__main-section"><div class="pf-v6-c-page__main-body"> <section id="ws-sticky-nav-tabs" class="pf-v6-c-page__main-tabs pf-m-sticky-top"><div class="pf-v6-c-page__main-body"> <div class="pf-v6-c-tabs pf-m-page-insets pf-m-no-border-bottom"> <ul class="pf-v6-c-tabs__list"> <li class="pf-v6-c-tabs__item"> <a class="pf-v6-c-tabs__link" href="/components/dual-list-selector/react"> React </a> </li><li class="pf-v6-c-tabs__item"> <a class="pf-v6-c-tabs__link" href="/components/dual-list-selector/react-deprecated"> React deprecated </a> </li> </ul> </div> </div></section><section id="main-content" class="pf-v6-c-page__main-section pf-m-fill"><div class="pf-v6-c-page__main-body"> <h2 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-441" data-pf-content="true" class="pf-v6-c-content--h2">Examples</h2>
46
- <p data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-442" data-pf-content="true" class="pf-v6-c-content--p">The dual list selector is built in a composable manner to make customization easier. The standard sub-component relationships are arranged as follows:</p>
47
- <pre data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-457" data-pf-content="true" class="pf-v6-c-content--pre"><code><span class="line"><span>&lt;DualListSelector&gt;</span></span>
45
+ [data-astro-transition-fallback="new"][data-astro-transition-scope="astro-2e6ke2uy-4"] { animation: none; mix-blend-mode: normal; }</style></head> <body> <div class="pf-v6-c-page"> <script>(()=>{var l=(n,t)=>{let i=async()=>{await(await n())()},e=typeof t.value=="object"?t.value:void 0,s={timeout:e==null?void 0:e.timeout};"requestIdleCallback"in window?window.requestIdleCallback(i,s):setTimeout(i,s.timeout||200)};(self.Astro||(self.Astro={})).idle=l;window.dispatchEvent(new Event("astro:idle"));})();</script><header class="pf-v6-c-masthead pf-m-display-inline-on-md"> <div class="pf-v6-c-masthead__main"> <span class="pf-v6-c-masthead__toggle"> <astro-island uid="Z1xUGfL" prefix="r5" component-url="/_astro/PageToggle.DBsLIFpI.js" component-export="PageToggle" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;data-astro-transition-persist&quot;:[0,&quot;astro-u5p5alki-2&quot;]}" ssr client="idle" opts="{&quot;name&quot;:&quot;PageToggle&quot;,&quot;value&quot;:true}" data-astro-transition-persist="astro-u5p5alki-2" await-children><button id="nav-toggle" aria-expanded="true" aria-label="Global navigation" class="pf-v6-c-button pf-m-plain" type="button" data-ouia-component-type="PF6/Button" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Button-plain-76"><span class="pf-v6-c-button__text"><svg class="pf-v6-svg" viewBox="0 0 448 512" fill="currentColor" aria-hidden="true" role="img" width="1em" height="1em"><path d="M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z"></path></svg></span></button><!--astro:end--></astro-island> </span> <div class="pf-v6-c-masthead__brand"> <a class="pf-v6-c-masthead__logo" tabindex="0" href="/"> <img class="pf-v6-c-brand" style="--pf-v6-c-brand--Height:36px" src="/PF-HorizontalLogo-Color.svg" alt="PatternFly"/> </a> </div> </div> <div class="pf-v6-c-masthead__content"> <astro-island uid="Z2mCHn3" prefix="r7" component-url="/_astro/Toolbar.BNjGRsAQ.js" component-export="Toolbar" renderer-url="/_astro/client.DN8ES6L5.js" props="{}" ssr client="idle" opts="{&quot;name&quot;:&quot;ReactToolbar&quot;,&quot;value&quot;:true}" await-children><div class="pf-v6-c-toolbar pf-m-static" id="toolbar" data-ouia-component-type="PF6/Toolbar" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Toolbar-26"><div class="pf-v6-c-toolbar__content"><div class="pf-v6-c-toolbar__content-section"><div class="pf-v6-c-toolbar__group pf-m-action-group-plain pf-m-align-end pf-m-gap-none pf-m-gap-md-on-md"><div class="pf-v6-c-toolbar__item"></div><div class="pf-v6-c-toolbar__item"><div class="pf-v6-c-input-group ws-global-search"><div class="pf-v6-c-input-group__item"><button aria-expanded="false" aria-label="Expandable search input toggle" class="pf-v6-c-button pf-m-plain" type="button" data-ouia-component-type="PF6/Button" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Button-plain-77"><span class="pf-v6-c-button__icon"><svg class="pf-v6-svg" viewBox="0 0 512 512" fill="currentColor" aria-hidden="true" role="img" width="1em" height="1em"><path d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"></path></svg></span></button></div></div></div><div class="pf-v6-c-toolbar__item"><a href="//github.com/patternfly" target="top" aria-label="PatternFly GitHub page" class="pf-v6-c-button pf-m-plain" data-ouia-component-type="PF6/Button" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Button-plain-78"><span class="pf-v6-c-button__text"><svg class="pf-v6-svg" viewBox="0 0 496 512" fill="currentColor" aria-hidden="true" role="img" width="1em" height="1em"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg></span></a></div><div class="pf-v6-c-toolbar__item"><button class="pf-v6-c-menu-toggle" type="button" aria-expanded="false" data-ouia-component-type="PF6/MenuToggle" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-MenuToggle-26"><span class="pf-v6-c-menu-toggle__text">Release 6.1.0</span><span class="pf-v6-c-menu-toggle__controls"><span class="pf-v6-c-menu-toggle__toggle-icon"><svg class="pf-v6-svg" viewBox="0 0 320 512" fill="currentColor" aria-hidden="true" role="img" width="1em" height="1em"><path d="M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z"></path></svg></span></span></button></div></div></div></div><div class="pf-v6-c-toolbar__content pf-m-hidden" hidden=""><div class="pf-v6-c-toolbar__group"></div></div></div><!--astro:end--></astro-island> </div> </header> <astro-island uid="193Wv7" component-url="/_astro/Navigation.B2RHZcqO.js" component-export="Navigation" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;navData&quot;:[1,[[1,[[0,{&quot;id&quot;:[0,&quot;src/components/aboutmodal/examples/aboutmodal&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;About modal&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/accordion/examples/accordion&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Accordion&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/actionlist/examples/actionlist&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Action list&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/alert/examples/alert&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Alert&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/avatar/examples/avatar&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Avatar&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/backtotop/examples/backtotop&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Back to top&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/backdrop/examples/backdrop&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Backdrop&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/backgroundimage/examples/backgroundimage&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Background image&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/badge/examples/badge&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Badge&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/banner/examples/banner&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Banner&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/brand/examples/brand&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Brand&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/breadcrumb/examples/breadcrumb&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Breadcrumb&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/button/examples/button&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Button&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/calendarmonth/examples/calendarmonth&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Calendar month&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/card/examples/card&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Card&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/checkbox/examples/checkbox&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Checkbox&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/deprecated/components/chip/examples/chip&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Chip&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/clipboardcopy/examples/clipboardcopy&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Clipboard copy&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/codeblock/examples/codeblock&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Code block&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/content/examples/content&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Content&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/datalist/examples/datalist&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Data list&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/datepicker/examples/datepicker&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Date picker&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/descriptionlist/examples/descriptionlist&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Description list&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/divider/examples/divider&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Divider&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/deprecated/components/dragdrop/examples/dragdrop&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Drag and drop&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/drawer/examples/drawer&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Drawer&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/dropdown/examples/dropdown&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Dropdown&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/duallistselector/examples/duallistselector&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Dual list selector&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/emptystate/examples/emptystate&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Empty state&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/expandablesection/examples/expandablesection&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Expandable section&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/form/examples/form&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Form&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/formselect/examples/formselect&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Form select&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/helpertext/examples/helpertext&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Helper text&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/hint/examples/hint&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Hint&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/icon/examples/icon&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Icon&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/inputgroup/examples/inputgroup&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Input group&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/jumplinks/examples/jumplinks&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Jump links&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/label/examples/label&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Label&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/list/examples/list&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;List&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/loginpage/examples/loginpage&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Login page&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/masthead/examples/masthead&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Masthead&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/menu/examples/menu&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Menu&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/menutoggle/examples/menutoggle&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Menu toggle&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/modal/examples/modal&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Modal&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/multiplefileupload/examples/multiplefileupload&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Multiple file upload&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/nav/examples/nav&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Navigation&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/notificationbadge/examples/notificationbadge&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Notification badge&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/notificationdrawer/examples/notificationdrawer&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Notification drawer&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/numberinput/examples/numberinput&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Number input&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/overflowmenu/examples/overflowmenu&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Overflow menu&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/page/examples/page&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Page&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/pagination/examples/pagination&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Pagination&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/panel/examples/panel&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Panel&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/popover/examples/popover&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Popover&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/progress/examples/progress&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Progress&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/progressstepper/examples/progressstepper&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Progress stepper&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/radio/examples/radio&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Radio&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/searchinput/examples/searchinput&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Search input&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/select/examples/select&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Select&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/sidebar/examples/sidebar&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Sidebar&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/fileupload/examples/fileupload&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Simple file upload&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/simplelist/examples/simplelist&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Simple list&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/skeleton/examples/skeleton&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Skeleton&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/skiptocontent/examples/skiptocontent&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Skip to content&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/slider/examples/slider&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Slider&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/spinner/examples/spinner&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Spinner&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/switch/examples/switch&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Switch&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/tabs/examples/tabs&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Tabs&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/textarea/examples/textarea&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Text area&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/textinput/examples/textinput&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Text input&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/textinputgroup/examples/textinputgroup&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Text input group&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/deprecated/components/tile/examples/tile&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Tile&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/timepicker/examples/timepicker&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Time picker&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/timestamp/examples/timestamp&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Timestamp&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/title/examples/title&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Title&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/togglegroup/examples/togglegroup&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Toggle group&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/toolbar/examples/toolbar&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Toolbar&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/tooltip/examples/tooltip&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Tooltip&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/treeview/examples/treeview&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Tree view&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/truncate/examples/truncate&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Truncate&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}],[0,{&quot;id&quot;:[0,&quot;src/components/wizard/examples/wizard&quot;],&quot;data&quot;:[0,{&quot;id&quot;:[0,&quot;Wizard&quot;],&quot;section&quot;:[0,&quot;components&quot;],&quot;sortValue&quot;:[0]}]}]]]]],&quot;data-astro-transition-scope&quot;:[0,&quot;astro-xikxfxwm-3&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;ReactNav&quot;,&quot;value&quot;:&quot;react&quot;}" data-astro-transition-scope="astro-xikxfxwm-3"></astro-island> <div class="pf-v6-c-page__main-container"> <main class="pf-v6-c-page__main"> <section class="pf-v6-c-page__main-section"><div class="pf-v6-c-page__main-body"> <section id="ws-sticky-nav-tabs" class="pf-v6-c-page__main-tabs pf-m-sticky-top"><div class="pf-v6-c-page__main-body"> <div class="pf-v6-c-tabs pf-m-page-insets pf-m-no-border-bottom"> <ul class="pf-v6-c-tabs__list"> <li class="pf-v6-c-tabs__item"> <a class="pf-v6-c-tabs__link" href="/components/dual-list-selector/react"> React </a> </li><li class="pf-v6-c-tabs__item"> <a class="pf-v6-c-tabs__link" href="/components/dual-list-selector/react-deprecated"> React deprecated </a> </li> </ul> </div> </div></section><section id="main-content" class="pf-v6-c-page__main-section pf-m-fill"><div class="pf-v6-c-page__main-body"> <h2 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-431" data-pf-content="true" class="pf-v6-c-content--h2">Examples</h2>
46
+ <p data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-432" data-pf-content="true" class="pf-v6-c-content--p">The dual list selector is built in a composable manner to make customization easier. The standard sub-component relationships are arranged as follows:</p>
47
+ <pre data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-447" data-pf-content="true" class="pf-v6-c-content--pre"><code><span class="line"><span>&lt;DualListSelector&gt;</span></span>
48
48
  <span class="line"><span> &lt;DualListSelectorPane&gt;</span></span>
49
49
  <span class="line"><span> &lt;DualListSelectorList&gt;</span></span>
50
50
  <span class="line"><span> &lt;DualListSelectorListItem /&gt;</span></span>
@@ -61,29 +61,29 @@
61
61
  <span class="line"><span> &lt;/DualListSelectorList&gt;</span></span>
62
62
  <span class="line"><span> &lt;/DualListSelectorPane&gt;</span></span>
63
63
  <span class="line"><span>&lt;/DualListSelector&gt;</span></span></code></pre>
64
- <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-443" data-pf-content="true" class="pf-v6-c-content--h3">Basic</h3>
64
+ <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-433" data-pf-content="true" class="pf-v6-c-content--h3">Basic</h3>
65
65
 
66
- <style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event("astro:only"));})();</script><script>(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},h=this.querySelectorAll("template[data-astro-template]");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let p;try{p=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute("props"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),u=this.getAttribute("component-export")||"default";if(!u.includes("."))this.Component=h[u];else{this.Component=h;for(let f of u.split("."))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",y)}})();</script><astro-island uid="13D1N9" component-url="/_astro/LiveExample.BOl02361.js" component-export="LiveExample" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;src&quot;:[0,&quot;import { useState } from &#39;react&#39;;\nimport {\n DualListSelector,\n DualListSelectorPane,\n DualListSelectorList,\n DualListSelectorListItem,\n DualListSelectorControlsWrapper,\n DualListSelectorControl\n} from &#39;@patternfly/react-core&#39;;\nimport AngleDoubleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-left-icon&#39;;\nimport AngleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-left-icon&#39;;\nimport AngleDoubleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-right-icon&#39;;\nimport AngleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-right-icon&#39;;\n\ninterface Option {\n text: string;\n selected: boolean;\n isVisible: boolean;\n}\n\nexport const DualListSelectorBasic: React.FunctionComponent = () =&gt; {\n const [availableOptions, setAvailableOptions] = useState&lt;Option[]&gt;([\n { text: &#39;Option 1&#39;, selected: false, isVisible: true },\n { text: &#39;Option 2&#39;, selected: false, isVisible: true },\n { text: &#39;Option 3&#39;, selected: false, isVisible: true },\n { text: &#39;Option 4&#39;, selected: false, isVisible: true }\n ]);\n const [chosenOptions, setChosenOptions] = useState&lt;Option[]&gt;([]);\n\n // callback for moving selected options between lists\n const moveSelected = (fromAvailable: boolean) =&gt; {\n const sourceOptions = fromAvailable ? availableOptions : chosenOptions;\n const destinationOptions = fromAvailable ? chosenOptions : availableOptions;\n for (let i = 0; i &lt; sourceOptions.length; i++) {\n const option = sourceOptions[i];\n if (option.selected &amp;&amp; option.isVisible) {\n sourceOptions.splice(i, 1);\n destinationOptions.push(option);\n option.selected = false;\n i--;\n }\n }\n if (fromAvailable) {\n setAvailableOptions([...sourceOptions]);\n setChosenOptions([...destinationOptions]);\n } else {\n setChosenOptions([...sourceOptions]);\n setAvailableOptions([...destinationOptions]);\n }\n };\n\n // callback for moving all options between lists\n const moveAll = (fromAvailable: boolean) =&gt; {\n if (fromAvailable) {\n setChosenOptions([...availableOptions.filter((option) =&gt; option.isVisible), ...chosenOptions]);\n setAvailableOptions([...availableOptions.filter((option) =&gt; !option.isVisible)]);\n } else {\n setAvailableOptions([...chosenOptions.filter((option) =&gt; option.isVisible), ...availableOptions]);\n setChosenOptions([...chosenOptions.filter((option) =&gt; !option.isVisible)]);\n }\n };\n\n // callback when option is selected\n const onOptionSelect = (\n event: React.MouseEvent | React.ChangeEvent | React.KeyboardEvent,\n index: number,\n isChosen: boolean\n ) =&gt; {\n if (isChosen) {\n const newChosen = [...chosenOptions];\n newChosen[index].selected = !chosenOptions[index].selected;\n setChosenOptions(newChosen);\n } else {\n const newAvailable = [...availableOptions];\n newAvailable[index].selected = !availableOptions[index].selected;\n setAvailableOptions(newAvailable);\n }\n };\n\n return (\n &lt;DualListSelector&gt;\n &lt;DualListSelectorPane\n title=\&quot;Available options\&quot;\n status={`${availableOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n availableOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n &gt;\n &lt;DualListSelectorList&gt;\n {availableOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`basic-available-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, false)}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n &lt;/DualListSelectorPane&gt;\n &lt;DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorControl\n isDisabled={!availableOptions.some((option) =&gt; option.selected)}\n onClick={() =&gt; moveSelected(true)}\n aria-label=\&quot;Add selected\&quot;\n icon={&lt;AngleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={availableOptions.length === 0}\n onClick={() =&gt; moveAll(true)}\n aria-label=\&quot;Add all\&quot;\n icon={&lt;AngleDoubleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={chosenOptions.length === 0}\n onClick={() =&gt; moveAll(false)}\n aria-label=\&quot;Remove all\&quot;\n icon={&lt;AngleDoubleLeftIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n onClick={() =&gt; moveSelected(false)}\n isDisabled={!chosenOptions.some((option) =&gt; option.selected)}\n aria-label=\&quot;Remove selected\&quot;\n icon={&lt;AngleLeftIcon /&gt;}\n /&gt;\n &lt;/DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorPane\n title=\&quot;Chosen options\&quot;\n status={`${chosenOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n chosenOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n isChosen\n &gt;\n &lt;DualListSelectorList&gt;\n {chosenOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`composable-basic-chosen-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, true)}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n &lt;/DualListSelectorPane&gt;\n &lt;/DualListSelector&gt;\n );\n};\n&quot;],&quot;html&quot;:[0]}" ssr client="only" opts="{&quot;name&quot;:&quot;LiveExampleBase&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island>
67
- <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-444" data-pf-content="true" class="pf-v6-c-content--h3">Basic with tooltips</h3>
66
+ <style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event("astro:only"));})();</script><script>(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},h=this.querySelectorAll("template[data-astro-template]");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let p;try{p=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute("props"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),u=this.getAttribute("component-export")||"default";if(!u.includes("."))this.Component=h[u];else{this.Component=h;for(let f of u.split("."))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",y)}})();</script><astro-island uid="13D1N9" component-url="/_astro/LiveExample.B5R4Dzng.js" component-export="LiveExample" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;src&quot;:[0,&quot;import { useState } from &#39;react&#39;;\nimport {\n DualListSelector,\n DualListSelectorPane,\n DualListSelectorList,\n DualListSelectorListItem,\n DualListSelectorControlsWrapper,\n DualListSelectorControl\n} from &#39;@patternfly/react-core&#39;;\nimport AngleDoubleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-left-icon&#39;;\nimport AngleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-left-icon&#39;;\nimport AngleDoubleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-right-icon&#39;;\nimport AngleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-right-icon&#39;;\n\ninterface Option {\n text: string;\n selected: boolean;\n isVisible: boolean;\n}\n\nexport const DualListSelectorBasic: React.FunctionComponent = () =&gt; {\n const [availableOptions, setAvailableOptions] = useState&lt;Option[]&gt;([\n { text: &#39;Option 1&#39;, selected: false, isVisible: true },\n { text: &#39;Option 2&#39;, selected: false, isVisible: true },\n { text: &#39;Option 3&#39;, selected: false, isVisible: true },\n { text: &#39;Option 4&#39;, selected: false, isVisible: true }\n ]);\n const [chosenOptions, setChosenOptions] = useState&lt;Option[]&gt;([]);\n\n // callback for moving selected options between lists\n const moveSelected = (fromAvailable: boolean) =&gt; {\n const sourceOptions = fromAvailable ? availableOptions : chosenOptions;\n const destinationOptions = fromAvailable ? chosenOptions : availableOptions;\n for (let i = 0; i &lt; sourceOptions.length; i++) {\n const option = sourceOptions[i];\n if (option.selected &amp;&amp; option.isVisible) {\n sourceOptions.splice(i, 1);\n destinationOptions.push(option);\n option.selected = false;\n i--;\n }\n }\n if (fromAvailable) {\n setAvailableOptions([...sourceOptions]);\n setChosenOptions([...destinationOptions]);\n } else {\n setChosenOptions([...sourceOptions]);\n setAvailableOptions([...destinationOptions]);\n }\n };\n\n // callback for moving all options between lists\n const moveAll = (fromAvailable: boolean) =&gt; {\n if (fromAvailable) {\n setChosenOptions([...availableOptions.filter((option) =&gt; option.isVisible), ...chosenOptions]);\n setAvailableOptions([...availableOptions.filter((option) =&gt; !option.isVisible)]);\n } else {\n setAvailableOptions([...chosenOptions.filter((option) =&gt; option.isVisible), ...availableOptions]);\n setChosenOptions([...chosenOptions.filter((option) =&gt; !option.isVisible)]);\n }\n };\n\n // callback when option is selected\n const onOptionSelect = (\n event: React.MouseEvent | React.ChangeEvent | React.KeyboardEvent,\n index: number,\n isChosen: boolean\n ) =&gt; {\n if (isChosen) {\n const newChosen = [...chosenOptions];\n newChosen[index].selected = !chosenOptions[index].selected;\n setChosenOptions(newChosen);\n } else {\n const newAvailable = [...availableOptions];\n newAvailable[index].selected = !availableOptions[index].selected;\n setAvailableOptions(newAvailable);\n }\n };\n\n return (\n &lt;DualListSelector&gt;\n &lt;DualListSelectorPane\n title=\&quot;Available options\&quot;\n status={`${availableOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n availableOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n &gt;\n &lt;DualListSelectorList&gt;\n {availableOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`basic-available-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, false)}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n &lt;/DualListSelectorPane&gt;\n &lt;DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorControl\n isDisabled={!availableOptions.some((option) =&gt; option.selected)}\n onClick={() =&gt; moveSelected(true)}\n aria-label=\&quot;Add selected\&quot;\n icon={&lt;AngleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={availableOptions.length === 0}\n onClick={() =&gt; moveAll(true)}\n aria-label=\&quot;Add all\&quot;\n icon={&lt;AngleDoubleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={chosenOptions.length === 0}\n onClick={() =&gt; moveAll(false)}\n aria-label=\&quot;Remove all\&quot;\n icon={&lt;AngleDoubleLeftIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n onClick={() =&gt; moveSelected(false)}\n isDisabled={!chosenOptions.some((option) =&gt; option.selected)}\n aria-label=\&quot;Remove selected\&quot;\n icon={&lt;AngleLeftIcon /&gt;}\n /&gt;\n &lt;/DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorPane\n title=\&quot;Chosen options\&quot;\n status={`${chosenOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n chosenOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n isChosen\n &gt;\n &lt;DualListSelectorList&gt;\n {chosenOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`composable-basic-chosen-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, true)}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n &lt;/DualListSelectorPane&gt;\n &lt;/DualListSelector&gt;\n );\n};\n&quot;],&quot;html&quot;:[0]}" ssr client="only" opts="{&quot;name&quot;:&quot;LiveExampleBase&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island>
67
+ <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-434" data-pf-content="true" class="pf-v6-c-content--h3">Basic with tooltips</h3>
68
68
 
69
- <astro-island uid="Z24a6Xe" component-url="/_astro/LiveExample.BOl02361.js" component-export="LiveExample" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;src&quot;:[0,&quot;import { useState } from &#39;react&#39;;\nimport {\n DualListSelector,\n DualListSelectorPane,\n DualListSelectorList,\n DualListSelectorListItem,\n DualListSelectorControlsWrapper,\n DualListSelectorControl\n} from &#39;@patternfly/react-core&#39;;\nimport AngleDoubleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-left-icon&#39;;\nimport AngleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-left-icon&#39;;\nimport AngleDoubleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-right-icon&#39;;\nimport AngleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-right-icon&#39;;\n\ninterface Option {\n text: string;\n selected: boolean;\n isVisible: boolean;\n}\n\nexport const DualListSelectorBasic: React.FunctionComponent = () =&gt; {\n const [availableOptions, setAvailableOptions] = useState&lt;Option[]&gt;([\n { text: &#39;Option 1&#39;, selected: false, isVisible: true },\n { text: &#39;Option 2&#39;, selected: false, isVisible: true },\n { text: &#39;Option 3&#39;, selected: false, isVisible: true },\n { text: &#39;Option 4&#39;, selected: false, isVisible: true }\n ]);\n const [chosenOptions, setChosenOptions] = useState&lt;Option[]&gt;([]);\n\n // callback for moving selected options between lists\n const moveSelected = (fromAvailable: boolean) =&gt; {\n const sourceOptions = fromAvailable ? availableOptions : chosenOptions;\n const destinationOptions = fromAvailable ? chosenOptions : availableOptions;\n for (let i = 0; i &lt; sourceOptions.length; i++) {\n const option = sourceOptions[i];\n if (option.selected &amp;&amp; option.isVisible) {\n sourceOptions.splice(i, 1);\n destinationOptions.push(option);\n option.selected = false;\n i--;\n }\n }\n if (fromAvailable) {\n setAvailableOptions([...sourceOptions]);\n setChosenOptions([...destinationOptions]);\n } else {\n setChosenOptions([...sourceOptions]);\n setAvailableOptions([...destinationOptions]);\n }\n };\n\n // callback for moving all options between lists\n const moveAll = (fromAvailable: boolean) =&gt; {\n if (fromAvailable) {\n setChosenOptions([...availableOptions.filter((option) =&gt; option.isVisible), ...chosenOptions]);\n setAvailableOptions([...availableOptions.filter((option) =&gt; !option.isVisible)]);\n } else {\n setAvailableOptions([...chosenOptions.filter((option) =&gt; option.isVisible), ...availableOptions]);\n setChosenOptions([...chosenOptions.filter((option) =&gt; !option.isVisible)]);\n }\n };\n\n // callback when option is selected\n const onOptionSelect = (\n event: React.MouseEvent | React.ChangeEvent | React.KeyboardEvent,\n index: number,\n isChosen: boolean\n ) =&gt; {\n if (isChosen) {\n const newChosen = [...chosenOptions];\n newChosen[index].selected = !chosenOptions[index].selected;\n setChosenOptions(newChosen);\n } else {\n const newAvailable = [...availableOptions];\n newAvailable[index].selected = !availableOptions[index].selected;\n setAvailableOptions(newAvailable);\n }\n };\n\n return (\n &lt;DualListSelector&gt;\n &lt;DualListSelectorPane\n title=\&quot;Available options\&quot;\n status={`${availableOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n availableOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n &gt;\n &lt;DualListSelectorList&gt;\n {availableOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`tooltips-available-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, false)}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n &lt;/DualListSelectorPane&gt;\n &lt;DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorControl\n isDisabled={!availableOptions.some((option) =&gt; option.selected)}\n onClick={() =&gt; moveSelected(true)}\n aria-label=\&quot;Add selected\&quot;\n tooltipContent=\&quot;Add selected\&quot;\n tooltipProps={{ position: &#39;top&#39;, &#39;aria-live&#39;: &#39;off&#39; }}\n icon={&lt;AngleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={availableOptions.length === 0}\n onClick={() =&gt; moveAll(true)}\n aria-label=\&quot;Add all\&quot;\n tooltipContent=\&quot;Add all\&quot;\n tooltipProps={{ position: &#39;right&#39;, &#39;aria-live&#39;: &#39;off&#39; }}\n icon={&lt;AngleDoubleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={chosenOptions.length === 0}\n onClick={() =&gt; moveAll(false)}\n aria-label=\&quot;Remove all\&quot;\n tooltipContent=\&quot;Remove all\&quot;\n tooltipProps={{ position: &#39;left&#39;, &#39;aria-live&#39;: &#39;off&#39; }}\n icon={&lt;AngleDoubleLeftIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n onClick={() =&gt; moveSelected(false)}\n isDisabled={!chosenOptions.some((option) =&gt; option.selected)}\n aria-label=\&quot;Remove selected\&quot;\n tooltipContent=\&quot;Remove selected\&quot;\n tooltipProps={{ position: &#39;bottom&#39;, &#39;aria-live&#39;: &#39;off&#39; }}\n icon={&lt;AngleLeftIcon /&gt;}\n /&gt;\n &lt;/DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorPane\n title=\&quot;Chosen options\&quot;\n status={`${chosenOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n chosenOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n isChosen\n &gt;\n &lt;DualListSelectorList&gt;\n {chosenOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`composable-tooltips-chosen-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, true)}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n &lt;/DualListSelectorPane&gt;\n &lt;/DualListSelector&gt;\n );\n};\n&quot;],&quot;html&quot;:[0]}" ssr client="only" opts="{&quot;name&quot;:&quot;LiveExampleBase&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island>
70
- <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-445" data-pf-content="true" class="pf-v6-c-content--h3">Basic with search</h3>
69
+ <astro-island uid="Z24a6Xe" component-url="/_astro/LiveExample.B5R4Dzng.js" component-export="LiveExample" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;src&quot;:[0,&quot;import { useState } from &#39;react&#39;;\nimport {\n DualListSelector,\n DualListSelectorPane,\n DualListSelectorList,\n DualListSelectorListItem,\n DualListSelectorControlsWrapper,\n DualListSelectorControl\n} from &#39;@patternfly/react-core&#39;;\nimport AngleDoubleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-left-icon&#39;;\nimport AngleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-left-icon&#39;;\nimport AngleDoubleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-right-icon&#39;;\nimport AngleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-right-icon&#39;;\n\ninterface Option {\n text: string;\n selected: boolean;\n isVisible: boolean;\n}\n\nexport const DualListSelectorBasic: React.FunctionComponent = () =&gt; {\n const [availableOptions, setAvailableOptions] = useState&lt;Option[]&gt;([\n { text: &#39;Option 1&#39;, selected: false, isVisible: true },\n { text: &#39;Option 2&#39;, selected: false, isVisible: true },\n { text: &#39;Option 3&#39;, selected: false, isVisible: true },\n { text: &#39;Option 4&#39;, selected: false, isVisible: true }\n ]);\n const [chosenOptions, setChosenOptions] = useState&lt;Option[]&gt;([]);\n\n // callback for moving selected options between lists\n const moveSelected = (fromAvailable: boolean) =&gt; {\n const sourceOptions = fromAvailable ? availableOptions : chosenOptions;\n const destinationOptions = fromAvailable ? chosenOptions : availableOptions;\n for (let i = 0; i &lt; sourceOptions.length; i++) {\n const option = sourceOptions[i];\n if (option.selected &amp;&amp; option.isVisible) {\n sourceOptions.splice(i, 1);\n destinationOptions.push(option);\n option.selected = false;\n i--;\n }\n }\n if (fromAvailable) {\n setAvailableOptions([...sourceOptions]);\n setChosenOptions([...destinationOptions]);\n } else {\n setChosenOptions([...sourceOptions]);\n setAvailableOptions([...destinationOptions]);\n }\n };\n\n // callback for moving all options between lists\n const moveAll = (fromAvailable: boolean) =&gt; {\n if (fromAvailable) {\n setChosenOptions([...availableOptions.filter((option) =&gt; option.isVisible), ...chosenOptions]);\n setAvailableOptions([...availableOptions.filter((option) =&gt; !option.isVisible)]);\n } else {\n setAvailableOptions([...chosenOptions.filter((option) =&gt; option.isVisible), ...availableOptions]);\n setChosenOptions([...chosenOptions.filter((option) =&gt; !option.isVisible)]);\n }\n };\n\n // callback when option is selected\n const onOptionSelect = (\n event: React.MouseEvent | React.ChangeEvent | React.KeyboardEvent,\n index: number,\n isChosen: boolean\n ) =&gt; {\n if (isChosen) {\n const newChosen = [...chosenOptions];\n newChosen[index].selected = !chosenOptions[index].selected;\n setChosenOptions(newChosen);\n } else {\n const newAvailable = [...availableOptions];\n newAvailable[index].selected = !availableOptions[index].selected;\n setAvailableOptions(newAvailable);\n }\n };\n\n return (\n &lt;DualListSelector&gt;\n &lt;DualListSelectorPane\n title=\&quot;Available options\&quot;\n status={`${availableOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n availableOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n &gt;\n &lt;DualListSelectorList&gt;\n {availableOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`tooltips-available-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, false)}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n &lt;/DualListSelectorPane&gt;\n &lt;DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorControl\n isDisabled={!availableOptions.some((option) =&gt; option.selected)}\n onClick={() =&gt; moveSelected(true)}\n aria-label=\&quot;Add selected\&quot;\n tooltipContent=\&quot;Add selected\&quot;\n tooltipProps={{ position: &#39;top&#39;, &#39;aria-live&#39;: &#39;off&#39; }}\n icon={&lt;AngleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={availableOptions.length === 0}\n onClick={() =&gt; moveAll(true)}\n aria-label=\&quot;Add all\&quot;\n tooltipContent=\&quot;Add all\&quot;\n tooltipProps={{ position: &#39;right&#39;, &#39;aria-live&#39;: &#39;off&#39; }}\n icon={&lt;AngleDoubleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={chosenOptions.length === 0}\n onClick={() =&gt; moveAll(false)}\n aria-label=\&quot;Remove all\&quot;\n tooltipContent=\&quot;Remove all\&quot;\n tooltipProps={{ position: &#39;left&#39;, &#39;aria-live&#39;: &#39;off&#39; }}\n icon={&lt;AngleDoubleLeftIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n onClick={() =&gt; moveSelected(false)}\n isDisabled={!chosenOptions.some((option) =&gt; option.selected)}\n aria-label=\&quot;Remove selected\&quot;\n tooltipContent=\&quot;Remove selected\&quot;\n tooltipProps={{ position: &#39;bottom&#39;, &#39;aria-live&#39;: &#39;off&#39; }}\n icon={&lt;AngleLeftIcon /&gt;}\n /&gt;\n &lt;/DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorPane\n title=\&quot;Chosen options\&quot;\n status={`${chosenOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n chosenOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n isChosen\n &gt;\n &lt;DualListSelectorList&gt;\n {chosenOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`composable-tooltips-chosen-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, true)}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n &lt;/DualListSelectorPane&gt;\n &lt;/DualListSelector&gt;\n );\n};\n&quot;],&quot;html&quot;:[0]}" ssr client="only" opts="{&quot;name&quot;:&quot;LiveExampleBase&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island>
70
+ <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-435" data-pf-content="true" class="pf-v6-c-content--h3">Basic with search</h3>
71
71
 
72
- <astro-island uid="zReaW" component-url="/_astro/LiveExample.BOl02361.js" component-export="LiveExample" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;src&quot;:[0,&quot;import { useState } from &#39;react&#39;;\nimport {\n Button,\n DualListSelector,\n DualListSelectorPane,\n DualListSelectorList,\n DualListSelectorListItem,\n DualListSelectorControlsWrapper,\n DualListSelectorControl,\n SearchInput,\n EmptyState,\n EmptyStateVariant,\n EmptyStateFooter,\n EmptyStateBody,\n EmptyStateActions\n} from &#39;@patternfly/react-core&#39;;\nimport AngleDoubleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-left-icon&#39;;\nimport AngleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-left-icon&#39;;\nimport AngleDoubleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-right-icon&#39;;\nimport AngleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-right-icon&#39;;\nimport SearchIcon from &#39;@patternfly/react-icons/dist/esm/icons/search-icon&#39;;\n\ninterface Option {\n text: string;\n selected: boolean;\n isVisible: boolean;\n}\n\nexport const DualListSelectorSearch: React.FunctionComponent = () =&gt; {\n const [availableOptions, setAvailableOptions] = useState&lt;Option[]&gt;([\n { text: &#39;Option 1&#39;, selected: false, isVisible: true },\n { text: &#39;Option 2&#39;, selected: false, isVisible: true },\n { text: &#39;Option 3&#39;, selected: false, isVisible: true },\n { text: &#39;Option 4&#39;, selected: false, isVisible: true }\n ]);\n\n const [chosenOptions, setChosenOptions] = useState&lt;Option[]&gt;([]);\n const [availableFilter, setAvailableFilter] = useState(&#39;&#39;);\n const [chosenFilter, setChosenFilter] = useState(&#39;&#39;);\n\n // callback for moving selected options between lists\n const moveSelected = (fromAvailable: boolean) =&gt; {\n const sourceOptions = fromAvailable ? availableOptions : chosenOptions;\n const destinationOptions = fromAvailable ? chosenOptions : availableOptions;\n for (let i = 0; i &lt; sourceOptions.length; i++) {\n const option = sourceOptions[i];\n if (option.selected &amp;&amp; option.isVisible) {\n sourceOptions.splice(i, 1);\n destinationOptions.push(option);\n option.selected = false;\n i--;\n }\n }\n if (fromAvailable) {\n setAvailableOptions([...sourceOptions]);\n setChosenOptions([...destinationOptions]);\n } else {\n setChosenOptions([...sourceOptions]);\n setAvailableOptions([...destinationOptions]);\n }\n };\n\n // callback for moving all options between lists\n const moveAll = (fromAvailable: boolean) =&gt; {\n if (fromAvailable) {\n setChosenOptions([...availableOptions.filter((option) =&gt; option.isVisible), ...chosenOptions]);\n setAvailableOptions([...availableOptions.filter((option) =&gt; !option.isVisible)]);\n } else {\n setAvailableOptions([...chosenOptions.filter((option) =&gt; option.isVisible), ...availableOptions]);\n setChosenOptions([...chosenOptions.filter((option) =&gt; !option.isVisible)]);\n }\n };\n\n // callback when option is selected\n const onOptionSelect = (\n event: React.MouseEvent | React.ChangeEvent | React.KeyboardEvent,\n index: number,\n isChosen: boolean\n ) =&gt; {\n if (isChosen) {\n const newChosen = [...chosenOptions];\n newChosen[index].selected = !chosenOptions[index].selected;\n setChosenOptions(newChosen);\n } else {\n const newAvailable = [...availableOptions];\n newAvailable[index].selected = !availableOptions[index].selected;\n setAvailableOptions(newAvailable);\n }\n };\n\n const onFilterChange = (value: string, isAvailable: boolean) =&gt; {\n isAvailable ? setAvailableFilter(value) : setChosenFilter(value);\n const toFilter = isAvailable ? [...availableOptions] : [...chosenOptions];\n toFilter.forEach((option) =&gt; {\n option.isVisible = value === &#39;&#39; || option.text.toLowerCase().includes(value.toLowerCase());\n });\n };\n\n // builds a search input - used in each dual list selector pane\n const buildSearchInput = (isAvailable: boolean) =&gt; (\n &lt;SearchInput\n value={isAvailable ? availableFilter : chosenFilter}\n onChange={(_event, value) =&gt; onFilterChange(value, isAvailable)}\n onClear={() =&gt; onFilterChange(&#39;&#39;, isAvailable)}\n /&gt;\n );\n\n const buildEmptyState = (isAvailable: boolean) =&gt; (\n &lt;EmptyState titleText=\&quot;No results found\&quot; variant={EmptyStateVariant.sm} headingLevel=\&quot;h4\&quot; icon={SearchIcon}&gt;\n &lt;EmptyStateBody&gt;No results match the filter criteria. Clear all filters and try again.&lt;/EmptyStateBody&gt;\n &lt;EmptyStateFooter&gt;\n &lt;EmptyStateActions&gt;\n &lt;Button variant=\&quot;link\&quot; onClick={() =&gt; onFilterChange(&#39;&#39;, isAvailable)}&gt;\n Clear all filters\n &lt;/Button&gt;\n &lt;/EmptyStateActions&gt;\n &lt;/EmptyStateFooter&gt;\n &lt;/EmptyState&gt;\n );\n\n return (\n &lt;DualListSelector&gt;\n &lt;DualListSelectorPane\n title=\&quot;Available options\&quot;\n status={`${availableOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n availableOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n searchInput={buildSearchInput(true)}\n listMinHeight=\&quot;300px\&quot;\n &gt;\n {availableFilter !== &#39;&#39; &amp;&amp;\n availableOptions.filter((option) =&gt; option.isVisible).length === 0 &amp;&amp;\n buildEmptyState(true)}\n\n &lt;DualListSelectorList&gt;\n {availableOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`search-available-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, false)}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n &lt;/DualListSelectorPane&gt;\n &lt;DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorControl\n isDisabled={!availableOptions.some((option) =&gt; option.selected)}\n onClick={() =&gt; moveSelected(true)}\n aria-label=\&quot;Add selected\&quot;\n icon={&lt;AngleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={availableOptions.length === 0}\n onClick={() =&gt; moveAll(true)}\n aria-label=\&quot;Add all\&quot;\n icon={&lt;AngleDoubleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={chosenOptions.length === 0}\n onClick={() =&gt; moveAll(false)}\n aria-label=\&quot;Remove all\&quot;\n icon={&lt;AngleDoubleLeftIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n onClick={() =&gt; moveSelected(false)}\n isDisabled={!chosenOptions.some((option) =&gt; option.selected)}\n aria-label=\&quot;Remove selected\&quot;\n icon={&lt;AngleLeftIcon /&gt;}\n /&gt;\n &lt;/DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorPane\n title=\&quot;Chosen options\&quot;\n status={`${chosenOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n chosenOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n searchInput={buildSearchInput(false)}\n listMinHeight=\&quot;300px\&quot;\n isChosen\n &gt;\n {chosenFilter !== &#39;&#39; &amp;&amp;\n chosenOptions.filter((option) =&gt; option.isVisible).length === 0 &amp;&amp;\n buildEmptyState(false)}\n {chosenOptions.filter((option) =&gt; option.isVisible).length &gt; 0 &amp;&amp; (\n &lt;DualListSelectorList&gt;\n {chosenOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`composable-search-chosen-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, true)}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n )}\n &lt;/DualListSelectorPane&gt;\n &lt;/DualListSelector&gt;\n );\n};\n&quot;],&quot;html&quot;:[0]}" ssr client="only" opts="{&quot;name&quot;:&quot;LiveExampleBase&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island>
73
- <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-446" data-pf-content="true" class="pf-v6-c-content--h3">Using more complex options with actions</h3>
72
+ <astro-island uid="zReaW" component-url="/_astro/LiveExample.B5R4Dzng.js" component-export="LiveExample" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;src&quot;:[0,&quot;import { useState } from &#39;react&#39;;\nimport {\n Button,\n DualListSelector,\n DualListSelectorPane,\n DualListSelectorList,\n DualListSelectorListItem,\n DualListSelectorControlsWrapper,\n DualListSelectorControl,\n SearchInput,\n EmptyState,\n EmptyStateVariant,\n EmptyStateFooter,\n EmptyStateBody,\n EmptyStateActions\n} from &#39;@patternfly/react-core&#39;;\nimport AngleDoubleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-left-icon&#39;;\nimport AngleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-left-icon&#39;;\nimport AngleDoubleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-right-icon&#39;;\nimport AngleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-right-icon&#39;;\nimport SearchIcon from &#39;@patternfly/react-icons/dist/esm/icons/search-icon&#39;;\n\ninterface Option {\n text: string;\n selected: boolean;\n isVisible: boolean;\n}\n\nexport const DualListSelectorSearch: React.FunctionComponent = () =&gt; {\n const [availableOptions, setAvailableOptions] = useState&lt;Option[]&gt;([\n { text: &#39;Option 1&#39;, selected: false, isVisible: true },\n { text: &#39;Option 2&#39;, selected: false, isVisible: true },\n { text: &#39;Option 3&#39;, selected: false, isVisible: true },\n { text: &#39;Option 4&#39;, selected: false, isVisible: true }\n ]);\n\n const [chosenOptions, setChosenOptions] = useState&lt;Option[]&gt;([]);\n const [availableFilter, setAvailableFilter] = useState(&#39;&#39;);\n const [chosenFilter, setChosenFilter] = useState(&#39;&#39;);\n\n // callback for moving selected options between lists\n const moveSelected = (fromAvailable: boolean) =&gt; {\n const sourceOptions = fromAvailable ? availableOptions : chosenOptions;\n const destinationOptions = fromAvailable ? chosenOptions : availableOptions;\n for (let i = 0; i &lt; sourceOptions.length; i++) {\n const option = sourceOptions[i];\n if (option.selected &amp;&amp; option.isVisible) {\n sourceOptions.splice(i, 1);\n destinationOptions.push(option);\n option.selected = false;\n i--;\n }\n }\n if (fromAvailable) {\n setAvailableOptions([...sourceOptions]);\n setChosenOptions([...destinationOptions]);\n } else {\n setChosenOptions([...sourceOptions]);\n setAvailableOptions([...destinationOptions]);\n }\n };\n\n // callback for moving all options between lists\n const moveAll = (fromAvailable: boolean) =&gt; {\n if (fromAvailable) {\n setChosenOptions([...availableOptions.filter((option) =&gt; option.isVisible), ...chosenOptions]);\n setAvailableOptions([...availableOptions.filter((option) =&gt; !option.isVisible)]);\n } else {\n setAvailableOptions([...chosenOptions.filter((option) =&gt; option.isVisible), ...availableOptions]);\n setChosenOptions([...chosenOptions.filter((option) =&gt; !option.isVisible)]);\n }\n };\n\n // callback when option is selected\n const onOptionSelect = (\n event: React.MouseEvent | React.ChangeEvent | React.KeyboardEvent,\n index: number,\n isChosen: boolean\n ) =&gt; {\n if (isChosen) {\n const newChosen = [...chosenOptions];\n newChosen[index].selected = !chosenOptions[index].selected;\n setChosenOptions(newChosen);\n } else {\n const newAvailable = [...availableOptions];\n newAvailable[index].selected = !availableOptions[index].selected;\n setAvailableOptions(newAvailable);\n }\n };\n\n const onFilterChange = (value: string, isAvailable: boolean) =&gt; {\n isAvailable ? setAvailableFilter(value) : setChosenFilter(value);\n const toFilter = isAvailable ? [...availableOptions] : [...chosenOptions];\n toFilter.forEach((option) =&gt; {\n option.isVisible = value === &#39;&#39; || option.text.toLowerCase().includes(value.toLowerCase());\n });\n };\n\n // builds a search input - used in each dual list selector pane\n const buildSearchInput = (isAvailable: boolean) =&gt; (\n &lt;SearchInput\n value={isAvailable ? availableFilter : chosenFilter}\n onChange={(_event, value) =&gt; onFilterChange(value, isAvailable)}\n onClear={() =&gt; onFilterChange(&#39;&#39;, isAvailable)}\n /&gt;\n );\n\n const buildEmptyState = (isAvailable: boolean) =&gt; (\n &lt;EmptyState titleText=\&quot;No results found\&quot; variant={EmptyStateVariant.sm} headingLevel=\&quot;h4\&quot; icon={SearchIcon}&gt;\n &lt;EmptyStateBody&gt;No results match the filter criteria. Clear all filters and try again.&lt;/EmptyStateBody&gt;\n &lt;EmptyStateFooter&gt;\n &lt;EmptyStateActions&gt;\n &lt;Button variant=\&quot;link\&quot; onClick={() =&gt; onFilterChange(&#39;&#39;, isAvailable)}&gt;\n Clear all filters\n &lt;/Button&gt;\n &lt;/EmptyStateActions&gt;\n &lt;/EmptyStateFooter&gt;\n &lt;/EmptyState&gt;\n );\n\n return (\n &lt;DualListSelector&gt;\n &lt;DualListSelectorPane\n title=\&quot;Available options\&quot;\n status={`${availableOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n availableOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n searchInput={buildSearchInput(true)}\n listMinHeight=\&quot;300px\&quot;\n &gt;\n {availableFilter !== &#39;&#39; &amp;&amp;\n availableOptions.filter((option) =&gt; option.isVisible).length === 0 &amp;&amp;\n buildEmptyState(true)}\n\n &lt;DualListSelectorList&gt;\n {availableOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`search-available-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, false)}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n &lt;/DualListSelectorPane&gt;\n &lt;DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorControl\n isDisabled={!availableOptions.some((option) =&gt; option.selected)}\n onClick={() =&gt; moveSelected(true)}\n aria-label=\&quot;Add selected\&quot;\n icon={&lt;AngleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={availableOptions.length === 0}\n onClick={() =&gt; moveAll(true)}\n aria-label=\&quot;Add all\&quot;\n icon={&lt;AngleDoubleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={chosenOptions.length === 0}\n onClick={() =&gt; moveAll(false)}\n aria-label=\&quot;Remove all\&quot;\n icon={&lt;AngleDoubleLeftIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n onClick={() =&gt; moveSelected(false)}\n isDisabled={!chosenOptions.some((option) =&gt; option.selected)}\n aria-label=\&quot;Remove selected\&quot;\n icon={&lt;AngleLeftIcon /&gt;}\n /&gt;\n &lt;/DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorPane\n title=\&quot;Chosen options\&quot;\n status={`${chosenOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n chosenOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n searchInput={buildSearchInput(false)}\n listMinHeight=\&quot;300px\&quot;\n isChosen\n &gt;\n {chosenFilter !== &#39;&#39; &amp;&amp;\n chosenOptions.filter((option) =&gt; option.isVisible).length === 0 &amp;&amp;\n buildEmptyState(false)}\n {chosenOptions.filter((option) =&gt; option.isVisible).length &gt; 0 &amp;&amp; (\n &lt;DualListSelectorList&gt;\n {chosenOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`composable-search-chosen-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, true)}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n )}\n &lt;/DualListSelectorPane&gt;\n &lt;/DualListSelector&gt;\n );\n};\n&quot;],&quot;html&quot;:[0]}" ssr client="only" opts="{&quot;name&quot;:&quot;LiveExampleBase&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island>
73
+ <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-436" data-pf-content="true" class="pf-v6-c-content--h3">Using more complex options with actions</h3>
74
74
 
75
- <astro-island uid="1SJNx2" component-url="/_astro/LiveExample.BOl02361.js" component-export="LiveExample" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;src&quot;:[0,&quot;import { Fragment, useState } from &#39;react&#39;;\nimport {\n Button,\n ButtonVariant,\n Checkbox,\n Dropdown,\n DropdownList,\n DropdownItem,\n DualListSelector,\n DualListSelectorPane,\n DualListSelectorList,\n DualListSelectorListItem,\n DualListSelectorControlsWrapper,\n DualListSelectorControl,\n SearchInput,\n EmptyState,\n EmptyStateVariant,\n EmptyStateFooter,\n EmptyStateBody,\n EmptyStateActions,\n MenuToggle,\n MenuToggleElement\n} from &#39;@patternfly/react-core&#39;;\nimport AngleDoubleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-left-icon&#39;;\nimport AngleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-left-icon&#39;;\nimport AngleDoubleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-right-icon&#39;;\nimport AngleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-right-icon&#39;;\nimport PficonSortCommonAscIcon from &#39;@patternfly/react-icons/dist/esm/icons/pficon-sort-common-asc-icon&#39;;\nimport SearchIcon from &#39;@patternfly/react-icons/dist/esm/icons/search-icon&#39;;\nimport EllipsisVIcon from &#39;@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon&#39;;\n\ninterface Option {\n text: string;\n selected: boolean;\n isVisible: boolean;\n}\n\nexport const DualListSelectorComplexOptionsActionsNext: React.FunctionComponent = () =&gt; {\n const [availableOptions, setAvailableOptions] = useState&lt;Option[]&gt;([\n { text: &#39;Option 1&#39;, selected: false, isVisible: true },\n { text: &#39;Option 2&#39;, selected: false, isVisible: true },\n { text: &#39;Option 3&#39;, selected: false, isVisible: true },\n { text: &#39;Option 4&#39;, selected: false, isVisible: true }\n ]);\n\n const [chosenOptions, setChosenOptions] = useState&lt;Option[]&gt;([]);\n const [isAvailableKebabOpen, setIsAvailableKebabOpen] = useState(false);\n const [isChosenKebabOpen, setIsChosenKebabOpen] = useState(false);\n const [availableFilter, setAvailableFilter] = useState(&#39;&#39;);\n const [chosenFilter, setChosenFilter] = useState(&#39;&#39;);\n const [isDisabled, setIsDisabled] = useState(false);\n\n // callback for moving selected options between lists\n const moveSelected = (fromAvailable: boolean) =&gt; {\n const sourceOptions = fromAvailable ? availableOptions : chosenOptions;\n const destinationOptions = fromAvailable ? chosenOptions : availableOptions;\n for (let i = 0; i &lt; sourceOptions.length; i++) {\n const option = sourceOptions[i];\n if (option.selected &amp;&amp; option.isVisible) {\n sourceOptions.splice(i, 1);\n destinationOptions.push(option);\n option.selected = false;\n i--;\n }\n }\n if (fromAvailable) {\n setAvailableOptions([...sourceOptions]);\n setChosenOptions([...destinationOptions]);\n } else {\n setChosenOptions([...sourceOptions]);\n setAvailableOptions([...destinationOptions]);\n }\n };\n\n // callback for moving all options between lists\n const moveAll = (fromAvailable: boolean) =&gt; {\n if (fromAvailable) {\n setChosenOptions([...availableOptions.filter((option) =&gt; option.isVisible), ...chosenOptions]);\n setAvailableOptions([...availableOptions.filter((option) =&gt; !option.isVisible)]);\n } else {\n setAvailableOptions([...chosenOptions.filter((option) =&gt; option.isVisible), ...availableOptions]);\n setChosenOptions([...chosenOptions.filter((option) =&gt; !option.isVisible)]);\n }\n };\n\n // callback when option is selected\n const onOptionSelect = (\n event: React.MouseEvent | React.ChangeEvent | React.KeyboardEvent,\n index: number,\n isChosen: boolean\n ) =&gt; {\n if (isChosen) {\n const newChosen = [...chosenOptions];\n newChosen[index].selected = !chosenOptions[index].selected;\n setChosenOptions(newChosen);\n } else {\n const newAvailable = [...availableOptions];\n newAvailable[index].selected = !availableOptions[index].selected;\n setAvailableOptions(newAvailable);\n }\n };\n\n const onFilterChange = (value: string, isAvailable: boolean) =&gt; {\n isAvailable ? setAvailableFilter(value) : setChosenFilter(value);\n const toFilter = isAvailable ? [...availableOptions] : [...chosenOptions];\n toFilter.forEach((option) =&gt; {\n option.isVisible = value === &#39;&#39; || option.text.toLowerCase().includes(value.toLowerCase());\n });\n };\n\n // builds a search input - used in each dual list selector pane\n const buildSearchInput = (isAvailable: boolean) =&gt; (\n &lt;SearchInput\n value={isAvailable ? availableFilter : chosenFilter}\n onChange={(_event, value) =&gt; onFilterChange(value, isAvailable)}\n onClear={() =&gt; onFilterChange(&#39;&#39;, isAvailable)}\n isDisabled={isDisabled}\n /&gt;\n );\n\n // builds a sort control - passed to both dual list selector panes\n const buildSort = (isAvailable: boolean) =&gt; {\n const onSort = () =&gt; {\n const toSort = isAvailable ? [...availableOptions] : [...chosenOptions];\n toSort.sort((a, b) =&gt; {\n if (a.text &gt; b.text) {\n return 1;\n }\n if (a.text &lt; b.text) {\n return -1;\n }\n return 0;\n });\n if (isAvailable) {\n setAvailableOptions(toSort);\n } else {\n setChosenOptions(toSort);\n }\n };\n\n const onToggle = (pane: string) =&gt; {\n if (pane === &#39;available&#39;) {\n setIsAvailableKebabOpen(!isAvailableKebabOpen);\n } else {\n setIsChosenKebabOpen(!isChosenKebabOpen);\n }\n };\n\n return isAvailable\n ? [\n &lt;Button\n variant={ButtonVariant.plain}\n onClick={onSort}\n aria-label=\&quot;Sort Available\&quot;\n key=\&quot;availableSortButton\&quot;\n isDisabled={isDisabled}\n icon={&lt;PficonSortCommonAscIcon /&gt;}\n /&gt;,\n &lt;Dropdown\n toggle={(toggleRef: React.Ref&lt;MenuToggleElement&gt;) =&gt; (\n &lt;MenuToggle\n ref={toggleRef}\n isDisabled={isDisabled}\n isExpanded={isAvailableKebabOpen}\n onClick={() =&gt; onToggle(&#39;available&#39;)}\n variant=\&quot;plain\&quot;\n id=\&quot;complex-available-toggle\&quot;\n aria-label=\&quot;Complex actions example available kebab toggle\&quot;\n icon={&lt;EllipsisVIcon /&gt;}\n /&gt;\n )}\n isOpen={isAvailableKebabOpen}\n onOpenChange={(isOpen: boolean) =&gt; setIsAvailableKebabOpen(isOpen)}\n onSelect={() =&gt; setIsAvailableKebabOpen(false)}\n key=\&quot;availableDropdown\&quot;\n &gt;\n &lt;DropdownList&gt;\n &lt;DropdownItem key=\&quot;available action\&quot;&gt;Available Action&lt;/DropdownItem&gt;\n &lt;DropdownItem key=\&quot;available link\&quot; to=\&quot;#\&quot; onClick={(event: any) =&gt; event.preventDefault()}&gt;\n Available Link\n &lt;/DropdownItem&gt;\n &lt;/DropdownList&gt;\n &lt;/Dropdown&gt;\n ]\n : [\n &lt;Button\n variant={ButtonVariant.plain}\n onClick={onSort}\n aria-label=\&quot;Sort Chosen\&quot;\n key=\&quot;chosenSortButton\&quot;\n isDisabled={isDisabled}\n icon={&lt;PficonSortCommonAscIcon /&gt;}\n /&gt;,\n &lt;Dropdown\n toggle={(toggleRef: React.Ref&lt;MenuToggleElement&gt;) =&gt; (\n &lt;MenuToggle\n ref={toggleRef}\n isDisabled={isDisabled}\n isExpanded={isChosenKebabOpen}\n onClick={() =&gt; onToggle(&#39;chosen&#39;)}\n variant=\&quot;plain\&quot;\n id=\&quot;complex-chosen-toggle\&quot;\n aria-label=\&quot;Complex actions example chosen kebab toggle\&quot;\n icon={&lt;EllipsisVIcon /&gt;}\n /&gt;\n )}\n isOpen={isChosenKebabOpen}\n onOpenChange={(isOpen: boolean) =&gt; setIsChosenKebabOpen(isOpen)}\n onSelect={() =&gt; setIsChosenKebabOpen(false)}\n key=\&quot;chosenDropdown\&quot;\n &gt;\n &lt;DropdownList&gt;\n &lt;DropdownItem key=\&quot;chosen action\&quot;&gt;Chosen Action&lt;/DropdownItem&gt;\n &lt;DropdownItem key=\&quot;chosen link\&quot; to=\&quot;#\&quot; onClick={(event: any) =&gt; event.preventDefault()}&gt;\n Chosen Link\n &lt;/DropdownItem&gt;\n &lt;/DropdownList&gt;\n &lt;/Dropdown&gt;\n ];\n };\n\n const buildEmptyState = (isAvailable: boolean) =&gt; (\n &lt;EmptyState headingLevel=\&quot;h4\&quot; titleText=\&quot;No results found\&quot; icon={SearchIcon} variant={EmptyStateVariant.sm}&gt;\n &lt;EmptyStateBody&gt;No results match the filter criteria. Clear all filters and try again.&lt;/EmptyStateBody&gt;\n &lt;EmptyStateFooter&gt;\n &lt;EmptyStateActions&gt;\n &lt;Button variant=\&quot;link\&quot; onClick={() =&gt; onFilterChange(&#39;&#39;, isAvailable)}&gt;\n Clear all filters\n &lt;/Button&gt;\n &lt;/EmptyStateActions&gt;\n &lt;/EmptyStateFooter&gt;\n &lt;/EmptyState&gt;\n );\n\n return (\n &lt;Fragment&gt;\n &lt;DualListSelector&gt;\n &lt;DualListSelectorPane\n title=\&quot;Available options\&quot;\n status={`${availableOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n availableOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n searchInput={buildSearchInput(true)}\n actions={[buildSort(true)]}\n listMinHeight=\&quot;300px\&quot;\n isDisabled={isDisabled}\n &gt;\n {availableFilter !== &#39;&#39; &amp;&amp;\n availableOptions.filter((option) =&gt; option.isVisible).length === 0 &amp;&amp;\n buildEmptyState(true)}\n\n &lt;DualListSelectorList&gt;\n {availableOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`complex-available-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, false)}\n isDisabled={isDisabled}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n &lt;/DualListSelectorPane&gt;\n &lt;DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorControl\n isDisabled={!availableOptions.some((option) =&gt; option.selected) || isDisabled}\n onClick={() =&gt; moveSelected(true)}\n aria-label=\&quot;Add selected\&quot;\n icon={&lt;AngleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={availableOptions.length === 0 || isDisabled}\n onClick={() =&gt; moveAll(true)}\n aria-label=\&quot;Add all\&quot;\n icon={&lt;AngleDoubleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={chosenOptions.length === 0 || isDisabled}\n onClick={() =&gt; moveAll(false)}\n aria-label=\&quot;Remove all\&quot;\n icon={&lt;AngleDoubleLeftIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n onClick={() =&gt; moveSelected(false)}\n isDisabled={!chosenOptions.some((option) =&gt; option.selected) || isDisabled}\n aria-label=\&quot;Remove selected\&quot;\n icon={&lt;AngleLeftIcon /&gt;}\n /&gt;\n &lt;/DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorPane\n title=\&quot;Chosen options\&quot;\n status={`${chosenOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n chosenOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n searchInput={buildSearchInput(false)}\n actions={[buildSort(false)]}\n listMinHeight=\&quot;300px\&quot;\n isChosen\n &gt;\n {chosenFilter !== &#39;&#39; &amp;&amp;\n chosenOptions.filter((option) =&gt; option.isVisible).length === 0 &amp;&amp;\n buildEmptyState(false)}\n {chosenOptions.filter((option) =&gt; option.isVisible).length &gt; 0 &amp;&amp; (\n &lt;DualListSelectorList&gt;\n {chosenOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`composable-complex-chosen-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, true)}\n isDisabled={isDisabled}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n )}\n &lt;/DualListSelectorPane&gt;\n &lt;/DualListSelector&gt;\n &lt;Checkbox\n key=\&quot;isDisabled\&quot;\n id=\&quot;isDisabled\&quot;\n label=\&quot;isDisabled\&quot;\n aria-label=\&quot;isDisabled\&quot;\n isChecked={isDisabled}\n onChange={() =&gt; setIsDisabled(!isDisabled)}\n /&gt;\n &lt;/Fragment&gt;\n );\n};\n&quot;],&quot;html&quot;:[0]}" ssr client="only" opts="{&quot;name&quot;:&quot;LiveExampleBase&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island>
76
- <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-447" data-pf-content="true" class="pf-v6-c-content--h3">With tree</h3>
75
+ <astro-island uid="1SJNx2" component-url="/_astro/LiveExample.B5R4Dzng.js" component-export="LiveExample" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;src&quot;:[0,&quot;import { Fragment, useState } from &#39;react&#39;;\nimport {\n Button,\n ButtonVariant,\n Checkbox,\n Dropdown,\n DropdownList,\n DropdownItem,\n DualListSelector,\n DualListSelectorPane,\n DualListSelectorList,\n DualListSelectorListItem,\n DualListSelectorControlsWrapper,\n DualListSelectorControl,\n SearchInput,\n EmptyState,\n EmptyStateVariant,\n EmptyStateFooter,\n EmptyStateBody,\n EmptyStateActions,\n MenuToggle,\n MenuToggleElement\n} from &#39;@patternfly/react-core&#39;;\nimport AngleDoubleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-left-icon&#39;;\nimport AngleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-left-icon&#39;;\nimport AngleDoubleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-right-icon&#39;;\nimport AngleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-right-icon&#39;;\nimport PficonSortCommonAscIcon from &#39;@patternfly/react-icons/dist/esm/icons/pficon-sort-common-asc-icon&#39;;\nimport SearchIcon from &#39;@patternfly/react-icons/dist/esm/icons/search-icon&#39;;\nimport EllipsisVIcon from &#39;@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon&#39;;\n\ninterface Option {\n text: string;\n selected: boolean;\n isVisible: boolean;\n}\n\nexport const DualListSelectorComplexOptionsActionsNext: React.FunctionComponent = () =&gt; {\n const [availableOptions, setAvailableOptions] = useState&lt;Option[]&gt;([\n { text: &#39;Option 1&#39;, selected: false, isVisible: true },\n { text: &#39;Option 2&#39;, selected: false, isVisible: true },\n { text: &#39;Option 3&#39;, selected: false, isVisible: true },\n { text: &#39;Option 4&#39;, selected: false, isVisible: true }\n ]);\n\n const [chosenOptions, setChosenOptions] = useState&lt;Option[]&gt;([]);\n const [isAvailableKebabOpen, setIsAvailableKebabOpen] = useState(false);\n const [isChosenKebabOpen, setIsChosenKebabOpen] = useState(false);\n const [availableFilter, setAvailableFilter] = useState(&#39;&#39;);\n const [chosenFilter, setChosenFilter] = useState(&#39;&#39;);\n const [isDisabled, setIsDisabled] = useState(false);\n\n // callback for moving selected options between lists\n const moveSelected = (fromAvailable: boolean) =&gt; {\n const sourceOptions = fromAvailable ? availableOptions : chosenOptions;\n const destinationOptions = fromAvailable ? chosenOptions : availableOptions;\n for (let i = 0; i &lt; sourceOptions.length; i++) {\n const option = sourceOptions[i];\n if (option.selected &amp;&amp; option.isVisible) {\n sourceOptions.splice(i, 1);\n destinationOptions.push(option);\n option.selected = false;\n i--;\n }\n }\n if (fromAvailable) {\n setAvailableOptions([...sourceOptions]);\n setChosenOptions([...destinationOptions]);\n } else {\n setChosenOptions([...sourceOptions]);\n setAvailableOptions([...destinationOptions]);\n }\n };\n\n // callback for moving all options between lists\n const moveAll = (fromAvailable: boolean) =&gt; {\n if (fromAvailable) {\n setChosenOptions([...availableOptions.filter((option) =&gt; option.isVisible), ...chosenOptions]);\n setAvailableOptions([...availableOptions.filter((option) =&gt; !option.isVisible)]);\n } else {\n setAvailableOptions([...chosenOptions.filter((option) =&gt; option.isVisible), ...availableOptions]);\n setChosenOptions([...chosenOptions.filter((option) =&gt; !option.isVisible)]);\n }\n };\n\n // callback when option is selected\n const onOptionSelect = (\n event: React.MouseEvent | React.ChangeEvent | React.KeyboardEvent,\n index: number,\n isChosen: boolean\n ) =&gt; {\n if (isChosen) {\n const newChosen = [...chosenOptions];\n newChosen[index].selected = !chosenOptions[index].selected;\n setChosenOptions(newChosen);\n } else {\n const newAvailable = [...availableOptions];\n newAvailable[index].selected = !availableOptions[index].selected;\n setAvailableOptions(newAvailable);\n }\n };\n\n const onFilterChange = (value: string, isAvailable: boolean) =&gt; {\n isAvailable ? setAvailableFilter(value) : setChosenFilter(value);\n const toFilter = isAvailable ? [...availableOptions] : [...chosenOptions];\n toFilter.forEach((option) =&gt; {\n option.isVisible = value === &#39;&#39; || option.text.toLowerCase().includes(value.toLowerCase());\n });\n };\n\n // builds a search input - used in each dual list selector pane\n const buildSearchInput = (isAvailable: boolean) =&gt; (\n &lt;SearchInput\n value={isAvailable ? availableFilter : chosenFilter}\n onChange={(_event, value) =&gt; onFilterChange(value, isAvailable)}\n onClear={() =&gt; onFilterChange(&#39;&#39;, isAvailable)}\n isDisabled={isDisabled}\n /&gt;\n );\n\n // builds a sort control - passed to both dual list selector panes\n const buildSort = (isAvailable: boolean) =&gt; {\n const onSort = () =&gt; {\n const toSort = isAvailable ? [...availableOptions] : [...chosenOptions];\n toSort.sort((a, b) =&gt; {\n if (a.text &gt; b.text) {\n return 1;\n }\n if (a.text &lt; b.text) {\n return -1;\n }\n return 0;\n });\n if (isAvailable) {\n setAvailableOptions(toSort);\n } else {\n setChosenOptions(toSort);\n }\n };\n\n const onToggle = (pane: string) =&gt; {\n if (pane === &#39;available&#39;) {\n setIsAvailableKebabOpen(!isAvailableKebabOpen);\n } else {\n setIsChosenKebabOpen(!isChosenKebabOpen);\n }\n };\n\n return isAvailable\n ? [\n &lt;Button\n variant={ButtonVariant.plain}\n onClick={onSort}\n aria-label=\&quot;Sort Available\&quot;\n key=\&quot;availableSortButton\&quot;\n isDisabled={isDisabled}\n icon={&lt;PficonSortCommonAscIcon /&gt;}\n /&gt;,\n &lt;Dropdown\n toggle={(toggleRef: React.Ref&lt;MenuToggleElement&gt;) =&gt; (\n &lt;MenuToggle\n ref={toggleRef}\n isDisabled={isDisabled}\n isExpanded={isAvailableKebabOpen}\n onClick={() =&gt; onToggle(&#39;available&#39;)}\n variant=\&quot;plain\&quot;\n id=\&quot;complex-available-toggle\&quot;\n aria-label=\&quot;Complex actions example available kebab toggle\&quot;\n icon={&lt;EllipsisVIcon /&gt;}\n /&gt;\n )}\n isOpen={isAvailableKebabOpen}\n onOpenChange={(isOpen: boolean) =&gt; setIsAvailableKebabOpen(isOpen)}\n onSelect={() =&gt; setIsAvailableKebabOpen(false)}\n key=\&quot;availableDropdown\&quot;\n &gt;\n &lt;DropdownList&gt;\n &lt;DropdownItem key=\&quot;available action\&quot;&gt;Available Action&lt;/DropdownItem&gt;\n &lt;DropdownItem key=\&quot;available link\&quot; to=\&quot;#\&quot; onClick={(event: any) =&gt; event.preventDefault()}&gt;\n Available Link\n &lt;/DropdownItem&gt;\n &lt;/DropdownList&gt;\n &lt;/Dropdown&gt;\n ]\n : [\n &lt;Button\n variant={ButtonVariant.plain}\n onClick={onSort}\n aria-label=\&quot;Sort Chosen\&quot;\n key=\&quot;chosenSortButton\&quot;\n isDisabled={isDisabled}\n icon={&lt;PficonSortCommonAscIcon /&gt;}\n /&gt;,\n &lt;Dropdown\n toggle={(toggleRef: React.Ref&lt;MenuToggleElement&gt;) =&gt; (\n &lt;MenuToggle\n ref={toggleRef}\n isDisabled={isDisabled}\n isExpanded={isChosenKebabOpen}\n onClick={() =&gt; onToggle(&#39;chosen&#39;)}\n variant=\&quot;plain\&quot;\n id=\&quot;complex-chosen-toggle\&quot;\n aria-label=\&quot;Complex actions example chosen kebab toggle\&quot;\n icon={&lt;EllipsisVIcon /&gt;}\n /&gt;\n )}\n isOpen={isChosenKebabOpen}\n onOpenChange={(isOpen: boolean) =&gt; setIsChosenKebabOpen(isOpen)}\n onSelect={() =&gt; setIsChosenKebabOpen(false)}\n key=\&quot;chosenDropdown\&quot;\n &gt;\n &lt;DropdownList&gt;\n &lt;DropdownItem key=\&quot;chosen action\&quot;&gt;Chosen Action&lt;/DropdownItem&gt;\n &lt;DropdownItem key=\&quot;chosen link\&quot; to=\&quot;#\&quot; onClick={(event: any) =&gt; event.preventDefault()}&gt;\n Chosen Link\n &lt;/DropdownItem&gt;\n &lt;/DropdownList&gt;\n &lt;/Dropdown&gt;\n ];\n };\n\n const buildEmptyState = (isAvailable: boolean) =&gt; (\n &lt;EmptyState headingLevel=\&quot;h4\&quot; titleText=\&quot;No results found\&quot; icon={SearchIcon} variant={EmptyStateVariant.sm}&gt;\n &lt;EmptyStateBody&gt;No results match the filter criteria. Clear all filters and try again.&lt;/EmptyStateBody&gt;\n &lt;EmptyStateFooter&gt;\n &lt;EmptyStateActions&gt;\n &lt;Button variant=\&quot;link\&quot; onClick={() =&gt; onFilterChange(&#39;&#39;, isAvailable)}&gt;\n Clear all filters\n &lt;/Button&gt;\n &lt;/EmptyStateActions&gt;\n &lt;/EmptyStateFooter&gt;\n &lt;/EmptyState&gt;\n );\n\n return (\n &lt;Fragment&gt;\n &lt;DualListSelector&gt;\n &lt;DualListSelectorPane\n title=\&quot;Available options\&quot;\n status={`${availableOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n availableOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n searchInput={buildSearchInput(true)}\n actions={[buildSort(true)]}\n listMinHeight=\&quot;300px\&quot;\n isDisabled={isDisabled}\n &gt;\n {availableFilter !== &#39;&#39; &amp;&amp;\n availableOptions.filter((option) =&gt; option.isVisible).length === 0 &amp;&amp;\n buildEmptyState(true)}\n\n &lt;DualListSelectorList&gt;\n {availableOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`complex-available-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, false)}\n isDisabled={isDisabled}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n &lt;/DualListSelectorPane&gt;\n &lt;DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorControl\n isDisabled={!availableOptions.some((option) =&gt; option.selected) || isDisabled}\n onClick={() =&gt; moveSelected(true)}\n aria-label=\&quot;Add selected\&quot;\n icon={&lt;AngleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={availableOptions.length === 0 || isDisabled}\n onClick={() =&gt; moveAll(true)}\n aria-label=\&quot;Add all\&quot;\n icon={&lt;AngleDoubleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={chosenOptions.length === 0 || isDisabled}\n onClick={() =&gt; moveAll(false)}\n aria-label=\&quot;Remove all\&quot;\n icon={&lt;AngleDoubleLeftIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n onClick={() =&gt; moveSelected(false)}\n isDisabled={!chosenOptions.some((option) =&gt; option.selected) || isDisabled}\n aria-label=\&quot;Remove selected\&quot;\n icon={&lt;AngleLeftIcon /&gt;}\n /&gt;\n &lt;/DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorPane\n title=\&quot;Chosen options\&quot;\n status={`${chosenOptions.filter((option) =&gt; option.selected &amp;&amp; option.isVisible).length} of ${\n chosenOptions.filter((option) =&gt; option.isVisible).length\n } options selected`}\n searchInput={buildSearchInput(false)}\n actions={[buildSort(false)]}\n listMinHeight=\&quot;300px\&quot;\n isChosen\n &gt;\n {chosenFilter !== &#39;&#39; &amp;&amp;\n chosenOptions.filter((option) =&gt; option.isVisible).length === 0 &amp;&amp;\n buildEmptyState(false)}\n {chosenOptions.filter((option) =&gt; option.isVisible).length &gt; 0 &amp;&amp; (\n &lt;DualListSelectorList&gt;\n {chosenOptions.map((option, index) =&gt;\n option.isVisible ? (\n &lt;DualListSelectorListItem\n key={index}\n isSelected={option.selected}\n id={`composable-complex-chosen-option-${index}`}\n onOptionSelect={(e) =&gt; onOptionSelect(e, index, true)}\n isDisabled={isDisabled}\n &gt;\n {option.text}\n &lt;/DualListSelectorListItem&gt;\n ) : null\n )}\n &lt;/DualListSelectorList&gt;\n )}\n &lt;/DualListSelectorPane&gt;\n &lt;/DualListSelector&gt;\n &lt;Checkbox\n key=\&quot;isDisabled\&quot;\n id=\&quot;isDisabled\&quot;\n label=\&quot;isDisabled\&quot;\n aria-label=\&quot;isDisabled\&quot;\n isChecked={isDisabled}\n onChange={() =&gt; setIsDisabled(!isDisabled)}\n /&gt;\n &lt;/Fragment&gt;\n );\n};\n&quot;],&quot;html&quot;:[0]}" ssr client="only" opts="{&quot;name&quot;:&quot;LiveExampleBase&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island>
76
+ <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-437" data-pf-content="true" class="pf-v6-c-content--h3">With tree</h3>
77
77
 
78
- <astro-island uid="Z15pIt3" component-url="/_astro/LiveExample.BOl02361.js" component-export="LiveExample" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;src&quot;:[0,&quot;import { useMemo, useState } from &#39;react&#39;;\nimport {\n DualListSelector,\n DualListSelectorPane,\n DualListSelectorList,\n DualListSelectorControlsWrapper,\n DualListSelectorControl,\n DualListSelectorTree,\n DualListSelectorTreeItemData,\n SearchInput,\n Button,\n EmptyState,\n EmptyStateVariant,\n EmptyStateFooter,\n EmptyStateBody,\n EmptyStateActions\n} from &#39;@patternfly/react-core&#39;;\nimport AngleDoubleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-left-icon&#39;;\nimport AngleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-left-icon&#39;;\nimport AngleDoubleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-right-icon&#39;;\nimport AngleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-right-icon&#39;;\nimport SearchIcon from &#39;@patternfly/react-icons/dist/esm/icons/search-icon&#39;;\n\ninterface FoodNode {\n id: string;\n text: string;\n children?: FoodNode[];\n}\n\ninterface ExampleProps {\n data: FoodNode[];\n}\n\nexport const DualListSelectorComposableTree: React.FunctionComponent&lt;ExampleProps&gt; = ({ data }: ExampleProps) =&gt; {\n const [checkedLeafIds, setCheckedLeafIds] = useState&lt;string[]&gt;([]);\n const [chosenLeafIds, setChosenLeafIds] = useState&lt;string[]&gt;([&#39;beans&#39;, &#39;beef&#39;, &#39;chicken&#39;, &#39;tofu&#39;]);\n const [chosenFilter, setChosenFilter] = useState&lt;string&gt;(&#39;&#39;);\n const [availableFilter, setAvailableFilter] = useState&lt;string&gt;(&#39;&#39;);\n\n // helper function to build memoized lists\n const buildTextById = (node: FoodNode): { [key: string]: string } =&gt; {\n let textById = {};\n if (!node) {\n return textById;\n }\n textById[node.id] = node.text;\n if (node.children) {\n node.children.forEach((child) =&gt; {\n textById = { ...textById, ...buildTextById(child) };\n });\n }\n return textById;\n };\n\n // helper function to build memoized lists\n const getDescendantLeafIds = (node: FoodNode): string[] =&gt; {\n if (!node.children || !node.children.length) {\n return [node.id];\n } else {\n let childrenIds: string[] = [];\n node.children.forEach((child) =&gt; {\n childrenIds = [...childrenIds, ...getDescendantLeafIds(child)];\n });\n return childrenIds;\n }\n };\n\n // helper function to build memoized lists\n const getLeavesById = (node: FoodNode): { [key: string]: string[] } =&gt; {\n let leavesById = {};\n if (!node.children || !node.children.length) {\n leavesById[node.id] = [node.id];\n } else {\n node.children.forEach((child) =&gt; {\n leavesById[node.id] = getDescendantLeafIds(node);\n leavesById = { ...leavesById, ...getLeavesById(child) };\n });\n }\n return leavesById;\n };\n\n // Builds a map of child leaf nodes by node id - memoized so that it only rebuilds the list if the data changes.\n const { memoizedLeavesById, memoizedAllLeaves, memoizedNodeTexts } = useMemo(() =&gt; {\n let leavesById = {};\n let allLeaves: string[] = [];\n let nodeTexts = {};\n data.forEach((foodNode) =&gt; {\n nodeTexts = { ...nodeTexts, ...buildTextById(foodNode) };\n leavesById = { ...leavesById, ...getLeavesById(foodNode) };\n allLeaves = [...allLeaves, ...getDescendantLeafIds(foodNode)];\n });\n return {\n memoizedLeavesById: leavesById,\n memoizedAllLeaves: allLeaves,\n memoizedNodeTexts: nodeTexts\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data]);\n\n const matchesFilter = (value: string, filter: string) =&gt; value.toLowerCase().includes(filter.trim().toLowerCase());\n\n const getVisibleLeafIds = (leafIds: string[], filter: string) =&gt; {\n const filterMatchingNodeIds = Object.keys(memoizedLeavesById).filter((nodeId) =&gt;\n matchesFilter(memoizedNodeTexts[nodeId], filter)\n );\n const filterMatchingLeafIds = filterMatchingNodeIds.map((nodeId) =&gt; memoizedLeavesById[nodeId]).flat();\n return leafIds.filter((leafId) =&gt; filterMatchingLeafIds.includes(leafId));\n };\n\n const availableLeafIds = memoizedAllLeaves.filter((leafId) =&gt; !chosenLeafIds.includes(leafId));\n const visibleChosenLeafIds = getVisibleLeafIds(chosenLeafIds, chosenFilter);\n const visibleAvailableLeafIds = getVisibleLeafIds(availableLeafIds, availableFilter);\n\n const moveChecked = (toChosen: boolean) =&gt; {\n const visibleCheckedChosenLeafIds = checkedLeafIds.filter((leafId) =&gt; visibleChosenLeafIds.includes(leafId));\n const visibleCheckedAvailableLeafIds = checkedLeafIds.filter((leafId) =&gt; visibleAvailableLeafIds.includes(leafId));\n\n setChosenLeafIds(\n (prevChosenIds) =&gt;\n toChosen\n ? [...prevChosenIds, ...visibleCheckedAvailableLeafIds] // add visible checked ids to chosen list\n : prevChosenIds.filter((x) =&gt; !visibleCheckedChosenLeafIds.includes(x)) // remove visible checked ids from chosen list\n );\n\n // uncheck checked ids that just moved\n setCheckedLeafIds((prevChecked) =&gt;\n toChosen\n ? prevChecked.filter((x) =&gt; !visibleCheckedAvailableLeafIds.includes(x))\n : prevChecked.filter((x) =&gt; !visibleCheckedChosenLeafIds.includes(x))\n );\n };\n\n const moveAll = (toChosen: boolean) =&gt; {\n if (toChosen) {\n setChosenLeafIds((prevChosenIds) =&gt; [...prevChosenIds, ...visibleAvailableLeafIds]);\n } else {\n setChosenLeafIds((prevChosenIds) =&gt; prevChosenIds.filter((id) =&gt; !visibleChosenLeafIds.includes(id)));\n }\n };\n\n const areAllDescendantsSelected = (node: FoodNode, isChosen: boolean) =&gt;\n memoizedLeavesById[node.id].every(\n (id) =&gt; checkedLeafIds.includes(id) &amp;&amp; (isChosen ? chosenLeafIds.includes(id) : !chosenLeafIds.includes(id))\n );\n const areSomeDescendantsSelected = (node: FoodNode, isChosen: boolean) =&gt;\n memoizedLeavesById[node.id].some(\n (id) =&gt; checkedLeafIds.includes(id) &amp;&amp; (isChosen ? chosenLeafIds.includes(id) : !chosenLeafIds.includes(id))\n );\n\n const isNodeChecked = (node: FoodNode, isChosen: boolean) =&gt; {\n if (areAllDescendantsSelected(node, isChosen)) {\n return true;\n }\n if (areSomeDescendantsSelected(node, isChosen)) {\n return false;\n }\n return false;\n };\n\n const onOptionCheck = (\n event: React.MouseEvent | React.ChangeEvent&lt;HTMLInputElement&gt; | React.KeyboardEvent,\n isChecked: boolean,\n node: DualListSelectorTreeItemData,\n isChosen: boolean\n ) =&gt; {\n const nodeIdsToCheck = memoizedLeavesById[node.id].filter((id) =&gt;\n isChosen ? visibleChosenLeafIds.includes(id) : visibleAvailableLeafIds.includes(id)\n );\n\n setCheckedLeafIds((prevChecked) =&gt; {\n const otherCheckedNodeNames = prevChecked.filter((id) =&gt; !nodeIdsToCheck.includes(id));\n return !isChecked ? otherCheckedNodeNames : [...otherCheckedNodeNames, ...nodeIdsToCheck];\n });\n };\n\n // builds a search input - used in each dual list selector pane\n const buildSearchInput = (isChosen: boolean) =&gt; {\n const onChange = (value) =&gt; (isChosen ? setChosenFilter(value) : setAvailableFilter(value));\n\n return (\n &lt;SearchInput\n value={isChosen ? chosenFilter : availableFilter}\n onChange={(_event, value) =&gt; onChange(value)}\n onClear={() =&gt; onChange(&#39;&#39;)}\n /&gt;\n );\n };\n\n // Builds the DualListSelectorTreeItems from the FoodNodes\n const buildOptions = (\n isChosen: boolean,\n [node, ...remainingNodes]: FoodNode[],\n hasParentMatch: boolean\n ): DualListSelectorTreeItemData[] =&gt; {\n if (!node) {\n return [];\n }\n\n const isChecked = isNodeChecked(node, isChosen);\n\n const filterValue = isChosen ? chosenFilter : availableFilter;\n const descendentLeafIds = memoizedLeavesById[node.id];\n const descendentsOnThisPane = isChosen\n ? descendentLeafIds.filter((id) =&gt; chosenLeafIds.includes(id))\n : descendentLeafIds.filter((id) =&gt; !chosenLeafIds.includes(id));\n\n const hasMatchingChildren =\n filterValue &amp;&amp; descendentsOnThisPane.some((id) =&gt; matchesFilter(memoizedNodeTexts[id], filterValue));\n const isFilterMatch = filterValue &amp;&amp; matchesFilter(node.text, filterValue) &amp;&amp; descendentsOnThisPane.length &gt; 0;\n\n // A node is displayed if either of the following is true:\n // - There is no filter value and this node or its descendents belong on this pane\n // - There is a filter value and this node or one of this node&#39;s descendents or ancestors match on this pane\n const isDisplayed =\n (!filterValue &amp;&amp; descendentsOnThisPane.length &gt; 0) ||\n hasMatchingChildren ||\n (hasParentMatch &amp;&amp; descendentsOnThisPane.length &gt; 0) ||\n isFilterMatch;\n\n return [\n ...(isDisplayed\n ? [\n {\n id: node.id,\n text: node.text,\n isChecked,\n checkProps: { &#39;aria-label&#39;: `Select ${node.text}` },\n hasBadge: node.children &amp;&amp; node.children.length &gt; 0,\n badgeProps: { isRead: true },\n defaultExpanded: isChosen ? !!chosenFilter : !!availableFilter,\n children: node.children\n ? buildOptions(isChosen, node.children, isFilterMatch || hasParentMatch)\n : undefined\n }\n ]\n : []),\n ...(!isDisplayed &amp;&amp; node.children &amp;&amp; node.children.length\n ? buildOptions(isChosen, node.children, hasParentMatch)\n : []),\n ...(remainingNodes ? buildOptions(isChosen, remainingNodes, hasParentMatch) : [])\n ];\n };\n\n const buildPane = (isChosen: boolean): React.ReactNode =&gt; {\n const options: DualListSelectorTreeItemData[] = buildOptions(isChosen, data, false);\n const numOptions = isChosen ? visibleChosenLeafIds.length : visibleAvailableLeafIds.length;\n const numSelected = checkedLeafIds.filter((id) =&gt;\n isChosen ? visibleChosenLeafIds.includes(id) : visibleAvailableLeafIds.includes(id)\n ).length;\n const status = `${numSelected} of ${numOptions} options selected`;\n const filterApplied = isChosen ? chosenFilter !== &#39;&#39; : availableFilter !== &#39;&#39;;\n return (\n &lt;DualListSelectorPane\n title={isChosen ? &#39;Chosen&#39; : &#39;Available&#39;}\n status={status}\n searchInput={buildSearchInput(isChosen)}\n isChosen={isChosen}\n listMinHeight=\&quot;300px\&quot;\n &gt;\n {filterApplied &amp;&amp; options.length === 0 &amp;&amp; (\n &lt;EmptyState headingLevel=\&quot;h4\&quot; titleText=\&quot;No results found\&quot; icon={SearchIcon} variant={EmptyStateVariant.sm}&gt;\n &lt;EmptyStateBody&gt;No results match the filter criteria. Clear all filters and try again.&lt;/EmptyStateBody&gt;\n &lt;EmptyStateFooter&gt;\n &lt;EmptyStateActions&gt;\n &lt;Button variant=\&quot;link\&quot; onClick={() =&gt; (isChosen ? setChosenFilter(&#39;&#39;) : setAvailableFilter(&#39;&#39;))}&gt;\n Clear all filters\n &lt;/Button&gt;\n &lt;/EmptyStateActions&gt;\n &lt;/EmptyStateFooter&gt;\n &lt;/EmptyState&gt;\n )}\n {options.length &gt; 0 &amp;&amp; (\n &lt;DualListSelectorList&gt;\n &lt;DualListSelectorTree\n data={options}\n onOptionCheck={(e, isChecked, itemData) =&gt; onOptionCheck(e, isChecked, itemData, isChosen)}\n /&gt;\n &lt;/DualListSelectorList&gt;\n )}\n &lt;/DualListSelectorPane&gt;\n );\n };\n\n return (\n &lt;DualListSelector isTree&gt;\n {buildPane(false)}\n &lt;DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorControl\n isDisabled={!checkedLeafIds.filter((x) =&gt; visibleAvailableLeafIds.includes(x)).length}\n onClick={() =&gt; moveChecked(true)}\n aria-label=\&quot;Add selected\&quot;\n icon={&lt;AngleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={chosenLeafIds.length === memoizedAllLeaves.length}\n onClick={() =&gt; moveAll(true)}\n aria-label=\&quot;Add all\&quot;\n icon={&lt;AngleDoubleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={chosenLeafIds.length === 0}\n onClick={() =&gt; moveAll(false)}\n aria-label=\&quot;Remove all\&quot;\n icon={&lt;AngleDoubleLeftIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n onClick={() =&gt; moveChecked(false)}\n isDisabled={!checkedLeafIds.filter((x) =&gt; visibleChosenLeafIds.includes(x)).length}\n aria-label=\&quot;Remove selected\&quot;\n icon={&lt;AngleLeftIcon /&gt;}\n /&gt;\n &lt;/DualListSelectorControlsWrapper&gt;\n {buildPane(true)}\n &lt;/DualListSelector&gt;\n );\n};\n\nexport const DualListSelectorComposableTreeExample: React.FunctionComponent = () =&gt; (\n &lt;DualListSelectorComposableTree\n data={[\n {\n id: &#39;fruits&#39;,\n text: &#39;Fruits&#39;,\n children: [\n { id: &#39;apple&#39;, text: &#39;Apple&#39; },\n {\n id: &#39;berries&#39;,\n text: &#39;Berries&#39;,\n children: [\n { id: &#39;blueberry&#39;, text: &#39;Blueberry&#39; },\n { id: &#39;strawberry&#39;, text: &#39;Strawberry&#39; }\n ]\n },\n { id: &#39;banana&#39;, text: &#39;Banana&#39; }\n ]\n },\n { id: &#39;bread&#39;, text: &#39;Bread&#39; },\n {\n id: &#39;vegetables&#39;,\n text: &#39;Vegetables&#39;,\n children: [\n { id: &#39;broccoli&#39;, text: &#39;Broccoli&#39; },\n { id: &#39;cauliflower&#39;, text: &#39;Cauliflower&#39; }\n ]\n },\n {\n id: &#39;proteins&#39;,\n text: &#39;Proteins&#39;,\n children: [\n { id: &#39;beans&#39;, text: &#39;Beans&#39; },\n {\n id: &#39;meats&#39;,\n text: &#39;Meats&#39;,\n children: [\n {\n id: &#39;beef&#39;,\n text: &#39;Beef&#39;\n },\n {\n id: &#39;chicken&#39;,\n text: &#39;Chicken&#39;\n }\n ]\n },\n { id: &#39;tofu&#39;, text: &#39;Tofu&#39; }\n ]\n }\n ]}\n /&gt;\n);\n&quot;],&quot;html&quot;:[0]}" ssr client="only" opts="{&quot;name&quot;:&quot;LiveExampleBase&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island>
79
- <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-448" data-pf-content="true" class="pf-v6-c-content--h3">Draggable</h3>
80
- <p data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-452" data-pf-content="true" class="pf-v6-c-content--p">To enable drag and drop, wrap the <code>&lt;DualListSelectorList&gt;</code> component with <code>&lt;DragDropSort&gt;</code>, define the <code>variant</code> property as “DualListSelectorList”, and pass both the sortable items and <code>onDrop</code> callback to <code>&lt;DragDropSort&gt;</code>. <code>&lt;DragDropSort&gt;</code> will create the component’s usual children internally based on the items property, so children inside the <code>&lt;DualListSelectorList&gt;</code> should not be passed to the wrapped component.</p>
81
- <p data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-458" data-pf-content="true" class="pf-v6-c-content--p">Full drag and drop details can be found on the <a data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-449" data-pf-content="true" class="pf-v6-c-content--a">drag and drop</a> component page.</p>
82
- <pre data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-455" data-pf-content="true" class="pf-v6-c-content--pre"><code><span class="line"></span></code></pre>
83
- <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-450" data-pf-content="true" class="pf-v6-c-content--h3">Draggable with multiple drop zones</h3>
84
- <p data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-453" data-pf-content="true" class="pf-v6-c-content--p">To enable multiple drop zones, wrap the <code>&lt;DualListSelector&gt;</code> component with <code>&lt;DragDropContainer&gt;</code>, and create the desired amount of <code>&lt;Droppable&gt;</code> components within <code>&lt;DragDropContainer&gt;</code>. <code>&lt;Droppable&gt;</code> components should be located where <code>&lt;DualListSelectorList&gt;</code> usually would go for each pane to be made draggable.</p>
85
- <p data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-454" data-pf-content="true" class="pf-v6-c-content--p">Each <code>&lt;Droppable&gt;</code> should define the <code>wrapper</code> property as the component that acts as the drop zone, <code>&lt;DualListSelectorList&gt;</code>, and the <code>items</code> property of their respective draggable items as an array of <code>&lt;DraggableObject&gt;</code> data. <code>&lt;DragDropContainer&gt;</code> should be passed the <code>onDrop</code>, <code>onContainerMove</code>, and <code>onCancel</code> callbacks to handle items being dropped, items moving between droppable containers, and what happens if the drag is cancelled respectively. <code>&lt;DragDropContainer&gt;</code> should also be given a <code>Record</code> representing all sortable drop zones’ items. Both components should define the <code>variant</code> property as “DualListSelectorList”.</p>
86
- <p data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-459" data-pf-content="true" class="pf-v6-c-content--p">Full drag and drop details can be found on the <a data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-451" data-pf-content="true" class="pf-v6-c-content--a">drag and drop</a> component page.</p>
87
- <pre data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-456" data-pf-content="true" class="pf-v6-c-content--pre"><code><span class="line"></span></code></pre> <div class="pf-v6-l-stack pf-m-gutter"><div class="pf-v6-l-stack__item pf-v6-u-mt-md"><astro-island uid="Z19vtU" component-url="/_astro/PropsTables.Cio9znJH.js" component-export="PropsTables" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;propComponents&quot;:[1,[[0,&quot;DualListSelector&quot;],[0,&quot;DualListSelectorPane&quot;],[0,&quot;DualListSelectorList&quot;],[0,&quot;DualListSelectorListItem&quot;],[0,&quot;DualListSelectorControlsWrapper&quot;],[0,&quot;DualListSelectorControl&quot;],[0,&quot;DualListSelectorTree&quot;],[0,&quot;DualListSelectorTreeItemData&quot;]]],&quot;url&quot;:[7,&quot;http://localhost:4321/components/dual-list-selector/react/&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;PropsTables&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island></div><div class="pf-v6-l-stack__item"><div class="pf-v6-l-stack pf-m-gutter"><div class="pf-v6-l-stack__item"><div class="pf-v6-l-flex pf-m-space-items-sm pf-m-align-items-center"><div class=""><h2 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-440" id="css-variables" tabindex="-1" data-pf-content="true" class="pf-v6-c-content--h2 pf-m-editorial ws-heading pf-v6-c-content--h2"><a href="#css-variables" class="ws-heading-anchor" tabindex="-1"><svg class="pf-v6-svg ws-heading-anchor-icon" viewBox="0 0 512 512" fill="currentColor" aria-hidden="true" role="img" width="1em" height="1em" style="vertical-align:middle"><path d="M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"></path></svg></a>
78
+ <astro-island uid="Z15pIt3" component-url="/_astro/LiveExample.B5R4Dzng.js" component-export="LiveExample" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;src&quot;:[0,&quot;import { useMemo, useState } from &#39;react&#39;;\nimport {\n DualListSelector,\n DualListSelectorPane,\n DualListSelectorList,\n DualListSelectorControlsWrapper,\n DualListSelectorControl,\n DualListSelectorTree,\n DualListSelectorTreeItemData,\n SearchInput,\n Button,\n EmptyState,\n EmptyStateVariant,\n EmptyStateFooter,\n EmptyStateBody,\n EmptyStateActions\n} from &#39;@patternfly/react-core&#39;;\nimport AngleDoubleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-left-icon&#39;;\nimport AngleLeftIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-left-icon&#39;;\nimport AngleDoubleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-double-right-icon&#39;;\nimport AngleRightIcon from &#39;@patternfly/react-icons/dist/esm/icons/angle-right-icon&#39;;\nimport SearchIcon from &#39;@patternfly/react-icons/dist/esm/icons/search-icon&#39;;\n\ninterface FoodNode {\n id: string;\n text: string;\n children?: FoodNode[];\n}\n\ninterface ExampleProps {\n data: FoodNode[];\n}\n\nexport const DualListSelectorComposableTree: React.FunctionComponent&lt;ExampleProps&gt; = ({ data }: ExampleProps) =&gt; {\n const [checkedLeafIds, setCheckedLeafIds] = useState&lt;string[]&gt;([]);\n const [chosenLeafIds, setChosenLeafIds] = useState&lt;string[]&gt;([&#39;beans&#39;, &#39;beef&#39;, &#39;chicken&#39;, &#39;tofu&#39;]);\n const [chosenFilter, setChosenFilter] = useState&lt;string&gt;(&#39;&#39;);\n const [availableFilter, setAvailableFilter] = useState&lt;string&gt;(&#39;&#39;);\n\n // helper function to build memoized lists\n const buildTextById = (node: FoodNode): { [key: string]: string } =&gt; {\n let textById = {};\n if (!node) {\n return textById;\n }\n textById[node.id] = node.text;\n if (node.children) {\n node.children.forEach((child) =&gt; {\n textById = { ...textById, ...buildTextById(child) };\n });\n }\n return textById;\n };\n\n // helper function to build memoized lists\n const getDescendantLeafIds = (node: FoodNode): string[] =&gt; {\n if (!node.children || !node.children.length) {\n return [node.id];\n } else {\n let childrenIds: string[] = [];\n node.children.forEach((child) =&gt; {\n childrenIds = [...childrenIds, ...getDescendantLeafIds(child)];\n });\n return childrenIds;\n }\n };\n\n // helper function to build memoized lists\n const getLeavesById = (node: FoodNode): { [key: string]: string[] } =&gt; {\n let leavesById = {};\n if (!node.children || !node.children.length) {\n leavesById[node.id] = [node.id];\n } else {\n node.children.forEach((child) =&gt; {\n leavesById[node.id] = getDescendantLeafIds(node);\n leavesById = { ...leavesById, ...getLeavesById(child) };\n });\n }\n return leavesById;\n };\n\n // Builds a map of child leaf nodes by node id - memoized so that it only rebuilds the list if the data changes.\n const { memoizedLeavesById, memoizedAllLeaves, memoizedNodeTexts } = useMemo(() =&gt; {\n let leavesById = {};\n let allLeaves: string[] = [];\n let nodeTexts = {};\n data.forEach((foodNode) =&gt; {\n nodeTexts = { ...nodeTexts, ...buildTextById(foodNode) };\n leavesById = { ...leavesById, ...getLeavesById(foodNode) };\n allLeaves = [...allLeaves, ...getDescendantLeafIds(foodNode)];\n });\n return {\n memoizedLeavesById: leavesById,\n memoizedAllLeaves: allLeaves,\n memoizedNodeTexts: nodeTexts\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data]);\n\n const matchesFilter = (value: string, filter: string) =&gt; value.toLowerCase().includes(filter.trim().toLowerCase());\n\n const getVisibleLeafIds = (leafIds: string[], filter: string) =&gt; {\n const filterMatchingNodeIds = Object.keys(memoizedLeavesById).filter((nodeId) =&gt;\n matchesFilter(memoizedNodeTexts[nodeId], filter)\n );\n const filterMatchingLeafIds = filterMatchingNodeIds.map((nodeId) =&gt; memoizedLeavesById[nodeId]).flat();\n return leafIds.filter((leafId) =&gt; filterMatchingLeafIds.includes(leafId));\n };\n\n const availableLeafIds = memoizedAllLeaves.filter((leafId) =&gt; !chosenLeafIds.includes(leafId));\n const visibleChosenLeafIds = getVisibleLeafIds(chosenLeafIds, chosenFilter);\n const visibleAvailableLeafIds = getVisibleLeafIds(availableLeafIds, availableFilter);\n\n const moveChecked = (toChosen: boolean) =&gt; {\n const visibleCheckedChosenLeafIds = checkedLeafIds.filter((leafId) =&gt; visibleChosenLeafIds.includes(leafId));\n const visibleCheckedAvailableLeafIds = checkedLeafIds.filter((leafId) =&gt; visibleAvailableLeafIds.includes(leafId));\n\n setChosenLeafIds(\n (prevChosenIds) =&gt;\n toChosen\n ? [...prevChosenIds, ...visibleCheckedAvailableLeafIds] // add visible checked ids to chosen list\n : prevChosenIds.filter((x) =&gt; !visibleCheckedChosenLeafIds.includes(x)) // remove visible checked ids from chosen list\n );\n\n // uncheck checked ids that just moved\n setCheckedLeafIds((prevChecked) =&gt;\n toChosen\n ? prevChecked.filter((x) =&gt; !visibleCheckedAvailableLeafIds.includes(x))\n : prevChecked.filter((x) =&gt; !visibleCheckedChosenLeafIds.includes(x))\n );\n };\n\n const moveAll = (toChosen: boolean) =&gt; {\n if (toChosen) {\n setChosenLeafIds((prevChosenIds) =&gt; [...prevChosenIds, ...visibleAvailableLeafIds]);\n } else {\n setChosenLeafIds((prevChosenIds) =&gt; prevChosenIds.filter((id) =&gt; !visibleChosenLeafIds.includes(id)));\n }\n };\n\n const areAllDescendantsSelected = (node: FoodNode, isChosen: boolean) =&gt;\n memoizedLeavesById[node.id].every(\n (id) =&gt; checkedLeafIds.includes(id) &amp;&amp; (isChosen ? chosenLeafIds.includes(id) : !chosenLeafIds.includes(id))\n );\n const areSomeDescendantsSelected = (node: FoodNode, isChosen: boolean) =&gt;\n memoizedLeavesById[node.id].some(\n (id) =&gt; checkedLeafIds.includes(id) &amp;&amp; (isChosen ? chosenLeafIds.includes(id) : !chosenLeafIds.includes(id))\n );\n\n const isNodeChecked = (node: FoodNode, isChosen: boolean) =&gt; {\n if (areAllDescendantsSelected(node, isChosen)) {\n return true;\n }\n if (areSomeDescendantsSelected(node, isChosen)) {\n return false;\n }\n return false;\n };\n\n const onOptionCheck = (\n event: React.MouseEvent | React.ChangeEvent&lt;HTMLInputElement&gt; | React.KeyboardEvent,\n isChecked: boolean,\n node: DualListSelectorTreeItemData,\n isChosen: boolean\n ) =&gt; {\n const nodeIdsToCheck = memoizedLeavesById[node.id].filter((id) =&gt;\n isChosen ? visibleChosenLeafIds.includes(id) : visibleAvailableLeafIds.includes(id)\n );\n\n setCheckedLeafIds((prevChecked) =&gt; {\n const otherCheckedNodeNames = prevChecked.filter((id) =&gt; !nodeIdsToCheck.includes(id));\n return !isChecked ? otherCheckedNodeNames : [...otherCheckedNodeNames, ...nodeIdsToCheck];\n });\n };\n\n // builds a search input - used in each dual list selector pane\n const buildSearchInput = (isChosen: boolean) =&gt; {\n const onChange = (value) =&gt; (isChosen ? setChosenFilter(value) : setAvailableFilter(value));\n\n return (\n &lt;SearchInput\n value={isChosen ? chosenFilter : availableFilter}\n onChange={(_event, value) =&gt; onChange(value)}\n onClear={() =&gt; onChange(&#39;&#39;)}\n /&gt;\n );\n };\n\n // Builds the DualListSelectorTreeItems from the FoodNodes\n const buildOptions = (\n isChosen: boolean,\n [node, ...remainingNodes]: FoodNode[],\n hasParentMatch: boolean\n ): DualListSelectorTreeItemData[] =&gt; {\n if (!node) {\n return [];\n }\n\n const isChecked = isNodeChecked(node, isChosen);\n\n const filterValue = isChosen ? chosenFilter : availableFilter;\n const descendentLeafIds = memoizedLeavesById[node.id];\n const descendentsOnThisPane = isChosen\n ? descendentLeafIds.filter((id) =&gt; chosenLeafIds.includes(id))\n : descendentLeafIds.filter((id) =&gt; !chosenLeafIds.includes(id));\n\n const hasMatchingChildren =\n filterValue &amp;&amp; descendentsOnThisPane.some((id) =&gt; matchesFilter(memoizedNodeTexts[id], filterValue));\n const isFilterMatch = filterValue &amp;&amp; matchesFilter(node.text, filterValue) &amp;&amp; descendentsOnThisPane.length &gt; 0;\n\n // A node is displayed if either of the following is true:\n // - There is no filter value and this node or its descendents belong on this pane\n // - There is a filter value and this node or one of this node&#39;s descendents or ancestors match on this pane\n const isDisplayed =\n (!filterValue &amp;&amp; descendentsOnThisPane.length &gt; 0) ||\n hasMatchingChildren ||\n (hasParentMatch &amp;&amp; descendentsOnThisPane.length &gt; 0) ||\n isFilterMatch;\n\n return [\n ...(isDisplayed\n ? [\n {\n id: node.id,\n text: node.text,\n isChecked,\n checkProps: { &#39;aria-label&#39;: `Select ${node.text}` },\n hasBadge: node.children &amp;&amp; node.children.length &gt; 0,\n badgeProps: { isRead: true },\n defaultExpanded: isChosen ? !!chosenFilter : !!availableFilter,\n children: node.children\n ? buildOptions(isChosen, node.children, isFilterMatch || hasParentMatch)\n : undefined\n }\n ]\n : []),\n ...(!isDisplayed &amp;&amp; node.children &amp;&amp; node.children.length\n ? buildOptions(isChosen, node.children, hasParentMatch)\n : []),\n ...(remainingNodes ? buildOptions(isChosen, remainingNodes, hasParentMatch) : [])\n ];\n };\n\n const buildPane = (isChosen: boolean): React.ReactNode =&gt; {\n const options: DualListSelectorTreeItemData[] = buildOptions(isChosen, data, false);\n const numOptions = isChosen ? visibleChosenLeafIds.length : visibleAvailableLeafIds.length;\n const numSelected = checkedLeafIds.filter((id) =&gt;\n isChosen ? visibleChosenLeafIds.includes(id) : visibleAvailableLeafIds.includes(id)\n ).length;\n const status = `${numSelected} of ${numOptions} options selected`;\n const filterApplied = isChosen ? chosenFilter !== &#39;&#39; : availableFilter !== &#39;&#39;;\n return (\n &lt;DualListSelectorPane\n title={isChosen ? &#39;Chosen&#39; : &#39;Available&#39;}\n status={status}\n searchInput={buildSearchInput(isChosen)}\n isChosen={isChosen}\n listMinHeight=\&quot;300px\&quot;\n &gt;\n {filterApplied &amp;&amp; options.length === 0 &amp;&amp; (\n &lt;EmptyState headingLevel=\&quot;h4\&quot; titleText=\&quot;No results found\&quot; icon={SearchIcon} variant={EmptyStateVariant.sm}&gt;\n &lt;EmptyStateBody&gt;No results match the filter criteria. Clear all filters and try again.&lt;/EmptyStateBody&gt;\n &lt;EmptyStateFooter&gt;\n &lt;EmptyStateActions&gt;\n &lt;Button variant=\&quot;link\&quot; onClick={() =&gt; (isChosen ? setChosenFilter(&#39;&#39;) : setAvailableFilter(&#39;&#39;))}&gt;\n Clear all filters\n &lt;/Button&gt;\n &lt;/EmptyStateActions&gt;\n &lt;/EmptyStateFooter&gt;\n &lt;/EmptyState&gt;\n )}\n {options.length &gt; 0 &amp;&amp; (\n &lt;DualListSelectorList&gt;\n &lt;DualListSelectorTree\n data={options}\n onOptionCheck={(e, isChecked, itemData) =&gt; onOptionCheck(e, isChecked, itemData, isChosen)}\n /&gt;\n &lt;/DualListSelectorList&gt;\n )}\n &lt;/DualListSelectorPane&gt;\n );\n };\n\n return (\n &lt;DualListSelector isTree&gt;\n {buildPane(false)}\n &lt;DualListSelectorControlsWrapper&gt;\n &lt;DualListSelectorControl\n isDisabled={!checkedLeafIds.filter((x) =&gt; visibleAvailableLeafIds.includes(x)).length}\n onClick={() =&gt; moveChecked(true)}\n aria-label=\&quot;Add selected\&quot;\n icon={&lt;AngleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={chosenLeafIds.length === memoizedAllLeaves.length}\n onClick={() =&gt; moveAll(true)}\n aria-label=\&quot;Add all\&quot;\n icon={&lt;AngleDoubleRightIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n isDisabled={chosenLeafIds.length === 0}\n onClick={() =&gt; moveAll(false)}\n aria-label=\&quot;Remove all\&quot;\n icon={&lt;AngleDoubleLeftIcon /&gt;}\n /&gt;\n &lt;DualListSelectorControl\n onClick={() =&gt; moveChecked(false)}\n isDisabled={!checkedLeafIds.filter((x) =&gt; visibleChosenLeafIds.includes(x)).length}\n aria-label=\&quot;Remove selected\&quot;\n icon={&lt;AngleLeftIcon /&gt;}\n /&gt;\n &lt;/DualListSelectorControlsWrapper&gt;\n {buildPane(true)}\n &lt;/DualListSelector&gt;\n );\n};\n\nexport const DualListSelectorComposableTreeExample: React.FunctionComponent = () =&gt; (\n &lt;DualListSelectorComposableTree\n data={[\n {\n id: &#39;fruits&#39;,\n text: &#39;Fruits&#39;,\n children: [\n { id: &#39;apple&#39;, text: &#39;Apple&#39; },\n {\n id: &#39;berries&#39;,\n text: &#39;Berries&#39;,\n children: [\n { id: &#39;blueberry&#39;, text: &#39;Blueberry&#39; },\n { id: &#39;strawberry&#39;, text: &#39;Strawberry&#39; }\n ]\n },\n { id: &#39;banana&#39;, text: &#39;Banana&#39; }\n ]\n },\n { id: &#39;bread&#39;, text: &#39;Bread&#39; },\n {\n id: &#39;vegetables&#39;,\n text: &#39;Vegetables&#39;,\n children: [\n { id: &#39;broccoli&#39;, text: &#39;Broccoli&#39; },\n { id: &#39;cauliflower&#39;, text: &#39;Cauliflower&#39; }\n ]\n },\n {\n id: &#39;proteins&#39;,\n text: &#39;Proteins&#39;,\n children: [\n { id: &#39;beans&#39;, text: &#39;Beans&#39; },\n {\n id: &#39;meats&#39;,\n text: &#39;Meats&#39;,\n children: [\n {\n id: &#39;beef&#39;,\n text: &#39;Beef&#39;\n },\n {\n id: &#39;chicken&#39;,\n text: &#39;Chicken&#39;\n }\n ]\n },\n { id: &#39;tofu&#39;, text: &#39;Tofu&#39; }\n ]\n }\n ]}\n /&gt;\n);\n&quot;],&quot;html&quot;:[0]}" ssr client="only" opts="{&quot;name&quot;:&quot;LiveExampleBase&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island>
79
+ <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-438" data-pf-content="true" class="pf-v6-c-content--h3">Draggable</h3>
80
+ <p data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-442" data-pf-content="true" class="pf-v6-c-content--p">To enable drag and drop, wrap the <code>&lt;DualListSelectorList&gt;</code> component with <code>&lt;DragDropSort&gt;</code>, define the <code>variant</code> property as “DualListSelectorList”, and pass both the sortable items and <code>onDrop</code> callback to <code>&lt;DragDropSort&gt;</code>. <code>&lt;DragDropSort&gt;</code> will create the component’s usual children internally based on the items property, so children inside the <code>&lt;DualListSelectorList&gt;</code> should not be passed to the wrapped component.</p>
81
+ <p data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-448" data-pf-content="true" class="pf-v6-c-content--p">Full drag and drop details can be found on the <a data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-439" data-pf-content="true" class="pf-v6-c-content--a">drag and drop</a> component page.</p>
82
+ <pre data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-445" data-pf-content="true" class="pf-v6-c-content--pre"><code><span class="line"></span></code></pre>
83
+ <h3 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-440" data-pf-content="true" class="pf-v6-c-content--h3">Draggable with multiple drop zones</h3>
84
+ <p data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-443" data-pf-content="true" class="pf-v6-c-content--p">To enable multiple drop zones, wrap the <code>&lt;DualListSelector&gt;</code> component with <code>&lt;DragDropContainer&gt;</code>, and create the desired amount of <code>&lt;Droppable&gt;</code> components within <code>&lt;DragDropContainer&gt;</code>. <code>&lt;Droppable&gt;</code> components should be located where <code>&lt;DualListSelectorList&gt;</code> usually would go for each pane to be made draggable.</p>
85
+ <p data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-444" data-pf-content="true" class="pf-v6-c-content--p">Each <code>&lt;Droppable&gt;</code> should define the <code>wrapper</code> property as the component that acts as the drop zone, <code>&lt;DualListSelectorList&gt;</code>, and the <code>items</code> property of their respective draggable items as an array of <code>&lt;DraggableObject&gt;</code> data. <code>&lt;DragDropContainer&gt;</code> should be passed the <code>onDrop</code>, <code>onContainerMove</code>, and <code>onCancel</code> callbacks to handle items being dropped, items moving between droppable containers, and what happens if the drag is cancelled respectively. <code>&lt;DragDropContainer&gt;</code> should also be given a <code>Record</code> representing all sortable drop zones’ items. Both components should define the <code>variant</code> property as “DualListSelectorList”.</p>
86
+ <p data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-449" data-pf-content="true" class="pf-v6-c-content--p">Full drag and drop details can be found on the <a data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-441" data-pf-content="true" class="pf-v6-c-content--a">drag and drop</a> component page.</p>
87
+ <pre data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-446" data-pf-content="true" class="pf-v6-c-content--pre"><code><span class="line"></span></code></pre> <div class="pf-v6-l-stack pf-m-gutter"><div class="pf-v6-l-stack__item pf-v6-u-mt-md"><astro-island uid="Z19vtU" component-url="/_astro/PropsTables.YkW1puJk.js" component-export="PropsTables" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;propComponents&quot;:[1,[[0,&quot;DualListSelector&quot;],[0,&quot;DualListSelectorPane&quot;],[0,&quot;DualListSelectorList&quot;],[0,&quot;DualListSelectorListItem&quot;],[0,&quot;DualListSelectorControlsWrapper&quot;],[0,&quot;DualListSelectorControl&quot;],[0,&quot;DualListSelectorTree&quot;],[0,&quot;DualListSelectorTreeItemData&quot;]]],&quot;url&quot;:[7,&quot;http://localhost:4321/components/dual-list-selector/react/&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;PropsTables&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island></div><div class="pf-v6-l-stack__item"><div class="pf-v6-l-stack pf-m-gutter"><div class="pf-v6-l-stack__item"><div class="pf-v6-l-flex pf-m-space-items-sm pf-m-align-items-center"><div class=""><h2 data-ouia-component-type="PF6/Content" data-ouia-safe="true" data-ouia-component-id="OUIA-Generated-Content-430" id="css-variables" tabindex="-1" data-pf-content="true" class="pf-v6-c-content--h2 pf-m-editorial ws-heading pf-v6-c-content--h2"><a href="#css-variables" class="ws-heading-anchor" tabindex="-1"><svg class="pf-v6-svg ws-heading-anchor-icon" viewBox="0 0 512 512" fill="currentColor" aria-hidden="true" role="img" width="1em" height="1em" style="vertical-align:middle"><path d="M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"></path></svg></a>
88
88
  CSS variables
89
89
  </h2></div></div></div><div class="pf-v6-l-stack__item"><astro-island uid="rB8jX" component-url="/_astro/CSSTable.-Emc9iTg.js" component-export="CSSTable" renderer-url="/_astro/client.DN8ES6L5.js" props="{&quot;autoLinkHeader&quot;:[0,false],&quot;cssPrefix&quot;:[0,&quot;pf-v6-c-dual-list-selector&quot;]}" ssr client="only" opts="{&quot;name&quot;:&quot;CSSTableComponent&quot;,&quot;value&quot;:&quot;react&quot;}"></astro-island></div></div></div></div> </div></section> </div></section> </main> </div> </div> <script type="module">try{localStorage.getItem("theme-preference")==="dark"&&document.documentElement.classList.add("pf-v6-theme-dark")}catch(e){console.error("Failed to set initial theme:",e)}</script></body></html>