pythonx-compose 0.1.0a1__py3-none-any.whl
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.
- pythonx/compose/__init__.py +4 -0
- pythonx/compose/__init__.pyi +1 -0
- pythonx/compose/_reexport.py +512 -0
- pythonx/compose/foundation/__init__.py +5 -0
- pythonx/compose/foundation/__init__.pyi +17 -0
- pythonx/compose/foundation/layout/__init__.py +5 -0
- pythonx/compose/foundation/layout/__init__.pyi +2 -0
- pythonx/compose/foundation/text/__init__.py +5 -0
- pythonx/compose/foundation/text/input/__init__.py +5 -0
- pythonx/compose/foundation/text/input/__init__.pyi +78 -0
- pythonx/compose/layout/__init__.py +25 -0
- pythonx/compose/layout/__init__.pyi +878 -0
- pythonx/compose/layout/arrangement.py +34 -0
- pythonx/compose/material/__init__.py +8 -0
- pythonx/compose/material/__init__.pyi +1 -0
- pythonx/compose/material/icons/__init__.py +9 -0
- pythonx/compose/material/icons/__init__.pyi +1159 -0
- pythonx/compose/material3/__init__.py +24 -0
- pythonx/compose/material3/__init__.pyi +3305 -0
- pythonx/compose/py.typed +0 -0
- pythonx/compose/pythonx-map.toml +73 -0
- pythonx/compose/runtime/__init__.py +128 -0
- pythonx/compose/runtime/__init__.pyi +180 -0
- pythonx/compose/ui/__init__.py +21 -0
- pythonx/compose/ui/__init__.pyi +975 -0
- pythonx/compose/ui/alignment.py +47 -0
- pythonx/compose/ui/graphics/__init__.py +5 -0
- pythonx/compose/ui/graphics/__init__.pyi +795 -0
- pythonx/compose/ui/graphics/vector/__init__.py +5 -0
- pythonx/compose/ui/graphics/vector/__init__.pyi +221 -0
- pythonx/compose/ui/modifier.py +110 -0
- pythonx/compose/ui/text/__init__.py +5 -0
- pythonx/compose/ui/text/__init__.pyi +703 -0
- pythonx/compose/ui/unit/__init__.py +19 -0
- pythonx/compose/ui/unit/__init__.pyi +348 -0
- pythonx_compose-0.1.0a1.dist-info/METADATA +228 -0
- pythonx_compose-0.1.0a1.dist-info/RECORD +40 -0
- pythonx_compose-0.1.0a1.dist-info/WHEEL +5 -0
- pythonx_compose-0.1.0a1.dist-info/licenses/LICENSE +21 -0
- pythonx_compose-0.1.0a1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""`pythonx/compose/ui/unit/__init__.py` -- unit declarations provided by the adaptation layer.
|
|
2
|
+
|
|
3
|
+
## What used to be here, and why it is gone
|
|
4
|
+
|
|
5
|
+
A relative import `from .dp import dp`. `dp.py` was an empty placeholder file, now deleted; what it
|
|
6
|
+
noted still holds: `Dp` parameters take raw numbers (`16` or `16.0`) directly, as in `padding(16)`,
|
|
7
|
+
without an explicit `dp` wrapper.
|
|
8
|
+
|
|
9
|
+
## Dynamic unit handling
|
|
10
|
+
|
|
11
|
+
A raw number reaches a `Dp` parameter because `pythonx-map.toml` allows it and the re-export rule
|
|
12
|
+
hands that allowlist to the binder (`pythonx/compose/_reexport.py`). An explicit `Dp` value is
|
|
13
|
+
`python_multiplatform.binding.value_of('androidx.compose.ui.unit.Dp', 16)`; a short `dp()` spelling
|
|
14
|
+
is not provided yet.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from pythonx.compose._reexport import reexport
|
|
18
|
+
|
|
19
|
+
__getattr__, __dir__ = reexport(__name__)
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
# GENERATED by scripts/gen_stubs.py from python-multiplatform's Kotlin-named stubs (artifact kotlin-stubs, workflow run 37103737430, commit a5028618, Compose 1.11.1). Do not edit.
|
|
2
|
+
import typing as _t
|
|
3
|
+
|
|
4
|
+
class DpRect:
|
|
5
|
+
"""Kotlin: androidx.compose.ui.unit.DpRect"""
|
|
6
|
+
@_t.overload
|
|
7
|
+
def __init__(self, origin: int, size: _t.Any) -> None: ...
|
|
8
|
+
@_t.overload
|
|
9
|
+
def __init__(self, left: float, top: float, right: float, bottom: float) -> None: ... # type: ignore[overload-cannot-match]
|
|
10
|
+
@property
|
|
11
|
+
def bottom(self) -> float:
|
|
12
|
+
"""Kotlin property: androidx.compose.ui.unit.DpRect.bottom (androidx.compose.ui.unit.DpRect.bottom: androidx.compose.ui.unit.Dp)"""
|
|
13
|
+
...
|
|
14
|
+
@property
|
|
15
|
+
def height(self) -> float:
|
|
16
|
+
"""Kotlin property: androidx.compose.ui.unit.height (androidx.compose.ui.unit.DpRect.height: androidx.compose.ui.unit.Dp)"""
|
|
17
|
+
...
|
|
18
|
+
@property
|
|
19
|
+
def left(self) -> float:
|
|
20
|
+
"""Kotlin property: androidx.compose.ui.unit.DpRect.left (androidx.compose.ui.unit.DpRect.left: androidx.compose.ui.unit.Dp)"""
|
|
21
|
+
...
|
|
22
|
+
@property
|
|
23
|
+
def right(self) -> float:
|
|
24
|
+
"""Kotlin property: androidx.compose.ui.unit.DpRect.right (androidx.compose.ui.unit.DpRect.right: androidx.compose.ui.unit.Dp)"""
|
|
25
|
+
...
|
|
26
|
+
@property
|
|
27
|
+
def size(self) -> _t.Any:
|
|
28
|
+
"""Kotlin property: androidx.compose.ui.unit.size (androidx.compose.ui.unit.DpRect.size: androidx.compose.ui.unit.DpSize)"""
|
|
29
|
+
...
|
|
30
|
+
@property
|
|
31
|
+
def top(self) -> float:
|
|
32
|
+
"""Kotlin property: androidx.compose.ui.unit.DpRect.top (androidx.compose.ui.unit.DpRect.top: androidx.compose.ui.unit.Dp)"""
|
|
33
|
+
...
|
|
34
|
+
@property
|
|
35
|
+
def width(self) -> float:
|
|
36
|
+
"""Kotlin property: androidx.compose.ui.unit.width (androidx.compose.ui.unit.DpRect.width: androidx.compose.ui.unit.Dp)"""
|
|
37
|
+
...
|
|
38
|
+
|
|
39
|
+
class FontScalingLinear:
|
|
40
|
+
"""Kotlin: androidx.compose.ui.unit.FontScalingLinear"""
|
|
41
|
+
@property
|
|
42
|
+
def font_scale(self) -> float:
|
|
43
|
+
"""Kotlin property: androidx.compose.ui.unit.FontScalingLinear.fontScale (androidx.compose.ui.unit.FontScalingLinear.fontScale: kotlin.Float)"""
|
|
44
|
+
...
|
|
45
|
+
|
|
46
|
+
class LayoutDirection:
|
|
47
|
+
"""Kotlin: androidx.compose.ui.unit.LayoutDirection"""
|
|
48
|
+
|
|
49
|
+
def Constraints(min_width: int = ..., max_width: int = ..., min_height: int = ..., max_height: int = ...) -> _t.Any:
|
|
50
|
+
"""Kotlin: androidx.compose.ui.unit.Constraints(minWidth: kotlin.Int, maxWidth: kotlin.Int, minHeight: kotlin.Int, maxHeight: kotlin.Int): androidx.compose.ui.unit.Constraints"""
|
|
51
|
+
...
|
|
52
|
+
|
|
53
|
+
def Density(density: float, font_scale: float = ...) -> _t.Any:
|
|
54
|
+
"""Kotlin: androidx.compose.ui.unit.Density(density: kotlin.Float, fontScale: kotlin.Float): androidx.compose.ui.unit.Density"""
|
|
55
|
+
...
|
|
56
|
+
|
|
57
|
+
def DpOffset(x: float, y: float) -> int:
|
|
58
|
+
"""Kotlin: androidx.compose.ui.unit.DpOffset(x: androidx.compose.ui.unit.Dp, y: androidx.compose.ui.unit.Dp): androidx.compose.ui.unit.DpOffset"""
|
|
59
|
+
...
|
|
60
|
+
|
|
61
|
+
def DpSize(width: float, height: float) -> _t.Any:
|
|
62
|
+
"""Kotlin: androidx.compose.ui.unit.DpSize(width: androidx.compose.ui.unit.Dp, height: androidx.compose.ui.unit.Dp): androidx.compose.ui.unit.DpSize"""
|
|
63
|
+
...
|
|
64
|
+
|
|
65
|
+
def IntOffset(x: int, y: int) -> int:
|
|
66
|
+
"""Kotlin: androidx.compose.ui.unit.IntOffset(x: kotlin.Int, y: kotlin.Int): androidx.compose.ui.unit.IntOffset"""
|
|
67
|
+
...
|
|
68
|
+
|
|
69
|
+
def IntRect__IntOffset_Int(center: int, radius: int) -> _t.Any:
|
|
70
|
+
"""Kotlin: androidx.compose.ui.unit.IntRect(center: androidx.compose.ui.unit.IntOffset, radius: kotlin.Int): androidx.compose.ui.unit.IntRect"""
|
|
71
|
+
...
|
|
72
|
+
|
|
73
|
+
def IntRect__IntOffset_IntOffset(top_left: int, bottom_right: int) -> _t.Any:
|
|
74
|
+
"""Kotlin: androidx.compose.ui.unit.IntRect(topLeft: androidx.compose.ui.unit.IntOffset, bottomRight: androidx.compose.ui.unit.IntOffset): androidx.compose.ui.unit.IntRect"""
|
|
75
|
+
...
|
|
76
|
+
|
|
77
|
+
def IntRect__IntOffset_IntSize(offset: int, size: _t.Any) -> _t.Any:
|
|
78
|
+
"""Kotlin: androidx.compose.ui.unit.IntRect(offset: androidx.compose.ui.unit.IntOffset, size: androidx.compose.ui.unit.IntSize): androidx.compose.ui.unit.IntRect"""
|
|
79
|
+
...
|
|
80
|
+
|
|
81
|
+
def IntSize(width: int, height: int) -> int:
|
|
82
|
+
"""Kotlin: androidx.compose.ui.unit.IntSize(width: kotlin.Int, height: kotlin.Int): androidx.compose.ui.unit.IntSize"""
|
|
83
|
+
...
|
|
84
|
+
|
|
85
|
+
def TextUnit(value: float, type: int) -> _t.Any:
|
|
86
|
+
"""Kotlin: androidx.compose.ui.unit.TextUnit(value: kotlin.Float, type: androidx.compose.ui.unit.TextUnitType): androidx.compose.ui.unit.TextUnit"""
|
|
87
|
+
...
|
|
88
|
+
|
|
89
|
+
def Velocity(x: float, y: float) -> _t.Any:
|
|
90
|
+
"""Kotlin: androidx.compose.ui.unit.Velocity(x: kotlin.Float, y: kotlin.Float): androidx.compose.ui.unit.Velocity"""
|
|
91
|
+
...
|
|
92
|
+
|
|
93
|
+
def coerce_at_least(receiver: float, /, minimum_value: float) -> float:
|
|
94
|
+
"""Kotlin: androidx.compose.ui.unit.Dp.coerceAtLeast(minimumValue: androidx.compose.ui.unit.Dp): androidx.compose.ui.unit.Dp"""
|
|
95
|
+
...
|
|
96
|
+
|
|
97
|
+
def coerce_at_most(receiver: float, /, maximum_value: float) -> float:
|
|
98
|
+
"""Kotlin: androidx.compose.ui.unit.Dp.coerceAtMost(maximumValue: androidx.compose.ui.unit.Dp): androidx.compose.ui.unit.Dp"""
|
|
99
|
+
...
|
|
100
|
+
|
|
101
|
+
def coerce_in(receiver: float, /, minimum_value: float, maximum_value: float) -> float:
|
|
102
|
+
"""Kotlin: androidx.compose.ui.unit.Dp.coerceIn(minimumValue: androidx.compose.ui.unit.Dp, maximumValue: androidx.compose.ui.unit.Dp): androidx.compose.ui.unit.Dp"""
|
|
103
|
+
...
|
|
104
|
+
|
|
105
|
+
def constrain_height(receiver: int, /, height: int) -> int:
|
|
106
|
+
"""Kotlin: androidx.compose.ui.unit.Constraints.constrainHeight(height: kotlin.Int): kotlin.Int"""
|
|
107
|
+
...
|
|
108
|
+
|
|
109
|
+
def constrain_width(receiver: int, /, width: int) -> int:
|
|
110
|
+
"""Kotlin: androidx.compose.ui.unit.Constraints.constrainWidth(width: kotlin.Int): kotlin.Int"""
|
|
111
|
+
...
|
|
112
|
+
|
|
113
|
+
def constrain__Constraints(receiver: int, /, other_constraints: int) -> _t.Any:
|
|
114
|
+
"""Kotlin: androidx.compose.ui.unit.Constraints.constrain(otherConstraints: androidx.compose.ui.unit.Constraints): androidx.compose.ui.unit.Constraints"""
|
|
115
|
+
...
|
|
116
|
+
|
|
117
|
+
def constrain__IntSize(receiver: int, /, size: _t.Any) -> int:
|
|
118
|
+
"""Kotlin: androidx.compose.ui.unit.Constraints.constrain(size: androidx.compose.ui.unit.IntSize): androidx.compose.ui.unit.IntSize"""
|
|
119
|
+
...
|
|
120
|
+
|
|
121
|
+
def is_satisfied_by(receiver: int, /, size: _t.Any) -> bool:
|
|
122
|
+
"""Kotlin: androidx.compose.ui.unit.Constraints.isSatisfiedBy(size: androidx.compose.ui.unit.IntSize): kotlin.Boolean"""
|
|
123
|
+
...
|
|
124
|
+
|
|
125
|
+
def lerp__DpOffset_DpOffset_Float(start: int, stop: int, fraction: float) -> int:
|
|
126
|
+
"""Kotlin: androidx.compose.ui.unit.lerp(start: androidx.compose.ui.unit.DpOffset, stop: androidx.compose.ui.unit.DpOffset, fraction: kotlin.Float): androidx.compose.ui.unit.DpOffset"""
|
|
127
|
+
...
|
|
128
|
+
|
|
129
|
+
def lerp__DpSize_DpSize_Float(start: _t.Any, stop: _t.Any, fraction: float) -> _t.Any:
|
|
130
|
+
"""Kotlin: androidx.compose.ui.unit.lerp(start: androidx.compose.ui.unit.DpSize, stop: androidx.compose.ui.unit.DpSize, fraction: kotlin.Float): androidx.compose.ui.unit.DpSize"""
|
|
131
|
+
...
|
|
132
|
+
|
|
133
|
+
def lerp__Dp_Dp_Float(start: float, stop: float, fraction: float) -> float:
|
|
134
|
+
"""Kotlin: androidx.compose.ui.unit.lerp(start: androidx.compose.ui.unit.Dp, stop: androidx.compose.ui.unit.Dp, fraction: kotlin.Float): androidx.compose.ui.unit.Dp"""
|
|
135
|
+
...
|
|
136
|
+
|
|
137
|
+
def lerp__IntOffset_IntOffset_Float(start: int, stop: int, fraction: float) -> int:
|
|
138
|
+
"""Kotlin: androidx.compose.ui.unit.lerp(start: androidx.compose.ui.unit.IntOffset, stop: androidx.compose.ui.unit.IntOffset, fraction: kotlin.Float): androidx.compose.ui.unit.IntOffset"""
|
|
139
|
+
...
|
|
140
|
+
|
|
141
|
+
def lerp__IntRect_IntRect_Float(start: _t.Any, stop: _t.Any, fraction: float) -> _t.Any:
|
|
142
|
+
"""Kotlin: androidx.compose.ui.unit.lerp(start: androidx.compose.ui.unit.IntRect, stop: androidx.compose.ui.unit.IntRect, fraction: kotlin.Float): androidx.compose.ui.unit.IntRect"""
|
|
143
|
+
...
|
|
144
|
+
|
|
145
|
+
def lerp__TextUnit_TextUnit_Float(start: _t.Any, stop: _t.Any, fraction: float) -> _t.Any:
|
|
146
|
+
"""Kotlin: androidx.compose.ui.unit.lerp(start: androidx.compose.ui.unit.TextUnit, stop: androidx.compose.ui.unit.TextUnit, fraction: kotlin.Float): androidx.compose.ui.unit.TextUnit"""
|
|
147
|
+
...
|
|
148
|
+
|
|
149
|
+
def max(a: float, b: float) -> float:
|
|
150
|
+
"""Kotlin: androidx.compose.ui.unit.max(a: androidx.compose.ui.unit.Dp, b: androidx.compose.ui.unit.Dp): androidx.compose.ui.unit.Dp"""
|
|
151
|
+
...
|
|
152
|
+
|
|
153
|
+
def min(a: float, b: float) -> float:
|
|
154
|
+
"""Kotlin: androidx.compose.ui.unit.min(a: androidx.compose.ui.unit.Dp, b: androidx.compose.ui.unit.Dp): androidx.compose.ui.unit.Dp"""
|
|
155
|
+
...
|
|
156
|
+
|
|
157
|
+
def minus__IntOffset(receiver: int, /, offset: int) -> int:
|
|
158
|
+
"""Kotlin: androidx.compose.ui.geometry.Offset.minus(offset: androidx.compose.ui.unit.IntOffset): androidx.compose.ui.geometry.Offset"""
|
|
159
|
+
...
|
|
160
|
+
|
|
161
|
+
def minus__Offset(receiver: int, /, offset: int) -> int:
|
|
162
|
+
"""Kotlin: androidx.compose.ui.unit.IntOffset.minus(offset: androidx.compose.ui.geometry.Offset): androidx.compose.ui.geometry.Offset"""
|
|
163
|
+
...
|
|
164
|
+
|
|
165
|
+
def offset(receiver: int, /, horizontal: int = ..., vertical: int = ...) -> _t.Any:
|
|
166
|
+
"""Kotlin: androidx.compose.ui.unit.Constraints.offset(horizontal: kotlin.Int, vertical: kotlin.Int): androidx.compose.ui.unit.Constraints"""
|
|
167
|
+
...
|
|
168
|
+
|
|
169
|
+
def plus__IntOffset(receiver: int, /, offset: int) -> int:
|
|
170
|
+
"""Kotlin: androidx.compose.ui.geometry.Offset.plus(offset: androidx.compose.ui.unit.IntOffset): androidx.compose.ui.geometry.Offset"""
|
|
171
|
+
...
|
|
172
|
+
|
|
173
|
+
def plus__Offset(receiver: int, /, offset: int) -> int:
|
|
174
|
+
"""Kotlin: androidx.compose.ui.unit.IntOffset.plus(offset: androidx.compose.ui.geometry.Offset): androidx.compose.ui.geometry.Offset"""
|
|
175
|
+
...
|
|
176
|
+
|
|
177
|
+
def round(receiver: int, /) -> int:
|
|
178
|
+
"""Kotlin: androidx.compose.ui.geometry.Offset.round(): androidx.compose.ui.unit.IntOffset"""
|
|
179
|
+
...
|
|
180
|
+
|
|
181
|
+
def round_to_int_rect(receiver: _t.Any, /) -> _t.Any:
|
|
182
|
+
"""Kotlin: androidx.compose.ui.geometry.Rect.roundToIntRect(): androidx.compose.ui.unit.IntRect"""
|
|
183
|
+
...
|
|
184
|
+
|
|
185
|
+
def round_to_int_size(receiver: int, /) -> int:
|
|
186
|
+
"""Kotlin: androidx.compose.ui.geometry.Size.roundToIntSize(): androidx.compose.ui.unit.IntSize"""
|
|
187
|
+
...
|
|
188
|
+
|
|
189
|
+
def take_or_else__Dp(receiver: float, /, block: _t.Callable[[], _t.Any]) -> float:
|
|
190
|
+
"""Kotlin: androidx.compose.ui.unit.Dp.takeOrElse(block: kotlin.Function0): androidx.compose.ui.unit.Dp"""
|
|
191
|
+
...
|
|
192
|
+
|
|
193
|
+
def take_or_else__DpOffset(receiver: int, /, block: _t.Callable[[], _t.Any]) -> int:
|
|
194
|
+
"""Kotlin: androidx.compose.ui.unit.DpOffset.takeOrElse(block: kotlin.Function0): androidx.compose.ui.unit.DpOffset"""
|
|
195
|
+
...
|
|
196
|
+
|
|
197
|
+
def take_or_else__DpSize(receiver: _t.Any, /, block: _t.Callable[[], _t.Any]) -> _t.Any:
|
|
198
|
+
"""Kotlin: androidx.compose.ui.unit.DpSize.takeOrElse(block: kotlin.Function0): androidx.compose.ui.unit.DpSize"""
|
|
199
|
+
...
|
|
200
|
+
|
|
201
|
+
def take_or_else__TextUnit(receiver: _t.Any, /, block: _t.Callable[[], _t.Any]) -> _t.Any:
|
|
202
|
+
"""Kotlin: androidx.compose.ui.unit.TextUnit.takeOrElse(block: kotlin.Function0): androidx.compose.ui.unit.TextUnit"""
|
|
203
|
+
...
|
|
204
|
+
|
|
205
|
+
def times__Double_Dp(receiver: float, /, other: float) -> float:
|
|
206
|
+
"""Kotlin: kotlin.Double.times(other: androidx.compose.ui.unit.Dp): androidx.compose.ui.unit.Dp"""
|
|
207
|
+
...
|
|
208
|
+
|
|
209
|
+
def times__Double_TextUnit(receiver: float, /, other: _t.Any) -> _t.Any:
|
|
210
|
+
"""Kotlin: kotlin.Double.times(other: androidx.compose.ui.unit.TextUnit): androidx.compose.ui.unit.TextUnit"""
|
|
211
|
+
...
|
|
212
|
+
|
|
213
|
+
def times__Float_Dp(receiver: float, /, other: float) -> float:
|
|
214
|
+
"""Kotlin: kotlin.Float.times(other: androidx.compose.ui.unit.Dp): androidx.compose.ui.unit.Dp"""
|
|
215
|
+
...
|
|
216
|
+
|
|
217
|
+
def times__Float_DpSize(receiver: float, /, size: _t.Any) -> _t.Any:
|
|
218
|
+
"""Kotlin: kotlin.Float.times(size: androidx.compose.ui.unit.DpSize): androidx.compose.ui.unit.DpSize"""
|
|
219
|
+
...
|
|
220
|
+
|
|
221
|
+
def times__Float_TextUnit(receiver: float, /, other: _t.Any) -> _t.Any:
|
|
222
|
+
"""Kotlin: kotlin.Float.times(other: androidx.compose.ui.unit.TextUnit): androidx.compose.ui.unit.TextUnit"""
|
|
223
|
+
...
|
|
224
|
+
|
|
225
|
+
def times__Int_Dp(receiver: int, /, other: float) -> float:
|
|
226
|
+
"""Kotlin: kotlin.Int.times(other: androidx.compose.ui.unit.Dp): androidx.compose.ui.unit.Dp"""
|
|
227
|
+
...
|
|
228
|
+
|
|
229
|
+
def times__Int_DpSize(receiver: int, /, size: _t.Any) -> _t.Any:
|
|
230
|
+
"""Kotlin: kotlin.Int.times(size: androidx.compose.ui.unit.DpSize): androidx.compose.ui.unit.DpSize"""
|
|
231
|
+
...
|
|
232
|
+
|
|
233
|
+
def times__Int_IntSize(receiver: int, /, size: _t.Any) -> int:
|
|
234
|
+
"""Kotlin: kotlin.Int.times(size: androidx.compose.ui.unit.IntSize): androidx.compose.ui.unit.IntSize"""
|
|
235
|
+
...
|
|
236
|
+
|
|
237
|
+
def times__Int_TextUnit(receiver: int, /, other: _t.Any) -> _t.Any:
|
|
238
|
+
"""Kotlin: kotlin.Int.times(other: androidx.compose.ui.unit.TextUnit): androidx.compose.ui.unit.TextUnit"""
|
|
239
|
+
...
|
|
240
|
+
|
|
241
|
+
def to_int_rect(receiver: _t.Any, /) -> _t.Any:
|
|
242
|
+
"""Kotlin: androidx.compose.ui.unit.IntSize.toIntRect(): androidx.compose.ui.unit.IntRect"""
|
|
243
|
+
...
|
|
244
|
+
|
|
245
|
+
def to_int_size(receiver: int, /) -> int:
|
|
246
|
+
"""Kotlin: androidx.compose.ui.geometry.Size.toIntSize(): androidx.compose.ui.unit.IntSize"""
|
|
247
|
+
...
|
|
248
|
+
|
|
249
|
+
def to_offset(receiver: int, /) -> int:
|
|
250
|
+
"""Kotlin: androidx.compose.ui.unit.IntOffset.toOffset(): androidx.compose.ui.geometry.Offset"""
|
|
251
|
+
...
|
|
252
|
+
|
|
253
|
+
def to_rect(receiver: _t.Any, /) -> _t.Any:
|
|
254
|
+
"""Kotlin: androidx.compose.ui.unit.IntRect.toRect(): androidx.compose.ui.geometry.Rect"""
|
|
255
|
+
...
|
|
256
|
+
|
|
257
|
+
def to_size(receiver: _t.Any, /) -> int:
|
|
258
|
+
"""Kotlin: androidx.compose.ui.unit.IntSize.toSize(): androidx.compose.ui.geometry.Size"""
|
|
259
|
+
...
|
|
260
|
+
|
|
261
|
+
def DpRect__DpOffset_DpSize(origin: int, size: _t.Any) -> DpRect:
|
|
262
|
+
"""Kotlin: androidx.compose.ui.unit.DpRect(origin: androidx.compose.ui.unit.DpOffset, size: androidx.compose.ui.unit.DpSize): androidx.compose.ui.unit.DpRect"""
|
|
263
|
+
...
|
|
264
|
+
|
|
265
|
+
def DpRect__Dp_Dp_Dp_Dp(left: float, top: float, right: float, bottom: float) -> DpRect:
|
|
266
|
+
"""Kotlin: androidx.compose.ui.unit.DpRect(left: androidx.compose.ui.unit.Dp, top: androidx.compose.ui.unit.Dp, right: androidx.compose.ui.unit.Dp, bottom: androidx.compose.ui.unit.Dp): androidx.compose.ui.unit.DpRect"""
|
|
267
|
+
...
|
|
268
|
+
|
|
269
|
+
@_t.overload
|
|
270
|
+
def IntRect(center: int, radius: int) -> _t.Any: ...
|
|
271
|
+
@_t.overload
|
|
272
|
+
def IntRect(top_left: int, bottom_right: int) -> _t.Any: ... # type: ignore[overload-cannot-match]
|
|
273
|
+
@_t.overload
|
|
274
|
+
def IntRect(offset: int, size: _t.Any) -> _t.Any: ... # type: ignore[overload-cannot-match]
|
|
275
|
+
|
|
276
|
+
@_t.overload
|
|
277
|
+
def constrain(receiver: int, /, other_constraints: int) -> _t.Any: ...
|
|
278
|
+
@_t.overload
|
|
279
|
+
def constrain(receiver: int, /, size: _t.Any) -> int: ... # type: ignore[overload-cannot-match]
|
|
280
|
+
|
|
281
|
+
@_t.overload
|
|
282
|
+
def lerp(start: int, stop: int, fraction: float) -> int: ...
|
|
283
|
+
@_t.overload
|
|
284
|
+
def lerp(start: _t.Any, stop: _t.Any, fraction: float) -> _t.Any: ... # type: ignore[overload-cannot-match]
|
|
285
|
+
@_t.overload
|
|
286
|
+
def lerp(start: float, stop: float, fraction: float) -> float: ... # type: ignore[overload-cannot-match]
|
|
287
|
+
@_t.overload
|
|
288
|
+
def lerp(start: int, stop: int, fraction: float) -> int: ... # type: ignore[overload-cannot-match]
|
|
289
|
+
@_t.overload
|
|
290
|
+
def lerp(start: _t.Any, stop: _t.Any, fraction: float) -> _t.Any: ... # type: ignore[overload-cannot-match]
|
|
291
|
+
@_t.overload
|
|
292
|
+
def lerp(start: _t.Any, stop: _t.Any, fraction: float) -> _t.Any: ... # type: ignore[overload-cannot-match]
|
|
293
|
+
|
|
294
|
+
@_t.overload
|
|
295
|
+
def minus(receiver: int, /, offset: int) -> int: ...
|
|
296
|
+
@_t.overload
|
|
297
|
+
def minus(receiver: int, /, offset: int) -> int: ... # type: ignore[overload-cannot-match]
|
|
298
|
+
|
|
299
|
+
@_t.overload
|
|
300
|
+
def plus(receiver: int, /, offset: int) -> int: ...
|
|
301
|
+
@_t.overload
|
|
302
|
+
def plus(receiver: int, /, offset: int) -> int: ... # type: ignore[overload-cannot-match]
|
|
303
|
+
|
|
304
|
+
@_t.overload
|
|
305
|
+
def take_or_else(receiver: float, /, block: _t.Callable[[], _t.Any]) -> float: ...
|
|
306
|
+
@_t.overload
|
|
307
|
+
def take_or_else(receiver: int, /, block: _t.Callable[[], _t.Any]) -> int: ... # type: ignore[overload-cannot-match]
|
|
308
|
+
@_t.overload
|
|
309
|
+
def take_or_else(receiver: _t.Any, /, block: _t.Callable[[], _t.Any]) -> _t.Any: ... # type: ignore[overload-cannot-match]
|
|
310
|
+
@_t.overload
|
|
311
|
+
def take_or_else(receiver: _t.Any, /, block: _t.Callable[[], _t.Any]) -> _t.Any: ... # type: ignore[overload-cannot-match]
|
|
312
|
+
|
|
313
|
+
@_t.overload
|
|
314
|
+
def times(receiver: float, /, other: float) -> float: ...
|
|
315
|
+
@_t.overload
|
|
316
|
+
def times(receiver: float, /, other: _t.Any) -> _t.Any: ... # type: ignore[overload-cannot-match]
|
|
317
|
+
@_t.overload
|
|
318
|
+
def times(receiver: float, /, other: float) -> float: ... # type: ignore[overload-cannot-match]
|
|
319
|
+
@_t.overload
|
|
320
|
+
def times(receiver: float, /, size: _t.Any) -> _t.Any: ... # type: ignore[overload-cannot-match]
|
|
321
|
+
@_t.overload
|
|
322
|
+
def times(receiver: float, /, other: _t.Any) -> _t.Any: ... # type: ignore[overload-cannot-match]
|
|
323
|
+
@_t.overload
|
|
324
|
+
def times(receiver: int, /, other: float) -> float: ... # type: ignore[overload-cannot-match]
|
|
325
|
+
@_t.overload
|
|
326
|
+
def times(receiver: int, /, size: _t.Any) -> _t.Any: ... # type: ignore[overload-cannot-match]
|
|
327
|
+
@_t.overload
|
|
328
|
+
def times(receiver: int, /, size: _t.Any) -> int: ... # type: ignore[overload-cannot-match]
|
|
329
|
+
@_t.overload
|
|
330
|
+
def times(receiver: int, /, other: _t.Any) -> _t.Any: ... # type: ignore[overload-cannot-match]
|
|
331
|
+
|
|
332
|
+
class Dp:
|
|
333
|
+
"""Kotlin: androidx.compose.ui.unit.Dp"""
|
|
334
|
+
Hairline: _t.ClassVar[float]
|
|
335
|
+
"""Kotlin: androidx.compose.ui.unit.Dp.Hairline(): androidx.compose.ui.unit.Dp"""
|
|
336
|
+
Infinity: _t.ClassVar[float]
|
|
337
|
+
"""Kotlin: androidx.compose.ui.unit.Dp.Infinity(): androidx.compose.ui.unit.Dp"""
|
|
338
|
+
Unspecified: _t.ClassVar[float]
|
|
339
|
+
"""Kotlin: androidx.compose.ui.unit.Dp.Unspecified(): androidx.compose.ui.unit.Dp"""
|
|
340
|
+
|
|
341
|
+
class TextUnitType:
|
|
342
|
+
"""Kotlin: androidx.compose.ui.unit.TextUnitType"""
|
|
343
|
+
Em: _t.ClassVar[_t.Any]
|
|
344
|
+
"""Kotlin: androidx.compose.ui.unit.TextUnitType.Em(): androidx.compose.ui.unit.TextUnitType"""
|
|
345
|
+
Sp: _t.ClassVar[_t.Any]
|
|
346
|
+
"""Kotlin: androidx.compose.ui.unit.TextUnitType.Sp(): androidx.compose.ui.unit.TextUnitType"""
|
|
347
|
+
Unspecified: _t.ClassVar[_t.Any]
|
|
348
|
+
"""Kotlin: androidx.compose.ui.unit.TextUnitType.Unspecified(): androidx.compose.ui.unit.TextUnitType"""
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pythonx-compose
|
|
3
|
+
Version: 0.1.0a1
|
|
4
|
+
Summary: Pythonic Compose UI for Python on Kotlin Multiplatform, through python-multiplatform
|
|
5
|
+
Author: BREW (b-re-w), Jong-uk Lee (rnoro5122)
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/thisisthepy/pythonx-compose
|
|
8
|
+
Project-URL: Source, https://github.com/thisisthepy/pythonx-compose
|
|
9
|
+
Project-URL: Issues, https://github.com/thisisthepy/pythonx-compose/issues
|
|
10
|
+
Project-URL: Documentation, https://thisisthepy.github.io/pythonx-compose/
|
|
11
|
+
Keywords: compose,jetpack-compose,compose-multiplatform,kotlin-multiplatform,ui,python-multiplatform
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Software Development :: User Interfaces
|
|
20
|
+
Classifier: Typing :: Typed
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Dynamic: license-file
|
|
25
|
+
|
|
26
|
+
English | [ํ๊ตญ์ด](https://github.com/thisisthepy/pythonx-compose/blob/main/docs/locale/README_ko.md)
|
|
27
|
+
|
|
28
|
+
<div align="center">
|
|
29
|
+
|
|
30
|
+
# pythonx-compose
|
|
31
|
+
|
|
32
|
+
**Write Compose user interfaces in Python โ with Compose's own widgets, spelled the Python way.**
|
|
33
|
+
|
|
34
|
+
[](https://github.com/thisisthepy/pythonx-compose/blob/main/LICENSE)
|
|
35
|
+
[](https://github.com/thisisthepy/pythonx-compose/blob/main/pyproject.toml)
|
|
36
|
+
[](https://github.com/thisisthepy/pythonx-compose/blob/main/pyproject.toml)
|
|
37
|
+
[](#-status)
|
|
38
|
+
|
|
39
|
+
[Guide](https://thisisthepy.github.io/pythonx-compose/) ยท [Getting started](https://thisisthepy.github.io/pythonx-compose/getting-started.html) ยท [Concepts](https://thisisthepy.github.io/pythonx-compose/concepts.html) ยท [Status](https://thisisthepy.github.io/pythonx-compose/status.html)
|
|
40
|
+
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Why
|
|
46
|
+
|
|
47
|
+
Jetpack Compose and Compose Multiplatform are a superb way to build UI โ if you write Kotlin.
|
|
48
|
+
`pythonx-compose` is for people who write Python. It does not reimplement Compose and it does not
|
|
49
|
+
invent a new widget set: it takes the real `androidx.compose.*` API, which
|
|
50
|
+
[python-multiplatform](https://github.com/thisisthepy/python-multiplatform) exposes to Python under
|
|
51
|
+
its Kotlin names, and restructures it into a Pythonic package, `pythonx.compose`.
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
from pythonx.compose.runtime import Composable
|
|
55
|
+
from pythonx.compose.material3 import Text, Button
|
|
56
|
+
|
|
57
|
+
@Composable
|
|
58
|
+
def Greeting():
|
|
59
|
+
Button(on_click=lambda: print("hi"), content=lambda: Text("Hello from Python"))
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
<sub>These names resolve today, by one rule, inside an app that embeds the binder; per-widget render
|
|
63
|
+
proofs are still pending. See [Status](#-status).</sub>
|
|
64
|
+
|
|
65
|
+
## โจ Principles
|
|
66
|
+
|
|
67
|
+
- **The original API, Pythonic names.** Every parameter is Compose's own parameter, in
|
|
68
|
+
`snake_case`: `onClick` โ `on_click`, `horizontalAlignment` โ `horizontal_alignment`. Upper-case
|
|
69
|
+
names (types, objects, composables) keep their Kotlin spelling; every other name is `snake_case`
|
|
70
|
+
only (`fillMaxWidth` โ `fill_max_width`, `toURLString` โ `to_url_string`), and an explicit
|
|
71
|
+
overload keeps its suffix (`padding__Dp`).
|
|
72
|
+
- **Extension functions are methods.** `Modifier.padding(16).size(24).fill_max_width()` chains
|
|
73
|
+
exactly as it does in Kotlin. Keyword arguments to such a method are `snake_case`
|
|
74
|
+
too (`m.padding(padding_values=...)`), as they are on the module function
|
|
75
|
+
`padding(m, padding_values=...)`; Kotlin's own spelling still works at run time, and the type
|
|
76
|
+
stubs offer only the Pythonic one.
|
|
77
|
+
- **Kotlin objects are namespaces.** `Alignment.Center` and `Arrangement.End` are read without
|
|
78
|
+
parentheses; functions inside them are `snake_case`: `Arrangement.spaced_by(8)`. Constants can
|
|
79
|
+
also be reached grouped by their declared type, as the notebook writes them:
|
|
80
|
+
`Alignment.Horizontal.End` is `Alignment.End`.
|
|
81
|
+
- **`@Composable` stays.** Screens are decorated Python functions.
|
|
82
|
+
- **A real package.** `pythonx/` is ordinary Python source that imports `androidx.compose.*` and
|
|
83
|
+
reshapes it. The binder never renames anything โ renaming is this package's job.
|
|
84
|
+
- **One manifest.** [`pythonx-map.toml`](https://github.com/thisisthepy/pythonx-compose/blob/main/pythonx/compose/pythonx-map.toml) says which `pythonx.compose.*` module
|
|
85
|
+
stands for which Kotlin package. It lives inside the package and ships in the wheel. The runtime
|
|
86
|
+
and the `.pyi` generator read the same file, so what your editor completes is what the interpreter
|
|
87
|
+
resolves.
|
|
88
|
+
|
|
89
|
+
## ๐งฉ Architecture at a glance
|
|
90
|
+
|
|
91
|
+
```mermaid
|
|
92
|
+
flowchart LR
|
|
93
|
+
app["Your Python UI<br/>@Composable def Screen()"] --> px["pythonx.compose<br/>(this package, real Python)"]
|
|
94
|
+
px --> ax["androidx.compose.*<br/>Kotlin names, exposed by python-multiplatform"]
|
|
95
|
+
ax --> compose["Jetpack / Compose Multiplatform"]
|
|
96
|
+
map["pythonx-map.toml"] -.-> px
|
|
97
|
+
map -.-> pyi[".pyi stubs<br/>(in the wheel)"]
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
| Python module | Kotlin package |
|
|
101
|
+
|---|---|
|
|
102
|
+
| `pythonx.compose.runtime` | `androidx.compose.runtime` |
|
|
103
|
+
| `pythonx.compose.ui` | `androidx.compose.ui` |
|
|
104
|
+
| `pythonx.compose.layout` | `androidx.compose.foundation.layout` |
|
|
105
|
+
| `pythonx.compose.material3` | `androidx.compose.material3` |
|
|
106
|
+
|
|
107
|
+
Each module is a real file whose `__init__.py` calls one re-export rule; names resolve on first use.
|
|
108
|
+
`Column`, `Row` and `Spacer` are importable from `pythonx.compose.material3` as well as
|
|
109
|
+
`pythonx.compose.layout`, as the notebook writes them (the manifest's `[aliases]`).
|
|
110
|
+
|
|
111
|
+
## ๐ Quick start
|
|
112
|
+
|
|
113
|
+
> [!NOTE]
|
|
114
|
+
> `pythonx-compose` is **pre-alpha**. The first alpha, `0.1.0a1`, is released to PyPI when the
|
|
115
|
+
> maintainer tags it; a pre-release needs `pip install --pre pythonx-compose`.
|
|
116
|
+
|
|
117
|
+
From a clone, to run the tests:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
git clone https://github.com/thisisthepy/pythonx-compose
|
|
121
|
+
cd pythonx-compose
|
|
122
|
+
python3 -m pip install pytest # inside a virtual environment
|
|
123
|
+
python3 -m pytest tests -q
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
What runs today, from the repository root:
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
from pythonx.compose.runtime import Composable
|
|
130
|
+
|
|
131
|
+
@Composable # an identity decorator: the function stays a plain function
|
|
132
|
+
def Screen():
|
|
133
|
+
"""A screen."""
|
|
134
|
+
return "drawn"
|
|
135
|
+
|
|
136
|
+
assert Screen() == "drawn" and Screen.__name__ == "Screen"
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
import tomllib # the manifest: the one place the mapping is written down
|
|
141
|
+
|
|
142
|
+
with open("pythonx/compose/pythonx-map.toml", "rb") as f:
|
|
143
|
+
manifest = tomllib.load(f)
|
|
144
|
+
|
|
145
|
+
manifest["modules"]["pythonx.compose.layout"]
|
|
146
|
+
# 'androidx.compose.foundation.layout'
|
|
147
|
+
manifest["value-classes"]["raw-primitive-allowed"]
|
|
148
|
+
# ['androidx.compose.ui.unit.Dp'] -> padding(16) means padding(16.dp)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
```python
|
|
152
|
+
from pythonx.compose._reexport import python_name # the naming rule, no binder needed
|
|
153
|
+
|
|
154
|
+
python_name("fillMaxWidth") # 'fill_max_width'
|
|
155
|
+
python_name("toURLString") # 'to_url_string'
|
|
156
|
+
python_name("Modifier") # 'Modifier'
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Reading a Compose name such as `pythonx.compose.material3.Text` needs the binder, which the Kotlin
|
|
160
|
+
host installs; outside an app it raises a `RuntimeError` saying so.
|
|
161
|
+
|
|
162
|
+
The tests that drive a `Modifier` chain and overload dispatch read the binder's adaptation layer
|
|
163
|
+
from a sibling [python-multiplatform](https://github.com/thisisthepy/python-multiplatform) checkout
|
|
164
|
+
(or `PYTHONMULTIPLATFORM_HOME`); without one they are skipped.
|
|
165
|
+
|
|
166
|
+
## ๐ฆ Installation
|
|
167
|
+
|
|
168
|
+
Distributed as the pip package **`pythonx-compose`** (Python 3.11 or later), providing the import
|
|
169
|
+
package `pythonx.compose`, with the manifest inside the wheel, and typed: `.pyi` stubs generated from
|
|
170
|
+
real Compose 1.11.1 and `py.typed` ship with it. It runs inside an app that embeds CPython
|
|
171
|
+
through [python-multiplatform](https://github.com/thisisthepy/python-multiplatform); it is not a
|
|
172
|
+
standalone desktop toolkit.
|
|
173
|
+
|
|
174
|
+
## ๐งช Status
|
|
175
|
+
|
|
176
|
+
| Area | State |
|
|
177
|
+
|---|---|
|
|
178
|
+
| Mapping manifest `pythonx-map.toml` | โ
implemented and tested |
|
|
179
|
+
| `@Composable` decorator | โ
implemented and tested |
|
|
180
|
+
| `pythonx` as a real on-disk package re-exporting `androidx.compose.*` by one rule | โ
implemented and tested |
|
|
181
|
+
| `Modifier` chains with snake_case methods, overload dispatch, `Dp` as a number | โ
implemented and tested against the binder's layer |
|
|
182
|
+
| `Column`, `Row`, `Spacer` from `material3` as well as `layout` | โ
implemented and tested |
|
|
183
|
+
| Method keyword arguments in `snake_case` | โ
implemented and tested โ module functions and methods (methods need python-multiplatform's `describe_member`) |
|
|
184
|
+
| The empty `Modifier` | ๐ก partial โ `Modifier.padding(16)` from the class needs an app-supplied factory against real Compose |
|
|
185
|
+
| `Alignment` / `Arrangement` | โ
implemented and tested โ `Alignment.Center`, `Arrangement.spaced_by(8)`, and grouped `Alignment.Horizontal.End` beside `Alignment.End` |
|
|
186
|
+
| Material 3 widgets (`Text`, `Button`, `Card`, `TextField`, โฆ) | ๐ก partial โ re-exported by rule; render proofs per widget pending (#9) |
|
|
187
|
+
| Type stubs (`.pyi`) from real Compose 1.11.1, `py.typed` | โ
implemented and checked with mypy; many types are still `Any` (#12) |
|
|
188
|
+
| Distribution (`pythonx-compose`) | ๐ก partial โ the wheel carries the manifest, the re-export rule, the stubs and `py.typed` |
|
|
189
|
+
| Declared app root (`@app`) and Pythonic state (`state`), no update call | ๐ก partial โ binder path tested against a fake host shaped after python-multiplatform #38; real Compose is the E2E module (#11, #19); numbers and strings round-trip through `state` |
|
|
190
|
+
| `TextField(state=...)` with `TextFieldState` (`pythonx.compose.foundation.text.input`) | ๐ก partial โ tested against a fake host shaped after python-multiplatform #73; the input-method (IME) composing proof is python-multiplatform E2E #26 (#10) |
|
|
191
|
+
| `DefaultIcons` (`Icons.Default`), written `DefaultIcons.Add` | ๐ก partial โ tested against a fake host shaped after python-multiplatform #37/#38; `Icon(DefaultIcons.Add, โฆ)` is drawn in python-multiplatform's render test |
|
|
192
|
+
| Colour schemes | โณ planned |
|
|
193
|
+
| `remember_saveable`, coroutine scopes | โณ planned |
|
|
194
|
+
|
|
195
|
+
The full list is on the guide's [Status page](https://thisisthepy.github.io/pythonx-compose/status.html).
|
|
196
|
+
|
|
197
|
+
## ๐ Documentation
|
|
198
|
+
|
|
199
|
+
- **Guide** โ [`docs/guide/`](https://thisisthepy.github.io/pythonx-compose/), bilingual (English / ํ๊ตญ์ด)
|
|
200
|
+
- **Korean README** โ [`docs/locale/README_ko.md`](https://github.com/thisisthepy/pythonx-compose/blob/main/docs/locale/README_ko.md)
|
|
201
|
+
|
|
202
|
+
## ๐ Ecosystem
|
|
203
|
+
|
|
204
|
+
| Repository | Role |
|
|
205
|
+
|---|---|
|
|
206
|
+
| [python-multiplatform](https://github.com/thisisthepy/python-multiplatform) | The binder: CPython embedded in Kotlin Multiplatform, exposing Kotlin to Python under Kotlin names |
|
|
207
|
+
| **pythonx-compose** | Compose, restructured for Python โ this repository |
|
|
208
|
+
| [toolchain](https://github.com/thisisthepy/toolchain) | Gradle build plugin for Python Multiplatform apps |
|
|
209
|
+
| [pypackpack](https://github.com/thisisthepy/pypackpack) | Distributing Python projects across platforms |
|
|
210
|
+
| [torchnative](https://github.com/thisisthepy/torchnative) | Run the real PyTorch ecosystem on device |
|
|
211
|
+
| [Gemstone](https://github.com/LogitAI/Gemstone) | A Kotlin Multiplatform AI app built alongside the stack |
|
|
212
|
+
|
|
213
|
+
## ๐ค Contributing
|
|
214
|
+
|
|
215
|
+
Development is intent-first and test-first: a change starts as a specification change, then a
|
|
216
|
+
failing test, then code. The [guide](https://thisisthepy.github.io/pythonx-compose/status.html) lists what is open and where help is
|
|
217
|
+
useful. Please open an issue before large changes.
|
|
218
|
+
|
|
219
|
+
## Maintainers
|
|
220
|
+
|
|
221
|
+
| Name | Area | Since |
|
|
222
|
+
|---|---|---|
|
|
223
|
+
| [@b-re-w](https://github.com/b-re-w) | Composable runtime | 2023 |
|
|
224
|
+
| [@rnoro5122](https://github.com/rnoro5122) | Material 3 | 2024 |
|
|
225
|
+
|
|
226
|
+
## License
|
|
227
|
+
|
|
228
|
+
[MIT](https://github.com/thisisthepy/pythonx-compose/blob/main/LICENSE) ยฉ 2023โ2024 BREW (b-re-w), Jong-uk Lee (rnoro5122)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
pythonx/compose/__init__.py,sha256=K-8rgm1geZeKhdUuaLSaPmxcphmROW87XNB8y_Eemy8,91
|
|
2
|
+
pythonx/compose/__init__.pyi,sha256=oAwzBMV6dLFLXeSjpRjAbRGUc9yG85n3QaCHVHrUexE,180
|
|
3
|
+
pythonx/compose/_reexport.py,sha256=gQA933zm7MUzDR04wGH_UDXQcyjOA0WJuFFW7m0svzU,22434
|
|
4
|
+
pythonx/compose/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
pythonx/compose/pythonx-map.toml,sha256=90e5Eqy1YSjzWXseWYkaZNn1BBsw4w3qMFGte3esVtw,4736
|
|
6
|
+
pythonx/compose/foundation/__init__.py,sha256=oQhfAC6JC9isUXM5Jtr1lF0wTQNGnkoddcFNXYduNpc,218
|
|
7
|
+
pythonx/compose/foundation/__init__.pyi,sha256=Q7S12_IH8B4EFWlQTNo5A1rfMDP3pS235oU0GuBRs4g,624
|
|
8
|
+
pythonx/compose/foundation/layout/__init__.py,sha256=O9g6d4SAyGif6qcLCslkVpBuGf-vuNtpJ55LgwIoTQI,232
|
|
9
|
+
pythonx/compose/foundation/layout/__init__.pyi,sha256=RGgWtCuEjRgPor5kv50xRua77q7IMih8jSm8w59c300,217
|
|
10
|
+
pythonx/compose/foundation/text/__init__.py,sha256=8fS3L8jc-hx3_ouMMCOazy1UkLlmOKGfZpMXnJIXnV8,291
|
|
11
|
+
pythonx/compose/foundation/text/input/__init__.py,sha256=iA1AvX27FZ9vI9Q87gnJlFer7vrk-x1nVNOyoVmSu1w,240
|
|
12
|
+
pythonx/compose/foundation/text/input/__init__.pyi,sha256=lelcaPCkvaVucnKIR40KOM3VNI7vQnTy75H6slNHoPw,4178
|
|
13
|
+
pythonx/compose/layout/__init__.py,sha256=cMELFbyRo4ZqaHKxB3GdzhopRJzr6GJXQScma5BNoAc,1145
|
|
14
|
+
pythonx/compose/layout/__init__.pyi,sha256=n7TkhSS-faJHo91ME_E0lpTpT6O0WqHMdRX2VJt8UIk,62930
|
|
15
|
+
pythonx/compose/layout/arrangement.py,sha256=ICw-t12vhF81qtjtoESqIEwM17MFLdfXPrvkJ8Ag5hY,1688
|
|
16
|
+
pythonx/compose/material/__init__.py,sha256=RXRprKCc-Invi2mVuARsyDBOiud6WvULnPUCSKqYq_A,303
|
|
17
|
+
pythonx/compose/material/__init__.pyi,sha256=oAwzBMV6dLFLXeSjpRjAbRGUc9yG85n3QaCHVHrUexE,180
|
|
18
|
+
pythonx/compose/material/icons/__init__.py,sha256=fwzbsnBJke3zn03eNZSwWiMWWiYiiE2ElYHhnBwHfQs,380
|
|
19
|
+
pythonx/compose/material/icons/__init__.pyi,sha256=xGKqc6wUCii7NI6Pj8x0nHTUMN4zcMvFqbwTlefPrTM,88577
|
|
20
|
+
pythonx/compose/material3/__init__.py,sha256=7lehKeAo0AwbJFmy6_oDU_V2i5uRoWG_A-fdSueORpM,1407
|
|
21
|
+
pythonx/compose/material3/__init__.pyi,sha256=EDR8iinSBSZASF0w5Mzdx_vgs_qqLAVVuOoC9bFfzVQ,368246
|
|
22
|
+
pythonx/compose/runtime/__init__.py,sha256=Nx0jZItOYZd5AGA2syd7HwrDa5L3copjZSXu4CaHUWk,6167
|
|
23
|
+
pythonx/compose/runtime/__init__.pyi,sha256=FWnT_oiDy2eHL-Zpif43eNYNEY8iummnIN6CEJuxV_s,9461
|
|
24
|
+
pythonx/compose/ui/__init__.py,sha256=Ue4FvQt20Nu7R-sh60NJLAU0Y-b377sxjGPQ9tfw4Bc,982
|
|
25
|
+
pythonx/compose/ui/__init__.pyi,sha256=NhWGIPbuYCFSu3SnsS313T5JOTiQLQsVNnZPsBS6fvA,52440
|
|
26
|
+
pythonx/compose/ui/alignment.py,sha256=fzOVX9eO_4tIE3vdhn8RVOf5CUlftUKCwdecgGdedZ0,2571
|
|
27
|
+
pythonx/compose/ui/modifier.py,sha256=77B4ZJZr4v2CEcLakhQWEasO_vayvG8NQ_wY2nbjSmo,5380
|
|
28
|
+
pythonx/compose/ui/graphics/__init__.py,sha256=OYK1OCsJNU4qtFM4t8InHV-zYElahfXTV-1jOHhvXZQ,220
|
|
29
|
+
pythonx/compose/ui/graphics/__init__.pyi,sha256=vbfUTeUZd7AIvV84hVe-x3-qhQ3kzF1lp8pDX0daGBA,45253
|
|
30
|
+
pythonx/compose/ui/graphics/vector/__init__.py,sha256=TT5ovTRBMVol19gCMGb76ofiKRKilFX_HCoaFm7kcAo,234
|
|
31
|
+
pythonx/compose/ui/graphics/vector/__init__.pyi,sha256=5jvDBN8hcZ1SNbfRhqbPToIRGTFyv4j7hfHC4TTOK_k,16176
|
|
32
|
+
pythonx/compose/ui/text/__init__.py,sha256=f71HMHOx39UqyVzciTM0TbMQNoW2M7Vs3sR-znkr0qk,212
|
|
33
|
+
pythonx/compose/ui/text/__init__.pyi,sha256=ketkdS9bguddaSvrCqmrIhQ_Ef5TkeRxd13kmJ6DZw8,49687
|
|
34
|
+
pythonx/compose/ui/unit/__init__.py,sha256=f9d0sbMDyu3kfbbanO6CypG5mjug7RNdhFBxOqLahpg,812
|
|
35
|
+
pythonx/compose/ui/unit/__init__.pyi,sha256=_LOR2Kc9xwTtKfQbR5XDSJiUs7XtA5R43dphyiUC-0E,17550
|
|
36
|
+
pythonx_compose-0.1.0a1.dist-info/licenses/LICENSE,sha256=Ov5Kj79gIp7df28WOw2Oj_cxsH_iyTl0C2HQnByrYtg,1100
|
|
37
|
+
pythonx_compose-0.1.0a1.dist-info/METADATA,sha256=ojnvsP_omcT13lukUBDINCaLQohMcYtDSDJfHwkENiE,12053
|
|
38
|
+
pythonx_compose-0.1.0a1.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
39
|
+
pythonx_compose-0.1.0a1.dist-info/top_level.txt,sha256=YJqbK1TeSSJywOaV8Al4dTecD2DXbmTQeiLDQIe1iqg,8
|
|
40
|
+
pythonx_compose-0.1.0a1.dist-info/RECORD,,
|