@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
|
@@ -14,13 +14,15 @@ export class NoteObject {
|
|
|
14
14
|
this.objectData = objectData;
|
|
15
15
|
|
|
16
16
|
// Размеры записки
|
|
17
|
-
|
|
18
|
-
this.
|
|
17
|
+
const defaultSide = 250; // квадрат 250x250
|
|
18
|
+
this.width = objectData.width || objectData.properties?.width || defaultSide;
|
|
19
|
+
this.height = objectData.height || objectData.properties?.height || defaultSide;
|
|
19
20
|
|
|
20
21
|
// Свойства записки
|
|
21
22
|
const props = objectData.properties || {};
|
|
22
23
|
this.content = props.content || '';
|
|
23
|
-
this.fontSize = props.fontSize ||
|
|
24
|
+
this.fontSize = props.fontSize || 32;
|
|
25
|
+
const fontFamily = props.fontFamily || 'Caveat, Arial, cursive';
|
|
24
26
|
this.backgroundColor = (typeof props.backgroundColor === 'number') ? props.backgroundColor : 0xFFF9C4; // Светло-желтый
|
|
25
27
|
this.borderColor = (typeof props.borderColor === 'number') ? props.borderColor : 0xF9A825; // Золотистый
|
|
26
28
|
this.textColor = (typeof props.textColor === 'number') ? props.textColor : 0x1A1A1A; // Почти черный для лучшей контрастности
|
|
@@ -32,35 +34,74 @@ export class NoteObject {
|
|
|
32
34
|
this.container.eventMode = 'static';
|
|
33
35
|
this.container.interactiveChildren = true;
|
|
34
36
|
|
|
35
|
-
//
|
|
36
|
-
this.
|
|
37
|
-
|
|
37
|
+
// Тени по бокам (как у .box::before / .box::after)
|
|
38
|
+
this.shadowLayer = new PIXI.Container();
|
|
39
|
+
this.shadowLeft = new PIXI.Graphics();
|
|
40
|
+
this.shadowRight = new PIXI.Graphics();
|
|
41
|
+
this.shadowLayer.addChild(this.shadowLeft);
|
|
42
|
+
this.shadowLayer.addChild(this.shadowRight);
|
|
38
43
|
try {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
this.container.addChild(this.shadow);
|
|
44
|
+
// Мягкая тень (чуть сильнее)
|
|
45
|
+
this.shadowLayer.filters = [new PIXI.filters.BlurFilter(12)];
|
|
46
|
+
} catch (_) {}
|
|
47
|
+
this.container.addChild(this.shadowLayer);
|
|
44
48
|
|
|
45
49
|
// Графика фона
|
|
46
50
|
this.graphics = new PIXI.Graphics();
|
|
47
51
|
this.container.addChild(this.graphics);
|
|
48
52
|
|
|
53
|
+
// Функция согласованной высоты строки (как в HtmlTextLayer)
|
|
54
|
+
this._computeLineHeightPx = (fs) => {
|
|
55
|
+
if (fs <= 12) return Math.round(fs * 1.40);
|
|
56
|
+
if (fs <= 18) return Math.round(fs * 1.34);
|
|
57
|
+
if (fs <= 36) return Math.round(fs * 1.26);
|
|
58
|
+
if (fs <= 48) return Math.round(fs * 1.24);
|
|
59
|
+
if (fs <= 72) return Math.round(fs * 1.22);
|
|
60
|
+
if (fs <= 96) return Math.round(fs * 1.20);
|
|
61
|
+
return Math.round(fs * 1.18);
|
|
62
|
+
};
|
|
63
|
+
|
|
49
64
|
// Текст записки
|
|
50
65
|
this.textField = new PIXI.Text(this.content, {
|
|
51
|
-
fontFamily:
|
|
66
|
+
fontFamily: fontFamily,
|
|
52
67
|
fontSize: this.fontSize,
|
|
53
68
|
fill: this.textColor,
|
|
54
69
|
align: 'center',
|
|
70
|
+
letterSpacing: 0,
|
|
55
71
|
wordWrap: true,
|
|
56
|
-
|
|
57
|
-
|
|
72
|
+
breakWords: true,
|
|
73
|
+
wordWrapWidth: Math.max(1, Math.min(360, (this.width - 32))),
|
|
74
|
+
lineHeight: this._computeLineHeightPx(this.fontSize),
|
|
75
|
+
padding: 3,
|
|
76
|
+
trim: false,
|
|
58
77
|
resolution: (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1
|
|
59
78
|
});
|
|
60
79
|
|
|
80
|
+
// Маска для обрезки текста по границам записки
|
|
81
|
+
this.textMask = new PIXI.Graphics();
|
|
82
|
+
this.container.addChild(this.textMask);
|
|
83
|
+
this.textField.mask = this.textMask;
|
|
84
|
+
|
|
61
85
|
this._redraw(); // Сначала рисуем фон
|
|
86
|
+
// Прячем текст до загрузки шрифта Caveat, чтобы не показывать системный
|
|
87
|
+
this.textField.visible = false;
|
|
62
88
|
this.container.addChild(this.textField); // Затем добавляем текст поверх
|
|
63
89
|
this._updateTextPosition();
|
|
90
|
+
// Если шрифт уже загружен — показываем сразу, иначе подождём загрузки
|
|
91
|
+
if (this._isFontLoaded(fontFamily, this.fontSize)) {
|
|
92
|
+
this.textField.visible = true;
|
|
93
|
+
} else {
|
|
94
|
+
this._ensureWebFontApplied(fontFamily, this.fontSize);
|
|
95
|
+
// Фолбэк на случай отсутствия Font Loading API — короткая задержка
|
|
96
|
+
try {
|
|
97
|
+
if (!(typeof document !== 'undefined' && document.fonts && typeof document.fonts.load === 'function')) {
|
|
98
|
+
setTimeout(() => { try { this.textField.visible = true; } catch (_) {} }, 300);
|
|
99
|
+
}
|
|
100
|
+
} catch (_) {}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Гарантируем применение web-font (например, Caveat) при первом создании
|
|
104
|
+
this._ensureWebFontApplied(fontFamily, this.fontSize);
|
|
64
105
|
|
|
65
106
|
// Отладочная информация
|
|
66
107
|
console.log('NoteObject created with content:', this.content);
|
|
@@ -73,6 +114,7 @@ export class NoteObject {
|
|
|
73
114
|
properties: {
|
|
74
115
|
content: this.content,
|
|
75
116
|
fontSize: this.fontSize,
|
|
117
|
+
fontFamily: fontFamily,
|
|
76
118
|
backgroundColor: this.backgroundColor,
|
|
77
119
|
borderColor: this.borderColor,
|
|
78
120
|
textColor: this.textColor,
|
|
@@ -83,14 +125,71 @@ export class NoteObject {
|
|
|
83
125
|
this._redraw();
|
|
84
126
|
}
|
|
85
127
|
|
|
128
|
+
/**
|
|
129
|
+
* Возвращает видимую ширину текстового блока, согласованную с режимом редактирования
|
|
130
|
+
*/
|
|
131
|
+
_getVisibleTextWidth() {
|
|
132
|
+
const horizontalPadding = 16;
|
|
133
|
+
const contentWidth = Math.max(1, this.width - (horizontalPadding * 2));
|
|
134
|
+
return Math.max(1, Math.min(360, contentWidth));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Проверяет, загружен ли указанный web-шрифт */
|
|
138
|
+
_isFontLoaded(fontFamily, fontSizePx) {
|
|
139
|
+
try {
|
|
140
|
+
if (typeof document === 'undefined' || !document.fonts || typeof document.fonts.check !== 'function') return false;
|
|
141
|
+
const primary = String(fontFamily || '').split(',')[0].trim().replace(/^['"]|['"]$/g, '') || 'Caveat';
|
|
142
|
+
const size = Math.max(1, Number(fontSizePx) || 32);
|
|
143
|
+
const spec = `normal ${size}px ${primary}`;
|
|
144
|
+
return document.fonts.check(spec);
|
|
145
|
+
} catch (_) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Подгоняет размер шрифта так, чтобы текст умещался внутри записки
|
|
152
|
+
*/
|
|
153
|
+
_fitTextToBounds() {
|
|
154
|
+
if (!this.textField) return;
|
|
155
|
+
const maxWidth = this._getVisibleTextWidth();
|
|
156
|
+
const verticalPadding = 16;
|
|
157
|
+
const maxHeight = Math.max(1, this.height - (verticalPadding * 2));
|
|
158
|
+
|
|
159
|
+
// Базовые установки стиля перед измерением
|
|
160
|
+
this.textField.style.wordWrap = true;
|
|
161
|
+
this.textField.style.breakWords = true;
|
|
162
|
+
this.textField.style.wordWrapWidth = maxWidth;
|
|
163
|
+
|
|
164
|
+
// Начинаем с желаемого размера шрифта
|
|
165
|
+
let displayFontSize = Math.max(1, Number(this.fontSize) || 32);
|
|
166
|
+
const minFontSize = 8;
|
|
167
|
+
let safety = 0;
|
|
168
|
+
const maxIterations = 64;
|
|
169
|
+
|
|
170
|
+
while (safety < maxIterations) {
|
|
171
|
+
this.textField.style.fontSize = displayFontSize;
|
|
172
|
+
this.textField.style.lineHeight = this._computeLineHeightPx(displayFontSize);
|
|
173
|
+
this.textField.updateText();
|
|
174
|
+
const needsShrink = this.textField.height > maxHeight;
|
|
175
|
+
if (!needsShrink || displayFontSize <= minFontSize) break;
|
|
176
|
+
displayFontSize = Math.max(minFontSize, displayFontSize - 1);
|
|
177
|
+
safety++;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
86
181
|
getPixi() {
|
|
87
182
|
return this.container;
|
|
88
183
|
}
|
|
89
184
|
|
|
90
185
|
updateSize(size) {
|
|
91
186
|
if (!size) return;
|
|
92
|
-
|
|
93
|
-
|
|
187
|
+
let w = Math.max(80, size.width || this.width);
|
|
188
|
+
let h = Math.max(60, size.height || this.height);
|
|
189
|
+
// Держим квадрат
|
|
190
|
+
const side = Math.max(w, h);
|
|
191
|
+
this.width = side;
|
|
192
|
+
this.height = side;
|
|
94
193
|
|
|
95
194
|
this._redraw();
|
|
96
195
|
this._updateTextPosition();
|
|
@@ -108,8 +207,10 @@ export class NoteObject {
|
|
|
108
207
|
|
|
109
208
|
setContent(content) {
|
|
110
209
|
this.content = content || '';
|
|
210
|
+
if (this.textField) this.textField.visible = false;
|
|
111
211
|
this.textField.text = this.content;
|
|
112
212
|
this._updateTextPosition();
|
|
213
|
+
if (this.textField) this.textField.visible = true;
|
|
113
214
|
if (this.container && this.container._mb) {
|
|
114
215
|
this.container._mb.properties = {
|
|
115
216
|
...(this.container._mb.properties || {}),
|
|
@@ -149,7 +250,22 @@ export class NoteObject {
|
|
|
149
250
|
if (typeof fontSize === 'number') {
|
|
150
251
|
this.fontSize = fontSize;
|
|
151
252
|
this.textField.style.fontSize = fontSize;
|
|
152
|
-
|
|
253
|
+
// Согласуем с HTML-слоем
|
|
254
|
+
this.textField.style.lineHeight = this._computeLineHeightPx(fontSize);
|
|
255
|
+
this.textField.style.padding = 3;
|
|
256
|
+
this.textField.style.trim = false;
|
|
257
|
+
this.textField.style.letterSpacing = 0;
|
|
258
|
+
}
|
|
259
|
+
if (typeof arguments[0]?.fontFamily === 'string') {
|
|
260
|
+
const ff = arguments[0].fontFamily;
|
|
261
|
+
this.textField.style.fontFamily = ff;
|
|
262
|
+
if (this.container && this.container._mb) {
|
|
263
|
+
this.container._mb.properties = {
|
|
264
|
+
...(this.container._mb.properties || {}),
|
|
265
|
+
fontFamily: ff
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
this._ensureWebFontApplied(ff, this.fontSize);
|
|
153
269
|
}
|
|
154
270
|
if (typeof backgroundColor === 'number') this.backgroundColor = backgroundColor;
|
|
155
271
|
if (typeof borderColor === 'number') this.borderColor = borderColor;
|
|
@@ -172,6 +288,27 @@ export class NoteObject {
|
|
|
172
288
|
this._updateTextPosition();
|
|
173
289
|
}
|
|
174
290
|
|
|
291
|
+
/**
|
|
292
|
+
* Дожидается загрузки веб-шрифта и обновляет PIXI.Text, чтобы применились корректные метрики
|
|
293
|
+
*/
|
|
294
|
+
_ensureWebFontApplied(fontFamily, fontSizePx) {
|
|
295
|
+
try {
|
|
296
|
+
if (typeof document === 'undefined' || !document.fonts || !document.fonts.load) return;
|
|
297
|
+
const primary = String(fontFamily || '').split(',')[0].trim().replace(/^['"]|['"]$/g, '') || 'Caveat';
|
|
298
|
+
const size = Math.max(1, Number(fontSizePx) || 32);
|
|
299
|
+
const spec = `normal ${size}px ${primary}`;
|
|
300
|
+
document.fonts.load(spec).then(() => {
|
|
301
|
+
// Обновляем текст после загрузки шрифта и сразу подгоняем без мерцания
|
|
302
|
+
try {
|
|
303
|
+
if (this.textField) this.textField.visible = false;
|
|
304
|
+
this.textField.style.fontFamily = fontFamily;
|
|
305
|
+
this._updateTextPosition();
|
|
306
|
+
if (this.textField) this.textField.visible = true;
|
|
307
|
+
} catch (_) {}
|
|
308
|
+
}).catch(() => {});
|
|
309
|
+
} catch (_) {}
|
|
310
|
+
}
|
|
311
|
+
|
|
175
312
|
_redraw() {
|
|
176
313
|
const g = this.graphics;
|
|
177
314
|
const w = this.width;
|
|
@@ -179,28 +316,44 @@ export class NoteObject {
|
|
|
179
316
|
|
|
180
317
|
g.clear();
|
|
181
318
|
|
|
182
|
-
//
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
//
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
319
|
+
// Левая и правая тень (узкие полосы снизу)
|
|
320
|
+
const shH = Math.max(8, Math.round(h * 0.05)); // толще тень (~5% высоты)
|
|
321
|
+
const shW = Math.max(24, Math.round(w * 0.45)); // шире тень (~45% ширины)
|
|
322
|
+
const bottom = Math.max(8, Math.round(h * 0.03)) + 10; // отступ снизу ~10
|
|
323
|
+
|
|
324
|
+
const drawShadow = (g) => {
|
|
325
|
+
g.clear();
|
|
326
|
+
g.beginFill(0x000000, 1);
|
|
327
|
+
g.drawRoundedRect(0, 0, shW, shH, shH / 2);
|
|
328
|
+
g.endFill();
|
|
329
|
+
};
|
|
330
|
+
drawShadow(this.shadowLeft);
|
|
331
|
+
drawShadow(this.shadowRight);
|
|
332
|
+
|
|
333
|
+
// Обновляем маску текста под новые размеры
|
|
334
|
+
const pad = 16;
|
|
335
|
+
this.textMask.clear();
|
|
336
|
+
this.textMask.beginFill(0x000000, 1);
|
|
337
|
+
this.textMask.drawRect(pad, pad, Math.max(1, w - pad * 2), Math.max(1, h - pad * 2));
|
|
338
|
+
this.textMask.endFill();
|
|
339
|
+
|
|
340
|
+
// Базовые позиции как в CSS: left:15px и right:15px; bottom:10px
|
|
341
|
+
this.shadowLeft.x = 15;
|
|
342
|
+
this.shadowLeft.y = h - shH - 10;
|
|
343
|
+
this.shadowLeft.skew = new PIXI.ObservablePoint(() => {}, null, -5 * Math.PI / 180, 0);
|
|
344
|
+
this.shadowLeft.rotation = -5 * Math.PI / 180;
|
|
345
|
+
|
|
346
|
+
this.shadowRight.x = w - shW - 15;
|
|
347
|
+
this.shadowRight.y = h - shH - 10;
|
|
348
|
+
this.shadowRight.skew = new PIXI.ObservablePoint(() => {}, null, 5 * Math.PI / 180, 0);
|
|
349
|
+
this.shadowRight.rotation = 5 * Math.PI / 180;
|
|
350
|
+
|
|
351
|
+
this.shadowLayer.alpha = 0.7; // темнее
|
|
200
352
|
|
|
201
|
-
//
|
|
202
|
-
|
|
203
|
-
g.
|
|
353
|
+
// Основной фон записки — как .box: белый с небольшим радиусом
|
|
354
|
+
const boxBg = (typeof this.backgroundColor === 'number') ? this.backgroundColor : 0xFFFFFF;
|
|
355
|
+
g.beginFill(boxBg, 1);
|
|
356
|
+
g.drawRoundedRect(0, 0, w, h, 2);
|
|
204
357
|
g.endFill();
|
|
205
358
|
|
|
206
359
|
// Линии внутри записки убраны по требованию дизайна
|
|
@@ -219,24 +372,44 @@ export class NoteObject {
|
|
|
219
372
|
point.y >= bounds.y &&
|
|
220
373
|
point.y <= bounds.y + bounds.height;
|
|
221
374
|
};
|
|
375
|
+
|
|
376
|
+
// Hover-эффект: ослабляем короб тени и сдвигаем ближе к центру (как в CSS)
|
|
377
|
+
this.container.eventMode = 'static';
|
|
378
|
+
this.container.on('pointerover', () => {
|
|
379
|
+
this.shadowLayer.alpha = 0.55;
|
|
380
|
+
this.shadowLeft.x = 5;
|
|
381
|
+
this.shadowRight.x = w - shW - 5;
|
|
382
|
+
this.shadowLeft.rotation = 0;
|
|
383
|
+
this.shadowRight.rotation = 0;
|
|
384
|
+
});
|
|
385
|
+
this.container.on('pointerout', () => {
|
|
386
|
+
this.shadowLayer.alpha = 0.7;
|
|
387
|
+
this.shadowLeft.x = 15;
|
|
388
|
+
this.shadowRight.x = w - shW - 15;
|
|
389
|
+
this.shadowLeft.rotation = -5 * Math.PI / 180;
|
|
390
|
+
this.shadowRight.rotation = 5 * Math.PI / 180;
|
|
391
|
+
});
|
|
222
392
|
}
|
|
223
393
|
|
|
224
394
|
_updateTextPosition() {
|
|
225
395
|
if (!this.textField) return;
|
|
226
396
|
|
|
227
|
-
// Обновляем стиль текста
|
|
228
|
-
this.textField.style.wordWrapWidth = this.
|
|
229
|
-
|
|
230
|
-
|
|
397
|
+
// Обновляем стиль текста согласно ограничениям редактора
|
|
398
|
+
this.textField.style.wordWrapWidth = this._getVisibleTextWidth();
|
|
399
|
+
this.textField.style.wordWrap = true;
|
|
400
|
+
this.textField.style.breakWords = true;
|
|
401
|
+
|
|
402
|
+
// Подгоняем размер шрифта под доступные границы
|
|
403
|
+
this._fitTextToBounds();
|
|
404
|
+
|
|
405
|
+
// Обновляем текст после подгонки
|
|
231
406
|
this.textField.updateText();
|
|
232
407
|
|
|
233
|
-
// Центрируем текст по
|
|
408
|
+
// Центрируем текст по центру заметки
|
|
234
409
|
const centerX = this.width / 2;
|
|
235
|
-
const
|
|
236
|
-
|
|
237
|
-
// Используем anchor для центрирования
|
|
238
|
-
this.textField.anchor.set(0.5, 0);
|
|
410
|
+
const centerY = this.height / 2;
|
|
411
|
+
this.textField.anchor.set(0.5, 0.5);
|
|
239
412
|
this.textField.x = centerX;
|
|
240
|
-
this.textField.y =
|
|
413
|
+
this.textField.y = centerY;
|
|
241
414
|
}
|
|
242
415
|
}
|
|
@@ -15,11 +15,11 @@ export class BoardService {
|
|
|
15
15
|
const canvasSize = (this._getCanvasSize?.() || {});
|
|
16
16
|
this.grid = GridFactory.createGrid('line', {
|
|
17
17
|
enabled: true,
|
|
18
|
-
size:
|
|
18
|
+
size: 32,
|
|
19
19
|
width: canvasSize.width || 800,
|
|
20
20
|
height: canvasSize.height || 600,
|
|
21
|
-
color:
|
|
22
|
-
opacity: 0.
|
|
21
|
+
color: 0x6a6aff,
|
|
22
|
+
opacity: 0.4
|
|
23
23
|
});
|
|
24
24
|
this.grid.updateVisual();
|
|
25
25
|
this.pixi.setGrid(this.grid);
|
|
@@ -9,11 +9,22 @@ export class ZoomPanController {
|
|
|
9
9
|
attach() {
|
|
10
10
|
// Масштабирование колесом — глобально отрабатываем Ctrl+Wheel
|
|
11
11
|
this.eventBus.on(Events.Tool.WheelZoom, ({ x, y, delta }) => {
|
|
12
|
-
|
|
12
|
+
// Дискретный шаг зума 10%
|
|
13
13
|
const world = this.pixi.worldLayer || this.pixi.app.stage;
|
|
14
14
|
const oldScale = world.scale.x || 1;
|
|
15
|
-
const
|
|
16
|
-
|
|
15
|
+
const oldPercent = Math.round(oldScale * 100);
|
|
16
|
+
let targetPercent;
|
|
17
|
+
if (delta < 0) {
|
|
18
|
+
// Zoom in: к ближайшему следующему кратному 10 плюс шаг
|
|
19
|
+
targetPercent = Math.min(500, Math.floor(oldPercent / 10) * 10 + 10);
|
|
20
|
+
} else if (delta > 0) {
|
|
21
|
+
// Zoom out: к ближайшему предыдущему кратному 10 минус шаг
|
|
22
|
+
targetPercent = Math.max(10, Math.ceil(oldPercent / 10) * 10 - 10);
|
|
23
|
+
} else {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const newScale = Math.max(0.1, Math.min(5, targetPercent / 100));
|
|
27
|
+
if (Math.abs(newScale - oldScale) < 0.0001) return;
|
|
17
28
|
// Вычисляем мировые координаты точки под курсором до изменения скейла
|
|
18
29
|
const worldX = (x - world.x) / oldScale;
|
|
19
30
|
const worldY = (y - world.y) / oldScale;
|
package/src/tools/BaseTool.js
CHANGED
|
@@ -44,7 +44,12 @@ export class BaseTool {
|
|
|
44
44
|
*/
|
|
45
45
|
setCursor() {
|
|
46
46
|
if (typeof document !== 'undefined' && document.body) {
|
|
47
|
-
|
|
47
|
+
// Для 'default' не ставим инлайн-стиль, чтобы сработал глобальный CSS-курсор
|
|
48
|
+
if (!this.cursor || this.cursor === 'default') {
|
|
49
|
+
document.body.style.cursor = '';
|
|
50
|
+
} else {
|
|
51
|
+
document.body.style.cursor = this.cursor;
|
|
52
|
+
}
|
|
48
53
|
}
|
|
49
54
|
}
|
|
50
55
|
|
package/src/tools/ToolManager.js
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import { Events } from '../core/events/Events.js';
|
|
2
|
+
import cursorDefaultSvg from '../assets/icons/cursor-default.svg?raw';
|
|
3
|
+
|
|
4
|
+
// Масштабируем курсор в 2 раза меньше
|
|
5
|
+
const _scaledCursorSvg = (() => {
|
|
6
|
+
try {
|
|
7
|
+
return cursorDefaultSvg
|
|
8
|
+
.replace(/width="[^"]+"/i, 'width="25px"')
|
|
9
|
+
.replace(/height="[^"]+"/i, 'height="25px"');
|
|
10
|
+
} catch (_) {
|
|
11
|
+
return cursorDefaultSvg;
|
|
12
|
+
}
|
|
13
|
+
})();
|
|
14
|
+
const DEFAULT_CURSOR = '';
|
|
2
15
|
|
|
3
16
|
/**
|
|
4
17
|
* Менеджер инструментов - управляет активными инструментами и переключением между ними
|
|
@@ -22,6 +35,11 @@ export class ToolManager {
|
|
|
22
35
|
this.lastMousePos = null;
|
|
23
36
|
this.isMouseOverContainer = false;
|
|
24
37
|
|
|
38
|
+
// Устанавливаем курсор по умолчанию на контейнер, если инструмент ещё не активирован
|
|
39
|
+
if (this.container) {
|
|
40
|
+
this.container.style.cursor = DEFAULT_CURSOR; // пусто → берётся глобальный CSS-курсор
|
|
41
|
+
}
|
|
42
|
+
|
|
25
43
|
this.initEventListeners();
|
|
26
44
|
}
|
|
27
45
|
|
|
@@ -126,7 +144,12 @@ export class ToolManager {
|
|
|
126
144
|
this.container.addEventListener('mousedown', (e) => this.handleMouseDown(e));
|
|
127
145
|
this.container.addEventListener('mousemove', (e) => this.handleMouseMove(e));
|
|
128
146
|
this.container.addEventListener('mouseup', (e) => this.handleMouseUp(e));
|
|
129
|
-
this.container.addEventListener('mouseenter', () => {
|
|
147
|
+
this.container.addEventListener('mouseenter', () => {
|
|
148
|
+
this.isMouseOverContainer = true;
|
|
149
|
+
if (!this.activeTool) {
|
|
150
|
+
this.container.style.cursor = DEFAULT_CURSOR;
|
|
151
|
+
}
|
|
152
|
+
});
|
|
130
153
|
this.container.addEventListener('mouseleave', () => { this.isMouseOverContainer = false; });
|
|
131
154
|
// Убираем отдельные слушатели aux-pan на контейнере, чтобы не дублировать mousedown/mouseup
|
|
132
155
|
|
|
@@ -52,7 +52,9 @@ export class DrawingTool extends BaseTool {
|
|
|
52
52
|
this.world = this._getWorldLayer();
|
|
53
53
|
// Кастомный курсор-карандаш (SVG)
|
|
54
54
|
const svg = `<svg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'><path d='M4 20 L20 4 L28 12 L12 28 L4 28 Z' fill='black'/></svg>`;
|
|
55
|
-
|
|
55
|
+
// Горячая точка ставим в реальный нижний левый угол фигуры (x=4, y=28),
|
|
56
|
+
// чтобы линия выходила прямо из карандаша без зазора.
|
|
57
|
+
const url = `url("data:image/svg+xml;utf8,${encodeURIComponent(svg)}") 4 28, crosshair`;
|
|
56
58
|
if (this.app && this.app.view) this.app.view.style.cursor = url;
|
|
57
59
|
}
|
|
58
60
|
|