solara-ui 1.46.0__py3-none-any.whl → 1.48.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.
solara/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """Build webapps using IPywidgets"""
2
2
 
3
- __version__ = "1.46.0"
3
+ __version__ = "1.48.0"
4
4
  github_url = "https://github.com/widgetti/solara"
5
5
  git_branch = "master"
6
6
 
@@ -145,7 +145,7 @@ def ColumnsResponsive(
145
145
 
146
146
  class_ = _combine_classes([*(["flex-nowrap"] if not wrap else []), *classes])
147
147
  style_flat = solara.util._flatten_style(style)
148
- with rv.Row(class_=class_ if not wrap else "", style_=style_flat, no_gutters=not gutters, dense=gutters_dense) as main:
148
+ with rv.Row(class_=class_, style_=style_flat, no_gutters=not gutters, dense=gutters_dense) as main:
149
149
  for child, xsmall, small, medium, large, xlarge in zip(children, cycle(default), cycle(small), cycle(medium), cycle(large), cycle(xlarge)):
150
150
  with rv.Col(
151
151
  cols=xsmall,
@@ -19,7 +19,7 @@
19
19
  <script>
20
20
  module.exports = {
21
21
  mounted() {
22
- this.chunk_size = 2 * 1024 * 1024;
22
+ this.chunk_size = 1 * 1024 * 1024;
23
23
  this.$refs.dropzone.addEventListener('dragover', event => {
24
24
  event.preventDefault();
25
25
  });
solara/server/app.py CHANGED
@@ -8,6 +8,7 @@ import threading
8
8
  import traceback
9
9
  import warnings
10
10
  import weakref
11
+ import html
11
12
  from enum import Enum
12
13
  from pathlib import Path
13
14
  from typing import Any, Dict, List, Optional, cast
@@ -15,6 +16,7 @@ from typing import Any, Dict, List, Optional, cast
15
16
  import ipywidgets as widgets
16
17
  import reacton
17
18
  from reacton.core import Element, render
19
+ from reacton import ipywidgets
18
20
 
19
21
  import solara
20
22
  import solara.lifecycle
@@ -26,7 +28,7 @@ from .utils import pdb_guard
26
28
 
27
29
  WebSocket = Any
28
30
  apps: Dict[str, "AppScript"] = {}
29
- thread_lock = threading.Lock()
31
+ thread_lock = threading.RLock()
30
32
 
31
33
  logger = logging.getLogger("solara.server.app")
32
34
 
@@ -134,7 +136,7 @@ class AppScript:
134
136
  routes = solara.generate_routes_directory(self.path)
135
137
 
136
138
  if any(name for name in sys.modules.keys() if name.startswith(self.name)):
137
- logger.warn(
139
+ logger.warning(
138
140
  f"Directory {self.name} is also used as a package. This can cause modules to be loaded twice, and might "
139
141
  "cause unexpected behavior. If you run solara from a different directory (e.g. the parent directory) you "
140
142
  "can avoid this ambiguity."
@@ -232,12 +234,22 @@ class AppScript:
232
234
 
233
235
  def run(self):
234
236
  self.check()
235
- if reload.reloader.requires_reload or self._first_execute_app is None:
237
+ if self._first_execute_app is None:
236
238
  with thread_lock:
237
- if reload.reloader.requires_reload or self._first_execute_app is None:
238
- self._first_execute_app = None
239
- self._first_execute_app = self._execute()
240
- print("Re-executed app", self.name) # noqa
239
+ if self._first_execute_app is None:
240
+ try:
241
+ self._first_execute_app = self._execute()
242
+ print("Re-executed app", self.name) # noqa
243
+ except Exception as e:
244
+ error = ""
245
+ error = "".join(traceback.format_exception(None, e, e.__traceback__))
246
+ print(error, file=sys.stdout, flush=True) # noqa
247
+
248
+ error = html.escape(error)
249
+ self._first_execute_app = ipywidgets.HTML(value=f"<pre>{error}</pre>", layout=ipywidgets.Layout(overflow="auto"))
250
+ # We now ran the app again, might contain new imports
251
+
252
+ print("Failed to execute app, fix the error and save the file to reload") # noqa
241
253
  # We now ran the app again, might contain new imports
242
254
  patch.patch_heavy_imports()
243
255
 
@@ -319,6 +331,9 @@ class AppScript:
319
331
  except Exception as e:
320
332
  logger.exception("Could not close render context: %s", e)
321
333
 
334
+ self._first_execute_app = None
335
+ self.run()
336
+
322
337
  # ask all contexts/users to reload
323
338
  for context in context_values:
324
339
  with context:
@@ -119,7 +119,7 @@ async def main():
119
119
  ]
120
120
  for dep in requirements:
121
121
  await micropip.install(dep, keep_going=True)
122
- await micropip.install("/wheels/solara-1.46.0-py2.py3-none-any.whl", keep_going=True)
122
+ await micropip.install("/wheels/solara-1.48.0-py2.py3-none-any.whl", keep_going=True)
123
123
  import solara
124
124
 
125
125
  el = solara.Warning("lala")
solara/tasks.py CHANGED
@@ -6,6 +6,7 @@ import functools
6
6
  import inspect
7
7
  import logging
8
8
  import threading
9
+ import warnings
9
10
  from enum import Enum
10
11
  import typing
11
12
  from typing import (
@@ -536,6 +537,7 @@ def task(
536
537
  f: None = None,
537
538
  *,
538
539
  prefer_threaded: bool = ...,
540
+ check_for_render_context: bool = ...,
539
541
  ) -> Callable[[Callable[P, R]], Task[P, R]]: ...
540
542
 
541
543
 
@@ -544,6 +546,7 @@ def task(
544
546
  f: Callable[P, Union[Coroutine[Any, Any, R], R]],
545
547
  *,
546
548
  prefer_threaded: bool = ...,
549
+ check_for_render_context: bool = ...,
547
550
  ) -> Task[P, R]: ...
548
551
 
549
552
 
@@ -551,6 +554,7 @@ def task(
551
554
  f: Union[None, Callable[P, Union[Coroutine[Any, Any, R], R]]] = None,
552
555
  *,
553
556
  prefer_threaded: bool = True,
557
+ check_for_render_context: bool = True,
554
558
  ) -> Union[Callable[[Callable[P, R]], Task[P, R]], Task[P, R]]:
555
559
  """Decorator to turn a function or coroutine function into a task.
556
560
 
@@ -764,20 +768,87 @@ def task(
764
768
  This ensures that even when a coroutine functions calls a blocking function the UI is still responsive.
765
769
  On platform where threads are not supported (like Pyodide / WASM / Emscripten / PyScript), a coroutine
766
770
  function will always run in the current event loop.
771
+ - `check_for_render_context` - bool: If true, we will check if we are in a render context, and if so, we will
772
+ warn you that you should probably be using `use_task` instead of `task`.
767
773
 
768
774
  ```
769
775
 
770
776
  """
771
777
 
778
+ def check_if_we_should_use_use_task():
779
+ import reacton.core
780
+
781
+ in_reacton_context = reacton.core.get_render_context(required=False) is not None
782
+ if not in_reacton_context:
783
+ # We are not in a reacton context, so we should not (and cannot) use use_task
784
+ return
785
+ from .toestand import _find_outside_solara_frame
786
+
787
+ frame = _find_outside_solara_frame()
788
+ if frame is None:
789
+ # We cannot determine which frame we are in, just skip this check
790
+ return
791
+ import inspect
792
+
793
+ tb = inspect.getframeinfo(frame)
794
+ msg = """You are calling task(...) from a component, while you should probably be using use_task.
795
+
796
+ Reason:
797
+ - task(...) creates a new task object on every render, and should only be used outside of a component.
798
+ - use_task(...) returns the same task object on every render, and should be used inside a component.
799
+
800
+ Example:
801
+ @solara.component
802
+ def Page():
803
+ @task # This is wrong, this creates a new task object on every render
804
+ def my_task():
805
+ ...
806
+
807
+ Instead, you should do:
808
+ @solara.component
809
+ def Page():
810
+ @use_task
811
+ def my_task():
812
+ ...
813
+
814
+ """
815
+ if tb:
816
+ if tb.code_context:
817
+ code = tb.code_context[0]
818
+ else:
819
+ code = "<No code context available>"
820
+ msg += f"This warning was triggered from:\n{tb.filename}:{tb.lineno}\n{code.strip()}"
821
+
822
+ # Check if the call is within a use_memo context by inspecting the call stack
823
+ if frame:
824
+ caller_frame = frame.f_back
825
+ # Check a few frames up the stack (e.g., up to 5) for 'use_memo'
826
+ for _ in range(5):
827
+ if caller_frame is None:
828
+ break
829
+ func_name = caller_frame.f_code.co_name
830
+ module_name = caller_frame.f_globals.get("__name__", "")
831
+ if func_name == "use_memo" and (module_name.startswith("solara.") or module_name.startswith("reacton.")):
832
+ # We are in a use_memo (or a context that should not trigger the warning)
833
+ return
834
+ caller_frame = caller_frame.f_back
835
+
836
+ warnings.warn(msg)
837
+
772
838
  def wrapper(f: Union[None, Callable[P, Union[Coroutine[Any, Any, R], R]]]) -> Task[P, R]:
839
+ if check_for_render_context:
840
+ check_if_we_should_use_use_task()
773
841
  # we use wraps to make the key of the reactive variable more unique
774
842
  # and less likely to mixup during hot reloads
843
+ assert f is not None
844
+ key = solara.toestand._create_key_callable(f)
845
+
775
846
  @functools.wraps(f) # type: ignore
776
847
  def create_task():
777
848
  if inspect.iscoroutinefunction(f):
778
- return TaskAsyncio[P, R](prefer_threaded and has_threads, f, key=solara.toestand._create_key_callable(create_task))
849
+ return TaskAsyncio[P, R](prefer_threaded and has_threads, f, key=key)
779
850
  else:
780
- return TaskThreaded[P, R](cast(Callable[P, R], f), key=solara.toestand._create_key_callable(create_task))
851
+ return TaskThreaded[P, R](cast(Callable[P, R], f), key=key)
781
852
 
782
853
  return cast(Task[P, R], Proxy(create_task))
783
854
 
@@ -797,46 +868,46 @@ def use_task(
797
868
  dependencies: Literal[None] = ...,
798
869
  raise_error=...,
799
870
  prefer_threaded=...,
800
- ) -> Callable[[Callable[[], R]], "Task[[], R]"]: ...
871
+ ) -> Callable[[Callable[P, R]], "Task[P, R]"]: ...
801
872
 
802
873
 
803
874
  @overload
804
875
  def use_task(
805
- f: Callable[[], R],
876
+ f: None = None,
806
877
  *,
807
- dependencies: Literal[None] = ...,
878
+ dependencies: List = ...,
808
879
  raise_error=...,
809
880
  prefer_threaded=...,
810
- ) -> "Task[[], R]": ...
881
+ ) -> Callable[[Callable[[], R]], "Task[[], R]"]: ...
811
882
 
812
883
 
813
884
  @overload
814
885
  def use_task(
815
- f: None = None,
886
+ f: Callable[[], R],
816
887
  *,
817
888
  dependencies: List = ...,
818
889
  raise_error=...,
819
890
  prefer_threaded=...,
820
- ) -> Callable[[Callable[[], R]], "Task[[], R]"]: ...
891
+ ) -> "Task[[], R]": ...
821
892
 
822
893
 
823
894
  @overload
824
895
  def use_task(
825
- f: Callable[[], R],
896
+ f: Callable[P, R],
826
897
  *,
827
- dependencies: List = ...,
898
+ dependencies: Literal[None] = ...,
828
899
  raise_error=...,
829
900
  prefer_threaded=...,
830
- ) -> "Task[[], R]": ...
901
+ ) -> "Task[P, R]": ...
831
902
 
832
903
 
833
904
  def use_task(
834
- f: Union[None, Callable[[], R]] = None,
905
+ f: Union[None, Callable[P, R]] = None,
835
906
  *,
836
907
  dependencies: Union[None, List] = [],
837
908
  raise_error=True,
838
909
  prefer_threaded=True,
839
- ) -> Union[Callable[[Callable[[], R]], "Task[[], R]"], "Task[[], R]"]:
910
+ ) -> Union[Callable[[Callable[P, R]], "Task[P, R]"], "Task[P, R]"]:
840
911
  """A hook that runs a function or coroutine function as a task and returns the result.
841
912
 
842
913
  Allows you to run code in the background, with the UI available to the user. This is useful for long running tasks,
@@ -916,7 +987,7 @@ def use_task(
916
987
 
917
988
  def wrapper(f):
918
989
  def create_task() -> "Task[[], R]":
919
- return task(f, prefer_threaded=prefer_threaded)
990
+ return task(f, prefer_threaded=prefer_threaded, check_for_render_context=False)
920
991
 
921
992
  task_instance = solara.use_memo(create_task, dependencies=[])
922
993
  # we always update the function so we do not have stale data in the function
@@ -334,7 +334,7 @@ class ServerVoila(ServerBase):
334
334
 
335
335
  def serve(self):
336
336
  if self.has_started():
337
- raise RuntimeError("Jupyter server already running, use lsof -i :{self.port} to find the process and kill it")
337
+ raise RuntimeError(f"Jupyter server already running, use lsof -i :{self.port} to find the process and kill it")
338
338
  cmd = (
339
339
  "voila --no-browser --VoilaTest.log_level=DEBUG --Voila.port_retries=0 --VoilaExecutor.timeout=240"
340
340
  f' --Voila.port={self.port} --show_tracebacks=True "{self.notebook_path}" --enable_nbextensions=True'
solara/toestand.py CHANGED
@@ -343,6 +343,7 @@ def _is_internal_module(file_name: str):
343
343
  return (
344
344
  file_name_parts[-2:] == ["solara", "toestand.py"]
345
345
  or file_name_parts[-2:] == ["solara", "reactive.py"]
346
+ or file_name_parts[-2:] == ["solara", "tasks.py"]
346
347
  or file_name_parts[-2:] == ["solara", "_stores.py"]
347
348
  or file_name_parts[-3:] == ["solara", "hooks", "use_reactive.py"]
348
349
  or file_name_parts[-2:] == ["reacton", "core.py"]
@@ -442,7 +443,7 @@ reactive_df = solara.reactive(df, equals=solara.util.equals_pickle)
442
443
  raise ValueError(msg)
443
444
 
444
445
 
445
- def _create_key_callable(f: Callable[[], S]):
446
+ def _create_key_callable(f: Callable):
446
447
  try:
447
448
  prefix = f.__qualname__
448
449
  except Exception:
@@ -3,14 +3,15 @@
3
3
  <div v-if="gridlayout_loaded" style="padding: 0px; width: 100%;">
4
4
  <grid-layout
5
5
  :layout.sync="grid_layout"
6
- :col-num="12"
7
- :row-height="30"
6
+ :col-num="col_num"
7
+ :row-height="row_height"
8
8
  :is-draggable="draggable"
9
9
  :is-resizable="resizable"
10
10
  :is-mirrored="false"
11
11
  :vertical-compact="true"
12
12
  :margin="[10, 10]"
13
13
  :use-css-transforms="true"
14
+ @layout-updated="onLayoutUpdated"
14
15
  >
15
16
 
16
17
  <grid-item v-for="item in grid_layout"
@@ -49,6 +50,9 @@ module.exports = {
49
50
  // this will cause bqplot to layout itself
50
51
  window.dispatchEvent(new Event('resize'));
51
52
  },
53
+ onLayoutUpdated(layout) {
54
+ this.layout_updated(layout);
55
+ },
52
56
  import(deps) {
53
57
  return this.loadRequire().then(
54
58
  () => {
solara/widgets/widgets.py CHANGED
@@ -52,6 +52,13 @@ class GridLayout(v.VuetifyTemplate):
52
52
  draggable = traitlets.CBool(True).tag(sync=True)
53
53
  resizable = traitlets.CBool(True).tag(sync=True)
54
54
  cdn = traitlets.Unicode(None, allow_none=True).tag(sync=True)
55
+ on_layout_updated = traitlets.traitlets.Callable(None, allow_none=True)
56
+ col_num = traitlets.Int(12).tag(sync=True)
57
+ row_height = traitlets.Int(30).tag(sync=True)
58
+
59
+ def vue_layout_updated(self, *args):
60
+ if self.on_layout_updated is not None:
61
+ self.on_layout_updated(*args)
55
62
 
56
63
  @traitlets.default("cdn")
57
64
  def _cdn(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: solara-ui
3
- Version: 1.46.0
3
+ Version: 1.48.0
4
4
  Dynamic: Summary
5
5
  Project-URL: Home, https://www.github.com/widgetti/solara
6
6
  Project-URL: Documentation, https://solara.dev
@@ -1,6 +1,6 @@
1
1
  prefix/etc/jupyter/jupyter_notebook_config.d/solara.json,sha256=3UhTBQi6z7F7pPjmqXxfddv79c8VGR9H7zStDLp6AwY,115
2
2
  prefix/etc/jupyter/jupyter_server_config.d/solara.json,sha256=D9J-rYxAzyD5GOqWvuPjacGUVFHsYtTfZ4FUbRzRvIA,113
3
- solara/__init__.py,sha256=XSspSdjFWrYy10EnAu0o6zS7I5XRNgsjHwW0oQzp07Q,3647
3
+ solara/__init__.py,sha256=8GsgAErkS5dA1fa2M7LKzN6p6qy9IyZYYBcU0mS8yuo,3647
4
4
  solara/__main__.py,sha256=pm79jfba-0ZapLR0PtwZfMeiTHrLz8kEt79EygRyXxQ,24828
5
5
  solara/_stores.py,sha256=N2Ec-61XNFXwigBx8f5QYPx7gDXenCOBdmLPXiJB45E,12320
6
6
  solara/alias.py,sha256=9vfLzud77NP8in3OID9b5mmIO8NyrnFjN2_aE0lSb1k,216
@@ -20,8 +20,8 @@ solara/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  solara/reactive.py,sha256=KN0PJl-ivxjgQj008zyPGnORo5bTNaY77uASsSW0mFQ,3430
21
21
  solara/routing.py,sha256=G_iZKozdVoUuD-qSMyuPV6jeN4qBqujAUvekw036f88,9143
22
22
  solara/settings.py,sha256=FED5SYfw1W88U8SPk9iXSgSSvMHgPkU1auONSdk5cNs,2688
23
- solara/tasks.py,sha256=lrPvQQfAY53DQqyy4Nh1l3f5Xg0SQ7qUtHXLZ_kM1es,34564
24
- solara/toestand.py,sha256=pXUdvINF5x9reKL0yBdSjz-hxNkYILTsQjZVfKAYlVg,33446
23
+ solara/tasks.py,sha256=uaauVf5zuVROWlU5KD_uoBEjy81YcpUtJhxcxX_Rs88,37197
24
+ solara/toestand.py,sha256=-ddVhZGmFR4qia_skg4f15xAdNaiB_9drpS-qxrQDaQ,33497
25
25
  solara/util.py,sha256=UUO3BfhXb3tGP-uj8UuTYMx6kuph6PiDp4XXm-f6uyg,9697
26
26
  solara/validate_hooks.py,sha256=F0CYDOVF_23O1apJBIk9lZMq11JmkoE3BrVVT8QvZWI,9999
27
27
  solara/components/__init__.py,sha256=j5Tv0tyzs80Bsl5hvTIF_x-RQyAvr3ooqIXnABamW44,3214
@@ -32,7 +32,7 @@ solara/components/card.py,sha256=2xNXrIRJ4jGJtRbirX1Xp8V2h3HtW9vnxhLGUCrPr9I,279
32
32
  solara/components/checkbox.py,sha256=MLQ9Hxvtv5aKLj4XO3ILWtGc6nKOUH560A2bBt0Z030,1445
33
33
  solara/components/code_highlight_css.py,sha256=J0fZHuEu8jeEKAq_HKbzgiMR1-VwMVnKA4dAOKE0AQU,235
34
34
  solara/components/code_highlight_css.vue,sha256=UX4jtEetV1W25Uvu8xQ-TbEaBzbp_7DlXtXDO9SdZfY,5776
35
- solara/components/columns.py,sha256=bGCUU9MLxkt2OiS31oLHWrEOlskxT1Xo65dBxXhmhbQ,5564
35
+ solara/components/columns.py,sha256=zC4PVGMivHMn2jCaQoV_mmRBzaF12gRTeMqyuWANMyo,5544
36
36
  solara/components/component_vue.py,sha256=iFjmklw3uKkGPxnf5Hn6JQQ1Nw6sfAICLmkPYJEmbbE,5068
37
37
  solara/components/cross_filter.py,sha256=Q5vOkerWXNCtRbSboHjXcnjoys8bHv5b7G_fH1A1lio,13663
38
38
  solara/components/dataframe.py,sha256=F-FdIjCj_rovstOVvZd3bwypKfshq3RXAF7FT2HLDVw,21032
@@ -46,7 +46,7 @@ solara/components/figure_altair.py,sha256=t4EEwXrdoisrbV5j2MS-HBlPc5HSFCK5r4mRXv
46
46
  solara/components/file_browser.py,sha256=701vg4_c0au9va206sx3pQDX6NL1VFqs7ewQ0RAbn6k,7331
47
47
  solara/components/file_download.py,sha256=Lil0qyiozU_Pxyb_HgnJXOumrxMeDwwavEmZZw6kAs8,7475
48
48
  solara/components/file_drop.py,sha256=BA53EZsCzzPCS8i2ZH_S1NAkmmQlTOvNEoXAt0_1l4A,5239
49
- solara/components/file_drop.vue,sha256=ywQvWjqLIRNMAL6ZrdLpHCK4ZprrVbh0n2AJFanVlR8,2243
49
+ solara/components/file_drop.vue,sha256=7V6YjHhoqOCVDMVPtObNwfHz2MdXLCFlNEqK1brl3zI,2243
50
50
  solara/components/file_list_widget.vue,sha256=atp-FO9tBjvyCQ_32NqeB9Rcehg03vPLD1eIROgBDDU,1860
51
51
  solara/components/head.py,sha256=QZRTbwaUH0trfce3ntEcOqmLjw74CbSHpuMt9gGj7oA,648
52
52
  solara/components/head_tag.py,sha256=xPj_ug0TUAZF4yN6ypKlmLcsHORIHU8zfIZgEDNi4PQ,1591
@@ -106,7 +106,7 @@ solara/lab/utils/headers.py,sha256=RMo8JUdztRePrdNfYCX1QEhrfyF6ktodr4v6tIREKbs,2
106
106
  solara/scope/__init__.py,sha256=0sP3B6L4Aai0b6nadPtEETb8XqdGmSFKvQusNH0-yvY,2987
107
107
  solara/scope/types.py,sha256=HTf_wnkpkhhtGaeFsB690KBP623CUuqiMssd72-u9yg,1540
108
108
  solara/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
- solara/server/app.py,sha256=DHl06kWFcAQbc36ytBKzAeChirysGwQvmy7BCZyuTvw,21490
109
+ solara/server/app.py,sha256=vYUyqucwz2KZwH5RCCJtQDGPJdSLYqB5dAULudSqm74,22137
110
110
  solara/server/cdn_helper.py,sha256=mjdDWL1jVed40rEagP9L5CfZwFB77yUKqcFg--u2eds,3250
111
111
  solara/server/esm.py,sha256=dX9pzTJQ6kd6qNHQgzC938O5LTowLhuATXO0Q1paz44,2951
112
112
  solara/server/fastapi.py,sha256=qVIHn0_Kxr6zWqcBWySu5nnJ6pNTSDqb4EHIh-cqH_8,93
@@ -146,7 +146,7 @@ solara/server/static/highlight-dark.css,sha256=xO8-vta9vG4s1OfJNHXWqiLWzx_gM03jo
146
146
  solara/server/static/highlight.css,sha256=k8ZdT5iwrGQ5tXTQHAXuxvZrSUq3kwCdEpy3mlFoZjs,2637
147
147
  solara/server/static/main-vuetify.js,sha256=R3qM4xMlstMpRUdRaul78p34z_Av2ONSTXksg2V9TqQ,9503
148
148
  solara/server/static/main.js,sha256=mcx4JNQ4Lg4pNdUIqMoZos1mZyYFS48yd_JNFFJUqIE,5679
149
- solara/server/static/solara_bootstrap.py,sha256=YOt-aZ55ffhLPfPzfYZKTm-KAAPvB4KHlhmKQ1FDuoI,3195
149
+ solara/server/static/solara_bootstrap.py,sha256=Vsr4ZZQFyG6LDNyYOGEK84uIlP3-_eYF6IDcFv36-gE,3195
150
150
  solara/server/static/sun.svg,sha256=jEKBAGCr7b9zNYv0VUb7lMWKjnU2dX69_Ye_DZWGXJI,6855
151
151
  solara/server/static/webworker.js,sha256=cjAFz7-SygStHJnYlJUlJs-gE_7YQeQ-WBDcmKYyjvo,1372
152
152
  solara/server/templates/index.html.j2,sha256=JXQo1M-STFHLBOFetgG7509cAq8xUP0VAEtYDzz35fY,31
@@ -179,7 +179,7 @@ solara/template/portal/solara_portal/pages/article/__init__.py,sha256=6PgHyyeK1_
179
179
  solara/template/portal/solara_portal/pages/viz/__init__.py,sha256=l65uqBpFJ6Uh5XytXhLMnR-8G4FBnjqJg86OJX7_LO0,2858
180
180
  solara/template/portal/solara_portal/pages/viz/overview.py,sha256=GPlzFxUR0LRQhR96a_CVWquGTjHhDehL1PR03Tcm3gs,365
181
181
  solara/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
182
- solara/test/pytest_plugin.py,sha256=xwNW6ek2Z3dtV0_ZB83Ad1rl-eWzulIqpo4hVlXkftA,30125
182
+ solara/test/pytest_plugin.py,sha256=17waJlD9pHgTWHkCWN-WRzm7ejOLiUtsJui_LE4fX20,30126
183
183
  solara/website/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
184
184
  solara/website/utils.py,sha256=TfoExocZ8ko2hTcA7XDKI5FfKZ4gi3JTc_f9Oi5L7Fs,855
185
185
  solara/website/assets/custom.css,sha256=Qw_FZpAmPrus38TgYKmLmSgEYf6djWzO5pm2fF8kutk,9330
@@ -451,14 +451,14 @@ solara/website/public/social/github.svg,sha256=XGlfnNccpMHYjfji25r5UW9FvS9pYPR1H
451
451
  solara/website/public/social/twitter.svg,sha256=3Ub5a29H_NM2g7ed3689rKHU-K66PA8r3hWExpzGmdQ,430
452
452
  solara/website/templates/index.html.j2,sha256=NYBuEHmKeSju-b3apY0h3FEJ-tnGDhrnkY-0cZ92Rro,4358
453
453
  solara/widgets/__init__.py,sha256=D3RfEez9dllmst64_nyzzII-NZXoNMEPDnEog4ov3VE,43
454
- solara/widgets/widgets.py,sha256=AIRcMhSDFpESQ1JzUszlb2NH5FwSImLnmd4kqcc9jkY,2452
455
- solara/widgets/vue/gridlayout.vue,sha256=hk10RsEQBxkknTmqa0wtBia9LWQGdDsXlejnAj7USU8,3441
454
+ solara/widgets/widgets.py,sha256=pog0XbqRxyWxLdjsthvM3G_6mIPTUaT6ZErb1POQXJg,2756
455
+ solara/widgets/vue/gridlayout.vue,sha256=LZk-YlqM7nv_7Y5TTq2xqfH1j2SLP1QOH5eiz7G0ayo,3584
456
456
  solara/widgets/vue/html.vue,sha256=48K5rjp0AdJDeRV6F3nOHW3J0WXPeHn55r5pGClK2fU,112
457
457
  solara/widgets/vue/navigator.vue,sha256=7fkX-4_YSnnMIPUMKMvQVVEzrmhY9BFAYvHMqZqTXpI,4790
458
458
  solara/widgets/vue/vegalite.vue,sha256=zhocRsUCNIRQCEbD16er5sYnuHU0YThatRHnorA3P18,4596
459
- solara_ui-1.46.0.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json,sha256=3UhTBQi6z7F7pPjmqXxfddv79c8VGR9H7zStDLp6AwY,115
460
- solara_ui-1.46.0.data/data/etc/jupyter/jupyter_server_config.d/solara.json,sha256=D9J-rYxAzyD5GOqWvuPjacGUVFHsYtTfZ4FUbRzRvIA,113
461
- solara_ui-1.46.0.dist-info/METADATA,sha256=d8_lsqGcyQyk7ZSXL2364Y0OT1_dPu6W-2BEdQPXrrE,7459
462
- solara_ui-1.46.0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
463
- solara_ui-1.46.0.dist-info/licenses/LICENSE,sha256=fFJUz-CWzZ9nEc4QZKu44jMEoDr5fEW-SiqljKpD82E,1086
464
- solara_ui-1.46.0.dist-info/RECORD,,
459
+ solara_ui-1.48.0.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json,sha256=3UhTBQi6z7F7pPjmqXxfddv79c8VGR9H7zStDLp6AwY,115
460
+ solara_ui-1.48.0.data/data/etc/jupyter/jupyter_server_config.d/solara.json,sha256=D9J-rYxAzyD5GOqWvuPjacGUVFHsYtTfZ4FUbRzRvIA,113
461
+ solara_ui-1.48.0.dist-info/METADATA,sha256=89gyWKym-70PtLtlRfc7Wre6bWfW5He78idYwUoM1hM,7459
462
+ solara_ui-1.48.0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
463
+ solara_ui-1.48.0.dist-info/licenses/LICENSE,sha256=fFJUz-CWzZ9nEc4QZKu44jMEoDr5fEW-SiqljKpD82E,1086
464
+ solara_ui-1.48.0.dist-info/RECORD,,