@chaitrabhairappa/react-native-rich-text-editor 3.1.0 → 3.3.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.
Files changed (44) hide show
  1. package/README.md +5 -0
  2. package/android/src/main/java/com/richtext/editor/FloatingToolbar.kt +12 -12
  3. package/android/src/main/java/com/richtext/editor/RichTextEditorView.kt +42 -5
  4. package/android/src/main/java/com/richtext/editor/RichTextEditorViewManager.kt +27 -0
  5. package/android/src/main/java/com/richtext/editor/ToolbarIcons.kt +67 -0
  6. package/android/src/main/res/drawable/ic_format_align_center.xml +3 -3
  7. package/android/src/main/res/drawable/ic_format_align_left.xml +3 -3
  8. package/android/src/main/res/drawable/ic_format_align_right.xml +3 -3
  9. package/android/src/main/res/drawable/ic_format_bold.xml +3 -3
  10. package/android/src/main/res/drawable/ic_format_checklist.xml +3 -3
  11. package/android/src/main/res/drawable/ic_format_clear.xml +3 -3
  12. package/android/src/main/res/drawable/ic_format_code.xml +3 -3
  13. package/android/src/main/res/drawable/ic_format_heading.xml +3 -3
  14. package/android/src/main/res/drawable/ic_format_highlight.xml +3 -3
  15. package/android/src/main/res/drawable/ic_format_indent.xml +3 -3
  16. package/android/src/main/res/drawable/ic_format_italic.xml +3 -3
  17. package/android/src/main/res/drawable/ic_format_link.xml +3 -3
  18. package/android/src/main/res/drawable/ic_format_list_bulleted.xml +3 -3
  19. package/android/src/main/res/drawable/ic_format_list_numbered.xml +3 -3
  20. package/android/src/main/res/drawable/ic_format_media_attachment.xml +3 -3
  21. package/android/src/main/res/drawable/ic_format_outdent.xml +3 -3
  22. package/android/src/main/res/drawable/ic_format_quote.xml +3 -3
  23. package/android/src/main/res/drawable/ic_format_redo.xml +3 -3
  24. package/android/src/main/res/drawable/ic_format_strikethrough.xml +3 -3
  25. package/android/src/main/res/drawable/ic_format_underline.xml +3 -3
  26. package/android/src/main/res/drawable/ic_format_undo.xml +3 -3
  27. package/ios/RichTextEditorView.swift +66 -12
  28. package/ios/RichTextEditorViewManager.m +3 -0
  29. package/ios/ToolbarIcons.swift +48 -747
  30. package/lib/commonjs/RichTextEditorViewNativeComponent.js.map +1 -1
  31. package/lib/commonjs/index.js +3 -0
  32. package/lib/commonjs/index.js.map +1 -1
  33. package/lib/module/RichTextEditorViewNativeComponent.js.map +1 -1
  34. package/lib/module/index.js +3 -0
  35. package/lib/module/index.js.map +1 -1
  36. package/lib/typescript/src/RichTextEditorViewNativeComponent.d.ts +3 -0
  37. package/lib/typescript/src/RichTextEditorViewNativeComponent.d.ts.map +1 -1
  38. package/lib/typescript/src/index.d.ts.map +1 -1
  39. package/lib/typescript/src/types.d.ts +3 -0
  40. package/lib/typescript/src/types.d.ts.map +1 -1
  41. package/package.json +1 -1
  42. package/src/RichTextEditorViewNativeComponent.ts +3 -0
  43. package/src/index.tsx +3 -0
  44. package/src/types.ts +3 -0
package/README.md CHANGED
@@ -140,6 +140,7 @@ export default App;
140
140
  | `placeholder` | `string` | `""` | Placeholder text |
141
141
  | `initialContent` | `Block[]` | `[]` | Initial content blocks |
142
142
  | `readOnly` | `boolean` | `false` | Make editor read-only |
143
+ | `selectable` | `boolean` | `true` | Enable/disable text selection |
143
144
  | `numberOfLines` | `number` | `undefined` | Truncate text with ellipsis in readOnly mode |
144
145
  | `maxHeight` | `number` | `undefined` | Maximum height before scrolling |
145
146
  | `showToolbar` | `boolean` | `true` | Show/hide floating toolbar |
@@ -314,6 +315,10 @@ const toolbarOptions: ToolbarOption[] = ['bold', 'italic', 'underline', 'bullet'
314
315
 
315
316
  ## Changelog
316
317
 
318
+ ### 3.3.0
319
+
320
+ - Add `selectable` prop to enable/disable text selection (iOS & Android)
321
+
317
322
  ### 3.0.0
318
323
 
319
324
  - Add media attachment support — insert images into the editor (iOS & Android)
@@ -1,9 +1,11 @@
1
1
  package com.richtext.editor
2
2
 
3
3
  import android.content.Context
4
+ import android.graphics.Bitmap
4
5
  import android.graphics.Color
5
6
  import android.graphics.PorterDuff
6
7
  import android.graphics.PorterDuffColorFilter
8
+ import android.graphics.drawable.BitmapDrawable
7
9
  import android.graphics.drawable.GradientDrawable
8
10
  import android.view.Gravity
9
11
  import android.view.View
@@ -57,6 +59,9 @@ class FloatingToolbar(context: Context) : LinearLayout(context) {
57
59
  private val activeColor = Color.parseColor("#5082C8")
58
60
  private val inactiveColor = Color.WHITE
59
61
 
62
+ private val iconSize = maxOf((20 * density).toInt(), 1)
63
+ private val iconPadding = (8 * density).toInt()
64
+
60
65
  private val buttons = mutableMapOf<String, ImageView>()
61
66
  private val buttonContainer: LinearLayout
62
67
  private val scrollView: HorizontalScrollView
@@ -193,12 +198,8 @@ class FloatingToolbar(context: Context) : LinearLayout(context) {
193
198
  }
194
199
  }
195
200
 
196
- private val iconSize = (20 * density).toInt()
197
- private val iconPadding = (10 * density).toInt()
198
-
199
201
  private fun createButton(option: String): ImageView? {
200
- val drawableResId = getDrawableResId(option)
201
- if (drawableResId == 0) return null
202
+ val bitmap = ToolbarIcons.getIcon(option, inactiveColor, iconSize) ?: return null
202
203
 
203
204
  val button = ImageView(context).apply {
204
205
  scaleType = ImageView.ScaleType.FIT_CENTER
@@ -214,9 +215,7 @@ class FloatingToolbar(context: Context) : LinearLayout(context) {
214
215
  params.marginEnd = buttonSpacing
215
216
  layoutParams = params
216
217
 
217
- // Set the icon - drawable will scale to fit within padding
218
- setImageResource(drawableResId)
219
- colorFilter = PorterDuffColorFilter(inactiveColor, PorterDuff.Mode.SRC_IN)
218
+ setImageBitmap(bitmap)
220
219
  }
221
220
 
222
221
  when (option) {
@@ -283,10 +282,11 @@ class FloatingToolbar(context: Context) : LinearLayout(context) {
283
282
 
284
283
  for ((option, button) in buttons) {
285
284
  val isActive = states[option] ?: false
286
- button.colorFilter = PorterDuffColorFilter(
287
- if (isActive) activeColor else inactiveColor,
288
- PorterDuff.Mode.SRC_IN
289
- )
285
+ val color = if (isActive) activeColor else inactiveColor
286
+ val bitmap = ToolbarIcons.getIcon(option, color, iconSize)
287
+ if (bitmap != null) {
288
+ button.setImageBitmap(bitmap)
289
+ }
290
290
  (button.background as? GradientDrawable)?.setColor(
291
291
  if (isActive) Color.parseColor("#40FFFFFF") else Color.TRANSPARENT
292
292
  )
@@ -55,6 +55,9 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
55
55
  private var numberOfLinesValue: Int = 0
56
56
  private var showToolbar: Boolean = true
57
57
  private var variant: String = "outlined"
58
+ private var customFontFamily: String? = null
59
+ private var customFontSize: Float = 16f
60
+ private var customTypeface: Typeface? = null
58
61
  private var density: Float = 1f
59
62
  private var isInternalChange = false
60
63
  private var lastReportedHeight: Float = 0f
@@ -150,8 +153,8 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
150
153
  // Disable vertical scrolling by default
151
154
  isVerticalScrollBarEnabled = false
152
155
 
153
- // Set white background by default
154
- setBackgroundColor(Color.WHITE)
156
+ // Transparent background so it inherits parent's background
157
+ setBackgroundColor(Color.TRANSPARENT)
155
158
 
156
159
  // Default outlined style
157
160
  applyVariantStyle()
@@ -875,16 +878,16 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
875
878
  private fun applyVariantStyle() {
876
879
  if (variant == "flat") {
877
880
  background = null
878
- setBackgroundColor(Color.WHITE)
881
+ setBackgroundColor(Color.TRANSPARENT)
879
882
  drawBottomBorder = true
880
883
  } else if (variant == "plain") {
881
884
  background = null
882
- setBackgroundColor(Color.WHITE)
885
+ setBackgroundColor(Color.TRANSPARENT)
883
886
  drawBottomBorder = false
884
887
  } else {
885
888
  drawBottomBorder = false
886
889
  val bg = GradientDrawable().apply {
887
- setColor(Color.WHITE)
890
+ setColor(Color.TRANSPARENT)
888
891
  cornerRadius = 8 * density
889
892
  setStroke((1 * density).toInt(), Color.parseColor("#E0E0E0"))
890
893
  }
@@ -961,6 +964,36 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
961
964
  hint = value
962
965
  }
963
966
 
967
+ fun setFontFamily(value: String?) {
968
+ customFontFamily = value
969
+ customTypeface = if (value != null) {
970
+ try {
971
+ val assetPath = "fonts/$value.ttf"
972
+ Typeface.createFromAsset(context.assets, assetPath)
973
+ } catch (_: Exception) {
974
+ try {
975
+ val assetPath = "fonts/$value.otf"
976
+ Typeface.createFromAsset(context.assets, assetPath)
977
+ } catch (_: Exception) {
978
+ Typeface.create(value, Typeface.NORMAL)
979
+ }
980
+ }
981
+ } else {
982
+ null
983
+ }
984
+ applyFont()
985
+ }
986
+
987
+ fun setFontSizeValue(value: Float) {
988
+ customFontSize = if (value > 0) value else 16f
989
+ applyFont()
990
+ }
991
+
992
+ private fun applyFont() {
993
+ textSize = customFontSize
994
+ typeface = customTypeface
995
+ }
996
+
964
997
  fun setVariant(value: String) {
965
998
  variant = value
966
999
  applyVariantStyle()
@@ -973,6 +1006,10 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
973
1006
  }
974
1007
  }
975
1008
 
1009
+ fun setSelectableValue(value: Boolean) {
1010
+ setTextIsSelectable(value)
1011
+ }
1012
+
976
1013
  fun setMaxHeightValue(value: Int) {
977
1014
  maxHeightValue = value
978
1015
  post { updateContentSize() }
@@ -62,6 +62,15 @@ class RichTextEditorViewManager : SimpleViewManager<RichTextEditorView>() {
62
62
  }
63
63
  }
64
64
 
65
+ @ReactProp(name = "selectable")
66
+ fun setSelectable(view: RichTextEditorView, selectable: Boolean) {
67
+ try {
68
+ view.setSelectableValue(selectable)
69
+ } catch (e: Exception) {
70
+ e.printStackTrace()
71
+ }
72
+ }
73
+
65
74
  @ReactProp(name = "maxHeight")
66
75
  fun setMaxHeight(view: RichTextEditorView, maxHeight: Double) {
67
76
  try {
@@ -106,6 +115,24 @@ class RichTextEditorViewManager : SimpleViewManager<RichTextEditorView>() {
106
115
  }
107
116
  }
108
117
 
118
+ @ReactProp(name = "fontFamily")
119
+ fun setFontFamily(view: RichTextEditorView, fontFamily: String?) {
120
+ try {
121
+ view.setFontFamily(fontFamily)
122
+ } catch (e: Exception) {
123
+ e.printStackTrace()
124
+ }
125
+ }
126
+
127
+ @ReactProp(name = "fontSize", defaultFloat = 16f)
128
+ fun setFontSize(view: RichTextEditorView, fontSize: Float) {
129
+ try {
130
+ view.setFontSizeValue(fontSize)
131
+ } catch (e: Exception) {
132
+ e.printStackTrace()
133
+ }
134
+ }
135
+
109
136
  @ReactProp(name = "variant")
110
137
  fun setVariant(view: RichTextEditorView, variant: String?) {
111
138
  try {
@@ -0,0 +1,67 @@
1
+ package com.richtext.editor
2
+
3
+ import android.graphics.*
4
+ import android.util.Base64
5
+
6
+ /**
7
+ * Provides toolbar icons as pre-rendered PNG images (base64-encoded).
8
+ * Icons are identical to those used on iOS for cross-platform consistency.
9
+ * All icons are rendered from the same SVG path data at 72x72px (3x density).
10
+ */
11
+ object ToolbarIcons {
12
+
13
+ private val iconData = mapOf(
14
+ "bold" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAABvElEQVR4nO3aP0uXURjG8SvKpSgVaukl1BI1CM4u2Z/XUGtvQNwcBdFotEFEaCjaamhp7R+0REttFTRJZYMpBt845OL03IWd87s71wfOeg0XD4fznHNLZmZmZmZm9l/gcG0Cb4GHwA3gtLLj39oFVoEzyoo6PgNTyoh6fgDXlQ11bQOXlAn1vQfGlAVt3FIWxCwG1grwPJj3ETiiDAj4w7xZ4Gsg9qJ6LKgArgRi59VrQQXwYiD2rjovaHkg9pE6L2hlIPaxOi/o5UDsHfVaEHA1EHtNPRbE73K+DUR+SnOaJmYusG4Dr4J5N5UF9d1XJtT1BjipTKjnKTChbKhjB5hRRtS1BhxXJtRXDpDjyoI2yn50VBnQznxvN4qL+2sD+BLI/J7ivYyAv8gcBx4EoufUY0EFcAx4NhD9Wr0WVACXB6L3gBPquKBTgfjzGmW0L2haHRc0G4g/px4LAsaCD4mT6q0gYHJ/iGrIO406Du9GsawF4F7wZbVY1qijnZ8jv/80LmhdGdDGhxT/YUWDcrZSTZlRV3kPu6BMqHcnveRL+4PDmmUW8UkZtwPOtv4QzMzMzMzMzMzMzHTALzu/TlkIFz7bAAAAAElFTkSuQmCC",
15
+ "italic" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAABIElEQVR4nO3Xy0mDURRF4a1jjU34qkRCsBEJIdiIhBBsREKwEqM24WOsS2zgPwchg7j3N72zxYHNlSIiIiIiIsIGO6Z9RwINS6BCAhUSqJBAhQQqJFAhgf4IuG/Eu5EjYAS8F3F+30dyBNw2rudOjoAD4LmI8w2cyxFw3bieB7kCHhuBruQIOAO+ijgvwKEcAavG9UzlCDhuTPuH87TPG9ezkPG0bxvTfiFHwKRxPWu5AjaNQGM5ItM+DFg2rmcm42l/a0z7iRwBs8b1LGU87U+Nab+UI2DcuJ6NXAHrRqCJHAGnjV/7q/OvfdG4nrkcAUeNaf90nvZp43pW+q/YMe07EmhYAhUSqJBAhQQqJFAhgQoJFBEREREREREREbL3A+hWfBELhFT9AAAAAElFTkSuQmCC",
16
+ "underline" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAABxElEQVR4nO3XQUpbQRzH8T910era7ltBe41SeoWiJ6h4Cw+gySYU92nTVXuIiIQWcSNVz6AeIG7ylYG3kFLm91Ln4Tz5fSAQQpjf5Jf35s1EmJmZmZl1ibz9DvL2c4FRG1xQngsSXJDgggQXJLggwQUJLkhwQYILElyQ4IIEFyS4IMEFCS5IcEGCCxJckOCCBBckuCDBBQnAXaakgygMGGTy5lEb4DYz4UkHed8zeddRG+AsM+E/HeRdZvJOozbAN/I2C2a9E1njqA2wJyZ9WDBrKLI+R22ADWCRmfQceFMoJ/dAWJTI6QRwIv7ZU2DtEeO/An6JjGnUCthB+5F+6H+MvQr8bDH+p6gVsAJctPgR6Sp4u+Rt9bvFuOfAi6gZ8JF25s1iuyWeVkOx5jxce95HHwBHLCftaSbN7njQvL9acoxR9AXtFtOSZsDL6BPgdcv16LFSxnr0EbDe8ZU06205f91uXwoXkxbkUe9uqxzgQzq0FijnvDdPq2WlPQqwDRyLY8m/rphp2gRWv88pJW0UgV3ga3MEuW32O+l103w2br5T59nKzMzs+aInXJDgggQXJLggwQUJT/soMzMzM7N4ju4BPDGZUVsSfzcAAAAASUVORK5CYII=",
17
+ "strikethrough" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAdUlEQVR4nO3VwQ2AQAzAsO6/dNmAiBc6sEfIJzMAAAAcZQ8hUBAoCBQECgIFgYJAQaAwJ9qH5m9WoHsCBYGCQEGgIFAQKAgEAEcu+RQCBYGCQEGgIFB4d30A8Fn70PzNCnRPoCBQECgIFAQKAgWBAAAAAOYNF59/SnvOM5yQAAAAAElFTkSuQmCC",
18
+ "code" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAABGklEQVR4nO3ZMU7DQBgF4a3TIYHETVPapQ9HQ8N1BkWQIlKUAPHu/k/Md4Dn3ZGVIm5NkiRJkiRJkkoAVmBL3e+Kr8OfbWn7XXF5+N0v0Xu/K64ffrdL9N7vituHP3kHDg/sH743bllbcJznHZ7zBLzdedb2L+NERmJwnKhITIoTEYnJcUpHokickpEoFqdUJIrGKRGJ4nGmRiIkzpRIhMUZGonQOEMipcfpHgk43hn9AF5bccDLD/4BWP46fkyO1DVOeiRGxEmNNDROWqQpcVIiTY1TPVKJOFUjlYpTLVLJOFUilY4zO1JEnFmRouKMjhQZ58xPz4+/SUv1/SG4foklZX8ILi+xpO2P/E1aU/clSZIkSZIkqf3KJ7XdjUR0XLs+AAAAAElFTkSuQmCC",
19
+ "highlight" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAABeUlEQVR4nO3UTUrEQBRF4Wfj1J/dOHMuuAAHoiC4BoeuQxHRrYiCuCWVIw0GGjX1ukkquYn3W0DVy6HyIszMzKwDWnQ5c1ZwoDIHSjhQwoESDvQfAwHHwI56IGAfOOrjrE0uPQE+gBdgVzUQsAe8fs962vW8TeM0eonUt5U4jfqR+B1HMtIfcepHAg6BT9o997WTetg5b4U534GDGhcvgIfCxaO/pMLLWXW3/JZaAyyAx2SAp2oDlGfbXiPOLbBVe5BF4SUtf8HzqgOUZ7sorIF6L2fNSKPGSSINF6clkkSclkjDx/kR6R44CzHAJXBTfeeYmQTEhBrEhBrEhBrEhBrEhBrEhBrEhBrEhBrEhBrEhBrEhBrEhBrEhBrEhBrEhBrgCh3XoQiNSJpxRCJpxxk50jTijBRpWnEGjjTNOANFmnacypHmEadSpHnFafRVJ+YKBypzoIQDJRwo4UAJB0o4UMKBEg6UcKCEAyUcKOFACQcyMzOLAX0B6ECHyn/I8bMAAAAASUVORK5CYII=",
20
+ "heading" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAhUlEQVR4nO3QsQ2AQBADwSudzg/RAJshvZiJnXhnAAAAOMoeQqAgUBAoCBQECgIFgYJAYU61u1edezbzVyvQO4GCQEGgIFAQKAgUBAoCBYGCQEGgIFAQKAgUBAoCBYGCQEGgIFAQKAgUBAoCBYGCQEGgIFAQKAgUBAoCBYGCQAAAAADztRu2Ullm5rngbwAAAABJRU5ErkJggg==",
21
+ "bullet" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAABG0lEQVR4nO3aXW7CMBBFYa8AWAwEuqsSFoYotCzvVJbSpzixpUYKxueT8hSRsSbk72pCkCRJkiSpVsAH0ANn4LT2el4GsAOejH3HfaF1pJvz5zHxmyosdVnlHFtu0KWgTm+D5p1bbtCpoE7XbIOi4Wk15R4SqERY8DH/SBz/DmwXKfIOgG54SfwEDmuvR5IkSS8CE8XJxuxMFOf/Oc+Z7z0TRfJMFDNMFDNMFDNMFJlmooiJYvGLYmeiKEmSpBFMFNOALfCT+A6LAw0OLzA//vI10dQq/PtGgQNU2QZdCk5E04liX1Cn6UTxWFBnNExFKw2K4o14psY1JFCJsARgA9wSx7/GfYsUeQfAYZhPjNt+7fVIkiRJkhRa9QtNmk8JUv9uigAAAABJRU5ErkJggg==",
22
+ "numbered" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAABDklEQVR4nO3XsU3EMBhAYReIDokNKFiHillArMAEVCxCxQwUzEBBfR3o0URgieRsnxPEf36flC7+o7wkSpKSJEmSJOnfYEGSgap4BzWg8REjiJYGBupBY3WC6IpioAY0VieIlgYG6sEW1Y8JBjKQJEkD+dNP9YgM1B9oV5oxFOACeJvifALXe/YNYc04Z8BLNvumsH8Ia8U5AZ6yuY8Va4YK9JDNfAZODfQT5zaL8wqcV0YNoffOuQI+plnvwGXD2iEC7TY9QHSbX4HoDCRJ0tHyNV9goAIDHYiKXw2COLTB3AnfZVvxAAwYaJaBJvN5DPQNuM82A+2DgX6HWJJGtlglk0ZGhSRJkiRJUlrfF/qJCMx4HPSsAAAAAElFTkSuQmCC",
23
+ "quote" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAsklEQVR4nO3S0QkCURAEwQvNzA1tzOCdHzYqVAXQ7MBeFwAAAAAA8P/2Id/q5xYPqPu5xQPqfm7xgLqfWzyg7ucWD6j7ucUD6n5u8YC6n1s8oO7nFg+o+7nFA+p+bvGAup9bPKDu5xYPqPu5xQPqfm7xgLqfWzyg7ucWD6j7X7ft8cb9z1/t57Y93xjw+NV+ar7nzPcc+J4bvufA99zwPQe+54bvOfA9N3wPAAAAAABwlV6W3Lr8+te/TgAAAABJRU5ErkJggg==",
24
+ "checklist" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbUlEQVR4nO3ZzUkDQQBH8fHsJdiCJ78gQUsSLMUCPGktYgEe7EEvagixAn2ymIUo7MxkNya7mfc7m3XymITAPwRJkiRJ2g3A/rbP0FvAJfAMHG77LH2N88mPFyM1x6kZKRLHSBlxKm/AcSgR6TjvwEkYOmACXAN7K7zmCviKxHkFjsLQAWNgtnhTdzmRSro546U45ETKjHMadjRONNK647BBbQLdJ555sxwp4ztn5Y8VPQ80Ah4Tz72tImXcnClw1uIM/Q20OOAB8JR49kPi5kzbfufQ90Ar3KS13pwaG9T2jF0idYqz+L8b0+WcbSJ1jjNI5EWaA+ehVMQjlR0nEck4kUgfwMWvP1CofydVv7gn9pB6A3exZu5iEe5iEe5iEe5iEe5iESWtGxN3seY4Y3exvDg1d7FInJq7mLtYgrtYBtzFsiKN3MX+J9LUXayZu1hE2esG7mKtI82Lvjl/uYtlwF1MkiRJkiQpDMw3gf9lg/avHogAAAAASUVORK5CYII=",
25
+ "mediaAttachment" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAACF0lEQVR4nO2bL08cQRiH99JAQyowGAqpqMW1HwDNBwBJSHD8qeELVKAraiuQTV01njsI0GAwVU0q6po0B6kg8JBJN4Rcjntndt8ru8Pv8e+ffTL37mRnriiEEEIIIYSoC/Ac2AYOgQvaQ+i1B2wBk+OSMwec0X6+AS/HsXLOyIdT15UEvCM/Nj0FHZEfPU9BffKj7ykoSyTIQIIMJMhAggwkyECCDCTIQIIMJMhAggwkyECCDCTIQIIMJMhAggwkyECCDCTIQIKemKA+sOx55J2boJWylzWvhDkJ+jDQz55H0lwEdQfP0YEXwHlOgk4qxv166CYGsFB3HjVF0D7wDPicGHcFLBp9rbVd0A9gpswxlXgJYieyt722CvoLvB3IMwv8jIj9CnQie6s8jx5b0PoDud4AlyPivgPTif1VmkePKeiTkS9s+G6GxIWHXKjYY/I8qixkSPEUwlW9qYicu0NiV2v2mTSP6tQaLBzLb+B1ZM4O8OVe7EeHPpPmUd16d0TWuwaWigTKN9txea3Y5VJlyjzyqJci6H1RAeAVMF8ltu488iwYtRksGkTMPPIsFrUZbBIx88izWPRmsElY88izUNJmsEmMmkeeRbJEggwk6D8K6pMffzwFHZIfXU9BW+THhqegyfKferkQvpFPuAkKhI/nmUgKcmaLccC/lbRZHsW0aXCHXg/Cz8p95QghhBBCiOJJcgtCLsL+N1x3iwAAAABJRU5ErkJggg==",
26
+ "link" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAACPElEQVR4nO3ZTU4UQRjG8RIW4gXEszjBOxg9g6BrYLbGYOLH6DVIPIRAIpkroBudYQOcwCE6f1Pysuuq6Y+3e6bJ80tm+9bT73RXVVeHICIiIiIiIiIiIiIi/QesA1vACBgDl8A1FWXqV3VtGcaWKWZb77Yr4X/wB8DQwjSWGcdDzLgfM3fVnOfAOY5abtCtKfCszcbcA14Dc+fgXTUIy/4OWPNuzhpwSEs6bNCtQ9cmAW9LDPoHOAOOgS9VfplxK9WxsWOGvyXyHnjOOfPMQD+BbeBhWBExC7ADTDK5543nJG5Wq9yE/B64H1YUsGHLfUps4EaTAYaZ4i9CT9gdnrLXZBN4mbpzQs9k7qSLWhM28CQz56zsY7XgcfuVuKZBnYKfEsW2Q08BLxPX9LFOsXFBobh8blas06oaq1vRFuBbnQZdFRQ6q1FnZRpkeX4UlLkINQrNCgp9vQMNOioo89urQUd3oEHHXg26KiikR6zEJP2oYqNbVTHLpuckPUpk2gk9BbxKXNOHOsW2EsXOOzud898opl5eH3u/aoxCzwCfXV81rOg+ab3ZUdvRR8pu0+OOaab4qNFxQcssf+rOaX7cEcVDpQUHZhN7x6n0CtKmuNLahJz7c+M1PfUa8IDF4vL5HThZ4pHriWUoc+T6xqU5kQ7ty3/2GeqzT7k5aYqjzFieJm5zTslN157tIVa9QTHj7lJWW24+KA7iVh04tTCzJTZoZhlOLdPA/SuqiIiIiIiIiIiIiIiEpfgHLFVfxDn1QdwAAAAASUVORK5CYII=",
27
+ "undo" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAACP0lEQVR4nO3YTahMYRgH8HN9Jm5XLJC7sFEiNxtJ+VzISpKVYoGFjRQWUsjSgmSFtYWUZGFFUnchoZsklAUllOSGJC73p8MpX3NmzMy5M2em51ezO+/7/ufpnPc8502SEEIIIYQQQgghhBBCCCGEEMIPOJwUDPOxAydwBY/wCu/wEL1Jp/DTgSbnGIdVOIsXaruAnqQT+GVfA2N7sR/P1G9v0gn8Mord/zlmCo5gWOO+YGVSdv6UFmlXjes34alivMScpMz8q2KRsscp3WOKdhOTkrJS2Tds++2aRXhi7JzB0mydWUmZyPcVW7C2yb2mEWk7cAensBl9ZSxQagSftd8nXMKGtKUoU4HK6HHWhI6PAlV3D2viDqpuNHuzTu3GR2wk68DvYhC3cT/boOuVjpvX6QUaxjnsxEJMrJJpNjbiZB2fMa+xvBMLdCPrvic3mK8Hq3Ex68+qeY8VnVKgQSwrOOsArtZY90PadBa5aNHeYmthAStn3l5jr0qPXPqLWqzo76q5hQSrnXtB1hPluYUJRSxUlAeN7jNNZJ+ZvQXzHC1ikSI1H6j+/H3Zaz6vlVjc7AK6oEj92Zl3JdeanVyXFGldlTZgfTMT66Iinc7Jcr2ZSXVLkTADb3KyLGl00rF2rPBKVP8/h3JyHG90wlZo2Z2E6fhYIcPzhg7btE7L7qTso7iSgVZlKLXsaLaSPe3OVgqYlnOWfr7d2UoDQxUKNNTuXKWBg2kX/dfvcrtzhRBCCCGEEEIIIYSQlNV3D0IwYRMB14IAAAAASUVORK5CYII=",
28
+ "redo" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAACJ0lEQVR4nO3XzYtNYRzA8TGGBWpSbJSNBVaMha1iISywsbWckn/CRpGiGAsv2aNQRlIslFjIxsLLioWXFPK28vbRaZ6FNOOec895zjn0+9RsptvzPPd7zzn3/kZGQgghhBBCCCGEEEIIIYQQ+gIHuj5Dr+NA1+fodZxeBMICbMQ+nMINPMF7fEnn/IQ36f/XcSK9fh1Gc8XpLBCWYC8u4qN6PuAC9mBRk3FaD2TmEz+Hz/Io1j2JNU3EaS0QJnAVP7Wj2OcS1taJkz0QluMMfujGt3RFjQ8Tp5Azzna81A+vsatqnEKOMAvTp9ZHRzFWNk4hxy11p8Yb+I5H6XlVRD7021/xE+Aanta8ZW/hcNkXNxlnJR4PceDnOIItxdd/yb3G0y08hVcyajLOs4rfMjexG/Nr7j2KnWm9/gXCsnRblFXcgutrbzz7WTbhXm8CmRkTbpfcqxgdJjGvsSJzX1H703jSeaBjJfe5jxWNVSh3ttV42Fkg7Ci5x+W6M1KNMx7sJBCW4kWJ9aeanrYrnLHU75xcgaZKrD1d9xuq6zhDBSoGQHwdsO4DLM7y7luMM2yg8wPWfNf2AzlXnMqBsCqNA38zma1Ay3EKVQ9xfMB6d7t4KOeKUylQmtLfDhgfJrKWaDlO1UAb0vNlLleyluggTmGY0WIbzs5yNW3OVqKjOJUD/XHAMWzF6TRKjP5vcWoFCiGEEEIIIYQQQgghhBBCCGHk3/cLZTX3NeIaKrMAAAAASUVORK5CYII=",
29
+ "clearFormatting" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB2klEQVR4nO3bzS4DURTA8YPYSLDyCNh4DkktSXwUC0sSHoUQz6AbW/UgNsKStQQ7X3+ZILHQe087d3DPPf91Z9r+ctsznemIeJ7neZ7neZ7neZ7nlRUwCnSA1cjjbsmg1DgjwMnnvl+AzcBjp3NAagoHK0gpgTo9nqNCWssVKSXQIvAUQNrIESkZkFUkSR3GkJIDWUOSpsIIUmNAdZFCAfuK97YtOURiJGAMuIvgPAATkkskRAJ2FKvnQHKLREjARQTnDZiRHKMmEjCvWD1nknPAUgDpOXQWQDndWpJ7NHcIcA0Mi4VoBmlPLEVapEdgUqxFOqRjsRpxpPUI0g0wJ5YjPt1WAttOSQlRYyUVE44Uz5EUVVdDenzUvr6TlqXkgL0AUNnfScAQcBkBKhcJaClwykUCun0AlYXEx5Hxa59A5SABRwPgfEdqi9WAceBecUJ+K3LE3S51tFcdKn+WtEsc7W/A7LdtykECFojX/WG7MpCAcwXQjyfkzSOhG+1XoRPyppHQjfZdxX7sIaEf7apr7eaQ6GO097FPG0gMMNqLQkI32ge+1q5A6vnv22LCkeI5Uv3rbh3NPkpdSafVDTh//dr+K5LjBD5u1b0lvnI8z/M8z/M8+ZXeAZv5+Z1GOJFfAAAAAElFTkSuQmCC",
30
+ "indent" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA2UlEQVR4nO3WQQ7DIAwFUW7uLrn1r7LIqqqcUJsUM+8AVhhApDUAAABglIoaDkKgm1TU3Q4EGqWihoMQCAAABFn+PygbgaoHktTDhhUNpMxIekjGAnrY0KKBlH3dlqRPRHICHYh00ndEcgIR6UIgIumanjw/3Oj3/rKATqCESNroBB2MQIFxdjpBljx/6UDWdibiDAeySXv030Sc24Fs0t6sQcS5HMgmbMA00QuwsIEFA73ChlUMlI1ADgI5CAQAwHbPcDYCOQjkIJCDQA4COZ579gAAANBW9waRrOCa9HpusgAAAABJRU5ErkJggg==",
31
+ "outdent" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA7ElEQVR4nO3ZwQqDQAxF0fx1t/75Ky0upFTThElHzT3bQSZehRE0AwAAALJ0U+kgBArSTUU7EChLN5UOQiAAADDI5b+DqhHI0SqQpCVxTY9AkpbMxi0CaY1DICfO35/M2ekjDoGcOARy4hDIjuO0DyQnTutA+iFOJpAmmRKnZSAF4mQ2rkswds6jG3hUblyXYOycwyJZx0CRSBZUn2LMnMMiWXdyIs2e7/SRDMeR1mXsRXovYD/SZgnfIlmQJrFZkSx+XY9AL/z2KdDqDcogkINAAAC0O4arEchBIAeBHARyEMgx79gDAACAXd0TF7nf4uYCfIsAAAAASUVORK5CYII=",
32
+ "alignLeft" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAiElEQVR4nO3VsREDMAwDMe2/NDOCLm7MOMAI3/wMAACcyqOOgwj0pTzq2w4CncqjjoMIBAB/I2WmTcpMm5SZNikzbVJm2qTM7R4A8JA8SqCFQAuBFgItBFrcXR8AVEiZaZMy0yZlpk3KTJuUmTYpc7sHADwkjxJoIdBCoIVAC4EWd9cHAMD8sg+q0NtM71VCsAAAAABJRU5ErkJggg==",
33
+ "alignCenter" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAfUlEQVR4nO3W0QnAMAxDwey/tDtBIxooweZuhPcjrQUAAKdqqOMgAn1UQ33tINCpGuo4iEAAwIv2v+ZvJdCeQIFAgUCBQADQRg0lUCBQIFAgUCBQcHf6AKClumR1UQLtCRQIFAgUCAQAbdRQAgUCBQIFAgUCBXenDwCA1dkDHN+8XSMaKtEAAAAASUVORK5CYII=",
34
+ "alignRight" to "iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAiElEQVR4nO3VQREEMQwDQfMnrYPg2nyiS3VDmM/MAADAqTzqOIhAH+VRXzsIdCqPOg4iEADwUcpMm5SZNikzbVJm2qTMtEmZ2z0AoEAeJdBCoIVAC4EWAi3urg8AnpIy0yZlpk3KTJuUmTYpM21S5nYPACiQRwm0EGgh0EKghUCLu+sDAGD+2Q90dNtMxzL28wAAAABJRU5ErkJggg==",
35
+ )
36
+
37
+ private val iconCache = mutableMapOf<String, Bitmap>()
38
+
39
+ fun getIcon(option: String, color: Int, size: Int): Bitmap? {
40
+ val cacheKey = "${option}_${color}_${size}"
41
+ iconCache[cacheKey]?.let { return it }
42
+
43
+ val b64 = iconData[option] ?: return null
44
+ val bytes = Base64.decode(b64, Base64.DEFAULT)
45
+ val original = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) ?: return null
46
+
47
+ val safeSize = maxOf(size, 1)
48
+ val scaled = Bitmap.createScaledBitmap(original, safeSize, safeSize, true)
49
+ if (scaled !== original) original.recycle()
50
+
51
+ // Apply tint color
52
+ val tinted = Bitmap.createBitmap(safeSize, safeSize, Bitmap.Config.ARGB_8888)
53
+ val canvas = Canvas(tinted)
54
+ val paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG)
55
+ paint.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)
56
+ canvas.drawBitmap(scaled, 0f, 0f, paint)
57
+ scaled.recycle()
58
+
59
+ iconCache[cacheKey] = tinted
60
+ return tinted
61
+ }
62
+
63
+ fun clearCache() {
64
+ iconCache.values.forEach { it.recycle() }
65
+ iconCache.clear()
66
+ }
67
+ }
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M7,15v2h10v-2H7zM3,21h18v-2H3v2zM3,13h18v-2H3v2zM7,7v2h10V7H7zM3,3v2h18V3H3z"/>
8
+ android:pathData="M120,840l0,-60 720,0l0,60L120,840ZM240,700l0,-60 480,0l0,60L240,700ZM120,560l0,-60 720,0l0,60L120,560ZM240,420l0,-60 480,0l0,60L240,420ZM120,280l0,-60 720,0l0,60L120,280Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M15,15H3v2h12v-2zM15,7H3v2h12V7zM3,13h18v-2H3v2zM3,21h18v-2H3v2zM3,3v2h18V3H3z"/>
8
+ android:pathData="M120,840l0,-60 720,0l0,60L120,840ZM120,700l0,-60 480,0l0,60L120,700ZM120,560l0,-60 720,0l0,60L120,560ZM120,420l0,-60 480,0l0,60L120,420ZM120,280l0,-60 720,0l0,60L120,280Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M3,21h18v-2H3v2zM9,17h12v-2H9v2zM3,13h18v-2H3v2zM9,9h12V7H9v2zM3,3v2h18V3H3z"/>
8
+ android:pathData="M120,840l0,-60 720,0l0,60L120,840ZM360,700l0,-60 480,0l0,60L360,700ZM120,560l0,-60 720,0l0,60L120,560ZM360,420l0,-60 480,0l0,60L360,420ZM120,280l0,-60 720,0l0,60L120,280Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M15.6,10.79c0.97,-0.67 1.65,-1.77 1.65,-2.79 0,-2.26 -1.75,-4 -4,-4H7v14h7.04c2.09,0 3.71,-1.7 3.71,-3.79 0,-1.52 -0.86,-2.82 -2.15,-3.42zM10,6.5h3c0.83,0 1.5,0.67 1.5,1.5s-0.67,1.5 -1.5,1.5h-3v-3zM13.5,15.5H10v-3h3.5c0.83,0 1.5,0.67 1.5,1.5s-0.67,1.5 -1.5,1.5z"/>
8
+ android:pathData="M272,720L272,240l228,0q65.98,0 114.49,44.21Q663,328.42 663,394q0,38.4 -18,69.7 -18,31.3 -49,49.3 38,17 60.5,52.83Q679,601.67 679,645q0,70.64 -50.5,117.82Q578,810 508,810L272,720ZM348,476l164,0q38.64,0 65.82,-25.09Q605,425.82 605,388q0,-37.82 -27.18,-62.91Q550.64,300 512,300L348,300l0,176ZM348,750l182,0q41.81,0 71.41,-27.17Q631,695.65 631,652q0,-43.65 -29.59,-70.83Q571.81,554 530,554L348,554l0,196Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M22,7h-9v2h9V7zM22,15h-9v2h9v-2zM5.54,11L2,7.46l1.41,-1.41 2.12,2.12 4.24,-4.24 1.41,1.41L5.54,11zM5.54,19L2,15.46l1.41,-1.41 2.12,2.12 4.24,-4.24 1.41,1.41L5.54,19z"/>
8
+ android:pathData="M480,760l0,-60 360,0l0,60L480,760ZM480,510l0,-60 360,0l0,60L480,510ZM480,260l0,-60 360,0l0,60L480,260ZM222,836L120,734l42,-42 60,58 140,-140 42,44L222,836ZM222,586L120,484l42,-42 60,58 140,-140 42,44L222,586ZM222,336L120,234l42,-42 60,58 140,-140 42,44L222,336Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M3.27,5L2,6.27l6.97,6.97L6.5,19h3l1.57,-3.66L16.73,21 18,19.73 3.55,5.27 3.27,5zM6,5v0.18L8.82,8h2.4l-0.72,1.68 2.1,2.1L14.21,8H20V5H6z"/>
8
+ android:pathData="M792,826L530,564l-64,156 -60,0 88,-212L406,420l-70,0 0,-60 28,0L148,144l42,-42 644,682 -42,42ZM534,360l30,-72 52,0l0,-48L346,240l0,-60 330,0l0,60 -52,0 -48,118 -42,-44l0,46Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M9.4,16.6L4.8,12l4.6,-4.6L8,6l-6,6 6,6 1.4,-1.4zM14.6,16.6l4.6,-4.6 -4.6,-4.6L16,6l6,6 -6,6 -1.4,-1.4z"/>
8
+ android:pathData="M344,768L96,480l248,-288 46,42 -206,246 206,246 -46,42ZM616,768l-46,-42 206,-246 -206,-246 46,-42 248,288 -248,288Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M5,4v3h5.5v12h3V7H19V4H5z"/>
8
+ android:pathData="M160,240l0,60 260,0l0,400 60,0l0,-400 260,0l0,-60L160,240Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M6,14l3,3v5h6v-5l3,-3V9H6V14zM11,2h2v3h-2V2zM3.5,5.88l1.41,-1.41 2.12,2.12L5.62,8 3.5,5.88zM16.96,6.59l2.12,-2.12 1.41,1.41 -2.12,2.12 -1.41,-1.41z"/>
8
+ android:pathData="M320,880l0,-160 -80,-80 0,-200 -80,0 0,-60 560,0 0,60 -80,0 0,200 -80,80 0,160L320,880ZM380,820l200,0 0,-130 80,-80 0,-170L300,440l0,170 80,80 0,130ZM420,160l60,0 0,120 -60,0 0,-120ZM636,266l42,-42 84,86 -42,42 -84,-86ZM198,310l84,-86 42,42 -84,86 -42,-42ZM480,610Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M3,21h18v-2H3v2zM3,8v8l4,-4 -4,-4zM11,17h10v-2H11v2zM3,3v2h18V3H3zM11,9h10V7H11v2zM11,13h10v-2H11v2z"/>
8
+ android:pathData="M120,840l0,-60 720,0l0,60L120,840ZM440,700l0,-60 400,0l0,60L440,700ZM120,620l160,-140L120,340l0,280ZM440,560l0,-60 400,0l0,60L440,560ZM440,420l0,-60 400,0l0,60L440,420ZM120,280l0,-60 720,0l0,60L120,280Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M10,4v3h2.21l-3.42,8H6v3h8v-3h-2.21l3.42,-8H18V4z"/>
8
+ android:pathData="M224,800l0,-60 154,0 168,-520L392,220l0,-60 336,0l0,60 -150,0 -168,520L560,740l0,60L224,800Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M3.9,12c0,-1.71 1.39,-3.1 3.1,-3.1h4V7H7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-1.9H7c-1.71,0 -3.1,-1.39 -3.1,-3.1zM8,13h8v-2H8v2zM17,7h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1s-1.39,3.1 -3.1,3.1h-4V17h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5z"/>
8
+ android:pathData="M440,680L280,680q-83,0 -141.5,-58.5T80,480q0,-83 58.5,-141.5T280,280l160,0l0,60 -160,0q-58,0 -99,41t-41,99q0,58 41,99t99,41l160,0l0,60ZM320,510l0,-60 320,0l0,60L320,510ZM520,680l0,-60 160,0q58,0 99,-41t41,-99q0,-58 -41,-99t-99,-41l-160,0l0,-60 160,0q83,0 141.5,58.5T880,480q0,83 -58.5,141.5T680,680l-160,0Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M4,10.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5 1.5,-0.67 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM4,4.5c-0.83,0 -1.5,0.67 -1.5,1.5S3.17,7.5 4,7.5 5.5,6.83 5.5,6 4.83,4.5 4,4.5zM4,16.5c-0.83,0 -1.5,0.68 -1.5,1.5s0.68,1.5 1.5,1.5 1.5,-0.68 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM7,19h14v-2H7v2zM7,13h14v-2H7v2zM7,5v2h14V5H7z"/>
8
+ android:pathData="M360,760l0,-60 480,0l0,60L360,760ZM360,510l0,-60 480,0l0,60L360,510ZM360,260l0,-60 480,0l0,60L360,260ZM180,790q-33,0 -56.5,-23.5T100,710q0,-33 23.5,-56.5T180,630q33,0 56.5,23.5T260,710q0,33 -23.5,56.5T180,790ZM180,540q-33,0 -56.5,-23.5T100,460q0,-33 23.5,-56.5T180,380q33,0 56.5,23.5T260,460q0,33 -23.5,56.5T180,540ZM180,290q-33,0 -56.5,-23.5T100,210q0,-33 23.5,-56.5T180,130q33,0 56.5,23.5T260,210q0,33 -23.5,56.5T180,290Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M2,17h2v0.5H3v1h1v0.5H2v1h3v-4H2v1zM3,8h1V4H2v1h1v3zM2,11h1.8L2,13.1v0.9h3v-1H3.2L5,10.9V10H2v1zM7,5v2h14V5H7zM7,19h14v-2H7v2zM7,13h14v-2H7v2z"/>
8
+ android:pathData="M120,820l0,-60 100,0l0,-30 -60,0l0,-40h60v-30L120,660l0,-60 160,0l0,110 -50,0 0,0 50,0l0,110L120,820ZM120,580l0,-50 90,-80L120,450l0,-50 160,0l0,50L190,530l90,0l0,50L120,580ZM180,380l0,-200 -60,0l0,-50 110,0l0,250L180,380ZM360,760l0,-60 480,0l0,60L360,760ZM360,510l0,-60 480,0l0,60L360,510ZM360,260l0,-60 480,0l0,60L360,260Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M19,3H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2zM19,19H5V5h14v14zM8.5,11A1.5,1.5 0 1,0 8.5,8A1.5,1.5 0 1,0 8.5,11zM6,17h12l-3.75,-5 -2.75,3.54 -1.75,-2.04L6,17z" />
8
+ android:pathData="M200,840q-33,0 -56.5,-23.5T120,760l0,-560q0,-33 23.5,-56.5T200,120l560,0q33,0 56.5,23.5T840,200l0,560q0,33 -23.5,56.5T760,840L200,840ZM200,780l560,0q7,0 13.5,-6.5T780,760l0,-560q0,-7 -6.5,-13.5T760,180L200,180q-7,0 -13.5,6.5T180,200l0,560q0,7 6.5,13.5T200,780ZM300,680l360,0 -120,-160 -90,120 -60,-80 -90,120ZM180,780l0,-600 0,600Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M11,17h10v-2H11v2zM3,12l4,4V8l-4,4zM3,21h18v-2H3v2zM3,3v2h18V3H3zM11,9h10V7H11v2zM11,13h10v-2H11v2z"/>
8
+ android:pathData="M120,840l0,-60 720,0l0,60L120,840ZM440,700l0,-60 400,0l0,60L440,700ZM280,620L280,340L120,480l160,140ZM440,560l0,-60 400,0l0,60L440,560ZM440,420l0,-60 400,0l0,60L440,420ZM120,280l0,-60 720,0l0,60L120,280Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M6,17h3l2,-4V7H5v6h3zM14,17h3l2,-4V7h-6v6h3z"/>
8
+ android:pathData="M580,640l80,-160L520,480l0,-200 200,0l0,200l-80,160L580,640ZM220,640l80,-160L160,480l0,-200 200,0l0,200l-80,160L220,640Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M18.4,10.6C16.55,8.99 14.15,8 11.5,8c-4.65,0 -8.58,3.03 -9.96,7.22L3.9,16c1.05,-3.19 4.05,-5.5 7.6,-5.5 1.95,0 3.73,0.72 5.12,1.88L13,16h9V7l-3.6,3.6z"/>
8
+ android:pathData="M396,760q-89,0 -152.5,-53T180,556q0,-98 63.5,-155T396,344l344,0L596,200l42,-42 218,218 -218,218 -42,-42 144,-144L396,408q-63,0 -109.5,40T240,552q0,64 46.5,106T396,700l284,0l0,60L396,760Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M10,19h4v-3h-4v3zM5,4v3h5v3h4V7h5V4H5zM3,14h18v-2H3v2z"/>
8
+ android:pathData="M80,540l0,-60 800,0l0,60L80,540ZM478,380l-134,0 0,-140 272,0 0,140 -78,0 0,-80L538,300l0,80ZM404,580l152,0l0,80L404,660l0,80L344,740l0,-80L344,580l60,0Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M12,17c3.31,0 6,-2.69 6,-6V3h-2.5v8c0,1.93 -1.57,3.5 -3.5,3.5S8.5,12.93 8.5,11V3H6v8c0,3.31 2.69,6 6,6zM5,19v2h14v-2H5z"/>
8
+ android:pathData="M200,880l0,-60 560,0l0,60L200,880ZM480,740q-100,0 -170,-68.5T240,504l0,-344 60,0l0,344q0,74 51,124t129,50q78,0 129,-50t51,-124l0,-344 60,0l0,344q0,99 -70,167.5T480,740Z"/>
9
9
  </vector>
@@ -1,9 +1,9 @@
1
1
  <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  android:width="24dp"
3
3
  android:height="24dp"
4
- android:viewportWidth="24"
5
- android:viewportHeight="24">
4
+ android:viewportWidth="960"
5
+ android:viewportHeight="960">
6
6
  <path
7
7
  android:fillColor="#FFFFFF"
8
- android:pathData="M12.5,8c-2.65,0 -5.05,1.04 -6.83,2.73L3,8v9h9l-2.81,-2.81c1.36,-1.21 3.14,-1.94 5.06,-1.94 3.52,0 6.44,2.61 6.89,6H23c-0.46,-4.51 -4.3,-8 -8.75,-8z"/>
8
+ android:pathData="M280,760l0,-60 284,0q63,0 109.5,-40T720,556q0,-64 -46.5,-104T564,412L220,412l144,144 -42,42 -218,-218 218,-218 42,42 -144,144 344,0q89,0 152.5,57T780,556q0,98 -63.5,151T564,760L280,760Z"/>
9
9
  </vector>