expo-native-sheet-emojis 1.6.0 → 1.8.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 (34) hide show
  1. package/README.md +1 -0
  2. package/android/build.gradle +1 -1
  3. package/android/src/main/java/expo/community/modules/emojisheet/EmojiCategoryStrip.kt +7 -0
  4. package/android/src/main/java/expo/community/modules/emojisheet/EmojiGridAdapter.kt +3 -0
  5. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSearchBar.kt +3 -1
  6. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetContentView.kt +5 -0
  7. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetModule.kt +19 -1
  8. package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetUIView.kt +71 -0
  9. package/android/src/main/java/expo/community/modules/emojisheet/StickyHeaderDecoration.kt +95 -0
  10. package/android/src/main/res/drawable/ic_search.xml +9 -0
  11. package/ios/EmojiCategoryStrip.swift +6 -0
  12. package/ios/EmojiGridView.swift +15 -2
  13. package/ios/EmojiSearchBar.swift +12 -0
  14. package/ios/EmojiSheetContentView.swift +5 -0
  15. package/ios/EmojiSheetModule.podspec +1 -1
  16. package/ios/EmojiSheetModule.swift +6 -1
  17. package/ios/EmojiSheetUIView.swift +21 -0
  18. package/lib/commonjs/EmojiSheetModule.js +1 -0
  19. package/lib/commonjs/EmojiSheetModule.js.map +1 -1
  20. package/lib/commonjs/EmojiSheetView.js +5 -1
  21. package/lib/commonjs/EmojiSheetView.js.map +1 -1
  22. package/lib/module/EmojiSheetModule.js +1 -0
  23. package/lib/module/EmojiSheetModule.js.map +1 -1
  24. package/lib/module/EmojiSheetView.js +5 -1
  25. package/lib/module/EmojiSheetView.js.map +1 -1
  26. package/lib/typescript/EmojiSheetModule.d.ts.map +1 -1
  27. package/lib/typescript/EmojiSheetModule.types.d.ts +7 -0
  28. package/lib/typescript/EmojiSheetModule.types.d.ts.map +1 -1
  29. package/lib/typescript/EmojiSheetView.d.ts +1 -1
  30. package/lib/typescript/EmojiSheetView.d.ts.map +1 -1
  31. package/package.json +1 -1
  32. package/src/EmojiSheetModule.ts +1 -0
  33. package/src/EmojiSheetModule.types.ts +5 -0
  34. package/src/EmojiSheetView.tsx +4 -0
package/README.md CHANGED
@@ -306,6 +306,7 @@ A declarative React component that renders the emoji picker inline.
306
306
  | Prop | Type | Default | Description |
307
307
  |-|-|-|-|
308
308
  | onEmojiSelected | `(emoji: string) => void` | required | Called when an emoji is tapped |
309
+ | onDismiss | `() => void` | -- | Called when the picker is dismissed (View API only, not Embedded view) |
309
310
  | theme | `EmojiSheetTheme \| 'dark' \| 'light' \| 'system'` | `'light'` | Theme configuration |
310
311
  | translations | `EmojiSheetTranslations` | -- | Localized strings |
311
312
  | categoryBarPosition | `'top' \| 'bottom'` | `'top'` | Position of the category tab bar |
@@ -44,7 +44,7 @@ android {
44
44
  dependencies {
45
45
  implementation "androidx.recyclerview:recyclerview:1.3.2"
46
46
  implementation "androidx.appcompat:appcompat:1.6.1"
47
- implementation "com.google.android.material:material:1.11.0"
47
+ implementation "com.google.android.material:material:1.12.0"
48
48
  implementation "androidx.emoji2:emoji2:1.6.0"
49
49
  implementation "androidx.emoji2:emoji2-views-helper:1.6.0"
50
50
  }
@@ -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(
@@ -53,7 +53,7 @@ class EmojiSearchBar(
53
53
  layoutParams = lp
54
54
 
55
55
  searchIcon = ImageView(context).apply {
56
- setImageResource(android.R.drawable.ic_menu_search)
56
+ setImageResource(R.drawable.ic_search)
57
57
  scaleType = ImageView.ScaleType.CENTER_INSIDE
58
58
  val iconLp = LayoutParams(iconWidth, LayoutParams.MATCH_PARENT)
59
59
  layoutParams = iconLp
@@ -85,6 +85,8 @@ class EmojiSearchBar(
85
85
  setBackgroundColor(0x00000000)
86
86
  hint = "Search emoji"
87
87
  setSingleLine(true)
88
+ textDirection = View.TEXT_DIRECTION_LOCALE
89
+ textAlignment = View.TEXT_ALIGNMENT_VIEW_START
88
90
  imeOptions = EditorInfo.IME_ACTION_SEARCH
89
91
  setTextSize(TypedValue.COMPLEX_UNIT_SP, 15f)
90
92
  setPadding((4 * density).toInt(), 0, clearSize + clearMarginEnd, 0)
@@ -13,6 +13,7 @@ class EmojiSheetContentView(
13
13
  ) : ExpoView(context, appContext) {
14
14
 
15
15
  private val onEmojiSelected by EventDispatcher()
16
+ private val onDismiss by EventDispatcher()
16
17
  private val pickerView = EmojiSheetUIView(context)
17
18
 
18
19
  init {
@@ -37,6 +38,10 @@ class EmojiSheetContentView(
37
38
  pickerView.applyConfiguration()
38
39
  }
39
40
 
41
+ fun updateLayoutDirection(direction: String) {
42
+ pickerView.layoutDirectionProp = direction
43
+ }
44
+
40
45
  fun updateColumns(columns: Int) {
41
46
  pickerView.columns = columns
42
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
  }
@@ -112,7 +115,7 @@ class EmojiSheetModule : Module() {
112
115
  Prop("excludeEmojis") { view: EmojiSheetContentView, ids: List<String>? ->
113
116
  view.updateExcludeEmojis(ids ?: emptyList())
114
117
  }
115
- Events("onEmojiSelected")
118
+ Events("onEmojiSelected", "onDismiss")
116
119
  }
117
120
  }
118
121
 
@@ -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()
@@ -97,6 +102,7 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
97
102
  private val recyclerView: RecyclerView
98
103
  private val gridAdapter: EmojiGridAdapter
99
104
  private val gridLayoutManager: GridLayoutManager
105
+ private val stickyHeaderDecoration: StickyHeaderDecoration
100
106
  private val emptyStateLabel: TextView
101
107
  private val contentFrame: FrameLayout
102
108
 
@@ -108,6 +114,8 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
108
114
  private var initialTouchY = 0f
109
115
  private var lastTopPullDragDistance = 0f
110
116
  private var isHandlingTopPullDrag = false
117
+ private var isSheetExpanded = false
118
+ private var isSheetExpansionInProgress = false
111
119
  private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop.toFloat()
112
120
  private var velocityTracker: VelocityTracker? = null
113
121
  private var topPullStartY: Float? = null
@@ -156,6 +164,8 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
156
164
  recyclerView = RecyclerView(context).apply {
157
165
  layoutManager = gridLayoutManager
158
166
  adapter = gridAdapter
167
+ stickyHeaderDecoration = StickyHeaderDecoration(gridAdapter, currentTheme.backgroundColor)
168
+ addItemDecoration(stickyHeaderDecoration)
159
169
  setHasFixedSize(false)
160
170
  overScrollMode = View.OVER_SCROLL_NEVER
161
171
  isNestedScrollingEnabled = true
@@ -173,6 +183,10 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
173
183
  lastTopPullDragDistance = 0f
174
184
  isHandlingTopPullDrag = false
175
185
  topPullStartY = null
186
+ if (isSheetExpansionInProgress) {
187
+ rv.stopScroll()
188
+ return true
189
+ }
176
190
  }
177
191
  android.view.MotionEvent.ACTION_UP,
178
192
  android.view.MotionEvent.ACTION_CANCEL -> {
@@ -187,12 +201,28 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
187
201
  topPullStartY = null
188
202
  velocityTracker?.recycle()
189
203
  velocityTracker = null
204
+ if (isSheetExpansionInProgress) {
205
+ rv.stopScroll()
206
+ return true
207
+ }
190
208
  }
191
209
  }
192
210
 
193
211
  if (e.actionMasked == android.view.MotionEvent.ACTION_MOVE) {
212
+ if (isSheetExpansionInProgress) {
213
+ rv.stopScroll()
214
+ return true
215
+ }
216
+
194
217
  val deltaY = e.y - initialTouchY
195
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
+ }
196
226
  if (isHandlingTopPullDrag) {
197
227
  rv.parent?.requestDisallowInterceptTouchEvent(true)
198
228
  rv.stopScroll()
@@ -232,6 +262,11 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
232
262
  }
233
263
 
234
264
  override fun onScrolled(rv: RecyclerView, dx: Int, dy: Int) {
265
+ if (!isSheetExpanded) {
266
+ rv.stopScroll()
267
+ return
268
+ }
269
+
235
270
  if (dy > 0 && rv.scrollState != RecyclerView.SCROLL_STATE_IDLE && !didTriggerExpandForCurrentDrag) {
236
271
  didTriggerExpandForCurrentDrag = true
237
272
  onScrollIntentUp?.invoke()
@@ -274,6 +309,21 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
274
309
  addView(contentFrame)
275
310
 
276
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
+ }
277
327
  }
278
328
 
279
329
  /** Call after setting configurable properties but before loadDataAsync to apply layout changes. */
@@ -411,9 +461,28 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
411
461
  categoryStrip.applyTheme(theme)
412
462
  gridAdapter.updateTheme(theme)
413
463
  recyclerView.setBackgroundColor(theme.backgroundColor)
464
+ stickyHeaderDecoration.backgroundColor = theme.backgroundColor
465
+ stickyHeaderDecoration.invalidateCache()
414
466
  emptyStateLabel.setTextColor(theme.textSecondaryColor)
415
467
  }
416
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
+
417
486
  private fun buildCategoryKeys(): List<String> {
418
487
  val keys = mutableListOf<String>()
419
488
  if (showRecents && getFrequentlyUsed().isNotEmpty()) {
@@ -473,6 +542,7 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
473
542
  }
474
543
 
475
544
  gridAdapter.setItems(items, sectionPositions)
545
+ stickyHeaderDecoration.invalidateCache()
476
546
 
477
547
  // Rebuild category keys in case frequently_used changed
478
548
  val newKeys = buildCategoryKeys()
@@ -500,6 +570,7 @@ class EmojiSheetUIView(context: Context) : LinearLayout(context) {
500
570
  addView(categoryStrip, index)
501
571
  }
502
572
  categoryStrip.applyTheme(currentTheme)
573
+ applyLayoutDirection()
503
574
  }
504
575
 
505
576
  private fun resolveSkinTone(baseEmoji: String, emojiId: String, toneEnabled: Boolean): String {
@@ -0,0 +1,95 @@
1
+ package expo.community.modules.emojisheet
2
+
3
+ import android.graphics.Canvas
4
+ import android.view.View
5
+ import android.view.ViewGroup
6
+ import android.widget.TextView
7
+ import androidx.recyclerview.widget.RecyclerView
8
+
9
+ class StickyHeaderDecoration(
10
+ private val adapter: EmojiGridAdapter,
11
+ var backgroundColor: Int = 0
12
+ ) : RecyclerView.ItemDecoration() {
13
+
14
+ private var cachedHeaderPosition: Int = RecyclerView.NO_POSITION
15
+ private var cachedHeaderView: View? = null
16
+ private var cachedParentWidth: Int = 0
17
+
18
+ override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
19
+ val topChild = parent.getChildAt(0) ?: return
20
+ val topPosition = parent.getChildAdapterPosition(topChild)
21
+ if (topPosition == RecyclerView.NO_POSITION) return
22
+
23
+ val headerPosition = findHeaderPositionBefore(topPosition)
24
+ if (headerPosition == RecyclerView.NO_POSITION) return
25
+
26
+ val headerView = getHeaderView(parent, headerPosition)
27
+
28
+ val nextHeaderPosition = findNextHeaderPosition(topPosition)
29
+ if (nextHeaderPosition != RecyclerView.NO_POSITION) {
30
+ val nextHeaderView = parent.findViewHolderForAdapterPosition(nextHeaderPosition)?.itemView
31
+ if (nextHeaderView != null && nextHeaderView.top < headerView.height) {
32
+ val offset = maxOf(0f, (nextHeaderView.top - headerView.height).toFloat())
33
+ c.save()
34
+ c.translate(0f, offset)
35
+ headerView.draw(c)
36
+ c.restore()
37
+ return
38
+ }
39
+ }
40
+
41
+ c.save()
42
+ c.translate(0f, 0f)
43
+ headerView.draw(c)
44
+ c.restore()
45
+ }
46
+
47
+ private fun getHeaderView(parent: RecyclerView, position: Int): View {
48
+ if (position == cachedHeaderPosition && cachedHeaderView != null && cachedParentWidth == parent.width) {
49
+ return cachedHeaderView!!
50
+ }
51
+ val holder = adapter.createViewHolder(parent, EmojiGridAdapter.VIEW_TYPE_HEADER)
52
+ adapter.bindViewHolder(holder, position)
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
+ }
59
+ if (backgroundColor != 0) {
60
+ view.setBackgroundColor(backgroundColor)
61
+ }
62
+ fixLayoutSize(parent, view)
63
+ cachedHeaderPosition = position
64
+ cachedHeaderView = view
65
+ cachedParentWidth = parent.width
66
+ return view
67
+ }
68
+
69
+ fun invalidateCache() {
70
+ cachedHeaderPosition = RecyclerView.NO_POSITION
71
+ cachedHeaderView = null
72
+ }
73
+
74
+ private fun findHeaderPositionBefore(pos: Int): Int {
75
+ for (i in pos downTo 0) {
76
+ if (adapter.getItemViewType(i) == EmojiGridAdapter.VIEW_TYPE_HEADER) return i
77
+ }
78
+ return RecyclerView.NO_POSITION
79
+ }
80
+
81
+ private fun findNextHeaderPosition(pos: Int): Int {
82
+ val count = adapter.itemCount
83
+ for (i in (pos + 1) until count) {
84
+ if (adapter.getItemViewType(i) == EmojiGridAdapter.VIEW_TYPE_HEADER) return i
85
+ }
86
+ return RecyclerView.NO_POSITION
87
+ }
88
+
89
+ private fun fixLayoutSize(parent: ViewGroup, view: View) {
90
+ val widthSpec = View.MeasureSpec.makeMeasureSpec(parent.width, View.MeasureSpec.EXACTLY)
91
+ val heightSpec = View.MeasureSpec.makeMeasureSpec(parent.height, View.MeasureSpec.UNSPECIFIED)
92
+ view.measure(widthSpec, heightSpec)
93
+ view.layout(0, 0, view.measuredWidth, view.measuredHeight)
94
+ }
95
+ }
@@ -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="#000000"
8
+ android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
9
+ </vector>
@@ -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()
@@ -21,6 +21,7 @@ struct EmojiSection {
21
21
 
22
22
  class EmojiSheetContentView: ExpoView, EmojiSheetUIViewDelegate {
23
23
  let onEmojiSelected = EventDispatcher()
24
+ let onDismiss = EventDispatcher()
24
25
  private let pickerView = EmojiSheetUIView()
25
26
 
26
27
  required init(appContext: AppContext? = nil) {
@@ -49,6 +50,10 @@ class EmojiSheetContentView: ExpoView, EmojiSheetUIViewDelegate {
49
50
  pickerView.categoryBarPosition = position
50
51
  }
51
52
 
53
+ func updateLayoutDirection(_ direction: String) {
54
+ pickerView.layoutDirection = direction
55
+ }
56
+
52
57
  func updateColumns(_ columns: Int) {
53
58
  pickerView.columns = columns
54
59
  }
@@ -1,6 +1,6 @@
1
1
  Pod::Spec.new do |s|
2
2
  s.name = 'EmojiSheetModule'
3
- s.version = '1.6.0'
3
+ s.version = '1.8.0'
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
  }
@@ -84,7 +87,7 @@ public class EmojiSheetModule: Module {
84
87
  Prop("excludeEmojis") { (view, ids: [String]?) in
85
88
  view.updateExcludeEmojis(ids ?? [])
86
89
  }
87
- Events("onEmojiSelected")
90
+ Events("onEmojiSelected", "onDismiss")
88
91
  }
89
92
  }
90
93
 
@@ -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":[]}
@@ -9,8 +9,10 @@ var _jsxRuntime = require("react/jsx-runtime");
9
9
  const NativeView = (0, _expo.requireNativeView)('EmojiSheet');
10
10
  function EmojiSheetView({
11
11
  onEmojiSelected,
12
+ onDismiss,
12
13
  theme,
13
14
  translations,
15
+ layoutDirection,
14
16
  categoryBarPosition,
15
17
  columns,
16
18
  emojiSize,
@@ -32,6 +34,7 @@ function EmojiSheetView({
32
34
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(NativeView, {
33
35
  ...rest,
34
36
  theme: resolvedTheme,
37
+ layoutDirection: layoutDirection,
35
38
  categoryBarPosition: categoryBarPosition,
36
39
  columns: columns,
37
40
  emojiSize: emojiSize,
@@ -49,7 +52,8 @@ function EmojiSheetView({
49
52
  nativeEvent
50
53
  }) => {
51
54
  onEmojiSelected(nativeEvent.emoji);
52
- }
55
+ },
56
+ onDismiss: onDismiss ? () => onDismiss() : undefined
53
57
  });
54
58
  }
55
59
  //# sourceMappingURL=EmojiSheetView.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_expo","require","_jsxRuntime","NativeView","requireNativeView","EmojiSheetView","onEmojiSelected","theme","translations","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","excludeEmojis","rest","resolvedTheme","jsx","searchPlaceholder","noResultsText","categoryNames","nativeEvent","emoji"],"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,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,IAAAL,WAAA,CAAAmB,GAAA,EAAClB,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;IAC7BI,iBAAiB,EAAEd,YAAY,EAAEc,iBAAkB;IACnDC,aAAa,EAAEf,YAAY,EAAEe,aAAc;IAC3CC,aAAa,EAAEhB,YAAY,EAAEgB,aAAc;IAC3ClB,eAAe,EAAEA,CAAC;MAAEmB;IAAY,CAAC,KAAK;MACpCnB,eAAe,CAACmB,WAAW,CAACC,KAAK,CAAC;IACpC;EAAE,CACH,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":"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","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":";;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,eAAe,EAAEpB,IAAI,CAACoB,eAAe,GAAGrB,OAAO,CAACqB,eAAe;EAC3E,IAAIrB,OAAO,CAACsB,UAAU,EAAErB,IAAI,CAACqB,UAAU,GAAGtB,OAAO,CAACsB,UAAU;EAC5D,IAAItB,OAAO,CAACuB,mBAAmB,EAAEtB,IAAI,CAACsB,mBAAmB,GAAGvB,OAAO,CAACuB,mBAAmB;EACvF,IAAIvB,OAAO,CAACwB,OAAO,IAAI,IAAI,EAAEvB,IAAI,CAACuB,OAAO,GAAGxB,OAAO,CAACwB,OAAO;EAC3D,IAAIxB,OAAO,CAACyB,SAAS,IAAI,IAAI,EAAExB,IAAI,CAACwB,SAAS,GAAGzB,OAAO,CAACyB,SAAS;EACjE,IAAIzB,OAAO,CAAC0B,WAAW,IAAI,IAAI,EAAEzB,IAAI,CAACyB,WAAW,GAAG1B,OAAO,CAAC0B,WAAW;EACvE,IAAI1B,OAAO,CAAC2B,UAAU,IAAI,IAAI,EAAE1B,IAAI,CAAC0B,UAAU,GAAG3B,OAAO,CAAC2B,UAAU;EACpE,IAAI3B,OAAO,CAAC4B,WAAW,IAAI,IAAI,EAAE3B,IAAI,CAAC2B,WAAW,GAAG5B,OAAO,CAAC4B,WAAW;EACvE,IAAI5B,OAAO,CAAC6B,eAAe,IAAI,IAAI,EAAE5B,IAAI,CAAC4B,eAAe,GAAG7B,OAAO,CAAC6B,eAAe;EACnF,IAAI7B,OAAO,CAAC8B,aAAa,IAAI,IAAI,EAAE7B,IAAI,CAAC6B,aAAa,GAAG9B,OAAO,CAAC8B,aAAa;EAC7E,IAAI9B,OAAO,CAAC+B,gBAAgB,IAAI,IAAI,EAAE9B,IAAI,CAAC8B,gBAAgB,GAAG/B,OAAO,CAAC+B,gBAAgB;EACtF,IAAI/B,OAAO,CAACgC,cAAc,IAAI,IAAI,EAAE/B,IAAI,CAAC+B,cAAc,GAAGhC,OAAO,CAACgC,cAAc;EAChF,IAAIhC,OAAO,CAACiC,eAAe,IAAI,IAAI,EAAEhC,IAAI,CAACgC,eAAe,GAAGjC,OAAO,CAACiC,eAAe;EACnF,IAAIjC,OAAO,CAACkC,aAAa,EAAEjC,IAAI,CAACiC,aAAa,GAAGlC,OAAO,CAACkC,aAAa;EAErE,OAAOjC,IAAI;AACb;AASA,MAAMkC,gBAAgB,GAAGrC,mBAAmB,CAAuB,YAAY,CAAC;AAIhF,eAAe;EACbsC,OAAOA,CAACpC,OAAiC,GAAG,CAAC,CAAC,EAA6B;IACzE,OAAOmC,gBAAgB,CAACC,OAAO,CAACrC,cAAc,CAACC,OAAO,CAAC,CAAC;EAC1D,CAAC;EACDqC,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":[]}
@@ -5,8 +5,10 @@ import { jsx as _jsx } from "react/jsx-runtime";
5
5
  const NativeView = requireNativeView('EmojiSheet');
6
6
  export default function EmojiSheetView({
7
7
  onEmojiSelected,
8
+ onDismiss,
8
9
  theme,
9
10
  translations,
11
+ layoutDirection,
10
12
  categoryBarPosition,
11
13
  columns,
12
14
  emojiSize,
@@ -28,6 +30,7 @@ export default function EmojiSheetView({
28
30
  return /*#__PURE__*/_jsx(NativeView, {
29
31
  ...rest,
30
32
  theme: resolvedTheme,
33
+ layoutDirection: layoutDirection,
31
34
  categoryBarPosition: categoryBarPosition,
32
35
  columns: columns,
33
36
  emojiSize: emojiSize,
@@ -45,7 +48,8 @@ export default function EmojiSheetView({
45
48
  nativeEvent
46
49
  }) => {
47
50
  onEmojiSelected(nativeEvent.emoji);
48
- }
51
+ },
52
+ onDismiss: onDismiss ? () => onDismiss() : undefined
49
53
  });
50
54
  }
51
55
  //# sourceMappingURL=EmojiSheetView.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["requireNativeView","jsx","_jsx","NativeView","EmojiSheetView","onEmojiSelected","theme","translations","categoryBarPosition","columns","emojiSize","recentLimit","showSearch","showRecents","enableSkinTones","enableHaptics","enableAnimations","excludeEmojis","rest","resolvedTheme","searchPlaceholder","noResultsText","categoryNames","nativeEvent","emoji"],"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,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,oBACEJ,IAAA,CAACC,UAAU;IAAA,GACLe,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;IAC3CjB,eAAe,EAAEA,CAAC;MAAEkB;IAAY,CAAC,KAAK;MACpClB,eAAe,CAACkB,WAAW,CAACC,KAAK,CAAC;IACpC;EAAE,CACH,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;
@@ -52,8 +53,10 @@ export type EmojiSelectionListener = (event: {
52
53
  }) => void;
53
54
  export type EmojiSheetViewProps = ViewProps & {
54
55
  onEmojiSelected: (emoji: string) => void;
56
+ onDismiss?: () => void;
55
57
  theme?: EmojiSheetTheme | 'dark' | 'light' | 'system';
56
58
  translations?: EmojiSheetTranslations;
59
+ layoutDirection?: 'ltr' | 'rtl' | 'auto';
57
60
  categoryBarPosition?: 'top' | 'bottom';
58
61
  columns?: number;
59
62
  emojiSize?: number;
@@ -67,7 +70,11 @@ export type EmojiSheetViewProps = ViewProps & {
67
70
  };
68
71
  export type EmojiSheetNativeViewProps = ViewProps & {
69
72
  onEmojiSelected: EmojiSelectionListener;
73
+ onDismiss?: (event: {
74
+ nativeEvent: {};
75
+ }) => void;
70
76
  theme?: string;
77
+ layoutDirection?: 'ltr' | 'rtl' | 'auto';
71
78
  categoryBarPosition?: string;
72
79
  columns?: number;
73
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, 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,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,2CA6BrB"}
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.6.0",
3
+ "version": "1.8.0",
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;
@@ -61,8 +62,10 @@ export type EmojiSelectionListener = (event: { nativeEvent: { emoji: string } })
61
62
 
62
63
  export type EmojiSheetViewProps = ViewProps & {
63
64
  onEmojiSelected: (emoji: string) => void;
65
+ onDismiss?: () => void;
64
66
  theme?: EmojiSheetTheme | 'dark' | 'light' | 'system';
65
67
  translations?: EmojiSheetTranslations;
68
+ layoutDirection?: 'ltr' | 'rtl' | 'auto';
66
69
  categoryBarPosition?: 'top' | 'bottom';
67
70
  columns?: number;
68
71
  emojiSize?: number;
@@ -77,7 +80,9 @@ export type EmojiSheetViewProps = ViewProps & {
77
80
 
78
81
  export type EmojiSheetNativeViewProps = ViewProps & {
79
82
  onEmojiSelected: EmojiSelectionListener;
83
+ onDismiss?: (event: { nativeEvent: {} }) => void;
80
84
  theme?: string;
85
+ layoutDirection?: 'ltr' | 'rtl' | 'auto';
81
86
  categoryBarPosition?: string;
82
87
  columns?: number;
83
88
  emojiSize?: number;
@@ -10,8 +10,10 @@ const NativeView: React.ComponentType<EmojiSheetNativeViewProps> =
10
10
 
11
11
  export default function EmojiSheetView({
12
12
  onEmojiSelected,
13
+ onDismiss,
13
14
  theme,
14
15
  translations,
16
+ layoutDirection,
15
17
  categoryBarPosition,
16
18
  columns,
17
19
  emojiSize,
@@ -34,6 +36,7 @@ export default function EmojiSheetView({
34
36
  <NativeView
35
37
  {...rest}
36
38
  theme={resolvedTheme}
39
+ layoutDirection={layoutDirection}
37
40
  categoryBarPosition={categoryBarPosition}
38
41
  columns={columns}
39
42
  emojiSize={emojiSize}
@@ -50,6 +53,7 @@ export default function EmojiSheetView({
50
53
  onEmojiSelected={({ nativeEvent }) => {
51
54
  onEmojiSelected(nativeEvent.emoji);
52
55
  }}
56
+ onDismiss={onDismiss ? () => onDismiss() : undefined}
53
57
  />
54
58
  );
55
59
  }