@eclipse-docks/core 0.7.137 → 0.7.140

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 (31) hide show
  1. package/dist/api/index.js +3 -3
  2. package/dist/{api-3h__hDci.js → api-BZXW896G.js} +122 -49
  3. package/dist/api-BZXW896G.js.map +1 -0
  4. package/dist/components/filebrowser.d.ts +12 -1
  5. package/dist/components/filebrowser.d.ts.map +1 -1
  6. package/dist/components/tasks.d.ts.map +1 -1
  7. package/dist/core/filesys/common.d.ts +1 -0
  8. package/dist/core/filesys/common.d.ts.map +1 -1
  9. package/dist/{filebrowser.de-LWsrI9xj.js → filebrowser.de-BfFcNr19.js} +13 -3
  10. package/dist/{filebrowser.de-LWsrI9xj.js.map → filebrowser.de-BfFcNr19.js.map} +1 -1
  11. package/dist/{filebrowser.en-C02vpzAs.js → filebrowser.en-CLd5Mccb.js} +13 -3
  12. package/dist/{filebrowser.en-C02vpzAs.js.map → filebrowser.en-CLd5Mccb.js.map} +1 -1
  13. package/dist/fs-access-B1bmJ5U0.js +2 -0
  14. package/dist/{fs-access-Cjcg0_Me.js → fs-access-CrktZo-_.js} +2 -1
  15. package/dist/fs-access-CrktZo-_.js.map +1 -0
  16. package/dist/index.js +3 -3
  17. package/dist/parts/index.js +1 -1
  18. package/dist/{parts-DMjNqL4o.js → parts-KvjEFJ7v.js} +4 -4
  19. package/dist/parts-KvjEFJ7v.js.map +1 -0
  20. package/dist/webawesome-C0Da7hPu.js.map +1 -1
  21. package/dist/widget-DUR6wxME.js.map +1 -1
  22. package/package.json +2 -2
  23. package/src/components/filebrowser.de.json +6 -1
  24. package/src/components/filebrowser.en.json +6 -1
  25. package/src/components/filebrowser.ts +120 -28
  26. package/src/components/tasks.ts +16 -15
  27. package/src/core/filesys/common.ts +2 -1
  28. package/dist/api-3h__hDci.js.map +0 -1
  29. package/dist/fs-access-Cjcg0_Me.js.map +0 -1
  30. package/dist/fs-access-Dp9Fwsxk.js +0 -2
  31. package/dist/parts-DMjNqL4o.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"webawesome-C0Da7hPu.js","names":[],"sources":["../src/icons/extensions.svg?url","../src/icons/file-plus.svg?url","../src/icons/js.svg?url","../src/icons/jupyter.svg?url","../src/icons/layout-standard-bottom-panel.svg?url","../src/icons/layout-standard-full.svg?url","../src/icons/layout-standard-left-aux.svg?url","../src/icons/layout-standard-left-sidebar.svg?url","../src/icons/layout-standard-right-aux.svg?url","../src/icons/layout-standard-right-sidebar.svg?url","../src/icons/mark-github.svg?url","../src/icons/python.svg?url","../src/icons/settings.svg?url","../src/externals/webawesome.ts"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='9.5'%20y='0.5'%20width='8'%20height='8'%20rx='1'%20fill='var(--wa-color-brand-fill-loud)'%20fill-opacity='0.28'%20stroke='var(--wa-color-brand-fill-loud)'%20stroke-opacity='0.9'%20stroke-width='1'%20stroke-linejoin='round'/%3e%3crect%20x='0.5'%20y='9.5'%20width='8'%20height='8'%20rx='1'%20fill='var(--wa-color-brand-fill-loud)'%20fill-opacity='0.28'%20stroke='var(--wa-color-brand-fill-loud)'%20stroke-opacity='0.9'%20stroke-width='1'%20stroke-linejoin='round'/%3e%3crect%20x='9.5'%20y='9.5'%20width='8'%20height='8'%20rx='1'%20fill='var(--wa-color-brand-fill-loud)'%20fill-opacity='0.28'%20stroke='var(--wa-color-brand-fill-loud)'%20stroke-opacity='0.9'%20stroke-width='1'%20stroke-linejoin='round'/%3e%3crect%20x='0.5'%20y='0.5'%20width='8'%20height='8'%20rx='1'%20fill='var(--wa-color-success-fill-loud)'%20fill-opacity='0.55'%20stroke='var(--wa-color-success-fill-loud)'%20stroke-opacity='1'%20stroke-width='1'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3cpath%20fill='none'%20stroke='currentColor'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%20d='M14%202H6a2%202%200%200%200-2%202v16a2%202%200%200%200%202%202h12a2%202%200%200%200%202-2V8z'/%3e%3cpolyline%20fill='none'%20stroke='currentColor'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%20points='14%202%2014%208%2020%208'/%3e%3cline%20x1='12'%20y1='13'%20x2='12'%20y2='17'%20stroke='currentColor'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cline%20x1='10'%20y1='15'%20x2='14'%20y2='15'%20stroke='currentColor'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20width='800px'%20height='800px'%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20x='2'%20y='2'%20width='28'%20height='28'%20fill='%23FFCA28'/%3e%3cpath%20d='M19%2025.2879L21.0615%2023.9237C21.2231%2024.4313%2022.2462%2025.6368%2023.5385%2025.6368C24.8308%2025.6368%2025.4308%2024.931%2025.4308%2024.463C25.4308%2023.1878%2024.1112%2022.7382%2023.4774%2022.5223C23.374%2022.4871%2023.289%2022.4581%2023.2308%2022.4328C23.2009%2022.4198%2023.1558%2022.4025%2023.0979%2022.3804C22.393%2022.1111%2019.7923%2021.1175%2019.7923%2018.2373C19.7923%2015.065%2022.8538%2014.7002%2023.5462%2014.7002C23.9991%2014.7002%2026.1769%2014.7557%2027.2615%2016.7939L25.2615%2018.1898C24.8231%2017.3015%2024.0946%2017.0081%2023.6462%2017.0081C22.5385%2017.0081%2022.3077%2017.8201%2022.3077%2018.1898C22.3077%2019.227%2023.5112%2019.6919%2024.5273%2020.0844C24.7932%2020.1871%2025.0462%2020.2848%2025.2615%2020.3866C26.3692%2020.91%2028%2021.7666%2028%2024.463C28%2025.8136%2026.8672%2028.0002%2024.0154%2028.0002C20.1846%2028.0002%2019.1692%2025.7003%2019%2025.2879Z'%20fill='%233E3E3E'/%3e%3cpath%20d='M9%2025.5587L11.1487%2024.1953C11.317%2024.7026%2011.9713%2025.638%2012.9205%2025.638C13.8698%2025.638%2014.3557%2024.663%2014.3557%2024.1953V15.0002H16.9982V24.1953C17.041%2025.4636%2016.3376%2028.0002%2013.2332%2028.0002C10.379%2028.0002%209.19242%2026.3039%209%2025.5587Z'%20fill='%233E3E3E'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20width='800px'%20height='800px'%20viewBox='-22%200%20300%20300'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20preserveAspectRatio='xMidYMid'%3e%3cg%3e%3cpath%20d='M10.5838307,156.409656%20L10.5838307,156.196646%20L10.5838307,123.657627%20L17.7200527,123.657627%20L17.7200527,158.912657%20C18.0516208,161.753926%2017.8075656,164.63288%2017.0023629,167.377784%20C16.19722,170.122687%2014.8474392,172.677251%2013.0335946,174.88924%20C9.6624625,177.797086%205.34298451,179.369568%200.891381719,179.309391%20L0.145805038,173.983903%20C3.01718628,173.985518%205.78730255,172.922981%207.92105685,171.001585%20C9.83826599,168.76489%2010.5838307,165.729334%2010.5838307,156.409656%20Z%20M63.8037763,152.209035%20C63.8037763,156.203166%2063.8037763,159.771277%2064.1232613,162.860071%20L57.7859014,162.860071%20L57.3598815,156.522711%20C56.0343268,158.765028%2054.1386519,160.616318%2051.8656486,161.888456%20C49.5925854,163.160593%2047.0232464,163.808237%2044.4187946,163.765408%20C38.2412071,163.765408%2030.8919752,160.410366%2030.8919752,146.723715%20L30.8919752,123.983721%20L38.0281972,123.983721%20L38.0281972,145.285823%20C38.0281972,152.688352%2040.3181887,157.641058%2046.7620834,157.641058%20C48.0878176,157.655354%2049.4030239,157.404719%2050.6306575,156.903927%20C51.8582911,156.403136%2052.9735276,155.662296%2053.9110465,154.724777%20C54.8485056,153.787318%2055.5894046,152.672022%2056.0901963,151.444448%20C56.5909282,150.216815%2056.8415633,148.901549%2056.8273268,147.575814%20L56.8273268,123.717444%20L63.9634889,123.717444%20L63.9634889,151.996025%20L63.8037763,152.209035%20Z%20M77.330762,136.653806%20C77.330762,131.70104%2077.330762,127.653648%2077.0112304,123.979032%20L83.4018876,123.979032%20L83.7213726,130.635931%20C85.1452074,128.23088%2087.1949721,126.257257%2089.6521533,124.925482%20C92.1093944,123.593709%2094.8819333,122.953703%2097.6742718,123.073695%20C107.153723,123.073695%20114.289945,131.008713%20114.289945,142.831393%20C114.289945,156.784292%20105.715831,163.707504%2096.4493898,163.707504%20C94.0776877,163.813321%2091.7187865,163.305232%2089.6009496,162.232346%20C87.4831127,161.159401%2085.6780613,159.558028%2084.3604623,157.583154%20L84.3604623,178.885226%20L77.330762,178.885226%20L77.330762,136.813578%20L77.330762,136.653806%20Z%20M84.3604623,147.038594%20C84.3797833,148.004885%2084.4867369,148.967408%2084.6800071,149.914378%20C85.2842232,152.279021%2086.6597255,154.374666%2088.5887785,155.869683%20C90.5178913,157.364761%2092.8904309,158.173852%2095.3310427,158.168947%20C102.840047,158.168947%20107.260258,152.044597%20107.260258,143.150938%20C107.260258,135.375686%20103.106354,128.718758%2095.59735,128.718758%20C92.6257387,128.962101%2089.844945,130.280974%2087.7762781,132.428062%20C85.7076111,134.575149%2084.4931374,137.403079%2084.3604623,140.381689%20L84.3604623,147.038594%20Z%20M127.004503,123.94359%20L135.578617,146.896647%20C136.483954,149.452886%20137.442529,152.54168%20138.081618,154.831671%20C138.827183,152.488442%20139.625985,149.506124%20140.58462,146.736875%20L148.359872,123.94359%20L155.868876,123.94359%20L145.21784,151.636343%20C139.892293,164.950152%20136.643726,171.820127%20131.744199,175.97403%20C129.27643,178.228071%20126.267791,179.805756%20123.010354,180.553953%20L121.252929,174.589376%20C123.530581,173.840999%20125.645092,172.666304%20127.48382,171.127799%20C130.081872,169.010501%20132.14366,166.310102%20133.501635,163.246013%20C133.792288,162.715372%20133.990404,162.139031%20134.087428,161.541814%20C134.026892,160.899135%20133.865146,160.270094%20133.60817,159.677902%20L119.122716,123.837079%20L126.897968,123.837079%20L127.004503,123.94359%20Z%20M174.813541,112.770851%20L174.813541,123.954441%20L185.038557,123.954441%20L185.038557,129.279989%20L174.813541,129.279989%20L174.813541,150.262575%20C174.813541,155.055568%20176.198196,157.824817%20180.139089,157.824817%20C181.538758,157.847727%20182.935316,157.686579%20184.292992,157.345559%20L184.612537,162.671047%20C182.57671,163.376355%20180.428486,163.701283%20178.275118,163.629682%20C176.849069,163.718929%20175.420569,163.498622%20174.087657,162.983833%20C172.754744,162.469044%20171.549004,161.671976%20170.553103,160.647363%20C168.383883,157.745977%20167.394359,154.130491%20167.783854,150.528882%20L167.783854,129.226751%20L161.712742,129.226751%20L161.712742,123.901204%20L167.890329,123.901204%20L167.890329,114.421764%20L174.813541,112.770851%20Z%20M198.184399,144.647511%20C198.03988,146.453639%20198.289199,148.269577%20198.915189,149.969888%20C199.541179,151.670199%20200.528884,153.214267%20201.810114,154.495437%20C203.091285,155.776667%20204.635352,156.764373%20206.335664,157.390363%20C208.035975,158.016352%20209.851913,158.265672%20211.658041,158.121153%20C215.311153,158.202863%20218.940457,157.513288%20222.309077,156.097409%20L223.533958,161.422956%20C219.400274,163.12572%20214.955358,163.942168%20210.486396,163.819423%20C207.881107,163.997798%20205.268101,163.61054%20202.826592,162.684147%20C200.385023,161.757814%20198.172795,160.3143%20196.341489,158.452721%20C194.51022,156.591082%20193.103284,154.355345%20192.217196,151.898941%20C191.331104,149.442478%20190.986827,146.82349%20191.207978,144.221491%20C191.207978,132.505346%20198.184399,123.238905%20209.581059,123.238905%20C222.362314,123.238905%20225.557643,134.422495%20225.557643,141.558717%20C225.625954,142.658281%20225.625954,143.761016%20225.557643,144.860581%20L198.024687,144.860581%20L198.184399,144.647511%20Z%20M219.06051,139.322023%20C219.266043,137.898188%20219.163995,136.446897%20218.761184,135.065892%20C218.358433,133.684886%20217.664311,132.406228%20216.725656,131.316115%20C215.786941,130.226062%20214.625525,129.349856%20213.31959,128.746561%20C212.013656,128.143278%20210.59353,127.826939%20209.155039,127.818864%20C206.228949,128.030665%20203.487515,129.327603%20201.467959,131.455549%20C199.448402,133.583436%20198.296377,136.388874%20198.237697,139.322023%20L219.06051,139.322023%20Z%20M236.385366,136.053478%20C236.385366,131.473555%20236.385366,127.532637%20236.065834,123.911277%20L242.456492,123.911277%20L242.456492,131.526792%20L242.775977,131.526792%20C243.446769,129.176325%20244.83268,127.093027%20246.741335,125.566097%20C248.64999,124.039161%20250.986699,123.144369%20253.427072,123.005938%20C254.098762,122.917777%20254.779066,122.917777%20255.450756,123.005938%20L255.450756,129.66288%20C254.63688,129.568608%20253.814868,129.568608%20253.000992,129.66288%20C250.58353,129.756495%20248.282771,130.726973%20246.528505,132.393068%20C244.774238,134.059104%20243.686458,136.306745%20243.468304,138.716252%20C243.269171,139.805946%20243.162278,140.910475%20243.148819,142.018055%20L243.148819,162.734394%20L236.11909,162.734394%20L236.11909,136.106715%20L236.385366,136.053478%20Z'%20fill='%234E4E4E'%3e%3c/path%3e%3cpath%20d='M233.257943,16.9621357%20C233.476636,20.5398773%20232.625434,24.1017075%20230.812666,27.1939108%20C228.999898,30.286174%20226.307754,32.7687777%20223.079047,34.3255867%20C219.85034,35.8823358%20216.231324,36.4427655%20212.683013,35.9355136%20C209.134702,35.4282017%20205.817704,33.8761781%20203.154559,31.4770796%20C200.491421,29.0780409%20198.602703,25.9404959%20197.729013,22.4642047%20C196.855323,18.9879135%20197.036209,15.330196%20198.248625,11.9570899%20C199.461041,8.5839838%20201.650109,5.64808944%20204.536953,3.52346926%20C207.423803,1.39884909%20210.877782,0.181657262%20214.458814,0.0269503701%20C216.806708,-0.10224713%20219.156996,0.233972409%20221.374429,1.01627461%20C223.591922,1.79857323%20225.632893,3.01152758%20227.379981,4.58537259%20C229.12701,6.15922358%20230.54576,8.06291398%20231.554522,10.1869719%20C232.563283,12.3110298%20233.142196,14.6135829%20233.257943,16.9621357%20Z'%20fill='%23767677'%3e%3c/path%3e%3cpath%20d='M127.952969,225.540984%20C80.0236372,225.540984%2037.8984531,208.339518%2016.1170646,182.936721%20C24.5683135,205.78944%2039.8176362,225.504615%2059.8124569,239.428562%20C79.8070981,253.352629%20103.588124,260.816651%20127.952969,260.816651%20C152.318411,260.816651%20176.098839,253.352629%20196.094019,239.428562%20C216.0886,225.504615%20231.337863,205.78944%20239.789471,182.936721%20C218.061379,208.339518%20176.095848,225.540984%20127.952969,225.540984%20Z'%20fill='%23F37726'%3e%3c/path%3e%3cpath%20d='M127.952969,60.3543133%20C175.882898,60.3543133%20218.008142,77.5557785%20239.789471,102.958396%20C231.337863,80.1058563%20216.0886,60.3906823%20196.094019,46.4667348%20C176.098839,32.5427873%20152.318411,25.0784666%20127.952969,25.0784666%20C103.588124,25.0784666%2079.8070981,32.5427873%2059.8124569,46.4667348%20C39.8176362,60.3906823%2024.5683135,80.1058563%2016.1170646,102.958396%20C37.8984531,77.502541%2079.8106871,60.3543133%20127.952969,60.3543133%20Z'%20fill='%23F37726'%3e%3c/path%3e%3cpath%20d='M61.9716874,274.975202%20C62.2528294,279.48161%2061.186045,283.969713%2058.9072992,287.867658%20C56.6284936,291.765602%2053.2409116,294.896926%2049.1761363,296.862707%20C45.1113611,298.828488%2040.5533909,299.539717%2036.0829934,298.905772%20C31.6125362,298.271767%2027.4320141,296.321359%2024.0740419,293.30297%20C20.7160636,290.284582%2018.3326671,286.334835%2017.2274978,281.957035%20C16.1223339,277.579176%2016.3454363,272.971497%2017.868382,268.720869%20C19.3913284,264.470301%2022.1451683,260.769335%2025.7790187,258.089483%20C29.4129289,255.40962%2033.7623156,253.872201%2038.2730898,253.673106%20C41.2280121,253.515051%2044.1851476,253.940738%2046.9755719,254.925846%20C49.7659364,255.910962%2052.3349165,257.436187%2054.5356604,259.414404%20C56.7364042,261.392633%2058.5259031,263.785032%2059.8017495,266.455044%20C61.0776558,269.124996%2061.8150255,272.02022%2061.9716874,274.975202%20Z'%20fill='%239E9E9E'%3e%3c/path%3e%3cpath%20d='M21.5641016,54.5650606%20C18.9814831,54.6363631%2016.4354131,53.9424806%2014.2460944,52.570687%20C12.0567996,51.1988336%2010.3219858,49.2102622%209.25983722,46.8551295%20C8.19768984,44.499937%207.85562972,41.8832824%208.276674,39.3342215%20C8.69771827,36.7851606%209.86306631,34.4174662%2011.6261678,32.5289814%20C13.3892752,30.6404727%2015.6714246,29.3154324%2018.1856119,28.7204982%20C20.6997394,28.1255646%2023.3336813,28.2873008%2025.7562282,29.1853653%20C28.1787154,30.0834346%2030.2815979,31.6777312%2031.800363,33.767765%20C33.3191879,35.8578106%2034.1861222,38.3502842%2034.2921188,40.9317063%20C34.3930308,44.4222341%2033.113057,47.8117302%2030.7300493,50.3642007%20C28.3470417,52.916731%2025.0533134,54.4262842%2021.5641016,54.5650606%20Z'%20fill='%23616262'%3e%3c/path%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='4'%20y='3'%20width='16'%20height='11'%20rx='1.25'%20ry='1.25'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3crect%20x='4'%20y='16'%20width='16'%20height='5'%20rx='1.25'%20ry='1.25'%20fill='%232563eb'%20fill-opacity='0.2'%20stroke='%232563eb'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='8'%20y='4'%20width='8'%20height='8'%20rx='1.25'%20ry='1.25'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3cline%20x1='2.5'%20y1='2'%20x2='2.5'%20y2='22'%20stroke='%232563eb'%20stroke-width='2'%20stroke-linecap='round'/%3e%3cline%20x1='21.5'%20y1='2'%20x2='21.5'%20y2='22'%20stroke='%232563eb'%20stroke-width='2'%20stroke-linecap='round'/%3e%3cline%20x1='6'%20y1='20'%20x2='18'%20y2='20'%20stroke='%232563eb'%20stroke-width='2'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='8'%20y='4'%20width='12'%20height='16'%20rx='1.25'%20ry='1.25'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3crect%20x='2'%20y='4'%20width='5'%20height='7'%20rx='1'%20ry='1'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3crect%20x='2'%20y='13'%20width='5'%20height='7'%20rx='1'%20ry='1'%20fill='%232563eb'%20fill-opacity='0.2'%20stroke='%232563eb'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='7'%20y='4'%20width='13'%20height='16'%20rx='1.25'%20ry='1.25'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3cline%20x1='2.5'%20y1='2'%20x2='2.5'%20y2='22'%20stroke='%232563eb'%20stroke-width='2'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='4'%20y='4'%20width='12'%20height='16'%20rx='1.25'%20ry='1.25'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3crect%20x='17'%20y='4'%20width='5'%20height='7'%20rx='1'%20ry='1'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3crect%20x='17'%20y='13'%20width='5'%20height='7'%20rx='1'%20ry='1'%20fill='%232563eb'%20fill-opacity='0.2'%20stroke='%232563eb'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='4'%20y='4'%20width='13'%20height='16'%20rx='1.25'%20ry='1.25'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3cline%20x1='21.5'%20y1='2'%20x2='21.5'%20y2='22'%20stroke='%232563eb'%20stroke-width='2'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2016%2016'%20width='16'%20height='16'%3e%3cpath%20fill-rule='evenodd'%20d='M8%200C3.58%200%200%203.58%200%208c0%203.54%202.29%206.53%205.47%207.59.4.07.55-.17.55-.38%200-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01%201.08.58%201.23.82.72%201.21%201.87.87%202.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95%200-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12%200%200%20.67-.21%202.2.82.64-.18%201.32-.27%202-.27.68%200%201.36.09%202%20.27%201.53-1.04%202.2-.82%202.2-.82.44%201.1.16%201.92.08%202.12.51.56.82%201.27.82%202.15%200%203.07-1.87%203.75-3.65%203.95.29.25.54.73.54%201.48%200%201.07-.01%201.93-.01%202.2%200%20.21.15.46.55.38A8.013%208.013%200%200016%208c0-4.42-3.58-8-8-8z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20width='800px'%20height='800px'%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M13.0164%202C10.8193%202%209.03825%203.72453%209.03825%205.85185V8.51852H15.9235V9.25926H5.97814C3.78107%209.25926%202%2010.9838%202%2013.1111L2%2018.8889C2%2021.0162%203.78107%2022.7407%205.97814%2022.7407H8.27322V19.4815C8.27322%2017.3542%2010.0543%2015.6296%2012.2514%2015.6296H19.5956C21.4547%2015.6296%2022.9617%2014.1704%2022.9617%2012.3704V5.85185C22.9617%203.72453%2021.1807%202%2018.9836%202H13.0164ZM12.0984%206.74074C12.8589%206.74074%2013.4754%206.14378%2013.4754%205.40741C13.4754%204.67103%2012.8589%204.07407%2012.0984%204.07407C11.3378%204.07407%2010.7213%204.67103%2010.7213%205.40741C10.7213%206.14378%2011.3378%206.74074%2012.0984%206.74074Z'%20fill='url(%23paint0_linear_87_8204)'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M18.9834%2030C21.1805%2030%2022.9616%2028.2755%2022.9616%2026.1482V23.4815L16.0763%2023.4815L16.0763%2022.7408L26.0217%2022.7408C28.2188%2022.7408%2029.9998%2021.0162%2029.9998%2018.8889V13.1111C29.9998%2010.9838%2028.2188%209.25928%2026.0217%209.25928L23.7266%209.25928V12.5185C23.7266%2014.6459%2021.9455%2016.3704%2019.7485%2016.3704L12.4042%2016.3704C10.5451%2016.3704%209.03809%2017.8296%209.03809%2019.6296L9.03809%2026.1482C9.03809%2028.2755%2010.8192%2030%2013.0162%2030H18.9834ZM19.9015%2025.2593C19.1409%2025.2593%2018.5244%2025.8562%2018.5244%2026.5926C18.5244%2027.329%2019.1409%2027.9259%2019.9015%2027.9259C20.662%2027.9259%2021.2785%2027.329%2021.2785%2026.5926C21.2785%2025.8562%2020.662%2025.2593%2019.9015%2025.2593Z'%20fill='url(%23paint1_linear_87_8204)'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_87_8204'%20x1='12.4809'%20y1='2'%20x2='12.4809'%20y2='22.7407'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23327EBD'/%3e%3cstop%20offset='1'%20stop-color='%231565A7'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint1_linear_87_8204'%20x1='19.519'%20y1='9.25928'%20x2='19.519'%20y2='30'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23FFDA4B'/%3e%3cstop%20offset='1'%20stop-color='%23F9C600'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3cline%20x1='1.5'%20y1='5.5'%20x2='22.5'%20y2='5.5'%20stroke='var(--wa-color-brand-fill-loud)'%20stroke-opacity='0.45'%20stroke-width='2.5'%20stroke-linecap='round'/%3e%3cline%20x1='1.5'%20y1='12'%20x2='22.5'%20y2='12'%20stroke='var(--wa-color-brand-fill-loud)'%20stroke-opacity='0.45'%20stroke-width='2.5'%20stroke-linecap='round'/%3e%3cline%20x1='1.5'%20y1='18.5'%20x2='22.5'%20y2='18.5'%20stroke='var(--wa-color-brand-fill-loud)'%20stroke-opacity='0.45'%20stroke-width='2.5'%20stroke-linecap='round'/%3e%3ccircle%20cx='16.75'%20cy='5.5'%20r='3.5'%20fill='var(--wa-color-success-fill-loud)'%20fill-opacity='0.85'%20stroke='var(--wa-color-success-fill-loud)'%20stroke-opacity='1'%20stroke-width='1'/%3e%3ccircle%20cx='7.25'%20cy='12'%20r='3.5'%20fill='var(--wa-color-success-fill-loud)'%20fill-opacity='0.85'%20stroke='var(--wa-color-success-fill-loud)'%20stroke-opacity='1'%20stroke-width='1'/%3e%3ccircle%20cx='14.25'%20cy='18.5'%20r='3.5'%20fill='var(--wa-color-success-fill-loud)'%20fill-opacity='0.85'%20stroke='var(--wa-color-success-fill-loud)'%20stroke-opacity='1'%20stroke-width='1'/%3e%3c/svg%3e\"","// unfortunately, webawesome has no all-in-one import, so we need to import each component individually\nimport '@awesome.me/webawesome/dist/components/accordion/accordion.js';\nimport '@awesome.me/webawesome/dist/components/accordion-item/accordion-item.js';\nimport '@awesome.me/webawesome/dist/components/animated-image/animated-image.js';\nimport '@awesome.me/webawesome/dist/components/animation/animation.js';\nimport '@awesome.me/webawesome/dist/components/avatar/avatar.js';\nimport '@awesome.me/webawesome/dist/components/badge/badge.js';\nimport '@awesome.me/webawesome/dist/components/breadcrumb/breadcrumb.js';\nimport '@awesome.me/webawesome/dist/components/breadcrumb-item/breadcrumb-item.js';\nimport '@awesome.me/webawesome/dist/components/button/button.js';\nimport '@awesome.me/webawesome/dist/components/button-group/button-group.js';\nimport '@awesome.me/webawesome/dist/components/callout/callout.js';\nimport '@awesome.me/webawesome/dist/components/card/card.js';\nimport '@awesome.me/webawesome/dist/components/carousel/carousel.js';\nimport '@awesome.me/webawesome/dist/components/carousel-item/carousel-item.js';\nimport '@awesome.me/webawesome/dist/components/checkbox/checkbox.js';\nimport '@awesome.me/webawesome/dist/components/checkbox-group/checkbox-group.js';\nimport '@awesome.me/webawesome/dist/components/color-picker/color-picker.js';\nimport '@awesome.me/webawesome/dist/components/comparison/comparison.js';\nimport '@awesome.me/webawesome/dist/components/copy-button/copy-button.js';\nimport '@awesome.me/webawesome/dist/components/details/details.js';\nimport '@awesome.me/webawesome/dist/components/dialog/dialog.js';\nimport '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/drawer/drawer.js';\nimport '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';\nimport '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\nimport '@awesome.me/webawesome/dist/components/format-bytes/format-bytes.js';\nimport '@awesome.me/webawesome/dist/components/format-date/format-date.js';\nimport '@awesome.me/webawesome/dist/components/format-number/format-number.js';\nimport '@awesome.me/webawesome/dist/components/icon/icon.js';\nimport '@awesome.me/webawesome/dist/components/include/include.js';\nimport '@awesome.me/webawesome/dist/components/input/input.js';\nimport '@awesome.me/webawesome/dist/components/intersection-observer/intersection-observer.js';\nimport '@awesome.me/webawesome/dist/components/known-date/known-date.js';\nimport '@awesome.me/webawesome/dist/components/markdown/markdown.js';\nimport '@awesome.me/webawesome/dist/components/mutation-observer/mutation-observer.js';\nimport '@awesome.me/webawesome/dist/components/number-input/number-input.js';\nimport '@awesome.me/webawesome/dist/components/option/option.js';\nimport '@awesome.me/webawesome/dist/components/otp-input/otp-input.js';\nimport '@awesome.me/webawesome/dist/components/page/page.js';\nimport '@awesome.me/webawesome/dist/components/pagination/pagination.js';\nimport '@awesome.me/webawesome/dist/components/popover/popover.js';\nimport '@awesome.me/webawesome/dist/components/popup/popup.js';\nimport '@awesome.me/webawesome/dist/components/progress-bar/progress-bar.js';\nimport '@awesome.me/webawesome/dist/components/progress-ring/progress-ring.js';\nimport '@awesome.me/webawesome/dist/components/qr-code/qr-code.js';\nimport '@awesome.me/webawesome/dist/components/radio/radio.js';\nimport '@awesome.me/webawesome/dist/components/radio-group/radio-group.js';\nimport '@awesome.me/webawesome/dist/components/rating/rating.js';\nimport '@awesome.me/webawesome/dist/components/random-content/random-content.js';\nimport '@awesome.me/webawesome/dist/components/relative-time/relative-time.js';\nimport '@awesome.me/webawesome/dist/components/resize-observer/resize-observer.js';\nimport '@awesome.me/webawesome/dist/components/scroller/scroller.js';\nimport '@awesome.me/webawesome/dist/components/select/select.js';\nimport '@awesome.me/webawesome/dist/components/skeleton/skeleton.js';\nimport '@awesome.me/webawesome/dist/components/slider/slider.js';\nimport '@awesome.me/webawesome/dist/components/spinner/spinner.js';\nimport '@awesome.me/webawesome/dist/components/split-panel/split-panel.js';\nimport '@awesome.me/webawesome/dist/components/switch/switch.js';\nimport '@awesome.me/webawesome/dist/components/tab/tab.js';\nimport '@awesome.me/webawesome/dist/components/tab-group/tab-group.js';\nimport '@awesome.me/webawesome/dist/components/tab-panel/tab-panel.js';\nimport '@awesome.me/webawesome/dist/components/tag/tag.js';\nimport '@awesome.me/webawesome/dist/components/textarea/textarea.js';\nimport '@awesome.me/webawesome/dist/components/time-input/time-input.js';\nimport '@awesome.me/webawesome/dist/components/toast/toast.js';\nimport '@awesome.me/webawesome/dist/components/toast-item/toast-item.js';\nimport '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';\nimport '@awesome.me/webawesome/dist/components/tree/tree.js';\nimport '@awesome.me/webawesome/dist/components/tree-item/tree-item.js';\nimport '@awesome.me/webawesome/dist/components/zoomable-frame/zoomable-frame.js';\n\n// Import default WebAwesome styles\nimport '@awesome.me/webawesome/dist/styles/native.css';\nimport '@awesome.me/webawesome/dist/styles/utilities.css';\nimport '@awesome.me/webawesome/dist/styles/themes/default.css';\n\nimport {registerIconLibrary} from '@awesome.me/webawesome'\n\nregisterIconLibrary('docks', {\n resolver: (name: string) => {\n return new URL(`../icons/${name}.svg`, import.meta.url).href;\n },\n mutator: (svg: SVGElement) => {\n svg.setAttribute('fill', 'currentColor');\n svg.setAttribute('stroke', 'currentColor');\n }\n});\n\nexport { registerIconLibrary };"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,qBAAe;;;ACAf,IAAA,oBAAe;;;ACAf,IAAA,aAAe;;;ACAf,IAAA,kBAAe;;;ACAf,IAAA,uCAAe;;;ACAf,IAAA,+BAAe;;;ACAf,IAAA,mCAAe;;;ACAf,IAAA,uCAAe;;;ACAf,IAAA,oCAAe;;;ACAf,IAAA,wCAAe;;;ACAf,IAAA,sBAAe;;;ACAf,IAAA,iBAAe;;;ACAf,IAAA,mBAAe;;;AC+Ef,oBAAoB,SAAS;CACzB,WAAW,SAAiB;EACxB,OAAO,IAAA,KAAA,uBAAA,OAAA;GAAA,2BAAA;GAAA,0BAAA;GAAA,mBAAA;GAAA,wBAAA;GAAA,6CAAA;GAAA,qCAAA;GAAA,yCAAA;GAAA,6CAAA;GAAA,0CAAA;GAAA,8CAAA;GAAA,4BAAA;GAAA,uBAAA;GAAA,yBAAA;EAAA,CAAA,EAAA,CAAA,YAAA,KAAA,QAAA,YAAA,GAAA,CAAgD,CAAC;CAC5D;CACA,UAAU,QAAoB;EAC1B,IAAI,aAAa,QAAQ,cAAc;EACvC,IAAI,aAAa,UAAU,cAAc;CAC7C;AACJ,CAAC"}
1
+ {"version":3,"file":"webawesome-C0Da7hPu.js","names":["__import_glob__0_0_","__import_glob__0_1_","__import_glob__0_2_","__import_glob__0_3_","__import_glob__0_4_","__import_glob__0_5_","__import_glob__0_6_","__import_glob__0_7_","__import_glob__0_8_","__import_glob__0_9_","__import_glob__0_10_","__import_glob__0_11_","__import_glob__0_12_"],"sources":["../src/icons/extensions.svg?url","../src/icons/file-plus.svg?url","../src/icons/js.svg?url","../src/icons/jupyter.svg?url","../src/icons/layout-standard-bottom-panel.svg?url","../src/icons/layout-standard-full.svg?url","../src/icons/layout-standard-left-aux.svg?url","../src/icons/layout-standard-left-sidebar.svg?url","../src/icons/layout-standard-right-aux.svg?url","../src/icons/layout-standard-right-sidebar.svg?url","../src/icons/mark-github.svg?url","../src/icons/python.svg?url","../src/icons/settings.svg?url","../src/externals/webawesome.ts"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='9.5'%20y='0.5'%20width='8'%20height='8'%20rx='1'%20fill='var(--wa-color-brand-fill-loud)'%20fill-opacity='0.28'%20stroke='var(--wa-color-brand-fill-loud)'%20stroke-opacity='0.9'%20stroke-width='1'%20stroke-linejoin='round'/%3e%3crect%20x='0.5'%20y='9.5'%20width='8'%20height='8'%20rx='1'%20fill='var(--wa-color-brand-fill-loud)'%20fill-opacity='0.28'%20stroke='var(--wa-color-brand-fill-loud)'%20stroke-opacity='0.9'%20stroke-width='1'%20stroke-linejoin='round'/%3e%3crect%20x='9.5'%20y='9.5'%20width='8'%20height='8'%20rx='1'%20fill='var(--wa-color-brand-fill-loud)'%20fill-opacity='0.28'%20stroke='var(--wa-color-brand-fill-loud)'%20stroke-opacity='0.9'%20stroke-width='1'%20stroke-linejoin='round'/%3e%3crect%20x='0.5'%20y='0.5'%20width='8'%20height='8'%20rx='1'%20fill='var(--wa-color-success-fill-loud)'%20fill-opacity='0.55'%20stroke='var(--wa-color-success-fill-loud)'%20stroke-opacity='1'%20stroke-width='1'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3cpath%20fill='none'%20stroke='currentColor'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%20d='M14%202H6a2%202%200%200%200-2%202v16a2%202%200%200%200%202%202h12a2%202%200%200%200%202-2V8z'/%3e%3cpolyline%20fill='none'%20stroke='currentColor'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%20points='14%202%2014%208%2020%208'/%3e%3cline%20x1='12'%20y1='13'%20x2='12'%20y2='17'%20stroke='currentColor'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3cline%20x1='10'%20y1='15'%20x2='14'%20y2='15'%20stroke='currentColor'%20stroke-width='1.5'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20width='800px'%20height='800px'%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20x='2'%20y='2'%20width='28'%20height='28'%20fill='%23FFCA28'/%3e%3cpath%20d='M19%2025.2879L21.0615%2023.9237C21.2231%2024.4313%2022.2462%2025.6368%2023.5385%2025.6368C24.8308%2025.6368%2025.4308%2024.931%2025.4308%2024.463C25.4308%2023.1878%2024.1112%2022.7382%2023.4774%2022.5223C23.374%2022.4871%2023.289%2022.4581%2023.2308%2022.4328C23.2009%2022.4198%2023.1558%2022.4025%2023.0979%2022.3804C22.393%2022.1111%2019.7923%2021.1175%2019.7923%2018.2373C19.7923%2015.065%2022.8538%2014.7002%2023.5462%2014.7002C23.9991%2014.7002%2026.1769%2014.7557%2027.2615%2016.7939L25.2615%2018.1898C24.8231%2017.3015%2024.0946%2017.0081%2023.6462%2017.0081C22.5385%2017.0081%2022.3077%2017.8201%2022.3077%2018.1898C22.3077%2019.227%2023.5112%2019.6919%2024.5273%2020.0844C24.7932%2020.1871%2025.0462%2020.2848%2025.2615%2020.3866C26.3692%2020.91%2028%2021.7666%2028%2024.463C28%2025.8136%2026.8672%2028.0002%2024.0154%2028.0002C20.1846%2028.0002%2019.1692%2025.7003%2019%2025.2879Z'%20fill='%233E3E3E'/%3e%3cpath%20d='M9%2025.5587L11.1487%2024.1953C11.317%2024.7026%2011.9713%2025.638%2012.9205%2025.638C13.8698%2025.638%2014.3557%2024.663%2014.3557%2024.1953V15.0002H16.9982V24.1953C17.041%2025.4636%2016.3376%2028.0002%2013.2332%2028.0002C10.379%2028.0002%209.19242%2026.3039%209%2025.5587Z'%20fill='%233E3E3E'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20width='800px'%20height='800px'%20viewBox='-22%200%20300%20300'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20preserveAspectRatio='xMidYMid'%3e%3cg%3e%3cpath%20d='M10.5838307,156.409656%20L10.5838307,156.196646%20L10.5838307,123.657627%20L17.7200527,123.657627%20L17.7200527,158.912657%20C18.0516208,161.753926%2017.8075656,164.63288%2017.0023629,167.377784%20C16.19722,170.122687%2014.8474392,172.677251%2013.0335946,174.88924%20C9.6624625,177.797086%205.34298451,179.369568%200.891381719,179.309391%20L0.145805038,173.983903%20C3.01718628,173.985518%205.78730255,172.922981%207.92105685,171.001585%20C9.83826599,168.76489%2010.5838307,165.729334%2010.5838307,156.409656%20Z%20M63.8037763,152.209035%20C63.8037763,156.203166%2063.8037763,159.771277%2064.1232613,162.860071%20L57.7859014,162.860071%20L57.3598815,156.522711%20C56.0343268,158.765028%2054.1386519,160.616318%2051.8656486,161.888456%20C49.5925854,163.160593%2047.0232464,163.808237%2044.4187946,163.765408%20C38.2412071,163.765408%2030.8919752,160.410366%2030.8919752,146.723715%20L30.8919752,123.983721%20L38.0281972,123.983721%20L38.0281972,145.285823%20C38.0281972,152.688352%2040.3181887,157.641058%2046.7620834,157.641058%20C48.0878176,157.655354%2049.4030239,157.404719%2050.6306575,156.903927%20C51.8582911,156.403136%2052.9735276,155.662296%2053.9110465,154.724777%20C54.8485056,153.787318%2055.5894046,152.672022%2056.0901963,151.444448%20C56.5909282,150.216815%2056.8415633,148.901549%2056.8273268,147.575814%20L56.8273268,123.717444%20L63.9634889,123.717444%20L63.9634889,151.996025%20L63.8037763,152.209035%20Z%20M77.330762,136.653806%20C77.330762,131.70104%2077.330762,127.653648%2077.0112304,123.979032%20L83.4018876,123.979032%20L83.7213726,130.635931%20C85.1452074,128.23088%2087.1949721,126.257257%2089.6521533,124.925482%20C92.1093944,123.593709%2094.8819333,122.953703%2097.6742718,123.073695%20C107.153723,123.073695%20114.289945,131.008713%20114.289945,142.831393%20C114.289945,156.784292%20105.715831,163.707504%2096.4493898,163.707504%20C94.0776877,163.813321%2091.7187865,163.305232%2089.6009496,162.232346%20C87.4831127,161.159401%2085.6780613,159.558028%2084.3604623,157.583154%20L84.3604623,178.885226%20L77.330762,178.885226%20L77.330762,136.813578%20L77.330762,136.653806%20Z%20M84.3604623,147.038594%20C84.3797833,148.004885%2084.4867369,148.967408%2084.6800071,149.914378%20C85.2842232,152.279021%2086.6597255,154.374666%2088.5887785,155.869683%20C90.5178913,157.364761%2092.8904309,158.173852%2095.3310427,158.168947%20C102.840047,158.168947%20107.260258,152.044597%20107.260258,143.150938%20C107.260258,135.375686%20103.106354,128.718758%2095.59735,128.718758%20C92.6257387,128.962101%2089.844945,130.280974%2087.7762781,132.428062%20C85.7076111,134.575149%2084.4931374,137.403079%2084.3604623,140.381689%20L84.3604623,147.038594%20Z%20M127.004503,123.94359%20L135.578617,146.896647%20C136.483954,149.452886%20137.442529,152.54168%20138.081618,154.831671%20C138.827183,152.488442%20139.625985,149.506124%20140.58462,146.736875%20L148.359872,123.94359%20L155.868876,123.94359%20L145.21784,151.636343%20C139.892293,164.950152%20136.643726,171.820127%20131.744199,175.97403%20C129.27643,178.228071%20126.267791,179.805756%20123.010354,180.553953%20L121.252929,174.589376%20C123.530581,173.840999%20125.645092,172.666304%20127.48382,171.127799%20C130.081872,169.010501%20132.14366,166.310102%20133.501635,163.246013%20C133.792288,162.715372%20133.990404,162.139031%20134.087428,161.541814%20C134.026892,160.899135%20133.865146,160.270094%20133.60817,159.677902%20L119.122716,123.837079%20L126.897968,123.837079%20L127.004503,123.94359%20Z%20M174.813541,112.770851%20L174.813541,123.954441%20L185.038557,123.954441%20L185.038557,129.279989%20L174.813541,129.279989%20L174.813541,150.262575%20C174.813541,155.055568%20176.198196,157.824817%20180.139089,157.824817%20C181.538758,157.847727%20182.935316,157.686579%20184.292992,157.345559%20L184.612537,162.671047%20C182.57671,163.376355%20180.428486,163.701283%20178.275118,163.629682%20C176.849069,163.718929%20175.420569,163.498622%20174.087657,162.983833%20C172.754744,162.469044%20171.549004,161.671976%20170.553103,160.647363%20C168.383883,157.745977%20167.394359,154.130491%20167.783854,150.528882%20L167.783854,129.226751%20L161.712742,129.226751%20L161.712742,123.901204%20L167.890329,123.901204%20L167.890329,114.421764%20L174.813541,112.770851%20Z%20M198.184399,144.647511%20C198.03988,146.453639%20198.289199,148.269577%20198.915189,149.969888%20C199.541179,151.670199%20200.528884,153.214267%20201.810114,154.495437%20C203.091285,155.776667%20204.635352,156.764373%20206.335664,157.390363%20C208.035975,158.016352%20209.851913,158.265672%20211.658041,158.121153%20C215.311153,158.202863%20218.940457,157.513288%20222.309077,156.097409%20L223.533958,161.422956%20C219.400274,163.12572%20214.955358,163.942168%20210.486396,163.819423%20C207.881107,163.997798%20205.268101,163.61054%20202.826592,162.684147%20C200.385023,161.757814%20198.172795,160.3143%20196.341489,158.452721%20C194.51022,156.591082%20193.103284,154.355345%20192.217196,151.898941%20C191.331104,149.442478%20190.986827,146.82349%20191.207978,144.221491%20C191.207978,132.505346%20198.184399,123.238905%20209.581059,123.238905%20C222.362314,123.238905%20225.557643,134.422495%20225.557643,141.558717%20C225.625954,142.658281%20225.625954,143.761016%20225.557643,144.860581%20L198.024687,144.860581%20L198.184399,144.647511%20Z%20M219.06051,139.322023%20C219.266043,137.898188%20219.163995,136.446897%20218.761184,135.065892%20C218.358433,133.684886%20217.664311,132.406228%20216.725656,131.316115%20C215.786941,130.226062%20214.625525,129.349856%20213.31959,128.746561%20C212.013656,128.143278%20210.59353,127.826939%20209.155039,127.818864%20C206.228949,128.030665%20203.487515,129.327603%20201.467959,131.455549%20C199.448402,133.583436%20198.296377,136.388874%20198.237697,139.322023%20L219.06051,139.322023%20Z%20M236.385366,136.053478%20C236.385366,131.473555%20236.385366,127.532637%20236.065834,123.911277%20L242.456492,123.911277%20L242.456492,131.526792%20L242.775977,131.526792%20C243.446769,129.176325%20244.83268,127.093027%20246.741335,125.566097%20C248.64999,124.039161%20250.986699,123.144369%20253.427072,123.005938%20C254.098762,122.917777%20254.779066,122.917777%20255.450756,123.005938%20L255.450756,129.66288%20C254.63688,129.568608%20253.814868,129.568608%20253.000992,129.66288%20C250.58353,129.756495%20248.282771,130.726973%20246.528505,132.393068%20C244.774238,134.059104%20243.686458,136.306745%20243.468304,138.716252%20C243.269171,139.805946%20243.162278,140.910475%20243.148819,142.018055%20L243.148819,162.734394%20L236.11909,162.734394%20L236.11909,136.106715%20L236.385366,136.053478%20Z'%20fill='%234E4E4E'%3e%3c/path%3e%3cpath%20d='M233.257943,16.9621357%20C233.476636,20.5398773%20232.625434,24.1017075%20230.812666,27.1939108%20C228.999898,30.286174%20226.307754,32.7687777%20223.079047,34.3255867%20C219.85034,35.8823358%20216.231324,36.4427655%20212.683013,35.9355136%20C209.134702,35.4282017%20205.817704,33.8761781%20203.154559,31.4770796%20C200.491421,29.0780409%20198.602703,25.9404959%20197.729013,22.4642047%20C196.855323,18.9879135%20197.036209,15.330196%20198.248625,11.9570899%20C199.461041,8.5839838%20201.650109,5.64808944%20204.536953,3.52346926%20C207.423803,1.39884909%20210.877782,0.181657262%20214.458814,0.0269503701%20C216.806708,-0.10224713%20219.156996,0.233972409%20221.374429,1.01627461%20C223.591922,1.79857323%20225.632893,3.01152758%20227.379981,4.58537259%20C229.12701,6.15922358%20230.54576,8.06291398%20231.554522,10.1869719%20C232.563283,12.3110298%20233.142196,14.6135829%20233.257943,16.9621357%20Z'%20fill='%23767677'%3e%3c/path%3e%3cpath%20d='M127.952969,225.540984%20C80.0236372,225.540984%2037.8984531,208.339518%2016.1170646,182.936721%20C24.5683135,205.78944%2039.8176362,225.504615%2059.8124569,239.428562%20C79.8070981,253.352629%20103.588124,260.816651%20127.952969,260.816651%20C152.318411,260.816651%20176.098839,253.352629%20196.094019,239.428562%20C216.0886,225.504615%20231.337863,205.78944%20239.789471,182.936721%20C218.061379,208.339518%20176.095848,225.540984%20127.952969,225.540984%20Z'%20fill='%23F37726'%3e%3c/path%3e%3cpath%20d='M127.952969,60.3543133%20C175.882898,60.3543133%20218.008142,77.5557785%20239.789471,102.958396%20C231.337863,80.1058563%20216.0886,60.3906823%20196.094019,46.4667348%20C176.098839,32.5427873%20152.318411,25.0784666%20127.952969,25.0784666%20C103.588124,25.0784666%2079.8070981,32.5427873%2059.8124569,46.4667348%20C39.8176362,60.3906823%2024.5683135,80.1058563%2016.1170646,102.958396%20C37.8984531,77.502541%2079.8106871,60.3543133%20127.952969,60.3543133%20Z'%20fill='%23F37726'%3e%3c/path%3e%3cpath%20d='M61.9716874,274.975202%20C62.2528294,279.48161%2061.186045,283.969713%2058.9072992,287.867658%20C56.6284936,291.765602%2053.2409116,294.896926%2049.1761363,296.862707%20C45.1113611,298.828488%2040.5533909,299.539717%2036.0829934,298.905772%20C31.6125362,298.271767%2027.4320141,296.321359%2024.0740419,293.30297%20C20.7160636,290.284582%2018.3326671,286.334835%2017.2274978,281.957035%20C16.1223339,277.579176%2016.3454363,272.971497%2017.868382,268.720869%20C19.3913284,264.470301%2022.1451683,260.769335%2025.7790187,258.089483%20C29.4129289,255.40962%2033.7623156,253.872201%2038.2730898,253.673106%20C41.2280121,253.515051%2044.1851476,253.940738%2046.9755719,254.925846%20C49.7659364,255.910962%2052.3349165,257.436187%2054.5356604,259.414404%20C56.7364042,261.392633%2058.5259031,263.785032%2059.8017495,266.455044%20C61.0776558,269.124996%2061.8150255,272.02022%2061.9716874,274.975202%20Z'%20fill='%239E9E9E'%3e%3c/path%3e%3cpath%20d='M21.5641016,54.5650606%20C18.9814831,54.6363631%2016.4354131,53.9424806%2014.2460944,52.570687%20C12.0567996,51.1988336%2010.3219858,49.2102622%209.25983722,46.8551295%20C8.19768984,44.499937%207.85562972,41.8832824%208.276674,39.3342215%20C8.69771827,36.7851606%209.86306631,34.4174662%2011.6261678,32.5289814%20C13.3892752,30.6404727%2015.6714246,29.3154324%2018.1856119,28.7204982%20C20.6997394,28.1255646%2023.3336813,28.2873008%2025.7562282,29.1853653%20C28.1787154,30.0834346%2030.2815979,31.6777312%2031.800363,33.767765%20C33.3191879,35.8578106%2034.1861222,38.3502842%2034.2921188,40.9317063%20C34.3930308,44.4222341%2033.113057,47.8117302%2030.7300493,50.3642007%20C28.3470417,52.916731%2025.0533134,54.4262842%2021.5641016,54.5650606%20Z'%20fill='%23616262'%3e%3c/path%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='4'%20y='3'%20width='16'%20height='11'%20rx='1.25'%20ry='1.25'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3crect%20x='4'%20y='16'%20width='16'%20height='5'%20rx='1.25'%20ry='1.25'%20fill='%232563eb'%20fill-opacity='0.2'%20stroke='%232563eb'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='8'%20y='4'%20width='8'%20height='8'%20rx='1.25'%20ry='1.25'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3cline%20x1='2.5'%20y1='2'%20x2='2.5'%20y2='22'%20stroke='%232563eb'%20stroke-width='2'%20stroke-linecap='round'/%3e%3cline%20x1='21.5'%20y1='2'%20x2='21.5'%20y2='22'%20stroke='%232563eb'%20stroke-width='2'%20stroke-linecap='round'/%3e%3cline%20x1='6'%20y1='20'%20x2='18'%20y2='20'%20stroke='%232563eb'%20stroke-width='2'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='8'%20y='4'%20width='12'%20height='16'%20rx='1.25'%20ry='1.25'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3crect%20x='2'%20y='4'%20width='5'%20height='7'%20rx='1'%20ry='1'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3crect%20x='2'%20y='13'%20width='5'%20height='7'%20rx='1'%20ry='1'%20fill='%232563eb'%20fill-opacity='0.2'%20stroke='%232563eb'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='7'%20y='4'%20width='13'%20height='16'%20rx='1.25'%20ry='1.25'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3cline%20x1='2.5'%20y1='2'%20x2='2.5'%20y2='22'%20stroke='%232563eb'%20stroke-width='2'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='4'%20y='4'%20width='12'%20height='16'%20rx='1.25'%20ry='1.25'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3crect%20x='17'%20y='4'%20width='5'%20height='7'%20rx='1'%20ry='1'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3crect%20x='17'%20y='13'%20width='5'%20height='7'%20rx='1'%20ry='1'%20fill='%232563eb'%20fill-opacity='0.2'%20stroke='%232563eb'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3crect%20x='4'%20y='4'%20width='13'%20height='16'%20rx='1.25'%20ry='1.25'%20fill='none'%20stroke='%239ca3af'%20stroke-width='1.25'%20stroke-linejoin='round'/%3e%3cline%20x1='21.5'%20y1='2'%20x2='21.5'%20y2='22'%20stroke='%232563eb'%20stroke-width='2'%20stroke-linecap='round'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2016%2016'%20width='16'%20height='16'%3e%3cpath%20fill-rule='evenodd'%20d='M8%200C3.58%200%200%203.58%200%208c0%203.54%202.29%206.53%205.47%207.59.4.07.55-.17.55-.38%200-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01%201.08.58%201.23.82.72%201.21%201.87.87%202.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95%200-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12%200%200%20.67-.21%202.2.82.64-.18%201.32-.27%202-.27.68%200%201.36.09%202%20.27%201.53-1.04%202.2-.82%202.2-.82.44%201.1.16%201.92.08%202.12.51.56.82%201.27.82%202.15%200%203.07-1.87%203.75-3.65%203.95.29.25.54.73.54%201.48%200%201.07-.01%201.93-.01%202.2%200%20.21.15.46.55.38A8.013%208.013%200%200016%208c0-4.42-3.58-8-8-8z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20width='800px'%20height='800px'%20viewBox='0%200%2032%2032'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M13.0164%202C10.8193%202%209.03825%203.72453%209.03825%205.85185V8.51852H15.9235V9.25926H5.97814C3.78107%209.25926%202%2010.9838%202%2013.1111L2%2018.8889C2%2021.0162%203.78107%2022.7407%205.97814%2022.7407H8.27322V19.4815C8.27322%2017.3542%2010.0543%2015.6296%2012.2514%2015.6296H19.5956C21.4547%2015.6296%2022.9617%2014.1704%2022.9617%2012.3704V5.85185C22.9617%203.72453%2021.1807%202%2018.9836%202H13.0164ZM12.0984%206.74074C12.8589%206.74074%2013.4754%206.14378%2013.4754%205.40741C13.4754%204.67103%2012.8589%204.07407%2012.0984%204.07407C11.3378%204.07407%2010.7213%204.67103%2010.7213%205.40741C10.7213%206.14378%2011.3378%206.74074%2012.0984%206.74074Z'%20fill='url(%23paint0_linear_87_8204)'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M18.9834%2030C21.1805%2030%2022.9616%2028.2755%2022.9616%2026.1482V23.4815L16.0763%2023.4815L16.0763%2022.7408L26.0217%2022.7408C28.2188%2022.7408%2029.9998%2021.0162%2029.9998%2018.8889V13.1111C29.9998%2010.9838%2028.2188%209.25928%2026.0217%209.25928L23.7266%209.25928V12.5185C23.7266%2014.6459%2021.9455%2016.3704%2019.7485%2016.3704L12.4042%2016.3704C10.5451%2016.3704%209.03809%2017.8296%209.03809%2019.6296L9.03809%2026.1482C9.03809%2028.2755%2010.8192%2030%2013.0162%2030H18.9834ZM19.9015%2025.2593C19.1409%2025.2593%2018.5244%2025.8562%2018.5244%2026.5926C18.5244%2027.329%2019.1409%2027.9259%2019.9015%2027.9259C20.662%2027.9259%2021.2785%2027.329%2021.2785%2026.5926C21.2785%2025.8562%2020.662%2025.2593%2019.9015%2025.2593Z'%20fill='url(%23paint1_linear_87_8204)'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_87_8204'%20x1='12.4809'%20y1='2'%20x2='12.4809'%20y2='22.7407'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23327EBD'/%3e%3cstop%20offset='1'%20stop-color='%231565A7'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint1_linear_87_8204'%20x1='19.519'%20y1='9.25928'%20x2='19.519'%20y2='30'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23FFDA4B'/%3e%3cstop%20offset='1'%20stop-color='%23F9C600'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20aria-hidden='true'%3e%3cline%20x1='1.5'%20y1='5.5'%20x2='22.5'%20y2='5.5'%20stroke='var(--wa-color-brand-fill-loud)'%20stroke-opacity='0.45'%20stroke-width='2.5'%20stroke-linecap='round'/%3e%3cline%20x1='1.5'%20y1='12'%20x2='22.5'%20y2='12'%20stroke='var(--wa-color-brand-fill-loud)'%20stroke-opacity='0.45'%20stroke-width='2.5'%20stroke-linecap='round'/%3e%3cline%20x1='1.5'%20y1='18.5'%20x2='22.5'%20y2='18.5'%20stroke='var(--wa-color-brand-fill-loud)'%20stroke-opacity='0.45'%20stroke-width='2.5'%20stroke-linecap='round'/%3e%3ccircle%20cx='16.75'%20cy='5.5'%20r='3.5'%20fill='var(--wa-color-success-fill-loud)'%20fill-opacity='0.85'%20stroke='var(--wa-color-success-fill-loud)'%20stroke-opacity='1'%20stroke-width='1'/%3e%3ccircle%20cx='7.25'%20cy='12'%20r='3.5'%20fill='var(--wa-color-success-fill-loud)'%20fill-opacity='0.85'%20stroke='var(--wa-color-success-fill-loud)'%20stroke-opacity='1'%20stroke-width='1'/%3e%3ccircle%20cx='14.25'%20cy='18.5'%20r='3.5'%20fill='var(--wa-color-success-fill-loud)'%20fill-opacity='0.85'%20stroke='var(--wa-color-success-fill-loud)'%20stroke-opacity='1'%20stroke-width='1'/%3e%3c/svg%3e\"","// unfortunately, webawesome has no all-in-one import, so we need to import each component individually\nimport '@awesome.me/webawesome/dist/components/accordion/accordion.js';\nimport '@awesome.me/webawesome/dist/components/accordion-item/accordion-item.js';\nimport '@awesome.me/webawesome/dist/components/animated-image/animated-image.js';\nimport '@awesome.me/webawesome/dist/components/animation/animation.js';\nimport '@awesome.me/webawesome/dist/components/avatar/avatar.js';\nimport '@awesome.me/webawesome/dist/components/badge/badge.js';\nimport '@awesome.me/webawesome/dist/components/breadcrumb/breadcrumb.js';\nimport '@awesome.me/webawesome/dist/components/breadcrumb-item/breadcrumb-item.js';\nimport '@awesome.me/webawesome/dist/components/button/button.js';\nimport '@awesome.me/webawesome/dist/components/button-group/button-group.js';\nimport '@awesome.me/webawesome/dist/components/callout/callout.js';\nimport '@awesome.me/webawesome/dist/components/card/card.js';\nimport '@awesome.me/webawesome/dist/components/carousel/carousel.js';\nimport '@awesome.me/webawesome/dist/components/carousel-item/carousel-item.js';\nimport '@awesome.me/webawesome/dist/components/checkbox/checkbox.js';\nimport '@awesome.me/webawesome/dist/components/checkbox-group/checkbox-group.js';\nimport '@awesome.me/webawesome/dist/components/color-picker/color-picker.js';\nimport '@awesome.me/webawesome/dist/components/comparison/comparison.js';\nimport '@awesome.me/webawesome/dist/components/copy-button/copy-button.js';\nimport '@awesome.me/webawesome/dist/components/details/details.js';\nimport '@awesome.me/webawesome/dist/components/dialog/dialog.js';\nimport '@awesome.me/webawesome/dist/components/divider/divider.js';\nimport '@awesome.me/webawesome/dist/components/drawer/drawer.js';\nimport '@awesome.me/webawesome/dist/components/dropdown/dropdown.js';\nimport '@awesome.me/webawesome/dist/components/dropdown-item/dropdown-item.js';\nimport '@awesome.me/webawesome/dist/components/format-bytes/format-bytes.js';\nimport '@awesome.me/webawesome/dist/components/format-date/format-date.js';\nimport '@awesome.me/webawesome/dist/components/format-number/format-number.js';\nimport '@awesome.me/webawesome/dist/components/icon/icon.js';\nimport '@awesome.me/webawesome/dist/components/include/include.js';\nimport '@awesome.me/webawesome/dist/components/input/input.js';\nimport '@awesome.me/webawesome/dist/components/intersection-observer/intersection-observer.js';\nimport '@awesome.me/webawesome/dist/components/known-date/known-date.js';\nimport '@awesome.me/webawesome/dist/components/markdown/markdown.js';\nimport '@awesome.me/webawesome/dist/components/mutation-observer/mutation-observer.js';\nimport '@awesome.me/webawesome/dist/components/number-input/number-input.js';\nimport '@awesome.me/webawesome/dist/components/option/option.js';\nimport '@awesome.me/webawesome/dist/components/otp-input/otp-input.js';\nimport '@awesome.me/webawesome/dist/components/page/page.js';\nimport '@awesome.me/webawesome/dist/components/pagination/pagination.js';\nimport '@awesome.me/webawesome/dist/components/popover/popover.js';\nimport '@awesome.me/webawesome/dist/components/popup/popup.js';\nimport '@awesome.me/webawesome/dist/components/progress-bar/progress-bar.js';\nimport '@awesome.me/webawesome/dist/components/progress-ring/progress-ring.js';\nimport '@awesome.me/webawesome/dist/components/qr-code/qr-code.js';\nimport '@awesome.me/webawesome/dist/components/radio/radio.js';\nimport '@awesome.me/webawesome/dist/components/radio-group/radio-group.js';\nimport '@awesome.me/webawesome/dist/components/rating/rating.js';\nimport '@awesome.me/webawesome/dist/components/random-content/random-content.js';\nimport '@awesome.me/webawesome/dist/components/relative-time/relative-time.js';\nimport '@awesome.me/webawesome/dist/components/resize-observer/resize-observer.js';\nimport '@awesome.me/webawesome/dist/components/scroller/scroller.js';\nimport '@awesome.me/webawesome/dist/components/select/select.js';\nimport '@awesome.me/webawesome/dist/components/skeleton/skeleton.js';\nimport '@awesome.me/webawesome/dist/components/slider/slider.js';\nimport '@awesome.me/webawesome/dist/components/spinner/spinner.js';\nimport '@awesome.me/webawesome/dist/components/split-panel/split-panel.js';\nimport '@awesome.me/webawesome/dist/components/switch/switch.js';\nimport '@awesome.me/webawesome/dist/components/tab/tab.js';\nimport '@awesome.me/webawesome/dist/components/tab-group/tab-group.js';\nimport '@awesome.me/webawesome/dist/components/tab-panel/tab-panel.js';\nimport '@awesome.me/webawesome/dist/components/tag/tag.js';\nimport '@awesome.me/webawesome/dist/components/textarea/textarea.js';\nimport '@awesome.me/webawesome/dist/components/time-input/time-input.js';\nimport '@awesome.me/webawesome/dist/components/toast/toast.js';\nimport '@awesome.me/webawesome/dist/components/toast-item/toast-item.js';\nimport '@awesome.me/webawesome/dist/components/tooltip/tooltip.js';\nimport '@awesome.me/webawesome/dist/components/tree/tree.js';\nimport '@awesome.me/webawesome/dist/components/tree-item/tree-item.js';\nimport '@awesome.me/webawesome/dist/components/zoomable-frame/zoomable-frame.js';\n\n// Import default WebAwesome styles\nimport '@awesome.me/webawesome/dist/styles/native.css';\nimport '@awesome.me/webawesome/dist/styles/utilities.css';\nimport '@awesome.me/webawesome/dist/styles/themes/default.css';\n\nimport {registerIconLibrary} from '@awesome.me/webawesome'\n\nregisterIconLibrary('docks', {\n resolver: (name: string) => {\n return new URL(`../icons/${name}.svg`, import.meta.url).href;\n },\n mutator: (svg: SVGElement) => {\n svg.setAttribute('fill', 'currentColor');\n svg.setAttribute('stroke', 'currentColor');\n }\n});\n\nexport { registerIconLibrary };"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,qBAAe;;;ACAf,IAAA,oBAAe;;;ACAf,IAAA,aAAe;;;ACAf,IAAA,kBAAe;;;ACAf,IAAA,uCAAe;;;ACAf,IAAA,+BAAe;;;ACAf,IAAA,mCAAe;;;ACAf,IAAA,uCAAe;;;ACAf,IAAA,oCAAe;;;ACAf,IAAA,wCAAe;;;ACAf,IAAA,sBAAe;;;ACAf,IAAA,iBAAe;;;ACAf,IAAA,mBAAe;;;AC+Ef,oBAAoB,SAAS;CACzB,WAAW,SAAiB;EACxB,OAAO,IAAA,KAAA,uBAAA,OAAA;GAAA,2BAAAA;GAAA,0BAAAC;GAAA,mBAAAC;GAAA,wBAAAC;GAAA,6CAAAC;GAAA,qCAAAC;GAAA,yCAAAC;GAAA,6CAAAC;GAAA,0CAAAC;GAAA,8CAAAC;GAAA,4BAAAC;GAAA,uBAAAC;GAAA,yBAAAC;EAAA,CAAA,EAAA,CAAA,YAAA,KAAA,QAAA,YAAA,GAAA,CAAgD,CAAC;CAC5D;CACA,UAAU,QAAoB;EAC1B,IAAI,aAAa,QAAQ,cAAc;EACvC,IAAI,aAAa,UAAU,cAAc;CAC7C;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"widget-DUR6wxME.js","names":[],"sources":["../src/core/toast.ts","../src/core/contribution-mapping.ts","../src/core/contributionregistry.ts","../src/core/appstate.ts","../src/core/commandregistry.ts","../src/externals/wa-tree-shadow-parts.ts","../src/core/signals.ts","../src/widgets/widget.ts"],"sourcesContent":["import '@awesome.me/webawesome/dist/components/toast/toast.js';\nimport { createLogger } from './logger';\n\nconst logger = createLogger('Toast');\n\nconst DURATION = 4000;\n\ntype ToastVariant = 'brand' | 'danger' | 'warning';\n\ntype WaToastElement = HTMLElement & {\n placement: string;\n create(\n message: string,\n options?: {\n variant?: ToastVariant | 'neutral' | 'success';\n duration?: number;\n },\n ): Promise<HTMLElement>;\n};\n\nlet toastStack: WaToastElement | null = null;\n\nfunction getToastStack(): WaToastElement {\n if (!toastStack) {\n toastStack = document.createElement('wa-toast') as WaToastElement;\n toastStack.placement = 'bottom-end';\n document.body.append(toastStack);\n }\n return toastStack;\n}\n\nconst show = (msg: string, variant: ToastVariant) => {\n if (typeof document === 'undefined' || !document.body) return;\n void getToastStack().create(msg, { variant, duration: DURATION });\n};\n\nexport const toastInfo = (msg: string) => {\n logger.info(msg);\n show(msg, 'brand');\n};\n\nexport const toastError = (msg: string) => {\n logger.error(msg);\n show(msg, 'danger');\n};\n\nexport const toastWarning = (msg: string) => {\n logger.warn(msg);\n show(msg, 'warning');\n};\n","import { rootContext } from \"./di\";\nimport type { Contribution } from \"./contributionregistry\";\n\nexport interface ContributionNameRemap {\n /**\n * Globally unique, namespaced contribution name\n * (e.g. \"view.filebrowser\", \"toolbar.filebrowser.rename\").\n */\n name: string;\n /**\n * Effective target slots for this contribution.\n * If empty, the original target is used.\n */\n targets: string[];\n}\n\ninterface NameRemapState {\n appTargets: string[] | undefined;\n globalTargets: string[] | undefined;\n}\n\n/**\n * Registry responsible for resolving effective contribution targets.\n *\n * It supports:\n * - Global (framework-level) remaps.\n * - App-level remaps coming from AppDefinition.\n * - Multiple targets per contribution.\n *\n * Resolution precedence:\n * app-level remap > global remap > original target\n */\nclass ContributionTargetMappingRegistry {\n private globalNameRemaps = new Map<string, string[]>();\n private appNameRemaps = new Map<string, string[]>();\n\n setGlobalNameRemap(name: string, targets: string[]): void {\n this.globalNameRemaps.set(name, this.normalizeTargets(targets));\n }\n\n /** Clears all remaps. For testing only. */\n resetForTesting(): void {\n this.globalNameRemaps.clear();\n this.appNameRemaps.clear();\n }\n\n applyAppNameRemaps(remaps: ContributionNameRemap[] | undefined | null): void {\n this.appNameRemaps.clear();\n if (!remaps) return;\n for (const remap of remaps) {\n this.appNameRemaps.set(remap.name, this.normalizeTargets(remap.targets));\n }\n }\n\n /**\n * Returns the effective target slots for a contribution given its original target.\n *\n * Semantics:\n * - When a remap exists with a non-empty targets array, those targets are used.\n * - When a remap exists with an empty targets array, the contribution is disabled (no targets).\n * - When no remap exists, the original target is used.\n */\n getEffectiveTargets(originalTarget: string, contribution: Contribution): string[] {\n const name = (contribution as any).name as string | undefined;\n if (!name) {\n return [originalTarget];\n }\n\n const appTargets = this.appNameRemaps.get(name);\n if (appTargets) {\n return appTargets.length > 0 ? appTargets : [];\n }\n\n const globalTargets = this.globalNameRemaps.get(name);\n if (globalTargets) {\n return globalTargets.length > 0 ? globalTargets : [];\n }\n\n return [originalTarget];\n }\n\n /**\n * Returns current mapping state for debugging and tooling.\n */\n listNameRemaps(): Record<string, NameRemapState> {\n const result: Record<string, NameRemapState> = {};\n const allNames = new Set<string>([\n ...this.globalNameRemaps.keys(),\n ...this.appNameRemaps.keys()\n ]);\n for (const name of allNames) {\n result[name] = {\n appTargets: this.appNameRemaps.get(name),\n globalTargets: this.globalNameRemaps.get(name)\n };\n }\n return result;\n }\n\n private normalizeTargets(targets: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const t of targets) {\n if (!t || seen.has(t)) continue;\n seen.add(t);\n result.push(t);\n }\n return result;\n }\n}\n\nexport const contributionTargetMappingRegistry = new ContributionTargetMappingRegistry();\nrootContext.put(\"contributionTargetMappingRegistry\", contributionTargetMappingRegistry);\n\n/**\n * Public helper to override contribution targets programmatically.\n * This sets a global remap that applies across all apps.\n */\nexport function overrideContributionTargets(name: string, targets: string | string[]): void {\n const normalized = Array.isArray(targets) ? targets : [targets];\n contributionTargetMappingRegistry.setGlobalNameRemap(name, normalized);\n}\n\n/**\n * Apply config-driven name remaps from a simple object.\n * Intended for hosts that want to load JSON/YAML mapping files.\n */\nexport function applyConfigNameRemaps(config: Record<string, string | string[]>): void {\n for (const [name, targets] of Object.entries(config)) {\n const normalized = Array.isArray(targets) ? targets : [targets];\n contributionTargetMappingRegistry.setGlobalNameRemap(name, normalized);\n }\n}\n\n/**\n * Convenience helper for debugging: returns current remap state\n * for all known contribution names.\n */\nexport function listContributionNameRemaps(): Record<string, NameRemapState> {\n return contributionTargetMappingRegistry.listNameRemaps();\n}\n\n","import { Signal } from \"@lit-labs/signals\";\nimport { TemplateResult } from \"lit\";\nimport { publish } from \"./events\";\nimport { rootContext } from \"./di\";\nimport { contributionTargetMappingRegistry } from \"./contribution-mapping\";\n\nexport const TOPIC_CONTRIBUTEIONS_CHANGED = \"events/contributionregistry/contributionsChanged\"\n\nexport interface ContributionChangeEvent {\n target: string;\n contributions: Contribution[];\n}\n\nexport interface Contribution {\n /** Optional globally unique, namespaced contribution name (e.g. \"view.filebrowser\"). */\n name?: string;\n target?: string;\n label: string;\n /** When true, UI may show `label` alongside the icon (e.g. toolbar). Honored where supported in UI. */\n showLabel?: boolean;\n icon?: string;\n slot?: string;\n /**\n * Higher ranking appears first in `getContributions`. Defaults to 0.\n * Equal ranks keep registration order.\n */\n ranking?: number;\n disabled?: (() => boolean) | Signal.Computed<boolean>;\n /** When false, the contribution is not rendered (default: shown). Honored where supported in UI. */\n visible?: (() => boolean) | Signal.Computed<boolean>;\n}\n\nexport interface CommandContribution extends Contribution {\n command: string;\n params?: Record<string, any>;\n}\n\nexport function isCommandContribution(contribution: Contribution): contribution is CommandContribution {\n return \"command\" in contribution;\n}\n\nexport type ReactiveBoolean = boolean | (() => boolean) | Signal.Computed<boolean>;\n\n/** Reads a static or reactive boolean; plain functions and {@link Signal.Computed} are evaluated at call time. */\nexport function readReactiveBoolean(\n value: ReactiveBoolean | undefined,\n defaultValue: boolean\n): boolean {\n if (value === undefined) return defaultValue;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'object' && value !== null && 'get' in value) {\n return (value as Signal.Computed<boolean>).get() === true;\n }\n if (typeof value === 'function') {\n return (value as () => boolean)() === true;\n }\n return defaultValue;\n}\n\n/** Default true when `visible` is omitted. */\nexport function getContributionVisible(contribution: Contribution): boolean {\n const visible = contribution.visible as Signal.Computed<boolean> | undefined;\n if (!visible) return true;\n return visible.get() !== false;\n}\n\n/** Default false when `disabled` is omitted. */\nexport function getContributionDisabled(contribution: Contribution): boolean {\n return readReactiveBoolean(contribution.disabled as ReactiveBoolean | undefined, false);\n}\n\nfunction wrapContributionReactiveFlags(contribution: Contribution): void {\n if (contribution.disabled instanceof Function) {\n contribution.disabled = new Signal.Computed<boolean>(contribution.disabled);\n }\n if (contribution.visible instanceof Function) {\n contribution.visible = new Signal.Computed<boolean>(contribution.visible);\n }\n}\n\nexport interface HTMLContribution extends Contribution {\n component: string | (() => TemplateResult)\n}\n\nexport interface TabContribution extends Contribution {\n name: string;\n /**\n * Stable editor-type identifier used for contribution targets (for example `toolbar:${editorId}`).\n * Needed because `name` is often tab-instance specific (such as file/path based) and would\n * fragment toolbar contributions across many dynamic targets.\n */\n editorId?: string;\n closable?: boolean;\n /** When true or omitted, a docks-toolbar is rendered for this tab; when false, no toolbar is shown. */\n toolbar?: boolean;\n /** When true or omitted, a contextmenu is rendered for this tab; when false, no context menu is shown. */\n contextMenu?: boolean;\n /**\n * Main-area editor type ids (`TabContribution.editorId` of the editor tab) that should reveal this tab\n * when any of them becomes the active editor in the main editor area. Omitted or empty = no auto-reveal.\n */\n coupledEditors?: string[];\n /** Return false to cancel tab close (after dirty-tab prompt, if any). */\n beforeClose?: () => boolean | Promise<boolean>;\n component?: (id: string) => TemplateResult;\n}\n\nexport interface IconContribution extends Contribution {\n mappings: Record<string, string>;\n priority?: number;\n}\n\nexport interface LayoutContribution extends Contribution {\n id: string;\n name: string;\n /** Optional icon name (e.g. Font Awesome) for the layout switcher. */\n icon?: string;\n component: string | { tag: string; attributes?: Record<string, string> } | (() => TemplateResult);\n onShow?: () => void | Promise<void>;\n}\n\nclass ContributionRegistry {\n private contributions: Map<string, Contribution[]> = new Map();\n\n registerContribution<T extends Contribution>(target: string, contribution: T) {\n const targetSlot = this.getOrCreateSlot(target);\n wrapContributionReactiveFlags(contribution);\n targetSlot.push(contribution);\n publish(TOPIC_CONTRIBUTEIONS_CHANGED, { target, contributions: targetSlot } as ContributionChangeEvent);\n\n const effectiveTargets = contributionTargetMappingRegistry.getEffectiveTargets(target, contribution);\n for (const effectiveTarget of effectiveTargets) {\n if (effectiveTarget === target) continue;\n const contributionsForSlot = this.getContributions(effectiveTarget);\n publish(TOPIC_CONTRIBUTEIONS_CHANGED, { target: effectiveTarget, contributions: contributionsForSlot } as ContributionChangeEvent);\n }\n }\n\n /**\n * Returns all contributions whose *effective* targets include the given slot.\n *\n * Note: This currently scans all registered contributions and resolves\n * remaps on each call (O(N) in number of contributions). This is acceptable\n * for typical Docks apps (dozens/hundreds of contributions and few slots),\n * but if contribution counts grow significantly we may want to introduce a\n * cached index of effective targets per slot to keep lookups O(1).\n */\n getContributions<T extends Contribution>(target: string): T[] {\n const results: T[] = [];\n for (const [originalTarget, list] of this.contributions.entries()) {\n const typedList = list as T[];\n for (const contribution of typedList) {\n const effectiveTargets = contributionTargetMappingRegistry.getEffectiveTargets(originalTarget, contribution);\n if (effectiveTargets.includes(target)) {\n results.push(contribution);\n }\n }\n }\n results.sort((a, b) => (b.ranking ?? 0) - (a.ranking ?? 0));\n if (results.length === 0) {\n this.getOrCreateSlot(target);\n }\n return results;\n }\n\n private getOrCreateSlot(target: string): Contribution[] {\n if (!this.contributions.has(target)) {\n this.contributions.set(target, []);\n }\n return this.contributions.get(target)!;\n }\n}\n\nexport const contributionRegistry = new ContributionRegistry()\nrootContext.put(\"contributionRegistry\", contributionRegistry)","import { signal } from '@lit-labs/signals';\nimport { DocksPart } from \"../parts/part\";\n\nexport const EMPTY_SIGNALPORT = {} as any\n\nexport const activePartSignal = signal<DocksPart>(null as unknown as DocksPart)\nexport const activeEditorSignal = signal<DocksPart>(null as unknown as DocksPart)\n\nexport const partDirtySignal = signal<DocksPart>(null as unknown as DocksPart)\n\nexport const activeTasksSignal = signal<number>(0)\n\nexport const activeSelectionSignal = signal<any>(undefined)\n\nexport const perspectiveSwitchedSignal = signal<{name: string, timestamp: number}>({name: '', timestamp: 0})","import logger from \"./logger\";\nimport { publish } from \"./events\";\nimport { CommandContribution, contributionRegistry } from \"./contributionregistry\";\nimport { rootContext } from \"./di\";\nimport { activePartSignal, activeEditorSignal } from \"./appstate\";\n\nexport const TOPIC_COMMAND_REGISTERED = \"events/commandregistry/commandRegistered\";\n\nexport interface Parameter {\n name: string;\n description: string;\n type?: string;\n required: boolean;\n allowedValues?: string[];\n}\n\nexport interface Variable {\n name: string;\n description: string;\n type?: string;\n}\n\nexport interface LLMOptions {\n prompt?: string;\n model?: string;\n}\n\nexport class Command {\n id: string;\n name: string;\n description: string;\n icon?: string;\n keyBinding?: string;\n parameters?: Parameter[];\n output?: Variable[];\n llm?: LLMOptions;\n\n constructor(id: string, name: string, description: string, parameters?: Parameter[], output?: Variable[]) {\n this.id = id;\n this.name = name;\n this.description = description;\n this.parameters = parameters || [];\n this.output = output || [];\n }\n}\n\nexport interface ExecutionContext {\n [key: string]: any;\n\n params?: ExecuteParams;\n activePart?: any;\n activeEditor?: any;\n}\n\nexport interface ExecuteParams {\n [key: string]: any;\n}\n\nexport interface Handler {\n canExecute?: (context: ExecutionContext) => boolean;\n execute: (context: ExecutionContext) => any | Promise<any>;\n ranking?: number; // Higher ranking = higher priority (default: 0)\n}\n\nexport interface Commands {\n [commandId: string]: Command\n}\n\nfunction formatCommandResultForLog(value: unknown): string {\n if (value === undefined) {\n return \"undefined\";\n }\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"string\") {\n return value.length > 300 ? `${value.slice(0, 300)}…` : value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n try {\n const s = JSON.stringify(value);\n return s.length > 300 ? `${s.slice(0, 300)}…` : s;\n } catch {\n return String(value);\n }\n}\n\nexport class CommandStack {\n //private stack: any[] = []\n\n public async execute(commandId: any, context: ExecutionContext) {\n return commandRegistry.execute(commandId, context);\n }\n\n public async undo() {\n // TODO undo last command on stack\n }\n\n public async redo() {\n // TODO redo last command on stack\n }\n}\n\nexport class CommandRegistry {\n private commands: Commands = {};\n private handlers: Map<string, Handler[]> = new Map();\n\n registerHandler(commandId: string, handler: Handler) {\n if (!this.handlers.has(commandId)) {\n this.handlers.set(commandId, []);\n }\n const handlerList = this.handlers.get(commandId) as Handler[];\n handlerList.push(handler);\n // Sort by ranking (higher ranking first), default ranking is 0\n handlerList.sort((a, b) => (b.ranking ?? 0) - (a.ranking ?? 0));\n }\n\n getHandler(commandId: string): Handler[] | undefined {\n return this.handlers.get(commandId)\n }\n\n /**\n * Creates an ExecutionContext with the current application state\n * \n * @param params Optional command parameters\n * @returns ExecutionContext with captured application state\n */\n createExecutionContext(params?: ExecuteParams): ExecutionContext {\n const context: ExecutionContext = {\n params: params || {},\n activePart: activePartSignal.get(),\n activeEditor: activeEditorSignal.get()\n };\n\n return context;\n }\n\n async execute(commandId: string, context: ExecutionContext = {}) {\n const handlers = this.getHandler(commandId);\n\n if (!handlers) {\n logger.debug(`[CommandRegistry] No handlers registered for command: ${commandId}`);\n throw new Error(`No handlers registered for command: ${commandId}`);\n }\n\n const command = this.getCommand(commandId);\n const paramsStr = context.params ? ` params: ${JSON.stringify(context.params)}` : '';\n logger.debug(`[CommandRegistry] Executing command: ${commandId}${command ? ` (${command.name})` : ''}${paramsStr}`);\n\n // Handlers are already sorted by ranking, so iterate in order\n for (const handler of handlers) {\n if (handler.canExecute === undefined || handler.canExecute(context)) {\n try {\n const raw = handler.execute(context);\n const result = await Promise.resolve(raw);\n logger.debug(\n `[CommandRegistry] Command executed successfully: ${commandId} (result: ${formatCommandResultForLog(result)})`,\n );\n return result;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(`[CommandRegistry] Command execution failed: ${commandId} - ${errorMsg}`);\n throw error;\n }\n }\n }\n logger.error(`[CommandRegistry] No handler found to execute command: ${commandId}`);\n }\n\n createAndRegisterCommand(id: string, name: string, description: string, parameters: Parameter[], handler?: Handler) {\n const command = new Command(id, name, description, parameters);\n this.registerCommand(command)\n if (handler) {\n this.registerHandler(id, handler)\n }\n }\n\n registerCommand(command: Command): void {\n this.commands[command.id] = command;\n publish(TOPIC_COMMAND_REGISTERED, command);\n }\n\n hasCommand(commandId: string): boolean {\n return commandId in this.commands\n }\n\n listCommands(context?: ExecutionContext): Commands {\n if (context) {\n // filter by commands which have at least one executable handler\n return Object.values(this.commands).filter(command => {\n const handlers = commandRegistry.getHandler(command.id) || []\n return handlers.some(handler => handler.canExecute === undefined || handler.canExecute(context))\n }).reduce((acc: any, command) => {\n acc[command.id] = command\n return acc\n }, {})\n }\n return this.commands\n }\n\n getCommand(commandId: string): Command {\n return <Command>this.commands[commandId]\n }\n\n registerAll(options: RegisterOptions) {\n const commandId = options.command.id\n this.registerCommand(options.command)\n if (options.handler) {\n this.registerHandler(commandId, options.handler)\n }\n if (options.contribution && options.contribution.target) {\n contributionRegistry.registerContribution(options.contribution.target, {\n command: commandId,\n ...options.contribution\n } as CommandContribution)\n }\n }\n}\n\nexport const commandRegistry = new CommandRegistry();\nrootContext.put(\"commandRegistry\", commandRegistry);\n\nexport interface RegisterOptions {\n command: Command,\n handler?: Handler,\n contribution?: Omit<CommandContribution, 'command'>,\n}\n\nexport const registerAll = (options: RegisterOptions) => {\n commandRegistry.registerAll(options);\n}","import { css } from 'lit';\n\n/**\n * Stretch the Web Awesome label slot across the rest of the tree row.\n *\n * By default the slot is only as wide as its content, so clicks (and the context menu’s\n * synthetic click) in the empty area beside a short name often miss the slotted nodes.\n * `wa-tree` only updates selection when mousedown and click targets line up, so those\n * misses leave the wrong row selected. `flex: 1` makes the label column fill the row\n * so hits stay on the item’s content.\n *\n * Applied via `DocksWidget.finalizeStyles`: document-level CSS cannot target `::part()`\n * on `wa-tree-item` that lives only inside nested Lit shadow roots.\n */\nexport const waTreeLabelSlotStretch = css`\n wa-tree-item::part(label) {\n flex: 1;\n min-width: 0;\n }\n`;\n","import {Signal} from \"@lit-labs/signals\";\n\nexport const watchSignal = (signal: Signal.State<any> | Signal.Computed<any>, callback: (value: any) => void): (() => void) => {\n const watcher = new Signal.subtle.Watcher(async () => {\n try {\n await 0;\n callback(signal.get());\n } finally {\n watcher.watch(signal);\n }\n });\n watcher.watch(signal);\n signal.get();\n \n return () => {\n watcher.unwatch(signal);\n };\n}\n","import {LitElement, PropertyValues, type CSSResultGroup} from \"lit\";\nimport {waTreeLabelSlotStretch} from \"../externals/wa-tree-shadow-parts\";\nimport {subscribe as event_subscribe, unsubscribe as event_unsubscribe, type SubscriptionToken} from \"../core/events\";\nimport {toastError, toastInfo} from \"../core/toast\";\nimport {commandRegistry, ExecuteParams} from \"../core/commandregistry\";\nimport {Signal, SignalWatcher} from \"@lit-labs/signals\";\nimport {watchSignal} from \"../core/signals\";\n\nObject.defineProperty(LitElement.prototype, \"model\", {\n enumerable: true,\n configurable: true,\n writable: true\n});\n\nconst DocksWidgetBase = SignalWatcher(LitElement) as unknown as typeof LitElement;\n\nexport abstract class DocksWidget extends DocksWidgetBase {\n static finalizeStyles(styles?: CSSResultGroup) {\n return [waTreeLabelSlotStretch, ...super.finalizeStyles(styles)];\n }\n\n private signalCleanups = new Set<() => void>();\n private eventSubscriptions = new Set<SubscriptionToken>();\n\n connectedCallback() {\n super.connectedCallback();\n this.doBeforeUI()\n }\n\n disconnectedCallback() {\n this.doClose();\n super.disconnectedCallback();\n this.eventSubscriptions.forEach(token => event_unsubscribe(token));\n this.eventSubscriptions.clear();\n this.signalCleanups.forEach(cleanup => cleanup());\n this.signalCleanups.clear();\n }\n\n protected subscribe(topic: string, callback: Function): void {\n const token = event_subscribe(topic, callback.bind(this));\n this.eventSubscriptions.add(token);\n }\n\n protected showInfo(msg: string) {\n toastInfo(msg)\n }\n\n protected showError(msg: string) {\n toastError(msg)\n }\n\n protected nobubble(wrap: (event: Event) => void) {\n return (event: Event) => {\n event.stopPropagation();\n wrap.bind(this)(event);\n };\n }\n\n protected command(command: string, state: {} = {}) {\n return () => {\n void this.executeCommand(command, state);\n };\n }\n\n protected async executeCommand(command: string, params: ExecuteParams) {\n const execContext = commandRegistry.createExecutionContext(params);\n await commandRegistry.execute(command, execContext);\n }\n\n protected watch(signal: Signal.State<any> | Signal.Computed<any>, callback: (value: any) => void): void {\n const cleanup = watchSignal(signal as Signal.State<any>, callback.bind(this));\n this.signalCleanups.add(cleanup);\n }\n\n protected firstUpdated(_changedProperties: PropertyValues) {\n super.firstUpdated(_changedProperties);\n this.doInitUI()\n }\n\n protected updateIdle() {\n requestIdleCallback(() => this.requestUpdate())\n }\n\n public updateLater() {\n requestAnimationFrame(() => this.requestUpdate())\n }\n\n protected doBeforeUI() {\n }\n\n protected doInitUI() {\n }\n\n /**\n * Override to release resources when the element is disconnected (called from {@link disconnectedCallback}).\n */\n protected doClose() {\n }\n\n withRefresh(callback: () => void) {\n callback()\n this.updateLater()\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"widget-DUR6wxME.js","names":["event_unsubscribe","event_subscribe"],"sources":["../src/core/toast.ts","../src/core/contribution-mapping.ts","../src/core/contributionregistry.ts","../src/core/appstate.ts","../src/core/commandregistry.ts","../src/externals/wa-tree-shadow-parts.ts","../src/core/signals.ts","../src/widgets/widget.ts"],"sourcesContent":["import '@awesome.me/webawesome/dist/components/toast/toast.js';\nimport { createLogger } from './logger';\n\nconst logger = createLogger('Toast');\n\nconst DURATION = 4000;\n\ntype ToastVariant = 'brand' | 'danger' | 'warning';\n\ntype WaToastElement = HTMLElement & {\n placement: string;\n create(\n message: string,\n options?: {\n variant?: ToastVariant | 'neutral' | 'success';\n duration?: number;\n },\n ): Promise<HTMLElement>;\n};\n\nlet toastStack: WaToastElement | null = null;\n\nfunction getToastStack(): WaToastElement {\n if (!toastStack) {\n toastStack = document.createElement('wa-toast') as WaToastElement;\n toastStack.placement = 'bottom-end';\n document.body.append(toastStack);\n }\n return toastStack;\n}\n\nconst show = (msg: string, variant: ToastVariant) => {\n if (typeof document === 'undefined' || !document.body) return;\n void getToastStack().create(msg, { variant, duration: DURATION });\n};\n\nexport const toastInfo = (msg: string) => {\n logger.info(msg);\n show(msg, 'brand');\n};\n\nexport const toastError = (msg: string) => {\n logger.error(msg);\n show(msg, 'danger');\n};\n\nexport const toastWarning = (msg: string) => {\n logger.warn(msg);\n show(msg, 'warning');\n};\n","import { rootContext } from \"./di\";\nimport type { Contribution } from \"./contributionregistry\";\n\nexport interface ContributionNameRemap {\n /**\n * Globally unique, namespaced contribution name\n * (e.g. \"view.filebrowser\", \"toolbar.filebrowser.rename\").\n */\n name: string;\n /**\n * Effective target slots for this contribution.\n * If empty, the original target is used.\n */\n targets: string[];\n}\n\ninterface NameRemapState {\n appTargets: string[] | undefined;\n globalTargets: string[] | undefined;\n}\n\n/**\n * Registry responsible for resolving effective contribution targets.\n *\n * It supports:\n * - Global (framework-level) remaps.\n * - App-level remaps coming from AppDefinition.\n * - Multiple targets per contribution.\n *\n * Resolution precedence:\n * app-level remap > global remap > original target\n */\nclass ContributionTargetMappingRegistry {\n private globalNameRemaps = new Map<string, string[]>();\n private appNameRemaps = new Map<string, string[]>();\n\n setGlobalNameRemap(name: string, targets: string[]): void {\n this.globalNameRemaps.set(name, this.normalizeTargets(targets));\n }\n\n /** Clears all remaps. For testing only. */\n resetForTesting(): void {\n this.globalNameRemaps.clear();\n this.appNameRemaps.clear();\n }\n\n applyAppNameRemaps(remaps: ContributionNameRemap[] | undefined | null): void {\n this.appNameRemaps.clear();\n if (!remaps) return;\n for (const remap of remaps) {\n this.appNameRemaps.set(remap.name, this.normalizeTargets(remap.targets));\n }\n }\n\n /**\n * Returns the effective target slots for a contribution given its original target.\n *\n * Semantics:\n * - When a remap exists with a non-empty targets array, those targets are used.\n * - When a remap exists with an empty targets array, the contribution is disabled (no targets).\n * - When no remap exists, the original target is used.\n */\n getEffectiveTargets(originalTarget: string, contribution: Contribution): string[] {\n const name = (contribution as any).name as string | undefined;\n if (!name) {\n return [originalTarget];\n }\n\n const appTargets = this.appNameRemaps.get(name);\n if (appTargets) {\n return appTargets.length > 0 ? appTargets : [];\n }\n\n const globalTargets = this.globalNameRemaps.get(name);\n if (globalTargets) {\n return globalTargets.length > 0 ? globalTargets : [];\n }\n\n return [originalTarget];\n }\n\n /**\n * Returns current mapping state for debugging and tooling.\n */\n listNameRemaps(): Record<string, NameRemapState> {\n const result: Record<string, NameRemapState> = {};\n const allNames = new Set<string>([\n ...this.globalNameRemaps.keys(),\n ...this.appNameRemaps.keys()\n ]);\n for (const name of allNames) {\n result[name] = {\n appTargets: this.appNameRemaps.get(name),\n globalTargets: this.globalNameRemaps.get(name)\n };\n }\n return result;\n }\n\n private normalizeTargets(targets: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const t of targets) {\n if (!t || seen.has(t)) continue;\n seen.add(t);\n result.push(t);\n }\n return result;\n }\n}\n\nexport const contributionTargetMappingRegistry = new ContributionTargetMappingRegistry();\nrootContext.put(\"contributionTargetMappingRegistry\", contributionTargetMappingRegistry);\n\n/**\n * Public helper to override contribution targets programmatically.\n * This sets a global remap that applies across all apps.\n */\nexport function overrideContributionTargets(name: string, targets: string | string[]): void {\n const normalized = Array.isArray(targets) ? targets : [targets];\n contributionTargetMappingRegistry.setGlobalNameRemap(name, normalized);\n}\n\n/**\n * Apply config-driven name remaps from a simple object.\n * Intended for hosts that want to load JSON/YAML mapping files.\n */\nexport function applyConfigNameRemaps(config: Record<string, string | string[]>): void {\n for (const [name, targets] of Object.entries(config)) {\n const normalized = Array.isArray(targets) ? targets : [targets];\n contributionTargetMappingRegistry.setGlobalNameRemap(name, normalized);\n }\n}\n\n/**\n * Convenience helper for debugging: returns current remap state\n * for all known contribution names.\n */\nexport function listContributionNameRemaps(): Record<string, NameRemapState> {\n return contributionTargetMappingRegistry.listNameRemaps();\n}\n\n","import { Signal } from \"@lit-labs/signals\";\nimport { TemplateResult } from \"lit\";\nimport { publish } from \"./events\";\nimport { rootContext } from \"./di\";\nimport { contributionTargetMappingRegistry } from \"./contribution-mapping\";\n\nexport const TOPIC_CONTRIBUTEIONS_CHANGED = \"events/contributionregistry/contributionsChanged\"\n\nexport interface ContributionChangeEvent {\n target: string;\n contributions: Contribution[];\n}\n\nexport interface Contribution {\n /** Optional globally unique, namespaced contribution name (e.g. \"view.filebrowser\"). */\n name?: string;\n target?: string;\n label: string;\n /** When true, UI may show `label` alongside the icon (e.g. toolbar). Honored where supported in UI. */\n showLabel?: boolean;\n icon?: string;\n slot?: string;\n /**\n * Higher ranking appears first in `getContributions`. Defaults to 0.\n * Equal ranks keep registration order.\n */\n ranking?: number;\n disabled?: (() => boolean) | Signal.Computed<boolean>;\n /** When false, the contribution is not rendered (default: shown). Honored where supported in UI. */\n visible?: (() => boolean) | Signal.Computed<boolean>;\n}\n\nexport interface CommandContribution extends Contribution {\n command: string;\n params?: Record<string, any>;\n}\n\nexport function isCommandContribution(contribution: Contribution): contribution is CommandContribution {\n return \"command\" in contribution;\n}\n\nexport type ReactiveBoolean = boolean | (() => boolean) | Signal.Computed<boolean>;\n\n/** Reads a static or reactive boolean; plain functions and {@link Signal.Computed} are evaluated at call time. */\nexport function readReactiveBoolean(\n value: ReactiveBoolean | undefined,\n defaultValue: boolean\n): boolean {\n if (value === undefined) return defaultValue;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'object' && value !== null && 'get' in value) {\n return (value as Signal.Computed<boolean>).get() === true;\n }\n if (typeof value === 'function') {\n return (value as () => boolean)() === true;\n }\n return defaultValue;\n}\n\n/** Default true when `visible` is omitted. */\nexport function getContributionVisible(contribution: Contribution): boolean {\n const visible = contribution.visible as Signal.Computed<boolean> | undefined;\n if (!visible) return true;\n return visible.get() !== false;\n}\n\n/** Default false when `disabled` is omitted. */\nexport function getContributionDisabled(contribution: Contribution): boolean {\n return readReactiveBoolean(contribution.disabled as ReactiveBoolean | undefined, false);\n}\n\nfunction wrapContributionReactiveFlags(contribution: Contribution): void {\n if (contribution.disabled instanceof Function) {\n contribution.disabled = new Signal.Computed<boolean>(contribution.disabled);\n }\n if (contribution.visible instanceof Function) {\n contribution.visible = new Signal.Computed<boolean>(contribution.visible);\n }\n}\n\nexport interface HTMLContribution extends Contribution {\n component: string | (() => TemplateResult)\n}\n\nexport interface TabContribution extends Contribution {\n name: string;\n /**\n * Stable editor-type identifier used for contribution targets (for example `toolbar:${editorId}`).\n * Needed because `name` is often tab-instance specific (such as file/path based) and would\n * fragment toolbar contributions across many dynamic targets.\n */\n editorId?: string;\n closable?: boolean;\n /** When true or omitted, a docks-toolbar is rendered for this tab; when false, no toolbar is shown. */\n toolbar?: boolean;\n /** When true or omitted, a contextmenu is rendered for this tab; when false, no context menu is shown. */\n contextMenu?: boolean;\n /**\n * Main-area editor type ids (`TabContribution.editorId` of the editor tab) that should reveal this tab\n * when any of them becomes the active editor in the main editor area. Omitted or empty = no auto-reveal.\n */\n coupledEditors?: string[];\n /** Return false to cancel tab close (after dirty-tab prompt, if any). */\n beforeClose?: () => boolean | Promise<boolean>;\n component?: (id: string) => TemplateResult;\n}\n\nexport interface IconContribution extends Contribution {\n mappings: Record<string, string>;\n priority?: number;\n}\n\nexport interface LayoutContribution extends Contribution {\n id: string;\n name: string;\n /** Optional icon name (e.g. Font Awesome) for the layout switcher. */\n icon?: string;\n component: string | { tag: string; attributes?: Record<string, string> } | (() => TemplateResult);\n onShow?: () => void | Promise<void>;\n}\n\nclass ContributionRegistry {\n private contributions: Map<string, Contribution[]> = new Map();\n\n registerContribution<T extends Contribution>(target: string, contribution: T) {\n const targetSlot = this.getOrCreateSlot(target);\n wrapContributionReactiveFlags(contribution);\n targetSlot.push(contribution);\n publish(TOPIC_CONTRIBUTEIONS_CHANGED, { target, contributions: targetSlot } as ContributionChangeEvent);\n\n const effectiveTargets = contributionTargetMappingRegistry.getEffectiveTargets(target, contribution);\n for (const effectiveTarget of effectiveTargets) {\n if (effectiveTarget === target) continue;\n const contributionsForSlot = this.getContributions(effectiveTarget);\n publish(TOPIC_CONTRIBUTEIONS_CHANGED, { target: effectiveTarget, contributions: contributionsForSlot } as ContributionChangeEvent);\n }\n }\n\n /**\n * Returns all contributions whose *effective* targets include the given slot.\n *\n * Note: This currently scans all registered contributions and resolves\n * remaps on each call (O(N) in number of contributions). This is acceptable\n * for typical Docks apps (dozens/hundreds of contributions and few slots),\n * but if contribution counts grow significantly we may want to introduce a\n * cached index of effective targets per slot to keep lookups O(1).\n */\n getContributions<T extends Contribution>(target: string): T[] {\n const results: T[] = [];\n for (const [originalTarget, list] of this.contributions.entries()) {\n const typedList = list as T[];\n for (const contribution of typedList) {\n const effectiveTargets = contributionTargetMappingRegistry.getEffectiveTargets(originalTarget, contribution);\n if (effectiveTargets.includes(target)) {\n results.push(contribution);\n }\n }\n }\n results.sort((a, b) => (b.ranking ?? 0) - (a.ranking ?? 0));\n if (results.length === 0) {\n this.getOrCreateSlot(target);\n }\n return results;\n }\n\n private getOrCreateSlot(target: string): Contribution[] {\n if (!this.contributions.has(target)) {\n this.contributions.set(target, []);\n }\n return this.contributions.get(target)!;\n }\n}\n\nexport const contributionRegistry = new ContributionRegistry()\nrootContext.put(\"contributionRegistry\", contributionRegistry)","import { signal } from '@lit-labs/signals';\nimport { DocksPart } from \"../parts/part\";\n\nexport const EMPTY_SIGNALPORT = {} as any\n\nexport const activePartSignal = signal<DocksPart>(null as unknown as DocksPart)\nexport const activeEditorSignal = signal<DocksPart>(null as unknown as DocksPart)\n\nexport const partDirtySignal = signal<DocksPart>(null as unknown as DocksPart)\n\nexport const activeTasksSignal = signal<number>(0)\n\nexport const activeSelectionSignal = signal<any>(undefined)\n\nexport const perspectiveSwitchedSignal = signal<{name: string, timestamp: number}>({name: '', timestamp: 0})","import logger from \"./logger\";\nimport { publish } from \"./events\";\nimport { CommandContribution, contributionRegistry } from \"./contributionregistry\";\nimport { rootContext } from \"./di\";\nimport { activePartSignal, activeEditorSignal } from \"./appstate\";\n\nexport const TOPIC_COMMAND_REGISTERED = \"events/commandregistry/commandRegistered\";\n\nexport interface Parameter {\n name: string;\n description: string;\n type?: string;\n required: boolean;\n allowedValues?: string[];\n}\n\nexport interface Variable {\n name: string;\n description: string;\n type?: string;\n}\n\nexport interface LLMOptions {\n prompt?: string;\n model?: string;\n}\n\nexport class Command {\n id: string;\n name: string;\n description: string;\n icon?: string;\n keyBinding?: string;\n parameters?: Parameter[];\n output?: Variable[];\n llm?: LLMOptions;\n\n constructor(id: string, name: string, description: string, parameters?: Parameter[], output?: Variable[]) {\n this.id = id;\n this.name = name;\n this.description = description;\n this.parameters = parameters || [];\n this.output = output || [];\n }\n}\n\nexport interface ExecutionContext {\n [key: string]: any;\n\n params?: ExecuteParams;\n activePart?: any;\n activeEditor?: any;\n}\n\nexport interface ExecuteParams {\n [key: string]: any;\n}\n\nexport interface Handler {\n canExecute?: (context: ExecutionContext) => boolean;\n execute: (context: ExecutionContext) => any | Promise<any>;\n ranking?: number; // Higher ranking = higher priority (default: 0)\n}\n\nexport interface Commands {\n [commandId: string]: Command\n}\n\nfunction formatCommandResultForLog(value: unknown): string {\n if (value === undefined) {\n return \"undefined\";\n }\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"string\") {\n return value.length > 300 ? `${value.slice(0, 300)}…` : value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n try {\n const s = JSON.stringify(value);\n return s.length > 300 ? `${s.slice(0, 300)}…` : s;\n } catch {\n return String(value);\n }\n}\n\nexport class CommandStack {\n //private stack: any[] = []\n\n public async execute(commandId: any, context: ExecutionContext) {\n return commandRegistry.execute(commandId, context);\n }\n\n public async undo() {\n // TODO undo last command on stack\n }\n\n public async redo() {\n // TODO redo last command on stack\n }\n}\n\nexport class CommandRegistry {\n private commands: Commands = {};\n private handlers: Map<string, Handler[]> = new Map();\n\n registerHandler(commandId: string, handler: Handler) {\n if (!this.handlers.has(commandId)) {\n this.handlers.set(commandId, []);\n }\n const handlerList = this.handlers.get(commandId) as Handler[];\n handlerList.push(handler);\n // Sort by ranking (higher ranking first), default ranking is 0\n handlerList.sort((a, b) => (b.ranking ?? 0) - (a.ranking ?? 0));\n }\n\n getHandler(commandId: string): Handler[] | undefined {\n return this.handlers.get(commandId)\n }\n\n /**\n * Creates an ExecutionContext with the current application state\n * \n * @param params Optional command parameters\n * @returns ExecutionContext with captured application state\n */\n createExecutionContext(params?: ExecuteParams): ExecutionContext {\n const context: ExecutionContext = {\n params: params || {},\n activePart: activePartSignal.get(),\n activeEditor: activeEditorSignal.get()\n };\n\n return context;\n }\n\n async execute(commandId: string, context: ExecutionContext = {}) {\n const handlers = this.getHandler(commandId);\n\n if (!handlers) {\n logger.debug(`[CommandRegistry] No handlers registered for command: ${commandId}`);\n throw new Error(`No handlers registered for command: ${commandId}`);\n }\n\n const command = this.getCommand(commandId);\n const paramsStr = context.params ? ` params: ${JSON.stringify(context.params)}` : '';\n logger.debug(`[CommandRegistry] Executing command: ${commandId}${command ? ` (${command.name})` : ''}${paramsStr}`);\n\n // Handlers are already sorted by ranking, so iterate in order\n for (const handler of handlers) {\n if (handler.canExecute === undefined || handler.canExecute(context)) {\n try {\n const raw = handler.execute(context);\n const result = await Promise.resolve(raw);\n logger.debug(\n `[CommandRegistry] Command executed successfully: ${commandId} (result: ${formatCommandResultForLog(result)})`,\n );\n return result;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(`[CommandRegistry] Command execution failed: ${commandId} - ${errorMsg}`);\n throw error;\n }\n }\n }\n logger.error(`[CommandRegistry] No handler found to execute command: ${commandId}`);\n }\n\n createAndRegisterCommand(id: string, name: string, description: string, parameters: Parameter[], handler?: Handler) {\n const command = new Command(id, name, description, parameters);\n this.registerCommand(command)\n if (handler) {\n this.registerHandler(id, handler)\n }\n }\n\n registerCommand(command: Command): void {\n this.commands[command.id] = command;\n publish(TOPIC_COMMAND_REGISTERED, command);\n }\n\n hasCommand(commandId: string): boolean {\n return commandId in this.commands\n }\n\n listCommands(context?: ExecutionContext): Commands {\n if (context) {\n // filter by commands which have at least one executable handler\n return Object.values(this.commands).filter(command => {\n const handlers = commandRegistry.getHandler(command.id) || []\n return handlers.some(handler => handler.canExecute === undefined || handler.canExecute(context))\n }).reduce((acc: any, command) => {\n acc[command.id] = command\n return acc\n }, {})\n }\n return this.commands\n }\n\n getCommand(commandId: string): Command {\n return <Command>this.commands[commandId]\n }\n\n registerAll(options: RegisterOptions) {\n const commandId = options.command.id\n this.registerCommand(options.command)\n if (options.handler) {\n this.registerHandler(commandId, options.handler)\n }\n if (options.contribution && options.contribution.target) {\n contributionRegistry.registerContribution(options.contribution.target, {\n command: commandId,\n ...options.contribution\n } as CommandContribution)\n }\n }\n}\n\nexport const commandRegistry = new CommandRegistry();\nrootContext.put(\"commandRegistry\", commandRegistry);\n\nexport interface RegisterOptions {\n command: Command,\n handler?: Handler,\n contribution?: Omit<CommandContribution, 'command'>,\n}\n\nexport const registerAll = (options: RegisterOptions) => {\n commandRegistry.registerAll(options);\n}","import { css } from 'lit';\n\n/**\n * Stretch the Web Awesome label slot across the rest of the tree row.\n *\n * By default the slot is only as wide as its content, so clicks (and the context menu’s\n * synthetic click) in the empty area beside a short name often miss the slotted nodes.\n * `wa-tree` only updates selection when mousedown and click targets line up, so those\n * misses leave the wrong row selected. `flex: 1` makes the label column fill the row\n * so hits stay on the item’s content.\n *\n * Applied via `DocksWidget.finalizeStyles`: document-level CSS cannot target `::part()`\n * on `wa-tree-item` that lives only inside nested Lit shadow roots.\n */\nexport const waTreeLabelSlotStretch = css`\n wa-tree-item::part(label) {\n flex: 1;\n min-width: 0;\n }\n`;\n","import {Signal} from \"@lit-labs/signals\";\n\nexport const watchSignal = (signal: Signal.State<any> | Signal.Computed<any>, callback: (value: any) => void): (() => void) => {\n const watcher = new Signal.subtle.Watcher(async () => {\n try {\n await 0;\n callback(signal.get());\n } finally {\n watcher.watch(signal);\n }\n });\n watcher.watch(signal);\n signal.get();\n \n return () => {\n watcher.unwatch(signal);\n };\n}\n","import {LitElement, PropertyValues, type CSSResultGroup} from \"lit\";\nimport {waTreeLabelSlotStretch} from \"../externals/wa-tree-shadow-parts\";\nimport {subscribe as event_subscribe, unsubscribe as event_unsubscribe, type SubscriptionToken} from \"../core/events\";\nimport {toastError, toastInfo} from \"../core/toast\";\nimport {commandRegistry, ExecuteParams} from \"../core/commandregistry\";\nimport {Signal, SignalWatcher} from \"@lit-labs/signals\";\nimport {watchSignal} from \"../core/signals\";\n\nObject.defineProperty(LitElement.prototype, \"model\", {\n enumerable: true,\n configurable: true,\n writable: true\n});\n\nconst DocksWidgetBase = SignalWatcher(LitElement) as unknown as typeof LitElement;\n\nexport abstract class DocksWidget extends DocksWidgetBase {\n static finalizeStyles(styles?: CSSResultGroup) {\n return [waTreeLabelSlotStretch, ...super.finalizeStyles(styles)];\n }\n\n private signalCleanups = new Set<() => void>();\n private eventSubscriptions = new Set<SubscriptionToken>();\n\n connectedCallback() {\n super.connectedCallback();\n this.doBeforeUI()\n }\n\n disconnectedCallback() {\n this.doClose();\n super.disconnectedCallback();\n this.eventSubscriptions.forEach(token => event_unsubscribe(token));\n this.eventSubscriptions.clear();\n this.signalCleanups.forEach(cleanup => cleanup());\n this.signalCleanups.clear();\n }\n\n protected subscribe(topic: string, callback: Function): void {\n const token = event_subscribe(topic, callback.bind(this));\n this.eventSubscriptions.add(token);\n }\n\n protected showInfo(msg: string) {\n toastInfo(msg)\n }\n\n protected showError(msg: string) {\n toastError(msg)\n }\n\n protected nobubble(wrap: (event: Event) => void) {\n return (event: Event) => {\n event.stopPropagation();\n wrap.bind(this)(event);\n };\n }\n\n protected command(command: string, state: {} = {}) {\n return () => {\n void this.executeCommand(command, state);\n };\n }\n\n protected async executeCommand(command: string, params: ExecuteParams) {\n const execContext = commandRegistry.createExecutionContext(params);\n await commandRegistry.execute(command, execContext);\n }\n\n protected watch(signal: Signal.State<any> | Signal.Computed<any>, callback: (value: any) => void): void {\n const cleanup = watchSignal(signal as Signal.State<any>, callback.bind(this));\n this.signalCleanups.add(cleanup);\n }\n\n protected firstUpdated(_changedProperties: PropertyValues) {\n super.firstUpdated(_changedProperties);\n this.doInitUI()\n }\n\n protected updateIdle() {\n requestIdleCallback(() => this.requestUpdate())\n }\n\n public updateLater() {\n requestAnimationFrame(() => this.requestUpdate())\n }\n\n protected doBeforeUI() {\n }\n\n protected doInitUI() {\n }\n\n /**\n * Override to release resources when the element is disconnected (called from {@link disconnectedCallback}).\n */\n protected doClose() {\n }\n\n withRefresh(callback: () => void) {\n callback()\n this.updateLater()\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-docks/core",
3
- "version": "0.7.137",
3
+ "version": "0.7.140",
4
4
  "description": "Eclipse Docks platform core: registries, services, parts, widgets, and API",
5
5
  "type": "module",
6
6
  "license": "EPL-2.0",
@@ -77,7 +77,7 @@
77
77
  "test:coverage": "vitest run --coverage"
78
78
  },
79
79
  "dependencies": {
80
- "dompurify": "^3.2.7",
80
+ "dompurify": "^3.4.16",
81
81
  "@awesome.me/webawesome": "^3.12.0",
82
82
  "@fortawesome/fontawesome-free": "^7.2.0",
83
83
  "@fortawesome/fontawesome-svg-core": "^7.2.0",
@@ -10,5 +10,10 @@
10
10
  "DROP_FILES_HERE": "📁 Dateien hier ablegen",
11
11
  "OPEN_WITH": "Öffnen mit...",
12
12
  "FOLDER_LOAD_FAILED": "Ordner konnte nicht geladen werden: {detail}",
13
- "FOLDER_UNAVAILABLE": "Dieser Arbeitsbereichsordner ist nicht verfügbar: {detail}"
13
+ "FOLDER_UNAVAILABLE": "Dieser Arbeitsbereichsordner ist nicht verfügbar: {detail}",
14
+ "UNKNOWN_BACKEND": "unbekannt",
15
+ "DND_CROSS_CONNECTION_CONFIRM": "{count} Element(e) von \"{srcBackend}\" nach \"{destBackend}\" kopieren?",
16
+ "DROP_UPLOAD_TASK": "Abgelegte Dateien werden hochgeladen",
17
+ "DROP_SCANNING": "Wird durchsucht... {count} Datei(en) gefunden",
18
+ "DROP_COPY_TASK": "Abgelegte Elemente werden kopiert"
14
19
  }
@@ -10,5 +10,10 @@
10
10
  "DROP_FILES_HERE": "📁 Drop files here",
11
11
  "OPEN_WITH": "Open with...",
12
12
  "FOLDER_LOAD_FAILED": "Failed to load folder: {detail}",
13
- "FOLDER_UNAVAILABLE": "This workspace folder is unavailable: {detail}"
13
+ "FOLDER_UNAVAILABLE": "This workspace folder is unavailable: {detail}",
14
+ "UNKNOWN_BACKEND": "unknown",
15
+ "DND_CROSS_CONNECTION_CONFIRM": "Copy {count} item(s) from \"{srcBackend}\" to \"{destBackend}\"?",
16
+ "DROP_UPLOAD_TASK": "Uploading dropped files",
17
+ "DROP_SCANNING": "Scanning... {count} file(s) found",
18
+ "DROP_COPY_TASK": "Copying dropped items"
14
19
  }
@@ -25,6 +25,7 @@ import { icon } from '../core/icon-utils';
25
25
  import { renderDropdownItem, renderDropdownSubmenu } from '../core/dropdown-item';
26
26
  import { i18n } from '../core/i18n';
27
27
  import { createLogger } from '../core/logger';
28
+ import { taskService, type ProgressMonitor } from '../core/taskservice';
28
29
 
29
30
  const logger = createLogger('DocksFileBrowser');
30
31
  const t = await i18n(import.meta.glob('./filebrowser*.json'));
@@ -34,6 +35,94 @@ const WORKSPACE_CHANGED_DEBOUNCE_MS = 250;
34
35
  /** `wa-tree-item` exposes `.model` for the bound {@link TreeNode} (not in generated element types). */
35
36
  type WaTreeItemElement = HTMLElement & { model?: TreeNode };
36
37
 
38
+ type DroppedUpload = {
39
+ relativePath: string;
40
+ file: globalThis.File;
41
+ };
42
+
43
+ function readFileEntry(entry: FileSystemFileEntry): Promise<globalThis.File> {
44
+ return new Promise((resolve, reject) => entry.file(resolve, reject));
45
+ }
46
+
47
+ /** `readEntries` returns at most 100 entries and must be called until an empty batch. */
48
+ function readAllDirectoryEntries(reader: FileSystemDirectoryReader): Promise<FileSystemEntry[]> {
49
+ return new Promise((resolve, reject) => {
50
+ const all: FileSystemEntry[] = [];
51
+ const readBatch = () => {
52
+ reader.readEntries(batch => {
53
+ if (batch.length === 0) {
54
+ resolve(all);
55
+ return;
56
+ }
57
+ all.push(...batch);
58
+ readBatch();
59
+ }, reject);
60
+ };
61
+ readBatch();
62
+ });
63
+ }
64
+
65
+ type DroppedFileFound = (count: number) => void;
66
+
67
+ async function appendDroppedEntry(
68
+ entry: FileSystemEntry,
69
+ uploads: DroppedUpload[],
70
+ onFileFound?: DroppedFileFound,
71
+ parentPath = ''
72
+ ): Promise<void> {
73
+ const relativePath = parentPath ? `${parentPath}/${entry.name}` : entry.name;
74
+
75
+ if (entry.isFile) {
76
+ try {
77
+ uploads.push({ relativePath, file: await readFileEntry(entry as FileSystemFileEntry) });
78
+ onFileFound?.(uploads.length);
79
+ } catch (error) {
80
+ logger.error(`Failed to read dropped file "${relativePath}":`, error);
81
+ }
82
+ return;
83
+ }
84
+
85
+ if (!entry.isDirectory) return;
86
+
87
+ let children: FileSystemEntry[];
88
+ try {
89
+ children = await readAllDirectoryEntries((entry as FileSystemDirectoryEntry).createReader());
90
+ } catch (error) {
91
+ logger.error(`Failed to read dropped folder "${relativePath}":`, error);
92
+ return;
93
+ }
94
+
95
+ for (const child of children) {
96
+ await appendDroppedEntry(child, uploads, onFileFound, relativePath);
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Folder structure is only exposed through `webkitGetAsEntry()`; `dataTransfer.files` lists a dropped
102
+ * folder as a single unreadable file. Entries must be captured before the first `await`, because the
103
+ * drag data store becomes inaccessible once the drop handler yields.
104
+ */
105
+ export async function collectDroppedUploads(
106
+ dataTransfer: DataTransfer,
107
+ onFileFound?: DroppedFileFound
108
+ ): Promise<DroppedUpload[]> {
109
+ const entries = Array.from(dataTransfer.items ?? [])
110
+ .filter(item => item.kind === 'file')
111
+ .map(item => item.webkitGetAsEntry?.() ?? null)
112
+ .filter((entry): entry is FileSystemEntry => entry !== null);
113
+ const files = Array.from(dataTransfer.files ?? []);
114
+
115
+ if (entries.length === 0) {
116
+ return files.map(file => ({ relativePath: file.webkitRelativePath || file.name, file }));
117
+ }
118
+
119
+ const uploads: DroppedUpload[] = [];
120
+ for (const entry of entries) {
121
+ await appendDroppedEntry(entry, uploads, onFileFound);
122
+ }
123
+ return uploads;
124
+ }
125
+
37
126
  @customElement('docks-filebrowser')
38
127
  export class DocksFileBrowser extends DocksPart {
39
128
 
@@ -648,15 +737,19 @@ export class DocksFileBrowser extends DocksPart {
648
737
  const types = e.dataTransfer.types;
649
738
 
650
739
  if (types.includes('Files')) {
651
- const files = Array.from(e.dataTransfer.files);
652
- if (files.length === 0) return;
653
- await this.handleFilesDrop(files, targetDir);
740
+ const dataTransfer = e.dataTransfer;
741
+ await taskService.runAsync(t.DROP_UPLOAD_TASK, async progress => {
742
+ const uploads = await collectDroppedUploads(dataTransfer, count => {
743
+ progress.message = t.DROP_SCANNING({ count: String(count) });
744
+ });
745
+ if (uploads.length === 0) return;
746
+ await this.handleFilesDrop(uploads, targetDir, progress);
747
+ });
654
748
  return;
655
749
  }
656
750
 
657
751
  if (types.includes('application/x-workspace-file')) {
658
752
  await this.handleWorkspaceDrop(e, targetDir);
659
- return;
660
753
  }
661
754
  };
662
755
 
@@ -767,16 +860,19 @@ export class DocksFileBrowser extends DocksPart {
767
860
  }
768
861
  }
769
862
 
770
- for (const { path, resource } of sources) {
771
- try {
772
- const move = await moveWithinSameBackend(resource);
773
- await workspaceService.copyResource(resource, targetDir, { move });
774
- processed++;
775
- } catch (error) {
776
- logger.error(`Failed to handle workspace drop for "${path}":`, error);
777
- failed++;
863
+ await taskService.runAsync(t.DROP_COPY_TASK, async progress => {
864
+ const onFile = (targetPath: string) => { progress.message = targetPath; };
865
+ for (const { path, resource } of sources) {
866
+ try {
867
+ const move = await moveWithinSameBackend(resource);
868
+ await workspaceService.copyResource(resource, targetDir, { move, onFile });
869
+ processed++;
870
+ } catch (error) {
871
+ logger.error(`Failed to handle workspace drop for "${path}":`, error);
872
+ failed++;
873
+ }
778
874
  }
779
- }
875
+ });
780
876
 
781
877
  logger.info(
782
878
  `Workspace drop completed: ${processed}/${sources.length} items ${failed > 0 ? `, ${failed} failed` : ''}`
@@ -785,27 +881,28 @@ export class DocksFileBrowser extends DocksPart {
785
881
  await this.loadWorkspace(this.workspaceDir, true);
786
882
  }
787
883
 
788
- private async handleFilesDrop(files: globalThis.File[], targetDir: Directory) {
789
- const total = files.length;
884
+ private async handleFilesDrop(uploads: DroppedUpload[], targetDir: Directory, progress: ProgressMonitor) {
885
+ const total = uploads.length;
790
886
  let processed = 0;
791
887
  let failed = 0;
792
888
  let skipped = 0;
793
889
 
794
- for (const file of files) {
890
+ progress.totalSteps = total;
891
+ for (const [index, { relativePath, file }] of uploads.entries()) {
892
+ progress.currentStep = index + 1;
893
+ progress.message = relativePath;
795
894
  try {
796
- const targetPath = this.buildTargetPath(targetDir, file.name);
797
-
798
- const existingFile = await this.workspaceDir!.getResource(targetPath);
895
+ const existingFile = await targetDir.getResource(relativePath);
799
896
  if (existingFile) {
800
- const overwrite = await confirmDialog(t.FILE_EXISTS_OVERWRITE({ fileName: file.name }));
897
+ const overwrite = await confirmDialog(t.FILE_EXISTS_OVERWRITE({ fileName: relativePath }));
801
898
  if (!overwrite) {
802
899
  skipped++;
803
900
  continue;
804
901
  }
805
902
  }
806
903
 
807
- const workspaceFile = await this.workspaceDir!.getResource(
808
- targetPath,
904
+ const workspaceFile = await targetDir.getResource(
905
+ relativePath,
809
906
  { create: true }
810
907
  ) as File;
811
908
 
@@ -813,7 +910,7 @@ export class DocksFileBrowser extends DocksPart {
813
910
 
814
911
  processed++;
815
912
  } catch (error) {
816
- logger.error(`Failed to upload ${file.name}:`, error);
913
+ logger.error(`Failed to upload ${relativePath}:`, error);
817
914
  failed++;
818
915
  }
819
916
  }
@@ -823,11 +920,6 @@ export class DocksFileBrowser extends DocksPart {
823
920
  await this.loadWorkspace(this.workspaceDir);
824
921
  }
825
922
 
826
- private buildTargetPath(targetDir: Directory, fileName: string): string {
827
- const dirPath = targetDir.getWorkspacePath();
828
- return dirPath ? `${dirPath}/${fileName}` : fileName;
829
- }
830
-
831
923
  protected renderContent() {
832
924
  return html`
833
925
  <div class="tree" ${ref(this.treeRef)} style="--drop-files-text: '${t.DROP_FILES_HERE}'">