@chaitrabhairappa/react-native-rich-text-editor 1.0.6 → 1.0.7

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 (36) hide show
  1. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  2. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  3. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  4. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  5. package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
  6. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  7. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  8. package/android/.gradle/8.9/gc.properties +0 -0
  9. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  10. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  11. package/android/.gradle/vcs-1/gc.properties +0 -0
  12. package/android/src/main/java/com/richtext/editor/FloatingToolbar.kt +69 -121
  13. package/android/src/main/java/com/richtext/editor/RichTextEditorView.kt +16 -5
  14. package/android/src/main/res/drawable/ic_format_align_center.xml +9 -0
  15. package/android/src/main/res/drawable/ic_format_align_left.xml +9 -0
  16. package/android/src/main/res/drawable/ic_format_align_right.xml +9 -0
  17. package/android/src/main/res/drawable/ic_format_bold.xml +9 -0
  18. package/android/src/main/res/drawable/ic_format_checklist.xml +9 -0
  19. package/android/src/main/res/drawable/ic_format_clear.xml +9 -0
  20. package/android/src/main/res/drawable/ic_format_code.xml +9 -0
  21. package/android/src/main/res/drawable/ic_format_heading.xml +9 -0
  22. package/android/src/main/res/drawable/ic_format_highlight.xml +9 -0
  23. package/android/src/main/res/drawable/ic_format_indent.xml +9 -0
  24. package/android/src/main/res/drawable/ic_format_italic.xml +9 -0
  25. package/android/src/main/res/drawable/ic_format_link.xml +9 -0
  26. package/android/src/main/res/drawable/ic_format_list_bulleted.xml +9 -0
  27. package/android/src/main/res/drawable/ic_format_list_numbered.xml +9 -0
  28. package/android/src/main/res/drawable/ic_format_outdent.xml +9 -0
  29. package/android/src/main/res/drawable/ic_format_quote.xml +9 -0
  30. package/android/src/main/res/drawable/ic_format_redo.xml +9 -0
  31. package/android/src/main/res/drawable/ic_format_strikethrough.xml +9 -0
  32. package/android/src/main/res/drawable/ic_format_underline.xml +9 -0
  33. package/android/src/main/res/drawable/ic_format_undo.xml +9 -0
  34. package/ios/RichTextEditorView.swift +299 -26
  35. package/ios/ToolbarIcons.swift +736 -0
  36. package/package.json +1 -1
File without changes
@@ -0,0 +1,2 @@
1
+ #Wed Jan 14 07:15:16 IST 2026
2
+ gradle.version=8.9
File without changes
@@ -2,11 +2,14 @@ package com.richtext.editor
2
2
 
3
3
  import android.content.Context
4
4
  import android.graphics.Color
5
+ import android.graphics.PorterDuff
6
+ import android.graphics.PorterDuffColorFilter
5
7
  import android.graphics.drawable.GradientDrawable
6
8
  import android.view.Gravity
7
9
  import android.view.View
8
10
  import android.view.ViewGroup
9
11
  import android.widget.HorizontalScrollView
12
+ import android.widget.ImageView
10
13
  import android.widget.LinearLayout
11
14
  import android.widget.TextView
12
15
  import android.graphics.Typeface
@@ -15,6 +18,7 @@ import android.text.Spanned
15
18
  import android.text.style.StrikethroughSpan
16
19
  import android.text.style.UnderlineSpan
17
20
  import android.text.style.BackgroundColorSpan
21
+ import androidx.core.content.ContextCompat
18
22
 
19
23
  class FloatingToolbar(context: Context) : LinearLayout(context) {
20
24
 
@@ -52,7 +56,7 @@ class FloatingToolbar(context: Context) : LinearLayout(context) {
52
56
  private val activeColor = Color.parseColor("#5082C8")
53
57
  private val inactiveColor = Color.WHITE
54
58
 
55
- private val buttons = mutableMapOf<String, TextView>()
59
+ private val buttons = mutableMapOf<String, ImageView>()
56
60
  private val buttonContainer: LinearLayout
57
61
  private val scrollView: HorizontalScrollView
58
62
 
@@ -159,10 +163,42 @@ class FloatingToolbar(context: Context) : LinearLayout(context) {
159
163
  }
160
164
  }
161
165
 
162
- private fun createButton(option: String): TextView? {
163
- val button = TextView(context).apply {
164
- gravity = Gravity.CENTER
165
- setTextColor(inactiveColor)
166
+ private fun getDrawableResId(option: String): Int {
167
+ return when (option) {
168
+ "bold" -> R.drawable.ic_format_bold
169
+ "italic" -> R.drawable.ic_format_italic
170
+ "underline" -> R.drawable.ic_format_underline
171
+ "strikethrough" -> R.drawable.ic_format_strikethrough
172
+ "code" -> R.drawable.ic_format_code
173
+ "highlight" -> R.drawable.ic_format_highlight
174
+ "heading" -> R.drawable.ic_format_heading
175
+ "bullet" -> R.drawable.ic_format_list_bulleted
176
+ "numbered" -> R.drawable.ic_format_list_numbered
177
+ "quote" -> R.drawable.ic_format_quote
178
+ "checklist" -> R.drawable.ic_format_checklist
179
+ "link" -> R.drawable.ic_format_link
180
+ "undo" -> R.drawable.ic_format_undo
181
+ "redo" -> R.drawable.ic_format_redo
182
+ "clearFormatting" -> R.drawable.ic_format_clear
183
+ "indent" -> R.drawable.ic_format_indent
184
+ "outdent" -> R.drawable.ic_format_outdent
185
+ "alignLeft" -> R.drawable.ic_format_align_left
186
+ "alignCenter" -> R.drawable.ic_format_align_center
187
+ "alignRight" -> R.drawable.ic_format_align_right
188
+ else -> 0
189
+ }
190
+ }
191
+
192
+ private val iconSize = (20 * density).toInt()
193
+ private val iconPadding = (8 * density).toInt()
194
+
195
+ private fun createButton(option: String): ImageView? {
196
+ val drawableResId = getDrawableResId(option)
197
+ if (drawableResId == 0) return null
198
+
199
+ val button = ImageView(context).apply {
200
+ scaleType = ImageView.ScaleType.FIT_CENTER
201
+ setPadding(iconPadding, iconPadding, iconPadding, iconPadding)
166
202
 
167
203
  val bg = GradientDrawable().apply {
168
204
  cornerRadius = 6 * density
@@ -173,124 +209,33 @@ class FloatingToolbar(context: Context) : LinearLayout(context) {
173
209
  val params = LayoutParams(buttonSize, buttonSize)
174
210
  params.marginEnd = buttonSpacing
175
211
  layoutParams = params
212
+
213
+ // Set the icon - drawable will scale to fit within padding
214
+ setImageResource(drawableResId)
215
+ colorFilter = PorterDuffColorFilter(inactiveColor, PorterDuff.Mode.SRC_IN)
176
216
  }
177
217
 
178
218
  when (option) {
179
- "bold" -> {
180
- button.text = "B"
181
- button.textSize = 18f
182
- button.setTypeface(null, Typeface.BOLD)
183
- button.setOnClickListener { listener?.onBoldClick() }
184
- }
185
- "italic" -> {
186
- button.text = "I"
187
- button.textSize = 18f
188
- button.setTypeface(null, Typeface.ITALIC)
189
- button.setOnClickListener { listener?.onItalicClick() }
190
- }
191
- "underline" -> {
192
- val spannable = SpannableString("U")
193
- spannable.setSpan(UnderlineSpan(), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
194
- button.text = spannable
195
- button.textSize = 18f
196
- button.setOnClickListener { listener?.onUnderlineClick() }
197
- }
198
- "strikethrough" -> {
199
- val spannable = SpannableString("S")
200
- spannable.setSpan(StrikethroughSpan(), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
201
- button.text = spannable
202
- button.textSize = 18f
203
- button.setOnClickListener { listener?.onStrikethroughClick() }
204
- }
205
- "code" -> {
206
- button.text = "</>"
207
- button.textSize = 12f
208
- button.setTypeface(Typeface.MONOSPACE, Typeface.NORMAL)
209
- button.setOnClickListener { listener?.onCodeClick() }
210
- }
211
- "highlight" -> {
212
- // Use marker/highlighter icon representation
213
- button.text = "✎"
214
- button.textSize = 18f
215
- button.setOnClickListener { listener?.onHighlightClick() }
216
- }
217
- "heading" -> {
218
- button.text = "H1"
219
- button.textSize = 14f
220
- button.setTypeface(null, Typeface.BOLD)
221
- button.setOnClickListener { listener?.onHeadingClick() }
222
- }
223
- "bullet" -> {
224
- button.text = "•≡"
225
- button.textSize = 14f
226
- button.setOnClickListener { listener?.onBulletListClick() }
227
- }
228
- "numbered" -> {
229
- button.text = "1."
230
- button.textSize = 14f
231
- button.setOnClickListener { listener?.onNumberedListClick() }
232
- }
233
- "quote" -> {
234
- button.text = "❞"
235
- button.textSize = 18f
236
- button.setOnClickListener { listener?.onQuoteClick() }
237
- }
238
- "checklist" -> {
239
- button.text = "☑"
240
- button.textSize = 18f
241
- button.setOnClickListener { listener?.onChecklistClick() }
242
- }
243
- "link" -> {
244
- button.text = "🔗"
245
- button.textSize = 14f
246
- button.setOnClickListener { listener?.onLinkClick() }
247
- }
248
- "undo" -> {
249
- button.text = "↩"
250
- button.textSize = 18f
251
- button.setOnClickListener { listener?.onUndoClick() }
252
- }
253
- "redo" -> {
254
- button.text = "↪"
255
- button.textSize = 18f
256
- button.setOnClickListener { listener?.onRedoClick() }
257
- }
258
- "clearFormatting" -> {
259
- val spannable = SpannableString("Tx")
260
- spannable.setSpan(StrikethroughSpan(), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
261
- button.text = spannable
262
- button.textSize = 14f
263
- button.setOnClickListener { listener?.onClearFormattingClick() }
264
- }
265
- "indent" -> {
266
- button.text = "→⊢"
267
- button.textSize = 12f
268
- button.setOnClickListener { listener?.onIndentClick() }
269
- }
270
- "outdent" -> {
271
- button.text = "⊣←"
272
- button.textSize = 12f
273
- button.setOnClickListener { listener?.onOutdentClick() }
274
- }
275
- "alignLeft" -> {
276
- button.text = "≡"
277
- button.textSize = 18f
278
- button.gravity = Gravity.START or Gravity.CENTER_VERTICAL
279
- button.setOnClickListener { listener?.onAlignLeftClick() }
280
- }
281
- "alignCenter" -> {
282
- button.text = "≡"
283
- button.textSize = 18f
284
- button.gravity = Gravity.CENTER
285
- button.setOnClickListener { listener?.onAlignCenterClick() }
286
- }
287
- "alignRight" -> {
288
- button.text = "≡"
289
- button.textSize = 18f
290
- button.gravity = Gravity.END or Gravity.CENTER_VERTICAL
291
- button.setOnClickListener { listener?.onAlignRightClick() }
292
- }
293
- else -> return null
219
+ "bold" -> button.setOnClickListener { listener?.onBoldClick() }
220
+ "italic" -> button.setOnClickListener { listener?.onItalicClick() }
221
+ "underline" -> button.setOnClickListener { listener?.onUnderlineClick() }
222
+ "strikethrough" -> button.setOnClickListener { listener?.onStrikethroughClick() }
223
+ "code" -> button.setOnClickListener { listener?.onCodeClick() }
224
+ "highlight" -> button.setOnClickListener { listener?.onHighlightClick() }
225
+ "heading" -> button.setOnClickListener { listener?.onHeadingClick() }
226
+ "bullet" -> button.setOnClickListener { listener?.onBulletListClick() }
227
+ "numbered" -> button.setOnClickListener { listener?.onNumberedListClick() }
228
+ "quote" -> button.setOnClickListener { listener?.onQuoteClick() }
229
+ "checklist" -> button.setOnClickListener { listener?.onChecklistClick() }
230
+ "link" -> button.setOnClickListener { listener?.onLinkClick() }
231
+ "undo" -> button.setOnClickListener { listener?.onUndoClick() }
232
+ "redo" -> button.setOnClickListener { listener?.onRedoClick() }
233
+ "clearFormatting" -> button.setOnClickListener { listener?.onClearFormattingClick() }
234
+ "indent" -> button.setOnClickListener { listener?.onIndentClick() }
235
+ "outdent" -> button.setOnClickListener { listener?.onOutdentClick() }
236
+ "alignLeft" -> button.setOnClickListener { listener?.onAlignLeftClick() }
237
+ "alignCenter" -> button.setOnClickListener { listener?.onAlignCenterClick() }
238
+ "alignRight" -> button.setOnClickListener { listener?.onAlignRightClick() }
294
239
  }
295
240
 
296
241
  return button
@@ -331,7 +276,10 @@ class FloatingToolbar(context: Context) : LinearLayout(context) {
331
276
 
332
277
  for ((option, button) in buttons) {
333
278
  val isActive = states[option] ?: false
334
- button.setTextColor(if (isActive) activeColor else inactiveColor)
279
+ button.colorFilter = PorterDuffColorFilter(
280
+ if (isActive) activeColor else inactiveColor,
281
+ PorterDuff.Mode.SRC_IN
282
+ )
335
283
  (button.background as? GradientDrawable)?.setColor(
336
284
  if (isActive) Color.parseColor("#40FFFFFF") else Color.TRANSPARENT
337
285
  )
@@ -91,6 +91,7 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
91
91
 
92
92
  setPadding(paddingHorizontal, paddingVertical, paddingHorizontal, paddingVertical)
93
93
  textSize = 16f
94
+ setLineSpacing(0f, 1.3f) // Consistent line height multiplier
94
95
  setTextColor(Color.BLACK)
95
96
  setHintTextColor(Color.parseColor("#9E9E9E"))
96
97
  gravity = Gravity.TOP or Gravity.START
@@ -584,7 +585,7 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
584
585
  private fun sendContentChange() {
585
586
  try {
586
587
  val map = Arguments.createMap()
587
- map.putString("text", text.toString())
588
+ map.putString("text", text?.toString() ?: "")
588
589
  map.putArray("blocks", getBlocksArray())
589
590
  sendEvent("onContentChange", map)
590
591
  } catch (e: Exception) {
@@ -718,7 +719,10 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
718
719
 
719
720
  fun getBlocksArray(): WritableArray {
720
721
  val blocks = Arguments.createArray()
721
- val textContent = text.toString()
722
+ val textContent = text?.toString() ?: ""
723
+ if (textContent.isEmpty()) {
724
+ return blocks
725
+ }
722
726
  val lines = textContent.split("\n")
723
727
  lines.forEach { line ->
724
728
  val block = Arguments.createMap()
@@ -1171,12 +1175,18 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
1171
1175
  }
1172
1176
 
1173
1177
  fun clearFormatting() {
1174
- val start = selectionStart
1175
- val end = selectionEnd
1178
+ // Use saved selection if current selection is empty
1179
+ var start = selectionStart
1180
+ var end = selectionEnd
1181
+
1182
+ if (start >= end && savedSelectionStart < savedSelectionEnd) {
1183
+ start = savedSelectionStart
1184
+ end = savedSelectionEnd
1185
+ }
1186
+
1176
1187
  if (start >= end) return
1177
1188
 
1178
1189
  val spannable = text as? Editable ?: return
1179
- val plainText = spannable.subSequence(start, end).toString()
1180
1190
 
1181
1191
  isInternalChange = true
1182
1192
  // Remove all spans in selection
@@ -1187,6 +1197,7 @@ class RichTextEditorView(context: Context) : androidx.appcompat.widget.AppCompat
1187
1197
  spannable.removeSpan(span)
1188
1198
  }
1189
1199
  }
1200
+ setSelection(start, end)
1190
1201
  isInternalChange = false
1191
1202
  sendContentChange()
1192
1203
  updateToolbarButtonStates()
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:fillColor="#FFFFFF"
8
+ android:pathData="M7,15v2h10v-2H7zM3,21h18v-2H3v2zM3,13h18v-2H3v2zM7,7v2h10V7H7zM3,3v2h18V3H3z"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:fillColor="#FFFFFF"
8
+ android:pathData="M15,15H3v2h12v-2zM15,7H3v2h12V7zM3,13h18v-2H3v2zM3,21h18v-2H3v2zM3,3v2h18V3H3z"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:fillColor="#FFFFFF"
8
+ android:pathData="M3,21h18v-2H3v2zM9,17h12v-2H9v2zM3,13h18v-2H3v2zM9,9h12V7H9v2zM3,3v2h18V3H3z"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
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"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
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"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
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"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
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"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:fillColor="#FFFFFF"
8
+ android:pathData="M5,4v3h5.5v12h3V7H19V4H5z"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
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"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:fillColor="#FFFFFF"
8
+ android:pathData="M3,21h18v-2H3v2zM3,8v8l4,-4 -4,-4zM11,17h10v-2H11v2zM3,3v2h18V3H3zM11,9h10V7H11v2zM11,13h10v-2H11v2z"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:fillColor="#FFFFFF"
8
+ android:pathData="M10,4v3h2.21l-3.42,8H6v3h8v-3h-2.21l3.42,-8H18V4z"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
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"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
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"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
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"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:fillColor="#FFFFFF"
8
+ android:pathData="M11,17h10v-2H11v2zM3,12l4,4V8l-4,4zM3,21h18v-2H3v2zM3,3v2h18V3H3zM11,9h10V7H11v2zM11,13h10v-2H11v2z"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:fillColor="#FFFFFF"
8
+ android:pathData="M6,17h3l2,-4V7H5v6h3zM14,17h3l2,-4V7h-6v6h3z"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
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"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
7
+ android:fillColor="#FFFFFF"
8
+ android:pathData="M10,19h4v-3h-4v3zM5,4v3h5v3h4V7h5V4H5zM3,14h18v-2H3v2z"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
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"/>
9
+ </vector>
@@ -0,0 +1,9 @@
1
+ <vector xmlns:android="http://schemas.android.com/apk/res/android"
2
+ android:width="24dp"
3
+ android:height="24dp"
4
+ android:viewportWidth="24"
5
+ android:viewportHeight="24">
6
+ <path
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"/>
9
+ </vector>