@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.
- package/package.json +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
- 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
- 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
- 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
- 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
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f446.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f447.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f448.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f449.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f44a.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f44b.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f44c.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f450.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f4aa.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f590.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f596.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f64c.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/1f64f.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/261d.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/270a.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/270b.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/270c.png +0 -0
- package/src/assets/emodji//320/226/320/265/321/201/321/202/321/213/270d.png +0 -0
- package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f638.png +0 -0
- package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f639.png +0 -0
- package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f63a.png +0 -0
- package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f63b.png +0 -0
- package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f63c.png +0 -0
- package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f63d.png +0 -0
- package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f63e.png +0 -0
- package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f63f.png +0 -0
- package/src/assets/emodji//320/232/320/276/321/202/320/270/320/272/320/270/1f640.png +0 -0
- 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
- 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
- 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
- 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
- package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f440.png +0 -0
- package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f441.png +0 -0
- package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f499.png +0 -0
- package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f4a1.png +0 -0
- package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f4a3.png +0 -0
- package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f4a9.png +0 -0
- package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f4ac.png +0 -0
- package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/1f4af.png +0 -0
- package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/203c.png +0 -0
- package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/26d4.png +0 -0
- package/src/assets/emodji//320/240/320/260/320/267/320/275/320/276/320/265/2764.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f600.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f601.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f602.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f603.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f604.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f605.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f606.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f607.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f609.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f60a.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f60b.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f60c.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f60d.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f60e.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f60f.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f610.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f611.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f612.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f613.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f614.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f615.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f616.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f617.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f618.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f619.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f61a.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f61b.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f61c.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f61d.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f61e.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f61f.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f620.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f621.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f622.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f623.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f624.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f625.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f626.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f627.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f628.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f629.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f62a.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f62b.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f62c.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f62d.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f62e.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f62f.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f630.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f631.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f632.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f633.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f635.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f636.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f641.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/1f642.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/2639.png +0 -0
- package/src/assets/emodji//320/241/320/274/320/260/320/271/320/273/320/270/320/272/320/270/263a.png +0 -0
- package/src/assets/fonts/amatic-sc/AmaticSC-Bold.ttf +0 -0
- package/src/assets/fonts/amatic-sc/AmaticSC-Regular.ttf +0 -0
- package/src/assets/fonts/caveat/Caveat-Bold.ttf +0 -0
- package/src/assets/fonts/caveat/Caveat-Medium.ttf +0 -0
- package/src/assets/fonts/caveat/Caveat-Regular.ttf +0 -0
- package/src/assets/fonts/caveat/Caveat-SemiBold.ttf +0 -0
- package/src/assets/fonts/caveat/Caveat-VariableFont_wght.ttf +0 -0
- package/src/assets/fonts/great-vibes/GreatVibes-Regular.ttf +0 -0
- package/src/assets/fonts/lobster/Lobster-Regular.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-Black.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-BlackItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-Bold.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-BoldItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-ExtraBold.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-ExtraBoldItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-ExtraLight.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-ExtraLightItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-Italic-VariableFont_wdth,wght.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-Italic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-Light.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-LightItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-Medium.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-MediumItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-Regular.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-SemiBold.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-SemiBoldItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-Thin.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-ThinItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif-VariableFont_wdth,wght.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Black.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-BlackItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Bold.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-BoldItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-ExtraBold.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-ExtraBoldItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-ExtraLight.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-ExtraLightItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Italic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Light.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-LightItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Medium.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-MediumItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Regular.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-SemiBold.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-SemiBoldItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-Thin.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_Condensed-ThinItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Black.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-BlackItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Bold.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-BoldItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-ExtraBold.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-ExtraBoldItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-ExtraLight.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-ExtraLightItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Italic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Light.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-LightItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Medium.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-MediumItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Regular.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-SemiBold.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-SemiBoldItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-Thin.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_ExtraCondensed-ThinItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Black.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-BlackItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Bold.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-BoldItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-ExtraBold.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-ExtraBoldItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-ExtraLight.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-ExtraLightItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Italic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Light.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-LightItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Medium.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-MediumItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Regular.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-SemiBold.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-SemiBoldItalic.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-Thin.ttf +0 -0
- package/src/assets/fonts/noto-serif/NotoSerif_SemiCondensed-ThinItalic.ttf +0 -0
- package/src/assets/fonts/oswald/Oswald-Bold.ttf +0 -0
- package/src/assets/fonts/oswald/Oswald-ExtraLight.ttf +0 -0
- package/src/assets/fonts/oswald/Oswald-Light.ttf +0 -0
- package/src/assets/fonts/oswald/Oswald-Medium.ttf +0 -0
- package/src/assets/fonts/oswald/Oswald-Regular.ttf +0 -0
- package/src/assets/fonts/oswald/Oswald-SemiBold.ttf +0 -0
- package/src/assets/fonts/oswald/Oswald-VariableFont_wght.ttf +0 -0
- package/src/assets/fonts/pacifico/Pacifico-Regular.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-Black.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-BlackItalic.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-Bold.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-BoldItalic.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-ExtraBold.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-ExtraBoldItalic.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-Italic-VariableFont_wght.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-Italic.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-Medium.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-MediumItalic.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-Regular.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-SemiBold.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-SemiBoldItalic.ttf +0 -0
- package/src/assets/fonts/playfair/PlayfairDisplay-VariableFont_wght.ttf +0 -0
- package/src/assets/fonts/poiret-one/PoiretOne-Regular.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-Black.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-BlackItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-Bold.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-BoldItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-ExtraBold.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-ExtraBoldItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-ExtraLight.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-ExtraLightItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-Italic-VariableFont_wdth,wght.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-Italic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-Light.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-LightItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-Medium.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-MediumItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-Regular.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-SemiBold.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-SemiBoldItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-Thin.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-ThinItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto-VariableFont_wdth,wght.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-Black.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-BlackItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-Bold.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-BoldItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-ExtraBold.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-ExtraBoldItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-ExtraLight.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-ExtraLightItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-Italic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-Light.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-LightItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-Medium.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-MediumItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-Regular.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-SemiBold.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-SemiBoldItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-Thin.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_Condensed-ThinItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-Black.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-BlackItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-Bold.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-BoldItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-ExtraBold.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-ExtraBoldItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-ExtraLight.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-ExtraLightItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-Italic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-Light.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-LightItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-Medium.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-MediumItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-Regular.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-SemiBold.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-SemiBoldItalic.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-Thin.ttf +0 -0
- package/src/assets/fonts/roboto/Roboto_SemiCondensed-ThinItalic.ttf +0 -0
- package/src/assets/fonts/roboto-slab/RobotoSlab-Black.ttf +0 -0
- package/src/assets/fonts/roboto-slab/RobotoSlab-Bold.ttf +0 -0
- package/src/assets/fonts/roboto-slab/RobotoSlab-ExtraBold.ttf +0 -0
- package/src/assets/fonts/roboto-slab/RobotoSlab-ExtraLight.ttf +0 -0
- package/src/assets/fonts/roboto-slab/RobotoSlab-Light.ttf +0 -0
- package/src/assets/fonts/roboto-slab/RobotoSlab-Medium.ttf +0 -0
- package/src/assets/fonts/roboto-slab/RobotoSlab-Regular.ttf +0 -0
- package/src/assets/fonts/roboto-slab/RobotoSlab-SemiBold.ttf +0 -0
- package/src/assets/fonts/roboto-slab/RobotoSlab-Thin.ttf +0 -0
- package/src/assets/fonts/roboto-slab/RobotoSlab-VariableFont_wght.ttf +0 -0
- package/src/assets/fonts/rubik-mono-one/RubikMonoOne-Regular.ttf +0 -0
- package/src/assets/icons/arrows-up-down-left-right.svg +1 -0
- package/src/assets/icons/arrows-up-down.svg +1 -0
- package/src/assets/icons/attachments.svg +1 -3
- package/src/assets/icons/attachments2.svg +3 -0
- package/src/assets/icons/clear.svg +1 -5
- package/src/assets/icons/cursor-default-custom.svg +10 -0
- package/src/assets/icons/cursor-default.svg +1 -0
- package/src/assets/icons/cursor-default2.svg +1 -0
- package/src/assets/icons/emoji.svg +1 -6
- package/src/assets/icons/emoji2.svg +6 -0
- package/src/assets/icons/frame.svg +1 -3
- package/src/assets/icons/frame2.svg +3 -0
- package/src/assets/icons/i-cursor.svg +1 -0
- package/src/assets/icons/image.svg +1 -3
- package/src/assets/icons/image2.svg +3 -0
- package/src/assets/icons/note.svg +1 -3
- package/src/assets/icons/note2.svg +3 -0
- package/src/assets/icons/pencil.svg +1 -3
- package/src/assets/icons/pencil2.svg +3 -0
- package/src/assets/icons/select.svg +1 -1
- package/src/assets/icons/shapes.svg +1 -3
- package/src/assets/icons/shapes2.svg +3 -0
- package/src/assets/icons/text-add.svg +1 -3
- package/src/assets/icons/text-add2.svg +3 -0
- package/src/assets/icons/trash.svg +1 -0
- package/src/core/commands/GroupMoveCommand.js +49 -13
- package/src/core/commands/MoveObjectCommand.js +4 -24
- package/src/core/events/Events.js +2 -0
- package/src/core/index.js +72 -40
- package/src/grid/GridFactory.js +3 -3
- package/src/grid/LineGrid.js +42 -20
- package/src/moodboard/MoodBoard.js +11 -0
- package/src/objects/DrawingObject.js +5 -5
- package/src/objects/FrameObject.js +1 -0
- package/src/objects/ImageObject.js +24 -5
- package/src/objects/NoteObject.js +221 -48
- package/src/services/BoardService.js +3 -3
- package/src/services/ZoomPanController.js +14 -3
- package/src/tools/BaseTool.js +6 -1
- package/src/tools/ToolManager.js +24 -1
- package/src/tools/object-tools/DrawingTool.js +3 -1
- package/src/tools/object-tools/PlacementTool.js +213 -93
- package/src/tools/object-tools/SelectTool.js +318 -134
- package/src/tools/object-tools/TextTool.js +23 -2
- package/src/ui/FramePropertiesPanel.js +101 -96
- package/src/ui/HtmlHandlesLayer.js +253 -52
- package/src/ui/HtmlTextLayer.js +120 -32
- package/src/ui/NotePropertiesPanel.js +115 -38
- package/src/ui/TextPropertiesPanel.js +100 -118
- package/src/ui/Toolbar.js +136 -50
- package/src/ui/Topbar.js +112 -10
- package/src/ui/ZoomPanel.js +8 -2
- package/src/ui/styles/index.css +5 -0
- package/src/ui/styles/panels.css +232 -0
- package/src/ui/styles/toolbar.css +77 -0
- package/src/ui/styles/topbar.css +113 -0
- package/src/ui/styles/workspace.css +412 -263
- package/src/utils/emojiResolver.js +121 -0
package/src/core/index.js
CHANGED
|
@@ -551,7 +551,8 @@ export class CoreMoodBoard {
|
|
|
551
551
|
|
|
552
552
|
// События перетаскивания
|
|
553
553
|
this.eventBus.on(Events.Tool.DragStart, (data) => {
|
|
554
|
-
// Сохраняем начальную позицию как
|
|
554
|
+
// Сохраняем начальную позицию как левый-верх
|
|
555
|
+
// Все объекты используют pivot по центру, поэтому логика одинакова
|
|
555
556
|
const pixiObject = this.pixi.objects.get(data.object);
|
|
556
557
|
if (pixiObject) {
|
|
557
558
|
const halfW = (pixiObject.width || 0) / 2;
|
|
@@ -688,7 +689,8 @@ export class CoreMoodBoard {
|
|
|
688
689
|
}
|
|
689
690
|
}
|
|
690
691
|
if (moves.length > 0) {
|
|
691
|
-
|
|
692
|
+
// Обычное групповое перемещение - координаты центров PIXI
|
|
693
|
+
const cmd = new GroupMoveCommand(this, moves, false);
|
|
692
694
|
cmd.setEventBus(this.eventBus);
|
|
693
695
|
this.history.executeCommand(cmd);
|
|
694
696
|
}
|
|
@@ -713,7 +715,9 @@ export class CoreMoodBoard {
|
|
|
713
715
|
if (this.dragStartPosition) {
|
|
714
716
|
const pixiObject = this.pixi.objects.get(data.object);
|
|
715
717
|
if (pixiObject) {
|
|
716
|
-
|
|
718
|
+
// Берем финальную позицию из state, который обновлялся во время drag:update
|
|
719
|
+
const objState = this.state.state.objects.find(o => o.id === data.object);
|
|
720
|
+
const finalPosition = objState && objState.position ? { x: objState.position.x, y: objState.position.y } : { x: 0, y: 0 };
|
|
717
721
|
|
|
718
722
|
// Создаем команду только если позиция действительно изменилась
|
|
719
723
|
if (this.dragStartPosition.x !== finalPosition.x ||
|
|
@@ -737,7 +741,8 @@ export class CoreMoodBoard {
|
|
|
737
741
|
const to = { x: child.position.x, y: child.position.y };
|
|
738
742
|
moves.push({ id: childId, from, to });
|
|
739
743
|
}
|
|
740
|
-
|
|
744
|
+
// Frame перемещение - координаты уже левый-верх
|
|
745
|
+
const cmd = new GroupMoveCommand(this, moves, true);
|
|
741
746
|
cmd.setEventBus(this.eventBus);
|
|
742
747
|
this.history.executeCommand(cmd);
|
|
743
748
|
} else {
|
|
@@ -1063,33 +1068,54 @@ export class CoreMoodBoard {
|
|
|
1063
1068
|
const objectType = object ? object.type : null;
|
|
1064
1069
|
|
|
1065
1070
|
// Сохраняем пропорции для фреймов, кроме произвольных (lockedAspect=false)
|
|
1066
|
-
if (objectType === 'frame' && data.size) {
|
|
1071
|
+
if ((objectType === 'frame' || (objectType === 'image' && object?.properties?.isEmojiIcon)) && data.size) {
|
|
1067
1072
|
const lockedAspect = !!(object?.properties && (object.properties.lockedAspect === true));
|
|
1068
|
-
|
|
1073
|
+
const isEmoji = (objectType === 'image' && object?.properties?.isEmojiIcon);
|
|
1074
|
+
if (!lockedAspect && !isEmoji) {
|
|
1069
1075
|
// произвольные фреймы — без ограничений
|
|
1070
1076
|
} else {
|
|
1071
1077
|
const start = this._activeResize?.startSize || { width: object.width, height: object.height };
|
|
1072
|
-
const aspect = (start.width > 0 && start.height > 0) ? (start.width / start.height) : (object.width / Math.max(1, object.height));
|
|
1078
|
+
const aspect = isEmoji ? 1 : ((start.width > 0 && start.height > 0) ? (start.width / start.height) : (object.width / Math.max(1, object.height)));
|
|
1073
1079
|
let w = Math.max(1, data.size.width);
|
|
1074
1080
|
let h = Math.max(1, data.size.height);
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
+
const hndl = (this._activeResize?.handle || '').toLowerCase();
|
|
1082
|
+
if (isEmoji) {
|
|
1083
|
+
// Делаем квадрат, фиксируя противоположную сторону к старту
|
|
1084
|
+
const s = Math.max(w, h);
|
|
1085
|
+
// Вычислим позицию сразу, чтобы не было дрейфа правой/нижней границы
|
|
1086
|
+
if (!data.position && this._activeResize && this._activeResize.objectId === data.object) {
|
|
1087
|
+
const startPos = this._activeResize.startPosition;
|
|
1088
|
+
const sw = this._activeResize.startSize.width;
|
|
1089
|
+
const sh = this._activeResize.startSize.height;
|
|
1090
|
+
let x = startPos.x;
|
|
1091
|
+
let y = startPos.y;
|
|
1092
|
+
if (hndl.includes('w')) { x = startPos.x + (sw - s); }
|
|
1093
|
+
if (hndl.includes('n')) { y = startPos.y + (sh - s); }
|
|
1094
|
+
const isEdge = ['n','s','e','w'].includes(hndl);
|
|
1095
|
+
if (isEdge) {
|
|
1096
|
+
if (hndl === 'n' || hndl === 's') x = startPos.x + Math.round((sw - s) / 2);
|
|
1097
|
+
if (hndl === 'e' || hndl === 'w') y = startPos.y + Math.round((sh - s) / 2);
|
|
1098
|
+
}
|
|
1099
|
+
data.position = { x: Math.round(x), y: Math.round(y) };
|
|
1100
|
+
}
|
|
1101
|
+
w = s; h = s;
|
|
1081
1102
|
} else {
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
const area = Math.max(1, w * h);
|
|
1087
|
-
if (area < minArea) {
|
|
1088
|
-
const scale = Math.sqrt(minArea / area);
|
|
1089
|
-
w = Math.round(w * scale);
|
|
1090
|
-
h = Math.round(h * scale);
|
|
1103
|
+
// Обычная поддержка аспекта для фреймов
|
|
1104
|
+
const dw = Math.abs(w - start.width);
|
|
1105
|
+
const dh = Math.abs(h - start.height);
|
|
1106
|
+
if (dw >= dh) { h = Math.round(w / aspect); } else { w = Math.round(h * aspect); }
|
|
1091
1107
|
}
|
|
1092
|
-
|
|
1108
|
+
// Минимальная площадь — только для фреймов
|
|
1109
|
+
if (!isEmoji) {
|
|
1110
|
+
const minArea = 1800;
|
|
1111
|
+
const area = Math.max(1, w * h);
|
|
1112
|
+
if (area < minArea) {
|
|
1113
|
+
const scale = Math.sqrt(minArea / area);
|
|
1114
|
+
w = Math.round(w * scale);
|
|
1115
|
+
h = Math.round(h * scale);
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
data.size = { width: w, height: h };
|
|
1093
1119
|
|
|
1094
1120
|
// Если позиция известна (фиксированная противоположная сторона) — откорректируем её
|
|
1095
1121
|
if (!data.position && this._activeResize && this._activeResize.objectId === data.object) {
|
|
@@ -1374,9 +1400,9 @@ export class CoreMoodBoard {
|
|
|
1374
1400
|
|
|
1375
1401
|
// Обновляем ручки когда объект изменяется через команды (Undo/Redo)
|
|
1376
1402
|
this.eventBus.on(Events.Object.TransformUpdated, (data) => {
|
|
1377
|
-
console.log(`🔄 Объект ${data.objectId} был изменен через команду, обновляем ручки`);
|
|
1378
1403
|
// Обновляем ручки если объект выделен
|
|
1379
|
-
if (this.selectTool && this.selectTool.
|
|
1404
|
+
if (this.selectTool && this.selectTool.selection && this.selectTool.selection.has(data.objectId)) {
|
|
1405
|
+
console.log(`🔄 Core: Объект ${data.objectId} изменен через команду, обновляем ручки SelectTool`);
|
|
1380
1406
|
this.selectTool.updateResizeHandles();
|
|
1381
1407
|
}
|
|
1382
1408
|
});
|
|
@@ -1388,27 +1414,21 @@ export class CoreMoodBoard {
|
|
|
1388
1414
|
});
|
|
1389
1415
|
|
|
1390
1416
|
// Получение позиции объекта (левый-верх логических координат)
|
|
1417
|
+
// Используем размеры PIXI для согласованности с updateObjectPositionDirect
|
|
1391
1418
|
this.eventBus.on(Events.Tool.GetObjectPosition, (data) => {
|
|
1392
1419
|
const pixiObject = this.pixi.objects.get(data.objectId);
|
|
1393
|
-
if (pixiObject)
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1420
|
+
if (!pixiObject) return;
|
|
1421
|
+
|
|
1422
|
+
// Всегда используем размеры из PIXI для согласованности
|
|
1423
|
+
const halfW = (pixiObject.width || 0) / 2;
|
|
1424
|
+
const halfH = (pixiObject.height || 0) / 2;
|
|
1425
|
+
data.position = { x: pixiObject.x - halfW, y: pixiObject.y - halfH };
|
|
1398
1426
|
});
|
|
1399
1427
|
|
|
1400
1428
|
// Получение PIXI объекта
|
|
1401
1429
|
this.eventBus.on(Events.Tool.GetObjectPixi, (data) => {
|
|
1402
|
-
console.log(`🔍 Запрос PIXI объекта для ${data.objectId}`);
|
|
1403
|
-
console.log('📋 Доступные PIXI объекты:', Array.from(this.pixi.objects.keys()));
|
|
1404
|
-
|
|
1405
1430
|
const pixiObject = this.pixi.objects.get(data.objectId);
|
|
1406
|
-
|
|
1407
|
-
console.log(`✅ PIXI объект найден для ${data.objectId}`);
|
|
1408
|
-
data.pixiObject = pixiObject;
|
|
1409
|
-
} else {
|
|
1410
|
-
console.log(`❌ PIXI объект НЕ найден для ${data.objectId}`);
|
|
1411
|
-
}
|
|
1431
|
+
data.pixiObject = pixiObject || null;
|
|
1412
1432
|
});
|
|
1413
1433
|
|
|
1414
1434
|
// Получение списка всех объектов (с их PIXI и логическими границами)
|
|
@@ -1533,6 +1553,9 @@ export class CoreMoodBoard {
|
|
|
1533
1553
|
if (updates.properties.fontSize !== undefined) {
|
|
1534
1554
|
styleUpdates.fontSize = updates.properties.fontSize;
|
|
1535
1555
|
}
|
|
1556
|
+
if (updates.properties.fontFamily !== undefined) {
|
|
1557
|
+
styleUpdates.fontFamily = updates.properties.fontFamily;
|
|
1558
|
+
}
|
|
1536
1559
|
|
|
1537
1560
|
if (Object.keys(styleUpdates).length > 0) {
|
|
1538
1561
|
instance.setStyle(styleUpdates);
|
|
@@ -1872,7 +1895,8 @@ export class CoreMoodBoard {
|
|
|
1872
1895
|
* Используется во время перетаскивания для плавного движения
|
|
1873
1896
|
*/
|
|
1874
1897
|
updateObjectPositionDirect(objectId, position) {
|
|
1875
|
-
// position — левый верх (state); приводим к центру в PIXI
|
|
1898
|
+
// position — левый верх (state); приводим к центру в PIXI, используя размеры PIXI объекта
|
|
1899
|
+
// Все объекты используют pivot по центру, поэтому логика одинакова для всех
|
|
1876
1900
|
const pixiObject = this.pixi.objects.get(objectId);
|
|
1877
1901
|
if (pixiObject) {
|
|
1878
1902
|
const halfW = (pixiObject.width || 0) / 2;
|
|
@@ -1957,6 +1981,14 @@ export class CoreMoodBoard {
|
|
|
1957
1981
|
};
|
|
1958
1982
|
const initialWidth = (properties && typeof properties.width === 'number') ? properties.width : 100;
|
|
1959
1983
|
const initialHeight = (properties && typeof properties.height === 'number') ? properties.height : 100;
|
|
1984
|
+
// Зафиксировать пропорции для эмоджи-иконок (квадрат)
|
|
1985
|
+
if (type === 'image' && properties && properties.isEmojiIcon) {
|
|
1986
|
+
const s = Math.max(1, Math.round((initialWidth + initialHeight) / 2));
|
|
1987
|
+
properties.lockedAspect = true;
|
|
1988
|
+
properties.aspect = 1; // квадрат
|
|
1989
|
+
properties.width = s;
|
|
1990
|
+
properties.height = s;
|
|
1991
|
+
}
|
|
1960
1992
|
|
|
1961
1993
|
// Если создаём НЕ фрейм — проверим, попадает ли центр нового объекта внутрь какого-либо фрейма.
|
|
1962
1994
|
// Если да, сразу прикрепляем объект к этому фрейму (properties.frameId)
|
package/src/grid/GridFactory.js
CHANGED
package/src/grid/LineGrid.js
CHANGED
|
@@ -11,15 +11,26 @@ export class LineGrid extends BaseGrid {
|
|
|
11
11
|
// Дополнительные настройки для линейной сетки
|
|
12
12
|
this.showSubGrid = options.showSubGrid ?? false;
|
|
13
13
|
this.subGridDivisions = options.subGridDivisions || 4;
|
|
14
|
-
this.subGridColor = options.subGridColor ||
|
|
15
|
-
this.subGridOpacity = options.subGridOpacity || 0.
|
|
14
|
+
this.subGridColor = options.subGridColor || 0xE3E3E3;
|
|
15
|
+
this.subGridOpacity = options.subGridOpacity || 0.45;
|
|
16
|
+
// Более тонкие основные линии и более контрастные
|
|
17
|
+
this.lineWidth = Math.max(0.5, (options.lineWidth || this.lineWidth) / 2);
|
|
18
|
+
this.color = options.color || 0xB0B0B0;
|
|
19
|
+
this.opacity = options.opacity || 0.9;
|
|
16
20
|
}
|
|
17
21
|
|
|
18
22
|
/**
|
|
19
23
|
* Создает визуальное представление линейной сетки
|
|
20
24
|
*/
|
|
21
25
|
createVisual() {
|
|
22
|
-
|
|
26
|
+
// Применяем непрозрачность на графику (умножится на alpha линий)
|
|
27
|
+
this.graphics.alpha = this.opacity;
|
|
28
|
+
try {
|
|
29
|
+
// В новых версиях можно указать alignment для большей чёткости
|
|
30
|
+
this.graphics.lineStyle({ width: this.lineWidth, color: this.color, alpha: 1, alignment: 0.5 });
|
|
31
|
+
} catch (_) {
|
|
32
|
+
this.graphics.lineStyle(this.lineWidth, this.color, 1);
|
|
33
|
+
}
|
|
23
34
|
|
|
24
35
|
// Основные линии сетки
|
|
25
36
|
this.drawMainGrid();
|
|
@@ -34,16 +45,23 @@ export class LineGrid extends BaseGrid {
|
|
|
34
45
|
* Рисует основную сетку
|
|
35
46
|
*/
|
|
36
47
|
drawMainGrid() {
|
|
48
|
+
const w = this.width;
|
|
49
|
+
const h = this.height;
|
|
50
|
+
const step = this.size;
|
|
51
|
+
const half = this.lineWidth / 2;
|
|
52
|
+
// Выравниваем к половине пикселя для чётких линий на любых DPI
|
|
37
53
|
// Вертикальные линии
|
|
38
|
-
for (let x = 0; x <=
|
|
39
|
-
|
|
40
|
-
this.graphics.
|
|
54
|
+
for (let x = 0; x <= w; x += step) {
|
|
55
|
+
const px = Math.round(x) + (Number.isFinite(half) ? 0.5 : 0);
|
|
56
|
+
this.graphics.moveTo(px, 0);
|
|
57
|
+
this.graphics.lineTo(px, h);
|
|
41
58
|
}
|
|
42
59
|
|
|
43
60
|
// Горизонтальные линии
|
|
44
|
-
for (let y = 0; y <=
|
|
45
|
-
|
|
46
|
-
this.graphics.
|
|
61
|
+
for (let y = 0; y <= h; y += step) {
|
|
62
|
+
const py = Math.round(y) + (Number.isFinite(half) ? 0.5 : 0);
|
|
63
|
+
this.graphics.moveTo(0, py);
|
|
64
|
+
this.graphics.lineTo(w, py);
|
|
47
65
|
}
|
|
48
66
|
}
|
|
49
67
|
|
|
@@ -52,24 +70,28 @@ export class LineGrid extends BaseGrid {
|
|
|
52
70
|
*/
|
|
53
71
|
drawSubGrid() {
|
|
54
72
|
const subSize = this.size / this.subGridDivisions;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
73
|
+
try {
|
|
74
|
+
this.graphics.lineStyle({ width: 0.5, color: this.subGridColor, alpha: this.subGridOpacity, alignment: 0.5 });
|
|
75
|
+
} catch (_) {
|
|
76
|
+
this.graphics.lineStyle(0.5, this.subGridColor, this.subGridOpacity);
|
|
77
|
+
}
|
|
78
|
+
const w = this.width;
|
|
79
|
+
const h = this.height;
|
|
58
80
|
// Вертикальные подлинии
|
|
59
|
-
for (let x = subSize; x <
|
|
60
|
-
// Пропускаем основные линии
|
|
81
|
+
for (let x = subSize; x < w; x += subSize) {
|
|
61
82
|
if (x % this.size !== 0) {
|
|
62
|
-
|
|
63
|
-
this.graphics.
|
|
83
|
+
const px = Math.round(x) + 0.5;
|
|
84
|
+
this.graphics.moveTo(px, 0);
|
|
85
|
+
this.graphics.lineTo(px, h);
|
|
64
86
|
}
|
|
65
87
|
}
|
|
66
88
|
|
|
67
89
|
// Горизонтальные подлинии
|
|
68
|
-
for (let y = subSize; y <
|
|
69
|
-
// Пропускаем основные линии
|
|
90
|
+
for (let y = subSize; y < h; y += subSize) {
|
|
70
91
|
if (y % this.size !== 0) {
|
|
71
|
-
|
|
72
|
-
this.graphics.
|
|
92
|
+
const py = Math.round(y) + 0.5;
|
|
93
|
+
this.graphics.moveTo(0, py);
|
|
94
|
+
this.graphics.lineTo(w, py);
|
|
73
95
|
}
|
|
74
96
|
}
|
|
75
97
|
}
|
|
@@ -186,6 +186,17 @@ export class MoodBoard {
|
|
|
186
186
|
this.options.theme
|
|
187
187
|
);
|
|
188
188
|
|
|
189
|
+
// Инициализация цвета кнопки "краска" по текущему фону канваса
|
|
190
|
+
try {
|
|
191
|
+
const app = this.coreMoodboard?.pixi?.app;
|
|
192
|
+
const colorInt = (app?.renderer?.background && app.renderer.background.color) || app?.renderer?.backgroundColor;
|
|
193
|
+
if (typeof colorInt === 'number') {
|
|
194
|
+
const boardHex = `#${colorInt.toString(16).padStart(6, '0')}`;
|
|
195
|
+
const btnHex = this.topbar.mapBoardToBtnHex(boardHex);
|
|
196
|
+
this.topbar.setPaintButtonHex(btnHex || '#B3E5FC');
|
|
197
|
+
}
|
|
198
|
+
} catch (_) {}
|
|
199
|
+
|
|
189
200
|
// Смена фона доски по выбору цвета в топбаре
|
|
190
201
|
this.coreMoodboard.eventBus.on(Events.UI.PaintPick, ({ color }) => {
|
|
191
202
|
if (!color) return;
|
|
@@ -81,11 +81,11 @@ export class DrawingObject {
|
|
|
81
81
|
// Перерисовываем геометрию
|
|
82
82
|
this._draw(points, this.color, this.strokeWidth, this.mode);
|
|
83
83
|
|
|
84
|
-
// После перерисовки выставляем pivot по
|
|
85
|
-
// чтобы
|
|
86
|
-
const
|
|
87
|
-
const pX = Math.max(0,
|
|
88
|
-
const pY = Math.max(0,
|
|
84
|
+
// После перерисовки выставляем pivot по ЦЕНТРУ ЛОКАЛЬНЫХ границ,
|
|
85
|
+
// чтобы поворот происходил вокруг геометрического центра без диагонального смещения
|
|
86
|
+
const lb = g.getLocalBounds();
|
|
87
|
+
const pX = (lb.x || 0) + Math.max(0, lb.width / 2);
|
|
88
|
+
const pY = (lb.y || 0) + Math.max(0, lb.height / 2);
|
|
89
89
|
g.pivot.set(pX, pY);
|
|
90
90
|
|
|
91
91
|
// Восстанавливаем центр и поворот
|
|
@@ -51,6 +51,7 @@ export class FrameObject {
|
|
|
51
51
|
|
|
52
52
|
this._draw(this.width, this.height, this.fillColor);
|
|
53
53
|
// Центрируем pivot контейнера, чтобы совпадали рамка и ручки
|
|
54
|
+
// pivot по центру, чтобы позиция (x,y) контейнера соответствовала центру видимой области фрейма
|
|
54
55
|
this.container.pivot.set(this.width / 2, this.height / 2);
|
|
55
56
|
}
|
|
56
57
|
|
|
@@ -7,15 +7,19 @@ export class ImageObject {
|
|
|
7
7
|
constructor(objectData = {}) {
|
|
8
8
|
this.objectData = objectData;
|
|
9
9
|
let src = objectData.properties?.src || objectData.src;
|
|
10
|
+
const isEmojiIcon = !!objectData.properties?.isEmojiIcon;
|
|
10
11
|
// Не используем устаревшие blob: URL — они недолговечны и приводят к ERR_FILE_NOT_FOUND
|
|
11
12
|
if (typeof src === 'string' && src.startsWith('blob:')) {
|
|
12
13
|
src = null;
|
|
13
14
|
}
|
|
14
|
-
this.width = objectData.width || objectData.properties?.width || 200;
|
|
15
|
-
this.height = objectData.height || objectData.properties?.height || 150;
|
|
16
|
-
const texture = src ? PIXI.Texture.from(src) : PIXI.Texture.WHITE;
|
|
15
|
+
this.width = Math.max(1, Math.round(objectData.width || objectData.properties?.width || 200));
|
|
16
|
+
this.height = Math.max(1, Math.round(objectData.height || objectData.properties?.height || 150));
|
|
17
|
+
const texture = src ? PIXI.Texture.from(src, { resourceOptions: { resolution: (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1 } }) : PIXI.Texture.WHITE;
|
|
17
18
|
this.sprite = new PIXI.Sprite(texture);
|
|
18
19
|
this.sprite.anchor.set(0.5, 0.5); // центр для совместимости с позиционированием по центру
|
|
20
|
+
if (isEmojiIcon) {
|
|
21
|
+
this.sprite.roundPixels = true; // без nearest, чтобы не форсить увеличение
|
|
22
|
+
}
|
|
19
23
|
if (!src) {
|
|
20
24
|
this.sprite.tint = 0xcccccc;
|
|
21
25
|
}
|
|
@@ -45,6 +49,15 @@ export class ImageObject {
|
|
|
45
49
|
this.sprite.texture.baseTexture.once('error', onError);
|
|
46
50
|
}
|
|
47
51
|
|
|
52
|
+
if (this.sprite.texture.baseTexture) {
|
|
53
|
+
// Ставим ту же resolution, что у renderer, чтобы минимизировать блюр
|
|
54
|
+
try {
|
|
55
|
+
const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;
|
|
56
|
+
this.sprite.texture.baseTexture.setResolution(dpr);
|
|
57
|
+
} catch (_) {}
|
|
58
|
+
// оставляем стандартную фильтрацию, чтобы не усиливать пиксельную лесенку при уменьшении
|
|
59
|
+
}
|
|
60
|
+
|
|
48
61
|
if (this.sprite.texture.baseTexture?.valid) {
|
|
49
62
|
fitToSize();
|
|
50
63
|
} else if (this.sprite.texture.baseTexture) {
|
|
@@ -58,8 +71,14 @@ export class ImageObject {
|
|
|
58
71
|
|
|
59
72
|
updateSize(size) {
|
|
60
73
|
if (!size) return;
|
|
61
|
-
|
|
62
|
-
|
|
74
|
+
let w = Math.max(1, size.width || 1);
|
|
75
|
+
let h = Math.max(1, size.height || 1);
|
|
76
|
+
// Если объект помечен как emoji icon — сохраняем квадратные пропорции
|
|
77
|
+
const isEmojiIcon = !!(this.objectData?.properties?.isEmojiIcon);
|
|
78
|
+
if (isEmojiIcon) {
|
|
79
|
+
const s = Math.max(w, h);
|
|
80
|
+
w = s; h = s;
|
|
81
|
+
}
|
|
63
82
|
const apply = () => {
|
|
64
83
|
const texW = this.sprite.texture.width || 1;
|
|
65
84
|
const texH = this.sprite.texture.height || 1;
|