@sequent-org/moodboard 1.1.0 → 1.2.0

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 (336) 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/moodboard/MoodBoard.js +11 -0
  311. package/src/objects/DrawingObject.js +5 -5
  312. package/src/objects/FrameObject.js +1 -0
  313. package/src/objects/ImageObject.js +24 -5
  314. package/src/objects/NoteObject.js +221 -48
  315. package/src/services/BoardService.js +3 -3
  316. package/src/services/ZoomPanController.js +14 -3
  317. package/src/tools/BaseTool.js +6 -1
  318. package/src/tools/ToolManager.js +24 -1
  319. package/src/tools/object-tools/DrawingTool.js +3 -1
  320. package/src/tools/object-tools/PlacementTool.js +213 -93
  321. package/src/tools/object-tools/SelectTool.js +318 -134
  322. package/src/tools/object-tools/TextTool.js +23 -2
  323. package/src/ui/FramePropertiesPanel.js +101 -96
  324. package/src/ui/HtmlHandlesLayer.js +253 -52
  325. package/src/ui/HtmlTextLayer.js +120 -32
  326. package/src/ui/NotePropertiesPanel.js +115 -38
  327. package/src/ui/TextPropertiesPanel.js +100 -118
  328. package/src/ui/Toolbar.js +136 -50
  329. package/src/ui/Topbar.js +112 -10
  330. package/src/ui/ZoomPanel.js +8 -2
  331. package/src/ui/styles/index.css +5 -0
  332. package/src/ui/styles/panels.css +232 -0
  333. package/src/ui/styles/toolbar.css +77 -0
  334. package/src/ui/styles/topbar.css +113 -0
  335. package/src/ui/styles/workspace.css +412 -263
  336. package/src/utils/emojiResolver.js +121 -0
@@ -12,6 +12,19 @@ import { GroupResizeController } from './selection/GroupResizeController.js';
12
12
  import { GroupRotateController } from './selection/GroupRotateController.js';
13
13
  import { GroupDragController } from './selection/GroupDragController.js';
14
14
  import { BoxSelectController } from './selection/BoxSelectController.js';
15
+ import cursorDefaultSvg from '../../assets/icons/cursor-default.svg?raw';
16
+
17
+ // Построение data URL для курсора по умолчанию (стрелка) — масштабируем в 2 раза меньше
18
+ const _scaledCursorSvg = (() => {
19
+ try {
20
+ return cursorDefaultSvg
21
+ .replace(/width="[^"]+"/i, 'width="25px"')
22
+ .replace(/height="[^"]+"/i, 'height="25px"');
23
+ } catch (_) {
24
+ return cursorDefaultSvg;
25
+ }
26
+ })();
27
+ const DEFAULT_CURSOR = '';
15
28
 
16
29
  /**
17
30
  * Инструмент выделения и работы с объектами
@@ -20,7 +33,7 @@ import { BoxSelectController } from './selection/BoxSelectController.js';
20
33
  export class SelectTool extends BaseTool {
21
34
  constructor(eventBus) {
22
35
  super('select', eventBus);
23
- this.cursor = 'default';
36
+ this.cursor = DEFAULT_CURSOR;
24
37
  this.hotkey = 'v';
25
38
 
26
39
  // Флаг состояния объекта
@@ -118,6 +131,20 @@ export class SelectTool extends BaseTool {
118
131
  }
119
132
  }
120
133
  });
134
+
135
+ // Обработка удаления объектов (undo создания, delete команды и т.д.)
136
+ this.eventBus.on(Events.Object.Deleted, (data) => {
137
+ const objectId = data?.objectId || data;
138
+ if (objectId && this.selection.has(objectId)) {
139
+ console.log(`🗑️ SelectTool: Объект ${objectId} удален, убираем из выделения`);
140
+ this.removeFromSelection(objectId);
141
+
142
+ // Если выделение стало пустым, скрываем ручки
143
+ if (this.selection.size() === 0) {
144
+ this.updateResizeHandles();
145
+ }
146
+ }
147
+ });
121
148
  }
122
149
  this.textEditor = {
123
150
  active: false,
@@ -143,7 +170,7 @@ export class SelectTool extends BaseTool {
143
170
 
144
171
  // Устанавливаем стандартный курсор для select инструмента
145
172
  if (this.app && this.app.view) {
146
- this.app.view.style.cursor = 'default';
173
+ this.app.view.style.cursor = DEFAULT_CURSOR; // пусто → наследует глобальный CSS
147
174
  }
148
175
 
149
176
  // Инициализируем систему ручек изменения размера
@@ -229,9 +256,7 @@ export class SelectTool extends BaseTool {
229
256
 
230
257
  // Очищаем выделение и ручки
231
258
  this.clearSelection();
232
- if (this.resizeHandles) {
233
- this.resizeHandles.hideHandles();
234
- }
259
+ // Скрываем любые старые PIXI-ручки: используем только HTML-ручки
235
260
 
236
261
  // Сбрасываем курсор на стандартный
237
262
  if (this.app && this.app.view) {
@@ -727,13 +752,8 @@ export class SelectTool extends BaseTool {
727
752
  const w = this._toWorld(event.x, event.y);
728
753
  this._dragCtrl.update({ ...event, x: w.x, y: w.y });
729
754
  }
730
- // Сообщаем о процессе перетаскивания текущей позицией объекта)
731
- if (this.isDragging && this.dragTarget) {
732
- // Передаём текущий центр PIXI для точного расчёта dx/dy службами
733
- const pix = this.getPixiObject(this.dragTarget);
734
- const center = pix ? { x: pix.x, y: pix.y } : null;
735
- this.emit(Events.Tool.DragUpdate, { object: this.dragTarget, pixiCenter: center });
736
- }
755
+ // Обновление позиции в ядро уже выполняется через SimpleDragController (drag:update)
756
+ // Дополнительный эмит здесь не нужен и приводил к некорректным данным
737
757
 
738
758
  // Обновляем ручки во время перетаскивания
739
759
  if (this.resizeHandles && this.selection.has(this.dragTarget)) {
@@ -817,9 +837,7 @@ export class SelectTool extends BaseTool {
817
837
  }
818
838
 
819
839
  // Обновляем ручки в реальном времени во время resize
820
- if (this.resizeHandles) {
821
- this.resizeHandles.updateHandles();
822
- }
840
+ // HTML-ручки обновляются слоем HtmlHandlesLayer
823
841
  }
824
842
 
825
843
  /**
@@ -850,9 +868,7 @@ export class SelectTool extends BaseTool {
850
868
  if (this._resizeCtrl) this._resizeCtrl.end();
851
869
 
852
870
  // Обновляем позицию ручек после resize
853
- if (this.resizeHandles) {
854
- this.resizeHandles.updateHandles(); // Обновляем позицию ручек
855
- }
871
+ // HTML-ручки обновляются слоем HtmlHandlesLayer
856
872
 
857
873
  this.isResizing = false;
858
874
  this.resizeHandle = null;
@@ -928,9 +944,7 @@ export class SelectTool extends BaseTool {
928
944
  }
929
945
 
930
946
  // Обновляем ручки в реальном времени во время поворота
931
- if (this.resizeHandles) {
932
- this.resizeHandles.updateHandles();
933
- }
947
+ // HTML-ручки обновляются слоем HtmlHandlesLayer
934
948
  }
935
949
 
936
950
  /**
@@ -1091,9 +1105,7 @@ export class SelectTool extends BaseTool {
1091
1105
  // Размещаем графику в левом-верхнем углу группы
1092
1106
  this.groupBoundsGraphics.position.set(bounds.x, bounds.y);
1093
1107
  // Обновляем ручки, если показаны
1094
- if (this.resizeHandles) {
1095
- this.resizeHandles.updateHandles();
1096
- }
1108
+ // HTML-ручки обновляются слоем HtmlHandlesLayer
1097
1109
  }
1098
1110
 
1099
1111
  updateGroupBoundsGraphicsByTopLeft(topLeft) {
@@ -1179,7 +1191,7 @@ export class SelectTool extends BaseTool {
1179
1191
  this.cursor = 'move';
1180
1192
  break;
1181
1193
  default:
1182
- this.cursor = 'default';
1194
+ this.cursor = DEFAULT_CURSOR;
1183
1195
  }
1184
1196
 
1185
1197
  this.setCursor();
@@ -1221,7 +1233,7 @@ export class SelectTool extends BaseTool {
1221
1233
  // Получаем ID выбранного объекта для определения его поворота
1222
1234
  const selectedObject = Array.from(this.selectedObjects)[0];
1223
1235
  if (!selectedObject) {
1224
- return 'default';
1236
+ return DEFAULT_CURSOR;
1225
1237
  }
1226
1238
 
1227
1239
  // Получаем угол поворота объекта
@@ -1573,7 +1585,7 @@ export class SelectTool extends BaseTool {
1573
1585
  }
1574
1586
 
1575
1587
 
1576
- let { fontSize = 18, content = '', initialSize } = properties;
1588
+ let { fontSize = 32, content = '', initialSize } = properties;
1577
1589
 
1578
1590
  // Определяем тип объекта
1579
1591
  const isNote = objectType === 'note';
@@ -1605,67 +1617,143 @@ export class SelectTool extends BaseTool {
1605
1617
  if (meta.fontSize) properties.fontSize = meta.fontSize;
1606
1618
  }
1607
1619
 
1608
- // Уведомляем о начале редактирования
1609
- this.eventBus.emit(Events.UI.TextEditStart, { objectId: objectId || null });
1620
+ // Уведомляем о начале редактирования (для разных типов отдельно)
1621
+ if (objectType === 'note') {
1622
+ this.eventBus.emit(Events.UI.NoteEditStart, { objectId: objectId || null });
1623
+ } else {
1624
+ this.eventBus.emit(Events.UI.TextEditStart, { objectId: objectId || null });
1625
+ }
1626
+ // Прячем глобальные HTML-ручки на время редактирования, чтобы не было второй рамки
1627
+ try {
1628
+ if (typeof window !== 'undefined' && window.moodboardHtmlHandlesLayer) {
1629
+ window.moodboardHtmlHandlesLayer.hide();
1630
+ }
1631
+ } catch (_) {}
1610
1632
 
1611
1633
  const app = this.app;
1612
1634
  const world = app?.stage?.getChildByName && app.stage.getChildByName('worldLayer');
1613
1635
  this.textEditor.world = world || null;
1614
1636
  const view = app?.view;
1615
1637
  if (!view) return;
1616
- if (this.resizeHandles && typeof this.resizeHandles.hideHandles === 'function') {
1617
- this.resizeHandles.hideHandles();
1638
+ // Рассчитываем эффективный размер шрифта ДО вставки textarea в DOM, чтобы избежать скачка размера
1639
+ const worldLayerEarly = world || (this.app?.stage);
1640
+ const sEarly = worldLayerEarly?.scale?.x || 1;
1641
+ const viewResEarly = (this.app?.renderer?.resolution) || (view.width && view.clientWidth ? (view.width / view.clientWidth) : 1);
1642
+ const sCssEarly = sEarly / viewResEarly;
1643
+ let effectiveFontPx = Math.max(1, Math.round((fontSize || 14) * sCssEarly));
1644
+ // Точное выравнивание размеров:
1645
+ if (objectId) {
1646
+ if (objectType === 'note') {
1647
+ try {
1648
+ const pixiReq = { objectId, pixiObject: null };
1649
+ this.eventBus.emit(Events.Tool.GetObjectPixi, pixiReq);
1650
+ const inst = pixiReq.pixiObject && pixiReq.pixiObject._mb && pixiReq.pixiObject._mb.instance;
1651
+ if (inst && inst.textField) {
1652
+ const wt = inst.textField.worldTransform;
1653
+ const scaleY = Math.max(0.0001, Math.hypot(wt.c || 0, wt.d || 0));
1654
+ const baseFS = parseFloat(inst.textField.style?.fontSize || fontSize || 14) || (fontSize || 14);
1655
+ effectiveFontPx = Math.max(1, Math.round(baseFS * (scaleY / viewResEarly)));
1656
+ }
1657
+ } catch (_) {}
1658
+ } else if (typeof window !== 'undefined' && window.moodboardHtmlTextLayer) {
1659
+ const el = window.moodboardHtmlTextLayer.idToEl.get(objectId);
1660
+ if (el && typeof window.getComputedStyle === 'function') {
1661
+ const cs = window.getComputedStyle(el);
1662
+ const f = parseFloat(cs.fontSize);
1663
+ if (isFinite(f) && f > 0) effectiveFontPx = Math.round(f);
1664
+ }
1665
+ }
1618
1666
  }
1667
+ // Используем только HTML-ручки во время редактирования текста
1619
1668
  // Обертка для рамки + textarea + ручек
1620
1669
  const wrapper = document.createElement('div');
1621
1670
  wrapper.className = 'moodboard-text-editor';
1622
1671
 
1623
- // Убираем рамки и ручки для всех типов объектов в режиме редактирования
1624
- Object.assign(wrapper.style, {
1625
- position: 'absolute',
1626
- left: '0px',
1627
- top: '0px',
1628
- transformOrigin: '0 0',
1629
- boxSizing: 'border-box',
1630
- border: 'none', // Убираем рамку для всех типов
1631
- background: 'transparent',
1632
- zIndex: 10000,
1633
- });
1672
+ // Базовые стили вынесены в CSS (.moodboard-text-editor)
1634
1673
 
1635
1674
  const textarea = document.createElement('textarea');
1636
1675
  textarea.className = 'moodboard-text-input';
1637
1676
  textarea.value = content || '';
1638
- textarea.placeholder = 'напишите что-нибудь';
1639
-
1640
- Object.assign(textarea.style, {
1641
- position: 'relative',
1642
- left: '0px',
1643
- top: '0px',
1644
- border: 'none',
1645
- padding: '0',
1646
- fontSize: `${fontSize}px`,
1647
- fontFamily: 'Arial, sans-serif',
1648
- lineHeight: `${fontSize}px`,
1649
- color: '#111', // Для записок делаем текст черным для лучшей видимости
1650
- background: 'white',
1651
- outline: 'none',
1652
- resize: 'none',
1653
- minWidth: '240px', // Для заметок уменьшаем минимальную ширину
1654
- minHeight: `${fontSize}px`,
1655
- width: '280px', // Для заметок уменьшаем начальную ширину
1656
- height: `${fontSize}px`,
1657
- boxSizing: 'content-box',
1658
- overflow: 'hidden',
1659
- // Повыше чёткость текста в CSS
1660
- WebkitFontSmoothing: 'antialiased',
1661
- MozOsxFontSmoothing: 'grayscale',
1662
- // Улучшенное перенесение слов, как в Miro
1663
- overflowWrap: 'anywhere',
1664
- wordBreak: 'break-word',
1665
- margin: '0',
1666
- });
1677
+ textarea.placeholder = 'Напишите что-нибудь';
1678
+
1679
+ // Адаптивный межстрочный интервал для ввода, синхронно с HtmlTextLayer
1680
+ const computeLineHeightPx = (fs) => {
1681
+ if (fs <= 12) return Math.round(fs * 1.40);
1682
+ if (fs <= 18) return Math.round(fs * 1.34);
1683
+ if (fs <= 36) return Math.round(fs * 1.26);
1684
+ if (fs <= 48) return Math.round(fs * 1.24);
1685
+ if (fs <= 72) return Math.round(fs * 1.22);
1686
+ if (fs <= 96) return Math.round(fs * 1.20);
1687
+ return Math.round(fs * 1.18);
1688
+ };
1689
+ // Вычисляем межстрочный интервал; подгоняем к реальным значениям HTML-отображения
1690
+ let lhInitial = computeLineHeightPx(effectiveFontPx);
1691
+ try {
1692
+ if (objectId) {
1693
+ if (objectType === 'note') {
1694
+ const pixiReq = { objectId, pixiObject: null };
1695
+ this.eventBus.emit(Events.Tool.GetObjectPixi, pixiReq);
1696
+ const inst = pixiReq.pixiObject && pixiReq.pixiObject._mb && pixiReq.pixiObject._mb.instance;
1697
+ if (inst && inst.textField) {
1698
+ const wt = inst.textField.worldTransform;
1699
+ const scaleY = Math.max(0.0001, Math.hypot(wt.c || 0, wt.d || 0));
1700
+ const baseLH = parseFloat(inst.textField.style?.lineHeight || (fontSize * 1.2)) || (fontSize * 1.2);
1701
+ lhInitial = Math.max(1, Math.round(baseLH * (scaleY / viewResEarly)));
1702
+ }
1703
+ } else if (typeof window !== 'undefined' && window.moodboardHtmlTextLayer) {
1704
+ const el = window.moodboardHtmlTextLayer.idToEl.get(objectId);
1705
+ if (el) {
1706
+ const cs = window.getComputedStyle(el);
1707
+ const lh = parseFloat(cs.lineHeight);
1708
+ if (isFinite(lh) && lh > 0) lhInitial = Math.round(lh);
1709
+ }
1710
+ }
1711
+ }
1712
+ } catch (_) {}
1713
+
1714
+ // Базовые стили вынесены в CSS (.moodboard-text-input); здесь — только динамика
1715
+ // Подбираем актуальный font-family из объекта
1716
+ try {
1717
+ if (objectId) {
1718
+ if (objectType === 'note') {
1719
+ // Для записки читаем из PIXI-инстанса NoteObject
1720
+ const pixiReq = { objectId, pixiObject: null };
1721
+ this.eventBus.emit(Events.Tool.GetObjectPixi, pixiReq);
1722
+ const inst = pixiReq.pixiObject && pixiReq.pixiObject._mb && pixiReq.pixiObject._mb.instance;
1723
+ const ff = (inst && inst.textField && inst.textField.style && inst.textField.style.fontFamily)
1724
+ || (pixiReq.pixiObject && pixiReq.pixiObject._mb && pixiReq.pixiObject._mb.properties && pixiReq.pixiObject._mb.properties.fontFamily)
1725
+ || null;
1726
+ if (ff) textarea.style.fontFamily = ff;
1727
+ } else if (typeof window !== 'undefined' && window.moodboardHtmlTextLayer) {
1728
+ // Для обычного текста читаем из HTML-элемента
1729
+ const el = window.moodboardHtmlTextLayer.idToEl.get(objectId);
1730
+ if (el) {
1731
+ const cs = window.getComputedStyle(el);
1732
+ const ff = cs && cs.fontFamily ? cs.fontFamily : null;
1733
+ if (ff) textarea.style.fontFamily = ff;
1734
+ }
1735
+ }
1736
+ }
1737
+ } catch (_) {}
1738
+ textarea.style.fontSize = `${effectiveFontPx}px`;
1739
+ textarea.style.lineHeight = `${lhInitial}px`;
1740
+ const BASELINE_FIX_INIT = 0; // без внутренних отступов — высота = line-height
1741
+ const initialH = Math.max(1, lhInitial);
1742
+ textarea.style.minHeight = `${initialH}px`;
1743
+ textarea.style.height = `${initialH}px`;
1744
+ textarea.setAttribute('rows', '1');
1745
+ textarea.style.overflowY = 'hidden';
1746
+ textarea.style.whiteSpace = 'pre-wrap';
1747
+ textarea.style.wordBreak = 'break-word';
1748
+ textarea.style.letterSpacing = '0px';
1749
+ textarea.style.fontKerning = 'normal';
1667
1750
 
1668
1751
  wrapper.appendChild(textarea);
1752
+ // Убрана зелёная рамка вокруг поля ввода по требованию
1753
+
1754
+ // В режиме input не показываем локальные ручки
1755
+
1756
+ // Не создаём локальные синие ручки: используем HtmlHandlesLayer (зелёные)
1669
1757
 
1670
1758
  // Убираем ручки ресайза для всех типов объектов
1671
1759
  // let handles = [];
@@ -1743,9 +1831,6 @@ export class SelectTool extends BaseTool {
1743
1831
  wrapper.appendChild(textarea);
1744
1832
  view.parentElement.appendChild(wrapper);
1745
1833
 
1746
- // Автоматически устанавливаем фокус на textarea
1747
- textarea.focus();
1748
-
1749
1834
  // Позиция обертки по миру → экран
1750
1835
  const toScreen = (wx, wy) => {
1751
1836
  const worldLayer = this.textEditor.world || (this.app?.stage);
@@ -1775,30 +1860,62 @@ export class SelectTool extends BaseTool {
1775
1860
  }
1776
1861
  }
1777
1862
 
1778
- // Позиционируем редактор точно там, где находится текст на заметке
1779
- // В NoteObject текст позиционируется с topMargin = 20 и центрируется по горизонтали
1780
- const topMargin = 20; // Отступ от верха (ниже полоски)
1781
- const horizontalPadding = 8; // Отступы по горизонтали
1782
- const editorWidth = Math.min(280, noteWidth - (horizontalPadding * 2));
1783
- const editorHeight = Math.min(36, noteHeight - topMargin - horizontalPadding);
1863
+ // Текст у записки центрирован по обеим осям; textarea тоже центрируем
1864
+ const horizontalPadding = 16; // немного больше, чем раньше
1865
+ const editorWidth = Math.min(360, noteWidth - (horizontalPadding * 2));
1866
+ const editorHeight = Math.min(180, noteHeight - (horizontalPadding * 2));
1784
1867
 
1785
- // Позиционируем редактор точно там, где находится текст
1786
- // Текст центрирован по горизонтали и имеет отступ topMargin от верха
1787
- const textCenterX = noteWidth / 2; // центр текста по горизонтали
1788
- const textTopY = topMargin; // позиция текста по вертикали
1868
+ const textCenterX = noteWidth / 2;
1869
+ const textCenterY = noteHeight / 2;
1789
1870
 
1790
- // Позиционируем редактор так, чтобы его центр совпадал с центром текста
1791
1871
  const editorLeft = textCenterX - (editorWidth / 2);
1792
- const editorTop = textTopY;
1872
+ const editorTop = textCenterY - (editorHeight / 2);
1793
1873
 
1794
1874
  wrapper.style.left = `${screenPos.x + editorLeft}px`;
1795
1875
  wrapper.style.top = `${screenPos.y + editorTop}px`;
1796
1876
 
1797
- // Устанавливаем размеры редактора
1877
+ // Устанавливаем размеры редактора (центрируем по контенту)
1798
1878
  textarea.style.width = `${editorWidth}px`;
1799
1879
  textarea.style.height = `${editorHeight}px`;
1800
1880
  wrapper.style.width = `${editorWidth}px`;
1801
1881
  wrapper.style.height = `${editorHeight}px`;
1882
+
1883
+ // Для записок: авто-ресайз редактора под содержимое с сохранением центрирования
1884
+ textarea.style.textAlign = 'center';
1885
+ const maxEditorWidth = Math.max(1, noteWidth - (horizontalPadding * 2));
1886
+ const maxEditorHeight = Math.max(1, noteHeight - (horizontalPadding * 2));
1887
+ const MIN_NOTE_EDITOR_W = 20;
1888
+ const MIN_NOTE_EDITOR_H = Math.max(1, computeLineHeightPx(effectiveFontPx));
1889
+
1890
+ const autoSizeNote = () => {
1891
+ // Сначала сбрасываем размеры, чтобы измерить естественные
1892
+ const prevW = textarea.style.width;
1893
+ const prevH = textarea.style.height;
1894
+ textarea.style.width = 'auto';
1895
+ textarea.style.height = 'auto';
1896
+
1897
+ // Ширина по содержимому, но не шире границ записки
1898
+ const naturalW = Math.ceil(textarea.scrollWidth + 1);
1899
+ const targetW = Math.min(maxEditorWidth, Math.max(MIN_NOTE_EDITOR_W, naturalW));
1900
+ textarea.style.width = `${targetW}px`;
1901
+ wrapper.style.width = `${targetW}px`;
1902
+
1903
+ // Высота по содержимому, c нижним пределом = одна строка
1904
+ const computed = (typeof window !== 'undefined') ? window.getComputedStyle(textarea) : null;
1905
+ const lineH = (computed ? parseFloat(computed.lineHeight) : computeLineHeightPx(effectiveFontPx));
1906
+ const naturalH = Math.ceil(textarea.scrollHeight);
1907
+ const targetH = Math.min(maxEditorHeight, Math.max(MIN_NOTE_EDITOR_H, naturalH));
1908
+ textarea.style.height = `${targetH}px`;
1909
+ wrapper.style.height = `${targetH}px`;
1910
+
1911
+ // Центрируем wrapper внутри записки после смены размеров
1912
+ const left = screenPos.x + (noteWidth / 2) - (targetW / 2);
1913
+ const top = screenPos.y + (noteHeight / 2) - (targetH / 2);
1914
+ wrapper.style.left = `${left}px`;
1915
+ wrapper.style.top = `${top}px`;
1916
+ };
1917
+ // Первый вызов — синхронизировать с текущим содержимым
1918
+ autoSizeNote();
1802
1919
  } else {
1803
1920
  // Для обычного текста используем стандартное позиционирование
1804
1921
  wrapper.style.left = `${screenPos.x}px`;
@@ -1808,18 +1925,39 @@ export class SelectTool extends BaseTool {
1808
1925
  const worldLayerRef = this.textEditor.world || (this.app?.stage);
1809
1926
  const s = worldLayerRef?.scale?.x || 1;
1810
1927
  const viewRes = (this.app?.renderer?.resolution) || (view.width && view.clientWidth ? (view.width / view.clientWidth) : 1);
1928
+ const sCss = s / viewRes;
1929
+ // Синхронизируем стартовый размер шрифта textarea с текущим зумом (как HtmlTextLayer)
1930
+ // Используем ранее вычисленный effectiveFontPx (до вставки в DOM), если он есть в замыкании
1931
+ textarea.style.fontSize = `${effectiveFontPx}px`;
1811
1932
  const initialWpx = initialSize ? Math.max(1, (initialSize.width || 0) * s / viewRes) : null;
1812
1933
  const initialHpx = initialSize ? Math.max(1, (initialSize.height || 0) * s / viewRes) : null;
1813
1934
 
1814
1935
  // Определяем минимальные границы для всех типов объектов
1815
1936
  let minWBound = initialWpx || 120; // базово близко к призраку
1816
- let minHBound = fontSize; // высота по шрифту, чтобы не было пустого пространства
1937
+ let minHBound = effectiveFontPx; // базовая высота
1938
+ // Уменьшаем визуальный нижний запас, который браузеры добавляют к textarea
1939
+ const BASELINE_FIX = 2; // px
1940
+ if (!isNote) {
1941
+ minHBound = Math.max(1, effectiveFontPx - BASELINE_FIX);
1942
+ }
1817
1943
 
1818
- // Если создаём новый текст — выставляем стартовый размер, как у призрака, но чуть шире
1944
+ // Если создаём новый текст — длина поля ровно как placeholder
1819
1945
  if (create && !isNote) {
1820
- const ghostWidth = 120;
1821
- const startWidth = Math.round(ghostWidth * 1.33); // чуть длиннее призрака (~160px)
1822
- const startHeight = fontSize; // высота равна высоте шрифта
1946
+ const measureTextWidth = (text) => {
1947
+ const sEl = document.createElement('span');
1948
+ sEl.style.position = 'absolute';
1949
+ sEl.style.visibility = 'hidden';
1950
+ sEl.style.whiteSpace = 'pre';
1951
+ sEl.style.fontFamily = textarea.style.fontFamily;
1952
+ sEl.style.fontSize = textarea.style.fontSize;
1953
+ sEl.textContent = 'Напишите что-нибудь';
1954
+ document.body.appendChild(sEl);
1955
+ const w = Math.ceil(sEl.getBoundingClientRect().width);
1956
+ sEl.remove();
1957
+ return w;
1958
+ };
1959
+ const startWidth = Math.max(1, measureTextWidth('Напишите что-нибудь'));
1960
+ const startHeight = Math.max(1, lhInitial - BASELINE_FIX + 10); // +5px сверху и +5px снизу
1823
1961
  textarea.style.width = `${startWidth}px`;
1824
1962
  textarea.style.height = `${startHeight}px`;
1825
1963
  wrapper.style.width = `${startWidth}px`;
@@ -1863,16 +2001,17 @@ export class SelectTool extends BaseTool {
1863
2001
  textarea.style.height = 'auto';
1864
2002
  // Коррекция высоты: для одной строки принудительно равна line-height,
1865
2003
  // для нескольких строк используем scrollHeight с небольшим вычетом браузерного запаса
1866
- const adjust = 2;
2004
+ const adjust = BASELINE_FIX;
1867
2005
  const computed = (typeof window !== 'undefined') ? window.getComputedStyle(textarea) : null;
1868
- const lineH = computed ? parseFloat(computed.lineHeight) : (fontSize || 18);
2006
+ const lineH = (computed ? parseFloat(computed.lineHeight) : computeLineHeightPx(effectiveFontPx)) + 10; // +5px сверху и +5px снизу
1869
2007
  const rawH = textarea.scrollHeight;
1870
2008
  const lines = lineH > 0 ? Math.max(1, Math.round(rawH / lineH)) : 1;
1871
2009
  const targetH = lines <= 1
1872
- ? lineH
2010
+ ? Math.max(minHBound, Math.max(1, lineH - BASELINE_FIX))
1873
2011
  : Math.max(minHBound, Math.max(1, rawH - adjust));
1874
2012
  textarea.style.height = `${targetH}px`;
1875
2013
  wrapper.style.height = `${targetH}px`;
2014
+ // Ручки скрыты в режиме input
1876
2015
  };
1877
2016
 
1878
2017
  // Вызываем autoSize только для обычного текста
@@ -1880,16 +2019,29 @@ export class SelectTool extends BaseTool {
1880
2019
  autoSize();
1881
2020
  }
1882
2021
  textarea.focus();
2022
+ // Ручки скрыты в режиме input
1883
2023
  // Локальная CSS-настройка placeholder (меньше базового шрифта)
1884
2024
  const uid = 'mbti-' + Math.random().toString(36).slice(2);
1885
2025
  textarea.classList.add(uid);
1886
2026
  const styleEl = document.createElement('style');
1887
- const phSize = Math.max(12, Math.round(fontSize * 0.8));
2027
+ const phSize = effectiveFontPx;
1888
2028
  const placeholderOpacity = isNote ? '0.4' : '0.6'; // Для записок делаем placeholder менее заметным
1889
- styleEl.textContent = `.${uid}::placeholder{font-size:${phSize}px;opacity:${placeholderOpacity};}`;
2029
+ styleEl.textContent = `.${uid}::placeholder{font-size:${phSize}px;opacity:${placeholderOpacity};line-height:${computeLineHeightPx(phSize)}px;white-space:nowrap;}`;
1890
2030
  document.head.appendChild(styleEl);
1891
2031
  this.textEditor = { active: true, objectId, textarea, wrapper, world: this.textEditor.world, position, properties: { fontSize }, objectType, _phStyle: styleEl };
1892
2032
 
2033
+ // Если редактируем записку — скрываем PIXI-текст записки (чтобы не было дублирования)
2034
+ if (objectType === 'note' && objectId) {
2035
+ try {
2036
+ const pixiReq = { objectId, pixiObject: null };
2037
+ this.eventBus.emit(Events.Tool.GetObjectPixi, pixiReq);
2038
+ const inst = pixiReq.pixiObject && pixiReq.pixiObject._mb && pixiReq.pixiObject._mb.instance;
2039
+ if (inst && typeof inst.hideText === 'function') {
2040
+ inst.hideText();
2041
+ }
2042
+ } catch (_) {}
2043
+ }
2044
+
1893
2045
  // Скрываем статичный текст во время редактирования для всех типов объектов
1894
2046
  if (objectId) {
1895
2047
  // Проверяем, что HTML-элемент существует перед попыткой скрыть текст
@@ -1905,41 +2057,7 @@ export class SelectTool extends BaseTool {
1905
2057
  }
1906
2058
  }
1907
2059
  // Ресайз мышью только для обычного текста
1908
- if (!isNote) {
1909
- const onHandleDown = (e) => {
1910
- e.preventDefault(); e.stopPropagation();
1911
- const dir = e.target.dataset.dir;
1912
- if (!dir) return;
1913
- const start = {
1914
- x: e.clientX, y: e.clientY,
1915
- w: wrapper.offsetWidth, h: wrapper.offsetHeight,
1916
- left: parseFloat(wrapper.style.left), top: parseFloat(wrapper.style.top), dir
1917
- };
1918
- const onMove = (ev) => {
1919
- const dx = ev.clientX - start.x;
1920
- const dy = ev.clientY - start.y;
1921
- let newW = start.w, newH = start.h, newLeft = start.left, newTop = start.top;
1922
- if (dir.includes('e')) newW = Math.max(80, start.w + dx);
1923
- if (dir.includes('s')) newH = Math.max(24, start.h + dy);
1924
- if (dir.includes('w')) { newW = Math.max(80, start.w - dx); newLeft = start.left + dx; }
1925
- if (dir.includes('n')) { newH = Math.max(24, start.h - dy); newTop = start.top + dy; }
1926
- wrapper.style.width = `${newW}px`;
1927
- wrapper.style.height = `${newH}px`;
1928
- wrapper.style.left = `${newLeft}px`;
1929
- wrapper.style.top = `${newTop}px`;
1930
- textarea.style.width = `${Math.max(minWBound, newW)}px`;
1931
- textarea.style.height = `${Math.max(minHBound, newH)}px`;
1932
- // placeHandles();
1933
- };
1934
- const onUp = () => {
1935
- document.removeEventListener('mousemove', onMove);
1936
- document.removeEventListener('mouseup', onUp);
1937
- };
1938
- document.addEventListener('mousemove', onMove);
1939
- document.addEventListener('mouseup', onUp);
1940
- };
1941
- // handles.forEach(h => h.addEventListener('mousedown', onHandleDown));
1942
- }
2060
+ // Не используем локальные ручки: ресайз обрабатывает HtmlHandlesLayer
1943
2061
  // Завершение
1944
2062
  const isNewCreation = !!create;
1945
2063
  const finalize = (commit) => {
@@ -1994,9 +2112,29 @@ export class SelectTool extends BaseTool {
1994
2112
  }
1995
2113
  }
1996
2114
 
2115
+ // Убираем редактор
1997
2116
  wrapper.remove();
1998
2117
  this.textEditor = { active: false, objectId: null, textarea: null, wrapper: null, world: null, position: null, properties: null, objectType: 'text' };
1999
- this.eventBus.emit(Events.UI.TextEditEnd, { objectId: objectId || null });
2118
+ if (currentObjectType === 'note') {
2119
+ this.eventBus.emit(Events.UI.NoteEditEnd, { objectId: objectId || null });
2120
+ // Вернём PIXI-текст записки
2121
+ try {
2122
+ const pixiReq = { objectId, pixiObject: null };
2123
+ this.eventBus.emit(Events.Tool.GetObjectPixi, pixiReq);
2124
+ const inst = pixiReq.pixiObject && pixiReq.pixiObject._mb && pixiReq.pixiObject._mb.instance;
2125
+ if (inst && typeof inst.showText === 'function') {
2126
+ inst.showText();
2127
+ }
2128
+ } catch (_) {}
2129
+ } else {
2130
+ this.eventBus.emit(Events.UI.TextEditEnd, { objectId: objectId || null });
2131
+ }
2132
+ // Возвращаем глобальные HTML-ручки (обновляем слой)
2133
+ try {
2134
+ if (typeof window !== 'undefined' && window.moodboardHtmlHandlesLayer) {
2135
+ window.moodboardHtmlHandlesLayer.update();
2136
+ }
2137
+ } catch (_) {}
2000
2138
  if (!commitValue) {
2001
2139
  // Если это было создание нового текста и оно отменено — удаляем пустой объект
2002
2140
  if (isNewCreation && objectId) {
@@ -2075,9 +2213,55 @@ export class SelectTool extends BaseTool {
2075
2213
  finalize(false);
2076
2214
  }
2077
2215
  });
2078
- // Автоподгон при вводе только для обычного текста
2216
+ // Автоподгон при вводе
2079
2217
  if (!isNote) {
2080
2218
  textarea.addEventListener('input', autoSize);
2219
+ } else {
2220
+ // Для заметок растягиваем редактор по содержимому и центрируем
2221
+ textarea.addEventListener('input', () => {
2222
+ try {
2223
+ // Найдём локальную функцию, если она объявлена выше (в замыкании)
2224
+ // В некоторых движках можно хранить ссылку на функцию в data-атрибуте
2225
+ // но здесь просто повторим алгоритм: сброс -> измерение -> ограничение -> центрирование
2226
+ const view = this.app?.view || document.querySelector('canvas');
2227
+ // Безопасно получим текущие размеры записки
2228
+ let noteWidth = 300, noteHeight = 300;
2229
+ if (objectId) {
2230
+ const sizeData = { objectId, size: null };
2231
+ this.eventBus.emit(Events.Tool.GetObjectSize, sizeData);
2232
+ if (sizeData.size) { noteWidth = sizeData.size.width; noteHeight = sizeData.size.height; }
2233
+ }
2234
+ const horizontalPadding = 16;
2235
+ const maxEditorWidth = Math.max(1, noteWidth - (horizontalPadding * 2));
2236
+ const maxEditorHeight = Math.max(1, noteHeight - (horizontalPadding * 2));
2237
+ const MIN_NOTE_EDITOR_W = 20;
2238
+ const MIN_NOTE_EDITOR_H = Math.max(1, computeLineHeightPx(effectiveFontPx));
2239
+
2240
+ textarea.style.width = 'auto';
2241
+ textarea.style.height = 'auto';
2242
+ const naturalW = Math.ceil(textarea.scrollWidth + 1);
2243
+ const targetW = Math.min(maxEditorWidth, Math.max(MIN_NOTE_EDITOR_W, naturalW));
2244
+ textarea.style.width = `${targetW}px`;
2245
+ const computed = (typeof window !== 'undefined') ? window.getComputedStyle(textarea) : null;
2246
+ const lineH = (computed ? parseFloat(computed.lineHeight) : computeLineHeightPx(effectiveFontPx));
2247
+ const naturalH = Math.ceil(textarea.scrollHeight);
2248
+ const targetH = Math.min(maxEditorHeight, Math.max(MIN_NOTE_EDITOR_H, naturalH));
2249
+ textarea.style.height = `${targetH}px`;
2250
+ wrapper.style.width = `${targetW}px`;
2251
+ wrapper.style.height = `${targetH}px`;
2252
+
2253
+ const toScreen = (wx, wy) => {
2254
+ const worldLayer = this.textEditor.world || (this.app?.stage);
2255
+ if (!worldLayer) return { x: wx, y: wy };
2256
+ const global = worldLayer.toGlobal(new PIXI.Point(wx, wy));
2257
+ const viewRes = (this.app?.renderer?.resolution) || (view && view.width && view.clientWidth ? (view.width / view.clientWidth) : 1);
2258
+ return { x: global.x / viewRes, y: global.y / viewRes };
2259
+ };
2260
+ const screenPos = toScreen(position.x, position.y);
2261
+ wrapper.style.left = `${screenPos.x + (noteWidth / 2) - (targetW / 2)}px`;
2262
+ wrapper.style.top = `${screenPos.y + (noteHeight / 2) - (targetH / 2)}px`;
2263
+ } catch (_) {}
2264
+ });
2081
2265
  }
2082
2266
  }
2083
2267