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.
Files changed (40) hide show
  1. pythonx/compose/__init__.py +4 -0
  2. pythonx/compose/__init__.pyi +1 -0
  3. pythonx/compose/_reexport.py +512 -0
  4. pythonx/compose/foundation/__init__.py +5 -0
  5. pythonx/compose/foundation/__init__.pyi +17 -0
  6. pythonx/compose/foundation/layout/__init__.py +5 -0
  7. pythonx/compose/foundation/layout/__init__.pyi +2 -0
  8. pythonx/compose/foundation/text/__init__.py +5 -0
  9. pythonx/compose/foundation/text/input/__init__.py +5 -0
  10. pythonx/compose/foundation/text/input/__init__.pyi +78 -0
  11. pythonx/compose/layout/__init__.py +25 -0
  12. pythonx/compose/layout/__init__.pyi +878 -0
  13. pythonx/compose/layout/arrangement.py +34 -0
  14. pythonx/compose/material/__init__.py +8 -0
  15. pythonx/compose/material/__init__.pyi +1 -0
  16. pythonx/compose/material/icons/__init__.py +9 -0
  17. pythonx/compose/material/icons/__init__.pyi +1159 -0
  18. pythonx/compose/material3/__init__.py +24 -0
  19. pythonx/compose/material3/__init__.pyi +3305 -0
  20. pythonx/compose/py.typed +0 -0
  21. pythonx/compose/pythonx-map.toml +73 -0
  22. pythonx/compose/runtime/__init__.py +128 -0
  23. pythonx/compose/runtime/__init__.pyi +180 -0
  24. pythonx/compose/ui/__init__.py +21 -0
  25. pythonx/compose/ui/__init__.pyi +975 -0
  26. pythonx/compose/ui/alignment.py +47 -0
  27. pythonx/compose/ui/graphics/__init__.py +5 -0
  28. pythonx/compose/ui/graphics/__init__.pyi +795 -0
  29. pythonx/compose/ui/graphics/vector/__init__.py +5 -0
  30. pythonx/compose/ui/graphics/vector/__init__.pyi +221 -0
  31. pythonx/compose/ui/modifier.py +110 -0
  32. pythonx/compose/ui/text/__init__.py +5 -0
  33. pythonx/compose/ui/text/__init__.pyi +703 -0
  34. pythonx/compose/ui/unit/__init__.py +19 -0
  35. pythonx/compose/ui/unit/__init__.pyi +348 -0
  36. pythonx_compose-0.1.0a1.dist-info/METADATA +228 -0
  37. pythonx_compose-0.1.0a1.dist-info/RECORD +40 -0
  38. pythonx_compose-0.1.0a1.dist-info/WHEEL +5 -0
  39. pythonx_compose-0.1.0a1.dist-info/licenses/LICENSE +21 -0
  40. 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
+ [![License: MIT](https://img.shields.io/badge/license-MIT-7c4dff.svg)](https://github.com/thisisthepy/pythonx-compose/blob/main/LICENSE)
35
+ [![Python](https://img.shields.io/badge/python-3.11%2B-7c4dff.svg)](https://github.com/thisisthepy/pythonx-compose/blob/main/pyproject.toml)
36
+ [![pip](https://img.shields.io/badge/pip-pythonx--compose-7c4dff.svg)](https://github.com/thisisthepy/pythonx-compose/blob/main/pyproject.toml)
37
+ [![Status](https://img.shields.io/badge/status-pre--alpha-lightgrey.svg)](#-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,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+