@inkandswitch/patchwork-pkg-base 0.0.15 → 0.0.17

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 (383) hide show
  1. package/init.js +1 -0
  2. package/modules.json +11 -1
  3. package/package.json +1 -1
  4. package/packages/account-picker/dist/AccountPicker-7VBUJTTB.js +8860 -0
  5. package/packages/account-picker/dist/AccountPicker-7VBUJTTB.js.map +7 -0
  6. package/packages/account-picker/dist/AccountPicker-CN73XGEW.css +371 -0
  7. package/packages/account-picker/dist/AccountPicker-CN73XGEW.css.map +7 -0
  8. package/packages/account-picker/dist/chunk-5WRI5ZAA.js +31 -0
  9. package/packages/account-picker/dist/chunk-5WRI5ZAA.js.map +7 -0
  10. package/packages/account-picker/dist/tool.css +371 -0
  11. package/packages/account-picker/dist/tool.css.map +7 -0
  12. package/packages/account-picker/dist/tool.js +19 -0
  13. package/packages/account-picker/dist/tool.js.map +7 -0
  14. package/packages/account-picker/package.json +39 -0
  15. package/packages/codemirror-base/dist/chunk-KMEIRH3R.js +490 -0
  16. package/packages/codemirror-base/dist/chunk-KMEIRH3R.js.map +7 -0
  17. package/packages/codemirror-base/dist/lib/codemirror.js +7 -0
  18. package/packages/codemirror-base/dist/lib/codemirror.js.map +7 -0
  19. package/packages/codemirror-base/dist/main.js +17 -0
  20. package/packages/codemirror-base/dist/main.js.map +7 -0
  21. package/packages/codemirror-base/dist/tool.js +1799 -0
  22. package/packages/codemirror-base/dist/tool.js.map +7 -0
  23. package/packages/codemirror-base/package.json +55 -0
  24. package/packages/codemirror-markdown/dist/apl-QAIM2KBM.js +142 -0
  25. package/packages/codemirror-markdown/dist/apl-QAIM2KBM.js.map +7 -0
  26. package/packages/codemirror-markdown/dist/asciiarmor-G7UKQURA.js +58 -0
  27. package/packages/codemirror-markdown/dist/asciiarmor-G7UKQURA.js.map +7 -0
  28. package/packages/codemirror-markdown/dist/asn1-JTUXKWKT.js +144 -0
  29. package/packages/codemirror-markdown/dist/asn1-JTUXKWKT.js.map +7 -0
  30. package/packages/codemirror-markdown/dist/asterisk-NM6JCXOL.js +351 -0
  31. package/packages/codemirror-markdown/dist/asterisk-NM6JCXOL.js.map +7 -0
  32. package/packages/codemirror-markdown/dist/brainfuck-X7FFM55E.js +55 -0
  33. package/packages/codemirror-markdown/dist/brainfuck-X7FFM55E.js.map +7 -0
  34. package/packages/codemirror-markdown/dist/chunk-46Z6CXSY.js +1062 -0
  35. package/packages/codemirror-markdown/dist/chunk-46Z6CXSY.js.map +7 -0
  36. package/packages/codemirror-markdown/dist/chunk-6JT2ASRP.js +1111 -0
  37. package/packages/codemirror-markdown/dist/chunk-6JT2ASRP.js.map +7 -0
  38. package/packages/codemirror-markdown/dist/chunk-CSJO4DNL.js +1424 -0
  39. package/packages/codemirror-markdown/dist/chunk-CSJO4DNL.js.map +7 -0
  40. package/packages/codemirror-markdown/dist/chunk-FLC3A4DL.js +133 -0
  41. package/packages/codemirror-markdown/dist/chunk-FLC3A4DL.js.map +7 -0
  42. package/packages/codemirror-markdown/dist/chunk-M3X2FRO3.js +998 -0
  43. package/packages/codemirror-markdown/dist/chunk-M3X2FRO3.js.map +7 -0
  44. package/packages/codemirror-markdown/dist/chunk-MAW6NPUW.js +4930 -0
  45. package/packages/codemirror-markdown/dist/chunk-MAW6NPUW.js.map +7 -0
  46. package/packages/codemirror-markdown/dist/chunk-MBTMKYFQ.js +1779 -0
  47. package/packages/codemirror-markdown/dist/chunk-MBTMKYFQ.js.map +7 -0
  48. package/packages/codemirror-markdown/dist/chunk-NEI7FGV4.js +697 -0
  49. package/packages/codemirror-markdown/dist/chunk-NEI7FGV4.js.map +7 -0
  50. package/packages/codemirror-markdown/dist/chunk-PPGERYN5.js +2528 -0
  51. package/packages/codemirror-markdown/dist/chunk-PPGERYN5.js.map +7 -0
  52. package/packages/codemirror-markdown/dist/clike-DOBZTBQN.js +808 -0
  53. package/packages/codemirror-markdown/dist/clike-DOBZTBQN.js.map +7 -0
  54. package/packages/codemirror-markdown/dist/clojure-PTADSDNF.js +851 -0
  55. package/packages/codemirror-markdown/dist/clojure-PTADSDNF.js.map +7 -0
  56. package/packages/codemirror-markdown/dist/cmake-5HAC7YMH.js +73 -0
  57. package/packages/codemirror-markdown/dist/cmake-5HAC7YMH.js.map +7 -0
  58. package/packages/codemirror-markdown/dist/cobol-HAM4C42S.js +131 -0
  59. package/packages/codemirror-markdown/dist/cobol-HAM4C42S.js.map +7 -0
  60. package/packages/codemirror-markdown/dist/coffeescript-IBRKASSJ.js +310 -0
  61. package/packages/codemirror-markdown/dist/coffeescript-IBRKASSJ.js.map +7 -0
  62. package/packages/codemirror-markdown/dist/commonlisp-KMRPB5EW.js +132 -0
  63. package/packages/codemirror-markdown/dist/commonlisp-KMRPB5EW.js.map +7 -0
  64. package/packages/codemirror-markdown/dist/crystal-2MDF4EKJ.js +400 -0
  65. package/packages/codemirror-markdown/dist/crystal-2MDF4EKJ.js.map +7 -0
  66. package/packages/codemirror-markdown/dist/css-VQQXA3AY.js +1795 -0
  67. package/packages/codemirror-markdown/dist/css-VQQXA3AY.js.map +7 -0
  68. package/packages/codemirror-markdown/dist/cypher-ZZEGDGDJ.js +123 -0
  69. package/packages/codemirror-markdown/dist/cypher-ZZEGDGDJ.js.map +7 -0
  70. package/packages/codemirror-markdown/dist/d-5S6PJOOT.js +187 -0
  71. package/packages/codemirror-markdown/dist/d-5S6PJOOT.js.map +7 -0
  72. package/packages/codemirror-markdown/dist/datatype.js +48 -0
  73. package/packages/codemirror-markdown/dist/datatype.js.map +7 -0
  74. package/packages/codemirror-markdown/dist/diff-S77XBOWF.js +27 -0
  75. package/packages/codemirror-markdown/dist/diff-S77XBOWF.js.map +7 -0
  76. package/packages/codemirror-markdown/dist/dist-2C6IPJHB.js +98 -0
  77. package/packages/codemirror-markdown/dist/dist-2C6IPJHB.js.map +7 -0
  78. package/packages/codemirror-markdown/dist/dist-2H653DKD.js +170 -0
  79. package/packages/codemirror-markdown/dist/dist-2H653DKD.js.map +7 -0
  80. package/packages/codemirror-markdown/dist/dist-2O4EI6YQ.js +140 -0
  81. package/packages/codemirror-markdown/dist/dist-2O4EI6YQ.js.map +7 -0
  82. package/packages/codemirror-markdown/dist/dist-2UJRV4FH.js +75 -0
  83. package/packages/codemirror-markdown/dist/dist-2UJRV4FH.js.map +7 -0
  84. package/packages/codemirror-markdown/dist/dist-52S6W6Z3.js +15 -0
  85. package/packages/codemirror-markdown/dist/dist-52S6W6Z3.js.map +7 -0
  86. package/packages/codemirror-markdown/dist/dist-5KN6ODPO.js +340 -0
  87. package/packages/codemirror-markdown/dist/dist-5KN6ODPO.js.map +7 -0
  88. package/packages/codemirror-markdown/dist/dist-BOGB4NCA.js +20 -0
  89. package/packages/codemirror-markdown/dist/dist-BOGB4NCA.js.map +7 -0
  90. package/packages/codemirror-markdown/dist/dist-DZ4PW5HP.js +318 -0
  91. package/packages/codemirror-markdown/dist/dist-DZ4PW5HP.js.map +7 -0
  92. package/packages/codemirror-markdown/dist/dist-FDBKXKIA.js +100 -0
  93. package/packages/codemirror-markdown/dist/dist-FDBKXKIA.js.map +7 -0
  94. package/packages/codemirror-markdown/dist/dist-G2KVVLNT.js +381 -0
  95. package/packages/codemirror-markdown/dist/dist-G2KVVLNT.js.map +7 -0
  96. package/packages/codemirror-markdown/dist/dist-HHNZE2GE.js +193 -0
  97. package/packages/codemirror-markdown/dist/dist-HHNZE2GE.js.map +7 -0
  98. package/packages/codemirror-markdown/dist/dist-HNH74YPL.js +32 -0
  99. package/packages/codemirror-markdown/dist/dist-HNH74YPL.js.map +7 -0
  100. package/packages/codemirror-markdown/dist/dist-LBQUKRIG.js +27 -0
  101. package/packages/codemirror-markdown/dist/dist-LBQUKRIG.js.map +7 -0
  102. package/packages/codemirror-markdown/dist/dist-MFKCWPLQ.js +416 -0
  103. package/packages/codemirror-markdown/dist/dist-MFKCWPLQ.js.map +7 -0
  104. package/packages/codemirror-markdown/dist/dist-NISFJM3T.js +423 -0
  105. package/packages/codemirror-markdown/dist/dist-NISFJM3T.js.map +7 -0
  106. package/packages/codemirror-markdown/dist/dist-Q7P6VH6H.js +786 -0
  107. package/packages/codemirror-markdown/dist/dist-Q7P6VH6H.js.map +7 -0
  108. package/packages/codemirror-markdown/dist/dist-RWF5A5GN.js +451 -0
  109. package/packages/codemirror-markdown/dist/dist-RWF5A5GN.js.map +7 -0
  110. package/packages/codemirror-markdown/dist/dist-UHUU7KLC.js +748 -0
  111. package/packages/codemirror-markdown/dist/dist-UHUU7KLC.js.map +7 -0
  112. package/packages/codemirror-markdown/dist/dist-WJMBFK7W.js +360 -0
  113. package/packages/codemirror-markdown/dist/dist-WJMBFK7W.js.map +7 -0
  114. package/packages/codemirror-markdown/dist/dist-XJYSXJ7H.js +115 -0
  115. package/packages/codemirror-markdown/dist/dist-XJYSXJ7H.js.map +7 -0
  116. package/packages/codemirror-markdown/dist/dist-YY24ZXZD.js +212 -0
  117. package/packages/codemirror-markdown/dist/dist-YY24ZXZD.js.map +7 -0
  118. package/packages/codemirror-markdown/dist/dockerfile-JECCOJWP.js +209 -0
  119. package/packages/codemirror-markdown/dist/dockerfile-JECCOJWP.js.map +7 -0
  120. package/packages/codemirror-markdown/dist/dtd-MNDWTW4Z.js +116 -0
  121. package/packages/codemirror-markdown/dist/dtd-MNDWTW4Z.js.map +7 -0
  122. package/packages/codemirror-markdown/dist/dylan-VQ4IHJDS.js +317 -0
  123. package/packages/codemirror-markdown/dist/dylan-VQ4IHJDS.js.map +7 -0
  124. package/packages/codemirror-markdown/dist/ebnf-IDZBFTCG.js +142 -0
  125. package/packages/codemirror-markdown/dist/ebnf-IDZBFTCG.js.map +7 -0
  126. package/packages/codemirror-markdown/dist/ecl-X3ROY7E6.js +180 -0
  127. package/packages/codemirror-markdown/dist/ecl-X3ROY7E6.js.map +7 -0
  128. package/packages/codemirror-markdown/dist/eiffel-WB3M7Y2E.js +136 -0
  129. package/packages/codemirror-markdown/dist/eiffel-WB3M7Y2E.js.map +7 -0
  130. package/packages/codemirror-markdown/dist/elm-VHXR6ZA3.js +178 -0
  131. package/packages/codemirror-markdown/dist/elm-VHXR6ZA3.js.map +7 -0
  132. package/packages/codemirror-markdown/dist/erlang-7ZBDDQDV.js +676 -0
  133. package/packages/codemirror-markdown/dist/erlang-7ZBDDQDV.js.map +7 -0
  134. package/packages/codemirror-markdown/dist/extensions/embed.js +325 -0
  135. package/packages/codemirror-markdown/dist/extensions/embed.js.map +7 -0
  136. package/packages/codemirror-markdown/dist/extensions/links.js +118 -0
  137. package/packages/codemirror-markdown/dist/extensions/links.js.map +7 -0
  138. package/packages/codemirror-markdown/dist/extensions/markdown.js +3476 -0
  139. package/packages/codemirror-markdown/dist/extensions/markdown.js.map +7 -0
  140. package/packages/codemirror-markdown/dist/factor-IKT2GQE2.js +70 -0
  141. package/packages/codemirror-markdown/dist/factor-IKT2GQE2.js.map +7 -0
  142. package/packages/codemirror-markdown/dist/fcl-CNBUVGUC.js +143 -0
  143. package/packages/codemirror-markdown/dist/fcl-CNBUVGUC.js.map +7 -0
  144. package/packages/codemirror-markdown/dist/forth-4BTPWSFZ.js +118 -0
  145. package/packages/codemirror-markdown/dist/forth-4BTPWSFZ.js.map +7 -0
  146. package/packages/codemirror-markdown/dist/fortran-V6F5DQPK.js +469 -0
  147. package/packages/codemirror-markdown/dist/fortran-V6F5DQPK.js.map +7 -0
  148. package/packages/codemirror-markdown/dist/gas-4DLP6BC4.js +296 -0
  149. package/packages/codemirror-markdown/dist/gas-4DLP6BC4.js.map +7 -0
  150. package/packages/codemirror-markdown/dist/gherkin-OSGPX6HI.js +117 -0
  151. package/packages/codemirror-markdown/dist/gherkin-OSGPX6HI.js.map +7 -0
  152. package/packages/codemirror-markdown/dist/groovy-R2JW63QF.js +225 -0
  153. package/packages/codemirror-markdown/dist/groovy-R2JW63QF.js.map +7 -0
  154. package/packages/codemirror-markdown/dist/haskell-GG7T4J6H.js +461 -0
  155. package/packages/codemirror-markdown/dist/haskell-GG7T4J6H.js.map +7 -0
  156. package/packages/codemirror-markdown/dist/haxe-ESFUJKSE.js +521 -0
  157. package/packages/codemirror-markdown/dist/haxe-ESFUJKSE.js.map +7 -0
  158. package/packages/codemirror-markdown/dist/http-SZLSACOW.js +81 -0
  159. package/packages/codemirror-markdown/dist/http-SZLSACOW.js.map +7 -0
  160. package/packages/codemirror-markdown/dist/idl-V7UH35RP.js +987 -0
  161. package/packages/codemirror-markdown/dist/idl-V7UH35RP.js.map +7 -0
  162. package/packages/codemirror-markdown/dist/javascript-MGRPKFDN.js +13 -0
  163. package/packages/codemirror-markdown/dist/javascript-MGRPKFDN.js.map +7 -0
  164. package/packages/codemirror-markdown/dist/julia-CWCVZVPG.js +409 -0
  165. package/packages/codemirror-markdown/dist/julia-CWCVZVPG.js.map +7 -0
  166. package/packages/codemirror-markdown/dist/livescript-IGKT2FL7.js +303 -0
  167. package/packages/codemirror-markdown/dist/livescript-IGKT2FL7.js.map +7 -0
  168. package/packages/codemirror-markdown/dist/lua-GHK7GCTS.js +258 -0
  169. package/packages/codemirror-markdown/dist/lua-GHK7GCTS.js.map +7 -0
  170. package/packages/codemirror-markdown/dist/main.js +58 -0
  171. package/packages/codemirror-markdown/dist/main.js.map +7 -0
  172. package/packages/codemirror-markdown/dist/mathematica-W5LMQI3M.js +112 -0
  173. package/packages/codemirror-markdown/dist/mathematica-W5LMQI3M.js.map +7 -0
  174. package/packages/codemirror-markdown/dist/mbox-A7CXJ4HZ.js +119 -0
  175. package/packages/codemirror-markdown/dist/mbox-A7CXJ4HZ.js.map +7 -0
  176. package/packages/codemirror-markdown/dist/mirc-WYJEQUBY.js +109 -0
  177. package/packages/codemirror-markdown/dist/mirc-WYJEQUBY.js.map +7 -0
  178. package/packages/codemirror-markdown/dist/mllike-C2YS6SJI.js +340 -0
  179. package/packages/codemirror-markdown/dist/mllike-C2YS6SJI.js.map +7 -0
  180. package/packages/codemirror-markdown/dist/modelica-BMJSLZS7.js +149 -0
  181. package/packages/codemirror-markdown/dist/modelica-BMJSLZS7.js.map +7 -0
  182. package/packages/codemirror-markdown/dist/mscgen-5BORDYHW.js +137 -0
  183. package/packages/codemirror-markdown/dist/mscgen-5BORDYHW.js.map +7 -0
  184. package/packages/codemirror-markdown/dist/mumps-BYE6H7ZX.js +95 -0
  185. package/packages/codemirror-markdown/dist/mumps-BYE6H7ZX.js.map +7 -0
  186. package/packages/codemirror-markdown/dist/nginx-Y54HR7MQ.js +143 -0
  187. package/packages/codemirror-markdown/dist/nginx-Y54HR7MQ.js.map +7 -0
  188. package/packages/codemirror-markdown/dist/nsis-UZLPE2DL.js +67 -0
  189. package/packages/codemirror-markdown/dist/nsis-UZLPE2DL.js.map +7 -0
  190. package/packages/codemirror-markdown/dist/ntriples-SAI3J2VH.js +155 -0
  191. package/packages/codemirror-markdown/dist/ntriples-SAI3J2VH.js.map +7 -0
  192. package/packages/codemirror-markdown/dist/octave-TLUBYOUX.js +213 -0
  193. package/packages/codemirror-markdown/dist/octave-TLUBYOUX.js.map +7 -0
  194. package/packages/codemirror-markdown/dist/oz-F6LNIR6Q.js +233 -0
  195. package/packages/codemirror-markdown/dist/oz-F6LNIR6Q.js.map +7 -0
  196. package/packages/codemirror-markdown/dist/pascal-WINE2FE6.js +107 -0
  197. package/packages/codemirror-markdown/dist/pascal-WINE2FE6.js.map +7 -0
  198. package/packages/codemirror-markdown/dist/perl-NZG3EIBE.js +1107 -0
  199. package/packages/codemirror-markdown/dist/perl-NZG3EIBE.js.map +7 -0
  200. package/packages/codemirror-markdown/dist/pig-U7OFLRCV.js +105 -0
  201. package/packages/codemirror-markdown/dist/pig-U7OFLRCV.js.map +7 -0
  202. package/packages/codemirror-markdown/dist/powershell-ZSUS7P6D.js +330 -0
  203. package/packages/codemirror-markdown/dist/powershell-ZSUS7P6D.js.map +7 -0
  204. package/packages/codemirror-markdown/dist/properties-IJRU6UJW.js +60 -0
  205. package/packages/codemirror-markdown/dist/properties-IJRU6UJW.js.map +7 -0
  206. package/packages/codemirror-markdown/dist/protobuf-2KETQIQ5.js +80 -0
  207. package/packages/codemirror-markdown/dist/protobuf-2KETQIQ5.js.map +7 -0
  208. package/packages/codemirror-markdown/dist/pug-IQCJJAZU.js +410 -0
  209. package/packages/codemirror-markdown/dist/pug-IQCJJAZU.js.map +7 -0
  210. package/packages/codemirror-markdown/dist/puppet-YIIDDH6A.js +139 -0
  211. package/packages/codemirror-markdown/dist/puppet-YIIDDH6A.js.map +7 -0
  212. package/packages/codemirror-markdown/dist/python-A6P3XTMX.js +429 -0
  213. package/packages/codemirror-markdown/dist/python-A6P3XTMX.js.map +7 -0
  214. package/packages/codemirror-markdown/dist/q-2KXN5RX7.js +135 -0
  215. package/packages/codemirror-markdown/dist/q-2KXN5RX7.js.map +7 -0
  216. package/packages/codemirror-markdown/dist/r-BB4MIIBH.js +174 -0
  217. package/packages/codemirror-markdown/dist/r-BB4MIIBH.js.map +7 -0
  218. package/packages/codemirror-markdown/dist/rpm-LMR25AQ3.js +111 -0
  219. package/packages/codemirror-markdown/dist/rpm-LMR25AQ3.js.map +7 -0
  220. package/packages/codemirror-markdown/dist/ruby-TSD6FT73.js +333 -0
  221. package/packages/codemirror-markdown/dist/ruby-TSD6FT73.js.map +7 -0
  222. package/packages/codemirror-markdown/dist/sas-6X4WWIGV.js +209 -0
  223. package/packages/codemirror-markdown/dist/sas-6X4WWIGV.js.map +7 -0
  224. package/packages/codemirror-markdown/dist/scheme-E3I46HBL.js +230 -0
  225. package/packages/codemirror-markdown/dist/scheme-E3I46HBL.js.map +7 -0
  226. package/packages/codemirror-markdown/dist/shell-GX3PRI4I.js +224 -0
  227. package/packages/codemirror-markdown/dist/shell-GX3PRI4I.js.map +7 -0
  228. package/packages/codemirror-markdown/dist/sieve-V65ZPL4F.js +137 -0
  229. package/packages/codemirror-markdown/dist/sieve-V65ZPL4F.js.map +7 -0
  230. package/packages/codemirror-markdown/dist/smalltalk-OVKP2CVW.js +123 -0
  231. package/packages/codemirror-markdown/dist/smalltalk-OVKP2CVW.js.map +7 -0
  232. package/packages/codemirror-markdown/dist/solr-C4DLQJCF.js +71 -0
  233. package/packages/codemirror-markdown/dist/solr-C4DLQJCF.js.map +7 -0
  234. package/packages/codemirror-markdown/dist/sparql-REKUW7B3.js +251 -0
  235. package/packages/codemirror-markdown/dist/sparql-REKUW7B3.js.map +7 -0
  236. package/packages/codemirror-markdown/dist/spreadsheet-S7NN2YTQ.js +89 -0
  237. package/packages/codemirror-markdown/dist/spreadsheet-S7NN2YTQ.js.map +7 -0
  238. package/packages/codemirror-markdown/dist/sql-ML2Q43YF.js +358 -0
  239. package/packages/codemirror-markdown/dist/sql-ML2Q43YF.js.map +7 -0
  240. package/packages/codemirror-markdown/dist/stex-TCOGKBT4.js +233 -0
  241. package/packages/codemirror-markdown/dist/stex-TCOGKBT4.js.map +7 -0
  242. package/packages/codemirror-markdown/dist/stylus-3ONNYZOM.js +591 -0
  243. package/packages/codemirror-markdown/dist/stylus-3ONNYZOM.js.map +7 -0
  244. package/packages/codemirror-markdown/dist/swift-CNWGZ22Y.js +293 -0
  245. package/packages/codemirror-markdown/dist/swift-CNWGZ22Y.js.map +7 -0
  246. package/packages/codemirror-markdown/dist/tcl-77IMAZYE.js +116 -0
  247. package/packages/codemirror-markdown/dist/tcl-77IMAZYE.js.map +7 -0
  248. package/packages/codemirror-markdown/dist/textile-6IWIIKFM.js +416 -0
  249. package/packages/codemirror-markdown/dist/textile-6IWIIKFM.js.map +7 -0
  250. package/packages/codemirror-markdown/dist/tiddlywiki-IJSZMUSA.js +231 -0
  251. package/packages/codemirror-markdown/dist/tiddlywiki-IJSZMUSA.js.map +7 -0
  252. package/packages/codemirror-markdown/dist/tiki-HG37JJIT.js +276 -0
  253. package/packages/codemirror-markdown/dist/tiki-HG37JJIT.js.map +7 -0
  254. package/packages/codemirror-markdown/dist/toml-NINU2IMM.js +78 -0
  255. package/packages/codemirror-markdown/dist/toml-NINU2IMM.js.map +7 -0
  256. package/packages/codemirror-markdown/dist/troff-AOQJ4Q4C.js +63 -0
  257. package/packages/codemirror-markdown/dist/troff-AOQJ4Q4C.js.map +7 -0
  258. package/packages/codemirror-markdown/dist/ttcn-TLOZ3FX3.js +211 -0
  259. package/packages/codemirror-markdown/dist/ttcn-TLOZ3FX3.js.map +7 -0
  260. package/packages/codemirror-markdown/dist/ttcn-cfg-3B6QY7QE.js +141 -0
  261. package/packages/codemirror-markdown/dist/ttcn-cfg-3B6QY7QE.js.map +7 -0
  262. package/packages/codemirror-markdown/dist/turtle-3N5KCGXP.js +132 -0
  263. package/packages/codemirror-markdown/dist/turtle-3N5KCGXP.js.map +7 -0
  264. package/packages/codemirror-markdown/dist/vb-I7M5DRLP.js +204 -0
  265. package/packages/codemirror-markdown/dist/vb-I7M5DRLP.js.map +7 -0
  266. package/packages/codemirror-markdown/dist/vbscript-U2ARSJLD.js +482 -0
  267. package/packages/codemirror-markdown/dist/vbscript-U2ARSJLD.js.map +7 -0
  268. package/packages/codemirror-markdown/dist/velocity-R3AYP5XJ.js +151 -0
  269. package/packages/codemirror-markdown/dist/velocity-R3AYP5XJ.js.map +7 -0
  270. package/packages/codemirror-markdown/dist/verilog-7VEWVDW6.js +456 -0
  271. package/packages/codemirror-markdown/dist/verilog-7VEWVDW6.js.map +7 -0
  272. package/packages/codemirror-markdown/dist/vhdl-JZUPPGBA.js +162 -0
  273. package/packages/codemirror-markdown/dist/vhdl-JZUPPGBA.js.map +7 -0
  274. package/packages/codemirror-markdown/dist/webidl-SLQFEELK.js +206 -0
  275. package/packages/codemirror-markdown/dist/webidl-SLQFEELK.js.map +7 -0
  276. package/packages/codemirror-markdown/dist/xquery-VXP5KJ6N.js +532 -0
  277. package/packages/codemirror-markdown/dist/xquery-VXP5KJ6N.js.map +7 -0
  278. package/packages/codemirror-markdown/dist/yacas-JRBC4BEV.js +132 -0
  279. package/packages/codemirror-markdown/dist/yacas-JRBC4BEV.js.map +7 -0
  280. package/packages/codemirror-markdown/dist/z80-AJF6WLUV.js +95 -0
  281. package/packages/codemirror-markdown/dist/z80-AJF6WLUV.js.map +7 -0
  282. package/packages/codemirror-markdown/example.js +46 -0
  283. package/packages/codemirror-markdown/package.json +62 -0
  284. package/packages/commands/dist/main.js +504 -0
  285. package/packages/commands/dist/main.js.map +7 -0
  286. package/packages/commands/package.json +28 -0
  287. package/packages/contact/dist/ContactAvatar-FP32ZZH2.js +161 -0
  288. package/packages/contact/dist/ContactAvatar-FP32ZZH2.js.map +7 -0
  289. package/packages/contact/dist/ContactViewer-ZHEE6INW.js +60 -0
  290. package/packages/contact/dist/ContactViewer-ZHEE6INW.js.map +7 -0
  291. package/packages/contact/dist/InlineContactAvatar-VZDPEZV2.js +46 -0
  292. package/packages/contact/dist/InlineContactAvatar-VZDPEZV2.js.map +7 -0
  293. package/packages/contact/dist/chunk-MOZI4Y4O.js +54 -0
  294. package/packages/contact/dist/chunk-MOZI4Y4O.js.map +7 -0
  295. package/packages/contact/dist/datatype-ABVDVPWS.js +27 -0
  296. package/packages/contact/dist/datatype-ABVDVPWS.js.map +7 -0
  297. package/packages/contact/dist/tool.css +81 -0
  298. package/packages/contact/dist/tool.css.map +7 -0
  299. package/packages/contact/dist/tool.js +70 -0
  300. package/packages/contact/dist/tool.js.map +7 -0
  301. package/packages/contact/package.json +46 -0
  302. package/packages/folder/dist/datatype-HWGUFBTQ.js +27 -0
  303. package/packages/folder/dist/datatype-HWGUFBTQ.js.map +7 -0
  304. package/packages/folder/dist/index.js +27 -0
  305. package/packages/folder/dist/index.js.map +7 -0
  306. package/packages/folder/dist/tool-62JZAZRP.js +366 -0
  307. package/packages/folder/dist/tool-62JZAZRP.js.map +7 -0
  308. package/packages/folder/package.json +32 -0
  309. package/packages/sideboard/dist/account-bar-OJQC3J6W.js +2 -0
  310. package/packages/sideboard/dist/account-bar-OJQC3J6W.js.map +7 -0
  311. package/packages/sideboard/dist/chunk-32FICX7K.js +26 -0
  312. package/packages/sideboard/dist/chunk-32FICX7K.js.map +7 -0
  313. package/packages/sideboard/dist/chunk-3OYP6TVA.js +2 -0
  314. package/packages/sideboard/dist/chunk-3OYP6TVA.js.map +7 -0
  315. package/packages/sideboard/dist/chunk-FW4363Y4.js +2 -0
  316. package/packages/sideboard/dist/chunk-FW4363Y4.js.map +7 -0
  317. package/packages/sideboard/dist/chunk-QKYKEZU4.js +2 -0
  318. package/packages/sideboard/dist/chunk-QKYKEZU4.js.map +7 -0
  319. package/packages/sideboard/dist/document-list-panel-42LSXXCO.js +2 -0
  320. package/packages/sideboard/dist/document-list-panel-42LSXXCO.js.map +7 -0
  321. package/packages/sideboard/dist/index.css +2 -0
  322. package/packages/sideboard/dist/index.css.map +7 -0
  323. package/packages/sideboard/dist/index.js +2 -0
  324. package/packages/sideboard/dist/index.js.map +7 -0
  325. package/packages/sideboard/dist/sideboard/sideboard.js +2 -0
  326. package/packages/sideboard/dist/sideboard/sideboard.js.map +7 -0
  327. package/packages/sideboard/package.json +56 -0
  328. package/packages/theming/dist/active-theme-K27UXDBG.js +26 -0
  329. package/packages/theming/dist/active-theme-K27UXDBG.js.map +7 -0
  330. package/packages/theming/dist/chunk-K4OOO2TK.js +281 -0
  331. package/packages/theming/dist/chunk-K4OOO2TK.js.map +7 -0
  332. package/packages/theming/dist/chunk-RATW7VZI.js +11 -0
  333. package/packages/theming/dist/chunk-RATW7VZI.js.map +7 -0
  334. package/packages/theming/dist/chunk-U7SC4JPE.js +86 -0
  335. package/packages/theming/dist/chunk-U7SC4JPE.js.map +7 -0
  336. package/packages/theming/dist/codemirror-theme.js +2415 -0
  337. package/packages/theming/dist/codemirror-theme.js.map +7 -0
  338. package/packages/theming/dist/datatype-UUJVIZM7.js +16 -0
  339. package/packages/theming/dist/datatype-UUJVIZM7.js.map +7 -0
  340. package/packages/theming/dist/gloom-JYQPEOHI.css +102 -0
  341. package/packages/theming/dist/lychee-BMLMUNP6.css +114 -0
  342. package/packages/theming/dist/main.js +112 -0
  343. package/packages/theming/dist/main.js.map +7 -0
  344. package/packages/theming/dist/theme-RC7MV6WP.css +691 -0
  345. package/packages/theming/dist/theme-editor-datatype-CIXRKEFF.js +11 -0
  346. package/packages/theming/dist/theme-editor-datatype-CIXRKEFF.js.map +7 -0
  347. package/packages/theming/dist/theme-editor.js +576 -0
  348. package/packages/theming/dist/theme-editor.js.map +7 -0
  349. package/packages/theming/dist/theme-titlebar-P2CODQGF.js +21 -0
  350. package/packages/theming/dist/theme-titlebar-P2CODQGF.js.map +7 -0
  351. package/packages/theming/dist/theme-tray-5L2KGCGD.js +351 -0
  352. package/packages/theming/dist/theme-tray-5L2KGCGD.js.map +7 -0
  353. package/packages/theming/dist/tool.js +405 -0
  354. package/packages/theming/dist/tool.js.map +7 -0
  355. package/packages/theming/package.json +48 -0
  356. package/packages/threepane/dist/IsolatedDocumentArea-LFSDWMIY.js +2 -0
  357. package/packages/threepane/dist/IsolatedDocumentArea-LFSDWMIY.js.map +7 -0
  358. package/packages/threepane/dist/PatchworkFrame-JTNZ6365.js +2 -0
  359. package/packages/threepane/dist/PatchworkFrame-JTNZ6365.js.map +7 -0
  360. package/packages/threepane/dist/chunk-7YXO2YGV.js +2 -0
  361. package/packages/threepane/dist/chunk-7YXO2YGV.js.map +7 -0
  362. package/packages/threepane/dist/chunk-FOMAU6H2.js +972 -0
  363. package/packages/threepane/dist/chunk-FOMAU6H2.js.map +7 -0
  364. package/packages/threepane/dist/chunk-FW4363Y4.js +2 -0
  365. package/packages/threepane/dist/chunk-FW4363Y4.js.map +7 -0
  366. package/packages/threepane/dist/datatypes-FKBTWAO7.js +2 -0
  367. package/packages/threepane/dist/datatypes-FKBTWAO7.js.map +7 -0
  368. package/packages/threepane/dist/index.js +2 -0
  369. package/packages/threepane/dist/index.js.map +7 -0
  370. package/packages/threepane/package.json +42 -0
  371. package/packages/tldraw4/dist/chunk-IKZWERSR.js +38 -0
  372. package/packages/tldraw4/dist/chunk-IKZWERSR.js.map +7 -0
  373. package/packages/tldraw4/dist/chunk-VF5CY24G.js +140894 -0
  374. package/packages/tldraw4/dist/chunk-VF5CY24G.js.map +7 -0
  375. package/packages/tldraw4/dist/datatype.js +46 -0
  376. package/packages/tldraw4/dist/datatype.js.map +7 -0
  377. package/packages/tldraw4/dist/main.css +3202 -0
  378. package/packages/tldraw4/dist/main.css.map +7 -0
  379. package/packages/tldraw4/dist/main.js +42 -0
  380. package/packages/tldraw4/dist/main.js.map +7 -0
  381. package/packages/tldraw4/dist/tool.js +8767 -0
  382. package/packages/tldraw4/dist/tool.js.map +7 -0
  383. package/packages/tldraw4/package.json +62 -0
@@ -0,0 +1,161 @@
1
+ import {
2
+ createAvatar,
3
+ getInitials,
4
+ setAvatarFallback,
5
+ setAvatarImage
6
+ } from "./chunk-MOZI4Y4O.js";
7
+
8
+ // src/ui.ts
9
+ var USER_COLOR_PALETTE = [
10
+ { name: "Sky Blue", value: "hsl(200, 70%, 50%)" },
11
+ { name: "Coral", value: "hsl(10, 75%, 58%)" },
12
+ { name: "Emerald", value: "hsl(145, 70%, 45%)" },
13
+ { name: "Violet", value: "hsl(270, 70%, 55%)" },
14
+ { name: "Amber", value: "hsl(38, 85%, 50%)" },
15
+ { name: "Rose", value: "hsl(350, 70%, 55%)" },
16
+ { name: "Teal", value: "hsl(178, 70%, 45%)" },
17
+ { name: "Indigo", value: "hsl(235, 70%, 58%)" },
18
+ { name: "Lime", value: "hsl(85, 70%, 45%)" },
19
+ { name: "Fuchsia", value: "hsl(310, 70%, 55%)" },
20
+ { name: "Orange", value: "hsl(25, 80%, 52%)" },
21
+ { name: "Cyan", value: "hsl(188, 75%, 48%)" }
22
+ ];
23
+ function generateColorFromString(str) {
24
+ const hash = Math.abs(
25
+ str.split("").reduce((acc, char) => acc + char.charCodeAt(0), 0)
26
+ );
27
+ const colorIndex = hash % USER_COLOR_PALETTE.length;
28
+ return USER_COLOR_PALETTE[colorIndex].value;
29
+ }
30
+
31
+ // src/components/ContactAvatar.ts
32
+ import { getImportableUrlFromAutomergeUrl } from "@inkandswitch/patchwork-filesystem";
33
+
34
+ // ../node_modules/.pnpm/@inkandswitch+patchwork-providers@0.2.2_@automerge+automerge-repo@2.6.0-subduction.39_supports-color@7.2.0_/node_modules/@inkandswitch/patchwork-providers/dist/index.js
35
+ function subscribe(element, selector, listener) {
36
+ const view = element.closest("patchwork-view");
37
+ const dispatchEl = view ?? element;
38
+ const channel = new MessageChannel();
39
+ const port = channel.port2;
40
+ const controller = new AbortController();
41
+ const { signal } = controller;
42
+ port.addEventListener("message", (event) => {
43
+ if (event.data?.type === "change")
44
+ listener(event.data.value);
45
+ }, { signal });
46
+ port.start();
47
+ const detail = {
48
+ selector,
49
+ port: channel.port1
50
+ };
51
+ dispatchEl.dispatchEvent(new CustomEvent("patchwork:subscribe", {
52
+ detail,
53
+ bubbles: true,
54
+ composed: true
55
+ }));
56
+ return () => {
57
+ if (signal.aborted)
58
+ return;
59
+ controller.abort();
60
+ port.postMessage({ type: "unsubscribe" });
61
+ port.close();
62
+ };
63
+ }
64
+
65
+ // src/components/ContactAvatar.ts
66
+ function renderContactAvatar(handle, element) {
67
+ const avatar = createAvatar("default");
68
+ element.appendChild(avatar);
69
+ let selfName = "me";
70
+ const cleanups = [];
71
+ const heartbeats = {};
72
+ let presenceTimer;
73
+ function onEphemeralMessage(message) {
74
+ if (message.senderId) {
75
+ heartbeats[message.senderId] = Date.now();
76
+ }
77
+ updatePresence();
78
+ }
79
+ function updatePresence() {
80
+ const docUrl = handle.url;
81
+ const now = Date.now();
82
+ const timeout = 3e4;
83
+ const isPresent = Object.entries(heartbeats).some(
84
+ ([id, ts]) => id !== selfName && now - ts < timeout
85
+ );
86
+ const contact = handle.doc();
87
+ const userColor = contact && "color" in contact && contact.color ? contact.color : generateColorFromString(docUrl);
88
+ if (isPresent) {
89
+ avatar.classList.add("contact-avatar--present");
90
+ avatar.style.setProperty("--contact-presence-color", userColor);
91
+ } else {
92
+ avatar.classList.remove("contact-avatar--present");
93
+ avatar.style.removeProperty("--contact-presence-color");
94
+ }
95
+ }
96
+ handle.on("ephemeral-message", onEphemeralMessage);
97
+ cleanups.push(() => handle.off("ephemeral-message", onEphemeralMessage));
98
+ presenceTimer = setInterval(updatePresence, 5e3);
99
+ cleanups.push(() => clearInterval(presenceTimer));
100
+ const unsubscribe = subscribe(
101
+ element,
102
+ { type: "patchwork:contact" },
103
+ (contactUrl) => {
104
+ element.repo.find(contactUrl).then((selfHandle) => {
105
+ const selfDoc = selfHandle.doc();
106
+ if (selfDoc?.type === "registered") {
107
+ selfName = selfDoc.name;
108
+ }
109
+ });
110
+ }
111
+ );
112
+ cleanups.push(unsubscribe);
113
+ if (window.accountDocHandle) {
114
+ element.repo.find(window.accountDocHandle.url).then((accountHandle) => {
115
+ const accountDoc = accountHandle.doc();
116
+ if (accountDoc?.contactUrl) {
117
+ element.repo.find(accountDoc.contactUrl).then((selfHandle) => {
118
+ const selfDoc = selfHandle.doc();
119
+ if (selfDoc?.type === "registered") {
120
+ selfName = selfDoc.name;
121
+ }
122
+ });
123
+ }
124
+ });
125
+ }
126
+ async function update() {
127
+ const contact = handle.doc();
128
+ if (!contact) {
129
+ avatar.style.display = "none";
130
+ return;
131
+ }
132
+ avatar.style.display = "";
133
+ const isRegistered = contact.type === "registered";
134
+ const name = isRegistered ? contact.name : "Anonymous";
135
+ let avatarImgUrl;
136
+ if (isRegistered && contact.avatarUrl) {
137
+ try {
138
+ const avatarHandle = await element.repo.find(contact.avatarUrl);
139
+ avatarImgUrl = getImportableUrlFromAutomergeUrl(avatarHandle.url);
140
+ } catch {
141
+ }
142
+ }
143
+ setAvatarImage(avatar, avatarImgUrl, name);
144
+ if (isRegistered && name) {
145
+ setAvatarFallback(avatar, { initials: getInitials(name) });
146
+ } else {
147
+ setAvatarFallback(avatar, { iconSize: 20 });
148
+ }
149
+ updatePresence();
150
+ }
151
+ handle.on("change", update);
152
+ cleanups.push(() => handle.off("change", update));
153
+ update();
154
+ return () => {
155
+ for (const cleanup of cleanups) cleanup();
156
+ };
157
+ }
158
+ export {
159
+ renderContactAvatar
160
+ };
161
+ //# sourceMappingURL=ContactAvatar-FP32ZZH2.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ui.ts", "../src/components/ContactAvatar.ts", "../../node_modules/.pnpm/@inkandswitch+patchwork-providers@0.2.2_@automerge+automerge-repo@2.6.0-subduction.39_supports-color@7.2.0_/node_modules/@inkandswitch/patchwork-providers/dist/index.js"],
4
+ "sourcesContent": ["/**\n * TODO: establish a system for referencing styles that\n * are shared across multiple tools.\n * This palette is also defined in the account-picker.\n *\n * User color palette for presence indicators (cursors, avatars, etc.)\n *\n * Colors are selected to:\n * - Be easily distinguishable from each other\n * - Work well on both light and dark backgrounds\n * - Be accessible and readable\n * - Look professional and modern\n */\nexport const USER_COLOR_PALETTE = [\n { name: \"Sky Blue\", value: \"hsl(200, 70%, 50%)\" },\n { name: \"Coral\", value: \"hsl(10, 75%, 58%)\" },\n { name: \"Emerald\", value: \"hsl(145, 70%, 45%)\" },\n { name: \"Violet\", value: \"hsl(270, 70%, 55%)\" },\n { name: \"Amber\", value: \"hsl(38, 85%, 50%)\" },\n { name: \"Rose\", value: \"hsl(350, 70%, 55%)\" },\n { name: \"Teal\", value: \"hsl(178, 70%, 45%)\" },\n { name: \"Indigo\", value: \"hsl(235, 70%, 58%)\" },\n { name: \"Lime\", value: \"hsl(85, 70%, 45%)\" },\n { name: \"Fuchsia\", value: \"hsl(310, 70%, 55%)\" },\n { name: \"Orange\", value: \"hsl(25, 80%, 52%)\" },\n { name: \"Cyan\", value: \"hsl(188, 75%, 48%)\" },\n] as const;\n\n/**\n * Generate a deterministic color from a string (like userId)\n * Useful for fallback when user hasn't chosen a color\n */\nexport function generateColorFromString(str: string): string {\n const hash = Math.abs(\n str.split(\"\").reduce((acc, char) => acc + char.charCodeAt(0), 0)\n );\n const colorIndex = hash % USER_COLOR_PALETTE.length;\n return USER_COLOR_PALETTE[colorIndex].value;\n}\n", "import type { AutomergeUrl, DocHandle } from \"@automerge/automerge-repo\";\nimport type { ToolElement } from \"@inkandswitch/patchwork-plugins\";\nimport type { ContactDoc } from \"../types\";\nimport { createAvatar, setAvatarImage, setAvatarFallback, getInitials } from \"./Avatar\";\nimport { generateColorFromString } from \"../ui\";\nimport { getImportableUrlFromAutomergeUrl } from \"@inkandswitch/patchwork-filesystem\";\nimport { subscribe } from \"@inkandswitch/patchwork-providers\";\n\ndeclare global {\n interface Window {\n accountDocHandle?: { url: AutomergeUrl };\n }\n}\n\ntype TinyPatchworkLayoutDoc = {\n contactUrl: AutomergeUrl;\n};\n\nexport function renderContactAvatar(\n handle: DocHandle<ContactDoc>,\n element: ToolElement\n) {\n const avatar = createAvatar(\"default\");\n element.appendChild(avatar);\n\n let selfName = \"me\";\n const cleanups: (() => void)[] = [];\n\n // Track presence via ephemeral messages\n const heartbeats: Record<string, number> = {};\n let presenceTimer: ReturnType<typeof setInterval>;\n\n function onEphemeralMessage(message: { senderId: string; message: unknown }) {\n // useRemoteAwareness tracks heartbeats from ephemeral messages\n if (message.senderId) {\n heartbeats[message.senderId] = Date.now();\n }\n updatePresence();\n }\n\n function updatePresence() {\n const docUrl = handle.url;\n const now = Date.now();\n const timeout = 30000;\n const isPresent = Object.entries(heartbeats).some(\n ([id, ts]) => id !== selfName && now - ts < timeout\n );\n\n const contact = handle.doc();\n const userColor =\n contact && \"color\" in contact && contact.color\n ? contact.color\n : generateColorFromString(docUrl);\n\n if (isPresent) {\n avatar.classList.add(\"contact-avatar--present\");\n avatar.style.setProperty(\"--contact-presence-color\", userColor);\n } else {\n avatar.classList.remove(\"contact-avatar--present\");\n avatar.style.removeProperty(\"--contact-presence-color\");\n }\n }\n\n handle.on(\"ephemeral-message\", onEphemeralMessage);\n cleanups.push(() => handle.off(\"ephemeral-message\", onEphemeralMessage));\n\n // Periodically clean up stale heartbeats\n presenceTimer = setInterval(updatePresence, 5000);\n cleanups.push(() => clearInterval(presenceTimer));\n\n // Get own contact via provider subscription\n const unsubscribe = subscribe<string>(\n element,\n { type: \"patchwork:contact\" },\n (contactUrl) => {\n element.repo\n .find<ContactDoc>(contactUrl as AutomergeUrl)\n .then((selfHandle) => {\n const selfDoc = selfHandle.doc();\n if (selfDoc?.type === \"registered\") {\n selfName = selfDoc.name;\n }\n });\n }\n );\n cleanups.push(unsubscribe);\n\n // Fallback: use window.accountDocHandle\n if (window.accountDocHandle) {\n element.repo\n .find<TinyPatchworkLayoutDoc>(window.accountDocHandle.url)\n .then((accountHandle) => {\n const accountDoc = accountHandle.doc();\n if (accountDoc?.contactUrl) {\n element.repo\n .find<ContactDoc>(accountDoc.contactUrl)\n .then((selfHandle) => {\n const selfDoc = selfHandle.doc();\n if (selfDoc?.type === \"registered\") {\n selfName = selfDoc.name;\n }\n });\n }\n });\n }\n\n async function update() {\n const contact = handle.doc();\n if (!contact) {\n avatar.style.display = \"none\";\n return;\n }\n avatar.style.display = \"\";\n\n const isRegistered = contact.type === \"registered\";\n const name = isRegistered ? contact.name : \"Anonymous\";\n\n // avatar image\n let avatarImgUrl: string | undefined;\n if (isRegistered && contact.avatarUrl) {\n try {\n const avatarHandle = await element.repo.find(contact.avatarUrl);\n avatarImgUrl = getImportableUrlFromAutomergeUrl(avatarHandle.url);\n } catch {\n // ignore failed avatar lookup\n }\n }\n setAvatarImage(avatar, avatarImgUrl, name);\n\n // fallback\n if (isRegistered && name) {\n setAvatarFallback(avatar, { initials: getInitials(name) });\n } else {\n setAvatarFallback(avatar, { iconSize: 20 });\n }\n\n updatePresence();\n }\n\n handle.on(\"change\", update);\n cleanups.push(() => handle.off(\"change\", update));\n update();\n\n return () => {\n for (const cleanup of cleanups) cleanup();\n };\n}\n", "/**\n * Open a streaming subscription. Dispatches a `patchwork:subscribe` for the\n * given `selector` carrying a fresh `MessageChannel` port; the answering\n * provider pushes values back over that channel for as long as the\n * subscription is live. `listener` is invoked once per emission (the first\n * delivery is always async because `MessagePort.postMessage` queues a task).\n *\n * The event is dispatched from the nearest enclosing `<patchwork-view>` so\n * callers can pass any node inside a provider subtree. An unclaimed\n * subscription is never settled: if no provider answers, `listener` simply\n * never fires.\n *\n * Returns an unsubscribe function. Calling it tells the provider to tear down\n * (via an `unsubscribe` message) and closes the consumer's port; any values\n * the provider emits after that are dropped.\n */\nexport function subscribe(element, selector, listener) {\n const view = element.closest(\"patchwork-view\");\n const dispatchEl = view ?? element;\n const channel = new MessageChannel();\n const port = channel.port2;\n const controller = new AbortController();\n const { signal } = controller;\n port.addEventListener(\"message\", (event) => {\n if (event.data?.type === \"change\")\n listener(event.data.value);\n }, { signal });\n // addEventListener (unlike assigning onmessage) does not implicitly start\n // the port, so message delivery has to be kicked off explicitly.\n port.start();\n const detail = {\n selector,\n port: channel.port1,\n };\n dispatchEl.dispatchEvent(new CustomEvent(\"patchwork:subscribe\", {\n detail,\n bubbles: true,\n composed: true,\n }));\n return () => {\n if (signal.aborted)\n return;\n controller.abort();\n port.postMessage({ type: \"unsubscribe\" });\n port.close();\n };\n}\n/**\n * Answer a `patchwork:subscribe`. The `producer` receives a `respond`\n * callback it can call any number of times to push values to the consumer,\n * and may return a teardown that runs when the consumer unsubscribes. Stops\n * propagation so ancestor providers don't double-answer. Values emitted after\n * the consumer unsubscribes are dropped.\n */\nexport function accept(event, producer) {\n event.stopPropagation();\n const port = event.detail.port;\n let alive = true;\n const respond = (value) => {\n if (!alive)\n return;\n port.postMessage({ type: \"change\", value });\n };\n let teardown;\n try {\n teardown = producer(respond);\n }\n catch (err) {\n console.error(\"[patchwork-providers] subscribe producer threw:\", err);\n }\n const stop = () => {\n if (!alive)\n return;\n alive = false;\n try {\n teardown?.();\n }\n catch (err) {\n console.error(\"[patchwork-providers] subscribe teardown threw:\", err);\n }\n port.close();\n };\n port.onmessage = (event) => {\n if (event.data?.type === \"unsubscribe\")\n stop();\n };\n}\n/**\n * One-shot convenience wrapper over {@link subscribe}: opens a subscription\n * for `selector`, resolves with the first value a provider emits, then\n * immediately unsubscribes. Because there is no fallback provider, an\n * unclaimed selector never resolves \u2014 use `subscribe` directly if you need to\n * handle the \"no provider\" case.\n */\nexport function request(element, selector) {\n return new Promise((resolve) => {\n const unsubscribe = subscribe(element, selector, (value) => {\n // The first emission is always async (postMessage queues a task), so\n // `unsubscribe` is assigned by the time this fires.\n unsubscribe();\n resolve(value);\n });\n });\n}\nexport { registerRepoProviderElement, } from \"./repo-provider.js\";\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,60 @@
1
+ import {
2
+ createAvatar,
3
+ getInitials,
4
+ setAvatarFallback,
5
+ setAvatarImage
6
+ } from "./chunk-MOZI4Y4O.js";
7
+
8
+ // src/components/ContactViewer.ts
9
+ import { automergeUrlToServiceWorkerUrl } from "@inkandswitch/patchwork-filesystem";
10
+ function renderContactViewer(handle, element) {
11
+ const wrapper = document.createElement("div");
12
+ wrapper.className = "contact-viewer";
13
+ const avatar = createAvatar("lg");
14
+ const nameEl = document.createElement("h2");
15
+ nameEl.className = "contact-viewer-name";
16
+ const labelEl = document.createElement("p");
17
+ labelEl.className = "contact-viewer-label";
18
+ labelEl.textContent = "Unregistered user";
19
+ wrapper.append(avatar, nameEl);
20
+ element.appendChild(wrapper);
21
+ async function update() {
22
+ const contact = handle.doc();
23
+ if (!contact) {
24
+ wrapper.style.display = "none";
25
+ return;
26
+ }
27
+ wrapper.style.display = "";
28
+ const isRegistered = contact.type === "registered";
29
+ const name = isRegistered ? contact.name : "Anonymous";
30
+ nameEl.textContent = name;
31
+ let avatarImgUrl;
32
+ if (isRegistered && contact.avatarUrl) {
33
+ try {
34
+ const avatarHandle = await element.repo.find(contact.avatarUrl);
35
+ avatarImgUrl = automergeUrlToServiceWorkerUrl(avatarHandle.url);
36
+ } catch {
37
+ }
38
+ }
39
+ setAvatarImage(avatar, avatarImgUrl, name);
40
+ if (isRegistered && name) {
41
+ setAvatarFallback(avatar, { initials: getInitials(name) });
42
+ } else {
43
+ setAvatarFallback(avatar, { iconSize: 32 });
44
+ }
45
+ if (!isRegistered) {
46
+ if (!wrapper.contains(labelEl)) wrapper.appendChild(labelEl);
47
+ } else {
48
+ labelEl.remove();
49
+ }
50
+ }
51
+ handle.on("change", update);
52
+ update();
53
+ return () => {
54
+ handle.off("change", update);
55
+ };
56
+ }
57
+ export {
58
+ renderContactViewer
59
+ };
60
+ //# sourceMappingURL=ContactViewer-ZHEE6INW.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/ContactViewer.ts"],
4
+ "sourcesContent": ["import type { DocHandle } from \"@automerge/automerge-repo\";\nimport type { ToolElement } from \"@inkandswitch/patchwork-plugins\";\nimport type { ContactDoc } from \"../types\";\nimport { createAvatar, setAvatarImage, setAvatarFallback, getInitials } from \"./Avatar\";\nimport { automergeUrlToServiceWorkerUrl } from \"@inkandswitch/patchwork-filesystem\";\n\nexport function renderContactViewer(\n handle: DocHandle<ContactDoc>,\n element: ToolElement\n) {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"contact-viewer\";\n\n const avatar = createAvatar(\"lg\");\n const nameEl = document.createElement(\"h2\");\n nameEl.className = \"contact-viewer-name\";\n const labelEl = document.createElement(\"p\");\n labelEl.className = \"contact-viewer-label\";\n labelEl.textContent = \"Unregistered user\";\n\n wrapper.append(avatar, nameEl);\n element.appendChild(wrapper);\n\n async function update() {\n const contact = handle.doc();\n if (!contact) {\n wrapper.style.display = \"none\";\n return;\n }\n wrapper.style.display = \"\";\n\n const isRegistered = contact.type === \"registered\";\n const name = isRegistered ? contact.name : \"Anonymous\";\n\n nameEl.textContent = name;\n\n // avatar image\n let avatarImgUrl: string | undefined;\n if (isRegistered && contact.avatarUrl) {\n try {\n const avatarHandle = await element.repo.find(contact.avatarUrl);\n avatarImgUrl = automergeUrlToServiceWorkerUrl(avatarHandle.url);\n } catch {\n // ignore failed avatar lookup\n }\n }\n setAvatarImage(avatar, avatarImgUrl, name);\n\n // fallback\n if (isRegistered && name) {\n setAvatarFallback(avatar, { initials: getInitials(name) });\n } else {\n setAvatarFallback(avatar, { iconSize: 32 });\n }\n\n // label\n if (!isRegistered) {\n if (!wrapper.contains(labelEl)) wrapper.appendChild(labelEl);\n } else {\n labelEl.remove();\n }\n }\n\n handle.on(\"change\", update);\n update();\n\n return () => {\n handle.off(\"change\", update);\n };\n}\n"],
5
+ "mappings": ";;;;;;;;AAIA,SAAS,sCAAsC;AAExC,SAAS,oBACd,QACA,SACA;AACA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAEpB,QAAM,SAAS,aAAa,IAAI;AAChC,QAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,SAAO,YAAY;AACnB,QAAM,UAAU,SAAS,cAAc,GAAG;AAC1C,UAAQ,YAAY;AACpB,UAAQ,cAAc;AAEtB,UAAQ,OAAO,QAAQ,MAAM;AAC7B,UAAQ,YAAY,OAAO;AAE3B,iBAAe,SAAS;AACtB,UAAM,UAAU,OAAO,IAAI;AAC3B,QAAI,CAAC,SAAS;AACZ,cAAQ,MAAM,UAAU;AACxB;AAAA,IACF;AACA,YAAQ,MAAM,UAAU;AAExB,UAAM,eAAe,QAAQ,SAAS;AACtC,UAAM,OAAO,eAAe,QAAQ,OAAO;AAE3C,WAAO,cAAc;AAGrB,QAAI;AACJ,QAAI,gBAAgB,QAAQ,WAAW;AACrC,UAAI;AACF,cAAM,eAAe,MAAM,QAAQ,KAAK,KAAK,QAAQ,SAAS;AAC9D,uBAAe,+BAA+B,aAAa,GAAG;AAAA,MAChE,QAAQ;AAAA,MAER;AAAA,IACF;AACA,mBAAe,QAAQ,cAAc,IAAI;AAGzC,QAAI,gBAAgB,MAAM;AACxB,wBAAkB,QAAQ,EAAE,UAAU,YAAY,IAAI,EAAE,CAAC;AAAA,IAC3D,OAAO;AACL,wBAAkB,QAAQ,EAAE,UAAU,GAAG,CAAC;AAAA,IAC5C;AAGA,QAAI,CAAC,cAAc;AACjB,UAAI,CAAC,QAAQ,SAAS,OAAO,EAAG,SAAQ,YAAY,OAAO;AAAA,IAC7D,OAAO;AACL,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF;AAEA,SAAO,GAAG,UAAU,MAAM;AAC1B,SAAO;AAEP,SAAO,MAAM;AACX,WAAO,IAAI,UAAU,MAAM;AAAA,EAC7B;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,46 @@
1
+ import {
2
+ createAvatar,
3
+ getInitials,
4
+ setAvatarFallback,
5
+ setAvatarImage
6
+ } from "./chunk-MOZI4Y4O.js";
7
+
8
+ // src/components/InlineContactAvatar.ts
9
+ import { automergeUrlToServiceWorkerUrl } from "@inkandswitch/patchwork-filesystem";
10
+ function renderInlineContactAvatar(handle, element) {
11
+ const avatar = createAvatar("sm");
12
+ element.appendChild(avatar);
13
+ async function update() {
14
+ const contact = handle.doc();
15
+ if (!contact) {
16
+ avatar.style.display = "none";
17
+ return;
18
+ }
19
+ avatar.style.display = "";
20
+ const isRegistered = contact.type === "registered";
21
+ const name = isRegistered ? contact.name : "Anonymous";
22
+ let avatarImgUrl;
23
+ if (isRegistered && contact.avatarUrl) {
24
+ try {
25
+ const avatarHandle = await element.repo.find(contact.avatarUrl);
26
+ avatarImgUrl = automergeUrlToServiceWorkerUrl(avatarHandle.url);
27
+ } catch {
28
+ }
29
+ }
30
+ setAvatarImage(avatar, avatarImgUrl, name);
31
+ if (isRegistered && name) {
32
+ setAvatarFallback(avatar, { initials: getInitials(name) });
33
+ } else {
34
+ setAvatarFallback(avatar, { iconSize: 16 });
35
+ }
36
+ }
37
+ handle.on("change", update);
38
+ update();
39
+ return () => {
40
+ handle.off("change", update);
41
+ };
42
+ }
43
+ export {
44
+ renderInlineContactAvatar
45
+ };
46
+ //# sourceMappingURL=InlineContactAvatar-VZDPEZV2.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/InlineContactAvatar.ts"],
4
+ "sourcesContent": ["import type { DocHandle } from \"@automerge/automerge-repo\";\nimport type { ToolElement } from \"@inkandswitch/patchwork-plugins\";\nimport type { ContactDoc } from \"../types\";\nimport { createAvatar, setAvatarImage, setAvatarFallback, getInitials } from \"./Avatar\";\nimport { automergeUrlToServiceWorkerUrl } from \"@inkandswitch/patchwork-filesystem\";\n\nexport function renderInlineContactAvatar(\n handle: DocHandle<ContactDoc>,\n element: ToolElement\n) {\n const avatar = createAvatar(\"sm\");\n element.appendChild(avatar);\n\n async function update() {\n const contact = handle.doc();\n if (!contact) {\n avatar.style.display = \"none\";\n return;\n }\n avatar.style.display = \"\";\n\n const isRegistered = contact.type === \"registered\";\n const name = isRegistered ? contact.name : \"Anonymous\";\n\n // avatar image\n let avatarImgUrl: string | undefined;\n if (isRegistered && contact.avatarUrl) {\n try {\n const avatarHandle = await element.repo.find(contact.avatarUrl);\n avatarImgUrl = automergeUrlToServiceWorkerUrl(avatarHandle.url);\n } catch {\n // ignore failed avatar lookup\n }\n }\n setAvatarImage(avatar, avatarImgUrl, name);\n\n // fallback\n if (isRegistered && name) {\n setAvatarFallback(avatar, { initials: getInitials(name) });\n } else {\n setAvatarFallback(avatar, { iconSize: 16 });\n }\n }\n\n handle.on(\"change\", update);\n update();\n\n return () => {\n handle.off(\"change\", update);\n };\n}\n"],
5
+ "mappings": ";;;;;;;;AAIA,SAAS,sCAAsC;AAExC,SAAS,0BACd,QACA,SACA;AACA,QAAM,SAAS,aAAa,IAAI;AAChC,UAAQ,YAAY,MAAM;AAE1B,iBAAe,SAAS;AACtB,UAAM,UAAU,OAAO,IAAI;AAC3B,QAAI,CAAC,SAAS;AACZ,aAAO,MAAM,UAAU;AACvB;AAAA,IACF;AACA,WAAO,MAAM,UAAU;AAEvB,UAAM,eAAe,QAAQ,SAAS;AACtC,UAAM,OAAO,eAAe,QAAQ,OAAO;AAG3C,QAAI;AACJ,QAAI,gBAAgB,QAAQ,WAAW;AACrC,UAAI;AACF,cAAM,eAAe,MAAM,QAAQ,KAAK,KAAK,QAAQ,SAAS;AAC9D,uBAAe,+BAA+B,aAAa,GAAG;AAAA,MAChE,QAAQ;AAAA,MAER;AAAA,IACF;AACA,mBAAe,QAAQ,cAAc,IAAI;AAGzC,QAAI,gBAAgB,MAAM;AACxB,wBAAkB,QAAQ,EAAE,UAAU,YAAY,IAAI,EAAE,CAAC;AAAA,IAC3D,OAAO;AACL,wBAAkB,QAAQ,EAAE,UAAU,GAAG,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,GAAG,UAAU,MAAM;AAC1B,SAAO;AAEP,SAAO,MAAM;AACX,WAAO,IAAI,UAAU,MAAM;AAAA,EAC7B;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,54 @@
1
+ // src/components/Avatar.ts
2
+ var sizeClass = {
3
+ default: "",
4
+ sm: "contact-avatar--sm",
5
+ lg: "contact-avatar--lg"
6
+ };
7
+ var USER_ICON_SVGS = {
8
+ 16: `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>`,
9
+ 20: `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>`,
10
+ 32: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>`
11
+ };
12
+ function createAvatar(size = "default") {
13
+ const root = document.createElement("span");
14
+ root.className = ["contact-avatar", sizeClass[size]].filter(Boolean).join(" ");
15
+ return root;
16
+ }
17
+ function setAvatarImage(root, src, alt) {
18
+ let img = root.querySelector(".contact-avatar-image");
19
+ if (src) {
20
+ if (!img) {
21
+ img = document.createElement("img");
22
+ img.className = "contact-avatar-image";
23
+ root.prepend(img);
24
+ }
25
+ img.src = src;
26
+ img.alt = alt;
27
+ } else if (img) {
28
+ img.remove();
29
+ }
30
+ }
31
+ function setAvatarFallback(root, content) {
32
+ let fallback = root.querySelector(".contact-avatar-fallback");
33
+ if (!fallback) {
34
+ fallback = document.createElement("span");
35
+ fallback.className = "contact-avatar-fallback";
36
+ root.appendChild(fallback);
37
+ }
38
+ if ("initials" in content) {
39
+ fallback.textContent = content.initials;
40
+ } else {
41
+ fallback.innerHTML = USER_ICON_SVGS[content.iconSize] ?? USER_ICON_SVGS[20];
42
+ }
43
+ }
44
+ function getInitials(name) {
45
+ return name.split(" ").map((word) => word[0]).join("");
46
+ }
47
+
48
+ export {
49
+ createAvatar,
50
+ setAvatarImage,
51
+ setAvatarFallback,
52
+ getInitials
53
+ };
54
+ //# sourceMappingURL=chunk-MOZI4Y4O.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/Avatar.ts"],
4
+ "sourcesContent": ["export type AvatarSize = \"default\" | \"sm\" | \"lg\";\n\nconst sizeClass: Record<AvatarSize, string> = {\n default: \"\",\n sm: \"contact-avatar--sm\",\n lg: \"contact-avatar--lg\",\n};\n\nconst USER_ICON_SVGS: Record<number, string> = {\n 16: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/></svg>`,\n 20: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/></svg>`,\n 32: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/></svg>`,\n};\n\nexport function createAvatar(size: AvatarSize = \"default\"): HTMLElement {\n const root = document.createElement(\"span\");\n root.className = [\"contact-avatar\", sizeClass[size]]\n .filter(Boolean)\n .join(\" \");\n return root;\n}\n\nexport function setAvatarImage(\n root: HTMLElement,\n src: string | undefined,\n alt: string\n) {\n let img = root.querySelector<HTMLImageElement>(\".contact-avatar-image\");\n if (src) {\n if (!img) {\n img = document.createElement(\"img\");\n img.className = \"contact-avatar-image\";\n root.prepend(img);\n }\n img.src = src;\n img.alt = alt;\n } else if (img) {\n img.remove();\n }\n}\n\nexport function setAvatarFallback(\n root: HTMLElement,\n content: { initials: string } | { iconSize: number }\n) {\n let fallback = root.querySelector<HTMLElement>(\".contact-avatar-fallback\");\n if (!fallback) {\n fallback = document.createElement(\"span\");\n fallback.className = \"contact-avatar-fallback\";\n root.appendChild(fallback);\n }\n if (\"initials\" in content) {\n fallback.textContent = content.initials;\n } else {\n fallback.innerHTML = USER_ICON_SVGS[content.iconSize] ?? USER_ICON_SVGS[20];\n }\n}\n\nexport function getInitials(name: string): string {\n return name\n .split(\" \")\n .map((word) => word[0])\n .join(\"\");\n}\n"],
5
+ "mappings": ";AAEA,IAAM,YAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,iBAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,SAAS,aAAa,OAAmB,WAAwB;AACtE,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,YAAY,CAAC,kBAAkB,UAAU,IAAI,CAAC,EAChD,OAAO,OAAO,EACd,KAAK,GAAG;AACX,SAAO;AACT;AAEO,SAAS,eACd,MACA,KACA,KACA;AACA,MAAI,MAAM,KAAK,cAAgC,uBAAuB;AACtE,MAAI,KAAK;AACP,QAAI,CAAC,KAAK;AACR,YAAM,SAAS,cAAc,KAAK;AAClC,UAAI,YAAY;AAChB,WAAK,QAAQ,GAAG;AAAA,IAClB;AACA,QAAI,MAAM;AACV,QAAI,MAAM;AAAA,EACZ,WAAW,KAAK;AACd,QAAI,OAAO;AAAA,EACb;AACF;AAEO,SAAS,kBACd,MACA,SACA;AACA,MAAI,WAAW,KAAK,cAA2B,0BAA0B;AACzE,MAAI,CAAC,UAAU;AACb,eAAW,SAAS,cAAc,MAAM;AACxC,aAAS,YAAY;AACrB,SAAK,YAAY,QAAQ;AAAA,EAC3B;AACA,MAAI,cAAc,SAAS;AACzB,aAAS,cAAc,QAAQ;AAAA,EACjC,OAAO;AACL,aAAS,YAAY,eAAe,QAAQ,QAAQ,KAAK,eAAe,EAAE;AAAA,EAC5E;AACF;AAEO,SAAS,YAAY,MAAsB;AAChD,SAAO,KACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,EACrB,KAAK,EAAE;AACZ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,27 @@
1
+ // src/datatype.ts
2
+ var init = (doc) => {
3
+ Object.assign(doc, {
4
+ type: "anonymous"
5
+ });
6
+ };
7
+ var getTitle = (doc) => {
8
+ if (doc.type === "registered") {
9
+ return doc.name;
10
+ }
11
+ return "Anonymous";
12
+ };
13
+ var setTitle = (doc, title) => {
14
+ if (doc.type === "registered") {
15
+ doc.name = title;
16
+ }
17
+ };
18
+ var ContactDatatype = {
19
+ init,
20
+ getTitle,
21
+ setTitle
22
+ };
23
+ export {
24
+ ContactDatatype,
25
+ init
26
+ };
27
+ //# sourceMappingURL=datatype-ABVDVPWS.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/datatype.ts"],
4
+ "sourcesContent": ["import { type DatatypeImplementation } from \"@inkandswitch/patchwork-plugins\";\nimport type { ContactDoc } from \"./types\";\n\nexport const init = (doc: ContactDoc) => {\n Object.assign(doc, {\n type: \"anonymous\",\n } as ContactDoc);\n};\n\nconst getTitle = (doc: ContactDoc) => {\n if (doc.type === \"registered\") {\n return doc.name;\n }\n return \"Anonymous\";\n};\n\nconst setTitle = (doc: ContactDoc, title: string) => {\n if (doc.type === \"registered\") {\n doc.name = title;\n }\n};\n\nexport const ContactDatatype: DatatypeImplementation<ContactDoc> = {\n init,\n getTitle,\n setTitle,\n};\n"],
5
+ "mappings": ";AAGO,IAAM,OAAO,CAAC,QAAoB;AACvC,SAAO,OAAO,KAAK;AAAA,IACjB,MAAM;AAAA,EACR,CAAe;AACjB;AAEA,IAAM,WAAW,CAAC,QAAoB;AACpC,MAAI,IAAI,SAAS,cAAc;AAC7B,WAAO,IAAI;AAAA,EACb;AACA,SAAO;AACT;AAEA,IAAM,WAAW,CAAC,KAAiB,UAAkB;AACnD,MAAI,IAAI,SAAS,cAAc;AAC7B,QAAI,OAAO;AAAA,EACb;AACF;AAEO,IAAM,kBAAsD;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,81 @@
1
+ /* src/styles.css */
2
+ @layer package {
3
+ :root,
4
+ :host,
5
+ [theme] {
6
+ --contact-fg: var(--editor-line, black);
7
+ --contact-muted-fg: var(--editor-line-offset-50, #999);
8
+ --contact-border: var(--editor-fill-offset-10, #e5e5e5);
9
+ --contact-fallback-bg: var(--editor-fill-offset-20, #ccc);
10
+ --contact-fallback-fg: var(--editor-line-offset-30, #4d4d4d);
11
+ }
12
+ }
13
+ .contact-avatar {
14
+ position: relative;
15
+ display: inline-flex;
16
+ flex-shrink: 0;
17
+ overflow: hidden;
18
+ border-radius: 9999px;
19
+ border: 1px solid var(--contact-border);
20
+ min-width: 2rem;
21
+ min-height: 2rem;
22
+ max-width: 2rem;
23
+ max-height: 2rem;
24
+ height: 100%;
25
+ width: 100%;
26
+ }
27
+ .contact-avatar--sm {
28
+ min-width: initial;
29
+ min-height: initial;
30
+ max-width: initial;
31
+ max-height: initial;
32
+ width: 1.5rem;
33
+ height: 1.5rem;
34
+ }
35
+ .contact-avatar--lg {
36
+ min-width: initial;
37
+ min-height: initial;
38
+ max-width: initial;
39
+ max-height: initial;
40
+ width: 64px;
41
+ height: 64px;
42
+ }
43
+ .contact-avatar--present {
44
+ box-shadow: 0 0 0 2px var(--contact-presence-color);
45
+ }
46
+ .contact-avatar-image {
47
+ position: absolute;
48
+ inset: 0;
49
+ z-index: 1;
50
+ width: 100%;
51
+ height: 100%;
52
+ object-fit: cover;
53
+ }
54
+ .contact-avatar-fallback {
55
+ position: absolute;
56
+ inset: 0;
57
+ display: flex;
58
+ align-items: center;
59
+ justify-content: center;
60
+ border-radius: 9999px;
61
+ background: var(--contact-fallback-bg);
62
+ color: var(--contact-fallback-fg);
63
+ }
64
+ .contact-viewer {
65
+ display: flex;
66
+ flex-direction: column;
67
+ align-items: center;
68
+ gap: 0.5rem;
69
+ color: var(--contact-fg);
70
+ }
71
+ .contact-viewer-name {
72
+ margin: 0;
73
+ font-size: 1.25rem;
74
+ font-weight: 600;
75
+ }
76
+ .contact-viewer-label {
77
+ margin: 0;
78
+ font-size: 0.875rem;
79
+ color: var(--contact-muted-fg);
80
+ }
81
+ /*# sourceMappingURL=tool.css.map */
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/styles.css"],
4
+ "sourcesContent": ["@layer package {\n:root,\n:host,\n[theme] {\n --contact-fg: var(--editor-line, black);\n --contact-muted-fg: var(--editor-line-offset-50, #999);\n --contact-border: var(--editor-fill-offset-10, #e5e5e5);\n --contact-fallback-bg: var(--editor-fill-offset-20, #ccc);\n --contact-fallback-fg: var(--editor-line-offset-30, #4d4d4d);\n}\n}\n\n/* Avatar */\n\n.contact-avatar {\n position: relative;\n display: inline-flex;\n flex-shrink: 0;\n overflow: hidden;\n border-radius: 9999px;\n border: 1px solid var(--contact-border);\n min-width: 2rem;\n min-height: 2rem;\n max-width: 2rem;\n max-height: 2rem;\n height: 100%;\n width: 100%;\n}\n\n.contact-avatar--sm {\n min-width: initial;\n min-height: initial;\n max-width: initial;\n max-height: initial;\n width: 1.5rem;\n height: 1.5rem;\n}\n\n.contact-avatar--lg {\n min-width: initial;\n min-height: initial;\n max-width: initial;\n max-height: initial;\n width: 64px;\n height: 64px;\n}\n\n.contact-avatar--present {\n box-shadow: 0 0 0 2px var(--contact-presence-color);\n}\n\n.contact-avatar-image {\n position: absolute;\n inset: 0;\n z-index: 1;\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.contact-avatar-fallback {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 9999px;\n background: var(--contact-fallback-bg);\n color: var(--contact-fallback-fg);\n}\n\n/* Contact Viewer */\n\n.contact-viewer {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.5rem;\n color: var(--contact-fg);\n}\n\n.contact-viewer-name {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n}\n\n.contact-viewer-label {\n margin: 0;\n font-size: 0.875rem;\n color: var(--contact-muted-fg);\n}\n"],
5
+ "mappings": ";AAAA;AACA;AAAA,EACA;AAAA,EACA,CAAC;AACC,kBAAc,IAAI,aAAa,EAAE;AACjC,wBAAoB,IAAI,uBAAuB,EAAE;AACjD,sBAAkB,IAAI,uBAAuB,EAAE;AAC/C,2BAAuB,IAAI,uBAAuB,EAAE;AACpD,2BAAuB,IAAI,uBAAuB,EAAE;AACtD;AACA;AAIA,CAAC;AACC,YAAU;AACV,WAAS;AACT,eAAa;AACb,YAAU;AACV,iBAAe;AACf,UAAQ,IAAI,MAAM,IAAI;AACtB,aAAW;AACX,cAAY;AACZ,aAAW;AACX,cAAY;AACZ,UAAQ;AACR,SAAO;AACT;AAEA,CAAC;AACC,aAAW;AACX,cAAY;AACZ,aAAW;AACX,cAAY;AACZ,SAAO;AACP,UAAQ;AACV;AAEA,CAAC;AACC,aAAW;AACX,cAAY;AACZ,aAAW;AACX,cAAY;AACZ,SAAO;AACP,UAAQ;AACV;AAEA,CAAC;AACC,cAAY,EAAE,EAAE,EAAE,IAAI,IAAI;AAC5B;AAEA,CAAC;AACC,YAAU;AACV,SAAO;AACP,WAAS;AACT,SAAO;AACP,UAAQ;AACR,cAAY;AACd;AAEA,CAAC;AACC,YAAU;AACV,SAAO;AACP,WAAS;AACT,eAAa;AACb,mBAAiB;AACjB,iBAAe;AACf,cAAY,IAAI;AAChB,SAAO,IAAI;AACb;AAIA,CAAC;AACC,WAAS;AACT,kBAAgB;AAChB,eAAa;AACb,OAAK;AACL,SAAO,IAAI;AACb;AAEA,CAAC;AACC,UAAQ;AACR,aAAW;AACX,eAAa;AACf;AAEA,CAAC;AACC,UAAQ;AACR,aAAW;AACX,SAAO,IAAI;AACb;",
6
+ "names": []
7
+ }
@@ -0,0 +1,70 @@
1
+ // src/tool.ts
2
+ function addStyles(element, textContent) {
3
+ const id = "contact-styles";
4
+ const el = element.querySelector(`#${id}`) ?? document.createElement("style");
5
+ Object.assign(el, { textContent, id });
6
+ element.append(el);
7
+ }
8
+ async function loadStyles() {
9
+ const url = new URL("./tool.css", import.meta.url);
10
+ return (await fetch(url)).text();
11
+ }
12
+ var plugins = [
13
+ {
14
+ type: "patchwork:datatype",
15
+ id: "contact",
16
+ name: "Contact",
17
+ icon: "User",
18
+ unlisted: true,
19
+ async load() {
20
+ const { ContactDatatype } = await import("./datatype-ABVDVPWS.js");
21
+ return ContactDatatype;
22
+ }
23
+ },
24
+ {
25
+ type: "patchwork:tool",
26
+ id: "contact",
27
+ name: "Contact Viewer",
28
+ supportedDatatypes: ["contact"],
29
+ async load() {
30
+ const { renderContactViewer } = await import("./ContactViewer-ZHEE6INW.js");
31
+ const css = await loadStyles();
32
+ return (handle, element) => {
33
+ addStyles(document.head, css);
34
+ return renderContactViewer(handle, element);
35
+ };
36
+ }
37
+ },
38
+ {
39
+ type: "patchwork:tool",
40
+ id: "contact-avatar",
41
+ name: "Contact Avatar",
42
+ supportedDatatypes: ["contact"],
43
+ async load() {
44
+ const { renderContactAvatar } = await import("./ContactAvatar-FP32ZZH2.js");
45
+ const css = await loadStyles();
46
+ return (handle, element) => {
47
+ addStyles(document.head, css);
48
+ return renderContactAvatar(handle, element);
49
+ };
50
+ }
51
+ },
52
+ {
53
+ type: "patchwork:tool",
54
+ id: "contact-inline",
55
+ name: "Inline Contact Avatar",
56
+ supportedDatatypes: ["contact"],
57
+ async load() {
58
+ const { renderInlineContactAvatar } = await import("./InlineContactAvatar-VZDPEZV2.js");
59
+ const css = await loadStyles();
60
+ return (handle, element) => {
61
+ addStyles(document.head, css);
62
+ return renderInlineContactAvatar(handle, element);
63
+ };
64
+ }
65
+ }
66
+ ];
67
+ export {
68
+ plugins
69
+ };
70
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/tool.ts"],
4
+ "sourcesContent": ["import type { ToolImplementation } from \"@inkandswitch/patchwork-plugins\";\nimport \"./styles.css\";\n\nfunction addStyles(element: HTMLElement, textContent: string) {\n const id = \"contact-styles\";\n const el = element.querySelector(`#${id}`) ?? document.createElement(\"style\");\n Object.assign(el, { textContent, id });\n element.append(el);\n}\n\nasync function loadStyles() {\n const url = new URL(\"./tool.css\", import.meta.url);\n return (await fetch(url)).text();\n}\n\nexport const plugins = [\n {\n type: \"patchwork:datatype\",\n id: \"contact\",\n name: \"Contact\",\n icon: \"User\",\n unlisted: true,\n async load() {\n const { ContactDatatype } = await import(\"./datatype\");\n return ContactDatatype;\n },\n },\n {\n type: \"patchwork:tool\",\n id: \"contact\",\n name: \"Contact Viewer\",\n supportedDatatypes: [\"contact\"],\n async load(): Promise<ToolImplementation> {\n const { renderContactViewer } =\n await import(\"./components/ContactViewer\");\n const css = await loadStyles();\n return (handle, element) => {\n addStyles(document.head, css);\n return renderContactViewer(handle, element);\n };\n },\n },\n {\n type: \"patchwork:tool\",\n id: \"contact-avatar\",\n name: \"Contact Avatar\",\n supportedDatatypes: [\"contact\"],\n async load(): Promise<ToolImplementation> {\n const { renderContactAvatar } =\n await import(\"./components/ContactAvatar\");\n const css = await loadStyles();\n return (handle, element) => {\n addStyles(document.head, css);\n return renderContactAvatar(handle, element);\n };\n },\n },\n {\n type: \"patchwork:tool\",\n id: \"contact-inline\",\n name: \"Inline Contact Avatar\",\n supportedDatatypes: [\"contact\"],\n async load(): Promise<ToolImplementation> {\n const { renderInlineContactAvatar } =\n await import(\"./components/InlineContactAvatar\");\n const css = await loadStyles();\n return (handle, element) => {\n addStyles(document.head, css);\n return renderInlineContactAvatar(handle, element);\n };\n },\n },\n];\n"],
5
+ "mappings": ";AAGA,SAAS,UAAU,SAAsB,aAAqB;AAC5D,QAAM,KAAK;AACX,QAAM,KAAK,QAAQ,cAAc,IAAI,EAAE,EAAE,KAAK,SAAS,cAAc,OAAO;AAC5E,SAAO,OAAO,IAAI,EAAE,aAAa,GAAG,CAAC;AACrC,UAAQ,OAAO,EAAE;AACnB;AAEA,eAAe,aAAa;AAC1B,QAAM,MAAM,IAAI,IAAI,cAAc,YAAY,GAAG;AACjD,UAAQ,MAAM,MAAM,GAAG,GAAG,KAAK;AACjC;AAEO,IAAM,UAAU;AAAA,EACrB;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM,OAAO;AACX,YAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,wBAAY;AACrD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,oBAAoB,CAAC,SAAS;AAAA,IAC9B,MAAM,OAAoC;AACxC,YAAM,EAAE,oBAAoB,IAC1B,MAAM,OAAO,6BAA4B;AAC3C,YAAM,MAAM,MAAM,WAAW;AAC7B,aAAO,CAAC,QAAQ,YAAY;AAC1B,kBAAU,SAAS,MAAM,GAAG;AAC5B,eAAO,oBAAoB,QAAQ,OAAO;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,oBAAoB,CAAC,SAAS;AAAA,IAC9B,MAAM,OAAoC;AACxC,YAAM,EAAE,oBAAoB,IAC1B,MAAM,OAAO,6BAA4B;AAC3C,YAAM,MAAM,MAAM,WAAW;AAC7B,aAAO,CAAC,QAAQ,YAAY;AAC1B,kBAAU,SAAS,MAAM,GAAG;AAC5B,eAAO,oBAAoB,QAAQ,OAAO;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,oBAAoB,CAAC,SAAS;AAAA,IAC9B,MAAM,OAAoC;AACxC,YAAM,EAAE,0BAA0B,IAChC,MAAM,OAAO,mCAAkC;AACjD,YAAM,MAAM,MAAM,WAAW;AAC7B,aAAO,CAAC,QAAQ,YAAY;AAC1B,kBAAU,SAAS,MAAM,GAAG;AAC5B,eAAO,0BAA0B,QAAQ,OAAO;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }