@arbisoft/react-design-tool 1.0.60 → 1.0.62

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/README.md CHANGED
@@ -12,10 +12,16 @@ With this tool, you can:
12
12
 
13
13
  Perfect for integrating into applications that require user-driven visual content creation.
14
14
 
15
+ ### Image tinting at a glance
16
+ - Select any image to reveal **Tint Color**, **Tint Strength (0–100%)**, and **Remove Tint**.
17
+ - Default tint strength is set to **60%** for balanced coloring without hiding details.
18
+ - Works on-canvas and in exported images (Konva filter-based).
19
+
15
20
  ---
16
21
 
17
22
  ## 🔔 What’s New
18
23
 
24
+ - **Image tinting for photos**: New **Tint Color** and **Tint Strength** controls appear when an image is selected. Default tint is a balanced 60%, adjustable 0–100%, with a one-click **Remove Tint**.
19
25
  - **Auto-placement for QR ID**: When enabled, the QR ID text is **automatically positioned above the Location text** (`LOCATION_ELEMENT_ID`).
20
26
  If the Location element doesn’t exist, it’s **centered on the canvas**.
21
27
  - **Persistent QR ID across template switches**: If the QR ID was visible before switching templates, it stays visible and **reflows** for the new template.
@@ -58,13 +64,13 @@ yarn add @arbisoft/react-design-tool
58
64
  #### ⚠️ Important: Installation Guide for React 18 and Below
59
65
 
60
66
  ```bash
61
- npm install @arbisoft/react-design-tool@1.0.60
67
+ npm install @arbisoft/react-design-tool@1.0.62
62
68
  ```
63
69
 
64
70
  OR
65
71
 
66
72
  ```bash
67
- yarn add @arbisoft/react-design-tool@1.0.60
73
+ yarn add @arbisoft/react-design-tool@1.0.62
68
74
 
69
75
  ```
70
76
 
package/dist/cjs/index.js CHANGED
@@ -5,9 +5,9 @@ var PropTypes = require('prop-types');
5
5
  var styled = require('styled-components');
6
6
  var reactDom = require('react-dom');
7
7
  var reactKonva = require('react-konva');
8
+ var Konva = require('konva');
8
9
  var QRCode = require('qrcode');
9
10
  var reactKonvaUtils = require('react-konva-utils');
10
- var Konva = require('konva');
11
11
 
12
12
  function _arrayLikeToArray(r, a) {
13
13
  (null == a || a > r.length) && (a = r.length);
@@ -811,8 +811,12 @@ var LOCATION_BREADCRUMB$8 = "property > building > room";
811
811
  var DOMAIN$8 = "www.domain.com";
812
812
  var SHOW_PROPERTY_LOCATION$8 = "Show Property Label";
813
813
  var LOCATION_HELPER$8 = "Enable this to show the property’s location label on the canvas, or disable it to hide it.";
814
- var SHOW_QR_ID$8 = "Show QR ID";
814
+ var SHOW_QR_ID$8 = "Show QR Id";
815
815
  var QR_ID_HELPER$8 = "Enable this to display the unique QR Code ID on the canvas, or disable it to remove it.";
816
+ var MONOCHROME_COLOR$8 = "Tint Color";
817
+ var MONOCHROME_STRENGTH$8 = "Tint Strength";
818
+ var CLEAR_MONOCHROME$8 = "Remove Tint";
819
+ var TINT_SHORT$8 = "Tint";
816
820
  var enTranslations = {
817
821
  BRING_FORWARD: BRING_FORWARD$8,
818
822
  SEND_BACKWARD: SEND_BACKWARD$8,
@@ -885,7 +889,11 @@ var enTranslations = {
885
889
  SHOW_PROPERTY_LOCATION: SHOW_PROPERTY_LOCATION$8,
886
890
  LOCATION_HELPER: LOCATION_HELPER$8,
887
891
  SHOW_QR_ID: SHOW_QR_ID$8,
888
- QR_ID_HELPER: QR_ID_HELPER$8
892
+ QR_ID_HELPER: QR_ID_HELPER$8,
893
+ MONOCHROME_COLOR: MONOCHROME_COLOR$8,
894
+ MONOCHROME_STRENGTH: MONOCHROME_STRENGTH$8,
895
+ CLEAR_MONOCHROME: CLEAR_MONOCHROME$8,
896
+ TINT_SHORT: TINT_SHORT$8
889
897
  };
890
898
 
891
899
  var BRING_FORWARD$7 = "Перенести вперёд";
@@ -960,6 +968,10 @@ var SHOW_PROPERTY_LOCATION$7 = "Показать метку объекта";
960
968
  var LOCATION_HELPER$7 = "Включите, чтобы показать метку расположения объекта на холсте, или отключите, чтобы скрыть её.";
961
969
  var SHOW_QR_ID$7 = "Показать QR-ID";
962
970
  var QR_ID_HELPER$7 = "Включите, чтобы отобразить уникальный идентификатор QR-кода на холсте, или отключите, чтобы убрать его.";
971
+ var MONOCHROME_COLOR$7 = "Цвет тона";
972
+ var MONOCHROME_STRENGTH$7 = "Сила тона";
973
+ var CLEAR_MONOCHROME$7 = "Убрать тон";
974
+ var TINT_SHORT$7 = "Тон";
963
975
  var ruTranslations = {
964
976
  BRING_FORWARD: BRING_FORWARD$7,
965
977
  SEND_BACKWARD: SEND_BACKWARD$7,
@@ -1032,7 +1044,11 @@ var ruTranslations = {
1032
1044
  SHOW_PROPERTY_LOCATION: SHOW_PROPERTY_LOCATION$7,
1033
1045
  LOCATION_HELPER: LOCATION_HELPER$7,
1034
1046
  SHOW_QR_ID: SHOW_QR_ID$7,
1035
- QR_ID_HELPER: QR_ID_HELPER$7
1047
+ QR_ID_HELPER: QR_ID_HELPER$7,
1048
+ MONOCHROME_COLOR: MONOCHROME_COLOR$7,
1049
+ MONOCHROME_STRENGTH: MONOCHROME_STRENGTH$7,
1050
+ CLEAR_MONOCHROME: CLEAR_MONOCHROME$7,
1051
+ TINT_SHORT: TINT_SHORT$7
1036
1052
  };
1037
1053
 
1038
1054
  var BRING_FORWARD$6 = "Przenieś do przodu";
@@ -1107,6 +1123,10 @@ var SHOW_PROPERTY_LOCATION$6 = "Pokaż etykietę nieruchomości";
1107
1123
  var LOCATION_HELPER$6 = "Włącz tę opcję, aby wyświetlić etykietę lokalizacji nieruchomości na płótnie, lub wyłącz, aby ją ukryć.";
1108
1124
  var SHOW_QR_ID$6 = "Pokaż identyfikator QR";
1109
1125
  var QR_ID_HELPER$6 = "Włącz tę opcję, aby wyświetlić unikalny identyfikator kodu QR na płótnie, lub wyłącz, aby go usunąć.";
1126
+ var MONOCHROME_COLOR$6 = "Kolor tonu";
1127
+ var MONOCHROME_STRENGTH$6 = "Siła tonu";
1128
+ var CLEAR_MONOCHROME$6 = "Usuń ton";
1129
+ var TINT_SHORT$6 = "Ton";
1110
1130
  var plTranslations = {
1111
1131
  BRING_FORWARD: BRING_FORWARD$6,
1112
1132
  SEND_BACKWARD: SEND_BACKWARD$6,
@@ -1179,7 +1199,11 @@ var plTranslations = {
1179
1199
  SHOW_PROPERTY_LOCATION: SHOW_PROPERTY_LOCATION$6,
1180
1200
  LOCATION_HELPER: LOCATION_HELPER$6,
1181
1201
  SHOW_QR_ID: SHOW_QR_ID$6,
1182
- QR_ID_HELPER: QR_ID_HELPER$6
1202
+ QR_ID_HELPER: QR_ID_HELPER$6,
1203
+ MONOCHROME_COLOR: MONOCHROME_COLOR$6,
1204
+ MONOCHROME_STRENGTH: MONOCHROME_STRENGTH$6,
1205
+ CLEAR_MONOCHROME: CLEAR_MONOCHROME$6,
1206
+ TINT_SHORT: TINT_SHORT$6
1183
1207
  };
1184
1208
 
1185
1209
  var BRING_FORWARD$5 = "Nach vorne bringen";
@@ -1254,6 +1278,10 @@ var SHOW_PROPERTY_LOCATION$5 = "Eigenschaftsbeschriftung anzeigen";
1254
1278
  var LOCATION_HELPER$5 = "Aktivieren Sie dies, um die Standortbeschriftung der Eigenschaft auf der Leinwand anzuzeigen, oder deaktivieren Sie es, um sie auszublenden.";
1255
1279
  var SHOW_QR_ID$5 = "QR-ID anzeigen";
1256
1280
  var QR_ID_HELPER$5 = "Aktivieren Sie dies, um die eindeutige QR-Code-ID auf der Leinwand anzuzeigen, oder deaktivieren Sie es, um sie zu entfernen.";
1281
+ var MONOCHROME_COLOR$5 = "Tönungsfarbe";
1282
+ var MONOCHROME_STRENGTH$5 = "Tönungsstärke";
1283
+ var CLEAR_MONOCHROME$5 = "Tönung entfernen";
1284
+ var TINT_SHORT$5 = "Tönung";
1257
1285
  var deTranslations = {
1258
1286
  BRING_FORWARD: BRING_FORWARD$5,
1259
1287
  SEND_BACKWARD: SEND_BACKWARD$5,
@@ -1326,7 +1354,11 @@ var deTranslations = {
1326
1354
  SHOW_PROPERTY_LOCATION: SHOW_PROPERTY_LOCATION$5,
1327
1355
  LOCATION_HELPER: LOCATION_HELPER$5,
1328
1356
  SHOW_QR_ID: SHOW_QR_ID$5,
1329
- QR_ID_HELPER: QR_ID_HELPER$5
1357
+ QR_ID_HELPER: QR_ID_HELPER$5,
1358
+ MONOCHROME_COLOR: MONOCHROME_COLOR$5,
1359
+ MONOCHROME_STRENGTH: MONOCHROME_STRENGTH$5,
1360
+ CLEAR_MONOCHROME: CLEAR_MONOCHROME$5,
1361
+ TINT_SHORT: TINT_SHORT$5
1330
1362
  };
1331
1363
 
1332
1364
  var BRING_FORWARD$4 = "Traer al frente";
@@ -1401,6 +1433,10 @@ var SHOW_PROPERTY_LOCATION$4 = "Mostrar etiqueta de propiedad";
1401
1433
  var LOCATION_HELPER$4 = "Active esto para mostrar la etiqueta de ubicación de la propiedad en el lienzo, o desactívelo para ocultarla.";
1402
1434
  var SHOW_QR_ID$4 = "Mostrar ID de QR";
1403
1435
  var QR_ID_HELPER$4 = "Active esto para mostrar el identificador único del código QR en el lienzo, o desactívelo para eliminarlo.";
1436
+ var MONOCHROME_COLOR$4 = "Color de tinte";
1437
+ var MONOCHROME_STRENGTH$4 = "Intensidad del tinte";
1438
+ var CLEAR_MONOCHROME$4 = "Eliminar tinte";
1439
+ var TINT_SHORT$4 = "Tinte";
1404
1440
  var esTranslations = {
1405
1441
  BRING_FORWARD: BRING_FORWARD$4,
1406
1442
  SEND_BACKWARD: SEND_BACKWARD$4,
@@ -1473,7 +1509,11 @@ var esTranslations = {
1473
1509
  SHOW_PROPERTY_LOCATION: SHOW_PROPERTY_LOCATION$4,
1474
1510
  LOCATION_HELPER: LOCATION_HELPER$4,
1475
1511
  SHOW_QR_ID: SHOW_QR_ID$4,
1476
- QR_ID_HELPER: QR_ID_HELPER$4
1512
+ QR_ID_HELPER: QR_ID_HELPER$4,
1513
+ MONOCHROME_COLOR: MONOCHROME_COLOR$4,
1514
+ MONOCHROME_STRENGTH: MONOCHROME_STRENGTH$4,
1515
+ CLEAR_MONOCHROME: CLEAR_MONOCHROME$4,
1516
+ TINT_SHORT: TINT_SHORT$4
1477
1517
  };
1478
1518
 
1479
1519
  var BRING_FORWARD$3 = "Mettre au premier plan";
@@ -1548,6 +1588,10 @@ var SHOW_PROPERTY_LOCATION$3 = "Afficher l’étiquette de propriété";
1548
1588
  var LOCATION_HELPER$3 = "Activez ceci pour afficher l’étiquette de l’emplacement de la propriété sur la zone de travail, ou désactivez-le pour la masquer.";
1549
1589
  var SHOW_QR_ID$3 = "Afficher l’ID du QR";
1550
1590
  var QR_ID_HELPER$3 = "Activez ceci pour afficher l’ID unique du code QR sur la zone de travail, ou désactivez-le pour le supprimer.";
1591
+ var MONOCHROME_COLOR$3 = "Couleur de teinte";
1592
+ var MONOCHROME_STRENGTH$3 = "Intensité de la teinte";
1593
+ var CLEAR_MONOCHROME$3 = "Retirer la teinte";
1594
+ var TINT_SHORT$3 = "Teinte";
1551
1595
  var frTranslations = {
1552
1596
  BRING_FORWARD: BRING_FORWARD$3,
1553
1597
  SEND_BACKWARD: SEND_BACKWARD$3,
@@ -1620,7 +1664,11 @@ var frTranslations = {
1620
1664
  SHOW_PROPERTY_LOCATION: SHOW_PROPERTY_LOCATION$3,
1621
1665
  LOCATION_HELPER: LOCATION_HELPER$3,
1622
1666
  SHOW_QR_ID: SHOW_QR_ID$3,
1623
- QR_ID_HELPER: QR_ID_HELPER$3
1667
+ QR_ID_HELPER: QR_ID_HELPER$3,
1668
+ MONOCHROME_COLOR: MONOCHROME_COLOR$3,
1669
+ MONOCHROME_STRENGTH: MONOCHROME_STRENGTH$3,
1670
+ CLEAR_MONOCHROME: CLEAR_MONOCHROME$3,
1671
+ TINT_SHORT: TINT_SHORT$3
1624
1672
  };
1625
1673
 
1626
1674
  var BRING_FORWARD$2 = "Porta in primo piano";
@@ -1695,6 +1743,10 @@ var SHOW_PROPERTY_LOCATION$2 = "Mostra etichetta proprietà";
1695
1743
  var LOCATION_HELPER$2 = "Abilita questa opzione per mostrare l’etichetta della posizione della proprietà sulla tela, oppure disabilitala per nasconderla.";
1696
1744
  var SHOW_QR_ID$2 = "Mostra ID QR";
1697
1745
  var QR_ID_HELPER$2 = "Abilita questa opzione per mostrare l’ID univoco del codice QR sulla tela, oppure disabilitala per rimuoverlo.";
1746
+ var MONOCHROME_COLOR$2 = "Colore tinta";
1747
+ var MONOCHROME_STRENGTH$2 = "Intensità della tinta";
1748
+ var CLEAR_MONOCHROME$2 = "Rimuovi tinta";
1749
+ var TINT_SHORT$2 = "Tinta";
1698
1750
  var itTranslations = {
1699
1751
  BRING_FORWARD: BRING_FORWARD$2,
1700
1752
  SEND_BACKWARD: SEND_BACKWARD$2,
@@ -1767,7 +1819,11 @@ var itTranslations = {
1767
1819
  SHOW_PROPERTY_LOCATION: SHOW_PROPERTY_LOCATION$2,
1768
1820
  LOCATION_HELPER: LOCATION_HELPER$2,
1769
1821
  SHOW_QR_ID: SHOW_QR_ID$2,
1770
- QR_ID_HELPER: QR_ID_HELPER$2
1822
+ QR_ID_HELPER: QR_ID_HELPER$2,
1823
+ MONOCHROME_COLOR: MONOCHROME_COLOR$2,
1824
+ MONOCHROME_STRENGTH: MONOCHROME_STRENGTH$2,
1825
+ CLEAR_MONOCHROME: CLEAR_MONOCHROME$2,
1826
+ TINT_SHORT: TINT_SHORT$2
1771
1827
  };
1772
1828
 
1773
1829
  var BRING_FORWARD$1 = "Επισπεύδω";
@@ -1842,6 +1898,10 @@ var SHOW_PROPERTY_LOCATION$1 = "Εμφάνιση ετικέτας ιδιοκτη
1842
1898
  var LOCATION_HELPER$1 = "Ενεργοποιήστε το για να εμφανιστεί η ετικέτα τοποθεσίας της ιδιοκτησίας στον καμβά ή απενεργοποιήστε το για να την αποκρύψετε.";
1843
1899
  var SHOW_QR_ID$1 = "Εμφάνιση ταυτότητας QR";
1844
1900
  var QR_ID_HELPER$1 = "Ενεργοποιήστε το για να εμφανιστεί το μοναδικό αναγνωριστικό QR Code στον καμβά ή απενεργοποιήστε το για να το αφαιρέσετε.";
1901
+ var MONOCHROME_COLOR$1 = "Χρώμα απόχρωσης";
1902
+ var MONOCHROME_STRENGTH$1 = "Ένταση απόχρωσης";
1903
+ var CLEAR_MONOCHROME$1 = "Αφαίρεση απόχρωσης";
1904
+ var TINT_SHORT$1 = "Απόχρωση";
1845
1905
  var elTranslations = {
1846
1906
  BRING_FORWARD: BRING_FORWARD$1,
1847
1907
  SEND_BACKWARD: SEND_BACKWARD$1,
@@ -1914,7 +1974,11 @@ var elTranslations = {
1914
1974
  SHOW_PROPERTY_LOCATION: SHOW_PROPERTY_LOCATION$1,
1915
1975
  LOCATION_HELPER: LOCATION_HELPER$1,
1916
1976
  SHOW_QR_ID: SHOW_QR_ID$1,
1917
- QR_ID_HELPER: QR_ID_HELPER$1
1977
+ QR_ID_HELPER: QR_ID_HELPER$1,
1978
+ MONOCHROME_COLOR: MONOCHROME_COLOR$1,
1979
+ MONOCHROME_STRENGTH: MONOCHROME_STRENGTH$1,
1980
+ CLEAR_MONOCHROME: CLEAR_MONOCHROME$1,
1981
+ TINT_SHORT: TINT_SHORT$1
1918
1982
  };
1919
1983
 
1920
1984
  var BRING_FORWARD = "Переносити";
@@ -1989,6 +2053,10 @@ var SHOW_PROPERTY_LOCATION = "Показати мітку власності";
1989
2053
  var LOCATION_HELPER = "Увімкніть, щоб показати мітку розташування власності на полотні, або вимкніть, щоб приховати її.";
1990
2054
  var SHOW_QR_ID = "Показати QR-ID";
1991
2055
  var QR_ID_HELPER = "Увімкніть, щоб відобразити унікальний ідентифікатор QR-коду на полотні, або вимкніть, щоб видалити його.";
2056
+ var MONOCHROME_COLOR = "Колір тону";
2057
+ var MONOCHROME_STRENGTH = "Сила тону";
2058
+ var CLEAR_MONOCHROME = "Прибрати тон";
2059
+ var TINT_SHORT = "Тон";
1992
2060
  var ukTranslations = {
1993
2061
  BRING_FORWARD: BRING_FORWARD,
1994
2062
  SEND_BACKWARD: SEND_BACKWARD,
@@ -2061,7 +2129,11 @@ var ukTranslations = {
2061
2129
  SHOW_PROPERTY_LOCATION: SHOW_PROPERTY_LOCATION,
2062
2130
  LOCATION_HELPER: LOCATION_HELPER,
2063
2131
  SHOW_QR_ID: SHOW_QR_ID,
2064
- QR_ID_HELPER: QR_ID_HELPER
2132
+ QR_ID_HELPER: QR_ID_HELPER,
2133
+ MONOCHROME_COLOR: MONOCHROME_COLOR,
2134
+ MONOCHROME_STRENGTH: MONOCHROME_STRENGTH,
2135
+ CLEAR_MONOCHROME: CLEAR_MONOCHROME,
2136
+ TINT_SHORT: TINT_SHORT
2065
2137
  };
2066
2138
 
2067
2139
  var SUPPPORTED_LOCALES = ['en', 'ru', 'pl', 'de', 'es', 'fr', 'it', 'el', 'uk'];
@@ -2178,6 +2250,11 @@ var propTypes$w = {
2178
2250
  onChangeImageStrokeWidth: PropTypes.func,
2179
2251
  onChangeImageStrokeColor: PropTypes.func,
2180
2252
  onChangeImageOpacity: PropTypes.func,
2253
+ imageTintColor: PropTypes.string,
2254
+ imageTintStrength: PropTypes.number,
2255
+ onChangeImageTintColor: PropTypes.func,
2256
+ onChangeImageTintStrength: PropTypes.func,
2257
+ onClearImageTint: PropTypes.func,
2181
2258
  qrStrokeWidth: PropTypes.number,
2182
2259
  qrStrokeColor: PropTypes.string,
2183
2260
  qrOpacity: PropTypes.number,
@@ -2254,6 +2331,11 @@ var propTypes$v = {
2254
2331
  onChangeImageStrokeWidth: PropTypes.func,
2255
2332
  onChangeImageStrokeColor: PropTypes.func,
2256
2333
  onChangeImageOpacity: PropTypes.func,
2334
+ imageTintColor: PropTypes.string,
2335
+ imageTintStrength: PropTypes.number,
2336
+ onChangeImageTintColor: PropTypes.func,
2337
+ onChangeImageTintStrength: PropTypes.func,
2338
+ onClearImageTint: PropTypes.func,
2257
2339
  qrStrokeWidth: PropTypes.number,
2258
2340
  qrStrokeColor: PropTypes.string,
2259
2341
  qrOpacity: PropTypes.number,
@@ -3076,7 +3158,7 @@ var OpacityPicker = function OpacityPicker(_ref) {
3076
3158
  src: varient === 'opacity' ? IconOpacity : toolBarIcon
3077
3159
  })), /*#__PURE__*/React.createElement(StyledText, {
3078
3160
  fontFamily: fontFamily
3079
- }, varient === 'opacity' ? "".concat(value * 100, "%") : "".concat(Math.round(value), "px")), rightChild && rightChild), opacityPickerVisible && /*#__PURE__*/React.createElement("div", {
3161
+ }, varient === 'opacity' ? "".concat(Math.round(value * 100), "%") : "".concat(Math.round(value), "px")), rightChild && rightChild), opacityPickerVisible && /*#__PURE__*/React.createElement("div", {
3080
3162
  style: {
3081
3163
  position: 'absolute',
3082
3164
  bottom: -50,
@@ -3684,6 +3766,11 @@ var propTypes$m = {
3684
3766
  onChangeImageStrokeWidth: PropTypes.func,
3685
3767
  onChangeImageStrokeColor: PropTypes.func,
3686
3768
  onChangeImageOpacity: PropTypes.func,
3769
+ imageTintColor: PropTypes.string,
3770
+ imageTintStrength: PropTypes.number,
3771
+ onChangeImageTintColor: PropTypes.func,
3772
+ onChangeImageTintStrength: PropTypes.func,
3773
+ onClearImageTint: PropTypes.func,
3687
3774
  selectedElement: PropTypes.object,
3688
3775
  languageLocale: PropTypes.string
3689
3776
  };
@@ -3693,13 +3780,18 @@ styled.p(_templateObject$h || (_templateObject$h = _taggedTemplateLiteral(["\n
3693
3780
  var RowContainer$2 = styled.div(_templateObject2$d || (_templateObject2$d = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: row;\n align-items: center;\n flex-wrap: wrap;\n gap: 2px;\n"])));
3694
3781
 
3695
3782
  var ImageToolBar = function ImageToolBar(_ref) {
3696
- var _TEXT_DICTIONARY$lang;
3783
+ var _TEXT_DICTIONARY$lang, _TEXT_DICTIONARY$lang2, _TEXT_DICTIONARY$lang3, _TEXT_DICTIONARY$lang4, _selectedElement$tint, _TEXT_DICTIONARY$lang5, _TEXT_DICTIONARY$lang6, _selectedElement$tint2, _TEXT_DICTIONARY$lang7;
3697
3784
  var imageStrokeWidth = _ref.imageStrokeWidth,
3698
3785
  imageStrokeColor = _ref.imageStrokeColor,
3699
3786
  imageOpacity = _ref.imageOpacity,
3700
3787
  onChangeImageStrokeWidth = _ref.onChangeImageStrokeWidth,
3701
3788
  onChangeImageStrokeColor = _ref.onChangeImageStrokeColor,
3702
3789
  onChangeImageOpacity = _ref.onChangeImageOpacity,
3790
+ imageTintColor = _ref.imageTintColor,
3791
+ imageTintStrength = _ref.imageTintStrength,
3792
+ onChangeImageTintColor = _ref.onChangeImageTintColor,
3793
+ onChangeImageTintStrength = _ref.onChangeImageTintStrength,
3794
+ onClearImageTint = _ref.onClearImageTint,
3703
3795
  selectedElement = _ref.selectedElement,
3704
3796
  languageLocale = _ref.languageLocale;
3705
3797
  return /*#__PURE__*/React.createElement(RowContainer$2, null, /*#__PURE__*/React.createElement(StrokePicker, {
@@ -3713,7 +3805,35 @@ var ImageToolBar = function ImageToolBar(_ref) {
3713
3805
  value: isElementOfSameType(selectedElement, elementTypes.image) ? selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.opacity : imageOpacity,
3714
3806
  onChangeOpacity: onChangeImageOpacity,
3715
3807
  languageLocale: languageLocale
3716
- }));
3808
+ }), /*#__PURE__*/React.createElement(ToolBarButtonWrapper, {
3809
+ gap: 8,
3810
+ tooltip: TEXT_DICTIONARY === null || TEXT_DICTIONARY === void 0 || (_TEXT_DICTIONARY$lang2 = TEXT_DICTIONARY[languageLocale]) === null || _TEXT_DICTIONARY$lang2 === void 0 ? void 0 : _TEXT_DICTIONARY$lang2.MONOCHROME_COLOR,
3811
+ tooltipPosition: 'bottom'
3812
+ }, /*#__PURE__*/React.createElement(StyledText, {
3813
+ fontFamily: theme.fonts.secondary
3814
+ }, TEXT_DICTIONARY === null || TEXT_DICTIONARY === void 0 || (_TEXT_DICTIONARY$lang3 = TEXT_DICTIONARY[languageLocale]) === null || _TEXT_DICTIONARY$lang3 === void 0 ? void 0 : _TEXT_DICTIONARY$lang3.MONOCHROME_COLOR), /*#__PURE__*/React.createElement(ColorBox, {
3815
+ backgroundColor: isElementOfSameType(selectedElement, elementTypes.image) ? (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.tintColor) || imageTintColor : imageTintColor,
3816
+ onChange: onChangeImageTintColor
3817
+ })), /*#__PURE__*/React.createElement(OpacityPicker, {
3818
+ tooltip: TEXT_DICTIONARY === null || TEXT_DICTIONARY === void 0 || (_TEXT_DICTIONARY$lang4 = TEXT_DICTIONARY[languageLocale]) === null || _TEXT_DICTIONARY$lang4 === void 0 ? void 0 : _TEXT_DICTIONARY$lang4.MONOCHROME_STRENGTH,
3819
+ tooltipPosition: 'bottom',
3820
+ value: isElementOfSameType(selectedElement, elementTypes.image) ? (_selectedElement$tint = selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.tintStrength) !== null && _selectedElement$tint !== void 0 ? _selectedElement$tint : imageTintStrength : imageTintStrength,
3821
+ min: 0,
3822
+ max: 1,
3823
+ step: 0.05,
3824
+ onChangeOpacity: onChangeImageTintStrength,
3825
+ leftChild: /*#__PURE__*/React.createElement(StyledText, {
3826
+ fontFamily: theme.fonts.secondary
3827
+ }, TEXT_DICTIONARY === null || TEXT_DICTIONARY === void 0 || (_TEXT_DICTIONARY$lang5 = TEXT_DICTIONARY[languageLocale]) === null || _TEXT_DICTIONARY$lang5 === void 0 ? void 0 : _TEXT_DICTIONARY$lang5.TINT_SHORT)
3828
+ }), /*#__PURE__*/React.createElement(ToolBarButtonWrapper, {
3829
+ gap: 8,
3830
+ tooltip: TEXT_DICTIONARY === null || TEXT_DICTIONARY === void 0 || (_TEXT_DICTIONARY$lang6 = TEXT_DICTIONARY[languageLocale]) === null || _TEXT_DICTIONARY$lang6 === void 0 ? void 0 : _TEXT_DICTIONARY$lang6.CLEAR_MONOCHROME,
3831
+ tooltipPosition: 'bottom',
3832
+ onClick: onClearImageTint,
3833
+ disabled: isElementOfSameType(selectedElement, elementTypes.image) ? ((_selectedElement$tint2 = selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.tintStrength) !== null && _selectedElement$tint2 !== void 0 ? _selectedElement$tint2 : 0) <= 0 : imageTintStrength <= 0
3834
+ }, /*#__PURE__*/React.createElement(StyledText, {
3835
+ fontFamily: theme.fonts.secondary
3836
+ }, TEXT_DICTIONARY === null || TEXT_DICTIONARY === void 0 || (_TEXT_DICTIONARY$lang7 = TEXT_DICTIONARY[languageLocale]) === null || _TEXT_DICTIONARY$lang7 === void 0 ? void 0 : _TEXT_DICTIONARY$lang7.CLEAR_MONOCHROME)));
3717
3837
  };
3718
3838
  ImageToolBar.propTypes = propTypes$m;
3719
3839
 
@@ -3845,6 +3965,11 @@ var TopToolBar = function TopToolBar(_ref) {
3845
3965
  onChangeImageStrokeWidth = _ref.onChangeImageStrokeWidth,
3846
3966
  onChangeImageStrokeColor = _ref.onChangeImageStrokeColor,
3847
3967
  onChangeImageOpacity = _ref.onChangeImageOpacity,
3968
+ imageTintColor = _ref.imageTintColor,
3969
+ imageTintStrength = _ref.imageTintStrength,
3970
+ onChangeImageTintColor = _ref.onChangeImageTintColor,
3971
+ onChangeImageTintStrength = _ref.onChangeImageTintStrength,
3972
+ onClearImageTint = _ref.onClearImageTint,
3848
3973
  qrStrokeWidth = _ref.qrStrokeWidth,
3849
3974
  qrStrokeColor = _ref.qrStrokeColor,
3850
3975
  qrOpacity = _ref.qrOpacity,
@@ -3909,6 +4034,11 @@ var TopToolBar = function TopToolBar(_ref) {
3909
4034
  onChangeImageStrokeWidth: onChangeImageStrokeWidth,
3910
4035
  onChangeImageStrokeColor: onChangeImageStrokeColor,
3911
4036
  onChangeImageOpacity: onChangeImageOpacity,
4037
+ imageTintColor: imageTintColor,
4038
+ imageTintStrength: imageTintStrength,
4039
+ onChangeImageTintColor: onChangeImageTintColor,
4040
+ onChangeImageTintStrength: onChangeImageTintStrength,
4041
+ onClearImageTint: onClearImageTint,
3912
4042
  selectedElement: selectedElement,
3913
4043
  languageLocale: languageLocale
3914
4044
  }) : selectedTab === (sideBarpillsList === null || sideBarpillsList === void 0 ? void 0 : sideBarpillsList.shape) ? /*#__PURE__*/React.createElement(ShapeToolBar, {
@@ -4255,6 +4385,7 @@ var propTypes$e = {
4255
4385
  };
4256
4386
 
4257
4387
  var CanvasImage = function CanvasImage(_ref) {
4388
+ var _element$tintStrength;
4258
4389
  var id = _ref.id,
4259
4390
  element = _ref.element,
4260
4391
  _onClick = _ref.onClick,
@@ -4270,6 +4401,30 @@ var CanvasImage = function CanvasImage(_ref) {
4270
4401
  _useState4 = _slicedToArray(_useState3, 2),
4271
4402
  imgEl = _useState4[0],
4272
4403
  setImgEl = _useState4[1];
4404
+ var imageNodeRef = React.useRef(null);
4405
+ var tintStrength = Number((_element$tintStrength = element === null || element === void 0 ? void 0 : element.tintStrength) !== null && _element$tintStrength !== void 0 ? _element$tintStrength : 0);
4406
+ var hasTint = tintStrength > 0;
4407
+ var _useMemo = React.useMemo(function () {
4408
+ var hex = typeof (element === null || element === void 0 ? void 0 : element.tintColor) === 'string' ? element.tintColor.trim() : '#000000';
4409
+ var safeHex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(hex) ? hex : '#000000';
4410
+ var normalized = safeHex.length === 4 ? "#".concat(safeHex[1]).concat(safeHex[1]).concat(safeHex[2]).concat(safeHex[2]).concat(safeHex[3]).concat(safeHex[3]) : safeHex;
4411
+ var r = parseInt(normalized.slice(1, 3), 16);
4412
+ var g = parseInt(normalized.slice(3, 5), 16);
4413
+ var b = parseInt(normalized.slice(5, 7), 16);
4414
+ var lerp = function lerp(start, end, t) {
4415
+ return start + (end - start) * Math.min(Math.max(t, 0), 1);
4416
+ };
4417
+
4418
+ // At 0: keep original grayscale; at 1: fully tint to the picked color.
4419
+ return {
4420
+ red: Math.round(lerp(255, r, tintStrength)),
4421
+ green: Math.round(lerp(255, g, tintStrength)),
4422
+ blue: Math.round(lerp(255, b, tintStrength))
4423
+ };
4424
+ }, [element === null || element === void 0 ? void 0 : element.tintColor, tintStrength]),
4425
+ red = _useMemo.red,
4426
+ green = _useMemo.green,
4427
+ blue = _useMemo.blue;
4273
4428
  React.useEffect(function () {
4274
4429
  var cancelled = false;
4275
4430
  var objectUrl;
@@ -4337,13 +4492,26 @@ var CanvasImage = function CanvasImage(_ref) {
4337
4492
  if (objectUrl) URL.revokeObjectURL(objectUrl);
4338
4493
  };
4339
4494
  }, [element === null || element === void 0 ? void 0 : element.src]);
4495
+ React.useEffect(function () {
4496
+ if (!(imageNodeRef !== null && imageNodeRef !== void 0 && imageNodeRef.current)) return;
4497
+ if (hasTint) {
4498
+ imageNodeRef.current.cache();
4499
+ } else {
4500
+ imageNodeRef.current.clearCache();
4501
+ }
4502
+ }, [hasTint, red, green, blue]);
4340
4503
  if (!loaded || !imgEl) return null;
4341
4504
  return /*#__PURE__*/React.createElement(reactKonva.Image, _extends({
4505
+ ref: imageNodeRef,
4342
4506
  id: id,
4343
4507
  image: imgEl
4344
4508
  }, element, {
4345
4509
  width: element === null || element === void 0 ? void 0 : element.width,
4346
4510
  height: element === null || element === void 0 ? void 0 : element.height,
4511
+ filters: hasTint ? [Konva.Filters.Grayscale, Konva.Filters.RGB] : undefined,
4512
+ red: hasTint ? red : undefined,
4513
+ green: hasTint ? green : undefined,
4514
+ blue: hasTint ? blue : undefined,
4347
4515
  onClick: function onClick() {
4348
4516
  return _onClick && _onClick();
4349
4517
  },
@@ -5164,6 +5332,11 @@ var Editor = function Editor(_ref) {
5164
5332
  onChangeImageStrokeWidth = _ref.onChangeImageStrokeWidth,
5165
5333
  onChangeImageStrokeColor = _ref.onChangeImageStrokeColor,
5166
5334
  onChangeImageOpacity = _ref.onChangeImageOpacity,
5335
+ imageTintColor = _ref.imageTintColor,
5336
+ imageTintStrength = _ref.imageTintStrength,
5337
+ onChangeImageTintColor = _ref.onChangeImageTintColor,
5338
+ onChangeImageTintStrength = _ref.onChangeImageTintStrength,
5339
+ onClearImageTint = _ref.onClearImageTint,
5167
5340
  qrStrokeWidth = _ref.qrStrokeWidth,
5168
5341
  qrStrokeColor = _ref.qrStrokeColor,
5169
5342
  qrOpacity = _ref.qrOpacity,
@@ -5499,6 +5672,11 @@ var Editor = function Editor(_ref) {
5499
5672
  onChangeImageStrokeWidth: onChangeImageStrokeWidth,
5500
5673
  onChangeImageStrokeColor: onChangeImageStrokeColor,
5501
5674
  onChangeImageOpacity: onChangeImageOpacity,
5675
+ imageTintColor: imageTintColor,
5676
+ imageTintStrength: imageTintStrength,
5677
+ onChangeImageTintColor: onChangeImageTintColor,
5678
+ onChangeImageTintStrength: onChangeImageTintStrength,
5679
+ onClearImageTint: onClearImageTint,
5502
5680
  qrStrokeWidth: qrStrokeWidth,
5503
5681
  qrStrokeColor: qrStrokeColor,
5504
5682
  qrOpacity: qrOpacity,
@@ -6593,38 +6771,46 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
6593
6771
  _useState38 = _slicedToArray(_useState37, 2),
6594
6772
  imageOpacity = _useState38[0],
6595
6773
  setImageOpacity = _useState38[1];
6596
- var _useState39 = React.useState(2),
6774
+ var _useState39 = React.useState(theme.color.black),
6597
6775
  _useState40 = _slicedToArray(_useState39, 2),
6598
- qrStrokeWidth = _useState40[0],
6599
- setQrStrokeWidth = _useState40[1];
6600
- var _useState41 = React.useState(theme.color.black),
6776
+ imageTintColor = _useState40[0],
6777
+ setImageTintColor = _useState40[1];
6778
+ var _useState41 = React.useState(0.6),
6601
6779
  _useState42 = _slicedToArray(_useState41, 2),
6602
- qrStrokeColor = _useState42[0],
6603
- setQrStrokeColor = _useState42[1];
6604
- var _useState43 = React.useState(1),
6780
+ imageTintStrength = _useState42[0],
6781
+ setImageTintStrength = _useState42[1];
6782
+ var _useState43 = React.useState(2),
6605
6783
  _useState44 = _slicedToArray(_useState43, 2),
6606
- qrOpacity = _useState44[0],
6607
- setQrOpacity = _useState44[1];
6608
- var _useState45 = React.useState(null),
6784
+ qrStrokeWidth = _useState44[0],
6785
+ setQrStrokeWidth = _useState44[1];
6786
+ var _useState45 = React.useState(theme.color.black),
6609
6787
  _useState46 = _slicedToArray(_useState45, 2),
6610
- selectedElement = _useState46[0],
6611
- setSelectedElement = _useState46[1];
6612
- var _useState47 = React.useState(customImages || []),
6788
+ qrStrokeColor = _useState46[0],
6789
+ setQrStrokeColor = _useState46[1];
6790
+ var _useState47 = React.useState(1),
6613
6791
  _useState48 = _slicedToArray(_useState47, 2),
6614
- customImagesList = _useState48[0],
6615
- setCustomImagesList = _useState48[1];
6616
- var _useState49 = React.useState(defaultQrLogo),
6792
+ qrOpacity = _useState48[0],
6793
+ setQrOpacity = _useState48[1];
6794
+ var _useState49 = React.useState(null),
6617
6795
  _useState50 = _slicedToArray(_useState49, 2),
6618
- qrLogo = _useState50[0],
6619
- setQrLogo = _useState50[1];
6620
- var _useState51 = React.useState(basicTextProps),
6796
+ selectedElement = _useState50[0],
6797
+ setSelectedElement = _useState50[1];
6798
+ var _useState51 = React.useState(customImages || []),
6621
6799
  _useState52 = _slicedToArray(_useState51, 2),
6622
- defaultTextProps = _useState52[0],
6623
- setDefaultTextProps = _useState52[1];
6624
- var _useState53 = React.useState(qrId),
6800
+ customImagesList = _useState52[0],
6801
+ setCustomImagesList = _useState52[1];
6802
+ var _useState53 = React.useState(defaultQrLogo),
6625
6803
  _useState54 = _slicedToArray(_useState53, 2),
6626
- currentQrId = _useState54[0],
6627
- setCurrentQrId = _useState54[1];
6804
+ qrLogo = _useState54[0],
6805
+ setQrLogo = _useState54[1];
6806
+ var _useState55 = React.useState(basicTextProps),
6807
+ _useState56 = _slicedToArray(_useState55, 2),
6808
+ defaultTextProps = _useState56[0],
6809
+ setDefaultTextProps = _useState56[1];
6810
+ var _useState57 = React.useState(qrId),
6811
+ _useState58 = _slicedToArray(_useState57, 2),
6812
+ currentQrId = _useState58[0],
6813
+ setCurrentQrId = _useState58[1];
6628
6814
  var overallLoading = loadingFonts || loadingImages || loadingUploadImage || loading;
6629
6815
  var getPageDims = React.useCallback(function () {
6630
6816
  var _base$find;
@@ -7365,6 +7551,26 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
7365
7551
  setImageOpacity(e);
7366
7552
  }
7367
7553
  };
7554
+ var onChangeImageTintColor = function onChangeImageTintColor(color) {
7555
+ if (isElementOfSameType(selectedElement, elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.image)) {
7556
+ changeSelectedElementProperty('tintColor', color);
7557
+ }
7558
+ setImageTintColor(color);
7559
+ };
7560
+ var onChangeImageTintStrength = function onChangeImageTintStrength(value) {
7561
+ var nextStrength = Math.max(0, Math.min(1, value));
7562
+ if (isElementOfSameType(selectedElement, elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.image)) {
7563
+ changeSelectedElementProperty('tintStrength', nextStrength);
7564
+ } else {
7565
+ setImageTintStrength(nextStrength);
7566
+ }
7567
+ };
7568
+ var onClearImageTint = function onClearImageTint() {
7569
+ if (isElementOfSameType(selectedElement, elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.image)) {
7570
+ changeSelectedElementProperty('tintStrength', 0);
7571
+ }
7572
+ setImageTintStrength(0);
7573
+ };
7368
7574
  var addCustomImageToList = function addCustomImageToList(img) {
7369
7575
  // console.error({img});
7370
7576
  setCustomImagesList([].concat(_toConsumableArray(customImagesList), [img]));
@@ -7377,6 +7583,8 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
7377
7583
  stroke: imageStrokeColor,
7378
7584
  strokeWidth: imageStrokeWidth,
7379
7585
  opacity: imageOpacity,
7586
+ tintColor: imageTintColor,
7587
+ tintStrength: imageTintStrength,
7380
7588
  type: elementTypes.image,
7381
7589
  draggable: true,
7382
7590
  // width: 100,
@@ -7694,9 +7902,14 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
7694
7902
  imageStrokeWidth: imageStrokeWidth,
7695
7903
  imageStrokeColor: imageStrokeColor,
7696
7904
  imageOpacity: imageOpacity,
7905
+ imageTintColor: imageTintColor,
7906
+ imageTintStrength: imageTintStrength,
7697
7907
  onChangeImageStrokeWidth: onChangeImageStrokeWidth,
7698
7908
  onChangeImageStrokeColor: onChangeImageStrokeColor,
7699
7909
  onChangeImageOpacity: onChangeImageOpacity,
7910
+ onChangeImageTintColor: onChangeImageTintColor,
7911
+ onChangeImageTintStrength: onChangeImageTintStrength,
7912
+ onClearImageTint: onClearImageTint,
7700
7913
  onChangeShapeStrokeColor: onChangeShapeStrokeColor,
7701
7914
  onChangeShapeStrokeWidth: onChangeShapeStrokeWidth,
7702
7915
  onChangeShapeFill: onChangeShapeFill,