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