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.
- package/README.md +21 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiCategoryStrip.kt +7 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiGridAdapter.kt +3 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiSearchBar.kt +16 -14
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetContentView.kt +4 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetModule.kt +18 -0
- package/android/src/main/java/expo/community/modules/emojisheet/EmojiSheetUIView.kt +67 -0
- package/android/src/main/java/expo/community/modules/emojisheet/StickyHeaderDecoration.kt +6 -0
- package/ios/EmojiCategoryStrip.swift +6 -0
- package/ios/EmojiGridView.swift +15 -2
- package/ios/EmojiSearchBar.swift +12 -0
- package/ios/EmojiSheetContentView.swift +4 -0
- package/ios/EmojiSheetModule.podspec +1 -1
- package/ios/EmojiSheetModule.swift +5 -0
- package/ios/EmojiSheetUIView.swift +21 -0
- package/lib/commonjs/EmojiSheetModule.js +1 -0
- package/lib/commonjs/EmojiSheetModule.js.map +1 -1
- package/lib/commonjs/EmojiSheetView.js +2 -0
- package/lib/commonjs/EmojiSheetView.js.map +1 -1
- package/lib/module/EmojiSheetModule.js +1 -0
- package/lib/module/EmojiSheetModule.js.map +1 -1
- package/lib/module/EmojiSheetView.js +2 -0
- package/lib/module/EmojiSheetView.js.map +1 -1
- package/lib/typescript/EmojiSheetModule.d.ts.map +1 -1
- package/lib/typescript/EmojiSheetModule.types.d.ts +3 -0
- package/lib/typescript/EmojiSheetModule.types.d.ts.map +1 -1
- package/lib/typescript/EmojiSheetView.d.ts +1 -1
- package/lib/typescript/EmojiSheetView.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/EmojiSheetModule.ts +1 -0
- package/src/EmojiSheetModule.types.ts +3 -0
- 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
|
-
|
|
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
|
package/ios/EmojiGridView.swift
CHANGED
|
@@ -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
|
}
|
package/ios/EmojiSearchBar.swift
CHANGED
|
@@ -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.
|
|
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":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAKA,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,
|
|
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,
|
|
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,
|
|
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,
|
|
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;
|
|
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":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,wBAAwB,EAAE,MAAM,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB,iBAAiB,GACjB,iBAAiB,GACjB,aAAa,GACb,gBAAgB,GAChB,YAAY,GACZ,eAAe,GACf,YAAY,GACZ,SAAS,GACT,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,MAAM,sBAAsB,GAAG;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACtD,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,eAAe,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IACzC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,mBAAmB,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,KAAK,CAAA;CAAE,GACpC;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAEvC,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE;IAAE,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,KAAK,IAAI,CAAC;AAEzF,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG;IAC5C,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACtD,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,eAAe,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IACzC,mBAAmB,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG;IAClD,eAAe,EAAE,sBAAsB,CAAC;IACxC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IACzC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC"}
|
|
@@ -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,
|
|
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.
|
|
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",
|
package/src/EmojiSheetModule.ts
CHANGED
|
@@ -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;
|
package/src/EmojiSheetView.tsx
CHANGED
|
@@ -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}
|