@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
package/src/ui/Toolbar.js CHANGED
@@ -418,9 +418,10 @@ export class Toolbar {
418
418
  type: 'note',
419
419
  properties: {
420
420
  content: 'Новая записка',
421
- fontSize: 16,
422
- width: 160,
423
- height: 100
421
+ fontFamily: 'Caveat, Arial, cursive',
422
+ fontSize: 32,
423
+ width: 250,
424
+ height: 250
424
425
  }
425
426
  });
426
427
  return;
@@ -529,6 +530,13 @@ export class Toolbar {
529
530
  this.setActiveToolbarButton('place'); // ← Исправление: подсвечиваем кнопку эмоджи
530
531
  return;
531
532
  }
533
+
534
+ // Очистка холста - требует подтверждения
535
+ if (toolType === 'clear') {
536
+ this.animateButton(button);
537
+ this.showClearConfirmation();
538
+ return;
539
+ }
532
540
 
533
541
  // Эмитим событие для других инструментов
534
542
  this.eventBus.emit(Events.UI.ToolbarAction, {
@@ -743,9 +751,9 @@ export class Toolbar {
743
751
 
744
752
  // Первый ряд: карандаш, маркер, ластик (иконки SVG)
745
753
  const tools = [
746
- { id: 'pencil-tool', tool: 'pencil', title: 'Карандаш', svg: '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M2 14 L14 2 L18 6 L6 18 L2 18 Z" fill="#1f2937"/><path d="M12 4 L16 8" stroke="#e5e7eb" stroke-width="2"/></svg>' },
747
- { id: 'marker-tool', tool: 'marker', title: 'Маркер', svg: '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><rect x="3" y="3" width="10" height="6" rx="2" fill="#1f2937"/><path d="M13 4 L17 8 L12 13 L8 9 Z" fill="#374151"/></svg>' },
748
- { id: 'eraser-tool', tool: 'eraser', title: 'Ластик', svg: '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><rect x="4" y="10" width="10" height="6" rx="2" transform="rotate(-45 4 10)" fill="#9ca3af"/><rect x="9" y="5" width="6" height="4" rx="1" transform="rotate(-45 9 5)" fill="#d1d5db"/></svg>' }
754
+ { id: 'pencil-tool', tool: 'pencil', title: 'Карандаш', svg: '<svg width="20" height="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path fill="currentColor" fill-rule="evenodd" d="M14.492 3.414 8.921 8.985a4.312 4.312 0 0 0 6.105 6.09l5.564-5.562 1.414 1.414-5.664 5.664a6.002 6.002 0 0 1-2.182 1.392L3.344 21.94 2.06 20.656 6.02 9.845c.3-.82.774-1.563 1.391-2.18l.093-.092.01-.01L13.077 2l1.415 1.414ZM4.68 19.32l4.486-1.64a6.305 6.305 0 0 1-1.651-1.19 6.306 6.306 0 0 1-1.192-1.655L4.68 19.32Z" clip-rule="evenodd"/></svg>' },
755
+ { id: 'marker-tool', tool: 'marker', title: 'Маркер', svg: '<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" width="20" height="20" class="c-bxOhME c-bxOhME-dvzWZT-size-medium"><path fill="currentColor" fill-rule="evenodd" d="M12.737 2.676 8.531 7.264a1 1 0 0 0 .03 1.382l7.674 7.675a1 1 0 0 0 1.442-.029l4.589-4.97 1.468 1.357-4.588 4.97a3 3 0 0 1-3.46.689l-1.917 2.303-1.454.087-.63-.593-.828 1.38L10 22v-1l-.001-.001L10 22H1v-3l.18-.573 3.452-4.93-.817-.77.045-1.496 2.621-2.184a2.999 2.999 0 0 1 .577-3.134l4.205-4.589 1.474 1.352ZM3 19.315v.684h6.434l.76-1.268-4.09-3.85L3 19.314Zm3.007-7.27 6.904 6.498 1.217-1.46-6.667-6.25-1.454 1.212Z" clip-rule="evenodd"></path></svg>' },
756
+ { id: 'eraser-tool', tool: 'eraser', title: 'Ластик', svg: '<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" width="20" height="20" class="c-bxOhME c-bxOhME-dvzWZT-size-medium"><path fill="currentColor" fill-rule="evenodd" d="M12.63 3.957 4.319 12.27a3 3 0 0 0 0 4.242L7.905 20.1 8.612 20.394H21v-2h-5.6l6.629-6.63a3 3 0 0 0 0-4.242L17.858 3.42a3 3 0 0 0-4.242 0ZM5.12 14.293a1 1 0 0 0 0 1.414L8.414 19h3.172l3-3L9 10.414l-3.879 3.88Zm10.336-8.922a1 1 0 0 0-1.414 0l-3.629 3.63L16 14.585l3.63-3.629a1 1 0 0 0 0-1.414L15.457 5.37Z" clip-rule="evenodd"></path></svg>' }
749
757
  ];
750
758
  const row1 = document.createElement('div');
751
759
  row1.className = 'moodboard-draw__row';
@@ -781,7 +789,7 @@ export class Toolbar {
781
789
  if (this.currentDrawTool === 'pencil') {
782
790
  const sizes = [
783
791
  { id: 'size-thin-black', title: 'Тонкий черный', color: '#111827', dot: 4, width: 2 },
784
- { id: 'size-medium-red', title: 'Средний красный', color: '#ef4444', dot: 7, width: 4 },
792
+ { id: 'size-medium-red', title: 'Средний красный', color: '#ef4444', dot: 8, width: 4 },
785
793
  { id: 'size-thick-green', title: 'Толстый зеленый', color: '#16a34a', dot: 10, width: 6 }
786
794
  ];
787
795
  sizes.forEach(s => {
@@ -899,70 +907,194 @@ export class Toolbar {
899
907
  this.emojiPopupEl.className = 'moodboard-toolbar__popup moodboard-toolbar__popup--emoji';
900
908
  this.emojiPopupEl.style.display = 'none';
901
909
 
902
- const categories = [
903
- { title: 'Смайлики', items: ['😀','😁','😂','🤣','🙂','😊','😍','😘','😎','🤔','😴','😡','😭','😇','🤩','🤨','😐','😅','😏','🤗','🤫','😤','🤯','🤪'] },
904
- { title: 'Жесты', items: ['👍','👎','👌','✌️','🤘','🤙','👏','🙌','🙏','💪','☝️','👋','🖐️','✋'] },
905
- { title: 'Предметы', items: ['💡','📌','📎','📝','🖌️','🖼️','🗂️','📁','📷','🎥','🎯','🧩','🔒','🔑'] },
906
- { title: 'Символы', items: ['⭐','🌟','✨','🔥','💥','⚡','❗','❓','✅','❌','💯','🔔','🌀'] },
907
- { title: 'Животные', items: ['🐶','🐱','🦊','🐼','🐨','🐵','🐸','🐧','🐤','🦄','🐙'] }
908
- ];
910
+ // Определяем способ загрузки эмоджи
911
+ let groups = new Map();
912
+
913
+ if (typeof import.meta !== 'undefined' && import.meta.glob) {
914
+ // Режим с bundler (Vite) - используем import.meta.glob
915
+ const modules = import.meta.glob('../assets/emodji/**/*.{png,PNG,svg,SVG}', { eager: true, as: 'url' });
916
+
917
+ // Группируем по подпапкам внутри emodji (категории)
918
+ const entries = Object.entries(modules).sort(([a], [b]) => a.localeCompare(b));
919
+ entries.forEach(([path, url]) => {
920
+ const marker = '/emodji/';
921
+ const idx = path.indexOf(marker);
922
+ let category = 'Разное';
923
+ if (idx >= 0) {
924
+ const after = path.slice(idx + marker.length);
925
+ const parts = after.split('/');
926
+ category = parts.length > 1 ? parts[0] : 'Разное';
927
+ }
928
+ if (!groups.has(category)) groups.set(category, []);
929
+ groups.get(category).push({ path, url });
930
+ });
931
+ } else {
932
+ // Режим без bundler - используем статичный список
933
+ console.log('🎭 Toolbar: Режим без bundler, используем статичные эмоджи');
934
+ groups = this.getFallbackEmojiGroups();
935
+ }
936
+
937
+ // Задаем желаемый порядок категорий
938
+ const ORDER = ['Смайлики', 'Жесты', 'Женские эмоции', 'Котики', 'Разное'];
939
+ const present = [...groups.keys()];
940
+ const orderedFirst = ORDER.filter(name => groups.has(name));
941
+ const theRest = present.filter(name => !ORDER.includes(name)).sort((a, b) => a.localeCompare(b));
942
+ const orderedCategories = [...orderedFirst, ...theRest];
909
943
 
910
- categories.forEach(cat => {
944
+ // Рендерим секции по категориям в нужном порядке
945
+ orderedCategories.forEach((cat) => {
911
946
  const section = document.createElement('div');
912
947
  section.className = 'moodboard-emoji__section';
948
+
913
949
  const title = document.createElement('div');
914
950
  title.className = 'moodboard-emoji__title';
915
- title.textContent = cat.title;
951
+ title.textContent = cat;
952
+ section.appendChild(title);
953
+
916
954
  const grid = document.createElement('div');
917
955
  grid.className = 'moodboard-emoji__grid';
918
- cat.items.forEach(ch => {
956
+
957
+ groups.get(cat).forEach(({ url }) => {
919
958
  const btn = document.createElement('button');
920
959
  btn.className = 'moodboard-emoji__btn';
921
- btn.title = ch;
922
- btn.textContent = ch;
960
+ btn.title = 'Добавить изображение';
961
+ const img = document.createElement('img');
962
+ img.className = 'moodboard-emoji__img';
963
+ img.src = url;
964
+ img.alt = '';
965
+ btn.appendChild(img);
966
+
967
+ // Перетаскивание: начинаем только если был реальный drag (движение > 4px)
968
+ btn.addEventListener('mousedown', (e) => {
969
+ const startX = e.clientX;
970
+ const startY = e.clientY;
971
+ let startedDrag = false;
972
+ const onMove = (ev) => {
973
+ if (startedDrag) return;
974
+ const dx = Math.abs(ev.clientX - startX);
975
+ const dy = Math.abs(ev.clientY - startY);
976
+ if (dx > 4 || dy > 4) {
977
+ startedDrag = true;
978
+ btn.__dragActive = true;
979
+ const target = 64;
980
+ const targetW = target;
981
+ const targetH = target;
982
+ // Активируем инструмент размещения и включаем режим placeOnMouseUp
983
+ this.eventBus.emit(Events.Keyboard.ToolSelect, { tool: 'place' });
984
+ this.eventBus.emit(Events.Place.Set, {
985
+ type: 'image',
986
+ properties: { src: url, width: targetW, height: targetH, isEmojiIcon: true },
987
+ size: { width: targetW, height: targetH },
988
+ placeOnMouseUp: true
989
+ });
990
+ // Закрываем поповер, чтобы не мешал курсору над холстом
991
+ this.closeEmojiPopup();
992
+ cleanup();
993
+ }
994
+ };
995
+ const onUp = () => {
996
+ cleanup();
997
+ // Снимем флаг сразу после клика, чтобы click мог отфильтроваться
998
+ setTimeout(() => { btn.__dragActive = false; }, 0);
999
+ };
1000
+ const cleanup = () => {
1001
+ document.removeEventListener('mousemove', onMove);
1002
+ document.removeEventListener('mouseup', onUp);
1003
+ };
1004
+ document.addEventListener('mousemove', onMove);
1005
+ document.addEventListener('mouseup', onUp, { once: true });
1006
+ });
1007
+
923
1008
  btn.addEventListener('click', () => {
1009
+ if (btn.__dragActive) return; // не обрабатываем клик после drag
924
1010
  this.animateButton(btn);
925
- // Устанавливаем pending для размещения emoji кликом по холсту
926
- const size = 48; // базовый размер
1011
+ const target = 64; // кратно 128 для лучшей четкости при даунскейле
1012
+ const targetW = target;
1013
+ const targetH = target;
927
1014
  this.eventBus.emit(Events.Place.Set, {
928
- type: 'emoji',
929
- properties: { content: ch, fontSize: size, width: size, height: size },
930
- size: { width: size, height: size },
931
- // anchorCentered не используем, позиция ставится как топ-левт со смещением на половину размера
1015
+ type: 'image',
1016
+ properties: { src: url, width: targetW, height: targetH, isEmojiIcon: true },
1017
+ size: { width: targetW, height: targetH }
932
1018
  });
933
1019
  this.closeEmojiPopup();
934
1020
  });
1021
+
935
1022
  grid.appendChild(btn);
936
1023
  });
937
- section.appendChild(title);
1024
+
938
1025
  section.appendChild(grid);
939
1026
  this.emojiPopupEl.appendChild(section);
940
1027
  });
1028
+ this.container.appendChild(this.emojiPopupEl);
1029
+ }
941
1030
 
942
- // Разделительная линия
943
- const divider = document.createElement('div');
944
- divider.className = 'moodboard-emoji__divider';
945
- this.emojiPopupEl.appendChild(divider);
946
-
947
- // Стикеры (простые крупные эмодзи или пиктограммы)
948
- const stickersTitle = document.createElement('div');
949
- stickersTitle.className = 'moodboard-stickers__title';
950
- stickersTitle.textContent = 'Стикеры';
951
- const stickersGrid = document.createElement('div');
952
- stickersGrid.className = 'moodboard-stickers__grid';
1031
+ /**
1032
+ * Возвращает fallback группы эмоджи для работы без bundler
1033
+ */
1034
+ getFallbackEmojiGroups() {
1035
+ const groups = new Map();
1036
+
1037
+ // Определяем базовый путь для эмоджи
1038
+ const basePath = this.getEmojiBasePath();
1039
+
1040
+ // Статичный список эмоджи с реальными именами файлов
1041
+ const fallbackEmojis = {
1042
+ 'Смайлики': [
1043
+ '1f600.png', '1f601.png', '1f602.png', '1f603.png', '1f604.png',
1044
+ '1f605.png', '1f606.png', '1f607.png', '1f609.png', '1f60a.png',
1045
+ '1f60b.png', '1f60c.png', '1f60d.png', '1f60e.png', '1f60f.png',
1046
+ '1f610.png', '1f611.png', '1f612.png', '1f613.png', '1f614.png',
1047
+ '1f615.png', '1f616.png', '1f617.png', '1f618.png', '1f619.png'
1048
+ ],
1049
+ 'Жесты': [
1050
+ '1f446.png', '1f447.png', '1f448.png', '1f449.png', '1f44a.png',
1051
+ '1f44b.png', '1f44c.png', '1f450.png', '1f4aa.png', '1f590.png',
1052
+ '1f596.png', '1f64c.png', '1f64f.png', '270c.png', '270d.png'
1053
+ ],
1054
+ 'Женские эмоции': [
1055
+ '1f645.png', '1f646.png', '1f64b.png', '1f64d.png', '1f64e.png'
1056
+ ],
1057
+ 'Котики': [
1058
+ '1f638.png', '1f639.png', '1f63a.png', '1f63b.png', '1f63c.png',
1059
+ '1f63d.png', '1f63e.png', '1f63f.png', '1f640.png'
1060
+ ],
1061
+ 'Разное': [
1062
+ '1f440.png', '1f441.png', '1f499.png', '1f4a1.png', '1f4a3.png',
1063
+ '1f4a9.png', '1f4ac.png', '1f4af.png', '2764.png', '203c.png', '26d4.png'
1064
+ ]
1065
+ };
953
1066
 
954
- const stickers = ['📌','📎','🗂️','📁','🧩','🎯','💡','⭐','🔥','🚀','🎉','🧠'];
955
- stickers.forEach(s => {
956
- const btn = document.createElement('button');
957
- btn.className = 'moodboard-sticker__btn';
958
- btn.title = s;
959
- btn.textContent = s;
960
- btn.addEventListener('click', () => this.animateButton(btn));
961
- stickersGrid.appendChild(btn);
1067
+ Object.entries(fallbackEmojis).forEach(([category, emojis]) => {
1068
+ const emojiList = emojis.map(file => ({
1069
+ path: `${basePath}${category}/${file}`,
1070
+ url: `${basePath}${category}/${file}`
1071
+ }));
1072
+ groups.set(category, emojiList);
962
1073
  });
963
- this.emojiPopupEl.appendChild(stickersTitle);
964
- this.emojiPopupEl.appendChild(stickersGrid);
965
- this.container.appendChild(this.emojiPopupEl);
1074
+
1075
+ return groups;
1076
+ }
1077
+
1078
+ /**
1079
+ * Определяет базовый путь для эмоджи в зависимости от режима
1080
+ */
1081
+ getEmojiBasePath() {
1082
+ // Проверяем, есть ли глобальная настройка базового пути
1083
+ if (window.MOODBOARD_BASE_PATH) {
1084
+ return `${window.MOODBOARD_BASE_PATH}src/assets/emodji/`;
1085
+ }
1086
+
1087
+ // Попытка определить автоматически
1088
+ const scripts = document.querySelectorAll('script[src]');
1089
+ for (const script of scripts) {
1090
+ if (script.src.includes('moodboard') || script.src.includes('node_modules')) {
1091
+ const baseUrl = new URL(script.src).origin;
1092
+ return `${baseUrl}/node_modules/moodboard-futurello/src/assets/emodji/`;
1093
+ }
1094
+ }
1095
+
1096
+ // Fallback: относительный путь
1097
+ return './src/assets/emodji/';
966
1098
  }
967
1099
 
968
1100
  toggleEmojiPopup(anchorButton) {
@@ -999,6 +1131,38 @@ export class Toolbar {
999
1131
  this.emojiPopupEl.style.display = 'none';
1000
1132
  }
1001
1133
  }
1134
+
1135
+ /**
1136
+ * Показывает диалог подтверждения очистки холста
1137
+ */
1138
+ showClearConfirmation() {
1139
+ // Проверяем, есть ли объекты на холсте для очистки
1140
+ let hasObjects = false;
1141
+ const checkData = { objects: [] };
1142
+ this.eventBus.emit(Events.Tool.GetAllObjects, checkData);
1143
+ hasObjects = checkData.objects && checkData.objects.length > 0;
1144
+
1145
+ if (!hasObjects) {
1146
+ // Если холст уже пуст, показываем уведомление
1147
+ alert('Холст уже пуст');
1148
+ return;
1149
+ }
1150
+
1151
+ // Показываем диалог подтверждения
1152
+ const confirmed = confirm(
1153
+ 'Вы уверены, что хотите очистить холст?\n\n' +
1154
+ 'Это действие удалит все объекты с холста и не может быть отменено.'
1155
+ );
1156
+
1157
+ if (confirmed) {
1158
+ // Пользователь подтвердил - выполняем очистку
1159
+ this.eventBus.emit(Events.UI.ToolbarAction, {
1160
+ type: 'clear',
1161
+ id: 'clear'
1162
+ });
1163
+ }
1164
+ // Если не подтвердил - ничего не делаем
1165
+ }
1002
1166
 
1003
1167
  /**
1004
1168
  * Изменение темы
package/src/ui/Topbar.js CHANGED
@@ -14,6 +14,15 @@ export class Topbar {
14
14
  // Загружаем иконки
15
15
  this.iconLoader = new TopbarIconLoader();
16
16
  this.icons = this.iconLoader.icons;
17
+ // Палитра кнопки заливки и соответствие цвету фона доски
18
+ this._palette = [
19
+ { id: 1, name: 'default-light', btnHex: '#B3E5FC', board: '#f7fbff' },
20
+ { id: 2, name: 'mint-light', btnHex: '#E8F5E9', board: '#f8fff7' },
21
+ { id: 3, name: 'peach-light', btnHex: '#FFF3E0', board: '#fffcf7' },
22
+ { id: 4, name: 'gray-light', btnHex: '#f5f5f5', board: '#f5f5f5' },
23
+ { id: 5, name: 'white', btnHex: '#ffffff', board: '#ffffff' }
24
+ ];
25
+ this._pendingPaintHex = null;
17
26
  this.init();
18
27
  }
19
28
 
@@ -34,6 +43,21 @@ export class Topbar {
34
43
  this.eventBus.on(Events.UI.GridCurrent, ({ type }) => {
35
44
  this.setActive(type);
36
45
  });
46
+
47
+ // Обновляем цвет кнопки "краски" при выборе цвета фона
48
+ this.eventBus.on(Events.UI.PaintPick, ({ btnHex }) => {
49
+ if (!btnHex) return;
50
+ this.setPaintButtonHex(btnHex);
51
+ });
52
+
53
+ // Инициализация цвета кнопки "краска" из текущего фона доски, если доступен
54
+ try {
55
+ const bgHex = this._getCurrentBoardBackgroundHex();
56
+ if (bgHex) {
57
+ const mapped = this.mapBoardToBtnHex(bgHex);
58
+ this.setPaintButtonHex(mapped);
59
+ }
60
+ } catch (_) {}
37
61
  }
38
62
 
39
63
  createTopbar() {
@@ -104,6 +128,12 @@ export class Topbar {
104
128
 
105
129
  paintBtn.dataset.action = 'paint-toggle';
106
130
  this.element.appendChild(paintBtn);
131
+ this._paintBtn = paintBtn;
132
+ // Применяем отложенный цвет, если был задан до создания кнопки
133
+ if (this._pendingPaintHex) {
134
+ try { this._paintBtn.style.setProperty('--paint-btn-color', this._pendingPaintHex); } catch (_) {}
135
+ this._pendingPaintHex = null;
136
+ }
107
137
 
108
138
  // (кнопки зума вынесены в отдельную панель справа)
109
139
 
@@ -160,6 +190,34 @@ export class Topbar {
160
190
  // Зум обрабатывается в отдельной панели
161
191
  }
162
192
 
193
+ /** Возвращает текущий цвет фона канваса как hex-строку #RRGGBB */
194
+ _getCurrentBoardBackgroundHex() {
195
+ try {
196
+ const app = window?.moodboard?.core?.pixi?.app;
197
+ const colorInt = app?.renderer?.background?.color ?? app?.renderer?.backgroundColor;
198
+ if (typeof colorInt !== 'number') return null;
199
+ const hex = `#${colorInt.toString(16).padStart(6, '0')}`;
200
+ return hex.toLowerCase();
201
+ } catch (_) { return null; }
202
+ }
203
+
204
+ /** Маппинг цвета фона к цвету кнопки палитры */
205
+ mapBoardToBtnHex(boardHex) {
206
+ if (!boardHex) return null;
207
+ const found = this._palette.find(p => p.board.toLowerCase() === boardHex.toLowerCase());
208
+ return found ? found.btnHex : boardHex;
209
+ }
210
+
211
+ /** Установить цвет кнопки палитры */
212
+ setPaintButtonHex(btnHex) {
213
+ if (!btnHex) return;
214
+ if (this._paintBtn) {
215
+ try { this._paintBtn.style.setProperty('--paint-btn-color', btnHex); } catch (_) {}
216
+ } else {
217
+ this._pendingPaintHex = btnHex;
218
+ }
219
+ }
220
+
163
221
  setActive(type) {
164
222
  const buttons = this.element.querySelectorAll('.moodboard-topbar__button');
165
223
  buttons.forEach((b) => b.classList.remove('moodboard-topbar__button--active'));
@@ -186,37 +244,81 @@ export class Topbar {
186
244
  // 3: фон #fffcf7, кнопка #FFF3E0
187
245
  // 4: фон #f5f5f5, кнопка #f5f5f5
188
246
  // 5: фон #ffffff, кнопка #ffffff
189
- const colors = [
190
- { id: 1, name: 'default-light', hex: '#B3E5FC', board: '#f7fbff' },
191
- { id: 2, name: 'mint-light', hex: '#E8F5E9', board: '#f8fff7' },
192
- { id: 3, name: 'peach-light', hex: '#FFF3E0', board: '#fffcf7' },
193
- { id: 4, name: 'gray-light', hex: '#f5f5f5', board: '#f5f5f5' },
194
- { id: 5, name: 'white', hex: '#ffffff', board: '#ffffff' }
195
- ];
247
+ const colors = this._palette.map(c => ({ id: c.id, name: c.name, hex: c.btnHex, board: c.board }));
196
248
  const grid = document.createElement('div');
197
249
  grid.className = 'moodboard-topbar__paint-grid';
250
+ const darken = (hex, amount = 0.25) => {
251
+ try {
252
+ const h = hex.replace('#','');
253
+ const r = parseInt(h.substring(0,2), 16);
254
+ const g = parseInt(h.substring(2,4), 16);
255
+ const b = parseInt(h.substring(4,6), 16);
256
+ const dr = Math.max(0, Math.min(255, Math.round(r * (1 - amount))));
257
+ const dg = Math.max(0, Math.min(255, Math.round(g * (1 - amount))));
258
+ const db = Math.max(0, Math.min(255, Math.round(b * (1 - amount))));
259
+ return `#${dr.toString(16).padStart(2,'0')}${dg.toString(16).padStart(2,'0')}${db.toString(16).padStart(2,'0')}`;
260
+ } catch (_) { return hex; }
261
+ };
262
+
198
263
  colors.forEach(c => {
199
264
  const b = document.createElement('button');
200
265
  b.type = 'button';
201
266
  b.className = 'moodboard-topbar__paint-btn';
202
267
  b.title = `Цвет ${c.id}`;
203
268
  b.style.background = c.hex;
269
+ // Тёмная обводка того же цвета
270
+ b.style.borderColor = darken(c.hex, 0.35);
271
+ // Цвет галочки — чёрный для максимальной видимости
272
+ b.style.color = '#111';
273
+ // Для надёжного сравнения — сохраняем исходный hex в dataset
274
+ b.dataset.hex = String(c.hex).toLowerCase();
275
+ // Галочка по центру
276
+ const tick = document.createElement('i');
277
+ tick.className = 'moodboard-topbar__paint-tick';
278
+ b.appendChild(tick);
204
279
  b.dataset.colorId = String(c.id);
205
280
  b.addEventListener('click', () => {
206
- this.eventBus.emit(Events.UI.PaintPick, { id: c.id, color: c.board, name: c.name });
207
- if (this._paintPopover) this._paintPopover.remove();
208
- this._paintPopover = null;
281
+ // Обновляем галочку на выбранном цвете
282
+ try {
283
+ const prev = grid.querySelector('.moodboard-topbar__paint-btn.is-active');
284
+ if (prev) prev.classList.remove('is-active');
285
+ b.classList.add('is-active');
286
+ } catch (_) {}
287
+ // Мгновенно обновляем цвет кнопки "краска"
288
+ this.setPaintButtonHex(c.hex);
289
+ // Передаём выбор в ядро для смены фона
290
+ this.eventBus.emit(Events.UI.PaintPick, { id: c.id, color: c.board, name: c.name, btnHex: c.hex });
291
+ // Поповер не закрываем, чтобы пользователь видел галочку и мог передумать
209
292
  });
210
293
  grid.appendChild(b);
211
294
  });
212
295
  pop.appendChild(grid);
213
296
 
297
+ // Выделяем активный цвет галочкой
298
+ try {
299
+ const boardHex = this._getCurrentBoardBackgroundHex();
300
+ const targetHex = (this.mapBoardToBtnHex(boardHex) || '#B3E5FC').toLowerCase();
301
+ const match = grid.querySelector(`[data-hex="${targetHex}"]`);
302
+ if (match) match.classList.add('is-active');
303
+ } catch (_) {}
304
+
214
305
  // позиционируем поповер
215
306
  const rect = anchorBtn.getBoundingClientRect();
216
307
  pop.style.position = 'absolute';
217
308
  pop.style.left = `${rect.left - this.element.getBoundingClientRect().left}px`;
218
309
  pop.style.top = `${rect.bottom - this.element.getBoundingClientRect().top + 6}px`;
219
310
 
311
+ // Подсветить текущий активный кружок (с галочкой)
312
+ try {
313
+ const currentBtnHex = (this._paintBtn && getComputedStyle(this._paintBtn).getPropertyValue('--paint-btn-color')) || '';
314
+ const normalized = currentBtnHex.trim() || '#B3E5FC';
315
+ const match = Array.from(grid.children).find((el) => {
316
+ const bg = el && el.style && el.style.background ? el.style.background.toLowerCase() : '';
317
+ return bg === normalized.toLowerCase();
318
+ });
319
+ if (match) match.classList.add('is-active');
320
+ } catch (_) {}
321
+
220
322
  this.element.appendChild(pop);
221
323
  this._paintPopover = pop;
222
324
 
@@ -18,7 +18,10 @@ export class ZoomPanel {
18
18
  const zoomOutBtn = document.createElement('button');
19
19
  zoomOutBtn.className = 'moodboard-zoombar__button';
20
20
  zoomOutBtn.title = 'Уменьшить масштаб';
21
- zoomOutBtn.textContent = '';
21
+ const zoomOutIcon = document.createElement('span');
22
+ zoomOutIcon.className = 'moodboard-zoombar__icon';
23
+ zoomOutIcon.textContent = '−';
24
+ zoomOutBtn.appendChild(zoomOutIcon);
22
25
  zoomOutBtn.dataset.action = 'zoom-out';
23
26
 
24
27
  const label = document.createElement('span');
@@ -37,7 +40,10 @@ export class ZoomPanel {
37
40
  const zoomInBtn = document.createElement('button');
38
41
  zoomInBtn.className = 'moodboard-zoombar__button';
39
42
  zoomInBtn.title = 'Увеличить масштаб';
40
- zoomInBtn.textContent = '+';
43
+ const zoomInIcon = document.createElement('span');
44
+ zoomInIcon.className = 'moodboard-zoombar__icon';
45
+ zoomInIcon.textContent = '+';
46
+ zoomInBtn.appendChild(zoomInIcon);
41
47
  zoomInBtn.dataset.action = 'zoom-in';
42
48
 
43
49
  this.element.appendChild(zoomOutBtn);
@@ -0,0 +1,5 @@
1
+ @import './workspace.css';
2
+ @import './toolbar.css';
3
+ @import './topbar.css';
4
+ @import './panels.css';
5
+