runtimepy 5.6.4__py3-none-any.whl → 5.7.1__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 (32) hide show
  1. runtimepy/__init__.py +2 -2
  2. runtimepy/data/css/bootstrap_extra.css +7 -3
  3. runtimepy/data/css/font.css +47 -0
  4. runtimepy/data/css/main.css +0 -1
  5. runtimepy/data/favicon.ico +0 -0
  6. runtimepy/data/js/classes/WindowHashManager.js +29 -7
  7. runtimepy/data/static/svg/chip-circle-bootstrap.svg +22 -0
  8. runtimepy/data/static/woff2/CascadiaCode-Bold.woff2 +0 -0
  9. runtimepy/data/static/woff2/CascadiaCode-BoldItalic.woff2 +0 -0
  10. runtimepy/data/static/woff2/CascadiaCode-Italic.woff2 +0 -0
  11. runtimepy/data/static/woff2/CascadiaCode-Regular.woff2 +0 -0
  12. runtimepy/data/static/woff2/CascadiaMono-Bold.woff2 +0 -0
  13. runtimepy/data/static/woff2/CascadiaMono-BoldItalic.woff2 +0 -0
  14. runtimepy/data/static/woff2/CascadiaMono-Italic.woff2 +0 -0
  15. runtimepy/data/static/woff2/CascadiaMono-Regular.woff2 +0 -0
  16. runtimepy/data/static/woff2/README.md +9 -0
  17. runtimepy/net/server/app/base.py +2 -3
  18. runtimepy/net/server/app/bootstrap/elements.py +1 -1
  19. runtimepy/net/server/app/bootstrap/tabs.py +12 -3
  20. runtimepy/net/server/app/env/__init__.py +5 -1
  21. runtimepy/net/server/app/env/modal.py +1 -1
  22. runtimepy/net/server/app/env/settings.py +2 -2
  23. runtimepy/net/server/app/env/tab/html.py +7 -4
  24. runtimepy/net/server/app/placeholder.py +1 -1
  25. runtimepy/net/server/app/sound.py +1 -1
  26. runtimepy/requirements.txt +1 -1
  27. {runtimepy-5.6.4.dist-info → runtimepy-5.7.1.dist-info}/METADATA +6 -6
  28. {runtimepy-5.6.4.dist-info → runtimepy-5.7.1.dist-info}/RECORD +32 -21
  29. {runtimepy-5.6.4.dist-info → runtimepy-5.7.1.dist-info}/WHEEL +1 -1
  30. {runtimepy-5.6.4.dist-info → runtimepy-5.7.1.dist-info}/LICENSE +0 -0
  31. {runtimepy-5.6.4.dist-info → runtimepy-5.7.1.dist-info}/entry_points.txt +0 -0
  32. {runtimepy-5.6.4.dist-info → runtimepy-5.7.1.dist-info}/top_level.txt +0 -0
runtimepy/__init__.py CHANGED
@@ -1,7 +1,7 @@
1
1
  # =====================================
2
2
  # generator=datazen
3
3
  # version=3.1.4
4
- # hash=beefe82269955725f177c01474f7cea1
4
+ # hash=405585c0fbfcc966ef193f744f21fa59
5
5
  # =====================================
6
6
 
7
7
  """
@@ -10,7 +10,7 @@ Useful defaults and other package metadata.
10
10
 
11
11
  DESCRIPTION = "A framework for implementing Python services."
12
12
  PKG_NAME = "runtimepy"
13
- VERSION = "5.6.4"
13
+ VERSION = "5.7.1"
14
14
 
15
15
  # runtimepy-specific content.
16
16
  METRICS_NAME = "metrics"
@@ -77,19 +77,17 @@ textarea.text-logs {
77
77
  padding-bottom: 0 !important;
78
78
 
79
79
  border-top: 0;
80
- background-color: var(--bs-secondary-bg-subtle);
81
80
  }
82
81
 
83
82
  .vertical-divider {
84
83
  flex-basis: 0.75em;
85
84
  flex-grow: 0;
86
85
  flex-shrink: 0;
87
- background-color: var(--bs-secondary-bg-subtle);
88
86
  }
89
87
 
90
88
  .vertical-divider:hover {
91
89
  cursor: col-resize;
92
- background-color: var(--bs-secondary-bg);
90
+ background-color: var(--bs-highlight-bg) !important;
93
91
  }
94
92
 
95
93
  button:hover {
@@ -99,3 +97,9 @@ button:hover {
99
97
  .channel-value-input {
100
98
  width: 6em;
101
99
  }
100
+
101
+ /* Prefer 'CascadiaCode' and 'CascadiaMono' at the highest priority. */
102
+ :root, [data-bs-theme=dark], [data-bs-theme=light] {
103
+ --bs-font-sans-serif: CascadiaCode, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
104
+ --bs-font-monospace: CascadiaMono, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
105
+ }
@@ -0,0 +1,47 @@
1
+ @font-face {
2
+ font-family: CascadiaCode;
3
+ src: url("/static/woff2/CascadiaCode-Regular.woff2");
4
+ }
5
+
6
+ @font-face {
7
+ font-family: CascadiaCode;
8
+ src: url("/static/woff2/CascadiaCode-Bold.woff2");
9
+ font-weight: bold;
10
+ }
11
+
12
+ @font-face {
13
+ font-family: CascadiaCode;
14
+ src: url("/static/woff2/CascadiaCode-BoldItalic.woff2");
15
+ font-weight: bold;
16
+ font-style: italic;
17
+ }
18
+
19
+ @font-face {
20
+ font-family: CascadiaCode;
21
+ src: url("/static/woff2/CascadiaCode-Italic.woff2");
22
+ font-style: italic;
23
+ }
24
+
25
+ @font-face {
26
+ font-family: CascadiaMono;
27
+ src: url("/static/woff2/CascadiaMono-Regular.woff2");
28
+ }
29
+
30
+ @font-face {
31
+ font-family: CascadiaMono;
32
+ src: url("/static/woff2/CascadiaMono-Bold.woff2");
33
+ font-weight: bold;
34
+ }
35
+
36
+ @font-face {
37
+ font-family: CascadiaMono;
38
+ src: url("/static/woff2/CascadiaMono-BoldItalic.woff2");
39
+ font-weight: bold;
40
+ font-style: italic;
41
+ }
42
+
43
+ @font-face {
44
+ font-family: CascadiaMono;
45
+ src: url("/static/woff2/CascadiaMono-Italic.woff2");
46
+ font-style: italic;
47
+ }
@@ -28,7 +28,6 @@ body > :first-child {
28
28
  width: 100vw;
29
29
  height: 100vh;
30
30
  opacity: 1.0;
31
- background-color: var(--bs-secondary-bg-subtle);
32
31
  }
33
32
 
34
33
  .click-plot {
Binary file
@@ -7,6 +7,7 @@ class WindowHashManager {
7
7
  this.tabFilter = "";
8
8
  this.tabsShown = true;
9
9
  this.channelsShown = true;
10
+ this.lightMode = false;
10
11
  this.plotChannels = {};
11
12
  this.filters = {};
12
13
  this.minTxPeriod = 0.0;
@@ -17,6 +18,15 @@ class WindowHashManager {
17
18
  this.update();
18
19
  }
19
20
 
21
+ lightDarkClick(event) {
22
+ this.lightMode = !this.lightMode;
23
+
24
+ document.getElementById("runtimepy")
25
+ .setAttribute("data-bs-theme", this.lightMode ? "light" : "dark");
26
+
27
+ this.update();
28
+ }
29
+
20
30
  channelClick(event) {
21
31
  this.channelsShown = !this.channelsShown;
22
32
 
@@ -106,6 +116,12 @@ class WindowHashManager {
106
116
  channelsButton.addEventListener("click", this.channelClick.bind(this));
107
117
  }
108
118
 
119
+ /* Click handler for light/dark toggle. */
120
+ let lightDarkButton = document.getElementById("theme-button");
121
+ if (lightDarkButton) {
122
+ lightDarkButton.addEventListener("click", this.lightDarkClick.bind(this));
123
+ }
124
+
109
125
  /* Click handlers for new window buttons. */
110
126
  for (const button of document.querySelectorAll(".window-button")) {
111
127
  button.onclick = () => {
@@ -150,13 +166,6 @@ class WindowHashManager {
150
166
  }
151
167
  }
152
168
 
153
- if (split.includes("hide-tabs")) {
154
- tabButton.click();
155
- }
156
- if (split.includes("hide-channels")) {
157
- channelsButton.click();
158
- }
159
-
160
169
  /* Check for tab filter. */
161
170
  for (let item of split) {
162
171
  if (item.includes("=")) {
@@ -171,6 +180,16 @@ class WindowHashManager {
171
180
  }
172
181
  }
173
182
  }
183
+
184
+ if (split.includes("hide-tabs")) {
185
+ tabButton.click();
186
+ }
187
+ if (split.includes("hide-channels")) {
188
+ channelsButton.click();
189
+ }
190
+ if (split.includes("light-mode")) {
191
+ lightDarkButton.click();
192
+ }
174
193
  }
175
194
  }
176
195
 
@@ -199,6 +218,9 @@ class WindowHashManager {
199
218
  if (!this.channelsShown) {
200
219
  hash += ",hide-channels"
201
220
  }
221
+ if (this.lightMode) {
222
+ hash += ",light-mode";
223
+ }
202
224
 
203
225
  if (this.minTxPeriod != 0.0) {
204
226
  hash += `,min-tx-period-ms=${this.minTxPeriod}`;
@@ -0,0 +1,22 @@
1
+ <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
2
+ <circle r="50.0" cx="50.0" cy="50.0" style="fill: #ADB5BD" />
3
+ <rect x="16.666666666666664" y="33.333333333333336" width="16.666666666666668" height="8.333333333333334" rx="4.166666666666667" ry="4.166666666666667" style="fill: #495057" />
4
+ <rect x="16.666666666666664" y="45.833333333333336" width="16.666666666666668" height="8.333333333333334" rx="4.166666666666667" ry="4.166666666666667" style="fill: #495057" />
5
+ <rect x="16.666666666666664" y="58.333333333333336" width="16.666666666666668" height="8.333333333333334" rx="4.166666666666667" ry="4.166666666666667" style="fill: #495057" />
6
+ <rect x="58.33333333333333" y="16.666666666666664" width="8.333333333333334" height="16.666666666666668" rx="4.166666666666667" ry="4.166666666666667" style="fill: #495057" />
7
+ <rect x="45.83333333333333" y="16.666666666666664" width="8.333333333333334" height="16.666666666666668" rx="4.166666666666667" ry="4.166666666666667" style="fill: #495057" />
8
+ <rect x="33.33333333333333" y="16.666666666666664" width="8.333333333333334" height="16.666666666666668" rx="4.166666666666667" ry="4.166666666666667" style="fill: #495057" />
9
+ <rect x="33.333333333333336" y="66.66666666666667" width="8.333333333333334" height="16.666666666666668" rx="4.166666666666667" ry="4.166666666666667" style="fill: #495057" />
10
+ <rect x="45.833333333333336" y="66.66666666666667" width="8.333333333333334" height="16.666666666666668" rx="4.166666666666667" ry="4.166666666666667" style="fill: #495057" />
11
+ <rect x="58.333333333333336" y="66.66666666666667" width="8.333333333333334" height="16.666666666666668" rx="4.166666666666667" ry="4.166666666666667" style="fill: #495057" />
12
+ <rect x="66.66666666666667" y="58.33333333333333" width="16.666666666666668" height="8.333333333333334" rx="4.166666666666667" ry="4.166666666666667" style="fill: #495057" />
13
+ <rect x="66.66666666666667" y="45.83333333333333" width="16.666666666666668" height="8.333333333333334" rx="4.166666666666667" ry="4.166666666666667" style="fill: #495057" />
14
+ <rect x="66.66666666666667" y="33.33333333333333" width="16.666666666666668" height="8.333333333333334" rx="4.166666666666667" ry="4.166666666666667" style="fill: #495057" />
15
+ <rect x="25.0" y="25.0" width="50.0" height="50.0" rx="8.333333333333334" ry="8.333333333333334" style="fill: #212529" />
16
+ <line stroke-linecap="round" style="stroke:#DEE2E6;stroke-width:3.125" x1="31.25" y1="50.0" x2="40.625" y2="59.375" />
17
+ <line stroke-linecap="round" style="stroke:#DEE2E6;stroke-width:3.125" x1="31.25" y1="50.0" x2="40.625" y2="40.625" />
18
+ <line stroke-linecap="round" style="stroke:#DEE2E6;stroke-width:3.125" x1="68.75" y1="50.0" x2="59.375" y2="59.375" />
19
+ <line stroke-linecap="round" style="stroke:#DEE2E6;stroke-width:3.125" x1="68.75" y1="50.0" x2="59.375" y2="40.625" />
20
+ <line stroke-linecap="round" style="stroke:#DEE2E6;stroke-width:3.125" x1="45.3125" y1="61.71875" x2="50.0" y2="50.0" />
21
+ <line stroke-linecap="round" style="stroke:#DEE2E6;stroke-width:3.125" x1="54.6875" y1="38.28125" x2="50.0" y2="50.0" />
22
+ </svg>
@@ -0,0 +1,9 @@
1
+ # [Cascadia Code](https://github.com/microsoft/cascadia-code)
2
+
3
+ Assets sourced from
4
+ [this release](https://github.com/microsoft/cascadia-code/releases/tag/v2404.23).
5
+
6
+ See also:
7
+ [LICENSE](https://github.com/microsoft/cascadia-code/blob/main/LICENSE).
8
+
9
+ **Fonts are used from release as-is.**
@@ -52,10 +52,9 @@ class WebApplication:
52
52
  def populate(self, document: Html, app: TabPopulater) -> None:
53
53
  """Populate the body element with the application."""
54
54
 
55
- # Third-party dependencies.
55
+ # CSS.
56
+ append_kind(document.head, "font", kind="css", tag="style")
56
57
  add_bootstrap_css(document.head)
57
-
58
- # Internal CSS.
59
58
  append_kind(
60
59
  document.head, "main", "bootstrap_extra", kind="css", tag="style"
61
60
  )
@@ -192,7 +192,7 @@ def centered_markdown(
192
192
  div(
193
193
  text=stream.getvalue(),
194
194
  parent=horiz_container,
195
- class_str="text-light p-3 pb-0",
195
+ class_str="text-body p-3 pb-0",
196
196
  )
197
197
 
198
198
  div(parent=horiz_container)
@@ -8,8 +8,10 @@ from svgen.element.html import div
8
8
 
9
9
  # internal
10
10
  from runtimepy import PKG_NAME
11
+ from runtimepy.net.server.app.bootstrap import icon_str
11
12
  from runtimepy.net.server.app.bootstrap.elements import (
12
13
  BOOTSTRAP_BUTTON,
14
+ bootstrap_button,
13
15
  collapse_button,
14
16
  flex,
15
17
  toggle_button,
@@ -85,16 +87,23 @@ class TabbedContent:
85
87
 
86
88
  # Create application container.
87
89
  self.container = div(parent=parent, id=name)
88
- self.container.add_class("d-flex", "align-items-start")
90
+ self.container.add_class("d-flex", "align-items-start", "bg-body")
89
91
 
90
92
  # Dark theme.
91
93
  self.container["data-bs-theme"] = "dark"
92
- parent.add_class("bg-dark")
93
94
 
94
95
  # Buttons.
95
96
  self.button_column = div(parent=self.container)
96
97
  self.button_column.add_class(
97
- "d-flex", "flex-column", "h-100", "bg-secondary-subtle"
98
+ "d-flex", "flex-column", "h-100", "bg-dark-subtle"
99
+ )
100
+
101
+ # Dark/light theme switch button.
102
+ bootstrap_button(
103
+ icon_str("lightbulb"),
104
+ tooltip=" Toggle light/dark.",
105
+ id="theme-button",
106
+ parent=self.button_column,
98
107
  )
99
108
 
100
109
  # Toggle tabs button.
@@ -155,4 +155,8 @@ def channel_environments(app: AppInfo, tabs: TabbedContent) -> None:
155
155
  )
156
156
 
157
157
  # Add splash screen element.
158
- div(id=f"{PKG_NAME}-splash", parent=tabs.container)
158
+ div(
159
+ id=f"{PKG_NAME}-splash",
160
+ parent=tabs.container,
161
+ class_str="bg-success-subtle bg-gradient",
162
+ )
@@ -32,7 +32,7 @@ class Modal:
32
32
 
33
33
  content = div(
34
34
  parent=div(
35
- parent=modal, class_str="modal-dialog text-light " + TEXT
35
+ parent=modal, class_str="modal-dialog text-body " + TEXT
36
36
  ),
37
37
  class_str="modal-content rounded-0",
38
38
  )
@@ -43,7 +43,7 @@ def plot_settings(tabs: TabbedContent) -> None:
43
43
  div(
44
44
  text="0 ms ('high', run at native refresh rate)",
45
45
  parent=container,
46
- class_str="text-nowrap text-primary",
46
+ class_str="text-nowrap text-body-emphasis",
47
47
  )
48
48
 
49
49
  slider(
@@ -53,7 +53,7 @@ def plot_settings(tabs: TabbedContent) -> None:
53
53
  div(
54
54
  text="100 ms ('low', 10 Hz)",
55
55
  parent=container,
56
- class_str="text-nowrap text-primary",
56
+ class_str="text-nowrap text-body-emphasis",
57
57
  )
58
58
 
59
59
  div(tag="hr", parent=modal.body)
@@ -50,6 +50,9 @@ def create_name_td(parent: Element) -> Element:
50
50
  return div(tag="td", parent=parent, class_str="p-0 text-nowrap")
51
51
 
52
52
 
53
+ COMMANDABLE = "text-info-emphasis"
54
+
55
+
53
56
  class ChannelEnvironmentTabHtml(ChannelEnvironmentTabControls):
54
57
  """A channel-environment tab interface."""
55
58
 
@@ -67,7 +70,7 @@ class ChannelEnvironmentTabHtml(ChannelEnvironmentTabControls):
67
70
 
68
71
  name_elem = div(tag="span", text=name, parent=name_td)
69
72
  if chan.commandable:
70
- name_elem.add_class("text-success")
73
+ name_elem.add_class(COMMANDABLE)
71
74
 
72
75
  if description:
73
76
  set_tooltip(name_elem, description, placement="left")
@@ -105,7 +108,7 @@ class ChannelEnvironmentTabHtml(ChannelEnvironmentTabControls):
105
108
 
106
109
  name_elem = div(tag="span", text=name, parent=name_td)
107
110
  if field.commandable:
108
- name_elem.add_class("text-success")
111
+ name_elem.add_class(COMMANDABLE)
109
112
 
110
113
  if field.description:
111
114
  description = field.description
@@ -238,7 +241,7 @@ class ChannelEnvironmentTabHtml(ChannelEnvironmentTabControls):
238
241
  logs = div(
239
242
  tag="textarea",
240
243
  parent=div(parent=vert_container, class_str="form-floating"),
241
- class_str=f"form-control rounded-0 {TEXT} text-logs",
244
+ class_str=(f"form-control rounded-0 {TEXT} text-logs"),
242
245
  id=self.get_id("logs"),
243
246
  title=f"Text logs for {self.name}.",
244
247
  )
@@ -258,7 +261,7 @@ class ChannelEnvironmentTabHtml(ChannelEnvironmentTabControls):
258
261
  div(
259
262
  id=self.get_id("divider"),
260
263
  parent=container,
261
- class_str="vertical-divider border-start",
264
+ class_str="vertical-divider border-start bg-dark-subtle",
262
265
  )
263
266
 
264
267
  self._compose_plot(container)
@@ -19,7 +19,7 @@ class DummyTab(Tab):
19
19
  def compose(self, parent: Element) -> None:
20
20
  """Compose the tab's HTML elements."""
21
21
 
22
- parent.add_class("text-light")
22
+ parent.add_class("text-body")
23
23
 
24
24
  for idx in range(10):
25
25
  div(parent=parent, text="Hello, world! " + str(idx))
@@ -17,7 +17,7 @@ class SoundTab(Tab):
17
17
  def compose(self, parent: Element) -> None:
18
18
  """Compose the tab's HTML elements."""
19
19
 
20
- container = div(parent=parent, class_str="text-light")
20
+ container = div(parent=parent, class_str="text-body")
21
21
 
22
22
  div(text="Hello, world! 1", parent=container)
23
23
  div(text="Hello, world! 2", parent=container)
@@ -1,5 +1,5 @@
1
1
  aiofiles
2
- vcorelib>=3.4.1
2
+ vcorelib>=3.4.2
3
3
  svgen>=0.6.8
4
4
  websockets
5
5
  psutil
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: runtimepy
3
- Version: 5.6.4
3
+ Version: 5.7.1
4
4
  Summary: A framework for implementing Python services.
5
5
  Home-page: https://github.com/vkottler/runtimepy
6
6
  Author: Vaughn Kottler
@@ -17,11 +17,11 @@ Classifier: License :: OSI Approved :: MIT License
17
17
  Requires-Python: >=3.11
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
+ Requires-Dist: websockets
20
21
  Requires-Dist: svgen >=0.6.8
21
- Requires-Dist: aiofiles
22
- Requires-Dist: vcorelib >=3.4.1
23
22
  Requires-Dist: psutil
24
- Requires-Dist: websockets
23
+ Requires-Dist: aiofiles
24
+ Requires-Dist: vcorelib >=3.4.2
25
25
  Provides-Extra: test
26
26
  Requires-Dist: pylint ; extra == 'test'
27
27
  Requires-Dist: flake8 ; extra == 'test'
@@ -45,11 +45,11 @@ Requires-Dist: uvloop ; (sys_platform != "win32" and sys_platform != "cygwin") a
45
45
  =====================================
46
46
  generator=datazen
47
47
  version=3.1.4
48
- hash=41c5a2511c80b2cbbaee668bb6a75bd2
48
+ hash=8247340c8c4e6982a54b831c311f2c0b
49
49
  =====================================
50
50
  -->
51
51
 
52
- # runtimepy ([5.6.4](https://pypi.org/project/runtimepy/))
52
+ # runtimepy ([5.7.1](https://pypi.org/project/runtimepy/))
53
53
 
54
54
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
55
55
  ![Build Status](https://github.com/vkottler/runtimepy/workflows/Python%20Package/badge.svg)
@@ -1,11 +1,11 @@
1
- runtimepy/__init__.py,sha256=xynGRUb4uW0naY4GEs3m1GbeVeu1jEcDHpifIJsSHIg,390
1
+ runtimepy/__init__.py,sha256=5cxrac3CYhDfd63ssWuRNlnKUGeMyi01Ivyg3V_as0I,390
2
2
  runtimepy/__main__.py,sha256=OPAed6hggoQdw-6QAR62mqLC-rCkdDhOq0wyeS2vDRI,332
3
3
  runtimepy/app.py,sha256=sTvatbsGZ2Hdel36Si_WUbNMtg9CzsJyExr5xjIcxDE,970
4
4
  runtimepy/dev_requirements.txt,sha256=j0dh11ztJAzfaUL0iFheGjaZj9ppDzmTkclTT8YKO8c,230
5
5
  runtimepy/entry.py,sha256=3672ccoslf2h8Wg5M_SuW6SoEx0oslRoi0ngZsgjNz8,1954
6
6
  runtimepy/mapping.py,sha256=VQK1vzmQVvYYKI85_II37-hIEbvgL3PzNy-WI6TTo80,5091
7
7
  runtimepy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- runtimepy/requirements.txt,sha256=r9nEQ2tlTwbwI_WBVa-GxOt4KcmPjOQgFk1NR3LNlms,124
8
+ runtimepy/requirements.txt,sha256=77PnkPte9OZyyJg88wF_6su2H4XSvuN8rQH1tibLdv4,124
9
9
  runtimepy/schemas.py,sha256=NROlzVCZGLTJ9xe7d1eNIYmjzf0AOv3qHK-f6g1jGHk,678
10
10
  runtimepy/util.py,sha256=q1Spqt8AiG8_64COh1fU5cUKl-cZhp8BK1CHw_IOya0,399
11
11
  runtimepy/channel/__init__.py,sha256=pf0RJ5g37_FVV8xoUNgzFGuIfbZEYSBA_cQlJSDTPDo,4774
@@ -44,14 +44,15 @@ runtimepy/control/env/__init__.py,sha256=RHJqysY7Pv4VDs2SGk0X-qc5xp_SrQ_oxb5Deug
44
44
  runtimepy/data/browser.yaml,sha256=oc5KEV1C1uAJ4MkhNo4hyVVfJtZvHelRNqzNvD313Ow,79
45
45
  runtimepy/data/dummy_load.yaml,sha256=89BPHLaHJOgiiZSVACBA0_xmlN_N6v2fpcCauB03ZkE,1830
46
46
  runtimepy/data/factories.yaml,sha256=Jm0QPwW2BQgnj1fIFQwygsWXzT78QJuf7auVRtRzWKQ,1847
47
- runtimepy/data/favicon.ico,sha256=jgGIqM4gTrqPs3I6wajqKUH6Je885zy-jI7eU-Nl3AA,362870
47
+ runtimepy/data/favicon.ico,sha256=iPOtqnqrFVr5tNBM6kTsw7nh0KullEz4TpS6CEQ2HVM,362870
48
48
  runtimepy/data/sample_telemetry.yaml,sha256=OpdFurkvtWJGaNl9LMlU2rKo15AaVVr-U_hoZfsbp-Y,695
49
49
  runtimepy/data/server.yaml,sha256=wS_Ceiu2TpkfPurpqoYoPlgzc9DAWtUd24MW7t-S5rU,97
50
50
  runtimepy/data/server_base.yaml,sha256=QkF1xcHyMEViUhOc5rKFbFXjbRDDDHbX5LXvSQJRS58,615
51
51
  runtimepy/data/server_dev.yaml,sha256=nQsPh7LuQig3pzHfdg_aD3yOUiCj1sKKfI-WwW3hXmQ,523
52
52
  runtimepy/data/tftp_server.yaml,sha256=-bFOWJSagI-fEQQcT8k7eDMJVfSPm2XAxLVG3dqUTa4,204
53
- runtimepy/data/css/bootstrap_extra.css,sha256=l-LKE8KnwnuiWbc4NEtYVqFPM4BBnd0fmlmHtEZzA40,1405
54
- runtimepy/data/css/main.css,sha256=PifjIDKw-5-i5b12edNwSRE4K8Yi0KPgh607mFN6_p8,731
53
+ runtimepy/data/css/bootstrap_extra.css,sha256=-clAoiYcyOkS4xana4O-jvGVsphOaYB_VlmX9mUjI80,1796
54
+ runtimepy/data/css/font.css,sha256=Pe82E66rNi-cwlQ-_1GHAuhPGu5L4x5KqgV0dbDe51w,977
55
+ runtimepy/data/css/main.css,sha256=OSg5g7FYbjsHY7QNbFCTPAD1MlypeoYfaOyAfvnT2kI,680
55
56
  runtimepy/data/js/DataConnection.js,sha256=DnX8FMehjJXqmI62UMYXSvl_XdfQMzq3XUDFbLu2GgI,98
56
57
  runtimepy/data/js/JsonConnection.js,sha256=rclZrbmWc_zSs6I_JhOgxnVPFIyPMo5WdjAe8alyZ3o,2729
57
58
  runtimepy/data/js/audio.js,sha256=bLkBqbeHMiGGidfL3iXjmVoF9seK-ZeZ3kwgOrcpgk4,1092
@@ -74,7 +75,7 @@ runtimepy/data/js/classes/PointManager.js,sha256=0lr2AReLdDNrY47UuOjjCRDPMiSRsOV
74
75
  runtimepy/data/js/classes/TabFilter.js,sha256=FygFFmWa1IRQ0DZlrOscdrkz6W3VkG87nHSud56kCzI,1185
75
76
  runtimepy/data/js/classes/TabInterface.js,sha256=i-dM_FpRsp_hJEh6CdtSY8hiTS6-KZx5dkOYXD_crh0,12084
76
77
  runtimepy/data/js/classes/UnitSystem.js,sha256=ys4OMabq47k_VvJpRItm82U0IequDvx3ysRJOQzDf94,906
77
- runtimepy/data/js/classes/WindowHashManager.js,sha256=aQcdUwWw-Ksp-ffywOlv64TdG6R-UrP4DVGLrGIi8QQ,6253
78
+ runtimepy/data/js/classes/WindowHashManager.js,sha256=tHGhjfPJCF253L98Dh8gKlxUDY2ct0G7RudoQXXxB-E,6860
78
79
  runtimepy/data/js/classes/WorkerInterface.js,sha256=qARPW1CUDnHnVFVE8UjqKq74QfommCLwd6nisy-ayOw,346
79
80
  runtimepy/data/js/tab/env.js,sha256=MB79l3XyXKELWRqHcTnwWHiwdiceLHl1N_s-mS33pyU,22
80
81
  runtimepy/data/js/tab/sound.js,sha256=RSKp0AXM_zGOCsUvIT-BUjIzOE7Dp5NHiQG4fy7gBgY,1388
@@ -104,6 +105,16 @@ runtimepy/data/schemas/has_factory.yaml,sha256=Rsqrxv3HEBUGxPcW6CN7QczA96iBSgtm0
104
105
  runtimepy/data/schemas/has_markdown.yaml,sha256=LbnEQRYdk5KR_GgORmIOiKjRg-HF8wjhA6Dm6pSm66I,45
105
106
  runtimepy/data/schemas/has_name.yaml,sha256=I5YkXxQRYz-1-49CLyr_NA2zVqyRVQCAsb-icTaxF4s,59
106
107
  runtimepy/data/schemas/has_request_flag.yaml,sha256=S8ly8g-FkrCVNEizbXPqicg_hpGvtH7WRsHZAA4uhjc,66
108
+ runtimepy/data/static/svg/chip-circle-bootstrap.svg,sha256=cGCiwiVWoO39vzdAt683Fk3W42XE6-RGT0QZtsDAv4o,3124
109
+ runtimepy/data/static/woff2/CascadiaCode-Bold.woff2,sha256=vnrwH_YbbVnq0_aedSECg-eieky43TOK3MxtCWIc_Ug,154520
110
+ runtimepy/data/static/woff2/CascadiaCode-BoldItalic.woff2,sha256=OOWBMRXRJJKxEfEIlKKnT-tFqoZKqGw5hMa69t-gp1c,113236
111
+ runtimepy/data/static/woff2/CascadiaCode-Italic.woff2,sha256=RbBc8ehMSl_ixGWnEe7zn841xDsyxdDJTo3rkYY-bf8,111628
112
+ runtimepy/data/static/woff2/CascadiaCode-Regular.woff2,sha256=n0sjuK3zmAMLxahwrTJ1sApEHp9pbJb_zUrENr3Wetk,152304
113
+ runtimepy/data/static/woff2/CascadiaMono-Bold.woff2,sha256=pxV93LGT3ZVLA_WmSVFtHC3DqvDt0krcPbOS8u3LhGs,145952
114
+ runtimepy/data/static/woff2/CascadiaMono-BoldItalic.woff2,sha256=CwE1OsdCYTPqdWxKWYGOPn_z1P3Lh298MbEIgWv9voY,106232
115
+ runtimepy/data/static/woff2/CascadiaMono-Italic.woff2,sha256=S31PimDgq0GV7XMRV-YXeBA9gC54Wz9ukdAzw1nrc8g,104768
116
+ runtimepy/data/static/woff2/CascadiaMono-Regular.woff2,sha256=hHPAFO0U10TCKBw-UofHN2BLjax9qNClzN9oWGKkQx0,143936
117
+ runtimepy/data/static/woff2/README.md,sha256=flHwSRmDxd6OnWhzxmnXzwio1Mong5tB4d8VgieWCOs,289
107
118
  runtimepy/enum/__init__.py,sha256=WIBMOaogauR1u7mK-I4Z5BZUoWANU7alIlrz82QdCmY,5820
108
119
  runtimepy/enum/registry.py,sha256=EU7oUejI60kzrhdtzgWpnFYP8h4CFLy_fxvGTwq1Uvc,2631
109
120
  runtimepy/enum/types.py,sha256=uQYGvaAJVm5tUdwxn_SLHkTZHJpEf7364rTSL27necA,1027
@@ -164,26 +175,26 @@ runtimepy/net/server/__init__.py,sha256=J8gl91YltD8Wo2y_AXxaL6liLu3vomfzUz_nULa3
164
175
  runtimepy/net/server/html.py,sha256=xaTGelH4zrwndQjU24kbCj9Yqu-D17nK5682P6xa-cU,1153
165
176
  runtimepy/net/server/json.py,sha256=RfNt7Gr4-X5DMinV1UeiWneTIJr0LO6BXo2GzE0C1PQ,2475
166
177
  runtimepy/net/server/app/__init__.py,sha256=9gJr7qcrJNQacAOFpZLfpnzDHzx5KXBMNxPlqQsdwB8,2790
167
- runtimepy/net/server/app/base.py,sha256=1KMEWCwDf3cducIbt9geTmMwugAMKl1Io2sBr6qajo4,2082
178
+ runtimepy/net/server/app/base.py,sha256=9PnonII2qZIf1O9BQ8T-wOAgAVHctpLqyZkWGX2M2r4,2104
168
179
  runtimepy/net/server/app/create.py,sha256=N-g3kClBsG4pKOd9tx947rOq4sfgrH_FAMVfZacjhFA,2666
169
180
  runtimepy/net/server/app/elements.py,sha256=KJt9vWqkfvniJMiLOJN467JjPPrEqJYZXmDuY1JoY1g,455
170
181
  runtimepy/net/server/app/files.py,sha256=cIHtIKqaVvOpKL62LSVV1IRPdUyCRCg0TOX9XXmYtqk,2903
171
182
  runtimepy/net/server/app/landing_page.py,sha256=axHGBeFpjn5PF87Yb-n73me4T9b8pQxBq4zlvX5CjmE,663
172
- runtimepy/net/server/app/placeholder.py,sha256=aHHc0--agRq0o5CH-Yzvp_IBihaKmiioGpwm7qu-ysk,1677
183
+ runtimepy/net/server/app/placeholder.py,sha256=BDoLtS6dSeLUKnUZe3z17pb5QuXH4C69RqoIpEc3BIY,1676
173
184
  runtimepy/net/server/app/pyodide.py,sha256=dGJ4u78eYQLU9RQbZEWgzv-7jVIwblS6VopibG82tA4,478
174
- runtimepy/net/server/app/sound.py,sha256=iJTnisXgQb9bEzd0gpCuUdkvoWrC5plEhw04c3R6PrM,844
185
+ runtimepy/net/server/app/sound.py,sha256=AeJoa6XKNH3TYvH6OuAwyfJ5CyFJJwCF0zeCMIpLZAE,843
175
186
  runtimepy/net/server/app/tab.py,sha256=4jhw71LfA23wT9m9e5ofw-tBXYW6xky4tGwBOlGkOz8,2296
176
187
  runtimepy/net/server/app/bootstrap/__init__.py,sha256=ONhwx68piWjsrf88FMpda84TWSPqgi-RZCBuWCci_ak,1444
177
- runtimepy/net/server/app/bootstrap/elements.py,sha256=TsZE1nD8wLo7VoxwGpm2OazlqOZIjSTyigxdLaK9vwQ,4782
178
- runtimepy/net/server/app/bootstrap/tabs.py,sha256=0azUtpZTO80kjhX65vU3K5QfW4cwK7ULixqM8O0FgKQ,4179
179
- runtimepy/net/server/app/env/__init__.py,sha256=bPlW7QtItSKZXbCARZhwjNdfRego3vvlfWNsUro9BSc,4098
180
- runtimepy/net/server/app/env/modal.py,sha256=d7OdKVJfKXnOkDhvsF2nQmTfZHAdx70wbK2pGlNIcEQ,1753
181
- runtimepy/net/server/app/env/settings.py,sha256=M0DFibrzF5-nxZ8udKMi503HiTZWIQNbzj_t9TWi34Q,1720
188
+ runtimepy/net/server/app/bootstrap/elements.py,sha256=otKJGuDVNL7yKpjdIWZw2fyiHVlRRBPdgRrtRjOW2Vk,4781
189
+ runtimepy/net/server/app/bootstrap/tabs.py,sha256=tZHgG2NuJ0kJjNjgzCaQEwpuZywRy0bAEEtgg6aB-ns,4454
190
+ runtimepy/net/server/app/env/__init__.py,sha256=WGgIaB4cg4zqEc7BOCvtNEDvCYWyg48tVHtJiDdHtMA,4172
191
+ runtimepy/net/server/app/env/modal.py,sha256=BDnZvdzwu68ZCKISab39n8_NRWh518IyrtObovhC8SU,1752
192
+ runtimepy/net/server/app/env/settings.py,sha256=2dJydD7_lH8ae43d0D28BNRCbUjmmq4gc-eEAqDOCHs,1732
182
193
  runtimepy/net/server/app/env/widgets.py,sha256=_kNvPl7MXnZOiwTjoZiU2hfuSjkLnRUrORTVDi3w7Ls,5312
183
194
  runtimepy/net/server/app/env/tab/__init__.py,sha256=stTVKyHljLQWnnhxkWPwa7bLdZtjhiMFbiVFgbiYaFI,647
184
195
  runtimepy/net/server/app/env/tab/base.py,sha256=hcHKG17JGkAZjl2X7jT1B72RHTeMdocTakFyNKkmWJc,1168
185
196
  runtimepy/net/server/app/env/tab/controls.py,sha256=hsj0ErywfmOBtJLNZbMISrE2ELJEfyXvtCtpsDbXlYg,4734
186
- runtimepy/net/server/app/env/tab/html.py,sha256=fq97p-5dMi42mxJH04gZXH-sECWVVdizHkLG3cC93aQ,7082
197
+ runtimepy/net/server/app/env/tab/html.py,sha256=wjG_hhuJVeN4xWpGTyQF-TLKmMxc31nfe0zU4wU99S8,7130
187
198
  runtimepy/net/server/app/env/tab/message.py,sha256=OWqBIPRt6UdBHAXk5qvFMbnWuvIRUyp34lzb3GYdthk,4070
188
199
  runtimepy/net/server/struct/__init__.py,sha256=Zy37r6RLFu-XFr9vsanSq80BJdS6Dxr7zmPzQbb7xdw,1799
189
200
  runtimepy/net/server/websocket/__init__.py,sha256=KISuFUUQwNn6BXo8BOMuMOXyoVqE7Jw94ZQiSCQuRQE,5279
@@ -269,9 +280,9 @@ runtimepy/tui/task.py,sha256=nUZo9fuOC-k1Wpqdzkv9v1tQirCI28fZVgcC13Ijvus,1093
269
280
  runtimepy/tui/channels/__init__.py,sha256=evDaiIn-YS9uGhdo8ZGtP9VK1ek6sr_P1nJ9JuSET0o,4536
270
281
  runtimepy/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
271
282
  runtimepy/ui/controls.py,sha256=yvT7h3thbYaitsakcIAJ90EwKzJ4b-jnc6p3UuVf_XE,1241
272
- runtimepy-5.6.4.dist-info/LICENSE,sha256=okYCYhGsx_BlzvFdoNVBVpw_Cfb4SOqHA_VAARml4Hc,1071
273
- runtimepy-5.6.4.dist-info/METADATA,sha256=bXVccH4XiZfIbnaDCTTTq2xyxjaW86_NZ5xTHvOj1Ak,9308
274
- runtimepy-5.6.4.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
275
- runtimepy-5.6.4.dist-info/entry_points.txt,sha256=-btVBkYv7ybcopqZ_pRky-bEzu3vhbaG3W3Z7ERBiFE,51
276
- runtimepy-5.6.4.dist-info/top_level.txt,sha256=0jPmh6yqHyyJJDwEID-LpQly-9kQ3WRMjH7Lix8peLg,10
277
- runtimepy-5.6.4.dist-info/RECORD,,
283
+ runtimepy-5.7.1.dist-info/LICENSE,sha256=okYCYhGsx_BlzvFdoNVBVpw_Cfb4SOqHA_VAARml4Hc,1071
284
+ runtimepy-5.7.1.dist-info/METADATA,sha256=eqlwkUrGcPJFbn5jXvluP9ldQxHabTy2-tfbUNdiP8s,9308
285
+ runtimepy-5.7.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
286
+ runtimepy-5.7.1.dist-info/entry_points.txt,sha256=-btVBkYv7ybcopqZ_pRky-bEzu3vhbaG3W3Z7ERBiFE,51
287
+ runtimepy-5.7.1.dist-info/top_level.txt,sha256=0jPmh6yqHyyJJDwEID-LpQly-9kQ3WRMjH7Lix8peLg,10
288
+ runtimepy-5.7.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (75.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5