pytech-ui 1.0.21 → 1.0.24

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 (151) hide show
  1. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  2. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  3. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  4. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  5. package/android/.gradle/8.9/gc.properties +0 -0
  6. package/android/.gradle/9.3.0/checksums/checksums.lock +0 -0
  7. package/android/.gradle/9.3.0/fileChanges/last-build.bin +0 -0
  8. package/android/.gradle/9.3.0/fileHashes/fileHashes.bin +0 -0
  9. package/android/.gradle/9.3.0/fileHashes/fileHashes.lock +0 -0
  10. package/android/.gradle/9.3.0/gc.properties +0 -0
  11. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  12. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  13. package/android/.gradle/nb-cache/trust/8732A504261C070E1F639E78DF65F8E6DC6FFC865B3D7178A7609BB57105805F +1 -0
  14. package/android/.gradle/vcs-1/gc.properties +0 -0
  15. package/android/build.gradle +47 -0
  16. package/android/src/main/AndroidManifest.xml +2 -0
  17. package/android/src/main/java/expo/modules/myui/Dialog.kt +39 -0
  18. package/android/src/main/java/expo/modules/myui/ForEach/ForEachRecords.kt +23 -0
  19. package/android/src/main/java/expo/modules/myui/ForEach/index.kt +82 -0
  20. package/android/src/main/java/expo/modules/myui/Gradient/GradientView.kt +124 -0
  21. package/android/src/main/java/expo/modules/myui/Icon/index.kt +36 -0
  22. package/android/src/main/java/expo/modules/myui/Icon/utils.kt +43 -0
  23. package/android/src/main/java/expo/modules/myui/ListItem/Data/ListItemDataRecords.kt +84 -0
  24. package/android/src/main/java/expo/modules/myui/ListItem/Data/ListItemFromData.kt +127 -0
  25. package/android/src/main/java/expo/modules/myui/ListItem/Slots/ListItemFromSlots.kt +60 -0
  26. package/android/src/main/java/expo/modules/myui/ListItem/Slots/types.kt +42 -0
  27. package/android/src/main/java/expo/modules/myui/ListItem/_shared/Decorator/Decorator.kt +79 -0
  28. package/android/src/main/java/expo/modules/myui/ListItem/_shared/Decorator/Divider.kt +36 -0
  29. package/android/src/main/java/expo/modules/myui/ListItem/_shared/Decorator/utilsDecorator.kt +19 -0
  30. package/android/src/main/java/expo/modules/myui/ListItem/_shared/Dynamic/Dynamic.kt +163 -0
  31. package/android/src/main/java/expo/modules/myui/ListItem/_shared/Dynamic/Row.kt +136 -0
  32. package/android/src/main/java/expo/modules/myui/Menu/DropdownMenu.kt +48 -0
  33. package/android/src/main/java/expo/modules/myui/Menu/DropdownMenuRecords.kt +20 -0
  34. package/android/src/main/java/expo/modules/myui/MyUiModifiers.kt +94 -0
  35. package/android/src/main/java/expo/modules/myui/MyUiModule.kt +168 -0
  36. package/android/src/main/java/expo/modules/myui/SearchBar.kt +213 -0
  37. package/android/src/main/java/expo/modules/myui/Section/SectionHost.kt +81 -0
  38. package/android/src/main/java/expo/modules/myui/Section/SectionHostView.kt +65 -0
  39. package/android/src/main/java/expo/modules/myui/TextField.kt +251 -0
  40. package/android/src/main/java/expo/modules/myui/TypographySlot/TypographySlotBridge.kt +120 -0
  41. package/android/src/main/java/expo/modules/myui/TypographySlot/constants.kt +47 -0
  42. package/android/src/main/java/expo/modules/myui/TypographySlot/index.kt +43 -0
  43. package/android/src/main/java/expo/modules/myui/extended-theme/ExtendedThemeView.kt +19 -0
  44. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Colors/ExtendedColorBridge.kt +77 -0
  45. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Colors/index.kt +148 -0
  46. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Constants/Constants.kt +11 -0
  47. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/AppBarLargeFlexibleTokens.kt +20 -0
  48. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/AppBarLargeTokens.kt +19 -0
  49. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/AppBarMediumFlexibleTokens.kt +20 -0
  50. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/AppBarMediumTokens.kt +19 -0
  51. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/AppBarSmallTokens.kt +19 -0
  52. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/AppBarTokens.kt +23 -0
  53. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/AssistChipTokens.kt +25 -0
  54. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/BadgeTokens.kt +20 -0
  55. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/BaselineButtonTokens.kt +26 -0
  56. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/BottomAppBarTokens.kt +19 -0
  57. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ButtonGroupSmallTokens.kt +20 -0
  58. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ButtonLargeTokens.kt +24 -0
  59. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ButtonMediumTokens.kt +24 -0
  60. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ButtonSmallTokens.kt +24 -0
  61. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ButtonXLargeTokens.kt +24 -0
  62. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ButtonXSmallTokens.kt +24 -0
  63. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/CheckboxTokens.kt +35 -0
  64. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/CircularProgressIndicatorTokens.kt +25 -0
  65. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ConnectedButtonGroupSmallTokens.kt +21 -0
  66. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/DateInputModalTokens.kt +22 -0
  67. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/DatePickerModalTokens.kt +33 -0
  68. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/DialogTokens.kt +19 -0
  69. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/DividerTokens.kt +19 -0
  70. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/DockedToolbarTokens.kt +23 -0
  71. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/DragHandleTokens.kt +25 -0
  72. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ElevatedButtonTokens.kt +19 -0
  73. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ElevatedCardTokens.kt +20 -0
  74. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ElevationTokens.kt +24 -0
  75. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ExpressiveMotionTokens.kt +28 -0
  76. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ExtendedFabLargeTokens.kt +23 -0
  77. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ExtendedFabMediumTokens.kt +24 -0
  78. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ExtendedFabPrimaryTokens.kt +20 -0
  79. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ExtendedFabSmallTokens.kt +23 -0
  80. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FabBaselineTokens.kt +21 -0
  81. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FabLargeTokens.kt +21 -0
  82. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FabMediumTokens.kt +22 -0
  83. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FabMenuBaselineTokens.kt +28 -0
  84. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FabSmallTokens.kt +21 -0
  85. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FilledAutocompleteTokens.kt +31 -0
  86. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FilledButtonTokens.kt +19 -0
  87. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FilledCardTokens.kt +20 -0
  88. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FilledIconButtonTokens.kt +18 -0
  89. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FilledTextFieldTokens.kt +31 -0
  90. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FilledTonalButtonTokens.kt +23 -0
  91. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FilledTonalIconButtonTokens.kt +18 -0
  92. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FilterChipTokens.kt +28 -0
  93. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/FloatingToolbarTokens.kt +23 -0
  94. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/IconButtonTokens.kt +17 -0
  95. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/InputChipTokens.kt +30 -0
  96. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/LargeIconButtonTokens.kt +27 -0
  97. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/LinearProgressIndicatorTokens.kt +28 -0
  98. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ListTokens.kt +57 -0
  99. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/LoadingIndicatorTokens.kt +21 -0
  100. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/MediumIconButtonTokens.kt +27 -0
  101. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/MotionTokens.kt +44 -0
  102. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/NavigationBarHorizontalItemTokens.kt +22 -0
  103. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/NavigationBarTokens.kt +23 -0
  104. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/NavigationBarVerticalItemTokens.kt +22 -0
  105. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/NavigationDrawerTokens.kt +23 -0
  106. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/NavigationRailBaselineItemTokens.kt +25 -0
  107. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/NavigationRailCollapsedTokens.kt +23 -0
  108. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/NavigationRailExpandedTokens.kt +22 -0
  109. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/NavigationRailHorizontalItemTokens.kt +24 -0
  110. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/NavigationRailVerticalItemTokens.kt +24 -0
  111. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/OutlinedAutocompleteTokens.kt +30 -0
  112. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/OutlinedButtonTokens.kt +19 -0
  113. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/OutlinedCardTokens.kt +21 -0
  114. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/OutlinedIconButtonTokens.kt +18 -0
  115. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/OutlinedSegmentedButtonTokens.kt +24 -0
  116. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/OutlinedTextFieldTokens.kt +31 -0
  117. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/PrimaryNavigationTabTokens.kt +24 -0
  118. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/RadioButtonTokens.kt +22 -0
  119. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ScrimTokens.kt +17 -0
  120. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SearchBarTokens.kt +20 -0
  121. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SearchViewTokens.kt +20 -0
  122. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SecondaryNavigationTabTokens.kt +21 -0
  123. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SegmentedMenuTokens.kt +42 -0
  124. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/ShapeTokens.kt +74 -0
  125. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SheetBottomTokens.kt +20 -0
  126. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SliderTokens.kt +39 -0
  127. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SmallIconButtonTokens.kt +27 -0
  128. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SnackbarTokens.kt +21 -0
  129. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SplitButtonLargeTokens.kt +26 -0
  130. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SplitButtonMediumTokens.kt +26 -0
  131. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SplitButtonSmallTokens.kt +26 -0
  132. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SplitButtonXLargeTokens.kt +26 -0
  133. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SplitButtonXSmallTokens.kt +27 -0
  134. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/StandardMenuTokens.kt +25 -0
  135. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/StandardMotionTokens.kt +27 -0
  136. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/StateTokens.kt +20 -0
  137. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SuggestionChipTokens.kt +25 -0
  138. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/SwitchTokens.kt +37 -0
  139. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/TextButtonTokens.kt +18 -0
  140. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/TimeInputTokens.kt +24 -0
  141. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/TimePickerTokens.kt +30 -0
  142. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/TonalButtonTokens.kt +19 -0
  143. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/TypeScaleTokens.kt +72 -0
  144. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/VibrantMenuTokens.kt +26 -0
  145. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/XLargeIconButtonTokens.kt +27 -0
  146. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/assets/XSmallIconButtonTokens.kt +27 -0
  147. package/android/src/main/java/expo/modules/myui/extended-theme/assets/Tokens/index.kt +217 -0
  148. package/android/src/main/java/expo/modules/myui/extended-theme/index.kt +39 -0
  149. package/android/src/main/java/expo/modules/myui/utils/children.kt +127 -0
  150. package/android/src/main/java/expo/modules/myui/utils/modifiers.kt +45 -0
  151. package/package.json +2 -1
@@ -0,0 +1,168 @@
1
+ package expo.modules.myui
2
+
3
+ import okhttp3.OkHttpClient
4
+ import expo.modules.kotlin.modules.Module
5
+ import expo.modules.kotlin.modules.ModuleDefinition
6
+ import expo.modules.kotlin.records.recordFromMap
7
+
8
+ import expo.modules.ui.ExpoUIView
9
+ import expo.modules.ui.ModifierRegistry
10
+
11
+ //ExtendedTheme
12
+ import expo.modules.myui.theme.colors.ExtendedColorBridge
13
+
14
+ //TypographySlot
15
+ import expo.modules.myui.TypographySlot.TypographySlotBridge
16
+ import expo.modules.myui.TypographySlot.TypographySlotProps
17
+ import expo.modules.myui.TypographySlot.TypographySlotContent
18
+ import expo.modules.myui.foreach.ForEachContent
19
+ import expo.modules.myui.foreach.ForEachItemPressEvent
20
+ import expo.modules.myui.foreach.ForEachProps
21
+ import expo.modules.myui.ListItem.ListItemFromSlots
22
+ import expo.modules.myui.ListItem.ListItemProps
23
+ import expo.modules.myui.section.SectionHostProps
24
+ import expo.modules.myui.section.SectionHostViewContent
25
+ import expo.modules.myui.menu.DropdownMenuContent
26
+ import expo.modules.myui.menu.DropdownMenuProps
27
+ import expo.modules.myui.gradient.GradientProps
28
+ import expo.modules.myui.gradient.GradientViewContent
29
+ import java.io.Serializable
30
+ import expo.modules.kotlin.records.Field
31
+ import expo.modules.kotlin.records.Record
32
+
33
+
34
+ class MyUiModule : Module() {
35
+ var okHttpClient: OkHttpClient? = null
36
+ private set
37
+
38
+ override fun definition() = ModuleDefinition {
39
+ Name("MyUi")
40
+
41
+ OnCreate {
42
+ okHttpClient = OkHttpClient.Builder().build()
43
+ registerModifiers()
44
+ }
45
+
46
+ OnDestroy {
47
+ okHttpClient?.dispatcher?.executorService?.shutdown()
48
+ okHttpClient?.connectionPool?.evictAll()
49
+ okHttpClient?.cache?.close()
50
+ okHttpClient = null
51
+ }
52
+
53
+ Function("getExtendedColor") { name: String, scheme: String ->
54
+ val context = appContext.reactContext ?: throw IllegalStateException("React context is not available")
55
+ ExtendedColorBridge.extendedColorHex(name, scheme, context)
56
+ }
57
+
58
+ Function("getSlotTextStyle") { slotName: String ->
59
+ TypographySlotBridge.slotTextStylePayload(slotName)
60
+ }
61
+
62
+ ExpoUIView<IconProps>("IconView") {
63
+ Content { props ->
64
+ IconViewContent(props)
65
+ }
66
+ }
67
+
68
+ ExpoUIView<GradientProps>("GradientView") {
69
+ Content { props ->
70
+ GradientViewContent(props)
71
+ }
72
+ }
73
+
74
+ ExpoUIView<SearchBarProps>("SearchBarView") {
75
+ val onDismiss by Event<SearchBarDismissEvent>()
76
+ val onChangeText by Event<SearchBarChangeTextEvent>()
77
+
78
+ Content { props ->
79
+ SearchBarViewContent(
80
+ props,
81
+ onDismiss = { onDismiss(SearchBarDismissEvent()) },
82
+ onChangeText = { text ->
83
+ onChangeText(SearchBarChangeTextEvent(text))
84
+ },
85
+ )
86
+ }
87
+ }
88
+
89
+ ExpoUIView<ExtendedThemeProps>("ExtendedTheme") {
90
+ Content { props ->
91
+ ExtendedThemeViewContent(props)
92
+ }
93
+ }
94
+
95
+ ExpoUIView<TypographySlotProps>("TypographySlotView") {
96
+ Content { props ->
97
+ TypographySlotContent(props)
98
+ }
99
+ }
100
+
101
+ ExpoUIView<TextFieldProps>("TextFieldView") {
102
+ val focus by AsyncFunction()
103
+ val blur by AsyncFunction()
104
+ val onValueChange by Event<TextFieldValueChangeEvent>()
105
+ val onFocusChanged by Event<TextFieldFocusChangeEvent>()
106
+ val onKeyboardAction by Event<KeyboardActionEvent>()
107
+
108
+ Content { props ->
109
+ TextFieldContent(
110
+ props,
111
+ focus,
112
+ blur,
113
+ onValueChange = { value ->
114
+ onValueChange(TextFieldValueChangeEvent(value))
115
+ },
116
+ onFocusChanged = { focused ->
117
+ onFocusChanged(TextFieldFocusChangeEvent(focused))
118
+ },
119
+ onKeyboardActionTriggered = { event ->
120
+ onKeyboardAction(event)
121
+ }
122
+ )
123
+ }
124
+ }
125
+
126
+ ExpoUIView<DialogProps>("DialogView") {
127
+ val onDismissRequest by Event<DialogDismissEvent>()
128
+
129
+ Content { props ->
130
+ DialogContent(
131
+ props,
132
+ onDismissRequest = { onDismissRequest(DialogDismissEvent()) },
133
+ )
134
+ }
135
+ }
136
+
137
+ ExpoUIView<DropdownMenuProps>("DropdownMenuView") {
138
+ val onDismissRequest by Event<Unit>()
139
+
140
+ Content { props ->
141
+ DropdownMenuContent(props) { onDismissRequest(Unit) }
142
+ }
143
+ }
144
+
145
+ ExpoUIView<ForEachProps>("ForEach") {
146
+ val onItemPress by Event<ForEachItemPressEvent>()
147
+
148
+ Content { props ->
149
+ ForEachContent(props) { id ->
150
+ onItemPress(ForEachItemPressEvent(id))
151
+ }
152
+ }
153
+ }
154
+
155
+ ExpoUIView<ListItemProps>("ListItemView") {
156
+ Content { props ->
157
+ ListItemFromSlots(props)
158
+ }
159
+ }
160
+
161
+ ExpoUIView<SectionHostProps>("SectionHostView") {
162
+ Content { props ->
163
+ SectionHostViewContent(props)
164
+ }
165
+ }
166
+
167
+ }
168
+ }
@@ -0,0 +1,213 @@
1
+ @file:OptIn(ExperimentalMaterial3Api::class)
2
+
3
+ package expo.modules.myui
4
+
5
+ import androidx.activity.compose.BackHandler
6
+ import androidx.compose.foundation.layout.Box
7
+ import androidx.compose.foundation.layout.fillMaxWidth
8
+ import androidx.compose.foundation.layout.height
9
+ import androidx.compose.foundation.layout.offset
10
+ import androidx.compose.foundation.layout.size
11
+ import androidx.compose.foundation.relocation.BringIntoViewRequester
12
+ import androidx.compose.foundation.relocation.bringIntoViewRequester
13
+ import androidx.compose.foundation.text.input.rememberTextFieldState
14
+ import androidx.compose.material.icons.Icons
15
+ import androidx.compose.material.icons.rounded.ArrowBackIosNew
16
+ import androidx.compose.material.icons.rounded.Clear
17
+ import androidx.compose.material.icons.rounded.Search
18
+ import androidx.compose.material3.ExperimentalMaterial3Api
19
+ import androidx.compose.material3.Icon
20
+ import androidx.compose.material3.IconButton
21
+ import androidx.compose.material3.LocalTextStyle
22
+ import androidx.compose.material3.SearchBarDefaults
23
+ import androidx.compose.material3.Surface
24
+ import androidx.compose.material3.Text
25
+ import androidx.compose.runtime.Composable
26
+ import androidx.compose.runtime.LaunchedEffect
27
+ import androidx.compose.runtime.snapshotFlow
28
+ import androidx.compose.runtime.getValue
29
+ import androidx.compose.runtime.mutableStateOf
30
+ import androidx.compose.runtime.remember
31
+ import androidx.compose.runtime.rememberCoroutineScope
32
+ import androidx.compose.runtime.setValue
33
+ import androidx.compose.ui.Modifier
34
+ import androidx.compose.ui.Alignment
35
+ import androidx.compose.ui.focus.FocusRequester
36
+ import androidx.compose.ui.focus.focusRequester
37
+ import androidx.compose.ui.focus.onFocusChanged
38
+ import androidx.compose.ui.graphics.Color
39
+ import androidx.compose.ui.platform.LocalFocusManager
40
+ import androidx.compose.ui.unit.dp
41
+ import expo.modules.kotlin.views.ComposeProps
42
+ import expo.modules.kotlin.views.FunctionalComposableScope
43
+ import expo.modules.ui.ModifierList
44
+ import kotlinx.coroutines.delay
45
+ import kotlinx.coroutines.launch
46
+
47
+ import expo.modules.myui.theme.tokens.SearchBarTokens
48
+ import expo.modules.myui.theme.ExtendedTheme
49
+
50
+ import java.io.Serializable
51
+ import expo.modules.kotlin.records.Field
52
+ import expo.modules.kotlin.records.Record
53
+
54
+
55
+
56
+ data class SearchBarDismissEvent(
57
+ @Field val dismissed: Boolean = true,
58
+ ) : Record, Serializable
59
+
60
+ data class SearchBarChangeTextEvent(
61
+ @Field val text: String = "",
62
+ ) : Record, Serializable
63
+
64
+
65
+ /**
66
+ * Campo de búsqueda con look de chip M3 (sin expandir a pantalla completa).
67
+ */
68
+ data class SearchBarProps(
69
+ val placeholder: String? = null,
70
+ val autoFocus: Boolean = false,
71
+ /** Si es true, muestra ← clicable; si es false, muestra lupa decorativa. */
72
+ val showBackButton: Boolean = true,
73
+ val modifiers: ModifierList = emptyList(),
74
+ ) : ComposeProps
75
+
76
+ @Composable
77
+ internal fun FunctionalComposableScope.SearchBarViewContent(
78
+ props: SearchBarProps,
79
+ onDismiss: () -> Unit = {},
80
+ onChangeText: (String) -> Unit = {},
81
+ ) {
82
+ val textFieldState = rememberTextFieldState()
83
+ val focusRequester = remember { FocusRequester() }
84
+ val bringIntoViewRequester = remember { BringIntoViewRequester() }
85
+ val scope = rememberCoroutineScope()
86
+ val focusManager = LocalFocusManager.current
87
+ var isFocused by remember { mutableStateOf(false) }
88
+
89
+ val dismiss = {
90
+ focusManager.clearFocus()
91
+ onChangeText("")
92
+ onDismiss()
93
+ }
94
+
95
+ if (props.autoFocus) {
96
+ LaunchedEffect(Unit) {
97
+ delay(150)
98
+ runCatching { focusRequester.requestFocus() }
99
+ }
100
+ }
101
+
102
+ BackHandler(enabled = props.showBackButton && isFocused) {
103
+ dismiss()
104
+ }
105
+
106
+ LaunchedEffect(textFieldState) {
107
+ try {
108
+ snapshotFlow { textFieldState.text.toString() }.collect { text ->
109
+ onChangeText(text)
110
+ }
111
+ } finally {
112
+ onChangeText("")
113
+ }
114
+ }
115
+
116
+ val labelColor = ExtendedTheme.colorScheme.label
117
+ val placeholderColor = ExtendedTheme.colorScheme.placeholderText
118
+ val fieldTextStyle = LocalTextStyle.current
119
+
120
+ Surface(
121
+ modifier = Modifier
122
+ .fillMaxWidth()
123
+ .height(SearchBarTokens.ContainerHeight),
124
+ shape = SearchBarDefaults.inputFieldShape,
125
+ color = ExtendedTheme.colorScheme.secondarySystemGroupedBackground,
126
+
127
+ ) {
128
+ SearchBarDefaults.InputField(
129
+ state = textFieldState,
130
+ onSearch = { focusManager.clearFocus() },
131
+ expanded = false,
132
+ onExpandedChange = { /* nunca expandir */ },
133
+ textStyle = fieldTextStyle,
134
+ placeholder = {
135
+ val text = props.placeholder
136
+ if (!text.isNullOrBlank()) {
137
+ Text(
138
+ text = text,
139
+ style = fieldTextStyle,
140
+ color = placeholderColor,
141
+ )
142
+ }
143
+ },
144
+ leadingIcon = {
145
+ if (props.showBackButton) {
146
+ IconButton(
147
+ onClick = dismiss,
148
+ ) {
149
+ Icon(
150
+ imageVector = Icons.Rounded.ArrowBackIosNew,
151
+ contentDescription = "Volver",
152
+ tint = labelColor,
153
+ modifier = Modifier.size(20.dp),
154
+ )
155
+ }
156
+ } else {
157
+ Icon(
158
+ imageVector = Icons.Rounded.Search,
159
+ contentDescription = "Buscar",
160
+ tint = labelColor,
161
+ modifier = Modifier.size(24.dp),
162
+ )
163
+ }
164
+ },
165
+ trailingIcon = {
166
+ if (textFieldState.text.isNotEmpty()) {
167
+ IconButton(
168
+ onClick = {
169
+ textFieldState.edit {
170
+ replace(0, length, "")
171
+ }
172
+ }
173
+ ) {
174
+ Icon(
175
+ imageVector = Icons.Rounded.Clear,
176
+ contentDescription = "Borrar",
177
+ tint = labelColor,
178
+ modifier = Modifier.size(24.dp),
179
+ )
180
+ }
181
+ }
182
+ },
183
+ modifier = Modifier
184
+ .fillMaxWidth()
185
+ .focusRequester(focusRequester)
186
+ .bringIntoViewRequester(bringIntoViewRequester)
187
+ .onFocusChanged { focusState ->
188
+ isFocused = focusState.isFocused
189
+ if (focusState.isFocused) {
190
+ scope.launch {
191
+ delay(100)
192
+ bringIntoViewRequester.bringIntoView()
193
+ }
194
+ }
195
+ },
196
+ shape = SearchBarDefaults.inputFieldShape,
197
+ colors = SearchBarDefaults.inputFieldColors(
198
+ focusedTextColor = labelColor,
199
+ unfocusedTextColor = labelColor,
200
+ focusedPlaceholderColor = placeholderColor,
201
+ unfocusedPlaceholderColor = placeholderColor,
202
+ focusedLeadingIconColor = labelColor,
203
+ unfocusedLeadingIconColor = labelColor,
204
+ focusedTrailingIconColor = labelColor,
205
+ unfocusedTrailingIconColor = labelColor,
206
+ cursorColor = ExtendedTheme.colorScheme.systemBlue,
207
+ focusedContainerColor = Color.Transparent,
208
+ unfocusedContainerColor = Color.Transparent,
209
+ disabledContainerColor = Color.Transparent,
210
+ ),
211
+ )
212
+ }
213
+ }
@@ -0,0 +1,81 @@
1
+ package expo.modules.myui.section
2
+
3
+ import android.view.View
4
+ import android.view.ViewGroup
5
+ import androidx.compose.runtime.mutableIntStateOf
6
+ import expo.modules.kotlin.views.ExpoComposeView
7
+ import expo.modules.myui.ListItem.ListItemProps
8
+
9
+ internal val SectionHostStateTag = Any()
10
+ internal const val LIST_ITEM_VIEW_NAME = "ListItemView"
11
+
12
+ data class SectionItemPosition(
13
+ val isFirst: Boolean,
14
+ val isLast: Boolean,
15
+ )
16
+
17
+ internal class SectionHostState {
18
+ val generation = mutableIntStateOf(0)
19
+ private val positions = mutableMapOf<ExpoComposeView<*>, SectionItemPosition>()
20
+
21
+ fun update(listItems: List<ExpoComposeView<*>>) {
22
+ positions.clear()
23
+ listItems.forEachIndexed { index, view ->
24
+ positions[view] = SectionItemPosition(
25
+ isFirst = index == 0,
26
+ isLast = index == listItems.lastIndex,
27
+ )
28
+ }
29
+ generation.intValue++
30
+ }
31
+
32
+ fun positionFor(view: ExpoComposeView<*>): SectionItemPosition? = positions[view]
33
+ }
34
+
35
+ internal fun isListItemView(view: ExpoComposeView<*>): Boolean {
36
+ if (view.props is ListItemProps) return true
37
+ return view.javaClass.name.contains(LIST_ITEM_VIEW_NAME, ignoreCase = true)
38
+ }
39
+
40
+ internal fun ViewGroup.collectListItemViewsDeep(): List<ExpoComposeView<*>> {
41
+ val result = mutableListOf<ExpoComposeView<*>>()
42
+ collectListItemViewsDeepInto(result)
43
+ return result
44
+ }
45
+
46
+ private fun ViewGroup.collectListItemViewsDeepInto(out: MutableList<ExpoComposeView<*>>) {
47
+ for (i in 0 until childCount) {
48
+ when (val child = getChildAt(i)) {
49
+ is ExpoComposeView<*> -> {
50
+ if (isListItemView(child)) {
51
+ out.add(child)
52
+ }
53
+ if (child is ViewGroup) {
54
+ child.collectListItemViewsDeepInto(out)
55
+ }
56
+ }
57
+ is ViewGroup -> child.collectListItemViewsDeepInto(out)
58
+ }
59
+ }
60
+ }
61
+
62
+ internal fun View.findSectionHostState(): SectionHostState? {
63
+ var current: View? = this
64
+ while (current != null) {
65
+ (current.tag as? SectionHostState)?.let { return it }
66
+ current = current.parent as? View
67
+ }
68
+ return null
69
+ }
70
+
71
+ internal fun ExpoComposeView<*>.sectionItemPosition(props: ListItemProps): SectionItemPosition? {
72
+ props.isFirst?.let { isFirst ->
73
+ props.isLast?.let { isLast ->
74
+ return SectionItemPosition(isFirst = isFirst, isLast = isLast)
75
+ }
76
+ }
77
+ val hostState = (this as View).findSectionHostState() ?: return null
78
+ @Suppress("UNUSED_VARIABLE")
79
+ val generation = hostState.generation.intValue
80
+ return hostState.positionFor(this)
81
+ }
@@ -0,0 +1,65 @@
1
+ package expo.modules.myui.section
2
+
3
+ import android.view.View
4
+ import android.view.ViewGroup
5
+ import androidx.compose.runtime.Composable
6
+ import androidx.compose.runtime.DisposableEffect
7
+ import androidx.compose.runtime.getValue
8
+ import androidx.compose.runtime.mutableIntStateOf
9
+ import androidx.compose.runtime.remember
10
+ import androidx.compose.runtime.setValue
11
+ import expo.modules.kotlin.views.ComposeProps
12
+ import expo.modules.kotlin.views.FunctionalComposableScope
13
+ import expo.modules.myui.Children
14
+ import expo.modules.myui.getHost
15
+ import expo.modules.ui.ModifierList
16
+
17
+ data class SectionHostProps(
18
+ val modifiers: ModifierList = emptyList(),
19
+ ) : ComposeProps
20
+
21
+ @Composable
22
+ internal fun FunctionalComposableScope.SectionHostViewContent(
23
+ @Suppress("UNUSED_PARAMETER") props: SectionHostProps,
24
+ ) {
25
+ val host = getHost() ?: return
26
+ val state = remember(host) {
27
+ SectionHostState().also { host.tag = it }
28
+ }
29
+ var childGeneration by remember(host) { mutableIntStateOf(host.childCount) }
30
+
31
+ DisposableEffect(host) {
32
+ fun syncPositions() {
33
+ val count = host.childCount
34
+ if (childGeneration != count) {
35
+ childGeneration = count
36
+ }
37
+ state.update(host.collectListItemViewsDeep())
38
+ }
39
+
40
+ syncPositions()
41
+
42
+ val hierarchyListener = object : ViewGroup.OnHierarchyChangeListener {
43
+ override fun onChildViewAdded(parent: View?, child: View?) = syncPositions()
44
+ override fun onChildViewRemoved(parent: View?, child: View?) = syncPositions()
45
+ }
46
+
47
+ val layoutListener = View.OnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
48
+ syncPositions()
49
+ }
50
+
51
+ host.setOnHierarchyChangeListener(hierarchyListener)
52
+ host.addOnLayoutChangeListener(layoutListener)
53
+
54
+ onDispose {
55
+ host.setOnHierarchyChangeListener(null)
56
+ host.removeOnLayoutChangeListener(layoutListener)
57
+ host.tag = null
58
+ }
59
+ }
60
+
61
+ @Suppress("UNUSED_VARIABLE")
62
+ val generation = state.generation.intValue
63
+
64
+ Children()
65
+ }