pytech-ui 1.0.21 → 1.0.23

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
File without changes
File without changes
@@ -0,0 +1,2 @@
1
+ #Mon Sep 14 18:01:28 ART 2026
2
+ gradle.version=8.9
@@ -0,0 +1 @@
1
+ 277F12787C3C06CBD298FA21C831738A44C655A9122E1F7A1727D9220740B05B
File without changes
@@ -0,0 +1,47 @@
1
+ buildscript {
2
+ repositories {
3
+ mavenCentral()
4
+ }
5
+ dependencies {
6
+ classpath("org.jetbrains.kotlin.plugin.compose:org.jetbrains.kotlin.plugin.compose.gradle.plugin:${kotlinVersion}")
7
+ }
8
+ }
9
+
10
+ plugins {
11
+ id 'com.android.library'
12
+ id 'expo-module-gradle-plugin'
13
+ }
14
+ apply plugin: 'org.jetbrains.kotlin.plugin.compose'
15
+
16
+ group = 'expo.modules.myui'
17
+ version = '0.1.0'
18
+
19
+ android {
20
+ namespace "expo.modules.myui"
21
+ defaultConfig {
22
+ versionCode 1
23
+ versionName "0.1.0"
24
+ }
25
+ buildFeatures {
26
+ compose true
27
+ }
28
+ lintOptions {
29
+ abortOnError false
30
+ }
31
+ }
32
+
33
+ dependencies {
34
+ implementation 'androidx.activity:activity-compose:1.10.1'
35
+ implementation 'androidx.compose.foundation:foundation-android:1.10.6'
36
+ implementation 'androidx.compose.ui:ui-android:1.10.6'
37
+ implementation 'androidx.compose.material3:material3-android:1.5.0-alpha17'
38
+ if (findProject(':expo-ui') != null) {
39
+ implementation project(':expo-ui')
40
+ } else {
41
+ implementation 'expo.modules.ui:expo.modules.ui:+'
42
+ }
43
+
44
+ implementation 'androidx.compose.material:material-icons-extended:1.7.8'
45
+ implementation 'com.squareup.okhttp3:okhttp:4.11.0'
46
+ implementation 'org.jetbrains.kotlin:kotlin-reflect'
47
+ }
@@ -0,0 +1,2 @@
1
+ <manifest>
2
+ </manifest>
@@ -0,0 +1,39 @@
1
+ package expo.modules.myui
2
+
3
+ import androidx.compose.runtime.Composable
4
+ import androidx.compose.ui.window.Dialog
5
+ import androidx.compose.ui.window.DialogProperties
6
+ import expo.modules.kotlin.records.Field
7
+ import expo.modules.kotlin.records.Record
8
+ import expo.modules.kotlin.views.ComposeProps
9
+ import expo.modules.kotlin.views.FunctionalComposableScope
10
+ import expo.modules.kotlin.views.OptimizedComposeProps
11
+ import expo.modules.ui.ExpoDialogProperties
12
+ import java.io.Serializable
13
+
14
+ data class DialogDismissEvent(
15
+ @Field val dismissed: Boolean = true,
16
+ ) : Record, Serializable
17
+
18
+ @OptimizedComposeProps
19
+ data class DialogProps(
20
+ val properties: ExpoDialogProperties = ExpoDialogProperties(),
21
+ ) : ComposeProps
22
+
23
+ @Composable
24
+ internal fun FunctionalComposableScope.DialogContent(
25
+ props: DialogProps,
26
+ onDismissRequest: () -> Unit,
27
+ ) {
28
+ Dialog(
29
+ onDismissRequest = onDismissRequest,
30
+ properties = DialogProperties(
31
+ dismissOnBackPress = props.properties.dismissOnBackPress,
32
+ dismissOnClickOutside = props.properties.dismissOnClickOutside,
33
+ usePlatformDefaultWidth = props.properties.usePlatformDefaultWidth,
34
+ decorFitsSystemWindows = props.properties.decorFitsSystemWindows,
35
+ ),
36
+ ) {
37
+ Children()
38
+ }
39
+ }
@@ -0,0 +1,23 @@
1
+ package expo.modules.myui.foreach
2
+
3
+ import expo.modules.kotlin.records.Field
4
+ import expo.modules.kotlin.records.Record
5
+ import expo.modules.kotlin.views.ComposeProps
6
+ import expo.modules.kotlin.views.OptimizedComposeProps
7
+ import expo.modules.myui.ListItem.ListItemDataRecord
8
+ import expo.modules.ui.ModifierList
9
+ import java.io.Serializable
10
+
11
+ data class ForEachItemPressEvent(
12
+ @Field val id: String = "",
13
+ ) : Record, Serializable
14
+
15
+ @OptimizedComposeProps
16
+ data class ForEachProps(
17
+ val data: List<ListItemDataRecord> = emptyList(),
18
+ val contentPaddingStart: Double = 16.0,
19
+ val contentPaddingEnd: Double = 16.0,
20
+ val contentPaddingTop: Double = 0.0,
21
+ val contentPaddingBottom: Double = 0.0,
22
+ val modifiers: ModifierList = emptyList(),
23
+ ) : ComposeProps
@@ -0,0 +1,82 @@
1
+ package expo.modules.myui.foreach
2
+
3
+ import androidx.compose.foundation.layout.PaddingValues
4
+ import androidx.compose.foundation.layout.fillMaxWidth
5
+ import androidx.compose.foundation.layout.padding
6
+ import androidx.compose.foundation.lazy.LazyColumn
7
+ import androidx.compose.foundation.lazy.itemsIndexed
8
+ import androidx.compose.foundation.shape.RoundedCornerShape
9
+ import androidx.compose.runtime.Composable
10
+ import androidx.compose.ui.Modifier
11
+ import androidx.compose.ui.draw.clip
12
+ import androidx.compose.ui.unit.dp
13
+ import expo.modules.kotlin.views.FunctionalComposableScope
14
+ import expo.modules.myui.ListItem.ListItemFromData
15
+ import expo.modules.myui.ListItem.toListItemProps
16
+ import expo.modules.myui.findChildBySlotName
17
+ import expo.modules.myui.theme.tokens.ShapeTokens
18
+ import expo.modules.ui.ModifierRegistry
19
+
20
+ @Composable
21
+ fun FunctionalComposableScope.ForEachContent(
22
+ props: ForEachProps,
23
+ onItemPress: (String) -> Unit,
24
+ ) {
25
+ val headerSlot = findChildBySlotName("header")
26
+ val footerSlot = findChildBySlotName("footer")
27
+ val horizontalInset = props.contentPaddingStart.dp
28
+
29
+ LazyColumn(
30
+ modifier = ModifierRegistry.applyModifiers(
31
+ props.modifiers,
32
+ appContext,
33
+ composableScope,
34
+ globalEventDispatcher,
35
+ )
36
+ .fillMaxWidth()
37
+ .padding(horizontal = horizontalInset)
38
+ .clip(RoundedCornerShape(ShapeTokens.CornerValueExtraLarge)),
39
+ contentPadding = PaddingValues(
40
+ top = props.contentPaddingTop.dp,
41
+ bottom = props.contentPaddingBottom.dp,
42
+ ),
43
+ ) {
44
+ headerSlot?.let { slot ->
45
+ item(key = "__foreach_header__") {
46
+ with(composableScope) {
47
+ with(slot) {
48
+ Content()
49
+ }
50
+ }
51
+ }
52
+ }
53
+
54
+ if (props.data.isNotEmpty()) {
55
+ itemsIndexed(
56
+ items = props.data,
57
+ key = { _, item -> item.id },
58
+ ) { index, item ->
59
+ ListItemFromData(
60
+
61
+ props = item.listItemProps.toListItemProps(
62
+ isFirst = index == 0,
63
+ isLast = index == props.data.lastIndex,
64
+ ),
65
+
66
+ content = item.content,
67
+ onPress = { onItemPress(item.id) },
68
+ )
69
+ }
70
+ }
71
+
72
+ footerSlot?.let { slot ->
73
+ item(key = "__foreach_footer__") {
74
+ with(composableScope) {
75
+ with(slot) {
76
+ Content()
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
@@ -0,0 +1,124 @@
1
+ package expo.modules.myui.gradient
2
+
3
+ import android.graphics.Color
4
+ import androidx.compose.foundation.background
5
+ import androidx.compose.foundation.layout.Box
6
+ import androidx.compose.foundation.layout.size
7
+ import androidx.compose.foundation.shape.RoundedCornerShape
8
+ import androidx.compose.material3.Icon
9
+ import androidx.compose.material3.Text
10
+ import androidx.compose.runtime.Composable
11
+ import androidx.compose.ui.Alignment
12
+ import androidx.compose.ui.Modifier
13
+ import androidx.compose.ui.draw.clip
14
+ import androidx.compose.ui.graphics.Brush
15
+ import androidx.compose.ui.graphics.Color as ComposeColor
16
+ import androidx.compose.ui.text.font.FontWeight
17
+ import androidx.compose.ui.unit.Dp
18
+ import androidx.compose.ui.unit.dp
19
+ import androidx.compose.ui.unit.sp
20
+ import expo.modules.kotlin.records.Field
21
+ import expo.modules.kotlin.records.Record
22
+ import expo.modules.kotlin.views.ComposeProps
23
+ import expo.modules.kotlin.views.FunctionalComposableScope
24
+ import expo.modules.myui.components.Icon.parseIconSource
25
+ import expo.modules.myui.getModifier
26
+ import expo.modules.myui.theme.ExtendedTheme
27
+ import expo.modules.ui.ModifierList
28
+ import expo.modules.ui.compose
29
+
30
+ data class GradientPaletteRecord(
31
+ @Field val light: Color? = null,
32
+ @Field val dark: Color? = null,
33
+ ) : Record
34
+
35
+ data class GradientProps(
36
+ val text: String? = null,
37
+ val fontSize: Double? = null,
38
+ val size: Double? = null,
39
+ val colors: GradientPaletteRecord? = null,
40
+ val source: String? = null,
41
+ val iconSize: Double? = null,
42
+ val modifiers: ModifierList = emptyList(),
43
+ ) : ComposeProps
44
+
45
+ @Composable
46
+ internal fun FunctionalComposableScope.GradientViewContent(props: GradientProps) {
47
+ GradientCircle(
48
+ modifier = getModifier(props.modifiers),
49
+ text = props.text,
50
+ fontSize = props.fontSize?.toFloat(),
51
+ sizeDp = props.size?.toFloat(),
52
+ lightColor = props.colors?.light?.compose,
53
+ darkColor = props.colors?.dark?.compose,
54
+ source = props.source,
55
+ iconSize = props.iconSize?.toFloat(),
56
+ )
57
+ }
58
+
59
+ @Composable
60
+ internal fun GradientCircle(
61
+ modifier: Modifier = Modifier,
62
+ text: String? = null,
63
+ fontSize: Float? = null,
64
+ sizeDp: Float? = null,
65
+ lightColor: ComposeColor? = null,
66
+ darkColor: ComposeColor? = null,
67
+ source: String? = null,
68
+ iconSize: Float? = null,
69
+ ) {
70
+ val diameter = sizeDp?.dp ?: return
71
+ val gradientColors = resolveGradientColors(lightColor, darkColor)
72
+
73
+ Box(
74
+ modifier = modifier
75
+ .size(diameter)
76
+ .clip(RoundedCornerShape(percent = 50)),
77
+ contentAlignment = Alignment.Center,
78
+ ) {
79
+ Box(
80
+ modifier = Modifier
81
+ .matchParentSize()
82
+ .background(Brush.verticalGradient(gradientColors)),
83
+ )
84
+ when {
85
+ !text.isNullOrBlank() -> {
86
+ Text(
87
+ text = text,
88
+ color = ComposeColor.White,
89
+ fontWeight = FontWeight.Bold,
90
+ letterSpacing = (-0.5).sp,
91
+ fontSize = (fontSize ?: 24f).sp,
92
+ )
93
+ }
94
+ !source.isNullOrBlank() -> {
95
+ parseIconSource(source)?.let { imageVector ->
96
+ Icon(
97
+ imageVector = imageVector,
98
+ contentDescription = null,
99
+ tint = ComposeColor.White,
100
+ modifier = Modifier.size(iconSizeDp(iconSize, diameter)),
101
+ )
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+
108
+ private fun iconSizeDp(iconSize: Float?, diameter: Dp): Dp {
109
+ return (iconSize ?: (diameter.value / 2f)).dp
110
+ }
111
+
112
+ @Composable
113
+ private fun resolveGradientColors(
114
+ light: ComposeColor?,
115
+ dark: ComposeColor?,
116
+ ): List<ComposeColor> = when {
117
+ light != null && dark != null -> listOf(light, dark)
118
+ light != null -> listOf(light, light)
119
+ dark != null -> listOf(dark, dark)
120
+ else -> listOf(
121
+ ExtendedTheme.colorScheme.link.copy(alpha = 0.85f),
122
+ ExtendedTheme.colorScheme.link,
123
+ )
124
+ }
@@ -0,0 +1,36 @@
1
+ package expo.modules.myui
2
+
3
+ import android.graphics.Color
4
+ import androidx.compose.material3.Icon
5
+ import androidx.compose.material3.LocalContentColor
6
+ import androidx.compose.runtime.Composable
7
+ import androidx.compose.ui.Modifier
8
+ import expo.modules.kotlin.views.ComposeProps
9
+ import expo.modules.kotlin.views.FunctionalComposableScope
10
+ import expo.modules.myui.components.Icon.parseIconSource
11
+ import expo.modules.ui.ModifierList
12
+ import expo.modules.ui.compose
13
+ import androidx.compose.material3.MaterialTheme
14
+
15
+
16
+ /**
17
+ * Props del icono. `View("IconView")` usa [kotlin.reflect.full.createInstance]: todos los
18
+ * parámetros del constructor primario deben tener valor por defecto.
19
+ */
20
+ data class IconProps(
21
+ val source: String? = null,
22
+ val contentDescription: String? = null,
23
+ val tint: Color? = null,
24
+ val modifiers: ModifierList = emptyList()
25
+ ) : ComposeProps
26
+
27
+ @Composable
28
+ internal fun FunctionalComposableScope.IconViewContent(props: IconProps) {
29
+ val imageVector = parseIconSource(props.source) ?: return
30
+ Icon(
31
+ imageVector = imageVector,
32
+ contentDescription = props.contentDescription,
33
+ tint = props.tint?.compose ?: LocalContentColor.current,
34
+ modifier = getModifier(props.modifiers),
35
+ )
36
+ }
@@ -0,0 +1,43 @@
1
+ package expo.modules.myui.components.Icon
2
+
3
+ import androidx.compose.material.icons.Icons
4
+ import androidx.compose.ui.graphics.vector.ImageVector
5
+
6
+ private fun getMaterialIconByName(name: String, theme: String = "Filled"): ImageVector? {
7
+ return try {
8
+ val (packagePath, themeInstance) = when (theme.lowercase()) {
9
+ "filled", "default" -> "filled" to Icons.Filled
10
+ "outlined" -> "outlined" to Icons.Outlined
11
+ "rounded" -> "rounded" to Icons.Rounded
12
+ "twotone", "two_tone", "two-tone" -> "twotone" to Icons.TwoTone
13
+ "sharp" -> "sharp" to Icons.Sharp
14
+ else -> "filled" to Icons.Filled
15
+ }
16
+
17
+ val className = "androidx.compose.material.icons.${packagePath}.${name}Kt"
18
+ val cl = Class.forName(className)
19
+ val method = cl.declaredMethods.first()
20
+ method.invoke(null, themeInstance) as ImageVector
21
+ } catch (e: Exception) {
22
+ null
23
+ }
24
+ }
25
+
26
+ fun parseIconSource(source: String?): ImageVector? {
27
+ if (source.isNullOrBlank()) return null
28
+
29
+ // Quita el prefijo "Icons." si viene
30
+ val withoutPrefix = if (source.startsWith("Icons.")) source.removePrefix("Icons.") else source
31
+ // withoutPrefix puede ser: "Filled.Favorite"
32
+
33
+ val parts = withoutPrefix.split(".")
34
+ return when {
35
+ parts.size >= 2 -> {
36
+ // "Filled.Favorite"
37
+ val theme = parts[0] // "Filled"
38
+ val name = parts.drop(1).joinToString("") // "Favorite"
39
+ getMaterialIconByName(name, theme)
40
+ }
41
+ else -> null
42
+ }
43
+ }
@@ -0,0 +1,84 @@
1
+ package expo.modules.myui.ListItem
2
+
3
+ import android.graphics.Color
4
+ import expo.modules.kotlin.records.Field
5
+ import expo.modules.kotlin.records.Record
6
+ import expo.modules.myui.gradient.GradientPaletteRecord
7
+ import expo.modules.ui.ModifierList
8
+ import expo.modules.ui.TextAlignType
9
+ import expo.modules.ui.TextDecorationType
10
+ import expo.modules.ui.TextFontStyle
11
+ import expo.modules.ui.TextFontWeight
12
+ import expo.modules.ui.TextOverflowType
13
+
14
+ /** Props serializables de un slot según su [ListItemSlotContentRecord.type]. */
15
+ data class ListItemSlotPropsRecord(
16
+ // Text
17
+ @Field val text: String? = null,
18
+ @Field val color: Color? = null,
19
+ @Field val fontSize: Float? = null,
20
+ @Field val fontWeight: TextFontWeight? = null,
21
+ @Field val fontStyle: TextFontStyle? = null,
22
+ @Field val fontFamily: String? = null,
23
+ @Field val textDecoration: TextDecorationType? = null,
24
+ @Field val letterSpacing: Float? = null,
25
+ @Field val lineHeight: Float? = null,
26
+ @Field val textAlign: TextAlignType? = null,
27
+ @Field val overflow: TextOverflowType? = null,
28
+ @Field val maxLines: Int? = null,
29
+ // Icon
30
+ @Field val source: String? = null,
31
+ @Field val contentDescription: String? = null,
32
+ @Field val tint: Color? = null,
33
+ // Gradient
34
+ @Field val size: Double? = null,
35
+ @Field val colors: GradientPaletteRecord? = null,
36
+ @Field val iconSize: Double? = null,
37
+ @Field val modifiers: ModifierList = emptyList(),
38
+ ) : Record
39
+
40
+ data class ListItemSlotContentRecord(
41
+ @Field val type: String = "text",
42
+ @Field val props: ListItemSlotPropsRecord? = null,
43
+ ) : Record
44
+
45
+ /** Slots serializables de la fila. */
46
+ data class ListItemContentRecord(
47
+ @Field val leadingContent: ListItemSlotContentRecord? = null,
48
+ @Field val headlineContent: ListItemSlotContentRecord? = null,
49
+ @Field val trailingContent: ListItemSlotContentRecord? = null,
50
+ @Field val overlineContent: ListItemSlotContentRecord? = null,
51
+ @Field val supportingContent: ListItemSlotContentRecord? = null,
52
+ ) : Record
53
+
54
+ /** Misma forma que [ListItemProps], serializable para el bridge. */
55
+ data class ListItemPropsRecord(
56
+ @Field val showDivider: Boolean = true,
57
+ @Field val isFirst: Boolean? = null,
58
+ @Field val isLast: Boolean? = null,
59
+ @Field val hasNavigationLink: Boolean? = null,
60
+ @Field val tonalElevation: Float? = null,
61
+ @Field val shadowElevation: Float? = null,
62
+ @Field val colors: ListItemColorsRecord? = null,
63
+ @Field val modifiers: ModifierList = emptyList(),
64
+ ) : Record
65
+
66
+ data class ListItemDataRecord(
67
+ @Field val id: String = "",
68
+ @Field val content: ListItemContentRecord = ListItemContentRecord(),
69
+ @Field val listItemProps: ListItemPropsRecord = ListItemPropsRecord(),
70
+ ) : Record
71
+
72
+ internal fun ListItemPropsRecord.toListItemProps(
73
+ isFirst: Boolean,
74
+ isLast: Boolean,
75
+ ) = ListItemProps(
76
+ showDivider = showDivider,
77
+ isFirst = isFirst,
78
+ isLast = isLast,
79
+ hasNavigationLink = hasNavigationLink,
80
+ tonalElevation = tonalElevation,
81
+ shadowElevation = shadowElevation,
82
+ colors = colors,
83
+ modifiers = modifiers,
84
+ )
@@ -0,0 +1,127 @@
1
+ package expo.modules.myui.ListItem
2
+
3
+ import androidx.compose.foundation.clickable
4
+ import androidx.compose.foundation.layout.fillMaxWidth
5
+ import androidx.compose.foundation.layout.size
6
+ import androidx.compose.material3.Icon
7
+ import androidx.compose.material3.Text
8
+ import androidx.compose.runtime.Composable
9
+ import androidx.compose.ui.Modifier
10
+ import androidx.compose.ui.text.style.TextOverflow
11
+ import androidx.compose.ui.unit.dp
12
+ import expo.modules.kotlin.views.FunctionalComposableScope
13
+ import expo.modules.myui.TypographySlot.Typographies
14
+ import expo.modules.myui.gradient.GradientCircle
15
+ import expo.modules.myui.components.Icon.parseIconSource
16
+ import expo.modules.myui.getModifier
17
+ import expo.modules.myui.theme.ExtendedTheme
18
+ import expo.modules.myui.theme.tokens.ListTokens
19
+ import expo.modules.ui.TextOverflowType
20
+ import expo.modules.ui.compose
21
+
22
+ @Composable
23
+ internal fun FunctionalComposableScope.ListItemFromData(
24
+ props: ListItemProps,
25
+ content: ListItemContentRecord,
26
+ onPress: (() -> Unit)?,
27
+ ) {
28
+ val isFirst = props.isFirst ?: true
29
+ val isLast = props.isLast ?: true
30
+ val pressModifier = if (onPress != null) Modifier.clickable(onClick = onPress) else Modifier
31
+
32
+ Decorator(
33
+ isFirst = isFirst,
34
+ isLast = isLast,
35
+ showDivider = props.showDivider,
36
+ modifier = getModifier(props.modifiers).then(pressModifier),
37
+ ) { innerProps ->
38
+ ListItemDynamic(
39
+ props = props,
40
+ modifier = Modifier.fillMaxWidth(),
41
+ innerProps = innerProps,
42
+ leadingContent = content.leadingContent?.let { slot ->
43
+ { RenderSlotContent("leadingcontent", slot) }
44
+ },
45
+ overlineContent = content.overlineContent?.let { slot ->
46
+ { RenderSlotContent("overlinecontent", slot) }
47
+ },
48
+ supportingContent = content.supportingContent?.let { slot ->
49
+ { RenderSlotContent("supportingcontent", slot) }
50
+ },
51
+ headlineContent = content.headlineContent?.let { slot ->
52
+ { RenderSlotContent("headlinecontent", slot) }
53
+ },
54
+ trailingContent = content.trailingContent?.let { slot ->
55
+ { RenderSlotContent("trailingcontent", slot) }
56
+ },
57
+ )
58
+ }
59
+ }
60
+
61
+ @Composable
62
+ private fun FunctionalComposableScope.RenderSlotContent(
63
+ slotName: String,
64
+ content: ListItemSlotContentRecord,
65
+ ) {
66
+ val slotProps = content.props ?: return
67
+
68
+ when (content.type) {
69
+ "gradient" -> GradientSlotContent(slotProps)
70
+ "icon" -> IconSlotContent(slotProps)
71
+ else -> TextSlotContent(slotName, slotProps)
72
+ }
73
+ }
74
+
75
+ @Composable
76
+ private fun FunctionalComposableScope.IconSlotContent(props: ListItemSlotPropsRecord) {
77
+ val imageVector = parseIconSource(props.source) ?: return
78
+ val sizeModifier = props.size?.toFloat()?.dp?.let { Modifier.size(it) }
79
+ ?: Modifier.size(ListTokens.ItemLeadingIconSize)
80
+
81
+ Icon(
82
+ imageVector = imageVector,
83
+ contentDescription = props.contentDescription,
84
+ tint = props.tint?.compose ?: ExtendedTheme.colorScheme.link,
85
+ modifier = getModifier(props.modifiers).then(sizeModifier),
86
+ )
87
+ }
88
+
89
+ @Composable
90
+ private fun GradientSlotContent(props: ListItemSlotPropsRecord) {
91
+ GradientCircle(
92
+ text = props.text,
93
+ fontSize = props.fontSize,
94
+ sizeDp = props.size?.toFloat(),
95
+ lightColor = props.colors?.light?.compose,
96
+ darkColor = props.colors?.dark?.compose,
97
+ source = props.source,
98
+ iconSize = props.iconSize?.toFloat(),
99
+ )
100
+ }
101
+
102
+ @Composable
103
+ private fun FunctionalComposableScope.TextSlotContent(
104
+ slotName: String,
105
+ props: ListItemSlotPropsRecord,
106
+ ) {
107
+ val text = props.text ?: return
108
+ val spec = Typographies.specs[slotName.lowercase()]
109
+
110
+ Text(
111
+ text = text,
112
+ modifier = getModifier(props.modifiers).then(
113
+ if (slotName == "headlinecontent") Modifier.fillMaxWidth() else Modifier
114
+ ),
115
+ maxLines = props.maxLines ?: spec?.maxLines ?: Int.MAX_VALUE,
116
+ overflow = props.overflow?.toComposeTextOverflow()
117
+ ?: spec?.overflow?.toComposeTextOverflow()
118
+ ?: TextOverflow.Clip,
119
+ )
120
+ }
121
+
122
+ private fun String.toComposeTextOverflow(): TextOverflow? = when (lowercase()) {
123
+ "clip" -> TextOverflow.Clip
124
+ "ellipsis" -> TextOverflow.Ellipsis
125
+ "visible" -> TextOverflow.Visible
126
+ else -> null
127
+ }