zettcode-tui 0.4.0__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 (83) hide show
  1. zettcode/tui/__init__.py +422 -0
  2. zettcode/tui/_compat.py +32 -0
  3. zettcode/tui/capabilities.py +107 -0
  4. zettcode/tui/clipboard.py +91 -0
  5. zettcode/tui/console.py +229 -0
  6. zettcode/tui/core/__init__.py +63 -0
  7. zettcode/tui/core/app.py +658 -0
  8. zettcode/tui/core/events.py +134 -0
  9. zettcode/tui/core/focus.py +85 -0
  10. zettcode/tui/core/geometry.py +212 -0
  11. zettcode/tui/core/host.py +66 -0
  12. zettcode/tui/core/keymap.py +218 -0
  13. zettcode/tui/core/scheduler.py +105 -0
  14. zettcode/tui/core/screen.py +80 -0
  15. zettcode/tui/core/theme.py +248 -0
  16. zettcode/tui/core/widget.py +204 -0
  17. zettcode/tui/gallery.py +588 -0
  18. zettcode/tui/glyphs.py +73 -0
  19. zettcode/tui/input/__init__.py +18 -0
  20. zettcode/tui/input/bridge.py +46 -0
  21. zettcode/tui/input/decoder.py +234 -0
  22. zettcode/tui/input/events.py +64 -0
  23. zettcode/tui/input/keys.py +289 -0
  24. zettcode/tui/input/reader.py +147 -0
  25. zettcode/tui/layout/__init__.py +24 -0
  26. zettcode/tui/layout/box.py +153 -0
  27. zettcode/tui/layout/overlay.py +164 -0
  28. zettcode/tui/layout/scroll.py +477 -0
  29. zettcode/tui/layout/solver.py +95 -0
  30. zettcode/tui/layout/spacing.py +137 -0
  31. zettcode/tui/py.typed +0 -0
  32. zettcode/tui/render/__init__.py +71 -0
  33. zettcode/tui/render/ansi.py +371 -0
  34. zettcode/tui/render/canvas.py +153 -0
  35. zettcode/tui/render/code.py +456 -0
  36. zettcode/tui/render/color.py +177 -0
  37. zettcode/tui/render/renderer.py +151 -0
  38. zettcode/tui/render/rich_text.py +80 -0
  39. zettcode/tui/render/style.py +121 -0
  40. zettcode/tui/render/sweep.py +87 -0
  41. zettcode/tui/render/text.py +319 -0
  42. zettcode/tui/runner.py +316 -0
  43. zettcode/tui/terminal.py +222 -0
  44. zettcode/tui/testing/__init__.py +6 -0
  45. zettcode/tui/testing/harness.py +220 -0
  46. zettcode/tui/testing/snapshot.py +64 -0
  47. zettcode/tui/theme_file.py +300 -0
  48. zettcode/tui/themes/ayu-mirage.toml +44 -0
  49. zettcode/tui/themes/catppuccin-latte.toml +44 -0
  50. zettcode/tui/themes/catppuccin-mocha.toml +44 -0
  51. zettcode/tui/themes/dracula.toml +44 -0
  52. zettcode/tui/themes/github-dimmed.toml +44 -0
  53. zettcode/tui/themes/github-light.toml +44 -0
  54. zettcode/tui/themes/gruvbox-dark.toml +44 -0
  55. zettcode/tui/themes/gruvbox-light.toml +44 -0
  56. zettcode/tui/themes/kanagawa.toml +44 -0
  57. zettcode/tui/themes/nord.toml +44 -0
  58. zettcode/tui/themes/one-dark.toml +44 -0
  59. zettcode/tui/themes/rose-pine-dawn.toml +44 -0
  60. zettcode/tui/themes/rose-pine.toml +44 -0
  61. zettcode/tui/themes/solarized-dark.toml +44 -0
  62. zettcode/tui/themes/solarized-light.toml +44 -0
  63. zettcode/tui/themes/tokyo-night.toml +44 -0
  64. zettcode/tui/widgets/__init__.py +121 -0
  65. zettcode/tui/widgets/collapsible.py +116 -0
  66. zettcode/tui/widgets/completion.py +211 -0
  67. zettcode/tui/widgets/console.py +442 -0
  68. zettcode/tui/widgets/dialog.py +165 -0
  69. zettcode/tui/widgets/diff.py +236 -0
  70. zettcode/tui/widgets/list.py +293 -0
  71. zettcode/tui/widgets/list_page.py +121 -0
  72. zettcode/tui/widgets/markdown.py +657 -0
  73. zettcode/tui/widgets/progress.py +166 -0
  74. zettcode/tui/widgets/rich_text.py +84 -0
  75. zettcode/tui/widgets/status.py +106 -0
  76. zettcode/tui/widgets/table.py +101 -0
  77. zettcode/tui/widgets/tasks.py +130 -0
  78. zettcode/tui/widgets/text.py +111 -0
  79. zettcode/tui/widgets/textarea.py +671 -0
  80. zettcode/tui/widgets/toast.py +137 -0
  81. zettcode_tui-0.4.0.dist-info/METADATA +20 -0
  82. zettcode_tui-0.4.0.dist-info/RECORD +83 -0
  83. zettcode_tui-0.4.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,137 @@
1
+ """A transient notice that expires on the application clock."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Callable
6
+ from time import monotonic
7
+
8
+ from zettcode.tui import RULE
9
+
10
+ from ..core.focus import walk
11
+ from ..core.geometry import Constraints, Size
12
+ from ..core.widget import Widget
13
+ from ..render import Canvas, Style, truncate
14
+ from ..render.text import display_width
15
+
16
+ LEVELS = ("info", "success", "warning", "error")
17
+
18
+
19
+ class Toast(Widget):
20
+ """A framed notice that counts down while the application keeps painting.
21
+
22
+ Shape::
23
+
24
+ +-----------------------+
25
+ | saved to disk | <- frame in the level's colour
26
+ +-----------------------+
27
+
28
+ The frame carries the level's colour; the message stays in the primary
29
+ foreground so a one-line notice reads as text rather than as a warning.
30
+
31
+ Mount registers a scheduler token so the frame loop keeps running for the
32
+ countdown; ``on_tick`` dismisses it once the deadline passes, either by
33
+ popping its own screen or by calling ``on_expire``.
34
+ """
35
+
36
+ def __init__(
37
+ self,
38
+ message: str,
39
+ *,
40
+ level: str = "info",
41
+ duration: float = 3.0,
42
+ clock=monotonic,
43
+ on_expire: Callable[[], None] | None = None,
44
+ ) -> None:
45
+ """Configure the message, the level, the countdown, and the expiry hook.
46
+
47
+ Args:
48
+ message: Single line of text; truncated to the toast width.
49
+ level: Colour key, one of ``LEVELS``.
50
+ duration: Seconds the toast stays up, floored at zero.
51
+ clock: Time source for the countdown, injectable for tests.
52
+ on_expire: Called once the countdown ends, instead of the toast
53
+ popping its own screen. The toast then stays mounted until the
54
+ owner removes it.
55
+ """
56
+ super().__init__()
57
+ if level not in LEVELS:
58
+ raise ValueError(f"Unknown toast level: {level!r}")
59
+ self.message = message
60
+ self.level = level
61
+ self.duration = max(0.0, duration)
62
+ self.clock = clock
63
+ self.on_expire = on_expire
64
+ self._token = f"toast:{id(self)}"
65
+ self._deadline = 0.0
66
+
67
+ @property
68
+ def remaining(self) -> float:
69
+ """Return the seconds left before the toast expires."""
70
+ return max(0.0, self._deadline - self.clock())
71
+
72
+ @property
73
+ def expired(self) -> bool:
74
+ """Return whether the countdown has run out."""
75
+ return self.clock() >= self._deadline
76
+
77
+ def on_mount(self) -> None:
78
+ """Start the countdown and keep the frame loop alive while it runs."""
79
+ self._deadline = self.clock() + self.duration
80
+ if self.app is not None:
81
+ self.app.scheduler.animate(self._token)
82
+
83
+ def on_unmount(self) -> None:
84
+ """Release the animation token when the toast is removed."""
85
+ if self.app is not None:
86
+ self.app.scheduler.animate(self._token, active=False)
87
+
88
+ def on_tick(self) -> None:
89
+ """Dismiss once the countdown reaches zero."""
90
+ if not self.expired:
91
+ return
92
+ if self.on_expire is not None:
93
+ self.on_expire()
94
+ return
95
+ if self.app is not None and any(widget is self for widget in walk(self.app.screens.top.widget)):
96
+ self.app.pop_screen()
97
+
98
+ def measure(self, constraints: Constraints) -> Size:
99
+ """Ask for the frame plus one row of message."""
100
+ return constraints.constrain(Size(display_width(self.message) + 4, 3))
101
+
102
+ def render(self, canvas: Canvas) -> None:
103
+ """Paint the frame and the message in the level's colour."""
104
+ if self.rect.empty:
105
+ return
106
+ theme = self.theme
107
+ # Clear to the page colour rather than to the terminal's default: the
108
+ # toast floats over the shell, so "no style" would punch a hole through
109
+ # whatever palette is active.
110
+ canvas.fill(
111
+ self.rect.x,
112
+ self.rect.y,
113
+ self.rect.width,
114
+ self.rect.height,
115
+ Style(background=theme.background),
116
+ " ",
117
+ )
118
+ color = {
119
+ "info": theme.text,
120
+ "success": theme.accent,
121
+ "warning": theme.warning,
122
+ "error": theme.error,
123
+ }[self.level]
124
+ width = self.rect.width
125
+ rule = RULE * max(0, width - 2)
126
+ canvas.draw_text(self.rect.x, self.rect.y, f"\u250c{rule}\u2510", Style(foreground=color))
127
+ canvas.draw_text(self.rect.x, self.rect.y + 1, "\u2502", Style(foreground=color))
128
+ canvas.draw_text(
129
+ self.rect.x + 2,
130
+ self.rect.y + 1,
131
+ truncate(self.message, max(0, width - 4)),
132
+ Style(foreground=theme.text),
133
+ max_width=max(0, width - 4),
134
+ )
135
+ canvas.draw_text(self.rect.x + width - 1, self.rect.y + 1, "\u2502", Style(foreground=color))
136
+ if self.rect.height > 2:
137
+ canvas.draw_text(self.rect.x, self.rect.y + 2, f"\u2514{rule}\u2518", Style(foreground=color))
@@ -0,0 +1,20 @@
1
+ Metadata-Version: 2.5
2
+ Name: zettcode-tui
3
+ Version: 0.4.0
4
+ Summary: The widget framework ZettCode's terminal is drawn with, and nothing else
5
+ Project-URL: Repository, https://github.com/Chang-LeHung/zettcode
6
+ Author: Chang-LeHung
7
+ License-Expression: MIT
8
+ Keywords: terminal,tui,widgets,zettcode
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Programming Language :: Python :: 3.14
15
+ Classifier: Programming Language :: Python :: 3.15
16
+ Classifier: Typing :: Typed
17
+ Requires-Python: >=3.10
18
+ Requires-Dist: pyperclip<2,>=1.9
19
+ Requires-Dist: tomli<3,>=2; python_version < '3.11'
20
+ Requires-Dist: wcwidth<1,>=0.2
@@ -0,0 +1,83 @@
1
+ zettcode/tui/__init__.py,sha256=uAVxeBDf5OFEbIT6cowmBGcrdpiFstgkcraqx2hR97k,9530
2
+ zettcode/tui/_compat.py,sha256=tPaYFdlYNeeSxSa_nvis2Yl_ccBmcshKPUIxPiFrhbY,1257
3
+ zettcode/tui/capabilities.py,sha256=Falj59bBouh2hg_kY7Q7FqUHNL9CLTPJe6c6TjzK8RA,4033
4
+ zettcode/tui/clipboard.py,sha256=N6jJhxVRr47ZT6Bsn0DVcjf6jIGACr6nYZyWluzhkJ0,4237
5
+ zettcode/tui/console.py,sha256=gLfKqPLTIUUH9UzJD8137g80-SpZKsHaoyTIU3XsdFc,8822
6
+ zettcode/tui/gallery.py,sha256=4lstm2IB33tVn6ZgUYAkUbjmwHpCHlJybQKydJAUGao,20951
7
+ zettcode/tui/glyphs.py,sha256=f7Kbm6wH8mTmALKNptji5v2CaHjctSRs3-z_MReKrEs,2495
8
+ zettcode/tui/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ zettcode/tui/runner.py,sha256=9EMqUMm7vIEixadyVKG2dW_XFVs4Cf7O5Nj5u1ezHvE,15221
10
+ zettcode/tui/terminal.py,sha256=d6-ZyQ4BPtwMArZ6ZX3V4u3bPOsyfw2U0k2RBF9sjvs,9827
11
+ zettcode/tui/theme_file.py,sha256=FaJaXKtd5fCVZPGOiWIKxIspYlScUIcgJZ7cYrY76DU,12186
12
+ zettcode/tui/core/__init__.py,sha256=-a-ksfiJ71Dos8MYjHIsxoD9daupeAUKnvqGLiz-zLw,1304
13
+ zettcode/tui/core/app.py,sha256=3pjYwszlLGeXq4IrmtF8TWNdsBh7b7wFXUc23Yi9THc,26912
14
+ zettcode/tui/core/events.py,sha256=f9xgXD7JjbTAXQtHtuDnlaZ52P_gUnbt3VNqySLZoUw,3554
15
+ zettcode/tui/core/focus.py,sha256=6V6pAgRdzXcjoRGeutOuMFBhuIVekifR3y-JMCsNrpE,2871
16
+ zettcode/tui/core/geometry.py,sha256=S5Abmk0eenuf-SXJRrjBOQwwRlSms2gMfuS4GeoUZbY,6626
17
+ zettcode/tui/core/host.py,sha256=ETzblei1B4P7U5558XQAva6Qtrwj_xmsIswix_V5xQM,2164
18
+ zettcode/tui/core/keymap.py,sha256=JoJ4jlXX1Uco6WlBLF3GCag4eCgA28PoA7nD6EhR02M,7822
19
+ zettcode/tui/core/scheduler.py,sha256=5f_DGU9rnCcIK7rSfrA-mA77j6gNdIp9Iq-nUmrsWXQ,3821
20
+ zettcode/tui/core/screen.py,sha256=fYAbb1ya2JXcR45cbTDknxFxY-Jy42jbZ3qN52xZlDE,2585
21
+ zettcode/tui/core/theme.py,sha256=DiN4gH3LfH5zMk1tX8Cvc7_dd7fDJnldPPSKVHqJa7Y,11514
22
+ zettcode/tui/core/widget.py,sha256=3NmBhMw1hMQpdoP7_VvrHh3_-K3-2KBqxVlZgLmgOhw,7269
23
+ zettcode/tui/input/__init__.py,sha256=95b0q0Sg7NdzYnwLKnYwYk_4xMuWN8DWZPk96bW7s-E,412
24
+ zettcode/tui/input/bridge.py,sha256=H22LilSVW8RQzXYro1I-F-PrZToBN893fuJhAHhZVlE,1484
25
+ zettcode/tui/input/decoder.py,sha256=OKwjSDI1RszW-Zn-IpAUAfYwKLfJUGhlb9EZwRAIUFQ,10208
26
+ zettcode/tui/input/events.py,sha256=B_BeFCHSAjKOCPrBIHxAXNZjZEeUf_P7_4fS7qBUN1M,2093
27
+ zettcode/tui/input/keys.py,sha256=7oGhl_VktNdsXOzwBqL6JxPqYN_i-04FVFg7uPdyI-g,11167
28
+ zettcode/tui/input/reader.py,sha256=Z_3XQkrzm1NAB68C2lir0HYZLdomkSFggO5x7_LvhPw,6128
29
+ zettcode/tui/layout/__init__.py,sha256=ryqAsk1Qpw3ndcTaqbLTfCypihHx2BG9hEKwf1WX5b8,539
30
+ zettcode/tui/layout/box.py,sha256=ZUcr1Vw3lKcmIFD8K9h1DOqD5awFdRFsZVOxF5HMOTc,5576
31
+ zettcode/tui/layout/overlay.py,sha256=i6VOFN-l7sfx1J_L4NtubYUlrw3ziMa7J-E5gftGwwc,6362
32
+ zettcode/tui/layout/scroll.py,sha256=yEZJJ9--AAiZL8KYdTPoaptpEJOCPwYRZtaI6pyVAhY,20526
33
+ zettcode/tui/layout/solver.py,sha256=D_VSpgRjuRUs421YcHmG118BDo3lZXZ8EqP-5fXV8Wg,3588
34
+ zettcode/tui/layout/spacing.py,sha256=4Ifz6MS8Q8ZKwlPXF6cYJkF7P23H9vEz1EJcIEPWUFI,5623
35
+ zettcode/tui/render/__init__.py,sha256=b_i8mh9j-TG8pMemNlWU5W4VOV_WIc9FR_n6dO-pxgM,1643
36
+ zettcode/tui/render/ansi.py,sha256=1RrPxfuB0604rfx8CySYNmHN_gUhFRoSm_GWEwICOUU,14748
37
+ zettcode/tui/render/canvas.py,sha256=odK3Fa3b7DZQq_ECzLdZ5Of-ONDRUPJcp8iN2oe8ElM,6163
38
+ zettcode/tui/render/code.py,sha256=ft1zR-814I_RGfRInqPI7ThUO3gweB511Qg-DNIXWI4,19435
39
+ zettcode/tui/render/color.py,sha256=b58WkKeLFWaxYYrvfaD8y2svwFlJLpuA8WHon0bPzWg,6425
40
+ zettcode/tui/render/renderer.py,sha256=v88QJEohEu8CIEez8lRple68MP7yainkoAg5Kh-uMmY,7081
41
+ zettcode/tui/render/rich_text.py,sha256=WNJCrK6yrk6AJzdrE_nxrpHTsJmH859sk5gO9UjQwBY,3305
42
+ zettcode/tui/render/style.py,sha256=O57Czv8V0bHjIqGprCEBmtooH76qyTqrm_-KRyPMJBE,3835
43
+ zettcode/tui/render/sweep.py,sha256=b4Fth9njPaSmp_jcxam3IRfLffHh_j9H5Kzqkw6dhtw,3307
44
+ zettcode/tui/render/text.py,sha256=D6EqTmVm2-IO0f2OjED2q9_nsuKpsg1Ap6jifllmdbM,11529
45
+ zettcode/tui/testing/__init__.py,sha256=k2AzxYGGLKFOklY6qtV1NcyRhkC0VVcvaTeKXHELC9A,259
46
+ zettcode/tui/testing/harness.py,sha256=nLjcG-6Ykd-ZvZiz3-p2aJdGTtorQq8h-xP-MokadrM,8363
47
+ zettcode/tui/testing/snapshot.py,sha256=8ugKcy2LJLnlAMaZHlfgw_ob2yxNAu8fuIBb7ztdj4w,2279
48
+ zettcode/tui/themes/ayu-mirage.toml,sha256=lr5hKwMnUWKwtYbDWKk9C2H5uxiY8Rf9fHLEGLBUGck,805
49
+ zettcode/tui/themes/catppuccin-latte.toml,sha256=1KEBekwaS77p1vjBVf6otR32IjT1Ink1gux9kep1T88,821
50
+ zettcode/tui/themes/catppuccin-mocha.toml,sha256=ey6M09D6CyECLDHQXeL_7LVgh6hqoG_ieCXBQ0kF4h8,813
51
+ zettcode/tui/themes/dracula.toml,sha256=ZfzUhg6P0LO-9LYMpCytjvq8cgClIJgwTWgE-HPKW9c,809
52
+ zettcode/tui/themes/github-dimmed.toml,sha256=O_DRAaYlZJwFIKQA7mQcrlP9ULSz32kKK15s_ylwIVc,813
53
+ zettcode/tui/themes/github-light.toml,sha256=dvMCtyGiMZtR5PgWlHQFbTqxbLeBOVGgVErsdvtOU5M,818
54
+ zettcode/tui/themes/gruvbox-dark.toml,sha256=tFPaEJCo4L78TYCXQ8w6r-WRrIce3atJrFg0dmQCLps,811
55
+ zettcode/tui/themes/gruvbox-light.toml,sha256=PhNkmgWoupNqk6aq1p2TXT8GgEeQ-GALZLfN-kne_js,805
56
+ zettcode/tui/themes/kanagawa.toml,sha256=JPrNzSGDSb3Usnu7akB3_udjLq7bB7_s6g-liPP0kIQ,804
57
+ zettcode/tui/themes/nord.toml,sha256=4WD2qcS6JG1OcTNDIF9fHVHxwaSJa68LfmKmEscYXB4,818
58
+ zettcode/tui/themes/one-dark.toml,sha256=1AtHACprq8hg4U7zb_qV6b7hSJXJkelgkpfOplvAcLE,813
59
+ zettcode/tui/themes/rose-pine-dawn.toml,sha256=ROXtFqGp34Qe84pbyOGdcShzxbehlNj7cDKNjuDlG6E,813
60
+ zettcode/tui/themes/rose-pine.toml,sha256=w747JzGFDn-UZtQopK9obo3OLHdKTyno3HNyfoqgcgQ,807
61
+ zettcode/tui/themes/solarized-dark.toml,sha256=vVUdHEUTaDv9NqQgIhCucjm_qIrNA9mokSHOxD23NoE,804
62
+ zettcode/tui/themes/solarized-light.toml,sha256=zaPeXgUgDRf19AbX2sax2z-DUphXL2smmzxn1oUBOZM,810
63
+ zettcode/tui/themes/tokyo-night.toml,sha256=UpeOL8GJ_wfw2OJMEvPE9bUpMUeMD2BIX0bNu6wJlqM,809
64
+ zettcode/tui/widgets/__init__.py,sha256=_8AEo33GKSpdeJ30_GiPKbAJ_qpFC69TQFux57hrmC4,3447
65
+ zettcode/tui/widgets/collapsible.py,sha256=rYZ-qfvd5MPhenlXxM9w78eFsg8kUXQgQ61vr_2FeZA,4311
66
+ zettcode/tui/widgets/completion.py,sha256=DqlnNOfG6A4NSFOInpOlYEOKVB_cJZxqXk200pPSoeE,8622
67
+ zettcode/tui/widgets/console.py,sha256=osYYmfpJk2pXdz4sGDA0GjouHAz_zoqMy_xhFB39bz8,18544
68
+ zettcode/tui/widgets/dialog.py,sha256=3Ip4JEmuGmQsc8Y_358hgjGlJHS_lJvbCVVArX3ZPfQ,5846
69
+ zettcode/tui/widgets/diff.py,sha256=XmkswgYEhlxDx0KSPQJUhdYjB2uFXO8qu84yjY2hHUQ,9288
70
+ zettcode/tui/widgets/list.py,sha256=DTDQo-kcj93YfmiqGA9GTFQ_taoLfIfMIUs6uYiObQw,12119
71
+ zettcode/tui/widgets/list_page.py,sha256=jyvSggXpv_OGV1T86zHLVBT0j92-Z_q1UAx3ZPKMSpQ,5627
72
+ zettcode/tui/widgets/markdown.py,sha256=GJ3K-riOujSjureFvViNajF01By13vjyaoj1Aofc3eg,26643
73
+ zettcode/tui/widgets/progress.py,sha256=mTn5ToMkLSr6-KPCm4WCPNqZ0CUuX3RTRV_TQP8CXO0,6223
74
+ zettcode/tui/widgets/rich_text.py,sha256=J4Fhn4je5uFL7lcVQsoIqx9DkNdXWT0HyxoN1LgtI18,3762
75
+ zettcode/tui/widgets/status.py,sha256=e7jopfHt9JMGoODZtqGtsU79ZyFAfDlJc6hbmT05qC4,4386
76
+ zettcode/tui/widgets/table.py,sha256=DMgKz-dGeE-Qt2QZD-OuD3j-gN_i7IQ79-ClhsJMC5E,3724
77
+ zettcode/tui/widgets/tasks.py,sha256=v6QazBKnS8CE8rzzRtBarDQSvvVRmxSAw-VVXVtKjcY,6021
78
+ zettcode/tui/widgets/text.py,sha256=xXeOGMv6vAFKsIXBnNsCcm_-LR9RZTpogwgZYfF03gw,3824
79
+ zettcode/tui/widgets/textarea.py,sha256=af90H5f4P8BbEtp2Hu_R_4PvI45ZOzh-Sz2-jtqJHxA,28067
80
+ zettcode/tui/widgets/toast.py,sha256=3Ubqwk6yT6-Rgdn3L4iEl6DG8bjyXGZ9TIlbBw4OJoU,5027
81
+ zettcode_tui-0.4.0.dist-info/METADATA,sha256=VBmapr04A1CIMNlAzlQ_nnPDR0p47vJAPiAfbtkf8RU,819
82
+ zettcode_tui-0.4.0.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
83
+ zettcode_tui-0.4.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.33.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any