@sequent-org/moodboard 1.1.0 → 1.2.1

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 (340) hide show
  1. package/package.json +2 -2
  2. package/src/assets/emodji//320/226/320/265/320/275/321/201/320/272/320/270/320/265 /321/215/320/274/320/276/321/206/320/270/320/270/1f645.png +0 -0
  3. package/src/assets/emodji//320/226/320/265/320/275/321/201/320/272/320/270/320/265 /321/215/320/274/320/276/321/206/320/270/320/270/1f646.png +0 -0
  4. package/src/assets/emodji//320/226/320/265/320/275/321/201/320/272/320/270/320/265 /321/215/320/274/320/276/321/206/320/270/320/270/1f64b.png +0 -0
  5. package/src/assets/emodji//320/226/320/265/320/275/321/201/320/272/320/270/320/265 /321/215/320/274/320/276/321/206/320/270/320/270/1f64d.png +0 -0
  6. package/src/assets/emodji//320/226/320/265/320/275/321/201/320/272/320/270/320/265 /321/215/320/274/320/276/321/206/320/270/320/270/1f64e.png +0 -0
  7. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f446.png +0 -0
  8. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f447.png +0 -0
  9. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f448.png +0 -0
  10. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f449.png +0 -0
  11. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f44a.png +0 -0
  12. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f44b.png +0 -0
  13. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f44c.png +0 -0
  14. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f450.png +0 -0
  15. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f4aa.png +0 -0
  16. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f590.png +0 -0
  17. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f596.png +0 -0
  18. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f64c.png +0 -0
  19. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f64f.png +0 -0
  20. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/261d.png +0 -0
  21. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/270a.png +0 -0
  22. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/270b.png +0 -0
  23. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/270c.png +0 -0
  24. package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/270d.png +0 -0
  25. package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f638.png +0 -0
  26. package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f639.png +0 -0
  27. package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f63a.png +0 -0
  28. package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f63b.png +0 -0
  29. package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f63c.png +0 -0
  30. package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f63d.png +0 -0
  31. package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f63e.png +0 -0
  32. package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f63f.png +0 -0
  33. package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f640.png +0 -0
  34. package/src/assets/emodji//320/236/320/261/320/265/320/267/321/214/321/217/320/275/320/272/320/260/1f435.png +0 -0
  35. package/src/assets/emodji//320/236/320/261/320/265/320/267/321/214/321/217/320/275/320/272/320/260/1f648.png +0 -0
  36. package/src/assets/emodji//320/236/320/261/320/265/320/267/321/214/321/217/320/275/320/272/320/260/1f649.png +0 -0
  37. package/src/assets/emodji//320/236/320/261/320/265/320/267/321/214/321/217/320/275/320/272/320/260/1f64a.png +0 -0
  38. package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f440.png +0 -0
  39. package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f441.png +0 -0
  40. package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f499.png +0 -0
  41. package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f4a1.png +0 -0
  42. package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f4a3.png +0 -0
  43. package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f4a9.png +0 -0
  44. package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f4ac.png +0 -0
  45. package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f4af.png +0 -0
  46. package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/203c.png +0 -0
  47. package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/26d4.png +0 -0
  48. package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/2764.png +0 -0
  49. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f600.png +0 -0
  50. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f601.png +0 -0
  51. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f602.png +0 -0
  52. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f603.png +0 -0
  53. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f604.png +0 -0
  54. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f605.png +0 -0
  55. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f606.png +0 -0
  56. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f607.png +0 -0
  57. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f609.png +0 -0
  58. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f60a.png +0 -0
  59. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f60b.png +0 -0
  60. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f60c.png +0 -0
  61. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f60d.png +0 -0
  62. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f60e.png +0 -0
  63. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f60f.png +0 -0
  64. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f610.png +0 -0
  65. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f611.png +0 -0
  66. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f612.png +0 -0
  67. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f613.png +0 -0
  68. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f614.png +0 -0
  69. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f615.png +0 -0
  70. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f616.png +0 -0
  71. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f617.png +0 -0
  72. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f618.png +0 -0
  73. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f619.png +0 -0
  74. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f61a.png +0 -0
  75. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f61b.png +0 -0
  76. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f61c.png +0 -0
  77. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f61d.png +0 -0
  78. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f61e.png +0 -0
  79. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f61f.png +0 -0
  80. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f620.png +0 -0
  81. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f621.png +0 -0
  82. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f622.png +0 -0
  83. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f623.png +0 -0
  84. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f624.png +0 -0
  85. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f625.png +0 -0
  86. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f626.png +0 -0
  87. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f627.png +0 -0
  88. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f628.png +0 -0
  89. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f629.png +0 -0
  90. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f62a.png +0 -0
  91. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f62b.png +0 -0
  92. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f62c.png +0 -0
  93. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f62d.png +0 -0
  94. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f62e.png +0 -0
  95. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f62f.png +0 -0
  96. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f630.png +0 -0
  97. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f631.png +0 -0
  98. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f632.png +0 -0
  99. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f633.png +0 -0
  100. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f635.png +0 -0
  101. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f636.png +0 -0
  102. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f641.png +0 -0
  103. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f642.png +0 -0
  104. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/2639.png +0 -0
  105. package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/263a.png +0 -0
  106. package/src/assets/fonts/amatic-sc/AmaticSC-Bold.ttf +0 -0
  107. package/src/assets/fonts/amatic-sc/AmaticSC-Regular.ttf +0 -0
  108. package/src/assets/fonts/caveat/Caveat-Bold.ttf +0 -0
  109. package/src/assets/fonts/caveat/Caveat-Medium.ttf +0 -0
  110. package/src/assets/fonts/caveat/Caveat-Regular.ttf +0 -0
  111. package/src/assets/fonts/caveat/Caveat-SemiBold.ttf +0 -0
  112. package/src/assets/fonts/caveat/Caveat-VariableFont_wght.ttf +0 -0
  113. package/src/assets/fonts/great-vibes/GreatVibes-Regular.ttf +0 -0
  114. package/src/assets/fonts/lobster/Lobster-Regular.ttf +0 -0
  115. package/src/assets/fonts/noto-serif/NotoSerif-Black.ttf +0 -0
  116. package/src/assets/fonts/noto-serif/NotoSerif-BlackItalic.ttf +0 -0
  117. package/src/assets/fonts/noto-serif/NotoSerif-Bold.ttf +0 -0
  118. package/src/assets/fonts/noto-serif/NotoSerif-BoldItalic.ttf +0 -0
  119. package/src/assets/fonts/noto-serif/NotoSerif-ExtraBold.ttf +0 -0
  120. package/src/assets/fonts/noto-serif/NotoSerif-ExtraBoldItalic.ttf +0 -0
  121. package/src/assets/fonts/noto-serif/NotoSerif-ExtraLight.ttf +0 -0
  122. package/src/assets/fonts/noto-serif/NotoSerif-ExtraLightItalic.ttf +0 -0
  123. package/src/assets/fonts/noto-serif/NotoSerif-Italic-VariableFont_wdth,wght.ttf +0 -0
  124. package/src/assets/fonts/noto-serif/NotoSerif-Italic.ttf +0 -0
  125. package/src/assets/fonts/noto-serif/NotoSerif-Light.ttf +0 -0
  126. package/src/assets/fonts/noto-serif/NotoSerif-LightItalic.ttf +0 -0
  127. package/src/assets/fonts/noto-serif/NotoSerif-Medium.ttf +0 -0
  128. package/src/assets/fonts/noto-serif/NotoSerif-MediumItalic.ttf +0 -0
  129. package/src/assets/fonts/noto-serif/NotoSerif-Regular.ttf +0 -0
  130. package/src/assets/fonts/noto-serif/NotoSerif-SemiBold.ttf +0 -0
  131. package/src/assets/fonts/noto-serif/NotoSerif-SemiBoldItalic.ttf +0 -0
  132. package/src/assets/fonts/noto-serif/NotoSerif-Thin.ttf +0 -0
  133. package/src/assets/fonts/noto-serif/NotoSerif-ThinItalic.ttf +0 -0
  134. package/src/assets/fonts/noto-serif/NotoSerif-VariableFont_wdth,wght.ttf +0 -0
  135. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Black.ttf +0 -0
  136. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-BlackItalic.ttf +0 -0
  137. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Bold.ttf +0 -0
  138. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-BoldItalic.ttf +0 -0
  139. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-ExtraBold.ttf +0 -0
  140. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-ExtraBoldItalic.ttf +0 -0
  141. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-ExtraLight.ttf +0 -0
  142. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-ExtraLightItalic.ttf +0 -0
  143. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Italic.ttf +0 -0
  144. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Light.ttf +0 -0
  145. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-LightItalic.ttf +0 -0
  146. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Medium.ttf +0 -0
  147. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-MediumItalic.ttf +0 -0
  148. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Regular.ttf +0 -0
  149. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-SemiBold.ttf +0 -0
  150. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-SemiBoldItalic.ttf +0 -0
  151. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Thin.ttf +0 -0
  152. package/src/assets/fonts/noto-serif/NotoSerif_Condensed-ThinItalic.ttf +0 -0
  153. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Black.ttf +0 -0
  154. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-BlackItalic.ttf +0 -0
  155. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Bold.ttf +0 -0
  156. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-BoldItalic.ttf +0 -0
  157. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-ExtraBold.ttf +0 -0
  158. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-ExtraBoldItalic.ttf +0 -0
  159. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-ExtraLight.ttf +0 -0
  160. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-ExtraLightItalic.ttf +0 -0
  161. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Italic.ttf +0 -0
  162. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Light.ttf +0 -0
  163. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-LightItalic.ttf +0 -0
  164. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Medium.ttf +0 -0
  165. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-MediumItalic.ttf +0 -0
  166. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Regular.ttf +0 -0
  167. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-SemiBold.ttf +0 -0
  168. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-SemiBoldItalic.ttf +0 -0
  169. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Thin.ttf +0 -0
  170. package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-ThinItalic.ttf +0 -0
  171. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Black.ttf +0 -0
  172. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-BlackItalic.ttf +0 -0
  173. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Bold.ttf +0 -0
  174. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-BoldItalic.ttf +0 -0
  175. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-ExtraBold.ttf +0 -0
  176. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-ExtraBoldItalic.ttf +0 -0
  177. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-ExtraLight.ttf +0 -0
  178. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-ExtraLightItalic.ttf +0 -0
  179. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Italic.ttf +0 -0
  180. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Light.ttf +0 -0
  181. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-LightItalic.ttf +0 -0
  182. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Medium.ttf +0 -0
  183. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-MediumItalic.ttf +0 -0
  184. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Regular.ttf +0 -0
  185. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-SemiBold.ttf +0 -0
  186. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-SemiBoldItalic.ttf +0 -0
  187. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Thin.ttf +0 -0
  188. package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-ThinItalic.ttf +0 -0
  189. package/src/assets/fonts/oswald/Oswald-Bold.ttf +0 -0
  190. package/src/assets/fonts/oswald/Oswald-ExtraLight.ttf +0 -0
  191. package/src/assets/fonts/oswald/Oswald-Light.ttf +0 -0
  192. package/src/assets/fonts/oswald/Oswald-Medium.ttf +0 -0
  193. package/src/assets/fonts/oswald/Oswald-Regular.ttf +0 -0
  194. package/src/assets/fonts/oswald/Oswald-SemiBold.ttf +0 -0
  195. package/src/assets/fonts/oswald/Oswald-VariableFont_wght.ttf +0 -0
  196. package/src/assets/fonts/pacifico/Pacifico-Regular.ttf +0 -0
  197. package/src/assets/fonts/playfair/PlayfairDisplay-Black.ttf +0 -0
  198. package/src/assets/fonts/playfair/PlayfairDisplay-BlackItalic.ttf +0 -0
  199. package/src/assets/fonts/playfair/PlayfairDisplay-Bold.ttf +0 -0
  200. package/src/assets/fonts/playfair/PlayfairDisplay-BoldItalic.ttf +0 -0
  201. package/src/assets/fonts/playfair/PlayfairDisplay-ExtraBold.ttf +0 -0
  202. package/src/assets/fonts/playfair/PlayfairDisplay-ExtraBoldItalic.ttf +0 -0
  203. package/src/assets/fonts/playfair/PlayfairDisplay-Italic-VariableFont_wght.ttf +0 -0
  204. package/src/assets/fonts/playfair/PlayfairDisplay-Italic.ttf +0 -0
  205. package/src/assets/fonts/playfair/PlayfairDisplay-Medium.ttf +0 -0
  206. package/src/assets/fonts/playfair/PlayfairDisplay-MediumItalic.ttf +0 -0
  207. package/src/assets/fonts/playfair/PlayfairDisplay-Regular.ttf +0 -0
  208. package/src/assets/fonts/playfair/PlayfairDisplay-SemiBold.ttf +0 -0
  209. package/src/assets/fonts/playfair/PlayfairDisplay-SemiBoldItalic.ttf +0 -0
  210. package/src/assets/fonts/playfair/PlayfairDisplay-VariableFont_wght.ttf +0 -0
  211. package/src/assets/fonts/poiret-one/PoiretOne-Regular.ttf +0 -0
  212. package/src/assets/fonts/roboto/Roboto-Black.ttf +0 -0
  213. package/src/assets/fonts/roboto/Roboto-BlackItalic.ttf +0 -0
  214. package/src/assets/fonts/roboto/Roboto-Bold.ttf +0 -0
  215. package/src/assets/fonts/roboto/Roboto-BoldItalic.ttf +0 -0
  216. package/src/assets/fonts/roboto/Roboto-ExtraBold.ttf +0 -0
  217. package/src/assets/fonts/roboto/Roboto-ExtraBoldItalic.ttf +0 -0
  218. package/src/assets/fonts/roboto/Roboto-ExtraLight.ttf +0 -0
  219. package/src/assets/fonts/roboto/Roboto-ExtraLightItalic.ttf +0 -0
  220. package/src/assets/fonts/roboto/Roboto-Italic-VariableFont_wdth,wght.ttf +0 -0
  221. package/src/assets/fonts/roboto/Roboto-Italic.ttf +0 -0
  222. package/src/assets/fonts/roboto/Roboto-Light.ttf +0 -0
  223. package/src/assets/fonts/roboto/Roboto-LightItalic.ttf +0 -0
  224. package/src/assets/fonts/roboto/Roboto-Medium.ttf +0 -0
  225. package/src/assets/fonts/roboto/Roboto-MediumItalic.ttf +0 -0
  226. package/src/assets/fonts/roboto/Roboto-Regular.ttf +0 -0
  227. package/src/assets/fonts/roboto/Roboto-SemiBold.ttf +0 -0
  228. package/src/assets/fonts/roboto/Roboto-SemiBoldItalic.ttf +0 -0
  229. package/src/assets/fonts/roboto/Roboto-Thin.ttf +0 -0
  230. package/src/assets/fonts/roboto/Roboto-ThinItalic.ttf +0 -0
  231. package/src/assets/fonts/roboto/Roboto-VariableFont_wdth,wght.ttf +0 -0
  232. package/src/assets/fonts/roboto/Roboto_Condensed-Black.ttf +0 -0
  233. package/src/assets/fonts/roboto/Roboto_Condensed-BlackItalic.ttf +0 -0
  234. package/src/assets/fonts/roboto/Roboto_Condensed-Bold.ttf +0 -0
  235. package/src/assets/fonts/roboto/Roboto_Condensed-BoldItalic.ttf +0 -0
  236. package/src/assets/fonts/roboto/Roboto_Condensed-ExtraBold.ttf +0 -0
  237. package/src/assets/fonts/roboto/Roboto_Condensed-ExtraBoldItalic.ttf +0 -0
  238. package/src/assets/fonts/roboto/Roboto_Condensed-ExtraLight.ttf +0 -0
  239. package/src/assets/fonts/roboto/Roboto_Condensed-ExtraLightItalic.ttf +0 -0
  240. package/src/assets/fonts/roboto/Roboto_Condensed-Italic.ttf +0 -0
  241. package/src/assets/fonts/roboto/Roboto_Condensed-Light.ttf +0 -0
  242. package/src/assets/fonts/roboto/Roboto_Condensed-LightItalic.ttf +0 -0
  243. package/src/assets/fonts/roboto/Roboto_Condensed-Medium.ttf +0 -0
  244. package/src/assets/fonts/roboto/Roboto_Condensed-MediumItalic.ttf +0 -0
  245. package/src/assets/fonts/roboto/Roboto_Condensed-Regular.ttf +0 -0
  246. package/src/assets/fonts/roboto/Roboto_Condensed-SemiBold.ttf +0 -0
  247. package/src/assets/fonts/roboto/Roboto_Condensed-SemiBoldItalic.ttf +0 -0
  248. package/src/assets/fonts/roboto/Roboto_Condensed-Thin.ttf +0 -0
  249. package/src/assets/fonts/roboto/Roboto_Condensed-ThinItalic.ttf +0 -0
  250. package/src/assets/fonts/roboto/Roboto_SemiCondensed-Black.ttf +0 -0
  251. package/src/assets/fonts/roboto/Roboto_SemiCondensed-BlackItalic.ttf +0 -0
  252. package/src/assets/fonts/roboto/Roboto_SemiCondensed-Bold.ttf +0 -0
  253. package/src/assets/fonts/roboto/Roboto_SemiCondensed-BoldItalic.ttf +0 -0
  254. package/src/assets/fonts/roboto/Roboto_SemiCondensed-ExtraBold.ttf +0 -0
  255. package/src/assets/fonts/roboto/Roboto_SemiCondensed-ExtraBoldItalic.ttf +0 -0
  256. package/src/assets/fonts/roboto/Roboto_SemiCondensed-ExtraLight.ttf +0 -0
  257. package/src/assets/fonts/roboto/Roboto_SemiCondensed-ExtraLightItalic.ttf +0 -0
  258. package/src/assets/fonts/roboto/Roboto_SemiCondensed-Italic.ttf +0 -0
  259. package/src/assets/fonts/roboto/Roboto_SemiCondensed-Light.ttf +0 -0
  260. package/src/assets/fonts/roboto/Roboto_SemiCondensed-LightItalic.ttf +0 -0
  261. package/src/assets/fonts/roboto/Roboto_SemiCondensed-Medium.ttf +0 -0
  262. package/src/assets/fonts/roboto/Roboto_SemiCondensed-MediumItalic.ttf +0 -0
  263. package/src/assets/fonts/roboto/Roboto_SemiCondensed-Regular.ttf +0 -0
  264. package/src/assets/fonts/roboto/Roboto_SemiCondensed-SemiBold.ttf +0 -0
  265. package/src/assets/fonts/roboto/Roboto_SemiCondensed-SemiBoldItalic.ttf +0 -0
  266. package/src/assets/fonts/roboto/Roboto_SemiCondensed-Thin.ttf +0 -0
  267. package/src/assets/fonts/roboto/Roboto_SemiCondensed-ThinItalic.ttf +0 -0
  268. package/src/assets/fonts/roboto-slab/RobotoSlab-Black.ttf +0 -0
  269. package/src/assets/fonts/roboto-slab/RobotoSlab-Bold.ttf +0 -0
  270. package/src/assets/fonts/roboto-slab/RobotoSlab-ExtraBold.ttf +0 -0
  271. package/src/assets/fonts/roboto-slab/RobotoSlab-ExtraLight.ttf +0 -0
  272. package/src/assets/fonts/roboto-slab/RobotoSlab-Light.ttf +0 -0
  273. package/src/assets/fonts/roboto-slab/RobotoSlab-Medium.ttf +0 -0
  274. package/src/assets/fonts/roboto-slab/RobotoSlab-Regular.ttf +0 -0
  275. package/src/assets/fonts/roboto-slab/RobotoSlab-SemiBold.ttf +0 -0
  276. package/src/assets/fonts/roboto-slab/RobotoSlab-Thin.ttf +0 -0
  277. package/src/assets/fonts/roboto-slab/RobotoSlab-VariableFont_wght.ttf +0 -0
  278. package/src/assets/fonts/rubik-mono-one/RubikMonoOne-Regular.ttf +0 -0
  279. package/src/assets/icons/arrows-up-down-left-right.svg +1 -0
  280. package/src/assets/icons/arrows-up-down.svg +1 -0
  281. package/src/assets/icons/attachments.svg +1 -3
  282. package/src/assets/icons/attachments2.svg +3 -0
  283. package/src/assets/icons/clear.svg +1 -5
  284. package/src/assets/icons/cursor-default-custom.svg +10 -0
  285. package/src/assets/icons/cursor-default.svg +1 -0
  286. package/src/assets/icons/cursor-default2.svg +1 -0
  287. package/src/assets/icons/emoji.svg +1 -6
  288. package/src/assets/icons/emoji2.svg +6 -0
  289. package/src/assets/icons/frame.svg +1 -3
  290. package/src/assets/icons/frame2.svg +3 -0
  291. package/src/assets/icons/i-cursor.svg +1 -0
  292. package/src/assets/icons/image.svg +1 -3
  293. package/src/assets/icons/image2.svg +3 -0
  294. package/src/assets/icons/note.svg +1 -3
  295. package/src/assets/icons/note2.svg +3 -0
  296. package/src/assets/icons/pencil.svg +1 -3
  297. package/src/assets/icons/pencil2.svg +3 -0
  298. package/src/assets/icons/select.svg +1 -1
  299. package/src/assets/icons/shapes.svg +1 -3
  300. package/src/assets/icons/shapes2.svg +3 -0
  301. package/src/assets/icons/text-add.svg +1 -3
  302. package/src/assets/icons/text-add2.svg +3 -0
  303. package/src/assets/icons/trash.svg +1 -0
  304. package/src/core/commands/GroupMoveCommand.js +49 -13
  305. package/src/core/commands/MoveObjectCommand.js +4 -24
  306. package/src/core/events/Events.js +2 -0
  307. package/src/core/index.js +72 -40
  308. package/src/grid/GridFactory.js +3 -3
  309. package/src/grid/LineGrid.js +42 -20
  310. package/src/index.js +6 -1
  311. package/src/initNoBundler.js +145 -0
  312. package/src/moodboard/MoodBoard.js +11 -0
  313. package/src/objects/DrawingObject.js +5 -5
  314. package/src/objects/FrameObject.js +1 -0
  315. package/src/objects/ImageObject.js +24 -5
  316. package/src/objects/NoteObject.js +221 -48
  317. package/src/services/BoardService.js +3 -3
  318. package/src/services/ZoomPanController.js +14 -3
  319. package/src/tools/BaseTool.js +6 -1
  320. package/src/tools/ToolManager.js +24 -1
  321. package/src/tools/object-tools/DrawingTool.js +3 -1
  322. package/src/tools/object-tools/PlacementTool.js +213 -93
  323. package/src/tools/object-tools/SelectTool.js +318 -134
  324. package/src/tools/object-tools/TextTool.js +23 -2
  325. package/src/ui/FramePropertiesPanel.js +101 -96
  326. package/src/ui/HtmlHandlesLayer.js +253 -52
  327. package/src/ui/HtmlTextLayer.js +120 -32
  328. package/src/ui/NotePropertiesPanel.js +115 -38
  329. package/src/ui/TextPropertiesPanel.js +100 -118
  330. package/src/ui/Toolbar.js +212 -48
  331. package/src/ui/Topbar.js +112 -10
  332. package/src/ui/ZoomPanel.js +8 -2
  333. package/src/ui/styles/index.css +5 -0
  334. package/src/ui/styles/panels.css +232 -0
  335. package/src/ui/styles/toolbar.css +77 -0
  336. package/src/ui/styles/topbar.css +113 -0
  337. package/src/ui/styles/workspace.css +412 -263
  338. package/src/utils/emojiLoaderNoBundler.js +120 -0
  339. package/src/utils/emojiResolver.js +121 -0
  340. package/src/utils/styleLoader.js +84 -0
@@ -1,4 +1,21 @@
1
1
  import { BaseTool } from '../BaseTool.js';
2
+ import iCursorSvg from '../../assets/icons/i-cursor.svg?raw';
3
+
4
+ // Масштабируем I-курсор в 2 раза меньше
5
+ const _scaledICursorSvg = (() => {
6
+ try {
7
+ if (!/\bwidth="/i.test(iCursorSvg)) {
8
+ return iCursorSvg.replace('<svg ', '<svg width="16px" height="32px" ');
9
+ }
10
+ return iCursorSvg
11
+ .replace(/width="[^"]+"/i, 'width="16px"')
12
+ .replace(/height="[^"]+"/i, 'height="32px"');
13
+ } catch (_) {
14
+ return iCursorSvg;
15
+ }
16
+ })();
17
+
18
+ const TEXT_CURSOR = `url("data:image/svg+xml;charset=utf-8,${encodeURIComponent(_scaledICursorSvg)}") 0 0, text`;
2
19
  import { Events } from '../../core/events/Events.js';
3
20
  import * as PIXI from 'pixi.js';
4
21
 
@@ -9,7 +26,7 @@ import * as PIXI from 'pixi.js';
9
26
  export class PlacementTool extends BaseTool {
10
27
  constructor(eventBus, core = null) {
11
28
  super('place', eventBus);
12
- this.cursor = 'crosshair';
29
+ this.cursor = 'default';
13
30
  this.hotkey = null;
14
31
  this.app = null;
15
32
  this.world = null;
@@ -25,6 +42,11 @@ export class PlacementTool extends BaseTool {
25
42
  if (this.eventBus) {
26
43
  this.eventBus.on(Events.Place.Set, (cfg) => {
27
44
  this.pending = cfg ? { ...cfg } : null;
45
+ // Обновляем курсор в зависимости от pending
46
+ if (this.app && this.app.view) {
47
+ const cur = this._getPendingCursor();
48
+ this.app.view.style.cursor = (cur === 'default') ? '' : cur;
49
+ }
28
50
 
29
51
  // Показываем призрак для текста, записки, эмоджи, фрейма или фигур, если они активны
30
52
  if (this.pending && this.app && this.world) {
@@ -34,6 +56,8 @@ export class PlacementTool extends BaseTool {
34
56
  this.showNoteGhost();
35
57
  } else if (this.pending.type === 'emoji') {
36
58
  this.showEmojiGhost();
59
+ } else if (this.pending.type === 'image') {
60
+ this.showImageUrlGhost();
37
61
  } else if (this.pending.type === 'frame') {
38
62
  this.showFrameGhost();
39
63
  } else if (this.pending.type === 'frame-draw') {
@@ -41,6 +65,29 @@ export class PlacementTool extends BaseTool {
41
65
  } else if (this.pending.type === 'shape') {
42
66
  this.showShapeGhost();
43
67
  }
68
+ // Поддержка сценария перетаскивания из панели: отпускание без предварительного mousedown на канвасе
69
+ if (this.pending.placeOnMouseUp && this.app && this.app.view) {
70
+ const onUp = (ev) => {
71
+ this.app.view.removeEventListener('mouseup', onUp);
72
+ if (!this.pending) return;
73
+ const worldPoint = this._toWorld(ev.x, ev.y);
74
+ const position = {
75
+ x: Math.round(worldPoint.x - (this.pending.size?.width ?? 100) / 2),
76
+ y: Math.round(worldPoint.y - (this.pending.size?.height ?? 100) / 2)
77
+ };
78
+ const props = { ...(this.pending.properties || {}) };
79
+ this.eventBus.emit(Events.UI.ToolbarAction, {
80
+ type: this.pending.type,
81
+ id: this.pending.type,
82
+ position,
83
+ properties: props
84
+ });
85
+ this.pending = null;
86
+ this.hideGhost();
87
+ this.eventBus.emit(Events.Keyboard.ToolSelect, { tool: 'select' });
88
+ };
89
+ this.app.view.addEventListener('mouseup', onUp, { once: true });
90
+ }
44
91
  }
45
92
  });
46
93
 
@@ -90,9 +137,9 @@ export class PlacementTool extends BaseTool {
90
137
  super.activate();
91
138
  this.app = app;
92
139
  this.world = this._getWorldLayer();
93
- // Курсор указывает на размещение (прицел)
140
+ // Курсор в зависимости от типа размещаемого объекта
94
141
  if (this.app && this.app.view) {
95
- this.app.view.style.cursor = 'crosshair';
142
+ this.app.view.style.cursor = this._getPendingCursor();
96
143
  // Добавляем обработчик движения мыши для "призрака"
97
144
  this.app.view.addEventListener('mousemove', this._onMouseMove.bind(this));
98
145
  }
@@ -145,6 +192,31 @@ export class PlacementTool extends BaseTool {
145
192
  }
146
193
 
147
194
  if (!this.pending) return;
195
+ // Если включен режим "перетянуть и отпустить" из панели (placeOnMouseUp),
196
+ // то размещение выполняем на mouseup, а здесь только показываем призрак и запоминаем старт
197
+ if (this.pending.placeOnMouseUp) {
198
+ const onUp = (ev) => {
199
+ this.app.view.removeEventListener('mouseup', onUp);
200
+ // Имитация обычного place по текущему положению курсора
201
+ const worldPoint = this._toWorld(ev.x, ev.y);
202
+ const position = {
203
+ x: Math.round(worldPoint.x - (this.pending.size?.width ?? 100) / 2),
204
+ y: Math.round(worldPoint.y - (this.pending.size?.height ?? 100) / 2)
205
+ };
206
+ const props = { ...(this.pending.properties || {}) };
207
+ this.eventBus.emit(Events.UI.ToolbarAction, {
208
+ type: this.pending.type,
209
+ id: this.pending.type,
210
+ position,
211
+ properties: props
212
+ });
213
+ this.pending = null;
214
+ this.hideGhost();
215
+ this.eventBus.emit(Events.Keyboard.ToolSelect, { tool: 'select' });
216
+ };
217
+ this.app.view.addEventListener('mouseup', onUp, { once: true });
218
+ return;
219
+ }
148
220
  // Если включен режим рисования фрейма — инициируем рамку
149
221
  if (this.pending.type === 'frame-draw') {
150
222
  const start = this._toWorld(event.x, event.y);
@@ -360,12 +432,14 @@ export class PlacementTool extends BaseTool {
360
432
  } else {
361
433
  // Для записки: выставляем фактические габариты и центрируем по курсору
362
434
  if (this.pending.type === 'note') {
363
- const noteW = (typeof props.width === 'number') ? props.width : 160;
364
- const noteH = (typeof props.height === 'number') ? props.height : 100;
365
- props = { ...props, width: noteW, height: noteH };
435
+ const base = 250; // квадрат 250x250
436
+ const noteW = (typeof props.width === 'number') ? props.width : base;
437
+ const noteH = (typeof props.height === 'number') ? props.height : base;
438
+ const side = Math.max(noteW, noteH);
439
+ props = { ...props, width: side, height: side };
366
440
  position = {
367
- x: Math.round(worldPoint.x - noteW / 2),
368
- y: Math.round(worldPoint.y - noteH / 2)
441
+ x: Math.round(worldPoint.x - side / 2),
442
+ y: Math.round(worldPoint.y - side / 2)
369
443
  };
370
444
  }
371
445
  // Обычное размещение через общий канал
@@ -399,9 +473,14 @@ export class PlacementTool extends BaseTool {
399
473
  const h = Math.abs(p.y - this._frameDrawState.startY);
400
474
  const g = this._frameDrawState.graphics;
401
475
  g.clear();
402
- g.lineStyle(1, 0x3B82F6, 1);
403
- g.beginFill(0x3B82F6, 0.08);
404
- g.drawRect(x, y, w, h);
476
+ // Снапим к полупикселю и используем внутреннее выравнивание линии для чётких 1px краёв
477
+ const x0 = Math.floor(x) + 0.5;
478
+ const y0 = Math.floor(y) + 0.5;
479
+ const w0 = Math.max(1, Math.round(w));
480
+ const h0 = Math.max(1, Math.round(h));
481
+ g.lineStyle(1, 0x3B82F6, 1, 1 /* alignment: inner */);
482
+ g.beginFill(0xFFFFFF, 0.6);
483
+ g.drawRect(x0, y0, w0, h0);
405
484
  g.endFill();
406
485
  }
407
486
 
@@ -454,6 +533,11 @@ export class PlacementTool extends BaseTool {
454
533
  */
455
534
  _onMouseMove(event) {
456
535
  if ((this.selectedFile || this.selectedImage || this.pending) && this.ghostContainer) {
536
+ // Сохраним последние координаты мыши (в экранных координатах) — пригодится для первичной позиции призрака
537
+ if (this.app && this.app.view) {
538
+ this.app.view._lastMouseX = event.x;
539
+ this.app.view._lastMouseY = event.y;
540
+ }
457
541
  const worldPoint = this._toWorld(event.offsetX, event.offsetY);
458
542
  this.updateGhostPosition(worldPoint.x, worldPoint.y);
459
543
  }
@@ -470,6 +554,17 @@ export class PlacementTool extends BaseTool {
470
554
  // Создаем контейнер для призрака
471
555
  this.ghostContainer = new PIXI.Container();
472
556
  this.ghostContainer.alpha = 0.6; // Полупрозрачность
557
+ // Сразу ставим контейнер в позицию курсора, чтобы он не мигал в левом верхнем углу
558
+ if (this.app && this.app.view) {
559
+ const rect = this.app.view.getBoundingClientRect();
560
+ const cursorX = (typeof this.app.view._lastMouseX === 'number') ? this.app.view._lastMouseX : (rect.left + rect.width / 2);
561
+ const cursorY = (typeof this.app.view._lastMouseY === 'number') ? this.app.view._lastMouseY : (rect.top + rect.height / 2);
562
+ const worldPoint = this._toWorld(cursorX, cursorY);
563
+ this.updateGhostPosition(worldPoint.x, worldPoint.y);
564
+ }
565
+ // Попробуем дождаться загрузки веб-шрифта Caveat до отрисовки
566
+ const pendingFont = (this.pending.properties?.fontFamily) || 'Caveat, Arial, cursive';
567
+ const primaryFont = String(pendingFont).split(',')[0].trim().replace(/^['"]|['"]$/g, '') || 'Caveat';
473
568
 
474
569
  // Размеры
475
570
  const width = this.selectedFile.properties.width || 120;
@@ -708,6 +803,67 @@ export class PlacementTool extends BaseTool {
708
803
  this.world.addChild(this.ghostContainer);
709
804
  }
710
805
 
806
+ /**
807
+ * Показать "призрак" изображения по URL (для выбора из панели эмоджи)
808
+ */
809
+ async showImageUrlGhost() {
810
+ if (!this.pending || this.pending.type !== 'image' || !this.world) return;
811
+ const src = this.pending.properties?.src;
812
+ if (!src) return;
813
+
814
+ this.hideGhost();
815
+
816
+ this.ghostContainer = new PIXI.Container();
817
+ this.ghostContainer.alpha = 0.6;
818
+
819
+ const maxWidth = this.pending.size?.width || this.pending.properties?.width || 56;
820
+ const maxHeight = this.pending.size?.height || this.pending.properties?.height || 56;
821
+
822
+ try {
823
+ const texture = await PIXI.Texture.fromURL(src);
824
+ const imageAspect = (texture.width || 1) / (texture.height || 1);
825
+ let width = maxWidth;
826
+ let height = maxWidth / imageAspect;
827
+ if (height > maxHeight) {
828
+ height = maxHeight;
829
+ width = maxHeight * imageAspect;
830
+ }
831
+
832
+ const sprite = new PIXI.Sprite(texture);
833
+ sprite.width = Math.max(1, Math.round(width));
834
+ sprite.height = Math.max(1, Math.round(height));
835
+
836
+ const border = new PIXI.Graphics();
837
+ try { border.lineStyle({ width: 2, color: 0xDEE2E6, alpha: 0.8 }); }
838
+ catch (_) { border.lineStyle(2, 0xDEE2E6, 0.8); }
839
+ border.drawRoundedRect(-2, -2, sprite.width + 4, sprite.height + 4, 4);
840
+
841
+ this.ghostContainer.addChild(border);
842
+ this.ghostContainer.addChild(sprite);
843
+ this.ghostContainer.pivot.set(sprite.width / 2, sprite.height / 2);
844
+ } catch (e) {
845
+ const g = new PIXI.Graphics();
846
+ g.beginFill(0xF0F0F0, 0.8);
847
+ g.lineStyle(2, 0xDEE2E6, 0.8);
848
+ g.drawRoundedRect(0, 0, maxWidth, maxHeight, 8);
849
+ g.endFill();
850
+ this.ghostContainer.addChild(g);
851
+ this.ghostContainer.pivot.set(maxWidth / 2, maxHeight / 2);
852
+ }
853
+
854
+ this.world.addChild(this.ghostContainer);
855
+
856
+ // Кастомный курсор: мини-превью иконки рядом с курсором
857
+ try {
858
+ if (this.app && this.app.view && src) {
859
+ const cursorSize = 24;
860
+ const url = encodeURI(src);
861
+ // Используем CSS cursor с изображением, если поддерживается
862
+ this.app.view.style.cursor = `url(${url}) ${Math.floor(cursorSize/2)} ${Math.floor(cursorSize/2)}, default`;
863
+ }
864
+ } catch (_) {}
865
+ }
866
+
711
867
  /**
712
868
  * Показать "призрак" текста
713
869
  */
@@ -772,70 +928,36 @@ export class PlacementTool extends BaseTool {
772
928
  this.ghostContainer = new PIXI.Container();
773
929
  this.ghostContainer.alpha = 0.6; // Полупрозрачность
774
930
 
775
- // Размеры и стили, синхронизированные с NoteObject
776
- const width = this.pending.properties?.width || 160;
777
- const height = this.pending.properties?.height || 100;
778
- const fontSize = this.pending.properties?.fontSize || 16;
779
- const content = this.pending.properties?.content || 'Новая записка';
931
+ // Размеры и стили (без текста у призрака)
932
+ const width = this.pending.properties?.width || 250;
933
+ const height = this.pending.properties?.height || 250;
780
934
  const backgroundColor = (typeof this.pending.properties?.backgroundColor === 'number')
781
935
  ? this.pending.properties.backgroundColor
782
- : 0xFFF9C4;
783
- const borderColor = (typeof this.pending.properties?.borderColor === 'number')
784
- ? this.pending.properties.borderColor
785
- : 0xF9A825;
936
+ : 0xFFF9C4; // желтый как у записки
786
937
  const textColor = (typeof this.pending.properties?.textColor === 'number')
787
938
  ? this.pending.properties.textColor
788
939
  : 0x1A1A1A;
789
940
 
790
- // Тень (размытая) под запиской
791
- const shadow = new PIXI.Graphics();
792
- try {
793
- shadow.filters = [new PIXI.filters.BlurFilter(6)];
794
- } catch (e) {}
795
- shadow.beginFill(0x000000, 1);
796
- shadow.drawRect(0, 0, width, height);
797
- shadow.endFill();
798
- shadow.x = 2;
799
- shadow.y = 3;
800
- shadow.alpha = 0.18;
941
+ // Тени для призрака отключены по требованию (без тени)
801
942
 
802
- // Основной фон записки (прямоугольник без рамки)
943
+ // Основной фон записки (желтый как у оригинала)
803
944
  const background = new PIXI.Graphics();
804
945
  background.beginFill(backgroundColor, 1);
805
- background.drawRect(0, 0, width, height);
946
+ background.drawRoundedRect(0, 0, width, height, 2);
806
947
  background.endFill();
807
948
 
808
- // Прямоугольная шапка сверху, цвет рамки
809
- const header = new PIXI.Graphics();
810
- header.beginFill(borderColor, 1);
811
- header.drawRect(0, 0, width, 8);
812
- header.endFill();
813
-
814
- // Текст записки, выровнен как в NoteObject (центр по X, отступ сверху)
815
- const noteText = new PIXI.Text(content, {
816
- fontFamily: 'system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif',
817
- fontSize: fontSize,
818
- fill: textColor,
819
- align: 'center',
820
- wordWrap: true,
821
- wordWrapWidth: width - 16,
822
- lineHeight: fontSize * 1.2
823
- });
824
- noteText.anchor.set(0.5, 0);
825
- noteText.x = Math.round(width / 2);
826
- noteText.y = 20; // как в NoteObject topMargin
949
+ // У призрака текста нет — только фон записки
827
950
 
828
951
  // Порядок добавления: тень → фон → шапка → текст
829
- this.ghostContainer.addChild(shadow);
952
+ // Без тени
830
953
  this.ghostContainer.addChild(background);
831
- this.ghostContainer.addChild(header);
832
- this.ghostContainer.addChild(noteText);
833
954
 
834
955
  // Центрируем контейнер относительно курсора
835
956
  this.ghostContainer.pivot.x = width / 2;
836
957
  this.ghostContainer.pivot.y = height / 2;
837
958
 
838
959
  this.world.addChild(this.ghostContainer);
960
+ // Текст убран — дополнительная загрузка шрифтов для призрака не требуется
839
961
  }
840
962
 
841
963
  /**
@@ -911,15 +1033,33 @@ export class PlacementTool extends BaseTool {
911
1033
  // Получаем параметры фрейма из pending
912
1034
  const width = this.pending.properties?.width || 200;
913
1035
  const height = this.pending.properties?.height || 300;
914
- const fillColor = this.pending.properties?.fillColor || 0xFFFFFF;
915
- const borderColor = this.pending.properties?.borderColor || 0x333333;
1036
+ const fillColor = (this.pending.properties?.backgroundColor ?? this.pending.properties?.fillColor) ?? 0xFFFFFF;
916
1037
  const title = this.pending.properties?.title || 'Новый';
1038
+
1039
+ // Читаем стили рамки как у реального фрейма (FrameObject)
1040
+ const rootStyles = (typeof window !== 'undefined') ? getComputedStyle(document.documentElement) : null;
1041
+ const cssBorderWidth = rootStyles ? parseFloat(rootStyles.getPropertyValue('--frame-border-width') || '4') : 4;
1042
+ const cssCornerRadius = rootStyles ? parseFloat(rootStyles.getPropertyValue('--frame-corner-radius') || '6') : 6;
1043
+ const cssBorderColor = rootStyles ? rootStyles.getPropertyValue('--frame-border-color').trim() : '';
1044
+ const borderWidth = Number.isFinite(cssBorderWidth) ? cssBorderWidth : 4;
1045
+ const cornerRadius = Number.isFinite(cssCornerRadius) ? cssCornerRadius : 6;
1046
+ let strokeColor;
1047
+ if (cssBorderColor && cssBorderColor.startsWith('#')) {
1048
+ strokeColor = parseInt(cssBorderColor.slice(1), 16);
1049
+ } else {
1050
+ strokeColor = (typeof this.pending.properties?.borderColor === 'number') ? this.pending.properties.borderColor : 0xE0E0E0;
1051
+ }
917
1052
 
918
- // Создаем фон фрейма (как в FrameObject)
1053
+ // Создаем фон фрейма (как в FrameObject) — повторяем стили рамки
919
1054
  const frameGraphics = new PIXI.Graphics();
920
- frameGraphics.beginFill(fillColor, 0.8); // Полупрозрачная заливка
921
- frameGraphics.lineStyle(2, borderColor, 0.8); // Граница
922
- frameGraphics.drawRect(0, 0, width, height);
1055
+ try {
1056
+ frameGraphics.lineStyle({ width: borderWidth, color: strokeColor, alpha: 1, alignment: 1 });
1057
+ } catch (e) {
1058
+ frameGraphics.lineStyle(borderWidth, strokeColor, 1);
1059
+ }
1060
+ // Заливка как у фрейма, прозрачность задаётся через контейнер (alpha)
1061
+ frameGraphics.beginFill(fillColor, 1);
1062
+ frameGraphics.drawRoundedRect(0, 0, width, height, cornerRadius);
923
1063
  frameGraphics.endFill();
924
1064
 
925
1065
  // Создаем заголовок фрейма (как в FrameObject)
@@ -929,41 +1069,13 @@ export class PlacementTool extends BaseTool {
929
1069
  fill: 0x333333,
930
1070
  fontWeight: 'bold'
931
1071
  });
932
- titleText.anchor.set(0, 1); // Левый нижний угол текста
933
- titleText.y = -5; // Немного выше фрейма
934
-
935
- // Добавляем пунктирную рамку для лучшей видимости призрака
936
- const dashedBorder = new PIXI.Graphics();
937
- dashedBorder.lineStyle(1, 0x007BFF, 0.6);
938
- // Создаем пунктирную линию вручную
939
- for (let i = 0; i <= width; i += 10) {
940
- if ((i / 10) % 2 === 0) {
941
- dashedBorder.moveTo(i, -2);
942
- dashedBorder.lineTo(Math.min(i + 5, width), -2);
943
- }
944
- }
945
- for (let i = 0; i <= height; i += 10) {
946
- if ((i / 10) % 2 === 0) {
947
- dashedBorder.moveTo(-2, i);
948
- dashedBorder.lineTo(-2, Math.min(i + 5, height));
949
- }
950
- }
951
- for (let i = 0; i <= width; i += 10) {
952
- if ((i / 10) % 2 === 0) {
953
- dashedBorder.moveTo(i, height + 2);
954
- dashedBorder.lineTo(Math.min(i + 5, width), height + 2);
955
- }
956
- }
957
- for (let i = 0; i <= height; i += 10) {
958
- if ((i / 10) % 2 === 0) {
959
- dashedBorder.moveTo(width + 2, i);
960
- dashedBorder.lineTo(width + 2, Math.min(i + 5, height));
961
- }
962
- }
1072
+ // Размещаем заголовок внутри верхней части фрейма
1073
+ titleText.anchor.set(0, 0);
1074
+ titleText.x = 8;
1075
+ titleText.y = 4;
963
1076
 
964
1077
  this.ghostContainer.addChild(frameGraphics);
965
1078
  this.ghostContainer.addChild(titleText);
966
- this.ghostContainer.addChild(dashedBorder);
967
1079
 
968
1080
  // Центрируем контейнер относительно курсора
969
1081
  this.ghostContainer.pivot.x = width / 2;
@@ -1143,4 +1255,12 @@ export class PlacementTool extends BaseTool {
1143
1255
  }
1144
1256
  }
1145
1257
 
1258
+ // Возвращает подходящий курсор для текущего pending состояния
1259
+ PlacementTool.prototype._getPendingCursor = function() {
1260
+ if (!this.pending) return 'crosshair';
1261
+ if (this.pending.type === 'text') return TEXT_CURSOR;
1262
+ if (this.pending.type === 'frame-draw') return 'crosshair';
1263
+ return 'crosshair';
1264
+ };
1265
+
1146
1266