expo-native-sheet-emojis 1.7.0 → 1.8.1

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 (32) hide show
  1. package/README.md +21 -0
  2. package/android/src/main/java/expo/community/modules/emojisheet/EmojiCategoryStrip.kt +7 -0
  3. package/android/src/main/java/expo/community/modules/emojisheet/EmojiGridAdapter.kt +3 -0
  4. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSearchBar.kt +16 -14
  5. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetContentView.kt +4 -0
  6. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetModule.kt +18 -0
  7. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetUIView.kt +67 -0
  8. package/android/src/main/java/expo/community/modules/emojisheet/StickyHeaderDecoration.kt +6 -0
  9. package/ios/EmojiCategoryStrip.swift +6 -0
  10. package/ios/EmojiGridView.swift +15 -2
  11. package/ios/EmojiSearchBar.swift +12 -0
  12. package/ios/EmojiSheetContentView.swift +4 -0
  13. package/ios/EmojiSheetModule.podspec +1 -1
  14. package/ios/EmojiSheetModule.swift +5 -0
  15. package/ios/EmojiSheetUIView.swift +21 -0
  16. package/lib/commonjs/EmojiSheetModule.js +1 -0
  17. package/lib/commonjs/EmojiSheetModule.js.map +1 -1
  18. package/lib/commonjs/EmojiSheetView.js +2 -0
  19. package/lib/commonjs/EmojiSheetView.js.map +1 -1
  20. package/lib/module/EmojiSheetModule.js +1 -0
  21. package/lib/module/EmojiSheetModule.js.map +1 -1
  22. package/lib/module/EmojiSheetView.js +2 -0
  23. package/lib/module/EmojiSheetView.js.map +1 -1
  24. package/lib/typescript/EmojiSheetModule.d.ts.map +1 -1
  25. package/lib/typescript/EmojiSheetModule.types.d.ts +3 -0
  26. package/lib/typescript/EmojiSheetModule.types.d.ts.map +1 -1
  27. package/lib/typescript/EmojiSheetView.d.ts +1 -1
  28. package/lib/typescript/EmojiSheetView.d.ts.map +1 -1
  29. package/package.json +1 -1
  30. package/src/EmojiSheetModule.ts +1 -0
  31. package/src/EmojiSheetModule.types.ts +3 -0
  32. package/src/EmojiSheetView.tsx +2 -0
package/README.md CHANGED
@@ -50,6 +50,7 @@ async function pickEmoji() {
50
50
  const result = await EmojiSheetModule.present({
51
51
  theme: 'dark',
52
52
  categoryBarPosition: 'top',
53
+ layoutDirection: 'auto',
53
54
  });
54
55
 
55
56
  if (!result.cancelled) {
@@ -70,6 +71,7 @@ function MyComponent() {
70
71
  <EmojiSheetView
71
72
  style={{ flex: 1 }}
72
73
  theme="light"
74
+ layoutDirection="auto"
73
75
  onEmojiSelected={(emoji) => console.log(emoji)}
74
76
  columns={7}
75
77
  showSearch={true}
@@ -309,6 +311,7 @@ A declarative React component that renders the emoji picker inline.
309
311
  | onDismiss | `() => void` | -- | Called when the picker is dismissed (View API only, not Embedded view) |
310
312
  | theme | `EmojiSheetTheme \| 'dark' \| 'light' \| 'system'` | `'light'` | Theme configuration |
311
313
  | translations | `EmojiSheetTranslations` | -- | Localized strings |
314
+ | layoutDirection | `'auto' \| 'ltr' \| 'rtl'` | `'auto'` | UI layout direction. `'auto'` follows the device locale; use `'ltr'` or `'rtl'` to force a direction. |
312
315
  | categoryBarPosition | `'top' \| 'bottom'` | `'top'` | Position of the category tab bar |
313
316
  | columns | `number` | `7` | Number of emoji columns in the grid |
314
317
  | emojiSize | `number` | `32` | Size of each emoji cell in points |
@@ -356,6 +359,7 @@ All theme fields with their purpose:
356
359
  | theme | `EmojiSheetTheme \| 'dark' \| 'light' \| 'system'` | `'light'` | Theme configuration |
357
360
  | translations | `EmojiSheetTranslations` | -- | Localized UI strings |
358
361
  | snapPoints | `[number, number]` | `[0.5, 1.0]` | Bottom sheet snap points as screen fractions |
362
+ | layoutDirection | `'auto' \| 'ltr' \| 'rtl'` | `'auto'` | UI layout direction. `'auto'` follows the device locale; use `'ltr'` or `'rtl'` to force a direction. |
359
363
  | categoryBarPosition | `'top' \| 'bottom'` | `'top'` | Position of the category tab bar |
360
364
  | columns | `number` | `7` | Number of columns in the emoji grid |
361
365
  | emojiSize | `number` | `32` | Emoji cell size in points |
@@ -388,6 +392,22 @@ The category bar can be placed at the **top** or **bottom** of the picker.
388
392
 
389
393
  Set via `categoryBarPosition: 'top'` or `categoryBarPosition: 'bottom'` in the options.
390
394
 
395
+ ## Layout Direction
396
+
397
+ The picker supports automatic and forced layout direction:
398
+
399
+ - `auto` (default): Follows the device locale/layout direction
400
+ - `ltr`: Forces a left-to-right layout
401
+ - `rtl`: Forces a right-to-left layout
402
+
403
+ This affects the search bar, category strip, sticky category headers, and overall picker chrome on both iOS and Android.
404
+
405
+ ```typescript
406
+ await EmojiSheetModule.present({
407
+ layoutDirection: 'rtl',
408
+ });
409
+ ```
410
+
391
411
  ## Configuration Props
392
412
 
393
413
  | Prop | Type | Default | Description |
@@ -395,6 +415,7 @@ Set via `categoryBarPosition: 'top'` or `categoryBarPosition: 'bottom'` in the o
395
415
  | theme | `EmojiSheetTheme \| 'dark' \| 'light' \| 'system'` | `'light'` | Visual theme |
396
416
  | translations | `EmojiSheetTranslations` | -- | Localized strings |
397
417
  | snapPoints | `[number, number]` | `[0.5, 1.0]` | Sheet snap points |
418
+ | layoutDirection | `'auto' \| 'ltr' \| 'rtl'` | `'auto'` | UI layout direction |
398
419
  | categoryBarPosition | `'top' \| 'bottom'` | `'top'` | Category bar placement |
399
420
  | columns | `number` | `7` | Grid column count |
400
421
  | emojiSize | `number` | `32` | Cell size (points) |
@@ -81,6 +81,13 @@ class EmojiCategoryStrip(
81
81
  adapter.notifyDataSetChanged()
82
82
  }
83
83
 
84
+ fun applyLayoutDirection(direction: Int) {
85
+ layoutDirection = direction
86
+ recyclerView.layoutDirection = direction
87
+ dividerView.layoutDirection = direction
88
+ recyclerView.adapter?.notifyDataSetChanged()
89
+ }
90
+
84
91
  private inner class CategoryAdapter : RecyclerView.Adapter<CategoryAdapter.VH>() {
85
92
 
86
93
  inner class VH(val container: FrameLayout) : RecyclerView.ViewHolder(container) {
@@ -69,6 +69,9 @@ class EmojiGridAdapter(
69
69
  val tv = TextView(parent.context).apply {
70
70
  setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f)
71
71
  typeface = Typeface.create(Typeface.DEFAULT, Typeface.BOLD)
72
+ gravity = Gravity.START or Gravity.CENTER_VERTICAL
73
+ textAlignment = View.TEXT_ALIGNMENT_VIEW_START
74
+ textDirection = View.TEXT_DIRECTION_LOCALE
72
75
  val pad = (16 * density).toInt()
73
76
  setPadding(pad, pad, pad, (8 * density).toInt())
74
77
  layoutParams = RecyclerView.LayoutParams(
@@ -60,7 +60,22 @@ class EmojiSearchBar(
60
60
  }
61
61
  addView(searchIcon)
62
62
 
63
- // Clear button (X) — hidden until text is entered
63
+ editText = EditText(context).apply {
64
+ setBackgroundColor(0x00000000)
65
+ hint = "Search emoji"
66
+ setSingleLine(true)
67
+ textDirection = View.TEXT_DIRECTION_LOCALE
68
+ textAlignment = View.TEXT_ALIGNMENT_VIEW_START
69
+ imeOptions = EditorInfo.IME_ACTION_SEARCH
70
+ setTextSize(TypedValue.COMPLEX_UNIT_SP, 15f)
71
+ setPadding((4 * density).toInt(), 0, clearSize + clearMarginEnd, 0)
72
+ val etLp = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
73
+ etLp.marginStart = iconWidth
74
+ layoutParams = etLp
75
+ }
76
+ addView(editText)
77
+
78
+ // Add the clear button after the EditText so it stays on top and wins taps.
64
79
  clearButton = TextView(context).apply {
65
80
  text = "\u2715"
66
81
  setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f)
@@ -81,19 +96,6 @@ class EmojiSearchBar(
81
96
  }
82
97
  addView(clearButton)
83
98
 
84
- editText = EditText(context).apply {
85
- setBackgroundColor(0x00000000)
86
- hint = "Search emoji"
87
- setSingleLine(true)
88
- imeOptions = EditorInfo.IME_ACTION_SEARCH
89
- setTextSize(TypedValue.COMPLEX_UNIT_SP, 15f)
90
- setPadding((4 * density).toInt(), 0, clearSize + clearMarginEnd, 0)
91
- val etLp = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
92
- etLp.marginStart = iconWidth
93
- layoutParams = etLp
94
- }
95
- addView(editText)
96
-
97
99
  editText.setOnFocusChangeListener { _, hasFocus ->
98
100
  onFocusChanged?.invoke(hasFocus)
99
101
  }
@@ -38,6 +38,10 @@ class EmojiSheetContentView(
38
38
  pickerView.applyConfiguration()
39
39
  }
40
40
 
41
+ fun updateLayoutDirection(direction: String) {
42
+ pickerView.layoutDirectionProp = direction
43
+ }
44
+
41
45
  fun updateColumns(columns: Int) {
42
46
  pickerView.columns = columns
43
47
  pickerView.applyConfiguration()
@@ -76,6 +76,9 @@ class EmojiSheetModule : Module() {
76
76
  Prop("categoryBarPosition") { view: EmojiSheetContentView, position: String? ->
77
77
  view.updateCategoryBarPosition(position ?: "top")
78
78
  }
79
+ Prop("layoutDirection") { view: EmojiSheetContentView, direction: String? ->
80
+ view.updateLayoutDirection(direction ?: "auto")
81
+ }
79
82
  Prop("columns") { view: EmojiSheetContentView, columns: Int? ->
80
83
  view.updateColumns(columns ?: 7)
81
84
  }
@@ -143,6 +146,7 @@ class EmojiSheetModule : Module() {
143
146
  val gestureEnabled = options["gestureEnabled"] as? Boolean ?: true
144
147
  val backdropOpacity = (options["backdropOpacity"] as? Number)?.toFloat() ?: if (isDark) 0.4f else 0.22f
145
148
  val categoryBarPosition = options["categoryBarPosition"] as? String ?: "top"
149
+ val layoutDirection = options["layoutDirection"] as? String ?: "auto"
146
150
  @Suppress("UNCHECKED_CAST")
147
151
  val categoryNames = options["categoryNames"] as? Map<String, String>
148
152
  @Suppress("UNCHECKED_CAST")
@@ -202,6 +206,7 @@ class EmojiSheetModule : Module() {
202
206
  pickerView.enableAnimations = enableAnimations
203
207
  pickerView.recentLimit = recentLimit
204
208
  pickerView.categoryBarPosition = categoryBarPosition
209
+ pickerView.layoutDirectionProp = layoutDirection
205
210
  pickerView.categoryNames = categoryNames
206
211
  pickerView.excludeEmojis = excludeEmojis
207
212
  (options["searchPlaceholder"] as? String)?.let { pickerView.searchPlaceholder = it }
@@ -221,6 +226,7 @@ class EmojiSheetModule : Module() {
221
226
  }
222
227
  pickerView.onSearchFocused = { hasFocus ->
223
228
  if (hasFocus) {
229
+ pickerView.setSheetExpansionInProgress(true)
224
230
  bottomSheet.behavior.state = BottomSheetBehavior.STATE_EXPANDED
225
231
  } else {
226
232
  bottomSheet.behavior.state = BottomSheetBehavior.STATE_HALF_EXPANDED
@@ -228,6 +234,7 @@ class EmojiSheetModule : Module() {
228
234
  }
229
235
  pickerView.onScrollIntentUp = {
230
236
  if (bottomSheet.behavior.state != BottomSheetBehavior.STATE_EXPANDED) {
237
+ pickerView.setSheetExpansionInProgress(true)
231
238
  bottomSheet.behavior.state = BottomSheetBehavior.STATE_EXPANDED
232
239
  }
233
240
  }
@@ -316,6 +323,17 @@ class EmojiSheetModule : Module() {
316
323
  skipCollapsed = false
317
324
  isFitToContents = false
318
325
  isDraggable = gestureEnabled
326
+ addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
327
+ override fun onStateChanged(bottomSheet: View, newState: Int) {
328
+ pickerView.setSheetExpanded(newState == BottomSheetBehavior.STATE_EXPANDED)
329
+ pickerView.setSheetExpansionInProgress(
330
+ newState == BottomSheetBehavior.STATE_DRAGGING ||
331
+ newState == BottomSheetBehavior.STATE_SETTLING
332
+ )
333
+ }
334
+
335
+ override fun onSlide(bottomSheet: View, slideOffset: Float) = Unit
336
+ })
319
337
  }
320
338
 
321
339
  bottomSheet.setOnDismissListener {
@@ -83,6 +83,11 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
83
83
  var enableAnimations: Boolean = false
84
84
  var recentLimit: Int = 30
85
85
  var categoryBarPosition: String = "top"
86
+ var layoutDirectionProp: String = "auto"
87
+ set(value) {
88
+ field = value
89
+ applyLayoutDirection()
90
+ }
86
91
  var categoryNames: Map<String, String>? = null
87
92
  @Volatile
88
93
  var excludeEmojis: Set<String> = emptySet()
@@ -109,6 +114,8 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
109
114
  private var initialTouchY = 0f
110
115
  private var lastTopPullDragDistance = 0f
111
116
  private var isHandlingTopPullDrag = false
117
+ private var isSheetExpanded = false
118
+ private var isSheetExpansionInProgress = false
112
119
  private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop.toFloat()
113
120
  private var velocityTracker: VelocityTracker? = null
114
121
  private var topPullStartY: Float? = null
@@ -176,6 +183,10 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
176
183
  lastTopPullDragDistance = 0f
177
184
  isHandlingTopPullDrag = false
178
185
  topPullStartY = null
186
+ if (isSheetExpansionInProgress) {
187
+ rv.stopScroll()
188
+ return true
189
+ }
179
190
  }
180
191
  android.view.MotionEvent.ACTION_UP,
181
192
  android.view.MotionEvent.ACTION_CANCEL -> {
@@ -190,12 +201,28 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
190
201
  topPullStartY = null
191
202
  velocityTracker?.recycle()
192
203
  velocityTracker = null
204
+ if (isSheetExpansionInProgress) {
205
+ rv.stopScroll()
206
+ return true
207
+ }
193
208
  }
194
209
  }
195
210
 
196
211
  if (e.actionMasked == android.view.MotionEvent.ACTION_MOVE) {
212
+ if (isSheetExpansionInProgress) {
213
+ rv.stopScroll()
214
+ return true
215
+ }
216
+
197
217
  val deltaY = e.y - initialTouchY
198
218
  val isAtTop = !rv.canScrollVertically(-1)
219
+ if (!isSheetExpanded && deltaY < -touchSlop && !didTriggerExpandForCurrentDrag) {
220
+ didTriggerExpandForCurrentDrag = true
221
+ isSheetExpansionInProgress = true
222
+ rv.stopScroll()
223
+ onScrollIntentUp?.invoke()
224
+ return true
225
+ }
199
226
  if (isHandlingTopPullDrag) {
200
227
  rv.parent?.requestDisallowInterceptTouchEvent(true)
201
228
  rv.stopScroll()
@@ -235,6 +262,11 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
235
262
  }
236
263
 
237
264
  override fun onScrolled(rv: RecyclerView, dx: Int, dy: Int) {
265
+ if (!isSheetExpanded) {
266
+ rv.stopScroll()
267
+ return
268
+ }
269
+
238
270
  if (dy > 0 && rv.scrollState != RecyclerView.SCROLL_STATE_IDLE && !didTriggerExpandForCurrentDrag) {
239
271
  didTriggerExpandForCurrentDrag = true
240
272
  onScrollIntentUp?.invoke()
@@ -277,6 +309,21 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
277
309
  addView(contentFrame)
278
310
 
279
311
  applyTheme(currentTheme)
312
+ applyLayoutDirection()
313
+ }
314
+
315
+ fun setSheetExpanded(expanded: Boolean) {
316
+ isSheetExpanded = expanded
317
+ if (expanded) {
318
+ isSheetExpansionInProgress = false
319
+ }
320
+ }
321
+
322
+ fun setSheetExpansionInProgress(inProgress: Boolean) {
323
+ isSheetExpansionInProgress = inProgress
324
+ if (inProgress) {
325
+ recyclerView.stopScroll()
326
+ }
280
327
  }
281
328
 
282
329
  /** Call after setting configurable properties but before loadDataAsync to apply layout changes. */
@@ -415,9 +462,27 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
415
462
  gridAdapter.updateTheme(theme)
416
463
  recyclerView.setBackgroundColor(theme.backgroundColor)
417
464
  stickyHeaderDecoration.backgroundColor = theme.backgroundColor
465
+ stickyHeaderDecoration.invalidateCache()
418
466
  emptyStateLabel.setTextColor(theme.textSecondaryColor)
419
467
  }
420
468
 
469
+ private fun applyLayoutDirection() {
470
+ val dir = when (layoutDirectionProp) {
471
+ "rtl" -> View.LAYOUT_DIRECTION_RTL
472
+ "ltr" -> View.LAYOUT_DIRECTION_LTR
473
+ else -> View.LAYOUT_DIRECTION_LOCALE
474
+ }
475
+
476
+ layoutDirection = dir
477
+ searchBar.layoutDirection = dir
478
+ categoryStrip.applyLayoutDirection(dir)
479
+ recyclerView.layoutDirection = dir
480
+ contentFrame.layoutDirection = dir
481
+ stickyHeaderDecoration.invalidateCache()
482
+ recyclerView.invalidateItemDecorations()
483
+ requestLayout()
484
+ }
485
+
421
486
  private fun buildCategoryKeys(): List<String> {
422
487
  val keys = mutableListOf<String>()
423
488
  if (showRecents && getFrequentlyUsed().isNotEmpty()) {
@@ -477,6 +542,7 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
477
542
  }
478
543
 
479
544
  gridAdapter.setItems(items, sectionPositions)
545
+ stickyHeaderDecoration.invalidateCache()
480
546
 
481
547
  // Rebuild category keys in case frequently_used changed
482
548
  val newKeys = buildCategoryKeys()
@@ -504,6 +570,7 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
504
570
  addView(categoryStrip, index)
505
571
  }
506
572
  categoryStrip.applyTheme(currentTheme)
573
+ applyLayoutDirection()
507
574
  }
508
575
 
509
576
  private fun resolveSkinTone(baseEmoji: String, emojiId: String, toneEnabled: Boolean): String {
@@ -3,6 +3,7 @@ package expo.community.modules.emojisheet
3
3
  import android.graphics.Canvas
4
4
  import android.view.View
5
5
  import android.view.ViewGroup
6
+ import android.widget.TextView
6
7
  import androidx.recyclerview.widget.RecyclerView
7
8
 
8
9
  class StickyHeaderDecoration(
@@ -50,6 +51,11 @@ class StickyHeaderDecoration(
50
51
  val holder = adapter.createViewHolder(parent, EmojiGridAdapter.VIEW_TYPE_HEADER)
51
52
  adapter.bindViewHolder(holder, position)
52
53
  val view = holder.itemView
54
+ view.layoutDirection = parent.layoutDirection
55
+ if (view is TextView) {
56
+ view.textAlignment = View.TEXT_ALIGNMENT_VIEW_START
57
+ view.textDirection = View.TEXT_DIRECTION_LOCALE
58
+ }
53
59
  if (backgroundColor != 0) {
54
60
  view.setBackgroundColor(backgroundColor)
55
61
  }
@@ -82,6 +82,12 @@ class EmojiCategoryStrip: UIView, UICollectionViewDataSource, UICollectionViewDe
82
82
  collectionView.reloadData()
83
83
  }
84
84
 
85
+ func applyLayoutDirection(_ attribute: UISemanticContentAttribute) {
86
+ semanticContentAttribute = attribute
87
+ collectionView.semanticContentAttribute = attribute
88
+ collectionView.collectionViewLayout.invalidateLayout()
89
+ }
90
+
85
91
  func selectCategory(at index: Int) {
86
92
  guard !isSearchActive, index != selectedIndex, index >= 0, index < categoryKeys.count else { return }
87
93
  selectedIndex = index
@@ -28,6 +28,7 @@ class EmojiGridView: UIView, UICollectionViewDataSource, UICollectionViewDelegat
28
28
  private var sections: [EmojiSection] = []
29
29
  private var categoryNames: [String: String] = [:]
30
30
  private var currentTheme: EmojiSheetTheme = .light
31
+ private var headerTextAlignment: NSTextAlignment = .left
31
32
  private var collectionView: UICollectionView!
32
33
  private var skinTonePicker: EmojiSkinTonePicker?
33
34
  private var isScrollingProgrammatically = false
@@ -128,6 +129,16 @@ class EmojiGridView: UIView, UICollectionViewDataSource, UICollectionViewDelegat
128
129
  collectionView.reloadData()
129
130
  }
130
131
 
132
+ func applyLayoutDirection(_ attribute: UISemanticContentAttribute) {
133
+ semanticContentAttribute = attribute
134
+ collectionView.semanticContentAttribute = attribute
135
+ headerTextAlignment = UIView.userInterfaceLayoutDirection(for: attribute) == .rightToLeft
136
+ ? .right
137
+ : .left
138
+ collectionView.collectionViewLayout.invalidateLayout()
139
+ collectionView.reloadData()
140
+ }
141
+
131
142
  private func indicatorStyle(for theme: EmojiSheetTheme) -> UIScrollView.IndicatorStyle {
132
143
  let backgroundBrightness = theme.backgroundColor.resolvedColor(with: traitCollection).perceivedBrightness
133
144
  return backgroundBrightness < 0.5 ? .white : .black
@@ -227,7 +238,7 @@ class EmojiGridView: UIView, UICollectionViewDataSource, UICollectionViewDelegat
227
238
  ) as! SectionHeaderView
228
239
  let title = sections[indexPath.section].title
229
240
  let displayName = categoryNames[title] ?? title.replacingOccurrences(of: "_", with: " ").capitalized
230
- header.configure(title: displayName, theme: currentTheme)
241
+ header.configure(title: displayName, theme: currentTheme, textAlignment: headerTextAlignment)
231
242
  header.isAccessibilityElement = true
232
243
  header.accessibilityLabel = displayName
233
244
  return header
@@ -491,6 +502,7 @@ private class SectionHeaderView: UICollectionReusableView {
491
502
  super.init(frame: frame)
492
503
  titleLabel.translatesAutoresizingMaskIntoConstraints = false
493
504
  titleLabel.font = .systemFont(ofSize: 14, weight: .bold)
505
+ titleLabel.textAlignment = .natural
494
506
  addSubview(titleLabel)
495
507
  NSLayoutConstraint.activate([
496
508
  titleLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 4),
@@ -503,8 +515,9 @@ private class SectionHeaderView: UICollectionReusableView {
503
515
  fatalError("init(coder:) has not been implemented")
504
516
  }
505
517
 
506
- func configure(title: String, theme: EmojiSheetTheme) {
518
+ func configure(title: String, theme: EmojiSheetTheme, textAlignment: NSTextAlignment) {
507
519
  titleLabel.text = title
520
+ titleLabel.textAlignment = textAlignment
508
521
  titleLabel.textColor = theme.textSecondaryColor
509
522
  backgroundColor = theme.backgroundColor
510
523
  }
@@ -41,6 +41,7 @@ class EmojiSearchBar: UIView, UITextFieldDelegate {
41
41
  textField.placeholder = "Search emoji"
42
42
  textField.borderStyle = .none
43
43
  textField.font = .systemFont(ofSize: 16)
44
+ textField.textAlignment = .natural
44
45
  textField.returnKeyType = .search
45
46
  textField.autocorrectionType = .no
46
47
  textField.autocapitalizationType = .none
@@ -96,6 +97,17 @@ class EmojiSearchBar: UIView, UITextFieldDelegate {
96
97
  textField.tintColor = theme.selectionColor
97
98
  }
98
99
 
100
+ func applyLayoutDirection(_ attribute: UISemanticContentAttribute) {
101
+ semanticContentAttribute = attribute
102
+ containerView.semanticContentAttribute = attribute
103
+ iconView.semanticContentAttribute = attribute
104
+ textField.semanticContentAttribute = attribute
105
+ clearButton.semanticContentAttribute = attribute
106
+ textField.textAlignment = UIView.userInterfaceLayoutDirection(for: attribute) == .rightToLeft
107
+ ? .right
108
+ : .left
109
+ }
110
+
99
111
  @objc private func textFieldDidChange() {
100
112
  updateClearButtonVisibility()
101
113
  debounceTimer?.invalidate()
@@ -50,6 +50,10 @@ class EmojiSheetContentView: ExpoView, EmojiSheetUIViewDelegate {
50
50
  pickerView.categoryBarPosition = position
51
51
  }
52
52
 
53
+ func updateLayoutDirection(_ direction: String) {
54
+ pickerView.layoutDirection = direction
55
+ }
56
+
53
57
  func updateColumns(_ columns: Int) {
54
58
  pickerView.columns = columns
55
59
  }
@@ -1,6 +1,6 @@
1
1
  Pod::Spec.new do |s|
2
2
  s.name = 'EmojiSheetModule'
3
- s.version = '1.7.0'
3
+ s.version = '1.8.1'
4
4
  s.summary = 'Native emoji picker bottom sheet for React Native'
5
5
  s.description = 'A fully native iOS/Android emoji picker presented in a bottom sheet with search, skin tones, and theming support.'
6
6
  s.author = ''
@@ -48,6 +48,9 @@ public class EmojiSheetModule: Module {
48
48
  Prop("categoryBarPosition") { (view, position: String?) in
49
49
  view.updateCategoryBarPosition(position ?? "top")
50
50
  }
51
+ Prop("layoutDirection") { (view, direction: String?) in
52
+ view.updateLayoutDirection(direction ?? "auto")
53
+ }
51
54
  Prop("columns") { (view, columns: Int?) in
52
55
  view.updateColumns(columns ?? 7)
53
56
  }
@@ -123,6 +126,7 @@ public class EmojiSheetModule: Module {
123
126
  let gestureEnabled = (options["gestureEnabled"] as? Bool) ?? true
124
127
  let backdropOpacity = options["backdropOpacity"] as? Double ?? (isDark ? 0.4 : 0.22)
125
128
  let categoryBarPosition = (options["categoryBarPosition"] as? String) ?? "top"
129
+ let layoutDirection = (options["layoutDirection"] as? String) ?? "auto"
126
130
  let categoryNames = options["categoryNames"] as? [String: String]
127
131
  let excludeEmojis = Set((options["excludeEmojis"] as? [String]) ?? [])
128
132
 
@@ -187,6 +191,7 @@ public class EmojiSheetModule: Module {
187
191
  pickerView.enableAnimations = enableAnimations
188
192
  pickerView.recentLimit = recentLimit
189
193
  pickerView.categoryBarPosition = categoryBarPosition
194
+ pickerView.layoutDirection = layoutDirection
190
195
  pickerView.categoryNames = categoryNames
191
196
  pickerView.excludeEmojis = excludeEmojis
192
197
  pickerView.applyCustomTheme(customTheme)
@@ -68,6 +68,9 @@ class EmojiSheetUIView: UIView,
68
68
  var categoryBarPosition: String = "top" {
69
69
  didSet { if categoryBarPosition != oldValue { configureLayout() } }
70
70
  }
71
+ var layoutDirection: String = "auto" {
72
+ didSet { applyLayoutDirection() }
73
+ }
71
74
  var categoryNames: [String: String]?
72
75
  var excludeEmojis: Set<String> = []
73
76
 
@@ -150,6 +153,24 @@ class EmojiSheetUIView: UIView,
150
153
  gridView.delegate = self
151
154
 
152
155
  configureLayout()
156
+ applyLayoutDirection()
157
+ }
158
+
159
+ private func applyLayoutDirection() {
160
+ let attribute: UISemanticContentAttribute
161
+ switch layoutDirection {
162
+ case "rtl":
163
+ attribute = .forceRightToLeft
164
+ case "ltr":
165
+ attribute = .forceLeftToRight
166
+ default:
167
+ attribute = .unspecified
168
+ }
169
+
170
+ semanticContentAttribute = attribute
171
+ searchBar.applyLayoutDirection(attribute)
172
+ categoryStrip.applyLayoutDirection(attribute)
173
+ gridView.applyLayoutDirection(attribute)
153
174
  }
154
175
 
155
176
  private func configureLayout() {
@@ -40,6 +40,7 @@ function flattenOptions(options) {
40
40
  }
41
41
 
42
42
  // Layout & behavior
43
+ if (options.layoutDirection) flat.layoutDirection = options.layoutDirection;
43
44
  if (options.snapPoints) flat.snapPoints = options.snapPoints;
44
45
  if (options.categoryBarPosition) flat.categoryBarPosition = options.categoryBarPosition;
45
46
  if (options.columns != null) flat.columns = options.columns;
@@ -1 +1 @@
1
- {"version":3,"names":["_expo","require","flattenOptions","options","flat","theme","backgroundColor","searchBarBackgroundColor","textColor","textSecondaryColor","accentColor","dividerColor","searchTextColor","placeholderTextColor","selectionColor","categoryIconColor","categoryActiveIconColor","categoryActiveBackgroundColor","handleColor","categoryBarBackgroundColor","translations","searchPlaceholder","noResultsText","categoryNames","snapPoints","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","gestureEnabled","backdropOpacity","excludeEmojis","NativeEmojiSheet","requireNativeModule","_default","exports","default","present","dismiss","clearRecents","clearSkinTonePreferences"],"sourceRoot":"../../src","sources":["EmojiSheetModule.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_expo","require","flattenOptions","options","flat","theme","backgroundColor","searchBarBackgroundColor","textColor","textSecondaryColor","accentColor","dividerColor","searchTextColor","placeholderTextColor","selectionColor","categoryIconColor","categoryActiveIconColor","categoryActiveBackgroundColor","handleColor","categoryBarBackgroundColor","translations","searchPlaceholder","noResultsText","categoryNames","layoutDirection","snapPoints","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","gestureEnabled","backdropOpacity","excludeEmojis","NativeEmojiSheet","requireNativeModule","_default","exports","default","present","dismiss","clearRecents","clearSkinTonePreferences"],"sourceRoot":"../../src","sources":["EmojiSheetModule.ts"],"mappings":"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","ignoreList":[]}
@@ -12,6 +12,7 @@ function EmojiSheetView({
12
12
  onDismiss,
13
13
  theme,
14
14
  translations,
15
+ layoutDirection,
15
16
  categoryBarPosition,
16
17
  columns,
17
18
  emojiSize,
@@ -33,6 +34,7 @@ function EmojiSheetView({
33
34
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(NativeView, {
34
35
  ...rest,
35
36
  theme: resolvedTheme,
37
+ layoutDirection: layoutDirection,
36
38
  categoryBarPosition: categoryBarPosition,
37
39
  columns: columns,
38
40
  emojiSize: emojiSize,
@@ -1 +1 @@
1
- {"version":3,"names":["_expo","require","_jsxRuntime","NativeView","requireNativeView","EmojiSheetView","onEmojiSelected","onDismiss","theme","translations","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","excludeEmojis","rest","resolvedTheme","jsx","searchPlaceholder","noResultsText","categoryNames","nativeEvent","emoji","undefined"],"sourceRoot":"../../src","sources":["EmojiSheetView.tsx"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAAyC,IAAAC,WAAA,GAAAD,OAAA;AAOzC,MAAME,UAA0D,GAC9D,IAAAC,uBAAiB,EAAC,YAAY,CAAC;AAElB,SAASC,cAAcA,CAAC;EACrCC,eAAe;EACfC,SAAS;EACTC,KAAK;EACLC,YAAY;EACZC,mBAAmB;EACnBC,OAAO;EACPC,SAAS;EACTC,WAAW;EACXC,UAAU;EACVC,WAAW;EACXC,eAAe;EACfC,aAAa;EACbC,gBAAgB;EAChBC,aAAa;EACb,GAAGC;AACgB,CAAC,EAAE;EACtB,MAAMC,aAAa,GAAG,OAAOb,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAGA,KAAK;;EAElE;EACA;EACA;;EAEA,oBACE,IAAAN,WAAA,CAAAoB,GAAA,EAACnB,UAAU;IAAA,GACLiB,IAAI;IACRZ,KAAK,EAAEa,aAAc;IACrBX,mBAAmB,EAAEA,mBAAoB;IACzCC,OAAO,EAAEA,OAAQ;IACjBC,SAAS,EAAEA,SAAU;IACrBC,WAAW,EAAEA,WAAY;IACzBC,UAAU,EAAEA,UAAW;IACvBC,WAAW,EAAEA,WAAY;IACzBC,eAAe,EAAEA,eAAgB;IACjCC,aAAa,EAAEA,aAAc;IAC7BC,gBAAgB,EAAEA,gBAAiB;IACnCC,aAAa,EAAEA,aAAc;IAC7BI,iBAAiB,EAAEd,YAAY,EAAEc,iBAAkB;IACnDC,aAAa,EAAEf,YAAY,EAAEe,aAAc;IAC3CC,aAAa,EAAEhB,YAAY,EAAEgB,aAAc;IAC3CnB,eAAe,EAAEA,CAAC;MAAEoB;IAAY,CAAC,KAAK;MACpCpB,eAAe,CAACoB,WAAW,CAACC,KAAK,CAAC;IACpC,CAAE;IACFpB,SAAS,EAAEA,SAAS,GAAG,MAAMA,SAAS,CAAC,CAAC,GAAGqB;EAAU,CACtD,CAAC;AAEN","ignoreList":[]}
1
+ {"version":3,"names":["_expo","require","_jsxRuntime","NativeView","requireNativeView","EmojiSheetView","onEmojiSelected","onDismiss","theme","translations","layoutDirection","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","excludeEmojis","rest","resolvedTheme","jsx","searchPlaceholder","noResultsText","categoryNames","nativeEvent","emoji","undefined"],"sourceRoot":"../../src","sources":["EmojiSheetView.tsx"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAAyC,IAAAC,WAAA,GAAAD,OAAA;AAOzC,MAAME,UAA0D,GAC9D,IAAAC,uBAAiB,EAAC,YAAY,CAAC;AAElB,SAASC,cAAcA,CAAC;EACrCC,eAAe;EACfC,SAAS;EACTC,KAAK;EACLC,YAAY;EACZC,eAAe;EACfC,mBAAmB;EACnBC,OAAO;EACPC,SAAS;EACTC,WAAW;EACXC,UAAU;EACVC,WAAW;EACXC,eAAe;EACfC,aAAa;EACbC,gBAAgB;EAChBC,aAAa;EACb,GAAGC;AACgB,CAAC,EAAE;EACtB,MAAMC,aAAa,GAAG,OAAOd,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAGA,KAAK;;EAElE;EACA;EACA;;EAEA,oBACE,IAAAN,WAAA,CAAAqB,GAAA,EAACpB,UAAU;IAAA,GACLkB,IAAI;IACRb,KAAK,EAAEc,aAAc;IACrBZ,eAAe,EAAEA,eAAgB;IACjCC,mBAAmB,EAAEA,mBAAoB;IACzCC,OAAO,EAAEA,OAAQ;IACjBC,SAAS,EAAEA,SAAU;IACrBC,WAAW,EAAEA,WAAY;IACzBC,UAAU,EAAEA,UAAW;IACvBC,WAAW,EAAEA,WAAY;IACzBC,eAAe,EAAEA,eAAgB;IACjCC,aAAa,EAAEA,aAAc;IAC7BC,gBAAgB,EAAEA,gBAAiB;IACnCC,aAAa,EAAEA,aAAc;IAC7BI,iBAAiB,EAAEf,YAAY,EAAEe,iBAAkB;IACnDC,aAAa,EAAEhB,YAAY,EAAEgB,aAAc;IAC3CC,aAAa,EAAEjB,YAAY,EAAEiB,aAAc;IAC3CpB,eAAe,EAAEA,CAAC;MAAEqB;IAAY,CAAC,KAAK;MACpCrB,eAAe,CAACqB,WAAW,CAACC,KAAK,CAAC;IACpC,CAAE;IACFrB,SAAS,EAAEA,SAAS,GAAG,MAAMA,SAAS,CAAC,CAAC,GAAGsB;EAAU,CACtD,CAAC;AAEN","ignoreList":[]}
@@ -36,6 +36,7 @@ function flattenOptions(options) {
36
36
  }
37
37
 
38
38
  // Layout & behavior
39
+ if (options.layoutDirection) flat.layoutDirection = options.layoutDirection;
39
40
  if (options.snapPoints) flat.snapPoints = options.snapPoints;
40
41
  if (options.categoryBarPosition) flat.categoryBarPosition = options.categoryBarPosition;
41
42
  if (options.columns != null) flat.columns = options.columns;
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModule","requireNativeModule","flattenOptions","options","flat","theme","backgroundColor","searchBarBackgroundColor","textColor","textSecondaryColor","accentColor","dividerColor","searchTextColor","placeholderTextColor","selectionColor","categoryIconColor","categoryActiveIconColor","categoryActiveBackgroundColor","handleColor","categoryBarBackgroundColor","translations","searchPlaceholder","noResultsText","categoryNames","snapPoints","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","gestureEnabled","backdropOpacity","excludeEmojis","NativeEmojiSheet","present","dismiss","clearRecents","clearSkinTonePreferences"],"sourceRoot":"../../src","sources":["EmojiSheetModule.ts"],"mappings":";;AAAA,SAASA,YAAY,EAAEC,mBAAmB,QAAQ,MAAM;AAKxD,SAASC,cAAcA,CAACC,OAAiC,EAAiB;EACxE,MAAMC,IAAmB,GAAG,CAAC,CAAC;;EAE9B;EACA,IAAID,OAAO,CAACE,KAAK,EAAE;IACjB,IAAI,OAAOF,OAAO,CAACE,KAAK,KAAK,QAAQ,EAAE;MACrCD,IAAI,CAACC,KAAK,GAAGF,OAAO,CAACE,KAAK;IAC5B,CAAC,MAAM;MACL,MAAMA,KAAK,GAAGF,OAAO,CAACE,KAAwB;MAC9CD,IAAI,CAACC,KAAK,GAAG,QAAQ;MACrBD,IAAI,CAACE,eAAe,GAAGD,KAAK,CAACC,eAAe;MAC5CF,IAAI,CAACG,wBAAwB,GAAGF,KAAK,CAACE,wBAAwB;MAC9DH,IAAI,CAACI,SAAS,GAAGH,KAAK,CAACG,SAAS;MAChCJ,IAAI,CAACK,kBAAkB,GAAGJ,KAAK,CAACI,kBAAkB;MAClDL,IAAI,CAACM,WAAW,GAAGL,KAAK,CAACK,WAAW;MACpCN,IAAI,CAACO,YAAY,GAAGN,KAAK,CAACM,YAAY;MACtC,IAAIN,KAAK,CAACO,eAAe,EAAER,IAAI,CAACQ,eAAe,GAAGP,KAAK,CAACO,eAAe;MACvE,IAAIP,KAAK,CAACQ,oBAAoB,EAAET,IAAI,CAACS,oBAAoB,GAAGR,KAAK,CAACQ,oBAAoB;MACtF,IAAIR,KAAK,CAACS,cAAc,EAAEV,IAAI,CAACU,cAAc,GAAGT,KAAK,CAACS,cAAc;MACpE,IAAIT,KAAK,CAACU,iBAAiB,EAAEX,IAAI,CAACW,iBAAiB,GAAGV,KAAK,CAACU,iBAAiB;MAC7E,IAAIV,KAAK,CAACW,uBAAuB,EAAEZ,IAAI,CAACY,uBAAuB,GAAGX,KAAK,CAACW,uBAAuB;MAC/F,IAAIX,KAAK,CAACY,6BAA6B,EAAEb,IAAI,CAACa,6BAA6B,GAAGZ,KAAK,CAACY,6BAA6B;MACjH,IAAIZ,KAAK,CAACa,WAAW,EAAEd,IAAI,CAACc,WAAW,GAAGb,KAAK,CAACa,WAAW;MAC3D,IAAIb,KAAK,CAACc,0BAA0B,EAAEf,IAAI,CAACe,0BAA0B,GAAGd,KAAK,CAACc,0BAA0B;IAC1G;EACF;;EAEA;EACA,IAAIhB,OAAO,CAACiB,YAAY,EAAE;IACxB,IAAIjB,OAAO,CAACiB,YAAY,CAACC,iBAAiB,EAAEjB,IAAI,CAACiB,iBAAiB,GAAGlB,OAAO,CAACiB,YAAY,CAACC,iBAAiB;IAC3G,IAAIlB,OAAO,CAACiB,YAAY,CAACE,aAAa,EAAElB,IAAI,CAACkB,aAAa,GAAGnB,OAAO,CAACiB,YAAY,CAACE,aAAa;IAC/F,IAAInB,OAAO,CAACiB,YAAY,CAACG,aAAa,EAAEnB,IAAI,CAACmB,aAAa,GAAGpB,OAAO,CAACiB,YAAY,CAACG,aAAa;EACjG;;EAEA;EACA,IAAIpB,OAAO,CAACqB,UAAU,EAAEpB,IAAI,CAACoB,UAAU,GAAGrB,OAAO,CAACqB,UAAU;EAC5D,IAAIrB,OAAO,CAACsB,mBAAmB,EAAErB,IAAI,CAACqB,mBAAmB,GAAGtB,OAAO,CAACsB,mBAAmB;EACvF,IAAItB,OAAO,CAACuB,OAAO,IAAI,IAAI,EAAEtB,IAAI,CAACsB,OAAO,GAAGvB,OAAO,CAACuB,OAAO;EAC3D,IAAIvB,OAAO,CAACwB,SAAS,IAAI,IAAI,EAAEvB,IAAI,CAACuB,SAAS,GAAGxB,OAAO,CAACwB,SAAS;EACjE,IAAIxB,OAAO,CAACyB,WAAW,IAAI,IAAI,EAAExB,IAAI,CAACwB,WAAW,GAAGzB,OAAO,CAACyB,WAAW;EACvE,IAAIzB,OAAO,CAAC0B,UAAU,IAAI,IAAI,EAAEzB,IAAI,CAACyB,UAAU,GAAG1B,OAAO,CAAC0B,UAAU;EACpE,IAAI1B,OAAO,CAAC2B,WAAW,IAAI,IAAI,EAAE1B,IAAI,CAAC0B,WAAW,GAAG3B,OAAO,CAAC2B,WAAW;EACvE,IAAI3B,OAAO,CAAC4B,eAAe,IAAI,IAAI,EAAE3B,IAAI,CAAC2B,eAAe,GAAG5B,OAAO,CAAC4B,eAAe;EACnF,IAAI5B,OAAO,CAAC6B,aAAa,IAAI,IAAI,EAAE5B,IAAI,CAAC4B,aAAa,GAAG7B,OAAO,CAAC6B,aAAa;EAC7E,IAAI7B,OAAO,CAAC8B,gBAAgB,IAAI,IAAI,EAAE7B,IAAI,CAAC6B,gBAAgB,GAAG9B,OAAO,CAAC8B,gBAAgB;EACtF,IAAI9B,OAAO,CAAC+B,cAAc,IAAI,IAAI,EAAE9B,IAAI,CAAC8B,cAAc,GAAG/B,OAAO,CAAC+B,cAAc;EAChF,IAAI/B,OAAO,CAACgC,eAAe,IAAI,IAAI,EAAE/B,IAAI,CAAC+B,eAAe,GAAGhC,OAAO,CAACgC,eAAe;EACnF,IAAIhC,OAAO,CAACiC,aAAa,EAAEhC,IAAI,CAACgC,aAAa,GAAGjC,OAAO,CAACiC,aAAa;EAErE,OAAOhC,IAAI;AACb;AASA,MAAMiC,gBAAgB,GAAGpC,mBAAmB,CAAuB,YAAY,CAAC;AAIhF,eAAe;EACbqC,OAAOA,CAACnC,OAAiC,GAAG,CAAC,CAAC,EAA6B;IACzE,OAAOkC,gBAAgB,CAACC,OAAO,CAACpC,cAAc,CAACC,OAAO,CAAC,CAAC;EAC1D,CAAC;EACDoC,OAAOA,CAAA,EAAkB;IACvB,OAAOF,gBAAgB,CAACE,OAAO,CAAC,CAAC;EACnC,CAAC;EACDC,YAAYA,CAAA,EAAkB;IAC5B,OAAOH,gBAAgB,CAACG,YAAY,CAAC,CAAC;EACxC,CAAC;EACDC,wBAAwBA,CAAA,EAAkB;IACxC,OAAOJ,gBAAgB,CAACI,wBAAwB,CAAC,CAAC;EACpD;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["NativeModule","requireNativeModule","flattenOptions","options","flat","theme","backgroundColor","searchBarBackgroundColor","textColor","textSecondaryColor","accentColor","dividerColor","searchTextColor","placeholderTextColor","selectionColor","categoryIconColor","categoryActiveIconColor","categoryActiveBackgroundColor","handleColor","categoryBarBackgroundColor","translations","searchPlaceholder","noResultsText","categoryNames","layoutDirection","snapPoints","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","gestureEnabled","backdropOpacity","excludeEmojis","NativeEmojiSheet","present","dismiss","clearRecents","clearSkinTonePreferences"],"sourceRoot":"../../src","sources":["EmojiSheetModule.ts"],"mappings":"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","ignoreList":[]}
@@ -8,6 +8,7 @@ export default function EmojiSheetView({
8
8
  onDismiss,
9
9
  theme,
10
10
  translations,
11
+ layoutDirection,
11
12
  categoryBarPosition,
12
13
  columns,
13
14
  emojiSize,
@@ -29,6 +30,7 @@ export default function EmojiSheetView({
29
30
  return /*#__PURE__*/_jsx(NativeView, {
30
31
  ...rest,
31
32
  theme: resolvedTheme,
33
+ layoutDirection: layoutDirection,
32
34
  categoryBarPosition: categoryBarPosition,
33
35
  columns: columns,
34
36
  emojiSize: emojiSize,
@@ -1 +1 @@
1
- {"version":3,"names":["requireNativeView","jsx","_jsx","NativeView","EmojiSheetView","onEmojiSelected","onDismiss","theme","translations","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","excludeEmojis","rest","resolvedTheme","searchPlaceholder","noResultsText","categoryNames","nativeEvent","emoji","undefined"],"sourceRoot":"../../src","sources":["EmojiSheetView.tsx"],"mappings":";;AAAA,SAASA,iBAAiB,QAAQ,MAAM;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAOzC,MAAMC,UAA0D,GAC9DH,iBAAiB,CAAC,YAAY,CAAC;AAEjC,eAAe,SAASI,cAAcA,CAAC;EACrCC,eAAe;EACfC,SAAS;EACTC,KAAK;EACLC,YAAY;EACZC,mBAAmB;EACnBC,OAAO;EACPC,SAAS;EACTC,WAAW;EACXC,UAAU;EACVC,WAAW;EACXC,eAAe;EACfC,aAAa;EACbC,gBAAgB;EAChBC,aAAa;EACb,GAAGC;AACgB,CAAC,EAAE;EACtB,MAAMC,aAAa,GAAG,OAAOb,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAGA,KAAK;;EAElE;EACA;EACA;;EAEA,oBACEL,IAAA,CAACC,UAAU;IAAA,GACLgB,IAAI;IACRZ,KAAK,EAAEa,aAAc;IACrBX,mBAAmB,EAAEA,mBAAoB;IACzCC,OAAO,EAAEA,OAAQ;IACjBC,SAAS,EAAEA,SAAU;IACrBC,WAAW,EAAEA,WAAY;IACzBC,UAAU,EAAEA,UAAW;IACvBC,WAAW,EAAEA,WAAY;IACzBC,eAAe,EAAEA,eAAgB;IACjCC,aAAa,EAAEA,aAAc;IAC7BC,gBAAgB,EAAEA,gBAAiB;IACnCC,aAAa,EAAEA,aAAc;IAC7BG,iBAAiB,EAAEb,YAAY,EAAEa,iBAAkB;IACnDC,aAAa,EAAEd,YAAY,EAAEc,aAAc;IAC3CC,aAAa,EAAEf,YAAY,EAAEe,aAAc;IAC3ClB,eAAe,EAAEA,CAAC;MAAEmB;IAAY,CAAC,KAAK;MACpCnB,eAAe,CAACmB,WAAW,CAACC,KAAK,CAAC;IACpC,CAAE;IACFnB,SAAS,EAAEA,SAAS,GAAG,MAAMA,SAAS,CAAC,CAAC,GAAGoB;EAAU,CACtD,CAAC;AAEN","ignoreList":[]}
1
+ {"version":3,"names":["requireNativeView","jsx","_jsx","NativeView","EmojiSheetView","onEmojiSelected","onDismiss","theme","translations","layoutDirection","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","excludeEmojis","rest","resolvedTheme","searchPlaceholder","noResultsText","categoryNames","nativeEvent","emoji","undefined"],"sourceRoot":"../../src","sources":["EmojiSheetView.tsx"],"mappings":";;AAAA,SAASA,iBAAiB,QAAQ,MAAM;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAOzC,MAAMC,UAA0D,GAC9DH,iBAAiB,CAAC,YAAY,CAAC;AAEjC,eAAe,SAASI,cAAcA,CAAC;EACrCC,eAAe;EACfC,SAAS;EACTC,KAAK;EACLC,YAAY;EACZC,eAAe;EACfC,mBAAmB;EACnBC,OAAO;EACPC,SAAS;EACTC,WAAW;EACXC,UAAU;EACVC,WAAW;EACXC,eAAe;EACfC,aAAa;EACbC,gBAAgB;EAChBC,aAAa;EACb,GAAGC;AACgB,CAAC,EAAE;EACtB,MAAMC,aAAa,GAAG,OAAOd,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAGA,KAAK;;EAElE;EACA;EACA;;EAEA,oBACEL,IAAA,CAACC,UAAU;IAAA,GACLiB,IAAI;IACRb,KAAK,EAAEc,aAAc;IACrBZ,eAAe,EAAEA,eAAgB;IACjCC,mBAAmB,EAAEA,mBAAoB;IACzCC,OAAO,EAAEA,OAAQ;IACjBC,SAAS,EAAEA,SAAU;IACrBC,WAAW,EAAEA,WAAY;IACzBC,UAAU,EAAEA,UAAW;IACvBC,WAAW,EAAEA,WAAY;IACzBC,eAAe,EAAEA,eAAgB;IACjCC,aAAa,EAAEA,aAAc;IAC7BC,gBAAgB,EAAEA,gBAAiB;IACnCC,aAAa,EAAEA,aAAc;IAC7BG,iBAAiB,EAAEd,YAAY,EAAEc,iBAAkB;IACnDC,aAAa,EAAEf,YAAY,EAAEe,aAAc;IAC3CC,aAAa,EAAEhB,YAAY,EAAEgB,aAAc;IAC3CnB,eAAe,EAAEA,CAAC;MAAEoB;IAAY,CAAC,KAAK;MACpCpB,eAAe,CAACoB,WAAW,CAACC,KAAK,CAAC;IACpC,CAAE;IACFpB,SAAS,EAAEA,SAAS,GAAG,MAAMA,SAAS,CAAC,CAAC,GAAGqB;EAAU,CACtD,CAAC;AAEN","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"EmojiSheetModule.d.ts","sourceRoot":"","sources":["../../src/EmojiSheetModule.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAmB,MAAM,0BAA0B,CAAC;AAiE5G,YAAY,EAAE,gBAAgB,EAAE,CAAC;;sBAGd,wBAAwB,GAAQ,OAAO,CAAC,gBAAgB,CAAC;eAG/D,OAAO,CAAC,IAAI,CAAC;oBAGR,OAAO,CAAC,IAAI,CAAC;gCAGD,OAAO,CAAC,IAAI,CAAC;;AAV3C,wBAaE"}
1
+ {"version":3,"file":"EmojiSheetModule.d.ts","sourceRoot":"","sources":["../../src/EmojiSheetModule.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAmB,MAAM,0BAA0B,CAAC;AAkE5G,YAAY,EAAE,gBAAgB,EAAE,CAAC;;sBAGd,wBAAwB,GAAQ,OAAO,CAAC,gBAAgB,CAAC;eAG/D,OAAO,CAAC,IAAI,CAAC;oBAGR,OAAO,CAAC,IAAI,CAAC;gCAGD,OAAO,CAAC,IAAI,CAAC;;AAV3C,wBAaE"}
@@ -24,6 +24,7 @@ export type EmojiSheetTranslations = {
24
24
  export type EmojiSheetPresentOptions = {
25
25
  theme?: EmojiSheetTheme | 'dark' | 'light' | 'system';
26
26
  translations?: EmojiSheetTranslations;
27
+ layoutDirection?: 'ltr' | 'rtl' | 'auto';
27
28
  snapPoints?: [number, number];
28
29
  categoryBarPosition?: 'top' | 'bottom';
29
30
  columns?: number;
@@ -55,6 +56,7 @@ export type EmojiSheetViewProps = ViewProps & {
55
56
  onDismiss?: () => void;
56
57
  theme?: EmojiSheetTheme | 'dark' | 'light' | 'system';
57
58
  translations?: EmojiSheetTranslations;
59
+ layoutDirection?: 'ltr' | 'rtl' | 'auto';
58
60
  categoryBarPosition?: 'top' | 'bottom';
59
61
  columns?: number;
60
62
  emojiSize?: number;
@@ -72,6 +74,7 @@ export type EmojiSheetNativeViewProps = ViewProps & {
72
74
  nativeEvent: {};
73
75
  }) => void;
74
76
  theme?: string;
77
+ layoutDirection?: 'ltr' | 'rtl' | 'auto';
75
78
  categoryBarPosition?: string;
76
79
  columns?: number;
77
80
  emojiSize?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"EmojiSheetModule.types.d.ts","sourceRoot":"","sources":["../../src/EmojiSheetModule.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EmojiSheetModule.types.d.ts","sourceRoot":"","sources":["../../src/EmojiSheetModule.types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import type { EmojiSheetViewProps } from './EmojiSheetModule.types';
2
- export default function EmojiSheetView({ onEmojiSelected, onDismiss, theme, translations, categoryBarPosition, columns, emojiSize, recentLimit, showSearch, showRecents, enableSkinTones, enableHaptics, enableAnimations, excludeEmojis, ...rest }: EmojiSheetViewProps): import("react/jsx-runtime").JSX.Element;
2
+ export default function EmojiSheetView({ onEmojiSelected, onDismiss, theme, translations, layoutDirection, categoryBarPosition, columns, emojiSize, recentLimit, showSearch, showRecents, enableSkinTones, enableHaptics, enableAnimations, excludeEmojis, ...rest }: EmojiSheetViewProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=EmojiSheetView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmojiSheetView.d.ts","sourceRoot":"","sources":["../../src/EmojiSheetView.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAKlC,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,eAAe,EACf,SAAS,EACT,KAAK,EACL,YAAY,EACZ,mBAAmB,EACnB,OAAO,EACP,SAAS,EACT,WAAW,EACX,UAAU,EACV,WAAW,EACX,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,GAAG,IAAI,EACR,EAAE,mBAAmB,2CA8BrB"}
1
+ {"version":3,"file":"EmojiSheetView.d.ts","sourceRoot":"","sources":["../../src/EmojiSheetView.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAKlC,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,eAAe,EACf,SAAS,EACT,KAAK,EACL,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,OAAO,EACP,SAAS,EACT,WAAW,EACX,UAAU,EACV,WAAW,EACX,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,GAAG,IAAI,EACR,EAAE,mBAAmB,2CA+BrB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-native-sheet-emojis",
3
- "version": "1.7.0",
3
+ "version": "1.8.1",
4
4
  "description": "A fully native emoji picker bottom sheet for React Native. Built with Swift and Kotlin for maximum performance. Features search with multilingual keywords, skin tones, frequently used tracking, theming, and configurable layout.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -38,6 +38,7 @@ function flattenOptions(options: EmojiSheetPresentOptions): NativeOptions {
38
38
  }
39
39
 
40
40
  // Layout & behavior
41
+ if (options.layoutDirection) flat.layoutDirection = options.layoutDirection;
41
42
  if (options.snapPoints) flat.snapPoints = options.snapPoints;
42
43
  if (options.categoryBarPosition) flat.categoryBarPosition = options.categoryBarPosition;
43
44
  if (options.columns != null) flat.columns = options.columns;
@@ -38,6 +38,7 @@ export type EmojiSheetTranslations = {
38
38
  export type EmojiSheetPresentOptions = {
39
39
  theme?: EmojiSheetTheme | 'dark' | 'light' | 'system';
40
40
  translations?: EmojiSheetTranslations;
41
+ layoutDirection?: 'ltr' | 'rtl' | 'auto';
41
42
  snapPoints?: [number, number];
42
43
  categoryBarPosition?: 'top' | 'bottom';
43
44
  columns?: number;
@@ -64,6 +65,7 @@ export type EmojiSheetViewProps = ViewProps & {
64
65
  onDismiss?: () => void;
65
66
  theme?: EmojiSheetTheme | 'dark' | 'light' | 'system';
66
67
  translations?: EmojiSheetTranslations;
68
+ layoutDirection?: 'ltr' | 'rtl' | 'auto';
67
69
  categoryBarPosition?: 'top' | 'bottom';
68
70
  columns?: number;
69
71
  emojiSize?: number;
@@ -80,6 +82,7 @@ export type EmojiSheetNativeViewProps = ViewProps & {
80
82
  onEmojiSelected: EmojiSelectionListener;
81
83
  onDismiss?: (event: { nativeEvent: {} }) => void;
82
84
  theme?: string;
85
+ layoutDirection?: 'ltr' | 'rtl' | 'auto';
83
86
  categoryBarPosition?: string;
84
87
  columns?: number;
85
88
  emojiSize?: number;
@@ -13,6 +13,7 @@ export default function EmojiSheetView({
13
13
  onDismiss,
14
14
  theme,
15
15
  translations,
16
+ layoutDirection,
16
17
  categoryBarPosition,
17
18
  columns,
18
19
  emojiSize,
@@ -35,6 +36,7 @@ export default function EmojiSheetView({
35
36
  <NativeView
36
37
  {...rest}
37
38
  theme={resolvedTheme}
39
+ layoutDirection={layoutDirection}
38
40
  categoryBarPosition={categoryBarPosition}
39
41
  columns={columns}
40
42
  emojiSize={emojiSize}