From d0e3628f26c42d3ace3c8ab66b6e17b92e56679a Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Wed, 14 Jun 2023 14:00:46 -0700 Subject: [PATCH 01/49] `Archmonger/reactpy-docs/main` to `reactive-python/reactpy/new-docs` --- .github/workflows/.hatch-run.yml | 59 - .github/workflows/check.yml | 45 - .github/workflows/codeql-analysis.yml | 71 - .github/workflows/deploy-docs.yml | 30 - .github/workflows/publish.yml | 20 - CHANGELOG.md | 199 ++ README.md | 73 +- docs/.gitignore | 4 - docs/Dockerfile | 40 - docs/LICENSE.md | 393 +++ docs/README.md | 20 - docs/docs_app/app.py | 59 - docs/docs_app/dev.py | 104 - docs/docs_app/examples.py | 177 - docs/docs_app/prod.py | 14 - .../css/quick_start/adding_styles.css | 4 + .../css/quick_start/displaying_data.css | 7 + .../sharing_data_between_components.css | 4 + .../css/quick_start/updating_the_screen.css | 4 + .../css/tutorial-tic-tac-toe/tic_tac_toe.css | 42 + .../{docs_app => examples/python}/__init__.py | 0 docs/examples/python/quick_start/__init__.py | 0 .../python/quick_start/adding_styles.py | 4 + .../quick_start/conditional_rendering.py | 22 + .../conditional_rendering_logical_and.py | 14 + .../conditional_rendering_ternary.py | 18 + .../creating_and_nesting_components.py | 21 + .../python/quick_start/displaying_data.py | 32 + docs/examples/python/quick_start/my_app.py | 12 + docs/examples/python/quick_start/my_button.py | 7 + .../python/quick_start/rendering_lists.py | 30 + .../quick_start/rendering_lists_list_items.py | 6 + .../quick_start/rendering_lists_products.py | 5 + .../quick_start/responding_to_events.py | 13 + .../sharing_data_between_components.py | 27 + .../sharing_data_between_components_button.py | 7 + ...ring_data_between_components_move_state.py | 20 + .../sharing_data_between_components_props.py | 22 + .../python/quick_start/updating_the_screen.py | 27 + .../quick_start/updating_the_screen_event.py | 12 + .../updating_the_screen_use_state.py | 5 + .../updating_the_screen_use_state_button.py | 8 + .../tutorial-tic-tac-toe/tic_tac_toe.py | 117 + docs/main.py | 9 - docs/overrides/main.html | 13 + docs/poetry.lock | 2269 ------------- docs/pyproject.toml | 23 - docs/requirements.txt | 8 + docs/source/_custom_js/README.md | 9 - docs/source/_custom_js/package-lock.json | 766 ----- docs/source/_custom_js/package.json | 20 - docs/source/_custom_js/rollup.config.js | 26 - docs/source/_custom_js/src/index.js | 94 - docs/source/_exts/async_doctest.py | 47 - docs/source/_exts/autogen_api_docs.py | 146 - docs/source/_exts/build_custom_js.py | 12 - docs/source/_exts/copy_vdom_json_schema.py | 17 - docs/source/_exts/custom_autosectionlabel.py | 80 - docs/source/_exts/patched_html_translator.py | 24 - docs/source/_exts/reactpy_example.py | 180 - docs/source/_exts/reactpy_view.py | 63 - .../_static/css/furo-theme-overrides.css | 6 - .../source/_static/css/larger-api-margins.css | 7 - docs/source/_static/css/larger-headings.css | 9 - docs/source/_static/css/reactpy-view.css | 43 - .../_static/css/sphinx-design-overrides.css | 14 - .../css/widget-output-css-overrides.css | 8 - .../_static/install-and-run-reactpy.gif | Bin 1049193 -> 0 bytes docs/source/about/changelog.rst | 1124 ------- docs/source/about/contributor-guide.rst | 331 -- docs/source/about/credits-and-licenses.rst | 16 - docs/source/conf.py | 330 -- .../_examples/adding_state_variable/data.json | 72 - .../_examples/adding_state_variable/main.py | 35 - .../_examples/isolated_state/data.json | 72 - .../_examples/isolated_state/main.py | 53 - .../multiple_state_variables/data.json | 72 - .../multiple_state_variables/main.py | 45 - .../when_variables_are_not_enough/data.json | 72 - .../when_variables_are_not_enough/main.py | 42 - .../components-with-state/index.rst | 351 -- .../_examples/dict_remove.py | 58 - .../_examples/dict_update.py | 44 - .../_examples/list_insert.py | 25 - .../_examples/list_re_order.py | 24 - .../_examples/list_remove.py | 44 - .../_examples/list_replace.py | 27 - .../_examples/moving_dot.py | 45 - .../_examples/moving_dot_broken.py | 43 - .../_examples/set_remove.py | 41 - .../_examples/set_update.py | 38 - .../dangers-of-mutability/index.rst | 569 ---- .../guides/adding-interactivity/index.rst | 210 -- .../_examples/delay_before_count_updater.py | 20 - .../_examples/delay_before_set_count.py | 20 - .../_examples/set_color_3_times.py | 27 - .../_examples/set_state_function.py | 24 - .../multiple-state-updates/index.rst | 109 - .../_examples/audio_player.py | 21 - .../_examples/button_async_handlers.py | 23 - .../_examples/button_does_nothing.py | 9 - .../_examples/button_handler_as_arg.py | 33 - .../_examples/button_prints_event.py | 12 - .../_examples/button_prints_message.py | 20 - .../prevent_default_event_actions.py | 18 - .../_examples/stop_event_propagation.py | 42 - .../responding-to-events/index.rst | 144 - .../_examples/delayed_print_after_set.py | 22 - .../_examples/print_chat_message.py | 44 - .../_examples/print_count_after_set.py | 18 - .../_examples/send_message.py | 35 - .../_examples/set_counter_3_times.py | 19 - .../_static/direct-state-change.png | Bin 181824 -> 0 bytes .../_static/reactpy-state-change.png | Bin 569027 -> 0 bytes .../state-as-a-snapshot/index.rst | 158 - .../html-with-reactpy/index.rst | 131 - .../guides/creating-interfaces/index.rst | 128 - .../sorted_and_filtered_todo_list.py | 32 - .../_examples/todo_from_list.py | 28 - .../_examples/todo_list_with_keys.py | 32 - .../rendering-data/index.rst | 297 -- .../_examples/bad_conditional_todo_list.py | 24 - .../_examples/good_conditional_todo_list.py | 21 - .../_examples/nested_photos.py | 25 - .../_examples/parametrized_photos.py | 25 - .../_examples/simple_photo.py | 15 - .../_examples/todo_list.py | 21 - .../_examples/wrap_in_div.py | 13 - .../_examples/wrap_in_fragment.py | 13 - .../your-first-components/index.rst | 134 - .../_examples/material_ui_button_no_action.py | 16 - .../_examples/material_ui_button_on_click.py | 30 - .../_examples/super_simple_chart/main.py | 32 - .../super_simple_chart/super-simple-chart.js | 82 - .../distributing-javascript.rst | 307 -- docs/source/guides/escape-hatches/index.rst | 14 - .../escape-hatches/javascript-components.rst | 146 - .../escape-hatches/using-a-custom-backend.rst | 9 - .../escape-hatches/using-a-custom-client.rst | 9 - .../_examples/debug_error_example.py | 20 - .../getting-started/_examples/hello_world.py | 9 - .../getting-started/_examples/run_fastapi.py | 22 - .../getting-started/_examples/run_flask.py | 22 - .../getting-started/_examples/run_sanic.py | 26 - .../_examples/run_starlette.py | 22 - .../getting-started/_examples/run_tornado.py | 31 - .../getting-started/_examples/sample_app.py | 3 - .../getting-started/_static/embed-doc-ex.html | 8 - .../_static/embed-reactpy-view/index.html | 31 - .../_static/embed-reactpy-view/main.py | 22 - .../_static/embed-reactpy-view/screenshot.png | Bin 13161 -> 0 bytes .../getting-started/_static/logo-django.svg | 38 - .../getting-started/_static/logo-jupyter.svg | 88 - .../getting-started/_static/logo-plotly.svg | 11 - .../_static/reactpy-in-jupyterlab.gif | Bin 551674 -> 0 bytes .../shared-client-state-server-slider.gif | Bin 98006 -> 0 bytes docs/source/guides/getting-started/index.rst | 123 - .../getting-started/installing-reactpy.rst | 121 - .../getting-started/running-reactpy.rst | 221 -- .../combining-contexts-and-reducers/index.rst | 6 - .../index.rst | 6 - .../how-to-structure-state/index.rst | 8 - docs/source/guides/managing-state/index.rst | 127 - .../_examples/filterable_list/data.json | 22 - .../_examples/filterable_list/main.py | 44 - .../_examples/synced_inputs/main.py | 23 - .../sharing-component-state/index.rst | 38 - .../index.rst | 6 - .../when-and-how-to-reset-state/index.rst | 8 - .../_static/idom-flow-diagram.svg | 383 --- .../_static/live-examples-in-docs.gif | Bin 182779 -> 0 bytes .../_static/mvc-flow-diagram.svg | 425 --- .../_static/npm-download-trends.png | Bin 64372 -> 0 bytes .../guides/understanding-reactpy/index.rst | 17 - .../layout-render-servers.rst | 8 - .../representing-html.rst | 76 - .../the-rendering-pipeline.rst | 10 - .../the-rendering-process.rst | 10 - .../what-are-components.rst | 8 - .../why-reactpy-needs-keys.rst | 8 - .../understanding-reactpy/writing-tests.rst | 8 - docs/source/index.rst | 206 -- .../_examples/character_movement/main.py | 73 - .../character_movement/static/bunny.png | Bin 474 -> 0 bytes .../source/reference/_examples/click_count.py | 13 - .../reference/_examples/material_ui_switch.py | 22 - .../reference/_examples/matplotlib_plot.py | 85 - .../reference/_examples/network_graph.py | 40 - .../source/reference/_examples/pigeon_maps.py | 46 - .../reference/_examples/simple_dashboard.py | 102 - docs/source/reference/_examples/slideshow.py | 20 - docs/source/reference/_examples/snake_game.py | 188 -- docs/source/reference/_examples/todo.py | 35 - .../_examples/use_reducer_counter.py | 27 - .../reference/_examples/use_state_counter.py | 26 - .../reference/_examples/victory_chart.py | 7 - .../reference/_static/vdom-json-schema.json | 106 - docs/source/reference/browser-events.rst | 65 - docs/source/reference/hooks-api.rst | 379 --- docs/source/reference/html-attributes.rst | 197 -- docs/source/reference/javascript-api.rst | 8 - docs/source/reference/specifications.rst | 170 - docs/src/about/changelog.md | 11 + docs/src/about/code.md | 3 + docs/src/about/community.md | 3 + docs/src/about/docs.md | 3 + docs/src/about/running-tests.md | 3 + docs/src/dictionary.txt | 28 + docs/src/index.md | 57 + .../learn/add-react-to-an-existing-project.md | 153 + .../src/learn/choosing-the-state-structure.md | 2866 ++++++++++++++++ ...municate-data-between-server-and-client.md | 3 + docs/src/learn/conditional-rendering.md | 576 ++++ .../learn/convert-between-vdom-and-html.md | 3 + docs/src/learn/creating-backends.md | 3 + docs/src/learn/creating-html-tags.md | 3 + .../src/learn/creating-vdom-event-handlers.md | 3 + docs/src/learn/editor-setup.md | 62 + .../extracting-state-logic-into-a-reducer.md | 2644 +++++++++++++++ docs/src/learn/get-started.md | 303 ++ .../importing-and-exporting-components.md | 382 +++ docs/src/learn/keeping-components-pure.md | 815 +++++ .../learn/lifecycle-of-reactive-effects.md | 2252 +++++++++++++ .../learn/manipulating-the-dom-with-refs.md | 1078 ++++++ docs/src/learn/manually-register-a-client.md | 3 + .../learn/passing-data-deeply-with-context.md | 1092 ++++++ .../src/learn/passing-props-to-a-component.md | 1080 ++++++ .../learn/preserving-and-resetting-state.md | 2027 +++++++++++ .../learn/python-in-psx-with-curly-braces.md | 591 ++++ .../queueing-a-series-of-state-updates.md | 560 +++ docs/src/learn/react-developer-tools.md | 85 + .../src/learn/reacting-to-input-with-state.md | 1179 +++++++ .../src/learn/referencing-values-with-refs.md | 569 ++++ .../src/learn/removing-effect-dependencies.md | 2421 +++++++++++++ docs/src/learn/render-and-commit.md | 201 ++ docs/src/learn/rendering-lists.md | 1272 +++++++ docs/src/learn/responding-to-events.md | 648 ++++ .../learn/reusing-logic-with-custom-hooks.md | 2519 ++++++++++++++ .../scaling-up-with-reducer-and-context.md | 1373 ++++++++ .../learn/separating-events-from-effects.md | 1888 +++++++++++ .../learn/sharing-state-between-components.md | 579 ++++ docs/src/learn/start-a-new-react-project.md | 133 + docs/src/learn/state-a-components-memory.md | 1652 +++++++++ docs/src/learn/state-as-a-snapshot.md | 472 +++ docs/src/learn/synchronizing-with-effects.md | 1550 +++++++++ docs/src/learn/thinking-in-react.md | 631 ++++ docs/src/learn/tutorial-material-ui.md | 3 + docs/src/learn/tutorial-react-bootstrap.md | 3 + docs/src/learn/tutorial-tic-tac-toe.md | 2996 +++++++++++++++++ docs/src/learn/updating-arrays-in-state.md | 1853 ++++++++++ docs/src/learn/updating-objects-in-state.md | 1569 +++++++++ docs/src/learn/vdom-mutations.md | 3 + docs/src/learn/writing-markup-with-psx.md | 326 ++ .../src/learn/you-might-not-need-an-effect.md | 1702 ++++++++++ docs/src/learn/your-first-component.md | 404 +++ docs/src/reference/client-api.md | 3 + docs/src/reference/common-events.md | 3 + docs/src/reference/common-props.md | 3 + docs/src/reference/common-types.md | 3 + docs/src/reference/django.md | 3 + docs/src/reference/fastapi.md | 3 + docs/src/reference/flask.md | 3 + docs/src/reference/jupyter.md | 3 + docs/src/reference/plotly-dash.md | 3 + docs/src/reference/protocol-structure.md | 3 + docs/src/reference/sanic.md | 3 + docs/src/reference/starlette.md | 3 + docs/src/reference/tornado.md | 3 + docs/src/reference/usage.md | 3 + docs/src/reference/use-callback.md | 3 + docs/src/reference/use-connection.md | 3 + docs/src/reference/use-context.md | 3 + docs/src/reference/use-debug-value.md | 3 + docs/src/reference/use-effect.md | 3 + docs/src/reference/use-location.md | 3 + docs/src/reference/use-memo.md | 3 + docs/src/reference/use-reducer.md | 3 + docs/src/reference/use-ref.md | 3 + docs/src/reference/use-scope.md | 3 + docs/src/reference/use-state.md | 3 + docs/src/static/css/extra.css | 323 ++ .../static/images/s_thinking-in-react_ui.png | Bin 0 -> 25981 bytes .../images/s_thinking-in-react_ui_outline.png | Bin 0 -> 83418 bytes docs/src/static/js/extra.js | 19 + mkdocs.yml | 178 + 285 files changed, 44339 insertions(+), 14644 deletions(-) delete mode 100644 .github/workflows/.hatch-run.yml delete mode 100644 .github/workflows/check.yml delete mode 100644 .github/workflows/codeql-analysis.yml delete mode 100644 .github/workflows/deploy-docs.yml delete mode 100644 .github/workflows/publish.yml create mode 100644 CHANGELOG.md delete mode 100644 docs/.gitignore delete mode 100644 docs/Dockerfile create mode 100644 docs/LICENSE.md delete mode 100644 docs/README.md delete mode 100644 docs/docs_app/app.py delete mode 100644 docs/docs_app/dev.py delete mode 100644 docs/docs_app/examples.py delete mode 100644 docs/docs_app/prod.py create mode 100644 docs/examples/css/quick_start/adding_styles.css create mode 100644 docs/examples/css/quick_start/displaying_data.css create mode 100644 docs/examples/css/quick_start/sharing_data_between_components.css create mode 100644 docs/examples/css/quick_start/updating_the_screen.css create mode 100644 docs/examples/css/tutorial-tic-tac-toe/tic_tac_toe.css rename docs/{docs_app => examples/python}/__init__.py (100%) create mode 100644 docs/examples/python/quick_start/__init__.py create mode 100644 docs/examples/python/quick_start/adding_styles.py create mode 100644 docs/examples/python/quick_start/conditional_rendering.py create mode 100644 docs/examples/python/quick_start/conditional_rendering_logical_and.py create mode 100644 docs/examples/python/quick_start/conditional_rendering_ternary.py create mode 100644 docs/examples/python/quick_start/creating_and_nesting_components.py create mode 100644 docs/examples/python/quick_start/displaying_data.py create mode 100644 docs/examples/python/quick_start/my_app.py create mode 100644 docs/examples/python/quick_start/my_button.py create mode 100644 docs/examples/python/quick_start/rendering_lists.py create mode 100644 docs/examples/python/quick_start/rendering_lists_list_items.py create mode 100644 docs/examples/python/quick_start/rendering_lists_products.py create mode 100644 docs/examples/python/quick_start/responding_to_events.py create mode 100644 docs/examples/python/quick_start/sharing_data_between_components.py create mode 100644 docs/examples/python/quick_start/sharing_data_between_components_button.py create mode 100644 docs/examples/python/quick_start/sharing_data_between_components_move_state.py create mode 100644 docs/examples/python/quick_start/sharing_data_between_components_props.py create mode 100644 docs/examples/python/quick_start/updating_the_screen.py create mode 100644 docs/examples/python/quick_start/updating_the_screen_event.py create mode 100644 docs/examples/python/quick_start/updating_the_screen_use_state.py create mode 100644 docs/examples/python/quick_start/updating_the_screen_use_state_button.py create mode 100644 docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py delete mode 100644 docs/main.py create mode 100644 docs/overrides/main.html delete mode 100644 docs/poetry.lock delete mode 100644 docs/pyproject.toml create mode 100644 docs/requirements.txt delete mode 100644 docs/source/_custom_js/README.md delete mode 100644 docs/source/_custom_js/package-lock.json delete mode 100644 docs/source/_custom_js/package.json delete mode 100644 docs/source/_custom_js/rollup.config.js delete mode 100644 docs/source/_custom_js/src/index.js delete mode 100644 docs/source/_exts/async_doctest.py delete mode 100644 docs/source/_exts/autogen_api_docs.py delete mode 100644 docs/source/_exts/build_custom_js.py delete mode 100644 docs/source/_exts/copy_vdom_json_schema.py delete mode 100644 docs/source/_exts/custom_autosectionlabel.py delete mode 100644 docs/source/_exts/patched_html_translator.py delete mode 100644 docs/source/_exts/reactpy_example.py delete mode 100644 docs/source/_exts/reactpy_view.py delete mode 100644 docs/source/_static/css/furo-theme-overrides.css delete mode 100644 docs/source/_static/css/larger-api-margins.css delete mode 100644 docs/source/_static/css/larger-headings.css delete mode 100644 docs/source/_static/css/reactpy-view.css delete mode 100644 docs/source/_static/css/sphinx-design-overrides.css delete mode 100644 docs/source/_static/css/widget-output-css-overrides.css delete mode 100644 docs/source/_static/install-and-run-reactpy.gif delete mode 100644 docs/source/about/changelog.rst delete mode 100644 docs/source/about/contributor-guide.rst delete mode 100644 docs/source/about/credits-and-licenses.rst delete mode 100644 docs/source/conf.py delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/adding_state_variable/data.json delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/adding_state_variable/main.py delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/isolated_state/data.json delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/isolated_state/main.py delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/multiple_state_variables/data.json delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/multiple_state_variables/main.py delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/when_variables_are_not_enough/data.json delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/_examples/when_variables_are_not_enough/main.py delete mode 100644 docs/source/guides/adding-interactivity/components-with-state/index.rst delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/dict_remove.py delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/dict_update.py delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_insert.py delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_re_order.py delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_remove.py delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_replace.py delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/moving_dot.py delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/moving_dot_broken.py delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/set_remove.py delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/set_update.py delete mode 100644 docs/source/guides/adding-interactivity/dangers-of-mutability/index.rst delete mode 100644 docs/source/guides/adding-interactivity/index.rst delete mode 100644 docs/source/guides/adding-interactivity/multiple-state-updates/_examples/delay_before_count_updater.py delete mode 100644 docs/source/guides/adding-interactivity/multiple-state-updates/_examples/delay_before_set_count.py delete mode 100644 docs/source/guides/adding-interactivity/multiple-state-updates/_examples/set_color_3_times.py delete mode 100644 docs/source/guides/adding-interactivity/multiple-state-updates/_examples/set_state_function.py delete mode 100644 docs/source/guides/adding-interactivity/multiple-state-updates/index.rst delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/audio_player.py delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/button_async_handlers.py delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/button_does_nothing.py delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/button_handler_as_arg.py delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/button_prints_event.py delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/button_prints_message.py delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/prevent_default_event_actions.py delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/_examples/stop_event_propagation.py delete mode 100644 docs/source/guides/adding-interactivity/responding-to-events/index.rst delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/delayed_print_after_set.py delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/print_chat_message.py delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/print_count_after_set.py delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/send_message.py delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/set_counter_3_times.py delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_static/direct-state-change.png delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/_static/reactpy-state-change.png delete mode 100644 docs/source/guides/adding-interactivity/state-as-a-snapshot/index.rst delete mode 100644 docs/source/guides/creating-interfaces/html-with-reactpy/index.rst delete mode 100644 docs/source/guides/creating-interfaces/index.rst delete mode 100644 docs/source/guides/creating-interfaces/rendering-data/_examples/sorted_and_filtered_todo_list.py delete mode 100644 docs/source/guides/creating-interfaces/rendering-data/_examples/todo_from_list.py delete mode 100644 docs/source/guides/creating-interfaces/rendering-data/_examples/todo_list_with_keys.py delete mode 100644 docs/source/guides/creating-interfaces/rendering-data/index.rst delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/bad_conditional_todo_list.py delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/good_conditional_todo_list.py delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/nested_photos.py delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/parametrized_photos.py delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/simple_photo.py delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/todo_list.py delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/wrap_in_div.py delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/_examples/wrap_in_fragment.py delete mode 100644 docs/source/guides/creating-interfaces/your-first-components/index.rst delete mode 100644 docs/source/guides/escape-hatches/_examples/material_ui_button_no_action.py delete mode 100644 docs/source/guides/escape-hatches/_examples/material_ui_button_on_click.py delete mode 100644 docs/source/guides/escape-hatches/_examples/super_simple_chart/main.py delete mode 100644 docs/source/guides/escape-hatches/_examples/super_simple_chart/super-simple-chart.js delete mode 100644 docs/source/guides/escape-hatches/distributing-javascript.rst delete mode 100644 docs/source/guides/escape-hatches/index.rst delete mode 100644 docs/source/guides/escape-hatches/javascript-components.rst delete mode 100644 docs/source/guides/escape-hatches/using-a-custom-backend.rst delete mode 100644 docs/source/guides/escape-hatches/using-a-custom-client.rst delete mode 100644 docs/source/guides/getting-started/_examples/debug_error_example.py delete mode 100644 docs/source/guides/getting-started/_examples/hello_world.py delete mode 100644 docs/source/guides/getting-started/_examples/run_fastapi.py delete mode 100644 docs/source/guides/getting-started/_examples/run_flask.py delete mode 100644 docs/source/guides/getting-started/_examples/run_sanic.py delete mode 100644 docs/source/guides/getting-started/_examples/run_starlette.py delete mode 100644 docs/source/guides/getting-started/_examples/run_tornado.py delete mode 100644 docs/source/guides/getting-started/_examples/sample_app.py delete mode 100644 docs/source/guides/getting-started/_static/embed-doc-ex.html delete mode 100644 docs/source/guides/getting-started/_static/embed-reactpy-view/index.html delete mode 100644 docs/source/guides/getting-started/_static/embed-reactpy-view/main.py delete mode 100644 docs/source/guides/getting-started/_static/embed-reactpy-view/screenshot.png delete mode 100644 docs/source/guides/getting-started/_static/logo-django.svg delete mode 100644 docs/source/guides/getting-started/_static/logo-jupyter.svg delete mode 100644 docs/source/guides/getting-started/_static/logo-plotly.svg delete mode 100644 docs/source/guides/getting-started/_static/reactpy-in-jupyterlab.gif delete mode 100644 docs/source/guides/getting-started/_static/shared-client-state-server-slider.gif delete mode 100644 docs/source/guides/getting-started/index.rst delete mode 100644 docs/source/guides/getting-started/installing-reactpy.rst delete mode 100644 docs/source/guides/getting-started/running-reactpy.rst delete mode 100644 docs/source/guides/managing-state/combining-contexts-and-reducers/index.rst delete mode 100644 docs/source/guides/managing-state/deeply-sharing-state-with-contexts/index.rst delete mode 100644 docs/source/guides/managing-state/how-to-structure-state/index.rst delete mode 100644 docs/source/guides/managing-state/index.rst delete mode 100644 docs/source/guides/managing-state/sharing-component-state/_examples/filterable_list/data.json delete mode 100644 docs/source/guides/managing-state/sharing-component-state/_examples/filterable_list/main.py delete mode 100644 docs/source/guides/managing-state/sharing-component-state/_examples/synced_inputs/main.py delete mode 100644 docs/source/guides/managing-state/sharing-component-state/index.rst delete mode 100644 docs/source/guides/managing-state/simplifying-updates-with-reducers/index.rst delete mode 100644 docs/source/guides/managing-state/when-and-how-to-reset-state/index.rst delete mode 100644 docs/source/guides/understanding-reactpy/_static/idom-flow-diagram.svg delete mode 100644 docs/source/guides/understanding-reactpy/_static/live-examples-in-docs.gif delete mode 100644 docs/source/guides/understanding-reactpy/_static/mvc-flow-diagram.svg delete mode 100644 docs/source/guides/understanding-reactpy/_static/npm-download-trends.png delete mode 100644 docs/source/guides/understanding-reactpy/index.rst delete mode 100644 docs/source/guides/understanding-reactpy/layout-render-servers.rst delete mode 100644 docs/source/guides/understanding-reactpy/representing-html.rst delete mode 100644 docs/source/guides/understanding-reactpy/the-rendering-pipeline.rst delete mode 100644 docs/source/guides/understanding-reactpy/the-rendering-process.rst delete mode 100644 docs/source/guides/understanding-reactpy/what-are-components.rst delete mode 100644 docs/source/guides/understanding-reactpy/why-reactpy-needs-keys.rst delete mode 100644 docs/source/guides/understanding-reactpy/writing-tests.rst delete mode 100644 docs/source/index.rst delete mode 100644 docs/source/reference/_examples/character_movement/main.py delete mode 100644 docs/source/reference/_examples/character_movement/static/bunny.png delete mode 100644 docs/source/reference/_examples/click_count.py delete mode 100644 docs/source/reference/_examples/material_ui_switch.py delete mode 100644 docs/source/reference/_examples/matplotlib_plot.py delete mode 100644 docs/source/reference/_examples/network_graph.py delete mode 100644 docs/source/reference/_examples/pigeon_maps.py delete mode 100644 docs/source/reference/_examples/simple_dashboard.py delete mode 100644 docs/source/reference/_examples/slideshow.py delete mode 100644 docs/source/reference/_examples/snake_game.py delete mode 100644 docs/source/reference/_examples/todo.py delete mode 100644 docs/source/reference/_examples/use_reducer_counter.py delete mode 100644 docs/source/reference/_examples/use_state_counter.py delete mode 100644 docs/source/reference/_examples/victory_chart.py delete mode 100644 docs/source/reference/_static/vdom-json-schema.json delete mode 100644 docs/source/reference/browser-events.rst delete mode 100644 docs/source/reference/hooks-api.rst delete mode 100644 docs/source/reference/html-attributes.rst delete mode 100644 docs/source/reference/javascript-api.rst delete mode 100644 docs/source/reference/specifications.rst create mode 100644 docs/src/about/changelog.md create mode 100644 docs/src/about/code.md create mode 100644 docs/src/about/community.md create mode 100644 docs/src/about/docs.md create mode 100644 docs/src/about/running-tests.md create mode 100644 docs/src/dictionary.txt create mode 100644 docs/src/index.md create mode 100644 docs/src/learn/add-react-to-an-existing-project.md create mode 100644 docs/src/learn/choosing-the-state-structure.md create mode 100644 docs/src/learn/communicate-data-between-server-and-client.md create mode 100644 docs/src/learn/conditional-rendering.md create mode 100644 docs/src/learn/convert-between-vdom-and-html.md create mode 100644 docs/src/learn/creating-backends.md create mode 100644 docs/src/learn/creating-html-tags.md create mode 100644 docs/src/learn/creating-vdom-event-handlers.md create mode 100644 docs/src/learn/editor-setup.md create mode 100644 docs/src/learn/extracting-state-logic-into-a-reducer.md create mode 100644 docs/src/learn/get-started.md create mode 100644 docs/src/learn/importing-and-exporting-components.md create mode 100644 docs/src/learn/keeping-components-pure.md create mode 100644 docs/src/learn/lifecycle-of-reactive-effects.md create mode 100644 docs/src/learn/manipulating-the-dom-with-refs.md create mode 100644 docs/src/learn/manually-register-a-client.md create mode 100644 docs/src/learn/passing-data-deeply-with-context.md create mode 100644 docs/src/learn/passing-props-to-a-component.md create mode 100644 docs/src/learn/preserving-and-resetting-state.md create mode 100644 docs/src/learn/python-in-psx-with-curly-braces.md create mode 100644 docs/src/learn/queueing-a-series-of-state-updates.md create mode 100644 docs/src/learn/react-developer-tools.md create mode 100644 docs/src/learn/reacting-to-input-with-state.md create mode 100644 docs/src/learn/referencing-values-with-refs.md create mode 100644 docs/src/learn/removing-effect-dependencies.md create mode 100644 docs/src/learn/render-and-commit.md create mode 100644 docs/src/learn/rendering-lists.md create mode 100644 docs/src/learn/responding-to-events.md create mode 100644 docs/src/learn/reusing-logic-with-custom-hooks.md create mode 100644 docs/src/learn/scaling-up-with-reducer-and-context.md create mode 100644 docs/src/learn/separating-events-from-effects.md create mode 100644 docs/src/learn/sharing-state-between-components.md create mode 100644 docs/src/learn/start-a-new-react-project.md create mode 100644 docs/src/learn/state-a-components-memory.md create mode 100644 docs/src/learn/state-as-a-snapshot.md create mode 100644 docs/src/learn/synchronizing-with-effects.md create mode 100644 docs/src/learn/thinking-in-react.md create mode 100644 docs/src/learn/tutorial-material-ui.md create mode 100644 docs/src/learn/tutorial-react-bootstrap.md create mode 100644 docs/src/learn/tutorial-tic-tac-toe.md create mode 100644 docs/src/learn/updating-arrays-in-state.md create mode 100644 docs/src/learn/updating-objects-in-state.md create mode 100644 docs/src/learn/vdom-mutations.md create mode 100644 docs/src/learn/writing-markup-with-psx.md create mode 100644 docs/src/learn/you-might-not-need-an-effect.md create mode 100644 docs/src/learn/your-first-component.md create mode 100644 docs/src/reference/client-api.md create mode 100644 docs/src/reference/common-events.md create mode 100644 docs/src/reference/common-props.md create mode 100644 docs/src/reference/common-types.md create mode 100644 docs/src/reference/django.md create mode 100644 docs/src/reference/fastapi.md create mode 100644 docs/src/reference/flask.md create mode 100644 docs/src/reference/jupyter.md create mode 100644 docs/src/reference/plotly-dash.md create mode 100644 docs/src/reference/protocol-structure.md create mode 100644 docs/src/reference/sanic.md create mode 100644 docs/src/reference/starlette.md create mode 100644 docs/src/reference/tornado.md create mode 100644 docs/src/reference/usage.md create mode 100644 docs/src/reference/use-callback.md create mode 100644 docs/src/reference/use-connection.md create mode 100644 docs/src/reference/use-context.md create mode 100644 docs/src/reference/use-debug-value.md create mode 100644 docs/src/reference/use-effect.md create mode 100644 docs/src/reference/use-location.md create mode 100644 docs/src/reference/use-memo.md create mode 100644 docs/src/reference/use-reducer.md create mode 100644 docs/src/reference/use-ref.md create mode 100644 docs/src/reference/use-scope.md create mode 100644 docs/src/reference/use-state.md create mode 100644 docs/src/static/css/extra.css create mode 100644 docs/src/static/images/s_thinking-in-react_ui.png create mode 100644 docs/src/static/images/s_thinking-in-react_ui_outline.png create mode 100644 docs/src/static/js/extra.js create mode 100644 mkdocs.yml diff --git a/.github/workflows/.hatch-run.yml b/.github/workflows/.hatch-run.yml deleted file mode 100644 index b312869e4..000000000 --- a/.github/workflows/.hatch-run.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: hatch-run - -on: - workflow_call: - inputs: - job-name: - required: true - type: string - hatch-run: - required: true - type: string - runs-on-array: - required: false - type: string - default: '["ubuntu-latest"]' - python-version-array: - required: false - type: string - default: '["3.x"]' - node-registry-url: - required: false - type: string - default: "" - secrets: - node-auth-token: - required: false - pypi-username: - required: false - pypi-password: - required: false - -jobs: - hatch: - name: ${{ format(inputs.job-name, matrix.python-version, matrix.runs-on) }} - strategy: - matrix: - python-version: ${{ fromJson(inputs.python-version-array) }} - runs-on: ${{ fromJson(inputs.runs-on-array) }} - runs-on: ${{ matrix.runs-on }} - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - with: - node-version: "14.x" - registry-url: ${{ inputs.node-registry-url }} - - name: Pin NPM Version - run: npm install -g npm@8.19.3 - - name: Use Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Install Python Dependencies - run: pip install hatch poetry - - name: Run Scripts - env: - NODE_AUTH_TOKEN: ${{ secrets.node-auth-token }} - PYPI_USERNAME: ${{ secrets.pypi-username }} - PYPI_PASSWORD: ${{ secrets.pypi-password }} - run: hatch run ${{ inputs.hatch-run }} diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml deleted file mode 100644 index af768579c..000000000 --- a/.github/workflows/check.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: check - -on: - push: - branches: - - main - pull_request: - branches: - - main - schedule: - - cron: "0 0 * * 0" - -jobs: - test-py-cov: - uses: ./.github/workflows/.hatch-run.yml - with: - job-name: "python-{0}" - hatch-run: "test-py" - lint-py: - uses: ./.github/workflows/.hatch-run.yml - with: - job-name: "python-{0}" - hatch-run: "lint-py" - test-py-matrix: - uses: ./.github/workflows/.hatch-run.yml - with: - job-name: "python-{0} {1}" - hatch-run: "test-py --no-cov" - runs-on-array: '["ubuntu-latest", "macos-latest", "windows-latest"]' - python-version-array: '["3.9", "3.10", "3.11"]' - test-docs: - uses: ./.github/workflows/.hatch-run.yml - with: - job-name: "python-{0}" - hatch-run: "test-docs" - test-js: - uses: ./.github/workflows/.hatch-run.yml - with: - job-name: "{1}" - hatch-run: "test-js" - lint-js: - uses: ./.github/workflows/.hatch-run.yml - with: - job-name: "{1}" - hatch-run: "lint-js" diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index b4f77ee00..000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,71 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: codeql - -on: - push: - branches: [main] - pull_request: - # The branches below must be a subset of the branches above - branches: [main] - schedule: - - cron: "43 3 * * 3" - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: ["javascript", "python"] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml deleted file mode 100644 index 7337f505b..000000000 --- a/.github/workflows/deploy-docs.yml +++ /dev/null @@ -1,30 +0,0 @@ -# This workflows will upload a Python Package using Twine when a release is created -# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries - -name: deploy-docs - -on: - push: - branches: - - "main" - tags: - - "*" - -jobs: - deploy-documentation: - runs-on: ubuntu-latest - steps: - - name: Check out src from Git - uses: actions/checkout@v2 - - name: Get history and tags for SCM versioning to work - run: | - git fetch --prune --unshallow - git fetch --depth=1 origin +refs/tags/*:refs/tags/* - - name: Login to Heroku Container Registry - run: echo ${{ secrets.HEROKU_API_KEY }} | docker login -u ${{ secrets.HEROKU_EMAIL }} --password-stdin registry.heroku.com - - name: Build Docker Image - run: docker build . --file docs/Dockerfile --tag registry.heroku.com/${{ secrets.HEROKU_APP_NAME }}/web - - name: Push Docker Image - run: docker push registry.heroku.com/${{ secrets.HEROKU_APP_NAME }}/web - - name: Deploy - run: HEROKU_API_KEY=${{ secrets.HEROKU_API_KEY }} heroku container:release web --app ${{ secrets.HEROKU_APP_NAME }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index e9271cbd5..000000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,20 +0,0 @@ -# This workflows will upload a Javscript Package using NPM to npmjs.org when a release is created -# For more information see: https://docs.github.com/en/actions/guides/publishing-nodejs-packages - -name: publish - -on: - release: - types: [published] - -jobs: - publish: - uses: ./.github/workflows/.hatch-run.yml - with: - job-name: "publish" - hatch-run: "publish" - node-registry-url: "https://registry.npmjs.org" - secrets: - node-auth-token: ${{ secrets.NODE_AUTH_TOKEN }} - pypi-username: ${{ secrets.PYPI_USERNAME }} - pypi-password: ${{ secrets.PYPI_PASSWORD }} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..5ae0eb0af --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,199 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +<!--attr-start--> + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +<!--attr-end--> + +<!-- +Using the following categories, list your changes in this order: + - "Added" for new features. + - "Changed" for changes in existing functionality. + - "Deprecated" for soon-to-be removed features. + - "Removed" for now removed features. + - "Fixed" for any bug fixes. + - "Security" in case of vulnerabilities. + --> + +<!--changelog-start--> + +## [Unreleased] + +- Nothing (yet) + +## [2.2.0] - 2022-12-28 + +### Added + +- Add `options: QueryOptions` parameter to `use_query` to allow for configuration of this hook. + +### Changed + +- By default, `use_query` will recursively prefetch all many-to-many or many-to-one relationships to prevent `SynchronousOnlyOperation` exceptions. + +### Removed + +- `django_idom.hooks._fetch_lazy_fields` has been deleted. The equivalent replacement is `django_idom.utils.django_query_postprocessor`. + +## [2.1.0] - 2022-11-01 + +### Changed + +- Minimum `channels` version is now `4.0.0`. + +### Fixed + +- Change type hint on `view_to_component` callable to have `request` argument be optional. +- Change type hint on `view_to_component` to represent it as a decorator with parenthesis (such as `@view_to_component(compatibility=True)`) + +### Security + +- Add note to docs about potential information exposure via `view_to_component` when using `compatibility=True`. + +## [2.0.1] - 2022-10-18 + +### Fixed + +- Ability to use `key=...` parameter on all prefabricated components. + +## [2.0.0] - 2022-10-17 + +### Added + +- `use_origin` hook for returning the browser's `location.origin`. + +### Changed + +- `view_to_component` now returns a `Callable`, instead of directly returning a `Component`. Check the docs for new usage info. +- `use_mutation` and `use_query` will now log any query failures. + +### Fixed + +- Allow `use_mutation` to have `refetch=None`, as the docs suggest is possible. +- `use_query` will now prefetch all fields to prevent `SynchronousOnlyOperation` exceptions. +- `view_to_component`, `django_css`, and `django_js` type hints will now display like normal functions. +- IDOM preloader no longer attempts to parse commented out IDOM components. +- Tests are now fully functional on Windows + +## [1.2.0] - 2022-09-19 + +### Added + +- `auth_required` decorator to prevent your components from rendering to unauthenticated users. +- `use_query` hook for fetching database values. +- `use_mutation` hook for modifying database values. +- `view_to_component` utility to convert legacy Django views to IDOM components. + +### Changed + +- Bumped the minimum IDOM version to 0.40.2 +- Testing suite now uses `playwright` instead of `selenium` + +### Fixed + +- IDOM preloader is no longer sensitive to whitespace within template tags. + +## [1.1.0] - 2022-07-01 + +### Added + +- `django_css` and `django_js` components to defer loading CSS & JS files until needed. + +### Changed + +- Bumped the minimum IDOM version to 0.39.0 + +## [1.0.0] - 2022-05-22 + +### Added + +- Django-specific hooks! `use_websocket`, `use_scope`, and `use_location` are now available within the `django_idom.hooks` module. +- Documentation has been placed into a formal docs webpage. +- Logging for when a component fails to import, or if no components were found within Django. + +### Changed + +- `idom_component` template tag has been renamed to `component` +- Bumped the minimum IDOM version to 0.38.0 + +### Removed + +- `websocket` parameter for components has been removed. Functionally, it is replaced with `django_idom.hooks.use_websocket`. + +## [0.0.5] - 2022-04-04 + +### Changed + +- Bumped the minimum IDOM version to 0.37.2 + +### Fixed + +- ModuleNotFoundError: No module named `idom.core.proto` caused by IDOM 0.37.2 + +## [0.0.4] - 2022-03-05 + +### Changed + +- Bumped the minimum IDOM version to 0.37.1 + +## [0.0.3] - 2022-02-19 + +### Changed + +- Bumped the minimum IDOM version to 0.36.3 + +## [0.0.2] - 2022-01-30 + +### Added + +- Ability to declare the HTML class of the top-level component `div` +- `name = ...` parameter to IDOM HTTP paths for use with `django.urls.reverse()` +- Cache versioning to automatically invalidate old web module files from the cache back-end +- Automatic pre-population of the IDOM component registry +- Type hinting for `IdomWebsocket` + +### Changed + +- Fetching web modules from disk and/or cache is now fully async +- Static files are now contained within a `django_idom/` parent folder +- Upgraded IDOM to version `0.36.0` +- Minimum Django version required is now `4.0` +- Minimum Python version required is now `3.8` + +### Removed + +- `IDOM_WEB_MODULES_PATH` has been replaced with Django `include(...)` +- `IDOM_WS_MAX_RECONNECT_DELAY` has been renamed to `IDOM_WS_MAX_RECONNECT_TIMEOUT` +- `idom_web_modules` cache back-end has been renamed to `idom` + +### Fixed + +- Increase test timeout values to prevent false positives +- Windows compatibility for building Django-IDOM + +### Security + +- Fixed potential directory traversal attack on the IDOM web modules URL + +## [0.0.1] - 2021-08-18 + +### Added + +- Support for IDOM within the Django + +[unreleased]: https://github.com/idom-team/django-idom/compare/2.2.0...HEAD +[2.2.0]: https://github.com/idom-team/django-idom/compare/2.1.0...2.2.0 +[2.1.0]: https://github.com/idom-team/django-idom/compare/2.0.1...2.1.0 +[2.0.1]: https://github.com/idom-team/django-idom/compare/2.0.0...2.0.1 +[2.0.0]: https://github.com/idom-team/django-idom/compare/1.2.0...2.0.0 +[1.2.0]: https://github.com/idom-team/django-idom/compare/1.1.0...1.2.0 +[1.1.0]: https://github.com/idom-team/django-idom/compare/1.0.0...1.1.0 +[1.0.0]: https://github.com/idom-team/django-idom/compare/0.0.5...1.0.0 +[0.0.5]: https://github.com/idom-team/django-idom/compare/0.0.4...0.0.5 +[0.0.4]: https://github.com/idom-team/django-idom/compare/0.0.3...0.0.4 +[0.0.3]: https://github.com/idom-team/django-idom/compare/0.0.2...0.0.3 +[0.0.2]: https://github.com/idom-team/django-idom/compare/0.0.1...0.0.2 +[0.0.1]: https://github.com/idom-team/django-idom/releases/tag/0.0.1 diff --git a/README.md b/README.md index 83241e19a..0086a306a 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,5 @@ -# <img src="https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg" align="left" height="45"/> ReactPy +Temporary branch being used to rewrite ReactPy's documentation. -<p> - <a href="https://github.com/reactive-python/reactpy/actions"> - <img src="https://github.com/reactive-python/reactpy/workflows/test/badge.svg?event=push"> - </a> - <a href="https://pypi.org/project/reactpy/"> - <img src="https://img.shields.io/pypi/v/reactpy.svg?label=PyPI"> - </a> - <a href="https://github.com/reactive-python/reactpy/blob/main/LICENSE"> - <img src="https://img.shields.io/badge/License-MIT-purple.svg"> - </a> - <a href="https://reactpy.dev/"> - <img src="https://img.shields.io/website?down_message=offline&label=Docs&logo=read-the-docs&logoColor=white&up_message=online&url=https%3A%2F%2Freactpy.dev%2Fdocs%2Findex.html"> - </a> - <a href="https://discord.gg/uNb5P4hA9X"> - <img src="https://img.shields.io/discord/1111078259854168116?label=Discord&logo=discord"> - </a> -</p> +Many of these pages are in progress, and are using the [original ReactJS pages](https://beta.reactjs.org/learn) as placeholders. - -[ReactPy](https://reactpy.dev/) is a library for building user interfaces in Python without Javascript. ReactPy interfaces are made from components that look and behave similar to those found in [ReactJS](https://reactjs.org/). Designed with simplicity in mind, ReactPy can be used by those without web development experience while also being powerful enough to grow with your ambitions. - -<table align="center"> - <thead> - <tr> - <th colspan="2" style="text-align: center">Supported Backends</th> - <tr> - <th style="text-align: center">Built-in</th> - <th style="text-align: center">External</th> - </tr> - </thead> - <tbody> - <tr> - <td> - <a href="https://reactpy.dev/docs/guides/getting-started/installing-reactpy.html#officially-supported-servers"> - Flask, FastAPI, Sanic, Tornado - </a> - </td> - <td> - <a href="https://github.com/reactive-python/reactpy-django">Django</a>, - <a href="https://github.com/reactive-python/reactpy-jupyter">Jupyter</a>, - <a href="https://github.com/idom-team/idom-dash">Plotly-Dash</a> - </td> - </tr> - </tbody> -</table> - -# At a Glance - -To get a rough idea of how to write apps in ReactPy, take a look at this tiny _Hello World_ application. - -```python -from reactpy import component, html, run - -@component -def hello_world(): - return html.h1("Hello, World!") - -run(hello_world) -``` - -# Resources - -Follow the links below to find out more about this project. - -- [Try ReactPy (Jupyter Notebook)](https://mybinder.org/v2/gh/reactive-python/reactpy-jupyter/main?urlpath=lab/tree/notebooks/introduction.ipynb) -- [Documentation](https://reactpy.dev/) -- [GitHub Discussions](https://github.com/reactive-python/reactpy/discussions) -- [Discord](https://discord.gg/uNb5P4hA9X) -- [Contributor Guide](https://reactpy.dev/docs/about/contributor-guide.html) -- [Code of Conduct](https://github.com/reactive-python/reactpy/blob/main/CODE_OF_CONDUCT.md) +See live preview here: https://archmonger.github.io/reactpy-docs/ diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index ea38eebf8..000000000 --- a/docs/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -build -source/_auto -source/_static/custom.js -source/vdom-json-schema.json diff --git a/docs/Dockerfile b/docs/Dockerfile deleted file mode 100644 index 76a8ad7ee..000000000 --- a/docs/Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -FROM python:3.9 - -WORKDIR /app/ - -# Install NodeJS -# -------------- -RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - -RUN apt-get install -yq nodejs build-essential -RUN npm install -g npm@8.5.0 - -# Install Poetry -# -------------- -RUN pip install poetry - -# Create/Activate Python Venv -# --------------------------- -ENV VIRTUAL_ENV=/opt/venv -RUN python3 -m venv $VIRTUAL_ENV -ENV PATH="$VIRTUAL_ENV/bin:$PATH" -RUN pip install --upgrade pip - -# Copy Files -# ---------- -COPY LICENSE ./ -COPY src ./src -COPY docs ./docs -COPY branding ./branding - -# Install and Build Docs -# ---------------------- -WORKDIR /app/docs -RUN poetry install -RUN sphinx-build -v -W -b html source build - -# Define Entrypoint -# ----------------- -ENV PORT 5000 -ENV REACTPY_DEBUG_MODE=1 -ENV REACTPY_CHECK_VDOM_SPEC=0 -CMD python main.py diff --git a/docs/LICENSE.md b/docs/LICENSE.md new file mode 100644 index 000000000..d21a91a91 --- /dev/null +++ b/docs/LICENSE.md @@ -0,0 +1,393 @@ +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More_considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public licenses. +Notwithstanding, Creative Commons may elect to apply one of its public +licenses to material it publishes and in those instances will be +considered the "Licensor." Except for the limited purpose of indicating +that material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the public +licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 1360bc825..000000000 --- a/docs/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# ReactPy's Documentation - -We provide two main ways to run the docs. Both use -[`nox`](https://pypi.org/project/nox/): - -- `nox -s docs` - displays the docs and rebuilds when files are modified. -- `nox -s docs-in-docker` - builds a docker image and runs the docs from there. - -If any changes to the core of the documentation are made (i.e. to non-`*.rst` files), -then you should run a manual test of the documentation using the `docs_in_docker` -session. - -If you wish to build and run the docs by hand you need to perform two commands, each -being run from the root of the repository: - -- `sphinx-build -b html docs/source docs/build` -- `python scripts/run_docs.py` - -The first command constructs the static HTML and any Javascript. The latter actually -runs the web server that serves the content. diff --git a/docs/docs_app/app.py b/docs/docs_app/app.py deleted file mode 100644 index 3fe4669ff..000000000 --- a/docs/docs_app/app.py +++ /dev/null @@ -1,59 +0,0 @@ -from logging import getLogger -from pathlib import Path - -from sanic import Sanic, response - -from docs_app.examples import get_normalized_example_name, load_examples -from reactpy import component -from reactpy.backend.sanic import Options, configure, use_request -from reactpy.core.types import ComponentConstructor - -THIS_DIR = Path(__file__).parent -DOCS_DIR = THIS_DIR.parent -DOCS_BUILD_DIR = DOCS_DIR / "build" - -REACTPY_MODEL_SERVER_URL_PREFIX = "/_reactpy" - -logger = getLogger(__name__) - - -REACTPY_MODEL_SERVER_URL_PREFIX = "/_reactpy" - - -@component -def Example(): - raw_view_id = use_request().get_args().get("view_id") - view_id = get_normalized_example_name(raw_view_id) - return _get_examples()[view_id]() - - -def _get_examples(): - if not _EXAMPLES: - _EXAMPLES.update(load_examples()) - return _EXAMPLES - - -def reload_examples(): - _EXAMPLES.clear() - _EXAMPLES.update(load_examples()) - - -_EXAMPLES: dict[str, ComponentConstructor] = {} - - -def make_app(name: str): - app = Sanic(name) - - app.static("/docs", str(DOCS_BUILD_DIR)) - - @app.route("/") - async def forward_to_index(_): - return response.redirect("/docs/index.html") - - configure( - app, - Example, - Options(url_prefix=REACTPY_MODEL_SERVER_URL_PREFIX), - ) - - return app diff --git a/docs/docs_app/dev.py b/docs/docs_app/dev.py deleted file mode 100644 index 5d661924d..000000000 --- a/docs/docs_app/dev.py +++ /dev/null @@ -1,104 +0,0 @@ -import asyncio -import os -import threading -import time -import webbrowser - -from sphinx_autobuild.cli import ( - Server, - _get_build_args, - _get_ignore_handler, - find_free_port, - get_builder, - get_parser, -) - -from docs_app.app import make_app, reload_examples -from reactpy.backend.sanic import serve_development_app -from reactpy.testing import clear_reactpy_web_modules_dir - -# these environment variable are used in custom Sphinx extensions -os.environ["REACTPY_DOC_EXAMPLE_SERVER_HOST"] = "127.0.0.1:5555" -os.environ["REACTPY_DOC_STATIC_SERVER_HOST"] = "" - - -def wrap_builder(old_builder): - # This is the bit that we're injecting to get the example components to reload too - - app = make_app("docs_dev_app") - - thread_started = threading.Event() - - def run_in_thread(): - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - - server_started = asyncio.Event() - - async def set_thread_event_when_started(): - await server_started.wait() - thread_started.set() - - loop.run_until_complete( - asyncio.gather( - serve_development_app(app, "127.0.0.1", 5555, server_started), - set_thread_event_when_started(), - ) - ) - - threading.Thread(target=run_in_thread, daemon=True).start() - - thread_started.wait() - - def new_builder(): - clear_reactpy_web_modules_dir() - reload_examples() - old_builder() - - return new_builder - - -def main(): - # Mostly copied from https://github.com/executablebooks/sphinx-autobuild/blob/b54fb08afc5112bfcda1d844a700c5a20cd6ba5e/src/sphinx_autobuild/cli.py - parser = get_parser() - args = parser.parse_args() - - srcdir = os.path.realpath(args.sourcedir) - outdir = os.path.realpath(args.outdir) - if not os.path.exists(outdir): - os.makedirs(outdir) - - server = Server() - - build_args, pre_build_commands = _get_build_args(args) - builder = wrap_builder( - get_builder( - server.watcher, - build_args, - host=args.host, - port=args.port, - pre_build_commands=pre_build_commands, - ) - ) - - ignore_handler = _get_ignore_handler(args) - server.watch(srcdir, builder, ignore=ignore_handler) - for dirpath in args.additional_watched_dirs: - real_dirpath = os.path.realpath(dirpath) - server.watch(real_dirpath, builder, ignore=ignore_handler) - server.watch(outdir, ignore=ignore_handler) - - if not args.no_initial_build: - builder() - - # Find the free port - portn = args.port or find_free_port() - if args.openbrowser is True: - - def opener(): - time.sleep(args.delay) - webbrowser.open(f"http://{args.host}:{args.port}/index.html") - - threading.Thread(target=opener, daemon=True).start() - - server.serve(port=portn, host=args.host, root=outdir) diff --git a/docs/docs_app/examples.py b/docs/docs_app/examples.py deleted file mode 100644 index a71a0b111..000000000 --- a/docs/docs_app/examples.py +++ /dev/null @@ -1,177 +0,0 @@ -from __future__ import annotations - -from collections.abc import Iterator -from io import StringIO -from pathlib import Path -from traceback import format_exc -from typing import Callable - -import reactpy -from reactpy.types import ComponentType - -HERE = Path(__file__) -SOURCE_DIR = HERE.parent.parent / "source" -CONF_FILE = SOURCE_DIR / "conf.py" -RUN_ReactPy = reactpy.run - - -def load_examples() -> Iterator[tuple[str, Callable[[], ComponentType]]]: - for name in all_example_names(): - yield name, load_one_example(name) - - -def all_example_names() -> set[str]: - names = set() - for file in _iter_example_files(SOURCE_DIR): - path = file.parent if file.name == "main.py" else file - names.add("/".join(path.relative_to(SOURCE_DIR).with_suffix("").parts)) - return names - - -def load_one_example(file_or_name: Path | str) -> Callable[[], ComponentType]: - return lambda: ( - # we use a lambda to ensure each instance is fresh - _load_one_example(file_or_name) - ) - - -def get_normalized_example_name( - name: str, relative_to: str | Path | None = SOURCE_DIR -) -> str: - return "/".join( - _get_root_example_path_by_name(name, relative_to).relative_to(SOURCE_DIR).parts - ) - - -def get_main_example_file_by_name( - name: str, relative_to: str | Path | None = SOURCE_DIR -) -> Path: - path = _get_root_example_path_by_name(name, relative_to) - if path.is_dir(): - return path / "main.py" - else: - return path.with_suffix(".py") - - -def get_example_files_by_name( - name: str, relative_to: str | Path | None = SOURCE_DIR -) -> list[Path]: - path = _get_root_example_path_by_name(name, relative_to) - if path.is_dir(): - return [p for p in path.glob("*") if not p.is_dir()] - else: - path = path.with_suffix(".py") - return [path] if path.exists() else [] - - -def _iter_example_files(root: Path) -> Iterator[Path]: - for path in root.iterdir(): - if path.is_dir(): - if not path.name.startswith("_") or path.name == "_examples": - yield from _iter_example_files(path) - elif path.suffix == ".py" and path != CONF_FILE: - yield path - - -def _load_one_example(file_or_name: Path | str) -> ComponentType: - if isinstance(file_or_name, str): - file = get_main_example_file_by_name(file_or_name) - else: - file = file_or_name - - if not file.exists(): - raise FileNotFoundError(str(file)) - - print_buffer = _PrintBuffer() - - def capture_print(*args, **kwargs): - buffer = StringIO() - print(*args, file=buffer, **kwargs) - print_buffer.write(buffer.getvalue()) - - captured_component_constructor = None - - def capture_component(component_constructor): - nonlocal captured_component_constructor - captured_component_constructor = component_constructor - - reactpy.run = capture_component - try: - code = compile(file.read_text(), str(file), "exec") - exec( - code, - { - "print": capture_print, - "__file__": str(file), - "__name__": file.stem, - }, - ) - except Exception: - return _make_error_display(format_exc()) - finally: - reactpy.run = RUN_ReactPy - - if captured_component_constructor is None: - return _make_example_did_not_run(str(file)) - - @reactpy.component - def Wrapper(): - return reactpy.html.div(captured_component_constructor(), PrintView()) - - @reactpy.component - def PrintView(): - text, set_text = reactpy.hooks.use_state(print_buffer.getvalue()) - print_buffer.set_callback(set_text) - return ( - reactpy.html.pre({"class_name": "printout"}, text) - if text - else reactpy.html.div() - ) - - return Wrapper() - - -def _get_root_example_path_by_name(name: str, relative_to: str | Path | None) -> Path: - if not name.startswith("/") and relative_to is not None: - rel_path = Path(relative_to) - rel_path = rel_path.parent if rel_path.is_file() else rel_path - else: - rel_path = SOURCE_DIR - return rel_path.joinpath(*name.split("/")).resolve() - - -class _PrintBuffer: - def __init__(self, max_lines: int = 10): - self._callback = None - self._lines = () - self._max_lines = max_lines - - def set_callback(self, function: Callable[[str], None]) -> None: - self._callback = function - - def getvalue(self) -> str: - return "".join(self._lines) - - def write(self, text: str) -> None: - if len(self._lines) == self._max_lines: - self._lines = self._lines[1:] + (text,) - else: - self._lines += (text,) - if self._callback is not None: - self._callback(self.getvalue()) - - -def _make_example_did_not_run(example_name): - @reactpy.component - def ExampleDidNotRun(): - return reactpy.html.code(f"Example {example_name} did not run") - - return ExampleDidNotRun() - - -def _make_error_display(message): - @reactpy.component - def ShowError(): - return reactpy.html.pre(message) - - return ShowError() diff --git a/docs/docs_app/prod.py b/docs/docs_app/prod.py deleted file mode 100644 index 0acf12432..000000000 --- a/docs/docs_app/prod.py +++ /dev/null @@ -1,14 +0,0 @@ -import os - -from docs_app.app import make_app - -app = make_app("docs_prod_app") - - -def main() -> None: - app.run( - host="0.0.0.0", # noqa: S104 - port=int(os.environ.get("PORT", 5000)), - workers=int(os.environ.get("WEB_CONCURRENCY", 1)), - debug=bool(int(os.environ.get("DEBUG", "0"))), - ) diff --git a/docs/examples/css/quick_start/adding_styles.css b/docs/examples/css/quick_start/adding_styles.css new file mode 100644 index 000000000..4d02060e1 --- /dev/null +++ b/docs/examples/css/quick_start/adding_styles.css @@ -0,0 +1,4 @@ +/* In your CSS */ +.avatar { + border-radius: 50%; +} diff --git a/docs/examples/css/quick_start/displaying_data.css b/docs/examples/css/quick_start/displaying_data.css new file mode 100644 index 000000000..9f5a392c1 --- /dev/null +++ b/docs/examples/css/quick_start/displaying_data.css @@ -0,0 +1,7 @@ +.avatar { + border-radius: 50%; +} + +.large { + border: 4px solid gold; +} diff --git a/docs/examples/css/quick_start/sharing_data_between_components.css b/docs/examples/css/quick_start/sharing_data_between_components.css new file mode 100644 index 000000000..6081b7ef4 --- /dev/null +++ b/docs/examples/css/quick_start/sharing_data_between_components.css @@ -0,0 +1,4 @@ +button { + display: block; + margin-bottom: 5px; +} diff --git a/docs/examples/css/quick_start/updating_the_screen.css b/docs/examples/css/quick_start/updating_the_screen.css new file mode 100644 index 000000000..6081b7ef4 --- /dev/null +++ b/docs/examples/css/quick_start/updating_the_screen.css @@ -0,0 +1,4 @@ +button { + display: block; + margin-bottom: 5px; +} diff --git a/docs/examples/css/tutorial-tic-tac-toe/tic_tac_toe.css b/docs/examples/css/tutorial-tic-tac-toe/tic_tac_toe.css new file mode 100644 index 000000000..87876ec02 --- /dev/null +++ b/docs/examples/css/tutorial-tic-tac-toe/tic_tac_toe.css @@ -0,0 +1,42 @@ +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} diff --git a/docs/docs_app/__init__.py b/docs/examples/python/__init__.py similarity index 100% rename from docs/docs_app/__init__.py rename to docs/examples/python/__init__.py diff --git a/docs/examples/python/quick_start/__init__.py b/docs/examples/python/quick_start/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/docs/examples/python/quick_start/adding_styles.py b/docs/examples/python/quick_start/adding_styles.py new file mode 100644 index 000000000..cdc9a7b99 --- /dev/null +++ b/docs/examples/python/quick_start/adding_styles.py @@ -0,0 +1,4 @@ +from reactpy import html + +# start +html.img({"class_name": "avatar"}) diff --git a/docs/examples/python/quick_start/conditional_rendering.py b/docs/examples/python/quick_start/conditional_rendering.py new file mode 100644 index 000000000..d89e097a4 --- /dev/null +++ b/docs/examples/python/quick_start/conditional_rendering.py @@ -0,0 +1,22 @@ +from reactpy import component, html + + +def admin_panel(): + return [] + + +def login_form(): + return [] + + +is_logged_in = True + + +# start +@component +def my_component(): + if is_logged_in: + content = admin_panel() + else: + content = login_form() + return html.div(content) diff --git a/docs/examples/python/quick_start/conditional_rendering_logical_and.py b/docs/examples/python/quick_start/conditional_rendering_logical_and.py new file mode 100644 index 000000000..07e752bba --- /dev/null +++ b/docs/examples/python/quick_start/conditional_rendering_logical_and.py @@ -0,0 +1,14 @@ +from reactpy import component, html + + +def admin_panel(): + return [] + + +is_logged_in = True + + +# start +@component +def my_component(): + return html.div(is_logged_in and admin_panel()) diff --git a/docs/examples/python/quick_start/conditional_rendering_ternary.py b/docs/examples/python/quick_start/conditional_rendering_ternary.py new file mode 100644 index 000000000..2490cb5f9 --- /dev/null +++ b/docs/examples/python/quick_start/conditional_rendering_ternary.py @@ -0,0 +1,18 @@ +from reactpy import component, html + + +def admin_panel(): + return [] + + +def login_form(): + return [] + + +is_logged_in = True + + +# start +@component +def my_component(): + return html.div(admin_panel() if is_logged_in else login_form()) diff --git a/docs/examples/python/quick_start/creating_and_nesting_components.py b/docs/examples/python/quick_start/creating_and_nesting_components.py new file mode 100644 index 000000000..0841e9514 --- /dev/null +++ b/docs/examples/python/quick_start/creating_and_nesting_components.py @@ -0,0 +1,21 @@ +from reactpy import component, html + + +@component +def my_button(): + return html.button("I'm a button!") + + +@component +def my_app(): + return html.div( + html.h1("Welcome to my app"), + my_button(), + ) + + +# end +if __name__ == "__main__": + from reactpy import run + + run(my_app) diff --git a/docs/examples/python/quick_start/displaying_data.py b/docs/examples/python/quick_start/displaying_data.py new file mode 100644 index 000000000..d4caa09c9 --- /dev/null +++ b/docs/examples/python/quick_start/displaying_data.py @@ -0,0 +1,32 @@ +from reactpy import component, html + +user = { + "name": "Hedy Lamarr", + "image_url": "https://i.imgur.com/yXOvdOSs.jpg", + "image_size": 90, +} + + +@component +def profile(): + return html.div( + html.h3(user["name"]), + html.img( + { + "class_name": "avatar", + "src": user["image_url"], + "alt": f"Photo of {user['name']}", + "style": { + "width": user["image_size"], + "height": user["image_size"], + }, + } + ), + ) + + +# end +if __name__ == "__main__": + from reactpy import run + + run(profile) diff --git a/docs/examples/python/quick_start/my_app.py b/docs/examples/python/quick_start/my_app.py new file mode 100644 index 000000000..1616d54d1 --- /dev/null +++ b/docs/examples/python/quick_start/my_app.py @@ -0,0 +1,12 @@ +from reactpy import component, html + +from .my_button import my_button + + +# start +@component +def my_app(): + return html.div( + html.h1("Welcome to my app"), + my_button(), + ) diff --git a/docs/examples/python/quick_start/my_button.py b/docs/examples/python/quick_start/my_button.py new file mode 100644 index 000000000..0016632ca --- /dev/null +++ b/docs/examples/python/quick_start/my_button.py @@ -0,0 +1,7 @@ +from reactpy import component, html + + +# start +@component +def my_button(): + return html.button("I'm a button!") diff --git a/docs/examples/python/quick_start/rendering_lists.py b/docs/examples/python/quick_start/rendering_lists.py new file mode 100644 index 000000000..35ec3e069 --- /dev/null +++ b/docs/examples/python/quick_start/rendering_lists.py @@ -0,0 +1,30 @@ +from reactpy import component, html + +products = [ + {"title": "Cabbage", "is_fruit": False, "id": 1}, + {"title": "Garlic", "is_fruit": False, "id": 2}, + {"title": "Apple", "is_fruit": True, "id": 3}, +] + + +@component +def shopping_list(): + list_items = [ + html.li( + { + "key": product["id"], + "style": {"color": "magenta" if product["is_fruit"] else "darkgreen"}, + }, + product["title"], + ) + for product in products + ] + + return html.ul(list_items) + + +# end +if __name__ == "__main__": + from reactpy import run + + run(shopping_list) diff --git a/docs/examples/python/quick_start/rendering_lists_list_items.py b/docs/examples/python/quick_start/rendering_lists_list_items.py new file mode 100644 index 000000000..43e108f36 --- /dev/null +++ b/docs/examples/python/quick_start/rendering_lists_list_items.py @@ -0,0 +1,6 @@ +from reactpy import html + +from .rendering_lists_products import products + +# start +list_items = [html.li({"key": product["id"]}, product["title"]) for product in products] diff --git a/docs/examples/python/quick_start/rendering_lists_products.py b/docs/examples/python/quick_start/rendering_lists_products.py new file mode 100644 index 000000000..c2d6a5e31 --- /dev/null +++ b/docs/examples/python/quick_start/rendering_lists_products.py @@ -0,0 +1,5 @@ +products = [ + {"title": "Cabbage", "id": 1}, + {"title": "Garlic", "id": 2}, + {"title": "Apple", "id": 3}, +] diff --git a/docs/examples/python/quick_start/responding_to_events.py b/docs/examples/python/quick_start/responding_to_events.py new file mode 100644 index 000000000..c893353cf --- /dev/null +++ b/docs/examples/python/quick_start/responding_to_events.py @@ -0,0 +1,13 @@ +from reactpy import component, html + + +# start +@component +def my_button(): + def handle_click(event): + print("You clicked me!") + + return html.button( + {"on_click": handle_click}, + "Click me", + ) diff --git a/docs/examples/python/quick_start/sharing_data_between_components.py b/docs/examples/python/quick_start/sharing_data_between_components.py new file mode 100644 index 000000000..7c4d9904d --- /dev/null +++ b/docs/examples/python/quick_start/sharing_data_between_components.py @@ -0,0 +1,27 @@ +from reactpy import component, html, use_state + + +@component +def my_app(): + count, set_count = use_state(0) + + def handle_click(event): + set_count(count + 1) + + return html.div( + html.h1("Counters that update together"), + my_button(count, handle_click), + my_button(count, handle_click), + ) + + +@component +def my_button(count, on_click): + return html.button({"on_click": on_click}, f"Clicked {count} times") + + +# end +if __name__ == "__main__": + from reactpy import run + + run(my_app) diff --git a/docs/examples/python/quick_start/sharing_data_between_components_button.py b/docs/examples/python/quick_start/sharing_data_between_components_button.py new file mode 100644 index 000000000..b96dadfa6 --- /dev/null +++ b/docs/examples/python/quick_start/sharing_data_between_components_button.py @@ -0,0 +1,7 @@ +from reactpy import component, html + + +# start +@component +def my_button(count, on_click): + return html.button({"on_click": on_click}, f"Clicked {count} times") diff --git a/docs/examples/python/quick_start/sharing_data_between_components_move_state.py b/docs/examples/python/quick_start/sharing_data_between_components_move_state.py new file mode 100644 index 000000000..a3c6126c2 --- /dev/null +++ b/docs/examples/python/quick_start/sharing_data_between_components_move_state.py @@ -0,0 +1,20 @@ +from reactpy import component, html, use_state + +# start +@component +def my_app(): + count, set_count = use_state(0) + + def handle_click(event): + set_count(count + 1) + + return html.div( + html.h1("Counters that update separately"), + my_button(), + my_button(), + ) + + +@component +def my_button(): + # ... we're moving code from here ... diff --git a/docs/examples/python/quick_start/sharing_data_between_components_props.py b/docs/examples/python/quick_start/sharing_data_between_components_props.py new file mode 100644 index 000000000..52294076a --- /dev/null +++ b/docs/examples/python/quick_start/sharing_data_between_components_props.py @@ -0,0 +1,22 @@ +from reactpy import component, html, use_state + + +# start +@component +def my_app(): + count, set_count = use_state(0) + + def handle_click(event): + set_count(count + 1) + + return html.div( + html.h1("Counters that update together"), + my_button(count, handle_click), + my_button(count, handle_click), + ) + # end + + +@component +def my_button(count, on_click): + ... diff --git a/docs/examples/python/quick_start/updating_the_screen.py b/docs/examples/python/quick_start/updating_the_screen.py new file mode 100644 index 000000000..906a0718f --- /dev/null +++ b/docs/examples/python/quick_start/updating_the_screen.py @@ -0,0 +1,27 @@ +from reactpy import component, html, use_state + + +@component +def my_app(): + return html.div( + html.h1("Counters that update separately"), + my_button(), + my_button(), + ) + + +@component +def my_button(): + count, set_count = use_state(0) + + def handle_click(event): + set_count(count + 1) + + return html.button({"on_click": handle_click}, f"Clicked {count} times") + + +# end +if __name__ == "__main__": + from reactpy import run + + run(my_app) diff --git a/docs/examples/python/quick_start/updating_the_screen_event.py b/docs/examples/python/quick_start/updating_the_screen_event.py new file mode 100644 index 000000000..2829c481c --- /dev/null +++ b/docs/examples/python/quick_start/updating_the_screen_event.py @@ -0,0 +1,12 @@ +from reactpy import component, html, use_state + + +# start +@component +def my_button(): + count, set_count = use_state(0) + + def handle_click(event): + set_count(count + 1) + + return html.button({"on_click": handle_click}, f"Clicked {count} times") diff --git a/docs/examples/python/quick_start/updating_the_screen_use_state.py b/docs/examples/python/quick_start/updating_the_screen_use_state.py new file mode 100644 index 000000000..010487c33 --- /dev/null +++ b/docs/examples/python/quick_start/updating_the_screen_use_state.py @@ -0,0 +1,5 @@ +from reactpy import use_state + +# end + +use_state() diff --git a/docs/examples/python/quick_start/updating_the_screen_use_state_button.py b/docs/examples/python/quick_start/updating_the_screen_use_state_button.py new file mode 100644 index 000000000..c331ee6c9 --- /dev/null +++ b/docs/examples/python/quick_start/updating_the_screen_use_state_button.py @@ -0,0 +1,8 @@ +from reactpy import component, use_state + + +# start +@component +def my_button(): + count, set_count = use_state(0) + # ... diff --git a/docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py b/docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py new file mode 100644 index 000000000..9a5fc40cc --- /dev/null +++ b/docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py @@ -0,0 +1,117 @@ +from copy import deepcopy + +from reactpy import component, html, use_state + + +@component +def square(value, on_square_click): + return html.button( + {"className": "square", "on_click": on_square_click}, + value or "", + ) + + +@component +def board(x_is_next, squares, on_play): + def handle_click(i): + def event(_event): + if calculate_winner(squares) or squares[i]: + return + + next_squares = squares.copy() + next_squares[i] = "X" if x_is_next else "O" + on_play(next_squares) + + return event + + winner = calculate_winner(squares) + status = ( + f"Winner: {winner}" if winner else "Next player: " + ("X" if x_is_next else "O") + ) + + return html._( + html.div({"className": "status"}, status), + html.div( + {"className": "board-row"}, + square(squares[0], handle_click(0)), + square(squares[1], handle_click(1)), + square(squares[2], handle_click(2)), + ), + html.div( + {"className": "board-row"}, + square(squares[3], handle_click(3)), + square(squares[4], handle_click(4)), + square(squares[5], handle_click(5)), + ), + html.div( + {"className": "board-row"}, + square(squares[6], handle_click(6)), + square(squares[7], handle_click(7)), + square(squares[8], handle_click(8)), + ), + ) + + +@component +def game(): + history, set_history = use_state([[None] * 9]) + current_move, set_current_move = use_state(0) + x_is_next = current_move % 2 == 0 + current_squares = history[current_move] + + def handle_play(next_squares): + next_history = deepcopy(history[: current_move + 1]) + next_history.append(next_squares) + set_history(next_history) + set_current_move(len(next_history) - 1) + + def jump_to(next_move): + return lambda _event: set_current_move(next_move) + + moves = [] + for move, _squares in enumerate(history): + description = f"Go to move #{move}" if move > 0 else "Go to game start" + + moves.append( + html.li( + {"key": move}, + html.button({"on_click": jump_to(move)}, description), + ) + ) + + return html.div( + {"className": "game"}, + html.div( + {"className": "game-board"}, + board(x_is_next, current_squares, handle_play), + ), + html.div({"className": "game-info"}, html.ol(moves)), + ) + + +def calculate_winner(squares): + lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ] + for line in lines: + a, b, c = line + if not squares: + continue + if squares[a] and squares[a] == squares[b] and squares[a] == squares[c]: + return squares[a] + + return None + + +# end +if __name__ == "__main__": + from reactpy import run + + run(game) diff --git a/docs/main.py b/docs/main.py deleted file mode 100644 index e3181f393..000000000 --- a/docs/main.py +++ /dev/null @@ -1,9 +0,0 @@ -import sys - -from docs_app import dev, prod - -if __name__ == "__main__": - if len(sys.argv) == 1: - prod.main() - else: - dev.main() diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 000000000..e70aa10c8 --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block content %} +{{ super() }} + +{% if git_page_authors %} +<div class="md-source-date"> + <small> + Authors: {{ git_page_authors | default('enable mkdocs-git-authors-plugin') }} + </small> +</div> +{% endif %} +{% endblock %} diff --git a/docs/poetry.lock b/docs/poetry.lock deleted file mode 100644 index 8e1daef24..000000000 --- a/docs/poetry.lock +++ /dev/null @@ -1,2269 +0,0 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. - -[[package]] -name = "aiofiles" -version = "23.1.0" -description = "File support for asyncio." -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "aiofiles-23.1.0-py3-none-any.whl", hash = "sha256:9312414ae06472eb6f1d163f555e466a23aed1c8f60c30cccf7121dba2e53eb2"}, - {file = "aiofiles-23.1.0.tar.gz", hash = "sha256:edd247df9a19e0db16534d4baaf536d6609a43e1de5401d7a4c1c148753a1635"}, -] - -[[package]] -name = "alabaster" -version = "0.7.13" -description = "A configurable sidebar-enabled Sphinx theme" -optional = false -python-versions = ">=3.6" -files = [ - {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, - {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, -] - -[[package]] -name = "anyio" -version = "3.7.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.7" -files = [ - {file = "anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0"}, - {file = "anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce"}, -] - -[package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx (>=6.1.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] - -[[package]] -name = "asgiref" -version = "3.7.2" -description = "ASGI specs, helper code, and adapters" -optional = false -python-versions = ">=3.7" -files = [ - {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"}, - {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} - -[package.extras] -tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] - -[[package]] -name = "babel" -version = "2.12.1" -description = "Internationalization utilities" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, -] - -[[package]] -name = "beautifulsoup4" -version = "4.12.2" -description = "Screen-scraping library" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, -] - -[package.dependencies] -soupsieve = ">1.2" - -[package.extras] -html5lib = ["html5lib"] -lxml = ["lxml"] - -[[package]] -name = "certifi" -version = "2023.5.7" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.1.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, - {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, - {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, - {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, - {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, - {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, - {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, -] - -[[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "colorlog" -version = "6.7.0" -description = "Add colours to the output of Python's logging module." -optional = false -python-versions = ">=3.6" -files = [ - {file = "colorlog-6.7.0-py2.py3-none-any.whl", hash = "sha256:0d33ca236784a1ba3ff9c532d4964126d8a2c44f1f0cb1d2b0728196f512f662"}, - {file = "colorlog-6.7.0.tar.gz", hash = "sha256:bd94bd21c1e13fac7bd3153f4bc3a7dc0eb0974b8bc2fdf1a989e474f6e582e5"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} - -[package.extras] -development = ["black", "flake8", "mypy", "pytest", "types-colorama"] - -[[package]] -name = "contourpy" -version = "1.0.7" -description = "Python library for calculating contours of 2D quadrilateral grids" -optional = false -python-versions = ">=3.8" -files = [ - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, - {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, - {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, - {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, - {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, - {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, - {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, - {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, - {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, - {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, -] - -[package.dependencies] -numpy = ">=1.16" - -[package.extras] -bokeh = ["bokeh", "chromedriver", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] -test = ["Pillow", "matplotlib", "pytest"] -test-no-images = ["pytest"] - -[[package]] -name = "cycler" -version = "0.11.0" -description = "Composable style cycles" -optional = false -python-versions = ">=3.6" -files = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, -] - -[[package]] -name = "docutils" -version = "0.17.1" -description = "Docutils -- Python Documentation Utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.1.1" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, - {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "fastapi" -version = "0.96.0" -description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -optional = false -python-versions = ">=3.7" -files = [ - {file = "fastapi-0.96.0-py3-none-any.whl", hash = "sha256:b8e11fe81e81eab4e1504209917338e0b80f783878a42c2b99467e5e1019a1e9"}, - {file = "fastapi-0.96.0.tar.gz", hash = "sha256:71232d47c2787446991c81c41c249f8a16238d52d779c0e6b43927d3773dbe3c"}, -] - -[package.dependencies] -pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" -starlette = ">=0.27.0,<0.28.0" - -[package.extras] -all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] -dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"] -doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer-cli (>=0.0.13,<0.0.14)", "typer[all] (>=0.6.1,<0.8.0)"] -test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==23.1.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.7)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.7.0.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"] - -[[package]] -name = "fastjsonschema" -version = "2.17.1" -description = "Fastest Python implementation of JSON schema" -optional = false -python-versions = "*" -files = [ - {file = "fastjsonschema-2.17.1-py3-none-any.whl", hash = "sha256:4b90b252628ca695280924d863fe37234eebadc29c5360d322571233dc9746e0"}, - {file = "fastjsonschema-2.17.1.tar.gz", hash = "sha256:f4eeb8a77cef54861dbf7424ac8ce71306f12cbb086c45131bcba2c6a4f726e3"}, -] - -[package.extras] -devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] - -[[package]] -name = "flask" -version = "2.1.3" -description = "A simple framework for building complex web applications." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Flask-2.1.3-py3-none-any.whl", hash = "sha256:9013281a7402ad527f8fd56375164f3aa021ecfaff89bfe3825346c24f87e04c"}, - {file = "Flask-2.1.3.tar.gz", hash = "sha256:15972e5017df0575c3d6c090ba168b6db90259e620ac8d7ea813a396bad5b6cb"}, -] - -[package.dependencies] -click = ">=8.0" -importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} -itsdangerous = ">=2.0" -Jinja2 = ">=3.0" -Werkzeug = ">=2.0" - -[package.extras] -async = ["asgiref (>=3.2)"] -dotenv = ["python-dotenv"] - -[[package]] -name = "flask-cors" -version = "3.0.10" -description = "A Flask extension adding a decorator for CORS support" -optional = false -python-versions = "*" -files = [ - {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"}, - {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"}, -] - -[package.dependencies] -Flask = ">=0.9" -Six = "*" - -[[package]] -name = "flask-sock" -version = "0.6.0" -description = "WebSocket support for Flask" -optional = false -python-versions = ">=3.6" -files = [ - {file = "flask-sock-0.6.0.tar.gz", hash = "sha256:435cf81bb497ac7622cd1dda554fbfa3e369e629daea0a1d21b73a24f1bd6229"}, - {file = "flask_sock-0.6.0-py3-none-any.whl", hash = "sha256:593fffb186928080a5b5b03d717efc56dac2d5ed690ce6bfff333b3597a2f518"}, -] - -[package.dependencies] -flask = ">=2" -simple-websocket = ">=0.5.1" - -[[package]] -name = "fonttools" -version = "4.39.4" -description = "Tools to manipulate font files" -optional = false -python-versions = ">=3.8" -files = [ - {file = "fonttools-4.39.4-py3-none-any.whl", hash = "sha256:106caf6167c4597556b31a8d9175a3fdc0356fdcd70ab19973c3b0d4c893c461"}, - {file = "fonttools-4.39.4.zip", hash = "sha256:dba8d7cdb8e2bac1b3da28c5ed5960de09e59a2fe7e63bb73f5a59e57b0430d2"}, -] - -[package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] -graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] -pathops = ["skia-pathops (>=0.5.0)"] -plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] -symfont = ["sympy"] -type1 = ["xattr"] -ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.0.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] - -[[package]] -name = "furo" -version = "2022.4.7" -description = "A clean customisable Sphinx documentation theme." -optional = false -python-versions = ">=3.6" -files = [ - {file = "furo-2022.4.7-py3-none-any.whl", hash = "sha256:7f3e3d2fb977483590f8ecb2c2cd511bd82661b79c18efb24de9558bc9cdf2d7"}, - {file = "furo-2022.4.7.tar.gz", hash = "sha256:96204ab7cd047e4b6c523996e0279c4c629a8fc31f4f109b2efd470c17f49c80"}, -] - -[package.dependencies] -beautifulsoup4 = "*" -pygments = ">=2.7,<3.0" -sphinx = ">=4.0,<5.0" - -[[package]] -name = "greenlet" -version = "2.0.2" -description = "Lightweight in-process concurrent programming" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, -] - -[package.extras] -docs = ["Sphinx", "docutils (<0.18)"] -test = ["objgraph", "psutil"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "html5tagger" -version = "1.3.0" -description = "Pythonic HTML generation/templating (no template files)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "html5tagger-1.3.0-py3-none-any.whl", hash = "sha256:ce14313515edffec8ed8a36c5890d023922641171b4e6e5774ad1a74998f5351"}, - {file = "html5tagger-1.3.0.tar.gz", hash = "sha256:84fa3dfb49e5c83b79bbd856ab7b1de8e2311c3bb46a8be925f119e3880a8da9"}, -] - -[[package]] -name = "httptools" -version = "0.5.0" -description = "A collection of framework independent HTTP protocol utils." -optional = false -python-versions = ">=3.5.0" -files = [ - {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f470c79061599a126d74385623ff4744c4e0f4a0997a353a44923c0b561ee51"}, - {file = "httptools-0.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e90491a4d77d0cb82e0e7a9cb35d86284c677402e4ce7ba6b448ccc7325c5421"}, - {file = "httptools-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1d2357f791b12d86faced7b5736dea9ef4f5ecdc6c3f253e445ee82da579449"}, - {file = "httptools-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f90cd6fd97c9a1b7fe9215e60c3bd97336742a0857f00a4cb31547bc22560c2"}, - {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5230a99e724a1bdbbf236a1b58d6e8504b912b0552721c7c6b8570925ee0ccde"}, - {file = "httptools-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a47a34f6015dd52c9eb629c0f5a8a5193e47bf2a12d9a3194d231eaf1bc451a"}, - {file = "httptools-0.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:24bb4bb8ac3882f90aa95403a1cb48465de877e2d5298ad6ddcfdebec060787d"}, - {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e67d4f8734f8054d2c4858570cc4b233bf753f56e85217de4dfb2495904cf02e"}, - {file = "httptools-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e5eefc58d20e4c2da82c78d91b2906f1a947ef42bd668db05f4ab4201a99f49"}, - {file = "httptools-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0297822cea9f90a38df29f48e40b42ac3d48a28637368f3ec6d15eebefd182f9"}, - {file = "httptools-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557be7fbf2bfa4a2ec65192c254e151684545ebab45eca5d50477d562c40f986"}, - {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:54465401dbbec9a6a42cf737627fb0f014d50dc7365a6b6cd57753f151a86ff0"}, - {file = "httptools-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4d9ebac23d2de960726ce45f49d70eb5466725c0087a078866043dad115f850f"}, - {file = "httptools-0.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8a34e4c0ab7b1ca17b8763613783e2458e77938092c18ac919420ab8655c8c1"}, - {file = "httptools-0.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f659d7a48401158c59933904040085c200b4be631cb5f23a7d561fbae593ec1f"}, - {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1616b3ba965cd68e6f759eeb5d34fbf596a79e84215eeceebf34ba3f61fdc7"}, - {file = "httptools-0.5.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3625a55886257755cb15194efbf209584754e31d336e09e2ffe0685a76cb4b60"}, - {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:72ad589ba5e4a87e1d404cc1cb1b5780bfcb16e2aec957b88ce15fe879cc08ca"}, - {file = "httptools-0.5.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324"}, - {file = "httptools-0.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f222e1e9d3f13b68ff8a835574eda02e67277d51631d69d7cf7f8e07df678c86"}, - {file = "httptools-0.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3cb8acf8f951363b617a8420768a9f249099b92e703c052f9a51b66342eea89b"}, - {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550059885dc9c19a072ca6d6735739d879be3b5959ec218ba3e013fd2255a11b"}, - {file = "httptools-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a04fe458a4597aa559b79c7f48fe3dceabef0f69f562daf5c5e926b153817281"}, - {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d0c1044bce274ec6711f0770fd2d5544fe392591d204c68328e60a46f88843b"}, - {file = "httptools-0.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c6eeefd4435055a8ebb6c5cc36111b8591c192c56a95b45fe2af22d9881eee25"}, - {file = "httptools-0.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5b65be160adcd9de7a7e6413a4966665756e263f0d5ddeffde277ffeee0576a5"}, - {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fe9c766a0c35b7e3d6b6939393c8dfdd5da3ac5dec7f971ec9134f284c6c36d6"}, - {file = "httptools-0.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85b392aba273566c3d5596a0a490978c085b79700814fb22bfd537d381dd230c"}, - {file = "httptools-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5e3088f4ed33947e16fd865b8200f9cfae1144f41b64a8cf19b599508e096bc"}, - {file = "httptools-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c2a56b6aad7cc8f5551d8e04ff5a319d203f9d870398b94702300de50190f63"}, - {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9b571b281a19762adb3f48a7731f6842f920fa71108aff9be49888320ac3e24d"}, - {file = "httptools-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa47ffcf70ba6f7848349b8a6f9b481ee0f7637931d91a9860a1838bfc586901"}, - {file = "httptools-0.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:bede7ee075e54b9a5bde695b4fc8f569f30185891796b2e4e09e2226801d09bd"}, - {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:64eba6f168803a7469866a9c9b5263a7463fa8b7a25b35e547492aa7322036b6"}, - {file = "httptools-0.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b098e4bb1174096a93f48f6193e7d9aa7071506a5877da09a783509ca5fff42"}, - {file = "httptools-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9423a2de923820c7e82e18980b937893f4aa8251c43684fa1772e341f6e06887"}, - {file = "httptools-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca1b7becf7d9d3ccdbb2f038f665c0f4857e08e1d8481cbcc1a86a0afcfb62b2"}, - {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:50d4613025f15f4b11f1c54bbed4761c0020f7f921b95143ad6d58c151198142"}, - {file = "httptools-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372"}, - {file = "httptools-0.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:1af91b3650ce518d226466f30bbba5b6376dbd3ddb1b2be8b0658c6799dd450b"}, - {file = "httptools-0.5.0.tar.gz", hash = "sha256:295874861c173f9101960bba332429bb77ed4dcd8cdf5cee9922eb00e4f6bc09"}, -] - -[package.extras] -test = ["Cython (>=0.29.24,<0.30.0)"] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "imagesize" -version = "1.4.1" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, - {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, -] - -[[package]] -name = "importlib-metadata" -version = "6.6.0" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, - {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, -] - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] - -[[package]] -name = "importlib-resources" -version = "5.12.0" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, - {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[[package]] -name = "itsdangerous" -version = "2.1.2" -description = "Safely pass data to untrusted environments and back." -optional = false -python-versions = ">=3.7" -files = [ - {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, - {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, -] - -[[package]] -name = "jinja2" -version = "3.1.2" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "jsonpatch" -version = "1.32" -description = "Apply JSON-Patches (RFC 6902)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "jsonpatch-1.32-py2.py3-none-any.whl", hash = "sha256:26ac385719ac9f54df8a2f0827bb8253aa3ea8ab7b3368457bcdb8c14595a397"}, - {file = "jsonpatch-1.32.tar.gz", hash = "sha256:b6ddfe6c3db30d81a96aaeceb6baf916094ffa23d7dd5fa2c13e13f8b6e600c2"}, -] - -[package.dependencies] -jsonpointer = ">=1.9" - -[[package]] -name = "jsonpointer" -version = "2.3" -description = "Identify specific nodes in a JSON document (RFC 6901)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "jsonpointer-2.3-py2.py3-none-any.whl", hash = "sha256:51801e558539b4e9cd268638c078c6c5746c9ac96bc38152d443400e4f3793e9"}, - {file = "jsonpointer-2.3.tar.gz", hash = "sha256:97cba51526c829282218feb99dab1b1e6bdf8efd1c43dc9d57be093c0d69c99a"}, -] - -[[package]] -name = "kiwisolver" -version = "1.4.4" -description = "A fast implementation of the Cassowary constraint solver" -optional = false -python-versions = ">=3.7" -files = [ - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, - {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, -] - -[[package]] -name = "livereload" -version = "2.6.3" -description = "Python LiveReload is an awesome tool for web developers" -optional = false -python-versions = "*" -files = [ - {file = "livereload-2.6.3-py2.py3-none-any.whl", hash = "sha256:ad4ac6f53b2d62bb6ce1a5e6e96f1f00976a32348afedcb4b6d68df2a1d346e4"}, - {file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"}, -] - -[package.dependencies] -six = "*" -tornado = {version = "*", markers = "python_version > \"2.7\""} - -[[package]] -name = "lxml" -version = "4.9.2" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" -files = [ - {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, - {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, - {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, - {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, - {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, - {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, - {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, - {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, - {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, - {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, - {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, - {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, - {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, - {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, - {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, - {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, - {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, - {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, - {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, - {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, - {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, - {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, - {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, - {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, - {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, - {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, - {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, - {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, - {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, - {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, - {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, - {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, - {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, - {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, - {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, - {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, - {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, - {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, - {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, - {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, - {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, -] - -[package.extras] -cssselect = ["cssselect (>=0.7)"] -html5 = ["html5lib"] -htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.7)"] - -[[package]] -name = "markupsafe" -version = "2.0.1" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.6" -files = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] - -[[package]] -name = "matplotlib" -version = "3.7.1" -description = "Python plotting package" -optional = false -python-versions = ">=3.8" -files = [ - {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, - {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, - {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, - {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, - {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, - {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, - {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, - {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, - {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, - {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, - {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, - {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, - {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, - {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, - {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, - {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, - {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, - {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, - {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, - {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, - {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, - {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, - {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, - {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, - {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, - {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, - {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, - {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, - {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, - {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, - {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, - {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, - {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, -] - -[package.dependencies] -contourpy = ">=1.0.1" -cycler = ">=0.10" -fonttools = ">=4.22.0" -importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} -kiwisolver = ">=1.0.1" -numpy = ">=1.20" -packaging = ">=20.0" -pillow = ">=6.2.0" -pyparsing = ">=2.3.1" -python-dateutil = ">=2.7" - -[[package]] -name = "multidict" -version = "6.0.4" -description = "multidict implementation" -optional = false -python-versions = ">=3.7" -files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "numpy" -version = "1.24.3" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, - {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, - {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, - {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, - {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, - {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, - {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, - {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, - {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, - {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, - {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, -] - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] - -[[package]] -name = "pillow" -version = "9.5.0" -description = "Python Imaging Library (Fork)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, - {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "playwright" -version = "1.34.0" -description = "A high-level API to automate web browsers" -optional = false -python-versions = ">=3.7" -files = [ - {file = "playwright-1.34.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:69bb9b3296e366a23a99277b4c7673cb54ce71a3f5d630f114f7701b61f98f25"}, - {file = "playwright-1.34.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:402d946631c8458436e099d7731bbf54cf79c9e62e3acae0ea8421e72616926b"}, - {file = "playwright-1.34.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:462251cda0fcbb273497d357dbe14b11e43ebceb0bac9b892beda041ff209aa9"}, - {file = "playwright-1.34.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:a8ba124ea302596a03a66993cd500484fb255cbc10fe0757fa4d49f974267a80"}, - {file = "playwright-1.34.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf0cb6aac49d24335fe361868aea72b11f276a95e7809f1a5d1c69b4120c46ac"}, - {file = "playwright-1.34.0-py3-none-win32.whl", hash = "sha256:c50fef189d87243cc09ae0feb8e417fbe434359ccbcc863fb19ba06d46d31c33"}, - {file = "playwright-1.34.0-py3-none-win_amd64.whl", hash = "sha256:42e16c930e1e910461f4c551a72fc1b900f37124431bf2b6a6d9ddae70042db4"}, -] - -[package.dependencies] -greenlet = "2.0.2" -pyee = "9.0.4" - -[[package]] -name = "pydantic" -version = "1.10.8" -description = "Data validation and settings management using python type hints" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pydantic-1.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1243d28e9b05003a89d72e7915fdb26ffd1d39bdd39b00b7dbe4afae4b557f9d"}, - {file = "pydantic-1.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0ab53b609c11dfc0c060d94335993cc2b95b2150e25583bec37a49b2d6c6c3f"}, - {file = "pydantic-1.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9613fadad06b4f3bc5db2653ce2f22e0de84a7c6c293909b48f6ed37b83c61f"}, - {file = "pydantic-1.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df7800cb1984d8f6e249351139667a8c50a379009271ee6236138a22a0c0f319"}, - {file = "pydantic-1.10.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0c6fafa0965b539d7aab0a673a046466d23b86e4b0e8019d25fd53f4df62c277"}, - {file = "pydantic-1.10.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e82d4566fcd527eae8b244fa952d99f2ca3172b7e97add0b43e2d97ee77f81ab"}, - {file = "pydantic-1.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:ab523c31e22943713d80d8d342d23b6f6ac4b792a1e54064a8d0cf78fd64e800"}, - {file = "pydantic-1.10.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:666bdf6066bf6dbc107b30d034615d2627e2121506c555f73f90b54a463d1f33"}, - {file = "pydantic-1.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:35db5301b82e8661fa9c505c800d0990bc14e9f36f98932bb1d248c0ac5cada5"}, - {file = "pydantic-1.10.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90c1e29f447557e9e26afb1c4dbf8768a10cc676e3781b6a577841ade126b85"}, - {file = "pydantic-1.10.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93e766b4a8226e0708ef243e843105bf124e21331694367f95f4e3b4a92bbb3f"}, - {file = "pydantic-1.10.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88f195f582851e8db960b4a94c3e3ad25692c1c1539e2552f3df7a9e972ef60e"}, - {file = "pydantic-1.10.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:34d327c81e68a1ecb52fe9c8d50c8a9b3e90d3c8ad991bfc8f953fb477d42fb4"}, - {file = "pydantic-1.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:d532bf00f381bd6bc62cabc7d1372096b75a33bc197a312b03f5838b4fb84edd"}, - {file = "pydantic-1.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d5b8641c24886d764a74ec541d2fc2c7fb19f6da2a4001e6d580ba4a38f7878"}, - {file = "pydantic-1.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1f6cb446470b7ddf86c2e57cd119a24959af2b01e552f60705910663af09a4"}, - {file = "pydantic-1.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c33b60054b2136aef8cf190cd4c52a3daa20b2263917c49adad20eaf381e823b"}, - {file = "pydantic-1.10.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1952526ba40b220b912cdc43c1c32bcf4a58e3f192fa313ee665916b26befb68"}, - {file = "pydantic-1.10.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bb14388ec45a7a0dc429e87def6396f9e73c8c77818c927b6a60706603d5f2ea"}, - {file = "pydantic-1.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:16f8c3e33af1e9bb16c7a91fc7d5fa9fe27298e9f299cff6cb744d89d573d62c"}, - {file = "pydantic-1.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ced8375969673929809d7f36ad322934c35de4af3b5e5b09ec967c21f9f7887"}, - {file = "pydantic-1.10.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93e6bcfccbd831894a6a434b0aeb1947f9e70b7468f274154d03d71fabb1d7c6"}, - {file = "pydantic-1.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:191ba419b605f897ede9892f6c56fb182f40a15d309ef0142212200a10af4c18"}, - {file = "pydantic-1.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:052d8654cb65174d6f9490cc9b9a200083a82cf5c3c5d3985db765757eb3b375"}, - {file = "pydantic-1.10.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ceb6a23bf1ba4b837d0cfe378329ad3f351b5897c8d4914ce95b85fba96da5a1"}, - {file = "pydantic-1.10.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f2e754d5566f050954727c77f094e01793bcb5725b663bf628fa6743a5a9108"}, - {file = "pydantic-1.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:6a82d6cda82258efca32b40040228ecf43a548671cb174a1e81477195ed3ed56"}, - {file = "pydantic-1.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e59417ba8a17265e632af99cc5f35ec309de5980c440c255ab1ca3ae96a3e0e"}, - {file = "pydantic-1.10.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:84d80219c3f8d4cad44575e18404099c76851bc924ce5ab1c4c8bb5e2a2227d0"}, - {file = "pydantic-1.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e4148e635994d57d834be1182a44bdb07dd867fa3c2d1b37002000646cc5459"}, - {file = "pydantic-1.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12f7b0bf8553e310e530e9f3a2f5734c68699f42218bf3568ef49cd9b0e44df4"}, - {file = "pydantic-1.10.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:42aa0c4b5c3025483240a25b09f3c09a189481ddda2ea3a831a9d25f444e03c1"}, - {file = "pydantic-1.10.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17aef11cc1b997f9d574b91909fed40761e13fac438d72b81f902226a69dac01"}, - {file = "pydantic-1.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:66a703d1983c675a6e0fed8953b0971c44dba48a929a2000a493c3772eb61a5a"}, - {file = "pydantic-1.10.8-py3-none-any.whl", hash = "sha256:7456eb22ed9aaa24ff3e7b4757da20d9e5ce2a81018c1b3ebd81a0b88a18f3b2"}, - {file = "pydantic-1.10.8.tar.gz", hash = "sha256:1410275520dfa70effadf4c21811d755e7ef9bb1f1d077a21958153a92c8d9ca"}, -] - -[package.dependencies] -typing-extensions = ">=4.2.0" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pyee" -version = "9.0.4" -description = "A port of node.js's EventEmitter to python." -optional = false -python-versions = "*" -files = [ - {file = "pyee-9.0.4-py2.py3-none-any.whl", hash = "sha256:9f066570130c554e9cc12de5a9d86f57c7ee47fece163bbdaa3e9c933cfbdfa5"}, - {file = "pyee-9.0.4.tar.gz", hash = "sha256:2770c4928abc721f46b705e6a72b0c59480c4a69c9a83ca0b00bb994f1ea4b32"}, -] - -[package.dependencies] -typing-extensions = "*" - -[[package]] -name = "pygments" -version = "2.15.1" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, -] - -[package.extras] -plugins = ["importlib-metadata"] - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -optional = false -python-versions = ">=3.6.8" -files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-dotenv" -version = "1.0.0" -description = "Read key-value pairs from a .env file and set them as environment variables" -optional = false -python-versions = ">=3.8" -files = [ - {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, - {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, -] - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "pyyaml" -version = "6.0" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] - -[[package]] -name = "reactpy" -version = "1.0.0" -description = "Reactive user interfaces with pure Python" -optional = false -python-versions = ">=3.9" -files = [] -develop = false - -[package.dependencies] -anyio = ">=3" -asgiref = ">=3" -colorlog = ">=6" -fastapi = {version = ">=0.63.0", optional = true, markers = "extra == \"fastapi\""} -fastjsonschema = ">=2.14.5" -flask = {version = "*", optional = true, markers = "extra == \"flask\""} -flask-cors = {version = "*", optional = true, markers = "extra == \"flask\""} -flask-sock = {version = "*", optional = true, markers = "extra == \"flask\""} -jsonpatch = ">=1.32" -lxml = ">=4" -markupsafe = {version = ">=1.1.1,<2.1", optional = true, markers = "extra == \"flask\""} -mypy-extensions = ">=0.4.3" -playwright = {version = "*", optional = true, markers = "extra == \"testing\""} -requests = ">=2" -sanic = {version = ">=21", optional = true, markers = "extra == \"sanic\""} -sanic-cors = {version = "*", optional = true, markers = "extra == \"sanic\""} -starlette = {version = ">=0.13.6", optional = true, markers = "extra == \"starlette\""} -tornado = {version = "*", optional = true, markers = "extra == \"tornado\""} -typing-extensions = ">=3.10" -uvicorn = {version = ">=0.19.0", extras = ["standard"], optional = true, markers = "extra == \"fastapi\" or extra == \"sanic\" or extra == \"starlette\""} - -[package.extras] -all = ["reactpy[fastapi,flask,sanic,starlette,testing,tornado]"] -fastapi = ["fastapi (>=0.63.0)", "uvicorn[standard] (>=0.19.0)"] -flask = ["flask", "flask-cors", "flask-sock", "markupsafe (>=1.1.1,<2.1)"] -sanic = ["sanic (>=21)", "sanic-cors", "uvicorn[standard] (>=0.19.0)"] -starlette = ["starlette (>=0.13.6)", "uvicorn[standard] (>=0.19.0)"] -testing = ["playwright"] -tornado = ["tornado"] - -[package.source] -type = "directory" -url = "../src/py/reactpy" - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "sanic" -version = "23.3.0" -description = "A web server and web framework that's written to go fast. Build fast. Run fast." -optional = false -python-versions = ">=3.7" -files = [ - {file = "sanic-23.3.0-py3-none-any.whl", hash = "sha256:7cafbd63da9c6c6d8aeb8cb4304addf8a274352ab812014386c63e55f474fbee"}, - {file = "sanic-23.3.0.tar.gz", hash = "sha256:b80ebc5c38c983cb45ae5ecc7a669a54c823ec1dff297fbd5f817b1e9e9e49af"}, -] - -[package.dependencies] -aiofiles = ">=0.6.0" -html5tagger = ">=1.2.1" -httptools = ">=0.0.10" -multidict = ">=5.0,<7.0" -sanic-routing = ">=22.8.0" -tracerite = ">=1.0.0" -ujson = {version = ">=1.35", markers = "sys_platform != \"win32\" and implementation_name == \"cpython\""} -uvloop = {version = ">=0.15.0", markers = "sys_platform != \"win32\" and implementation_name == \"cpython\""} -websockets = ">=10.0" - -[package.extras] -all = ["bandit", "beautifulsoup4", "black", "chardet (==3.*)", "coverage", "cryptography", "docutils", "enum-tools[sphinx]", "flake8", "isort (>=5.0.0)", "m2r2", "mistune (<2.0.0)", "mypy (>=0.901,<0.910)", "pygments", "pytest (==7.1.*)", "pytest-benchmark", "pytest-sanic", "sanic-testing (>=23.3.0)", "slotscheck (>=0.8.0,<1)", "sphinx (>=2.1.2)", "sphinx-rtd-theme (>=0.4.3)", "towncrier", "tox", "types-ujson", "uvicorn (<0.15.0)"] -dev = ["bandit", "beautifulsoup4", "black", "chardet (==3.*)", "coverage", "cryptography", "docutils", "flake8", "isort (>=5.0.0)", "mypy (>=0.901,<0.910)", "pygments", "pytest (==7.1.*)", "pytest-benchmark", "pytest-sanic", "sanic-testing (>=23.3.0)", "slotscheck (>=0.8.0,<1)", "towncrier", "tox", "types-ujson", "uvicorn (<0.15.0)"] -docs = ["docutils", "enum-tools[sphinx]", "m2r2", "mistune (<2.0.0)", "pygments", "sphinx (>=2.1.2)", "sphinx-rtd-theme (>=0.4.3)"] -ext = ["sanic-ext"] -http3 = ["aioquic"] -test = ["bandit", "beautifulsoup4", "black", "chardet (==3.*)", "coverage", "docutils", "flake8", "isort (>=5.0.0)", "mypy (>=0.901,<0.910)", "pygments", "pytest (==7.1.*)", "pytest-benchmark", "pytest-sanic", "sanic-testing (>=23.3.0)", "slotscheck (>=0.8.0,<1)", "types-ujson", "uvicorn (<0.15.0)"] - -[[package]] -name = "sanic-cors" -version = "2.2.0" -description = "A Sanic extension adding a decorator for CORS support. Based on flask-cors by Cory Dolphin." -optional = false -python-versions = "*" -files = [ - {file = "Sanic-Cors-2.2.0.tar.gz", hash = "sha256:f8d7515da4c8b837871d422c66314c4b5704396a78894b59c50e26aa72a95873"}, - {file = "Sanic_Cors-2.2.0-py2.py3-none-any.whl", hash = "sha256:c3b133ff1f0bb609a53db35f727f5c371dc4ebeb6be4cc2c37c19dd8b9301115"}, -] - -[package.dependencies] -packaging = ">=21.3" -sanic = ">=21.9.3" - -[[package]] -name = "sanic-routing" -version = "22.8.0" -description = "Core routing component for Sanic" -optional = false -python-versions = "*" -files = [ - {file = "sanic-routing-22.8.0.tar.gz", hash = "sha256:305729b4e0bf01f074044a2a315ff401fa7eeffb009eec1d2c81d35e1038ddfc"}, - {file = "sanic_routing-22.8.0-py3-none-any.whl", hash = "sha256:9a928ed9e19a36bc019223be90a5da0ab88cdd76b101e032510b6a7073c017e9"}, -] - -[[package]] -name = "simple-websocket" -version = "0.10.0" -description = "Simple WebSocket server and client for Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "simple-websocket-0.10.0.tar.gz", hash = "sha256:82c0b0b1006d5490f09ff66392394d90dd758285635edad241e093e9a8abd3eb"}, - {file = "simple_websocket-0.10.0-py3-none-any.whl", hash = "sha256:fc1bc56c393a187e7268f8ab99da1a8e8da9b5dfb7769a2f3b8dada00067745b"}, -] - -[package.dependencies] -wsproto = "*" - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sniffio" -version = "1.3.0" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, -] - -[[package]] -name = "snowballstemmer" -version = "2.2.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -optional = false -python-versions = "*" -files = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] - -[[package]] -name = "soupsieve" -version = "2.4.1" -description = "A modern CSS selector implementation for Beautiful Soup." -optional = false -python-versions = ">=3.7" -files = [ - {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, - {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, -] - -[[package]] -name = "sphinx" -version = "4.5.0" -description = "Python documentation generator" -optional = false -python-versions = ">=3.6" -files = [ - {file = "Sphinx-4.5.0-py3-none-any.whl", hash = "sha256:ebf612653238bcc8f4359627a9b7ce44ede6fdd75d9d30f68255c7383d3a6226"}, - {file = "Sphinx-4.5.0.tar.gz", hash = "sha256:7bf8ca9637a4ee15af412d1a1d9689fec70523a68ca9bb9127c2f3eeb344e2e6"}, -] - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = ">=2.0.0" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = ">=1.1.5" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["docutils-stubs", "flake8 (>=3.5.0)", "isort", "mypy (>=0.931)", "types-requests", "types-typed-ast"] -test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] - -[[package]] -name = "sphinx-autobuild" -version = "2021.3.14" -description = "Rebuild Sphinx documentation on changes, with live-reload in the browser." -optional = false -python-versions = ">=3.6" -files = [ - {file = "sphinx-autobuild-2021.3.14.tar.gz", hash = "sha256:de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05"}, - {file = "sphinx_autobuild-2021.3.14-py3-none-any.whl", hash = "sha256:8fe8cbfdb75db04475232f05187c776f46f6e9e04cacf1e49ce81bdac649ccac"}, -] - -[package.dependencies] -colorama = "*" -livereload = "*" -sphinx = "*" - -[package.extras] -test = ["pytest", "pytest-cov"] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.19.1" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sphinx_autodoc_typehints-1.19.1-py3-none-any.whl", hash = "sha256:9be46aeeb1b315eb5df1f3a7cb262149895d16c7d7dcd77b92513c3c3a1e85e6"}, - {file = "sphinx_autodoc_typehints-1.19.1.tar.gz", hash = "sha256:6c841db55e0e9be0483ff3962a2152b60e79306f4288d8c4e7e86ac84486a5ea"}, -] - -[package.dependencies] -Sphinx = ">=4.5" - -[package.extras] -testing = ["covdefaults (>=2.2)", "coverage (>=6.3)", "diff-cover (>=6.4)", "nptyping (>=2.1.2)", "pytest (>=7.1)", "pytest-cov (>=3)", "sphobjinv (>=2)", "typing-extensions (>=4.1)"] -type-comments = ["typed-ast (>=1.5.2)"] - -[[package]] -name = "sphinx-copybutton" -version = "0.5.2" -description = "Add a copy button to each of your code cells." -optional = false -python-versions = ">=3.7" -files = [ - {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, - {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, -] - -[package.dependencies] -sphinx = ">=1.8" - -[package.extras] -code-style = ["pre-commit (==2.12.1)"] -rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"] - -[[package]] -name = "sphinx-design" -version = "0.4.1" -description = "A sphinx extension for designing beautiful, view size responsive web components." -optional = false -python-versions = ">=3.7" -files = [ - {file = "sphinx_design-0.4.1-py3-none-any.whl", hash = "sha256:23bf5705eb31296d4451f68b0222a698a8a84396ffe8378dfd9319ba7ab8efd9"}, - {file = "sphinx_design-0.4.1.tar.gz", hash = "sha256:5b6418ba4a2dc3d83592ea0ff61a52a891fe72195a4c3a18b2fa1c7668ce4708"}, -] - -[package.dependencies] -sphinx = ">=4,<7" - -[package.extras] -code-style = ["pre-commit (>=2.12,<3.0)"] -rtd = ["myst-parser (>=0.18.0,<2)"] -testing = ["myst-parser (>=0.18.0,<2)", "pytest (>=7.1,<8.0)", "pytest-cov", "pytest-regressions"] -theme-furo = ["furo (>=2022.06.04,<2022.07)"] -theme-pydata = ["pydata-sphinx-theme (>=0.9.0,<0.10.0)"] -theme-rtd = ["sphinx-rtd-theme (>=1.0,<2.0)"] -theme-sbt = ["sphinx-book-theme (>=0.3.0,<0.4.0)"] - -[[package]] -name = "sphinx-reredirects" -version = "0.1.2" -description = "Handles redirects for moved pages in Sphinx documentation projects" -optional = false -python-versions = ">=3.5" -files = [ - {file = "sphinx_reredirects-0.1.2-py3-none-any.whl", hash = "sha256:3a22161771aadd448bb608a4fe7277252182a337af53c18372b7104531d71489"}, - {file = "sphinx_reredirects-0.1.2.tar.gz", hash = "sha256:a0e7213304759b01edc22f032f1715a1c61176fc8f167164e7a52b9feec9ac64"}, -] - -[package.dependencies] -sphinx = "*" - -[[package]] -name = "sphinx-resolve-py-references" -version = "0.1.0" -description = "Better python object resolution in Sphinx" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sphinx_resolve_py_references-0.1.0-py2.py3-none-any.whl", hash = "sha256:ccf44a6b62d75c3a568285f4e1815734088c1a7cab7bbb7935bb22fbf0d78bc2"}, - {file = "sphinx_resolve_py_references-0.1.0.tar.gz", hash = "sha256:0f87c06b29ec128964aee2e40d170d1d3c0e5f4955b2618a89ca724f42385372"}, -] - -[package.dependencies] -sphinx = "*" - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.4" -description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -optional = false -python-versions = ">=3.8" -files = [ - {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, - {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, -] - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -optional = false -python-versions = ">=3.5" -files = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.1" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -optional = false -python-versions = ">=3.8" -files = [ - {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, - {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, -] - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["html5lib", "pytest"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -optional = false -python-versions = ">=3.5" -files = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] - -[package.extras] -test = ["flake8", "mypy", "pytest"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -optional = false -python-versions = ">=3.5" -files = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -optional = false -python-versions = ">=3.5" -files = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] - -[package.extras] -lint = ["docutils-stubs", "flake8", "mypy"] -test = ["pytest"] - -[[package]] -name = "sphinxext-opengraph" -version = "0.8.2" -description = "Sphinx Extension to enable OGP support" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sphinxext-opengraph-0.8.2.tar.gz", hash = "sha256:45a693b6704052c426576f0a1f630649c55b4188bc49eb63e9587e24a923db39"}, - {file = "sphinxext_opengraph-0.8.2-py3-none-any.whl", hash = "sha256:6a05bdfe5176d9dd0a1d58a504f17118362ab976631213cd36fb44c4c40544c9"}, -] - -[package.dependencies] -matplotlib = "*" -sphinx = ">=4.0" - -[[package]] -name = "starlette" -version = "0.27.0" -description = "The little ASGI library that shines." -optional = false -python-versions = ">=3.7" -files = [ - {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, - {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, -] - -[package.dependencies] -anyio = ">=3.4.0,<5" -typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} - -[package.extras] -full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] - -[[package]] -name = "tornado" -version = "6.3.2" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -optional = false -python-versions = ">= 3.8" -files = [ - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, - {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, - {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, - {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, -] - -[[package]] -name = "tracerite" -version = "1.1.0" -description = "Human-readable HTML tracebacks for Python exceptions" -optional = false -python-versions = "*" -files = [ - {file = "tracerite-1.1.0-py3-none-any.whl", hash = "sha256:4cccac04db05eeeabda45e72b57199e147fa2f73cf64d89cfd625df321bd2ab6"}, - {file = "tracerite-1.1.0.tar.gz", hash = "sha256:041dab8fd4bb405f73506293ac7438a2d311e5f9044378ba7d9a6540392f9e4b"}, -] - -[package.dependencies] -html5tagger = ">=1.2.1" - -[[package]] -name = "typing-extensions" -version = "4.6.3" -description = "Backported and Experimental Type Hints for Python 3.7+" -optional = false -python-versions = ">=3.7" -files = [ - {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, - {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, -] - -[[package]] -name = "ujson" -version = "5.7.0" -description = "Ultra fast JSON encoder and decoder for Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "ujson-5.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5eba5e69e4361ac3a311cf44fa71bc619361b6e0626768a494771aacd1c2f09b"}, - {file = "ujson-5.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aae4d9e1b4c7b61780f0a006c897a4a1904f862fdab1abb3ea8f45bd11aa58f3"}, - {file = "ujson-5.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2e43ccdba1cb5c6d3448eadf6fc0dae7be6c77e357a3abc968d1b44e265866d"}, - {file = "ujson-5.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54384ce4920a6d35fa9ea8e580bc6d359e3eb961fa7e43f46c78e3ed162d56ff"}, - {file = "ujson-5.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24ad1aa7fc4e4caa41d3d343512ce68e41411fb92adf7f434a4d4b3749dc8f58"}, - {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:afff311e9f065a8f03c3753db7011bae7beb73a66189c7ea5fcb0456b7041ea4"}, - {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e80f0d03e7e8646fc3d79ed2d875cebd4c83846e129737fdc4c2532dbd43d9e"}, - {file = "ujson-5.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:137831d8a0db302fb6828ee21c67ad63ac537bddc4376e1aab1c8573756ee21c"}, - {file = "ujson-5.7.0-cp310-cp310-win32.whl", hash = "sha256:7df3fd35ebc14dafeea031038a99232b32f53fa4c3ecddb8bed132a43eefb8ad"}, - {file = "ujson-5.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:af4639f684f425177d09ae409c07602c4096a6287027469157bfb6f83e01448b"}, - {file = "ujson-5.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b0f2680ce8a70f77f5d70aaf3f013d53e6af6d7058727a35d8ceb4a71cdd4e9"}, - {file = "ujson-5.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a19fd8e7d8cc58a169bea99fed5666023adf707a536d8f7b0a3c51dd498abf"}, - {file = "ujson-5.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6abb8e6d8f1ae72f0ed18287245f5b6d40094e2656d1eab6d99d666361514074"}, - {file = "ujson-5.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8cd622c069368d5074bd93817b31bdb02f8d818e57c29e206f10a1f9c6337dd"}, - {file = "ujson-5.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14f9082669f90e18e64792b3fd0bf19f2b15e7fe467534a35ea4b53f3bf4b755"}, - {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d7ff6ebb43bc81b057724e89550b13c9a30eda0f29c2f506f8b009895438f5a6"}, - {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f7f241488879d91a136b299e0c4ce091996c684a53775e63bb442d1a8e9ae22a"}, - {file = "ujson-5.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5593263a7fcfb934107444bcfba9dde8145b282de0ee9f61e285e59a916dda0f"}, - {file = "ujson-5.7.0-cp311-cp311-win32.whl", hash = "sha256:26c2b32b489c393106e9cb68d0a02e1a7b9d05a07429d875c46b94ee8405bdb7"}, - {file = "ujson-5.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:ed24406454bb5a31df18f0a423ae14beb27b28cdfa34f6268e7ebddf23da807e"}, - {file = "ujson-5.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18679484e3bf9926342b1c43a3bd640f93a9eeeba19ef3d21993af7b0c44785d"}, - {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ee295761e1c6c30400641f0a20d381633d7622633cdf83a194f3c876a0e4b7e"}, - {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b738282e12a05f400b291966630a98d622da0938caa4bc93cf65adb5f4281c60"}, - {file = "ujson-5.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00343501dbaa5172e78ef0e37f9ebd08040110e11c12420ff7c1f9f0332d939e"}, - {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c0d1f7c3908357ee100aa64c4d1cf91edf99c40ac0069422a4fd5fd23b263263"}, - {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a5d2f44331cf04689eafac7a6596c71d6657967c07ac700b0ae1c921178645da"}, - {file = "ujson-5.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:16b2254a77b310f118717715259a196662baa6b1f63b1a642d12ab1ff998c3d7"}, - {file = "ujson-5.7.0-cp37-cp37m-win32.whl", hash = "sha256:6faf46fa100b2b89e4db47206cf8a1ffb41542cdd34dde615b2fc2288954f194"}, - {file = "ujson-5.7.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ff0004c3f5a9a6574689a553d1b7819d1a496b4f005a7451f339dc2d9f4cf98c"}, - {file = "ujson-5.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:75204a1dd7ec6158c8db85a2f14a68d2143503f4bafb9a00b63fe09d35762a5e"}, - {file = "ujson-5.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7312731c7826e6c99cdd3ac503cd9acd300598e7a80bcf41f604fee5f49f566c"}, - {file = "ujson-5.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b9dc5a90e2149643df7f23634fe202fed5ebc787a2a1be95cf23632b4d90651"}, - {file = "ujson-5.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6a6961fc48821d84b1198a09516e396d56551e910d489692126e90bf4887d29"}, - {file = "ujson-5.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b01a9af52a0d5c46b2c68e3f258fdef2eacaa0ce6ae3e9eb97983f5b1166edb6"}, - {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7316d3edeba8a403686cdcad4af737b8415493101e7462a70ff73dd0609eafc"}, - {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ee997799a23227e2319a3f8817ce0b058923dbd31904761b788dc8f53bd3e30"}, - {file = "ujson-5.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dda9aa4c33435147262cd2ea87c6b7a1ca83ba9b3933ff7df34e69fee9fced0c"}, - {file = "ujson-5.7.0-cp38-cp38-win32.whl", hash = "sha256:bea8d30e362180aafecabbdcbe0e1f0b32c9fa9e39c38e4af037b9d3ca36f50c"}, - {file = "ujson-5.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:c96e3b872bf883090ddf32cc41957edf819c5336ab0007d0cf3854e61841726d"}, - {file = "ujson-5.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6411aea4c94a8e93c2baac096fbf697af35ba2b2ed410b8b360b3c0957a952d3"}, - {file = "ujson-5.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d3b3499c55911f70d4e074c626acdb79a56f54262c3c83325ffb210fb03e44d"}, - {file = "ujson-5.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:341f891d45dd3814d31764626c55d7ab3fd21af61fbc99d070e9c10c1190680b"}, - {file = "ujson-5.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f242eec917bafdc3f73a1021617db85f9958df80f267db69c76d766058f7b19"}, - {file = "ujson-5.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3af9f9f22a67a8c9466a32115d9073c72a33ae627b11de6f592df0ee09b98b6"}, - {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a3d794afbf134df3056a813e5c8a935208cddeae975bd4bc0ef7e89c52f0ce0"}, - {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:800bf998e78dae655008dd10b22ca8dc93bdcfcc82f620d754a411592da4bbf2"}, - {file = "ujson-5.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b5ac3d5c5825e30b438ea92845380e812a476d6c2a1872b76026f2e9d8060fc2"}, - {file = "ujson-5.7.0-cp39-cp39-win32.whl", hash = "sha256:cd90027e6d93e8982f7d0d23acf88c896d18deff1903dd96140613389b25c0dd"}, - {file = "ujson-5.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:523ee146cdb2122bbd827f4dcc2a8e66607b3f665186bce9e4f78c9710b6d8ab"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e87cec407ec004cf1b04c0ed7219a68c12860123dfb8902ef880d3d87a71c172"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bab10165db6a7994e67001733f7f2caf3400b3e11538409d8756bc9b1c64f7e8"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b522be14a28e6ac1cf818599aeff1004a28b42df4ed4d7bc819887b9dac915fc"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7592f40175c723c032cdbe9fe5165b3b5903604f774ab0849363386e99e1f253"}, - {file = "ujson-5.7.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ed22f9665327a981f288a4f758a432824dc0314e4195a0eaeb0da56a477da94d"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:adf445a49d9a97a5a4c9bb1d652a1528de09dd1c48b29f79f3d66cea9f826bf6"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64772a53f3c4b6122ed930ae145184ebaed38534c60f3d859d8c3f00911eb122"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35209cb2c13fcb9d76d249286105b4897b75a5e7f0efb0c0f4b90f222ce48910"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90712dfc775b2c7a07d4d8e059dd58636bd6ff1776d79857776152e693bddea6"}, - {file = "ujson-5.7.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0e4e8981c6e7e9e637e637ad8ffe948a09e5434bc5f52ecbb82b4b4cfc092bfb"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:581c945b811a3d67c27566539bfcb9705ea09cb27c4be0002f7a553c8886b817"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d36a807a24c7d44f71686685ae6fbc8793d784bca1adf4c89f5f780b835b6243"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b4257307e3662aa65e2644a277ca68783c5d51190ed9c49efebdd3cbfd5fa44"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea7423d8a2f9e160c5e011119741682414c5b8dce4ae56590a966316a07a4618"}, - {file = "ujson-5.7.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c592eb91a5968058a561d358d0fef59099ed152cfb3e1cd14eee51a7a93879e"}, - {file = "ujson-5.7.0.tar.gz", hash = "sha256:e788e5d5dcae8f6118ac9b45d0b891a0d55f7ac480eddcb7f07263f2bcf37b23"}, -] - -[[package]] -name = "urllib3" -version = "2.0.2" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.7" -files = [ - {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, - {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "uvicorn" -version = "0.22.0" -description = "The lightning-fast ASGI server." -optional = false -python-versions = ">=3.7" -files = [ - {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, - {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, -] - -[package.dependencies] -click = ">=7.0" -colorama = {version = ">=0.4", optional = true, markers = "sys_platform == \"win32\" and extra == \"standard\""} -h11 = ">=0.8" -httptools = {version = ">=0.5.0", optional = true, markers = "extra == \"standard\""} -python-dotenv = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} -pyyaml = {version = ">=5.1", optional = true, markers = "extra == \"standard\""} -uvloop = {version = ">=0.14.0,<0.15.0 || >0.15.0,<0.15.1 || >0.15.1", optional = true, markers = "(sys_platform != \"win32\" and sys_platform != \"cygwin\") and platform_python_implementation != \"PyPy\" and extra == \"standard\""} -watchfiles = {version = ">=0.13", optional = true, markers = "extra == \"standard\""} -websockets = {version = ">=10.4", optional = true, markers = "extra == \"standard\""} - -[package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] - -[[package]] -name = "uvloop" -version = "0.17.0" -description = "Fast implementation of asyncio event loop on top of libuv" -optional = false -python-versions = ">=3.7" -files = [ - {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718"}, - {file = "uvloop-0.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c"}, - {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d"}, - {file = "uvloop-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024"}, - {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa"}, - {file = "uvloop-0.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811"}, - {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c"}, - {file = "uvloop-0.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e"}, - {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539"}, - {file = "uvloop-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4"}, - {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05"}, - {file = "uvloop-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376"}, - {file = "uvloop-0.17.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b"}, - {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8"}, - {file = "uvloop-0.17.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62"}, - {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d"}, - {file = "uvloop-0.17.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667"}, - {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738"}, - {file = "uvloop-0.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20"}, - {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f"}, - {file = "uvloop-0.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595"}, - {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578"}, - {file = "uvloop-0.17.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474"}, - {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b"}, - {file = "uvloop-0.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c"}, - {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8"}, - {file = "uvloop-0.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c"}, - {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9"}, - {file = "uvloop-0.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded"}, - {file = "uvloop-0.17.0.tar.gz", hash = "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1"}, -] - -[package.extras] -dev = ["Cython (>=0.29.32,<0.30.0)", "Sphinx (>=4.1.2,<4.2.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)", "pytest (>=3.6.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -test = ["Cython (>=0.29.32,<0.30.0)", "aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=22.0.0,<22.1.0)", "pycodestyle (>=2.7.0,<2.8.0)"] - -[[package]] -name = "watchfiles" -version = "0.19.0" -description = "Simple, modern and high performance file watching and code reload in python." -optional = false -python-versions = ">=3.7" -files = [ - {file = "watchfiles-0.19.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:91633e64712df3051ca454ca7d1b976baf842d7a3640b87622b323c55f3345e7"}, - {file = "watchfiles-0.19.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b6577b8c6c8701ba8642ea9335a129836347894b666dd1ec2226830e263909d3"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:18b28f6ad871b82df9542ff958d0c86bb0d8310bb09eb8e87d97318a3b5273af"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac19dc9cbc34052394dbe81e149411a62e71999c0a19e1e09ce537867f95ae0"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09ea3397aecbc81c19ed7f025e051a7387feefdb789cf768ff994c1228182fda"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c0376deac92377817e4fb8f347bf559b7d44ff556d9bc6f6208dd3f79f104aaf"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c75eff897786ee262c9f17a48886f4e98e6cfd335e011c591c305e5d083c056"}, - {file = "watchfiles-0.19.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb5d45c4143c1dd60f98a16187fd123eda7248f84ef22244818c18d531a249d1"}, - {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:79c533ff593db861ae23436541f481ec896ee3da4e5db8962429b441bbaae16e"}, - {file = "watchfiles-0.19.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:3d7d267d27aceeeaa3de0dd161a0d64f0a282264d592e335fff7958cc0cbae7c"}, - {file = "watchfiles-0.19.0-cp37-abi3-win32.whl", hash = "sha256:176a9a7641ec2c97b24455135d58012a5be5c6217fc4d5fef0b2b9f75dbf5154"}, - {file = "watchfiles-0.19.0-cp37-abi3-win_amd64.whl", hash = "sha256:945be0baa3e2440151eb3718fd8846751e8b51d8de7b884c90b17d271d34cae8"}, - {file = "watchfiles-0.19.0-cp37-abi3-win_arm64.whl", hash = "sha256:0089c6dc24d436b373c3c57657bf4f9a453b13767150d17284fc6162b2791911"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cae3dde0b4b2078f31527acff6f486e23abed307ba4d3932466ba7cdd5ecec79"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f3920b1285a7d3ce898e303d84791b7bf40d57b7695ad549dc04e6a44c9f120"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9afd0d69429172c796164fd7fe8e821ade9be983f51c659a38da3faaaaac44dc"}, - {file = "watchfiles-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68dce92b29575dda0f8d30c11742a8e2b9b8ec768ae414b54f7453f27bdf9545"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5569fc7f967429d4bc87e355cdfdcee6aabe4b620801e2cf5805ea245c06097c"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5471582658ea56fca122c0f0d0116a36807c63fefd6fdc92c71ca9a4491b6b48"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b538014a87f94d92f98f34d3e6d2635478e6be6423a9ea53e4dd96210065e193"}, - {file = "watchfiles-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20b44221764955b1e703f012c74015306fb7e79a00c15370785f309b1ed9aa8d"}, - {file = "watchfiles-0.19.0.tar.gz", hash = "sha256:d9b073073e048081e502b6c6b0b88714c026a1a4c890569238d04aca5f9ca74b"}, -] - -[package.dependencies] -anyio = ">=3.0.0" - -[[package]] -name = "websockets" -version = "11.0.3" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, - {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, - {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, - {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, - {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, - {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, - {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, - {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, - {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, - {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, - {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, - {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, - {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, - {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, -] - -[[package]] -name = "werkzeug" -version = "2.1.2" -description = "The comprehensive WSGI web application library." -optional = false -python-versions = ">=3.7" -files = [ - {file = "Werkzeug-2.1.2-py3-none-any.whl", hash = "sha256:72a4b735692dd3135217911cbeaa1be5fa3f62bffb8745c5215420a03dc55255"}, - {file = "Werkzeug-2.1.2.tar.gz", hash = "sha256:1ce08e8093ed67d638d63879fd1ba3735817f7a80de3674d293f5984f25fb6e6"}, -] - -[package.extras] -watchdog = ["watchdog"] - -[[package]] -name = "wsproto" -version = "1.2.0" -description = "WebSockets state-machine based protocol implementation" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, - {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, -] - -[package.dependencies] -h11 = ">=0.9.0,<1" - -[[package]] -name = "zipp" -version = "3.15.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.7" -files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[metadata] -lock-version = "2.0" -python-versions = "^3.9" -content-hash = "629118cfac10f1dab4c39c6ccd50bd69ca68a7fc05dd2baf1d020082d6b19e4e" diff --git a/docs/pyproject.toml b/docs/pyproject.toml deleted file mode 100644 index d2f47c577..000000000 --- a/docs/pyproject.toml +++ /dev/null @@ -1,23 +0,0 @@ -[tool.poetry] -name = "docs" -version = "0.0.0" -description = "docs" -authors = ["rmorshea <ryan.morshead@gmail.com>"] -readme = "README.md" - -[tool.poetry.dependencies] -python = "^3.9" -reactpy = { path = "../src/py/reactpy", extras = ["starlette", "sanic", "fastapi", "flask", "tornado", "testing"], develop = false } -furo = "2022.04.07" -sphinx = "*" -sphinx-autodoc-typehints = "*" -sphinx-copybutton = "*" -sphinx-autobuild = "*" -sphinx-reredirects = "*" -sphinx-design = "*" -sphinx-resolve-py-references = "*" -sphinxext-opengraph = "*" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 000000000..9ae8fcf17 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,8 @@ +mkdocs +mkdocs-git-revision-date-localized-plugin +mkdocs-material +mkdocs-include-markdown-plugin +linkcheckmd +mkdocs-spellcheck[all] +mkdocs-git-authors-plugin +mkdocs-minify-plugin diff --git a/docs/source/_custom_js/README.md b/docs/source/_custom_js/README.md deleted file mode 100644 index 4d5d75dc2..000000000 --- a/docs/source/_custom_js/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Custom Javascript for ReactPy's Docs - -Build the javascript with - -``` -npm run build -``` - -This will drop a javascript bundle into `../_static/custom.js` diff --git a/docs/source/_custom_js/package-lock.json b/docs/source/_custom_js/package-lock.json deleted file mode 100644 index 98cbb7014..000000000 --- a/docs/source/_custom_js/package-lock.json +++ /dev/null @@ -1,766 +0,0 @@ -{ - "name": "reactpy-docs-example-loader", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "reactpy-docs-example-loader", - "version": "1.0.0", - "dependencies": { - "@reactpy/client": "file:../../../src/js/packages/@reactpy/client" - }, - "devDependencies": { - "@rollup/plugin-commonjs": "^21.0.1", - "@rollup/plugin-node-resolve": "^13.1.1", - "@rollup/plugin-replace": "^3.0.0", - "prettier": "^2.2.1", - "rollup": "^2.35.1" - } - }, - "../../../src/client/packages/@reactpy/client": { - "version": "0.3.1", - "integrity": "sha512-pIK5eNwFSHKXg7ClpASWFVKyZDYxz59MSFpVaX/OqJFkrJaAxBuhKGXNTMXmuyWOL5Iyvb/ErwwDRxQRzMNkfQ==", - "extraneous": true, - "license": "MIT", - "dependencies": { - "event-to-object": "^0.1.2", - "json-pointer": "^0.6.2" - }, - "devDependencies": { - "@types/json-pointer": "^1.0.31", - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "typescript": "^4.9.5" - }, - "peerDependencies": { - "react": ">=16 <18", - "react-dom": ">=16 <18" - } - }, - "../../../src/client/packages/client": { - "name": "@reactpy/client", - "version": "0.2.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "event-to-object": "^0.1.0", - "json-pointer": "^0.6.2" - }, - "devDependencies": { - "@types/json-pointer": "^1.0.31", - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "prettier": "^3.0.0-alpha.6", - "typescript": "^4.9.5" - }, - "peerDependencies": { - "react": ">=16 <18", - "react-dom": ">=16 <18" - } - }, - "../../../src/js/packages/@reactpy/client": { - "version": "0.3.1", - "license": "MIT", - "dependencies": { - "event-to-object": "^0.1.2", - "json-pointer": "^0.6.2" - }, - "devDependencies": { - "@types/json-pointer": "^1.0.31", - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "typescript": "^4.9.5" - }, - "peerDependencies": { - "react": ">=16 <18", - "react-dom": ">=16 <18" - } - }, - "node_modules/@reactpy/client": { - "resolved": "../../../src/js/packages/@reactpy/client", - "link": true - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.1.tgz", - "integrity": "sha512-EA+g22lbNJ8p5kuZJUYyhhDK7WgJckW5g4pNN7n4mAFUM96VuwUnNT3xr2Db2iCZPI1pJPbGyfT5mS9T1dHfMg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "commondir": "^1.0.1", - "estree-walker": "^2.0.1", - "glob": "^7.1.6", - "is-reference": "^1.2.1", - "magic-string": "^0.25.7", - "resolve": "^1.17.0" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^2.38.3" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.1.tgz", - "integrity": "sha512-6QKtRevXLrmEig9UiMYt2fSvee9TyltGRfw+qSs6xjUnxwjOzTOqy+/Lpxsgjb8mJn1EQNbCDAvt89O4uzL5kw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^2.42.0" - } - }, - "node_modules/@rollup/plugin-node-resolve/node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-3.0.0.tgz", - "integrity": "sha512-3c7JCbMuYXM4PbPWT4+m/4Y6U60SgsnDT/cCyAyUKwFHg7pTSfsSQzIpETha3a3ig6OdOKzZz87D9ZXIK3qsDg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "node_modules/@types/estree": { - "version": "0.0.48", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz", - "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==", - "dev": true - }, - "node_modules/@types/node": { - "version": "15.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", - "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.4" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prettier": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", - "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/rollup": { - "version": "2.52.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.52.1.tgz", - "integrity": "sha512-/SPqz8UGnp4P1hq6wc9gdTqA2bXQXGx13TtoL03GBm6qGRI6Hm3p4Io7GeiHNLl0BsQAne1JNYY+q/apcY933w==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - }, - "dependencies": { - "@reactpy/client": { - "version": "file:../../../src/js/packages/@reactpy/client", - "requires": { - "@types/json-pointer": "^1.0.31", - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "event-to-object": "^0.1.2", - "json-pointer": "^0.6.2", - "typescript": "^4.9.5" - } - }, - "@rollup/plugin-commonjs": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.0.1.tgz", - "integrity": "sha512-EA+g22lbNJ8p5kuZJUYyhhDK7WgJckW5g4pNN7n4mAFUM96VuwUnNT3xr2Db2iCZPI1pJPbGyfT5mS9T1dHfMg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "commondir": "^1.0.1", - "estree-walker": "^2.0.1", - "glob": "^7.1.6", - "is-reference": "^1.2.1", - "magic-string": "^0.25.7", - "resolve": "^1.17.0" - }, - "dependencies": { - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - } - } - }, - "@rollup/plugin-node-resolve": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.1.tgz", - "integrity": "sha512-6QKtRevXLrmEig9UiMYt2fSvee9TyltGRfw+qSs6xjUnxwjOzTOqy+/Lpxsgjb8mJn1EQNbCDAvt89O4uzL5kw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "dependencies": { - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "requires": { - "@types/node": "*" - } - } - } - }, - "@rollup/plugin-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-3.0.0.tgz", - "integrity": "sha512-3c7JCbMuYXM4PbPWT4+m/4Y6U60SgsnDT/cCyAyUKwFHg7pTSfsSQzIpETha3a3ig6OdOKzZz87D9ZXIK3qsDg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - } - } - }, - "@types/estree": { - "version": "0.0.48", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.48.tgz", - "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==", - "dev": true - }, - "@types/node": { - "version": "15.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", - "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "prettier": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", - "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "rollup": { - "version": "2.52.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.52.1.tgz", - "integrity": "sha512-/SPqz8UGnp4P1hq6wc9gdTqA2bXQXGx13TtoL03GBm6qGRI6Hm3p4Io7GeiHNLl0BsQAne1JNYY+q/apcY933w==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } -} diff --git a/docs/source/_custom_js/package.json b/docs/source/_custom_js/package.json deleted file mode 100644 index 78d72b961..000000000 --- a/docs/source/_custom_js/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "reactpy-docs-example-loader", - "version": "1.0.0", - "description": "simple javascript client for ReactPy's documentation", - "main": "index.js", - "scripts": { - "build": "rollup --config", - "format": "prettier --ignore-path .gitignore --write ." - }, - "devDependencies": { - "@rollup/plugin-commonjs": "^21.0.1", - "@rollup/plugin-node-resolve": "^13.1.1", - "@rollup/plugin-replace": "^3.0.0", - "prettier": "^2.2.1", - "rollup": "^2.35.1" - }, - "dependencies": { - "@reactpy/client": "file:../../../src/js/packages/@reactpy/client" - } -} diff --git a/docs/source/_custom_js/rollup.config.js b/docs/source/_custom_js/rollup.config.js deleted file mode 100644 index 48dd535cf..000000000 --- a/docs/source/_custom_js/rollup.config.js +++ /dev/null @@ -1,26 +0,0 @@ -import resolve from "@rollup/plugin-node-resolve"; -import commonjs from "@rollup/plugin-commonjs"; -import replace from "@rollup/plugin-replace"; - -export default { - input: "src/index.js", - output: { - file: "../_static/custom.js", - format: "esm", - }, - plugins: [ - resolve(), - commonjs(), - replace({ - "process.env.NODE_ENV": JSON.stringify("production"), - preventAssignment: true, - }), - ], - onwarn: function (warning) { - if (warning.code === "THIS_IS_UNDEFINED") { - // skip warning where `this` is undefined at the top level of a module - return; - } - console.warn(warning.message); - }, -}; diff --git a/docs/source/_custom_js/src/index.js b/docs/source/_custom_js/src/index.js deleted file mode 100644 index 505adedd0..000000000 --- a/docs/source/_custom_js/src/index.js +++ /dev/null @@ -1,94 +0,0 @@ -import { SimpleReactPyClient, mount } from "@reactpy/client"; - -let didMountDebug = false; - -export function mountWidgetExample( - mountID, - viewID, - reactpyServerHost, - useActivateButton, -) { - let reactpyHost, reactpyPort; - if (reactpyServerHost) { - [reactpyHost, reactpyPort] = reactpyServerHost.split(":", 2); - } else { - reactpyHost = window.location.hostname; - reactpyPort = window.location.port; - } - - const client = new SimpleReactPyClient({ - serverLocation: { - url: `${window.location.protocol}//${reactpyHost}:${reactpyPort}`, - route: "/", - query: `?view_id=${viewID}`, - }, - }); - - const mountEl = document.getElementById(mountID); - let isMounted = false; - triggerIfInViewport(mountEl, () => { - if (!isMounted) { - activateView(mountEl, client, useActivateButton); - isMounted = true; - } - }); -} - -function activateView(mountEl, client, useActivateButton) { - if (!useActivateButton) { - mount(mountEl, client); - return; - } - - const enableWidgetButton = document.createElement("button"); - enableWidgetButton.appendChild(document.createTextNode("Activate")); - enableWidgetButton.setAttribute("class", "enable-widget-button"); - - enableWidgetButton.addEventListener("click", () => - fadeOutElementThenCallback(enableWidgetButton, () => { - { - mountEl.removeChild(enableWidgetButton); - mountEl.setAttribute("class", "interactive widget-container"); - mountWithLayoutServer(mountEl, serverInfo); - } - }), - ); - - function fadeOutElementThenCallback(element, callback) { - { - var op = 1; // initial opacity - var timer = setInterval(function () { - { - if (op < 0.001) { - { - clearInterval(timer); - element.style.display = "none"; - callback(); - } - } - element.style.opacity = op; - element.style.filter = "alpha(opacity=" + op * 100 + ")"; - op -= op * 0.5; - } - }, 50); - } - } - - mountEl.appendChild(enableWidgetButton); -} - -function triggerIfInViewport(element, callback) { - const observer = new window.IntersectionObserver( - ([entry]) => { - if (entry.isIntersecting) { - callback(); - } - }, - { - root: null, - threshold: 0.1, // set offset 0.1 means trigger if at least 10% of element in viewport - }, - ); - - observer.observe(element); -} diff --git a/docs/source/_exts/async_doctest.py b/docs/source/_exts/async_doctest.py deleted file mode 100644 index 96024d488..000000000 --- a/docs/source/_exts/async_doctest.py +++ /dev/null @@ -1,47 +0,0 @@ -from doctest import DocTest, DocTestRunner -from textwrap import indent -from typing import Any - -from sphinx.application import Sphinx -from sphinx.ext.doctest import DocTestBuilder -from sphinx.ext.doctest import setup as doctest_setup - -test_template = """ -import asyncio as __test_template_asyncio - -async def __test_template__main(): - - {test} - - globals().update(locals()) - -__test_template_asyncio.run(__test_template__main()) -""" - - -class TestRunnerWrapper: - def __init__(self, runner: DocTestRunner): - self._runner = runner - - def __getattr__(self, name: str) -> Any: - return getattr(self._runner, name) - - def run(self, test: DocTest, *args: Any, **kwargs: Any) -> Any: - for ex in test.examples: - ex.source = test_template.format(test=indent(ex.source, " ").strip()) - return self._runner.run(test, *args, **kwargs) - - -class AsyncDoctestBuilder(DocTestBuilder): - @property - def test_runner(self) -> DocTestRunner: - return self._test_runner - - @test_runner.setter - def test_runner(self, value: DocTestRunner) -> None: - self._test_runner = TestRunnerWrapper(value) - - -def setup(app: Sphinx) -> None: - doctest_setup(app) - app.add_builder(AsyncDoctestBuilder, override=True) diff --git a/docs/source/_exts/autogen_api_docs.py b/docs/source/_exts/autogen_api_docs.py deleted file mode 100644 index b95d85a99..000000000 --- a/docs/source/_exts/autogen_api_docs.py +++ /dev/null @@ -1,146 +0,0 @@ -from __future__ import annotations - -import sys -from collections.abc import Collection, Iterator -from pathlib import Path - -from sphinx.application import Sphinx - -HERE = Path(__file__).parent -SRC = HERE.parent.parent.parent / "src" -PYTHON_PACKAGE = SRC / "py" / "reactpy" / "reactpy" - -AUTO_DIR = HERE.parent / "_auto" -AUTO_DIR.mkdir(exist_ok=True) - -API_FILE = AUTO_DIR / "apis.rst" - -# All valid RST section symbols - it shouldn't be realistically possible to exhaust them -SECTION_SYMBOLS = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~""" - -AUTODOC_TEMPLATE_WITH_MEMBERS = """\ -.. automodule:: {module} - :members: - :ignore-module-all: -""" - -AUTODOC_TEMPLATE_WITHOUT_MEMBERS = """\ -.. automodule:: {module} - :ignore-module-all: -""" - -TITLE = """\ -========== -Python API -========== -""" - - -def generate_api_docs(): - content = [TITLE] - - for file in walk_python_files(PYTHON_PACKAGE, ignore_dirs={"__pycache__"}): - if file.name == "__init__.py": - if file.parent != PYTHON_PACKAGE: - content.append(make_package_section(file)) - else: - content.append(make_module_section(file)) - - API_FILE.write_text("\n".join(content)) - - -def make_package_section(file: Path) -> str: - parent_dir = file.parent - symbol = get_section_symbol(parent_dir) - section_name = f"``{parent_dir.name}``" - module_name = get_module_name(parent_dir) - return ( - section_name - + "\n" - + (symbol * len(section_name)) - + "\n" - + AUTODOC_TEMPLATE_WITHOUT_MEMBERS.format(module=module_name) - ) - - -def make_module_section(file: Path) -> str: - symbol = get_section_symbol(file) - section_name = f"``{file.stem}``" - module_name = get_module_name(file) - return ( - section_name - + "\n" - + (symbol * len(section_name)) - + "\n" - + AUTODOC_TEMPLATE_WITH_MEMBERS.format(module=module_name) - ) - - -def get_module_name(path: Path) -> str: - return ".".join(path.with_suffix("").relative_to(PYTHON_PACKAGE.parent).parts) - - -def get_section_symbol(path: Path) -> str: - rel_path = path.relative_to(PYTHON_PACKAGE) - rel_path_parts = rel_path.parts - if len(rel_path_parts) > len(SECTION_SYMBOLS): - msg = f"package structure is too deep - ran out of section symbols: {rel_path}" - raise RuntimeError(msg) - return SECTION_SYMBOLS[len(rel_path_parts) - 1] - - -def walk_python_files(root: Path, ignore_dirs: Collection[str]) -> Iterator[Path]: - """Iterate over Python files - - We yield in a particular order to get the correction title section structure. Given - a directory structure of the form:: - - project/ - __init__.py - /package - __init__.py - module_a.py - module_b.py - - We yield the files in this order:: - - project/__init__.py - project/package/__init__.py - project/package/module_a.py - project/module_b.py - - In this way we generate the section titles in the appropriate order:: - - project - ======= - - project.package - --------------- - - project.package.module_a - ------------------------ - - """ - for path in sorted( - root.iterdir(), - key=lambda path: ( - # __init__.py files first - int(not path.name == "__init__.py"), - # then directories - int(not path.is_dir()), - # sort by file name last - path.name, - ), - ): - if path.is_dir(): - if (path / "__init__.py").exists() and path.name not in ignore_dirs: - yield from walk_python_files(path, ignore_dirs) - elif path.suffix == ".py": - yield path - - -def setup(app: Sphinx) -> None: - if sys.platform == "win32" and sys.version_info[:2] == (3, 7): - return None - generate_api_docs() - return None diff --git a/docs/source/_exts/build_custom_js.py b/docs/source/_exts/build_custom_js.py deleted file mode 100644 index 97857ba74..000000000 --- a/docs/source/_exts/build_custom_js.py +++ /dev/null @@ -1,12 +0,0 @@ -import subprocess -from pathlib import Path - -from sphinx.application import Sphinx - -SOURCE_DIR = Path(__file__).parent.parent -CUSTOM_JS_DIR = SOURCE_DIR / "_custom_js" - - -def setup(app: Sphinx) -> None: - subprocess.run("npm install", cwd=CUSTOM_JS_DIR, shell=True) # noqa S607 - subprocess.run("npm run build", cwd=CUSTOM_JS_DIR, shell=True) # noqa S607 diff --git a/docs/source/_exts/copy_vdom_json_schema.py b/docs/source/_exts/copy_vdom_json_schema.py deleted file mode 100644 index 38fc171ac..000000000 --- a/docs/source/_exts/copy_vdom_json_schema.py +++ /dev/null @@ -1,17 +0,0 @@ -import json -from pathlib import Path - -from sphinx.application import Sphinx - -from reactpy.core.vdom import VDOM_JSON_SCHEMA - - -def setup(app: Sphinx) -> None: - schema_file = Path(__file__).parent.parent / "vdom-json-schema.json" - current_schema = json.dumps(VDOM_JSON_SCHEMA, indent=2, sort_keys=True) - - # We need to make this check because the autoreload system for the docs checks - # to see if the file has changed to determine whether to re-build. Thus we should - # only write to the file if its contents will be different. - if not schema_file.exists() or schema_file.read_text() != current_schema: - schema_file.write_text(current_schema) diff --git a/docs/source/_exts/custom_autosectionlabel.py b/docs/source/_exts/custom_autosectionlabel.py deleted file mode 100644 index 92ff5e2df..000000000 --- a/docs/source/_exts/custom_autosectionlabel.py +++ /dev/null @@ -1,80 +0,0 @@ -"""Mostly copied from sphinx.ext.autosectionlabel - -See Sphinx BSD license: -https://github.com/sphinx-doc/sphinx/blob/f9968594206e538f13fa1c27c065027f10d4ea27/LICENSE -""" - -from __future__ import annotations - -from fnmatch import fnmatch -from typing import Any, cast - -from docutils import nodes -from docutils.nodes import Node -from sphinx.application import Sphinx -from sphinx.domains.std import StandardDomain -from sphinx.locale import __ -from sphinx.util import logging -from sphinx.util.nodes import clean_astext - -logger = logging.getLogger(__name__) - - -def get_node_depth(node: Node) -> int: - i = 0 - cur_node = node - while cur_node.parent != node.document: - cur_node = cur_node.parent - i += 1 - return i - - -def register_sections_as_label(app: Sphinx, document: Node) -> None: - docname = app.env.docname - - for pattern in app.config.autosectionlabel_skip_docs: - if fnmatch(docname, pattern): - return None - - domain = cast(StandardDomain, app.env.get_domain("std")) - for node in document.traverse(nodes.section): - if ( - app.config.autosectionlabel_maxdepth - and get_node_depth(node) >= app.config.autosectionlabel_maxdepth - ): - continue - labelid = node["ids"][0] - - title = cast(nodes.title, node[0]) - ref_name = getattr(title, "rawsource", title.astext()) - if app.config.autosectionlabel_prefix_document: - name = nodes.fully_normalize_name(docname + ":" + ref_name) - else: - name = nodes.fully_normalize_name(ref_name) - sectname = clean_astext(title) - - if name in domain.labels: - logger.warning( - __("duplicate label %s, other instance in %s"), - name, - app.env.doc2path(domain.labels[name][0]), - location=node, - type="autosectionlabel", - subtype=docname, - ) - - domain.anonlabels[name] = docname, labelid - domain.labels[name] = docname, labelid, sectname - - -def setup(app: Sphinx) -> dict[str, Any]: - app.add_config_value("autosectionlabel_prefix_document", False, "env") - app.add_config_value("autosectionlabel_maxdepth", None, "env") - app.add_config_value("autosectionlabel_skip_docs", [], "env") - app.connect("doctree-read", register_sections_as_label) - - return { - "version": "builtin", - "parallel_read_safe": True, - "parallel_write_safe": True, - } diff --git a/docs/source/_exts/patched_html_translator.py b/docs/source/_exts/patched_html_translator.py deleted file mode 100644 index e2f8ed9a4..000000000 --- a/docs/source/_exts/patched_html_translator.py +++ /dev/null @@ -1,24 +0,0 @@ -from sphinx.util.docutils import is_html5_writer_available -from sphinx.writers.html import HTMLTranslator -from sphinx.writers.html5 import HTML5Translator - - -class PatchedHTMLTranslator( - HTML5Translator if is_html5_writer_available() else HTMLTranslator -): - def starttag(self, node, tagname, *args, **attrs): - if ( - tagname == "a" - and "target" not in attrs - and ( - "external" in attrs.get("class", "") - or "external" in attrs.get("classes", []) - ) - ): - attrs["target"] = "_blank" - attrs["ref"] = "noopener noreferrer" - return super().starttag(node, tagname, *args, **attrs) - - -def setup(app): - app.set_translator("html", PatchedHTMLTranslator) diff --git a/docs/source/_exts/reactpy_example.py b/docs/source/_exts/reactpy_example.py deleted file mode 100644 index c6b054c07..000000000 --- a/docs/source/_exts/reactpy_example.py +++ /dev/null @@ -1,180 +0,0 @@ -from __future__ import annotations - -import re -from pathlib import Path -from typing import Any - -from docs_app.examples import ( - SOURCE_DIR, - get_example_files_by_name, - get_normalized_example_name, -) -from docutils.parsers.rst import directives -from docutils.statemachine import StringList -from sphinx.application import Sphinx -from sphinx.util.docutils import SphinxDirective -from sphinx_design.tabs import TabSetDirective - - -class WidgetExample(SphinxDirective): - has_content = False - required_arguments = 1 - _next_id = 0 - - option_spec = { - "result-is-default-tab": directives.flag, - "activate-button": directives.flag, - } - - def run(self): - example_name = get_normalized_example_name( - self.arguments[0], - # only used if example name starts with "/" - self.get_source_info()[0], - ) - - show_linenos = "linenos" in self.options - live_example_is_default_tab = "result-is-default-tab" in self.options - activate_result = "activate-button" not in self.options - - ex_files = get_example_files_by_name(example_name) - if not ex_files: - src_file, line_num = self.get_source_info() - msg = f"Missing example named {example_name!r} referenced by document {src_file}:{line_num}" - raise ValueError(msg) - - labeled_tab_items: list[tuple[str, Any]] = [] - if len(ex_files) == 1: - labeled_tab_items.append( - ( - "main.py", - _literal_include( - path=ex_files[0], - linenos=show_linenos, - ), - ) - ) - else: - for path in sorted( - ex_files, key=lambda p: "" if p.name == "main.py" else p.name - ): - labeled_tab_items.append( - ( - path.name, - _literal_include( - path=path, - linenos=show_linenos, - ), - ) - ) - - result_tab_item = ( - "🚀 result", - _interactive_widget( - name=example_name, - with_activate_button=not activate_result, - ), - ) - if live_example_is_default_tab: - labeled_tab_items.insert(0, result_tab_item) - else: - labeled_tab_items.append(result_tab_item) - - return TabSetDirective( - "WidgetExample", - [], - {}, - _make_tab_items(labeled_tab_items), - self.lineno - 2, - self.content_offset, - "", - self.state, - self.state_machine, - ).run() - - -def _make_tab_items(labeled_content_tuples): - tab_items = "" - for label, content in labeled_content_tuples: - tab_items += _tab_item_template.format( - label=label, - content=content.replace("\n", "\n "), - ) - return _string_to_nested_lines(tab_items) - - -def _literal_include(path: Path, linenos: bool): - try: - language = { - ".py": "python", - ".js": "javascript", - ".json": "json", - }[path.suffix] - except KeyError: - msg = f"Unknown extension type {path.suffix!r}" - raise ValueError(msg) from None - - return _literal_include_template.format( - name=str(path.relative_to(SOURCE_DIR)), - language=language, - options=_join_options(_get_file_options(path)), - ) - - -def _join_options(option_strings: list[str]) -> str: - return "\n ".join(option_strings) - - -OPTION_PATTERN = re.compile(r"#\s:[\w-]+:.*") - - -def _get_file_options(file: Path) -> list[str]: - options = [] - - for line in file.read_text().split("\n"): - if not line.strip(): - continue - if not line.startswith("#"): - break - if not OPTION_PATTERN.match(line): - continue - option_string = line[1:].strip() - if option_string: - options.append(option_string) - - return options - - -def _interactive_widget(name, with_activate_button): - return _interactive_widget_template.format( - name=name, - activate_button_opt=":activate-button:" if with_activate_button else "", - ) - - -_tab_item_template = """ -.. tab-item:: {label} - - {content} -""" - - -_interactive_widget_template = """ -.. reactpy-view:: {name} - {activate_button_opt} -""" - - -_literal_include_template = """ -.. literalinclude:: /{name} - :language: {language} - {options} -""" - - -def _string_to_nested_lines(content): - return StringList(content.split("\n")) - - -def setup(app: Sphinx) -> None: - app.add_directive("reactpy", WidgetExample) diff --git a/docs/source/_exts/reactpy_view.py b/docs/source/_exts/reactpy_view.py deleted file mode 100644 index 7a2bf85a4..000000000 --- a/docs/source/_exts/reactpy_view.py +++ /dev/null @@ -1,63 +0,0 @@ -import os -import sys - -print(sys.path) - -from docs_app.examples import get_normalized_example_name -from docutils.nodes import raw -from docutils.parsers.rst import directives -from sphinx.application import Sphinx -from sphinx.util.docutils import SphinxDirective - -_REACTPY_EXAMPLE_HOST = os.environ.get("REACTPY_DOC_EXAMPLE_SERVER_HOST", "") -_REACTPY_STATIC_HOST = os.environ.get("REACTPY_DOC_STATIC_SERVER_HOST", "/docs").rstrip( - "/" -) - - -class IteractiveWidget(SphinxDirective): - has_content = False - required_arguments = 1 - _next_id = 0 - - option_spec = { - "activate-button": directives.flag, - "margin": float, - } - - def run(self): - IteractiveWidget._next_id += 1 - container_id = f"reactpy-widget-{IteractiveWidget._next_id}" - view_id = get_normalized_example_name( - self.arguments[0], - # only used if example name starts with "/" - self.get_source_info()[0], - ) - return [ - raw( - "", - f""" - <div> - <div - id="{container_id}" - class="interactive widget-container" - style="margin-bottom: {self.options.get("margin", 0)}px;" - /> - <script type="module"> - import {{ mountWidgetExample }} from "{_REACTPY_STATIC_HOST}/_static/custom.js"; - mountWidgetExample( - "{container_id}", - "{view_id}", - "{_REACTPY_EXAMPLE_HOST}", - {"true" if "activate-button" in self.options else "false"}, - ); - </script> - </div> - """, - format="html", - ) - ] - - -def setup(app: Sphinx) -> None: - app.add_directive("reactpy-view", IteractiveWidget) diff --git a/docs/source/_static/css/furo-theme-overrides.css b/docs/source/_static/css/furo-theme-overrides.css deleted file mode 100644 index a258e025e..000000000 --- a/docs/source/_static/css/furo-theme-overrides.css +++ /dev/null @@ -1,6 +0,0 @@ -.sidebar-container { - width: 18em; -} -.sidebar-brand-text { - display: none; -} diff --git a/docs/source/_static/css/larger-api-margins.css b/docs/source/_static/css/larger-api-margins.css deleted file mode 100644 index f8b75d592..000000000 --- a/docs/source/_static/css/larger-api-margins.css +++ /dev/null @@ -1,7 +0,0 @@ -:is(.data, .function, .class, .exception).py { - margin-top: 3em; -} - -:is(.attribute, .method).py { - margin-top: 1.8em; -} diff --git a/docs/source/_static/css/larger-headings.css b/docs/source/_static/css/larger-headings.css deleted file mode 100644 index 297ab7202..000000000 --- a/docs/source/_static/css/larger-headings.css +++ /dev/null @@ -1,9 +0,0 @@ -h1, -h2, -h3, -h4, -h5, -h6 { - margin-top: 1.5em !important; - font-weight: 900 !important; -} diff --git a/docs/source/_static/css/reactpy-view.css b/docs/source/_static/css/reactpy-view.css deleted file mode 100644 index 56df74970..000000000 --- a/docs/source/_static/css/reactpy-view.css +++ /dev/null @@ -1,43 +0,0 @@ -.interactive { - -webkit-transition: 0.1s ease-out; - -moz-transition: 0.1s ease-out; - -o-transition: 0.1s ease-out; - transition: 0.1s ease-out; -} -.widget-container { - padding: 15px; - overflow: auto; - background-color: var(--color-code-background); - min-height: 75px; -} - -.widget-container .printout { - margin-top: 20px; - border-top: solid 2px var(--color-foreground-border); - padding-top: 20px; -} - -.widget-container > div { - width: 100%; -} - -.enable-widget-button { - padding: 10px; - color: #ffffff !important; - text-transform: uppercase; - text-decoration: none; - background: #526cfe; - border: 2px solid #526cfe !important; - transition: all 0.1s ease 0s; - box-shadow: 0 5px 10px var(--color-foreground-border); -} -.enable-widget-button:hover { - color: #526cfe !important; - background: #ffffff; - transition: all 0.1s ease 0s; -} -.enable-widget-button:focus { - outline: 0 !important; - transform: scale(0.98); - transition: all 0.1s ease 0s; -} diff --git a/docs/source/_static/css/sphinx-design-overrides.css b/docs/source/_static/css/sphinx-design-overrides.css deleted file mode 100644 index 767d9d16c..000000000 --- a/docs/source/_static/css/sphinx-design-overrides.css +++ /dev/null @@ -1,14 +0,0 @@ -.sd-card-body { - display: flex; - flex-direction: column; - align-items: stretch; -} - -.sd-tab-content .highlight pre { - max-height: 700px; - overflow: auto; -} - -.sd-card-title .sd-badge { - font-size: 1em; -} diff --git a/docs/source/_static/css/widget-output-css-overrides.css b/docs/source/_static/css/widget-output-css-overrides.css deleted file mode 100644 index 7ddf1a792..000000000 --- a/docs/source/_static/css/widget-output-css-overrides.css +++ /dev/null @@ -1,8 +0,0 @@ -.widget-container h1, -.widget-container h2, -.widget-container h3, -.widget-container h4, -.widget-container h5, -.widget-container h6 { - margin: 0 !important; -} diff --git a/docs/source/_static/install-and-run-reactpy.gif b/docs/source/_static/install-and-run-reactpy.gif deleted file mode 100644 index 49d431341636da4a56becf7fdfb24f3fa7fc6685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1049193 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%0D?7xt^jC4vUF+=VKx z)Tx4nEPPzvEZ`eNaT&Go;N0?nkxM?Q=2)xL`mCkIil#=0eu!I(wP4Tj$**z4j4|%1 zUQvC&ds^zf76oQ{f23U6f}Z0>ma@#={IfgQS`bPv1DbLILZa1Zz{oF<DH05O|BA@U z7f1n<K53Kk^e60v<H)=w!O<?Ks|)&atQ<cC#ab<I%&hNgsV4+0j{2w#W~w!k$nm3~ zRK+Xb5X!d8lhF_-|J+XgumZ;`^nG6`w*k}2_XTIkgB5(`=gQ@et$@7ZZ4nf2wS{8m z*_-rYtsOzlm}0eWCO?b{=Y&7D?~);6u0USz9=$A8VgWr(*NLfzK~1iTF}GsxLBSpI z_oXESn%@>RJ_-|xSt8GbW63M1Bf2})MjTrKc63iBR7<WjD_%##2Ihk7mV!FTF_nZB zNIn4P?*>xu{!nCL=yO5ERIAGFh`M{wYE0{!emHhH8l@8F=GcpBP<FZq3c3Cf^tQ+9 z4JdGW_xN6?*5NwK9kkT_R<%1is5hJ~=A&BQ_toyP!dx_yuAvZ<7brBi6wMnS6ScF! z$&U<24~uEUW_ZW+E(;j8jf-Wg!xsK&9qY~3OD3q)(xdm&l)pJ7E^pJMloIVrx?sv^ z^-H_9$5BD><%x7-iTC1zM%EyVxk<Xt)o5f7wb^r89PRpfJ5X_wEzgqrx7i(kiGS?Z ze}9)WkmmOV=9gCRYak-qqC#Io(RjdGe~{g8aPH&a&%!}ojzK>4A<A60r8h&OjYHy7 zLy~7h(%8dLj$t|VVFlM=C3VNILW8Ykz|c}9gFGvZ=V4`2FgYBxO=iScU5mXM(^ApI zAbCU#`(xTi@9C?-H5N((1E(wY_yJ1_%&GRkY_Nh!Pek=-tM;gaI<eZa?fjK35^T&| zoxmq~uy0^Y)4!k4XY7k_nC^mwcI8MPc>JRsK~RW!wkwJIGoGi!giV$+4Hixgwqa6H z|NBkLyih|<fDd9DcghnHDKa&vM2ELkn(h{BeH`1%UxuVvidt-m&tLJe%mK(bYhttV z@l)(qQiiYX$%APmPMIBVxZzVDO?8IV#~cr)G8CNxvZwgH;(v!5r4^Y2gj_z3f>@`L zt4#@dWbm3rc;9(Z{JX-sWBS&n{;eV=@LQ1C%L~=Mv#<C`+6zVWd(Uc0H8XB8U%yjY za_>7w80wt#QR06ZLrXDaD#teA$u4CXx3*(dpOxPKW%3=ndgQtYDykjh<nB91vX(f1 zbjW_J2c+RN*vTQL{yS%V5Qp)1eizM<ff~R_hju$;fyrrsAn`;t^t==B$j+qu4<9Wx zqs+vd1n?SoF7#O;7W#gX;`*7rk(AOy2C<}Q^S)h>FQ&y=GAig;02M7G#iBe4c`6I@ zs+oD*D0+a(%N@<;n7!GDC&HYMP?7rmC2RbVX0dbHpknZ)eC2WW>(NsVgEuRF7Nq`k zKT$<HeI$>pzR~$@ddjoF0%}?U9G?97lzj5R%kQ6k?S=h-E≨410>X{bt<AYAI& zQMW4IBumTm$p^Yp)T-fA=0*{6v|9K)@x@J4_J~$JfVO~R`M1wn6sLU0Cq`ssc^ZXH zjU(_NXTYQz-jv2BqBM!gn_>&~$CMkjVXhw%e65(e9SQd1+k~@UKmdvrUiRMF-tD>@ zWX&AizhN8U&*QNEH516!I(K_VlP_#w+#iU567cb0PV=Cj7mb4=uo9@~(<FJq(6`(^ zIO&1`^7x;*2I?~Aw-~Q~{DW^Xn(y*^?J`9mGo-H1z1^InmW`th*k;)+#OcQ^-tdk_ zHxc*|61Vk4y=4%9Z4@wlalXSr(>{wrm?^BM_J8qo7hX|??ZSs=n4!BHhVJf?Vd!o| zK)SoTySt>MLApy&8U%zPrBgaYN<?%%-uImE{0n={-fPzL-1qf6+)e4GN{Ty75IV@B z+ktj(qN-Dc-4ZfdV%b$joE>9lD&Z#(FsfyI+ZUK=B+k*jo<r9l#ySbdV~uby4?U?l z%2dLWWEl91=lHuj?C-Czepzvv)sUTE)E`pFNzew!9*-$|j;MP=(o8X~To_i`7#!o! zZc9x#;S>OBW7*%KKSdB>#$BfnQNkCbjnnYhPeY)dJM1Frg#9s0(E&X0JiVH8L}kbz z0u%YxC^WFZXT@~Rp@h$PeU{#IcAa<LT5`g1f=_J@HUM0p@?AE}zN(-Qnu7^RSfP2~ zVZ?^AUnyQTaz`@S^QPc&o$#W2l%i9FoJRaZ3j7z2FB$;^T+*VQ^5bFra>q`EEV0W+ z7qiey7#6>ZM(x$!yW*t(A8pm#HeSR0c!-88y5tIr*4%cm$h8Jj_n!1B7dTRK8kNdS zhd`1k`F3SM#TW*sfShj6{OqFPT84?>M3b|a-+teV<Yhgp3`MH`*TMw9NNUQz5B-sG zEm)~?6%~rO;x(g^CX2rNehpr@|HOF5v=iF1eRd~z#CIKD=9?&=nOGh{5>16<FEwMM z&zO$&x@;Adv-cr3K0Z<#4`z-u`i4lltiWFEmn(2({w+bJA!DRcyz|blk1|oCYeeGV zYIfTUF?Iy4?h9A#@hS0^E<d@ym|V>_#wYvt@<vS8=qyBeCvI>4$~L3RYlZ>&4eCCx zw8=!((2A(%%!nN_PyPOlI-J0>o6tc9hzw&N(IjYmO#I+WT2}GgJohU(;uoiwfRaCw z3<Q1I9jAK`nI&CTJewkaC>dQ^cPRf*aWI~R_h*7Ls38PrG)vEy_V1T8tf;WpDs{jx z0N&#Q0(=d`{+2-gF%VgFes8Xy@ulrYNHB=fX3C@WjIRXWO#slnPF}BOU>qSz-#+#C zxQQOk;Q|dVd05Ia#q%rXVzGHp<5ANnw5obqCiE%sI6{+{2w#RcS?n~3ZuTw5$%l%7 z0efYH+V7#9mf5GUZ_*)!8sXXN!h=b8jOr!P9Nm|*y)4(IP6FR9%}9ryfB*4I%~GcM zj>1E-$^iY4PVY&6zV1MUN66)^EsPJ1QppXI@4mEX(maJq&LB^f`L{|(urs%TfzxZ4 zgv=$0Q(GH;KhpoFS-5$b{@$v@<V?kOa<ti^MvShg=jVphV8SrhJ1^Ljs)6d?0faDG zgZ~VP2llJ}M~@n<Ep}WNnt{LvI=?woE`g`>@h+z?67N<hE}Q>Wwp|TuXo&I*+?S}r zx$?tXaA8dvlRzpRm^fW>@Ioyw0MFCo2=;7L2W0phSfIrDr3igjdVGQPvSV2fvr_z5 zi_<AG#E;dg0MBo5f0CgSPqraFG5oNQWmTLP&<}G2l9-r^THpkh*lTwXx@wJ5>uC62 z@jO|VpT?}G7kYNoC;|By>ANK8l7i3j=Q}BEl0JORJtI1tm8?qin*IKi#jZ}egMU5( zyKh&R&0UEWOd%Z%lIe$P6u7f1g5vqYu_dh0<nYZH=SQ=|-6NB=7BW3M5bRZT%Zthp za(u%gAYEGw>9f;pJ$LJ}eM9zgyy4a?w7avm8Rn5oCi$J`^KnX_O}L?TP9q!)_1gH_ z4G5j)0uZzAO%QVQ!I8xr^Dsa3&T6catXaoEA~FLdhlaN{ggL92zKWg$(zp?jGe$4+ zg<4Fle)Jk_?`0d(-N*7w_H8(o0?;ynEmzMfPbc%&wrdPt{_fY=4wBcI9H!k{ex1Rh z`w12#E^-3W<L@jZq`<AI_!}nYN9hw!V~6D~LBK<+oUs)_>cwL6gRDsN$^viOgc~rK zX?PhkTZkxgLAeP@;|jx7M(TUmlB?=8t`7O}beE`sm#}bg=vpH}^?iK`1-VYyIAiUt z3q|h`ru0i=_Wk0=?~Vbf&r5i}aENuJa5en*GOCQ89o!)!MfUnB4|tV*KSFN}GA<$| zy>K&T1EvN;#ps&cdZx}iVxfKUZKP;&z>Fe{ajtM2yoj3G&&mRg0)(E1mwwdZ0@oYv z>a3H*p3{HT^$dpYHw2Ee(i67>L4%(*JJsTUf^XfXr^s`S(!1Je8~BiOlcTMJUHOI* zlgpyCGfskcyi{*XL^zHh2jOK-NuaXhPv(F*=&$Mb9g=#{n(-Iv?^PhB>z0GPyw^Mo z;$>hT_s{A6$ebS}%)q#YBIQL6-ajx+0j}1~%h_-TR`U@A$Fm2vW-SjuG=E&W=tM3! zcn?|7Ux&cN7YQ%%nz3^o*j7D=&u5rH_l5}jWhgHT^d_CliGMGmg>1NM2|I;mIEy-c zfq=#}E%v(ZfLfD&g2w?8Laeq!p?{cj90N{gA<w`N2WF(-{RjhMC16l8kwAxd0sP66 zG;g~m`G$XTw{6g~fdDGqrFecrh6U*U<|#TwrC|FW#TSq-PU;T%Wzk$wiAV-#itLc4 z-yKBB*wZgD1|s(KkKV+&i=@0C4~)pS;c|PYO6~qqsS=I&H(Z8lTc8{~DD#@>j4vT< zS<U`0FS39>82h@nvY>0!#?0Dl)_c1eZ0nB7bB8cjn~IhbUfWfq1=}}m7VTm+Xho6S z?54zQ5*8bt+j4&*pUq|TdiPb2RhAk<yZDd`bISWzvUx2p<l*-H1Xcq1%jvOQ*P$-K z*P2|Cb$A?iG~G7%m|-+PId=1|Vj#VWe19lW)S8~ghT^TF2gU*+RRq;HrD)2{UePxT znI*l^)ehlgXt?=a<wArJT#56s?@`QAHJ}6}+16#e7Zv!rgOSAL5W>9SJ4RObVKRl* zRJKhYE0g_U<r||?F8|@WckXc<Sb`KOra5jdR9`KsZa@;9V<?g2aZhcIUjuCyv*^|u zq{V~QW?VV3F1%T&mDkl0;Gm)c!#Xuy308!H0gP5DM^3`hBQt_ziAfTh#o$-KQYH62 zQ_0dGO&vSxxOi992me#A$FtXi7!Q46*bOealzM4L9j_Zk)m1zr|1UT>bqIt-%TX@! zjvFhu$2mTZ(5&x*ZOQ0C>gfzLQ?-e><)mLX)o#Hj`aD4*7Dz7J%w<ZVvC^9|ySZ4r z06~C!=;eHhzGNIq8QwL2&+w<fci}_lE^bPq7Z!Nk)~IwD6H*;A7-Z4kk>wy0HaLz= z$RlOL|5zuuN_O{g&PB#)%3EUio_Ai>PS9BKZp;&dtub7&29d_E6R9@|MFlIyMP^&= zPIgmwjLvl_HE!Z$)eh;*5Nk~8pWO95&ubwQYm;uuz|gg6bO8(ES%dBN-2csOGSj>T z^l$Fd##$Hfpur0BBq`()ng}$#E$P1|+sX?4OxUQ6SM9k2zq8++aWK86E|9?qGCv?7 zDbVpLS2Gu0(Gsjfx&NO#h#{NLsfsf+m)i=c;j4Uqd|H-;_X*l3R!mCxL%$_qYdlh{ z4$r!Xvj^ko^PX}^KKv}=FgczdD4kn=^eUA?-@(|BrD%VJ-n`gAt1XeSq&o9U`eDo2 zRlpi9x9!!4xS@g+pW2r@u8q$ul}GbP24dBJGlFIoMrYlc>=V+acd#&Fe?}I$l;}}I zSuKp7Q+GvBhFustny09bW=oPu>sD7q*5)Res5&gS&bT$zcU1Qu^RM-)GN(Gc+n_qe z3(oC1^^_O*ZE~oITLORYaNDnpey%7Yy4%6+gLdR{UY^kNj`P*e7LIfZPs)$WJJI(; zza<xKc%Cpn5&5Z0sJN&^1boHJ_H9nv+M87in$FYk>73BJHbEtfAVc_1#=S&&XphHt zqO~Tw$CUn~31^E|rQ4a_Rj`DdYQD_joJ8Pl*CKDLAOcq>Ods0c_xM^W1T8qnJ#@KY zVrsVio(-e<HIj$%BjJa_A@%#aY`4`JE(HIS-9NB&eymikwxN@}+3$_xPxdNWv9D{Q z$h6N8p})U|g|6lSELL|uJ)I8yyKDaZtIiYsz7aR<E^qtq<6IcRLh~kSU;L6%YVc3e z@vSttQmT|=5bO*^4ThpsN}(h}F&dzl{ZOnK=*tB*&IJ_r8H$G`gHI(xz$rs0DMO?t zLrf)w-2)<wf)a^F$)@*BFt8ACMsT%6qkAWj70F<{NTk_PlqNFt&xOFz0XoiMyl0@j zXvQ1z2%+826_^8`e-2Da3?`go{|^PlCMIQUj~XBW{w6TYSUDgN4dWh!f#g_;AEQEf zbMn@PxhvmONDfZ~jfl?l&Wnx+-^pTE4u1p5F-qng751kPj?#XV&D0%5W0aFaILiqK zLkayO7}Ddm#j=D7VTwfr9M*CQf*4v^1np=qiwjY5>BA>OBM1rTR(PVaGv<uIf0U@u zcrXB*#RP4CL=UG2AR8W_Xrzl1il&W-5jHxYc(FzokfoSmjax`281>7aB*`C7%a5PS zMXR*R5~a90%R3PbyL1d4jmR2+2aY8srbqgHsD|MZ6Ry#t;D%8G^GFu7_v$mSfIGRT z>HZM#zz!R!YzA&Do|KQttJgD%ZfbJCz=+{DsC$&y7pE!S7O~3aAmiOQ3-S~)Nc1y% zLgL4lk+UihvdH|p$)uUd6z@sB@W~6z3EB~bkmv~y>xoy-6CBaX?uhRSU#woiBqw9C z<%%WKJs4H6|BO$`Dsql~c`l3qxR>Woru6M~gt-?3t|Kk%<2>_Y7|CdN>}B|pIw4p9 z(iY?~yg2viTG?9^`9fsKBMGw}%01h3yP7K63kcnUYB57|H#OCGF$IVR%3rrQ!Lz0q z@(61qLux@1l2v-Uf?-e`a`R|_xoQwEO1ct|?jx%62sSNVtS=s_k!Y-^A#yV~^$Qis z^r)KRh)Uykm2$~}*XGkrz{o!I1eU%+9Cx7rJk@mGq|O6oNwltLaUlJ5#fY`on6=t2 znHb?C(9IoLWD3cdH(FqdCiW5NAsYR-r|kJ*bUR$*lymj~p_Z86pu7v6TclDc#8Np^ zp8Fy&mF1)fRFnH7I2yY)?vbc`{88b@lIRl{{;Z~Xzclwfcn&x=XK1bXv^jUH2ft>U zLb=xjzMa#sreVpC)EE@F<cs8BC1FpGWJW{h)k4+Nii$&ut-MQFT>$Zya_MUS7w;v@ z(%EIEzecHRt5XPXS$lDFA+b$@K=LYWN}-5@z8Fi-G6L3lLiKswH>6x-Q8I)4zTTA| z-_XQfYvB>kZ`MZGwJ-@8f;z;xD|Oh#PJurEpAL>FeeVMPk6QZ1Q-|mt#XP;2YD-(} zWS($W#|mHDryjf(IA7%{_&tGu1cHu<P-gv$URyA#lZyvu;6=T?kfk0>nstx&wvY9N zqv+QrA_+yP{%uXfs0B&E3#|1)`YI2>icmp#`OG+m&$14a*7U9N+hWbaWcZsIeG4wQ zQuY_6JIyx@TKB<l8y`*cPA#AB)k1sBPvoS#T4=7G@kPAA{|dE0y2+Flw8Szk+MW0% zQeFn%>r9pVd7mC6w{+yDM-A`8QrC5?UqdUg{_*9jNuPSYcx5C@$yYn(q!Br#USur( z*~8E%prAS>`YX2@IrGhQ(je4E!pG*@vA_IwZC=Z2r6+cHg;HXbJqAf5_}l67CZ1th zyQWn~`zx&Q9)L13zdUCTXb0grTM)c9l@<RHICx(PM?BA3NX_J7iMibAgQ-=J`j*W@ zj4<U#EsKp_zWF9q%idH5<pY`p-V-N52CpU6QQwY&4~^b5>U*nY{pwiREX^2-U*yV& z3+suC_&J}CR)qXBgZMP&LhMb@HR}FpN`DM44Qp{{{E}2gs%S_$k;TgFB(>*rHc}+Z z@e&@6GOHdP(jpX_I%5&&n403VaSG@k7}IzcDSy_QJvmRLQPy*Wo>MSWT**nw5|K$= zNzgl)GFZDxc%A42SuPWbSZ9*n@qas0tKW=mjO=65AvI~1V$d?6^;^&wjcZw7YUNgL zg_vogv2$BK+vu&&W-Fo?Zmn-x%CvHkGG{42S8rp+P(=09V&e=Q;F?h2E)+rO4ieD< z>9rfr>{8YD<`?wF8;HO0j?dvQdk?67cj1n@jhAE28+!(v&whjXUb�X!Vl~*%$d% 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	Nz?j5g1}5@$JS#%2X3A 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á~*8) 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℘GiKSWx z1B%LKBoS;N8e}HFT(mlvlo1aUlO0bE)!}w0KML&vP{H&}1rDG0(a$5FNm*e1%!nq` zv3FxkEbPh<fRF`b>f4RS{5f<xF5;cm&J(fO3|LUes846BzT&znE>lTlG{r)kNBq<+ ze(~)cCbi+Q(Px{ne5D-26O$$v@9ZF_VyBf5kG=k|BhrYW2w&38#-sU@mwG5dL9g3H z{)PWo03{1(Qh`T$2K3owvzAIXWfv<e_xV6pw04Usii-xZGhD+<tJtx0>%QG2{hp55 zl2_MwvCgw;u<xpH=0l-UifG(fSggTOGDSGui+iubxeu=*2r@tVw60v9rarc}pS-_` z&EpU59;x%$v6V(A9{&7$x8>!#Z~Zega-Fm%f$x_T{^?__@HKByY$bY7XaaG);Q8xu zbW|5c^S)OP6Po(yS8w;S1v1LqAI=nEfOhI3)Eamm^5l-X-5B(|K9+-YqXeazy+kLM z@|ixpMLU@uhVuI&OZK(B%J1C_cyOKZ)Rcr`s?VZIHby(kz_RKBm8G+WRtH@-Yg`^p z^Rew{PE4`*RtUAW2`*Q&3@q8RNMt$SvJewv8>$s5g|MdbPi9aNo6C<LX5?<%o-T$* z!f>>YS<4!pYVh?nNc<9AZK$Ej=TIgTnYZ5xCGOOPkcwQKVP%qQ^Kas~Sr;ipv%c(f zr9o)ws<%8g+#3yuIg3;X#T5?Nh}Gct&kUYwDLs2;_yS)pOk|cqk?4)OUL4f*qgpS% zIF%mHys^`_v?9x)NoKmIAUR;t+kCO$Fuf-ELx%9lEM@|&rlmnM6PG}SO0~cH18~_h zwH^fiXlgC-yMLIs2wH{Y3&iwsh-U;Vh~E;Ltf`<@#;2|2J!e>fq9}?8#4Q91ZCapN z;x$(qlk4e553C?u;bM#h!q(-Bwz(MgqDJvA%keR#?yHQG6>_SJTSBF<jJHFz0ppXJ z-?1c}>jyrj&a^k+27UbG7}QTnt0~79MCo&Yc}nn*$rePeiQxVSR~U5t@sZ1N*`;Mi zK@$phmMbT(^5F~+ir+m|YHZt6D{kyERt?Kz^AZyb>Wi+mrbV1mhvhNzMyH+_rAt5d zRbHB}xQ8gq+V9DD{S;4(`^(JfzC`VM5C%J4Jw`m3xww=>yvwxheQ#L2;?XYj>tyiQ z^l+3C|6E^s?~@yUMLho|(GHZd4c(D)#`JuQah>uBmKRaFqa*e^A5Y<1^<yTqDF9PU z4n+3YWD;0j>=4T6KH=e&s!Nn*-X{#G40mPi()h?e!`0n5798mWRgweX+I5~H@HL@e zHg@^&JUOi7L1oF$^6|v;h3-T8&{Hzv?&o3h_I#Pt`ssz#Xz@_lak)r>w-wZM`~4O? zipfNt!N^c^ya--sKVRoXh_M3@*CbMp%Alp2%m*B8do_mb0f>K7)gR%|$zbGY9`|H{ zk#g7wwCe{Tc-^XJFL5Tn?9ttjetgahTu&&{b_)$G?FuD405B3;$*CJoCugL_zaq9L zZxpC=2{LB-P{}{c&VGt29yDL~oue-eOy-RwV!)<177GjYNG&A+VWZjg2zAVhaKExM zY$+$hX|?+kyrFWCGr0t|zw+KnrK3;{Ul_{;H$=**_*WCTK!oZgry+9iVzUL#N4t&5 z`elblql#+1{)>&%@fLPKq-K3?CuYaGqS#kAe2Gk6$SDj{Yj;uodCP8IKrIxKG8oIo zyw4RsMas$|p%-nK%AQlJVJ`7@svB4?R1i$<w@$43e4XWGrhl-4<h?qbUkZD}cC20U zUON+2Z_c@1Ua4v}%qkhn6T%V2VZI?2^C-n~LA-ck^ENS$5%~t%TK-D{1@%>}tW?o* z6wdI2xjAyXC4f1H46HsUjL)jmRaGlYI?kQaf&&ckW1s;^Xgs?*1j*2(rYXjmA&MZm z+8IAwh+R-D^jHp05f=04&lZUhov%;8UuT_4Z^AqU^EO<W{^z{X?Xw_s@umLpI8e5d zwq(+1f$*(#Vp-n~r}+f$;F{rx%bOs-<j#fI$=9INXRU}kz`Hf^as+NsM?~yE0*4)Q zlkj~e$CF4*1>YR}cca)0xg(kyu?J75IDa(gNUIuPE)nW;H?u6PhWk(#&p8x#Vp~!4 zNtDAdQw_$xzS!8z(DYdzf9F$ff%x<`0%QGxF2i1=jgq4_G{g?Mg`E)F#lBe|MQ$A& z&L>tkMY8fd1GdmE=n3Jw>NHV2zoAQuNs$l*8k3=$7y4{232cBNiE(tWFRa%n{y}%b z*R>S9Y;xTKe>VthMqh*9bdE|lbYTxC&hpjgeb6?~hF$Mx4sa1XB7TA?{k^P6pNaz` zmNpW+xVOBju`d#1MiafDcQlkw35W)X^fIOxn2hl|orAfp8F7K_K-e$&{~1a5jFL_T z<&{uNmTAKwQza9kp@q$@8yW!<TO&rs`a870#TY_(uZl3W>=g@mF;#a3*tB)qId4Pg z!&(~tBIFY&@75{P{JW}Zk`AAF-ZB*OHWK(e!h#1Chf0IG<R#=F-p;pN1EvGVFQr@@ zpZoJTF5Aa_!q12{3tRTrk4yV|Aw~)5N56GR!pR-XOB`@vUfp$$mS<(EA|FlaHl@aG zo%oO#$c6lQ-7x)?Z<D|{_LA%9-EZyrvD1ZGDs6#6uv7Q+FE>6KZnF1jX`;kVdG_W6 zhF^RJm1I1C_bd#oXxt@RDLt!~__)>-eNWbhH_et?$-dE<!<dWWpHZ~ebDV`pCTe*U zldtZlD7;nX%DMQ(Oq;?(PjGcyA4~a+8q-cJbfV8NRG-FjiDdy*ogm}$S=P{xNw9Dz z<H0h1Mry<6J4xS$%$u+9v*W8O|F!FmHyyuMe>u1Q33!n4?IvG4i(vCxM+e^~e|n)G z|2uky@{>!QYW{h~z+ZV1w8*e*)1?F2_-=?{;%Z`M;UfLnAM1f)zquz5R~66w4lN4a zE};W2vpBygdAgE~{F3P>KMB}p8_Dy?kmN6ZE`GlJ`C>Jt<M)EC%u&uO|HB{uZZfkw zkYD)H_vq<wzwmWjCKPyWDxxo^A?QP!SLyRP9S4ib==~bm_g`PVUmhwDP!{1Z{`I@; zZx34bA*TKx^*11i-0u|GEk(ozlkDG^Z$E`(woMT``m%9P3->WPweO{|wmVNsz7vv& z|Ix<<rq*sUb^YS%0*rpg*iOY@?9#@TCLis@_WFt|+y(ZN!`^0w*0z%ybp96lPN^wQ zIU^4f?!L#BYMx{+)0bl$l?NTiFQ8-OC^e~Bou$9X%h2|+Q+mmPd*w-b<)}hs(N0}_ z&fWA^o#dmkd@J%hPI4qt-D1p=L}2M#q0V#D&eOV{8zyNUDLKKb9x|jfwY7q1X!pZW zkF?i!I;k!SGkJujoZvBu@Msi2-gk=j7}eAsEoT7<WDHdfQi)maoJ(5QKyd)xC&m5v z>V@<wh#^~zoI4PqT?AkSj%}HLrgCbby=RwwgO_sJB>hnry<hnIew!i{nUOZgUTb7$ z>{odluYP-HMf`?-T<0F{)NZPFWoZ&c+$-s4p&fRqoz|MNFTHwRq#|u|mCa{+Ekac+ zHM@6eY6Y#k%5sq8c)j{FNJXd@a`Cc1sI*ftwAZmznf))0$x0`su%afj5_f64tki%{ z>_D_vt>yN&MrzduPX!+uq*rY}33nF_vx=jak}<ccbAU3cw;yaU$Yrf6zpco}+->5l z9G|Q3CO{=-Tdgfe<%nO&9*hjMjwz(+-VafZ@Iqe0hZ$;-+QUjSC2Hl)eH9JrX1T+m zR~=C#(&Z(C^3MJFBqQqGs@mJiAKRH7n5iS2xtnN4nz;)<uk>OeHBNAqk6T6>Ml@Qs zM>@C*>q2Y4g1hprM!Ewcg8%@AJ1`~=00`h-0@;9ok8d7HN&pNn`2Uv=001yx8T1MS zfT96fP+_9N!mbb~oYQPDaYGJ;&!nEKT3_53!g=c!eS2m(5QD&d*O2LMHJHM#UoD(z zF;bhxZ#A5&_N9Cb#nMzM;hthKk|7;ZOyh6~5w>IV)ed+JAI}6csMKyGdnnhvN3Q|( zu)T{SAK6~Q0qRLr@>K>zR7%yto7gN(ON%K!su59*i0|RjccP~&U-c?DrGUz`RZR-y z<&TW8h=txnCUUbJVS9Z07G~=9+(k~q4~_|j1a&RvR$;k%#nMJg^|onMI!$#-rv;L> zagH5gjK8Q8XROAenW>2*MD*AnuP4Q2DTcj>HcsavCs(&%n=lAJZ}rjX+V{r=$CC|( z=VJ0!#CrcusaueT^YZDk1u{IUr`S4Px1OKU<9|TYnn;6iNr5=xH*P&q{<xSxT#=8o z29JO9Qs?xFbY7@A*@wTxME)DAUJ9gtX3v)*SvUuBJ>?oOH?2T|p~X>b8+N*}9N(^S zPzy$&7a@eoMu{P?uTPlNdBG*IWY(eGI?S@=R|?pgQhG#s+7^2x>Y}U}Am;Ki<`)V) zL462?r58U^^;aAyJ5!(0U6JU!WEYa;>a>XKWu3pUwn`=Oj+%s8Lfy-)#fT#laUQei z*wjsDa8;xL>}j0rvYEXutj$_6ArQAdF<Q{b$RaEae}lsyd<&1AvIZj`eP)x1S>?xM z^^q0Kl`&8sUZc*2aF3x&EML$q%dmBXea>`roczefayNp@wh)BJZ&|e7$A6M4q(KZW zDumVe99*O9jK#5%@M7_{;$&|qdQzHJ{Bn>08R$&BSObmzIOm2RkzDi7?7}YEvG$QM z7Sq7Q;c%n4EoTMZ$=w98>QKAx+C#G5k8Nke)PQf`5RLpk3bZW>5~>N86WqS4g1HN@ zdsIpPm^2a)C%5~H>Vct|1im(8>t2qD=K!w4AH+OQpB;1nh=y*+dM|`;I-T>dyjtKf zNDZsG1|!MeG;335yEJkOMCgp|@IuTW(Q)B&z<|JS^DpKA2pjr%q8nrUgAYKWBWIjj zj@x#kEQlO=-F$mE^67gGiGj~BUum5Rbr7f565(3Q^dz>ixs@vCFcotT`}nBdMlUoN zfXiFQh4cyy<QlD07n5W110Y)z)#aHkW(EeA(?_3le|07OdlvfK;;;NS^h?-4!YY9k z%Ym?!sKOliY_rtO)u8^{*+_2?-K|?!)1(CZ`0Z)w>SH^t75z=JG3|PNoHc^c>_9t1 zVmgb!yAJo2JXob9TvfwSO;8!2u1jH1`6w^#G?ZWIiV0~47_tWG03_B!IqLSou&OSh z=pu+nZLlYaK?J5i<cI&aP!g0N-0K!jIcmm&-Y<fPhZfT(A##a60tk$C<#DtUsT2+B zutZ|ziB8%3<b(mN-bBbSZZ8HrF5fOhc2M+x&H<62h<A05;?+oF0KR29JT#a-f3lkb zE4Uh9a2{=JzzENS_K_z}hE6c7(O$L;NadMFX$4rqH79{g!h7Q2I}6JCFqCMAK>R!r zY56YupsGSWg88<D3cFcV`l3EHG<FjjXC9{Ux-Z_>t1M03JlwZk0DdkuYPoL_DMlke zJnLw~gst*_<pHnBLgLkW<>5LK!K@CqAnHxs2q{fPz|*XLxnTs!@0M^TJewq@OpGj| zsV*GlB#DlV4Qe&FyfB&;G_E;bk!P>uHuk3{y^M4zsU<>+GG65|SC|OJBUJ^g!ND;L zDv~HZxdJ1EAKxZNLvX-R@jW<Ob=p9IzTj%fLHkS(MVy3}4c#4t2_&%P24P--6|fPM z8VrV)*^Ap{d|Lob3xfJgh{z!J>%u5HkTBrU6#J#vL??mQAgR^N7D-1DLc{9*NZrTW zxDiT-f4ZghibEADF;xxA9@73GK4xQfPG1((NbbYvMC@lCFLO5cX&2i2;_^P?bGkB= zwa$?5C8ALx4qFRjBW2c_Wjc6tj+b4y%luk@fjN@pv+d_}fd?kkAwpPV!I)lRiN8ML z>;P<8mGX2;T}ldFJI`CSI_^%V@WB`elzc<$WT#YvL7O@+!N%UrwzN)`55-|fe#YaJ zcDVBLZK4V1ZJJk}4XNE<R>fo0Zp-<4(!Qr7O*0~ql?xU{P}&>JU3^}<k^3L_SY!gp zEM_ofy*SSm6fRq5moO?kfiE{)^;q*6v{b#FsrCkZUz;cI4EXF>i%R`$8S78U6bi`v z-GGy2cPM-oLAQx3#FqH!CE<~UH8&Y13t0uBt}~3tDf)8*BaMsJQYPHFkk}?LHV#|; zC9SVH$%b?n@oezuNbjZq%Fi_*WMh@khp~N&=Ti*5e*XJ?D|m^;ATF8NoPf|RLXnlm zkEJ$|`Hl$<K#M`x9(pkH@3zJt_ALm*nNW81*Ue{1*<GBbiLIcDao>(F`G1Cg$ekhT z#Os9e{WD+8430a1+-vh;j2LRxCA5nONIArXYUEyf5+v_coVRqK6S3qV4TxYbwf!i< zv(2F9t}B&U9|>!unk^2$c>SZdkAH`XtnIXs#Cw_c32B>Eb-ovsrSuUXGsag3v%ve= zo`bpM3Ha--cVy-V3Nu>C#qZ+s1f7pi;9Vws0gycJ0`Y4bNFf$)zENz)W-I_{IyGbK zWlm2U3IBUPXK8Va>!Ta)(C!a0iuCPmL|{E91(N-&J3vmapceJGx`~ZB$q0o8>|7_N z>(FjgpH#aRP%!!V(ze6zm$~8UlDpHEZ(G?d37&4%{S{`FRh@hrFv4%vh>&r8Yqpvf z?s>w<tpTl-FaFE*4r0D~A}Z1Tp5@m&^3YJNdyl3Wvn?T=RVrE8<`$xCW*f~e!fPm4 ze*Of>xgd>0i>1PWmmKpX__2xK^%5sA0`~PWIH6GIN)LT~+p{IT#zEdt?&1Pd-k8F9 zF^O63eyju^P2-4Dk;49;J3qsvw&@#=UgG^SIm{;Z{r~&~1iL0{@XR0Wbve?eNyNV} z>k9%;7&eVIu^$eTyxL&~6Mi%E_RGMQz|-&e0gE&Ft*Q|npX4z7kABeI`P=QF6&NPc z4{-}x=d%riTIlX3^?|>l*;=mj-kU2MY`KX_1Myx0Fla*;Ap<acHGnDg8(S4O!l+%s zzq-&;Bo6_TKuL%+ILw2SoLKV>)n`Tg$8`Y=72qA=yUj*M*%C}!srswwDY1P(hl<zc z4=)~H52ZKHXoDc67my8apFwx7!eGy8JCwKFJ9Rxu!a-Y`=g)w0K76<SU2g)38F<+0 z%ug&xY3<qAt$AEQH0*Nv`E!0uq0lq_pap^FP=>IUIoZH4T5*_>b)*Y-q$fzgsyKuN ztIHL<5stML#=1pfc?+{vg{5`5vWI%E?oiyZ5P3wpmMBHA26<uvBmB_QKwk=$NOocu z6fE&JjGYAFq$(yQ5Xq+-In-zt3<@+P2gI^74Dy@Asruq1vF9X3OH95n^t9RRdq;X3 zU9!W!fl0&A5@qWvg_#r{tQ##B@qahzlX@U!b1Y>Hialc}QS?HDtz8pF#1l*wR;+2& zxFVDsk$V(|Snw0_x37!L=8Rwj`p*RHAeyXX9fR=4EzaF~{8?%II=h#zeN>WIuxS#* ztH^|F5+=?`Y#R~Ed2^h)IwLG##Bwt!O4a5|q)pR4-H|WDS|m)>H`KOS^ez(?sTvAA zllxEXri-%_iuJow!M#pgVp0vO2&&!)26p1U?!>A>v)h-#2`dqh1O%C7r2$J}GIy)^ zs#mxtxshUPvfpHKEej%s;;qk9)(u@`f?N<z(u-?;?1~D1kcG-Wa~v5Ck%A{Mj-gcT zDh!jMw5tIP8YH*)fgj8rWY>w~Scpl%Z0NL@#`y+h;E)DxNs+!w@p8!UJ;3)(bLc5& zL5Zhp7^l|mq_+byic)b(go#j}Gp?RzzRAkyz08n_O5+~Pide*5n$`GDqDk2llBANI z{}!YoM=(L6C5s)Ju$ZcR_Z*8MmQEMjbSUFdf8C^um+MI-xeg|dz$E#>Xi-NP$B$V? zjG4fozU)TDz7DqH$2sE1oPG;~-EbV*WX++~q)gYbr&6&`*KsUFDU3T)tSFyX48mry zX=DMOPz#Lz%yDjfcGy|x`bn6<1^0`3DHa85lvozx>Af@gAsk2~Gen@z1M{nAGwP|^ zEWs;%*kT&~%w<-qZd#E;PNkYbH6`j%9yiGh*{{mS6ez%Q&s%KGTg5I}8p=!1D<Dyq z@?Ok}Tnz2v=b^^HmM`b&mLvGxiJv0}<JQLq7UJ_>vNE|ro|NF{o|*bEV*IC&E5r-m zOoYmpDo2+B&z{@+zB2bK&5`rcTXcOD1s+&`G%A+?kr;(;LaS~T#tIlkg=HgW)HZi8 zyXaDoe1(sn1uo=&jdG=E07iJE6T91!H--ewL7bsDd~fcJyDrMz?^#1b%1nmKl1yL^ za#e=KnPdH#g<s3Ui7OpUWTU=T#&OELNGT#dH_LD&%%ZAtHK|UkHh7Iw;ZYsJ(_NEt zUz5dDrZS9OhZ)*`SYxQbqke{SvQBs~S#h~vZMF2gjnaq@2KJ7w^5wL}`%EDZPYlqn znH4gp{)|ssZg77^VYVgG8v=s%FyUPqU}com;uP#Iz%CtY;KGoTExJbu-Fae2{1&EC zbh*pzCrC~m#JvtP2j(|iu~Gl2h!cEcg0Ect1WUf&%#A80iNMv5fYJ)aCkNi1<Xoey zb>{>#WY*5r)sCS}lDIF+J>_K&)IaGDd^FnlxD0GSBN`b0P_UiVmQ#6nD8Ldn8alh+ zvmRz1$s~O1+&p%TG(~Qy5iY#b9*Jda<{Cs+)J@ODXs{VzW^E3}C=<uF{N@`YPF$K; z7Ft$7lZ8)ntWD#ZyNTb3Y(<fq=O2o{B?ba|P1t%(zPPlL9xrB~rU*l>;2N347+q8w z%p$x+n204SMi+qDYTedcmqxNE8i$h<Y**a+oT4={<}1BmYmh1Bb81P#?wFQt1fMR( zJU}jfBnocPNWq$2o<sj?Bs|#^_OT6C-A3Hv<02%$7ES!^wLgmoMYF>+{0G-Ju5+@2 zLP+SNx*1*cZBw#iI|nw4h1m0lA86D<f$rA)IJX8J{Pi8lT_o=g0z~w_UHHTAC51dj zh|o^(e{J7M^!_JXkx0;6=nh`#Bv^s7$b}SwD2ed$MfJMi$I)zO7)D?4;D0+Yxx1FA zJNX4V5qJn^u8bF4om>IkaE7mCN8N%_J;Is@0ka;l+#ZSc9;uZcnZG@9G`$K^y-2fO z<$zw*++OweUf}@#K=sc57T>Vesiba+T)2z}k)Bi^L2Ta>8WQHwUdz~Si_vbL+}_k+ zikdD`)=}6;F%rXETGk+t7mToek}Qyc+>0R@Kr<lB&}_dk;3dq)c?S6hkS38I@ImKB zF$l2P9m8@A2P1Mx61YhgCHvjX`kl>&?qX<r1qNTZ4{at5Y1ItvI1M-7FwT|)K3nPE zA$yXOJEX4s$wh#Ezlbhpbcm(hffZqz;7G<Q2YP?ToGUf*CN~NTg}_1SvdS^j3Ngn{ z;_d1}9|mAUxd{Id^&T2*l=Dy}9_8epk#?!h4ZNX`0mOUU@OUZWE&1+)+$O(^@rOS{ zj-Oe7a7}oi*yzvAKGcqU%H=BMW_{YiBBm-e`e&@3o9(ajI3oiwUtKVf2vHzAEOwJU zk&z?Sl4DFT<GDFL_Z5~ROpf#)dy*hWBWP-!@!Rd__Z{bN2`s~f&fQ!tL_+AiA=vp4 za_YN?G^+>?-4))%aqc$}X$&_q5zx5|i~=xZ#n;)c1XYyTwGwCF5(*Xi5FR3?>p(K> z#+R`rL>*EI3>xz}7vmU{lUXGa>K=3!5(Reh0?&BQ853?wo;*$A`!mglo}OJe7jWYd zw3a3dv-%LZ#gAFfKs*D~c_Cw5tLM`#V|JGIn8^9%J0GjY=$&Y+EeR{Ml0JSbmvxaQ ziy(-Q8_L%tdsDMmqzE%$U;IrmK6x~l8aQ*bGVaGi^JR6+3p{*HGa*aclzY6yvpQ%( zJgj@Z)X%fr?lM6ST#?m!OpUBGe;cnqX`<CzJ=I+Huy6jB2V<UNe1{&?Pd0#&q{+|x zfstYA3z7y_rz-hOYkuL-qAsye1>pCZ3)+KKO_&Xu-BRjWw6^0kVz1O^Kd@kO2#nmQ zhA^vvfXX~q3Kil8N^@FIQWYh)4UR_FElahwKFH&3tZ^(seL!nrUTZ`W`Xb)?;%Ub3 z99S_PV3=!fH#f9@?|(P2A!oXRtj-WD72<@0mNgl+dg?d*H@2o;Z1a3vQhL2T@NZm@ zc6OO|CIN3*<#a+WZbdbJ`-}89nHR%lajQ%9D;n`TmiarWs{=#Q<2|%1LSM2E6^63O z02WF{^0pxUIt(oUMkMJ^B_Hc2`zE%ZU!JhoZ+T;`A#geMSCY{pk-xd*bIP7C+l+(H zNf#KEUaxUI2{iU$gson`XsGm!^V$BrE9w0V7Pn?xg}dM9P4!L68F`bS>cgioZ#{Wt zz54<i23;j&IPlKdh5E2BSlCuEN$v$>z6mOtl^!&nKB`Ou0o{(oX;&ZpXyZJqM&mpB zysLIDyM_caJReUC-yL`7?Y?-uY7u{=wXwZ~zx(v#>0G?Yw9Kx_$K8$(D}2%?58N=; zi0y1qPi;(#i!;LCb$;hAROG&HUE!|Zf=n@r#2#Q|m9}TvJs5r&BmtYQ$yjdd;m%Iv z%U}i`A1?O%H;%SZ-mj{>kqEbVpH~~s_Flce902T4*R3UVzdyz=3Ua8SE}M4`Fse{s zd7Ahad4~I<Eyy9A+1DEco7)njy~1;bB@Ui9y*QnS+kO7-<c#3gBJa2^-?#<M^#$+1 zruOOF+Vrc3<C%{;1M%0VbTg-~f3*<otj4l<xNg&Qz13+uta1d2!vOTR@7}({c)gD0 zcm{rok#=ebxvcO%h;RhSYZVm|Mg%KF5jvet($16N^%wqr3;?LrhyG++O^!G90$;r6 zgjGMk_;vH#p~aU|hep0NC+F91W*Fca1~77i#ke~8eqsrC^<ota5%CQfA;9L9TrNTr z0oa4O{hbtdGYnW^EarzhxqmSR5xo=VPCDDhGQYRbGP~BVuMb`iA3toneP1@EKYh)3 zt^a;!|J|w0#Hj-z+Optuete}duE}Ne-xb}>osJqH82U09&We|P1{`|^2m#uHOUirJ zqfo3~`@R;NO3Lv62wIj3{}Hs1+a9)z0I1RU%K+6r-XYv@PU#N);0k(<Xg2+i&UeNA zLROqQRGv^hOF%R*SLQ?TXl8G?2z5LSBy?9FE>;`mH(VF4P=QY`h__xe(@D2`Pc!<c z4#2K~<i)?BxUoQnlRT3sqb4gK{a^wATI~l{4N79kdw`lhV!OJrlsW~KFV}yDGfLX* zR3>B9x(f9O@?2DnIl#G;U1qw3d)c#qXj{87e@1WWwh|3;0)O$#gRed@%d4Y)o*o|u zGoGKAUHdNXjn=$+&ihUL>WDK7j@HiodVadu6aLBn;q86)LCW)=4^Q6toK78$yw`bm z=W~7Yp-1JH>`8x0LgxdH)MWdv_8=pj!L~1R3H*O>SqP~ju<$8|a)Q{6eMt48)O19e z7_$Q#SrTWJ9WnRU$-XjpJYp{!xe~+==+iw@q}A}!4OSwz@Zt!Py%$J=c_dCJDiX@i zZiEUM=_$rYwIA$=wP{zP3Yrryakvl9mbev#HU$Jye0?2{G~k=rHDZ;6ew;n{l7IP; zn0B@2$`#C|lM0=x!bE*W`8a}TYQ8xpg*>gVl93vGBY0K?%H^Hi(d<o@45aUyIPfsp z`YCMkI7Fo_qWoV^DG<F;6|bDp5wfhF)(~1X=uoDgBcA>ja80oAvYrWMbP&6$Gj16t zRJUL=Ria~rndTzeVID@R+XnbSO(t{W*EnwiNV@(c<yg;jBWYQYr;4RD81=}}x>wkw zc)ybL8}olLU~d~F6Q=8b(>zlU493!}J|D<`ZMe7(W_jr_P~epgRH%n56fze`5Wj5M zh!BdFCw4tmvsJ6OIr;rlOM4PP;Qx<fFP$y_*+Cek&mvZ2G#<{Su;7UwLzpD!HUs{3 zDO7{^Ycf87@7m~w9KG)FDlu~tz>CG$1UUTmqbfK7yK}woff<!sJD%f0%b>7jXqO)- zI#}}lw8I}!@gE;dv7p<6svW&(`;uhco)zFOR<sQ6`1gA7v<q@ybJ9E_)U@m|<$e0Y zD$s_!%c2JJiP;Sz&(O1S4A=GAwb4sQ)}@H{`I6_iGDFWfX_Y*$@gExVW<Kaxu{waT zP*K&5sHLcM-@<aF*zV)$(Xv%_|K(d9`*c^ho!cU(U3@9z^&?`$O@-`O-?iftycoi_ zG+Pk;((7RLlZ^j933b5(RqZ0!O_(3@4v8{`Xwu!!M$lhUxcc{pyfR`OBsr|CK>0Hj z0+pU1?882y#apfN?qqzs?$UInZvL$NJsv0^#+e9Zcc#bwW2JC1HV`6KQ}oOJhs1bo zqRcUz!K5>!fG)l+M6lF?_yu|T9?MkJrZ|xLst`*&6h$BGyZJYIzS*RmFGhQNp1jXD zn^ndJVua{nSMNc}w&P&2t`tjtwf`nCe=fyg&%|L4LrUIECA<e)BQS@$<vH2I-#h<o ziZ@bKCjOjMBw4y3<I$utkDaiV7$KeM4uyb-|J$(sprY(o*RF}xyz3G^uE*oeEeD(G zX2WGEho8z!fj=3TFgvwsyu3+His5GFAE+DzB~53bNOlF%#ATzsh!f{Zw%9WckanCC zQIqK0-G;x#BhEfEIX}U6PXZ~lJ<?}#_mFlHbFJDwO*47FLhYn>#C81UXYzmd+R0qE zPFQ&8XAO~*;M{gb1%R%kKrEHw_`^Ek#CvJgZo5oEbz#QB4S7^882#z367SQ`Ad_z4 zB3%np#PR0%A4s+oPqC6GC}*NnqIMBl(bIJS!lgtk@x9Jd1pcZ_sjPKX#99FTFkU?= zA<PObCC<V6_3jKUtzmVJJBmckU#t{*FoW-rvlV6{<-4<o4XKB6A8jvF+nj@W2G0rK z@Rtw?(QM(yBNANgcVck!3@1CFLTvU$a0C(KasLA71zts}U)fKyqx-qK7CG__STCA_ zcuKu>dhR2qFw`O<L{fEpymI36#$OoqAY%}U=4Ks>jly55@1;+o*^&yaANI1u<M<U3 zZ0^+TF@N%mp~;el$F)kle#WwgSWH?AW==%3&Ysa)QRH&S*|ty@>yy>}p%fQYgvXQE z6`cgdQ~P8HVqMXU^?jD;UEqr%k=vvl2sskdQf25deB9VS<{~sIe{`-lw+9>(25zv9 z@_%%S#Kfxf`%?*0=eHtuuInQ$%lWBNZR673aJIN`^s@FLs{2J=DM}D;<rBX^uay*# z_;nEkIzZM6j07@JVC7Ww`t}zG3`Y)_zT9MA$XEz0#RZ+=)-D1lI|m0l!qHRl9;1xd z@8!*Up4MRC4q%mY{u_|wzaXdNx1?CJ&lK1%wq}*2Waze!5VLoW^{7=~v3`A#BCv$# z3J#*qfMRQ6{Z4T2?KkDst�@=O1f$KC*Fik<lY%%LgtT)gb^B4l&p(<aA<$>e>to zZW%dFZi9V0Rk-Tm7)t!3bUzY5psu7^WC~aS5i-y!t++!#?fvTqH|%taZ-RW>;^W$_ zUga63Sp!w}xvZ+fnI{ak@Xo~{t{6c_arvDIBXRN`cOT+h#-s45rTI5ULa`dFE{o*= zB%h3y#k=*m_Dq!@wE04rzoh24H-og1zNF?~XCnaCl7RD@fp&}_SM<|;f4!iRlm)T& zv^T$+h!5<s$_`w9wU3IY^q1jQNaH*52INdgoJC4gu)5I>9n&r7o_zl$w->Z^=R1Zc zN4P@NDQyF!4p+sD%d+&$J!=1oy?0Y(v+P#kE4A`qnAmp`>|UX2vYDSxkvSs}6B~A0 zGCbKd19AC5g7hE$cY0m2SMh=|N3Km16e6Kp6wU?g;jnf4pIlB=>5fp$)G_XV>zu!7 zuiv~?j+m_r7qw<TadQ3h|8X7bqI$lpQmfuTrFluB-yuOx$}J!<Yk5o#;UX_iqY$e8 z_3EdoN*K6&Bf4N6-=3P)3so|;!{@)^pNgTi*}|wqasGF8@yTJuQyYf$&Q}4~ilP_Z zkL@>=(t+)_*Y=a^^WR-r*?Y~RhkXrK6amFX)BB3{6L<pZXMz2Kb`ohNfcp=}w9LQA z?*RaHz?;??X(6V0?teAyy<0MSAssp5!DnA&YAs|i{>o57!~9#YRD5%oB|x5M?O01~ z9X&j1)9svx?Q_$tLT8!fGhy0a+Pqa!codx@T-oZka*v>gI1PCh3_N1Z#&5yj;0tmm zDW$~XMBh1L;hpk?vlx$sPmzP>4X%!@qby?G&S`&nugp-f$xx6WTsR6tWFu-+C{!%5 zi=iE;l_=#k1N?E;3J~l0(J6o~XYV#S=)l<SIzEy+!<9a7>-f|5?bC2OlV&%{3UAd) zx*P#=ts|m&TT`O|vPWQ1Bc<o4d;i5mm}W{=O#-Dg+h-Zt$RmLRLWOw;VcQ2mvTk@~ zzQ9bJ;5H#3P=oH1BeXp+G8&+y$K1zkpJJMdt7{#t#~qae1Ht(}a}P!GyBE#C_{;f) zYXzZ3rHF`yFx~AglTd1)(C5eRCt~N$HUfE{wbw^tZXe)vc4BxziAwwmKHlOSn14#x zuhU^tsqv+<l!Dd@2#31&b4T?*Dw$(Cm3yY~=hj(`H0dfb`vNpk-#VcN21@r|2VT@F zy_tn~7RF4W21TWU(TK!QN3jUgbrc+$E8P>p$BwsG{fKeqRP&2?i`|c{&M16Eg@21N zgc}sv83vzJ3c2b77^#s&4hd(f*;fu#xT$HNzR6ptM9h4KF9fNxM}44Br>zS0-lrlg z#78akzYcwTCXZgfk8Cy`ig3gFpo^Pz2CbS^vo3rbk3a%_DZTuI7gc+jt$SvChoeJ3 zrZ`7WeN}rYj8Cx;%o-H@Hdwu?^mDavzmtEkwnYS63pBzsg6j;+*zH3FjK3~6xqVr~ zA(!mr0`mSg!ZWi8upX>-G&-KzP6vosqvq@#t$Q}A9O5f&WU3q%lrzPxHKU1Ph6kog zjG;k{O{cb_5#qw>k3hJ@fwd%{+F-cPAeIL^@c_qgWzkq&-PkgB&$ik4t{3(!Nmy(U z2YexG)CkmCNfxd9(bqg&X)+oC$|jbKTj=Gy48^=Mn3xnBuL#mHsnT8_)pFY(2Ov1h zZz=D(V;&ZDR*+-!7`pRjgU(XA@7a4UHFbU{aNm_qj8x~-vWGYfMhJ^BaRc<YCqV** zrHqKU&76Y2NVQmmHjyTu69V&=0fe?rBo3Hdml`Ic6{8wM5rb(c;t-^L6U71fJC{>{ zvuKJk>`#Kz!im)9%o88HbW+Xm3ZOwW0EnFP^d1nH>Kpy-lD7%j4DeMi${jfbJ*{mW zMBn93cEg@>kisikri2S4#S<eQdz4R&rc0cs$vd@oy|jzuMnv(%-w(!i-|C+P0O?e< zqG5I7fdVH_!ynUNex1c!A7nTuXW3yWIw)W+v})eE4?jf<PC?Z&IIDGH&}<K1!vk~E zN^6yYw0EWp?RE5EWLQozTnJ(vjs9*#N?p)1<Gg1K2%vf;M8`LY;w_MSPXEU!-o@i> z))ysPiC+`M8+ZWHJqveR$0vmX-a!Fex`aoJb3U_%udfY%wdh!ziKS5(8t)j`jYYPb zrq7B$3y*yMOiQ-{Iv0i<4dgM5mJ4<{nV$=qIZ^u&f**r04|UA^x+w{y@CBkNB8j)o zAEne-D5DRaO6p|z(cf@F2zc<)3$Z9wF*{&JCinuhBF3pZxSbTnY%IfyHH!pX(^=QT zd1cck99;yN^N!yPne(1jf@{gV4YRH@P4GFQY8wrp&9fZ(6`4yin6Y8k^YT&J#c}$Y zanGK4M^n3DJkbqdThQ+moR*k;rnCOcRz#4IsYG2aLU$69Ul`NqvV7tN5g-aSmy1p# z)x>0Ii_>HJAg7vUAMLmT%_Qz9AC(N*2LvM`LlU#c#LR$k;?4Hia&oG_4<gfDqO!$e zX&7N#n9+N)fFb-C^T6owzLk{1LbAqDa`QgGEzl`3wxM?(92H%)j)UHzSe=Pn35N2u z?Z5cc6%6Qnc0jQ<q!pd%61^zhzr7eopAGNbj~&;_N9nHUBS-u5utyD|quk23yrb7i z6SkCqqQ02#Td;KMx)Nw|69a%h`QwNk*E-KQY3IrhNn>++>ZuwrUYBD3aKS0RZlI%G z$K#d&ywjP(kNJCI+&Gz2aoxJ-fJfcFy268ZC9>3)xN6R>-NvLb$&-wpYkiMgsLM1F zl%B!T?wM;uRwS-hoS9<~#P&<km72xkiLR2-#{N+n%3X-cKbxK*#VI~}-rKuTj~o7Z z3+Tj-De0apH3hs;Ocv7(wa`fO-<Pdghhn+IphJ=RTKTM9a5QYl>`5?O_#Lry7Bd_% z-T_U;eH-d&mVj_bvI!jDIfCdTtPYT|67E)9^IHrS^Z#Nb$uO+aR8vEiS3f5bbJi1c zpBHUcZPjSyW66ifW^Hq}CUXbtpTM>tQHcuS#7euE%JGKq$nOuqR6<QD0M#v6mnD30 zb3-?c&o)`|?H2pvfz?mkS!soLx2---{GZ~Qy}kR<a1GTXVwu|cLZUg98oy&Lxb`zK zFa7yP4k~GUYADuw3W!U|rU{lfd=1B))s8v<&uuNA|8`4mtyLgCQ6@D+b|soV$gUEs zpeUcJu1oTcX&0w{%UfzGeXv{D7#@nXQ8*bS-9m&G9|XT~3+p`FO`}YEDo&aWBYi56 zruEiNk3ZjvU`JwT7itl0*<oc6uX>J1g{u+u!-!@2si?$}F8R!K=R}CAgO^&tOlrv% zo(H1L@mj}FRX4n9cgm2K2FDhNOJ=wtZLlQ2h>Lly&)W>&w>dq&1m##1aC54VpcFXZ zNJS4%oZy9DJ$XPY&1*dhed?_2!eHGX@>n9AFuBApw$LzaK$3CT)*`SsDWY<|Bv&m5 zH^#bLEH|r)@}I=x@16m0JNn>8?i(!Xj~z7dFtxLqKeFo>xRFu42(D*v?pb3RIH0yV zVmRU7`c83Du8m6>b6B+&S>55-4{S>ZQlK-Fvc|WaI|0<qubtPMC=ZI6hPrZa*5H%r z87?v#rKTr!?7`wtk)x_p-+hw~W%G)`(~lock67csb~v?30Qbm1Bz2DO<y$MDuDtBA z_2-Z;MFqY2)g(?wdxm?(^@pWz>A@Ysk1(u^<(va7ny#*#ZuzI+@6?#@e|_LT`dOZ} zg@t!@)37m4-eCy4EB^(Ebn1-HjH;seI7Jc9(M9-%A~IMYMLz5IjGK!``sam>YWryT zzRG$bovaWvTX*Jc5fNujM}QJ<FjsSx&o3KhNarSFVWU67_W0v|fi7w#8>S?cpu5<K zrF}@*$wb6g(;XHSKpzjCX4YKP<A99uqO%ycw)Gt12h;;yWM(67A3J%jrF`!T7%GY) z1sCltFa8EI9UXXX6I{}{Mn92_lZOZ-7BUq95bK4P0;IZ<pWu8bMs^eeI^k8J>ve9f zCiOE~H3Omk>S~CY?jq|-XFz~;kM0++K;aWJwTh-9F&}c1TlVX<yhMqxNr^Kf>jbC{ zqv~2F`T9Qk*rJ*Jd|msM$&G^J%~RR97tfjA^jFwDsevz-v1b=^CiB0_PINB4HYY5# zZ18q(E`h6-Ju9wq*krJz;_!r&x<0wVNcm)~lSiC6@6E>&Pyq=<GrjxqTVLVLGt06- z(5)-z^N+8knoG=T&2JFZztNWpHxeGc?o`Fx3ZGt}en;&2%2waTH?vDa?vmK<lAqkA zsNAJKze}^bOMi2h5pkDEo?z@TmHxhLE15;N`t7T)cM0EX;xg_ED~e)2l|+&I#Xh;W zQ2<IrMi{X>uq;&N7ne;OmYML?9AwgyiV?So6qUK&qbkcNP*flIEFt%_g>3i5(YJLv zf5<_8W<P1}fDA1P_m+<SuMXMc{r;G%-xt5(U{|28ctSUT;vOOvsopCyQQ^kWhY{a~ zfCP&S&Z)mcgQg`u%$o3wWHfz102S&oK3uwkrvgUb;|xRuSS0)@`sMFo@^Ad2;(NrO zZ@>Snb=@mD{@HE)Gac-UHdldxX8tt3FI_?3naSe+IC1Vo(7yWVdxZMurD#mbUDP82 z#q#8b9{F4rK0splxjBRRCn0-Gp*}79=g^qr<_8Vw{JjdF3)Od=8G()T%>5O=*Iffm zlWD=A8#l-UhDPE$5EKrAWJAr*5DF*|At!evKcFjum`R3){hYBsmP+X9%Ko`kA4PQa z-Iq5Xw7bFybPN`s@AY;PRy|Dp-J769QpSeA<#ISi29dbMulDpGgkjTnFGZDj*RF6z za^fH2P0p<8z}egJoSwfnB#z{DPP$~%CQT#<YO}wc6I$g)2s%yERFw4O*<Ku5d;!mf z@j9yNtalAyZbqTu$XTVQT#Xw`>3rCXJhweLToDvpIW5PWa*=w=Ub*H1(b?+57}C_j zNxtq|168Dgq1-u^Dsfe=eB1cqn+88S$hF75>3va(Z+a8boB6l3Z*!V<S9^`>_r?07 zfl){NkK~)BwqVnO%sijIweFA!vX6h;ea}8e%>2kdM^e1YZ-}M5vTl*%^s*$kW211# z6#J~ppaciaooNdARn{w0v!$9VOV#!!sY#W#PliaO+)gF1y<1Pg(yWrE*a#&}2ZT#h zRwhL}>69z&rgDreij*vCQ4W3bgLyNYCa%`o9EB@-u7Hy^SpuQV_M!mbM2=n}9g2ZT zo7g<tmUvImN7$<7jw+cmnYIV`*0xq02!#o9)>%N@W5wAHl!NJqZ5w#Dx=8K!^`AJq zduYE(r9XnQnbz+_q{7yBjZz}tdoF3uPG#YrC`U#7g->qT&KLyYpVIMTzr3p0kG+_R zC|sLb0{NU>o^jjK$|fo+=uuva6t3X<3?l8s>k>;zhve0zAPIM`rjEbtf-UV7J8`%s z@!GC7O(5?_;qzAh9i0lC$5KTh1o4!;HJ>m<S_xnhzWl?V*|@tFa6S9Gjdjx&%GO+( zK$jpp@PFZ41t{la7j})en|Q-xAe^|Nda(|M`Q+|XDK@6WQQi+=04I_$MV+IjN$omw z0A1`cY@faBz<Dq@Hr7rzTq}qp<WZB3Q(47*>AYWg^MYjGB{5p+qFf=T*0EHzp#7>C zSragY4H@VeWpqe7RN()9)_?lR%dp9iU_Fr$_U^7!KJ?2NR(D9lEGO8xODc7T@aIFW zFA6W&dPZAxTP%f7@Y_B=(c-D$h4xpMigSggesEoA!)NcHK}oqFNYlbLDRAV8QND!V zK@Z~;9$zd?h&Dq{G!D_B5og2Oz2zaihJb}dvzLQ`KGl+QLTKzSDl!`XDlZxs9e)lK zU1$qk$V*Do5B8bX243*`(+5oVI-ysGE*f(kDwJity8jm;)*xTq`I&R}Rsr3~n$eWt z6t*GS;IYpARm(~Ao=J6y1Q~{@EDvQaL`q8qhw<)jx{1p5^UZqG{>>^>%kvyVAHsqN z)`RJEZhJmkr+`#rdpv(u(Ypn>#o99m2cnW0@Lky9R;3zPB@_|eA0b3E^SV4>V+-8A z=k4bQ$9k-i^qwBJ((CfSd^OA{yk;xdugbXXqN3@@zo>o@;KldnEGfS1_2oE?#fec@ zqzjZOL#k9&2Ru#LoB)8UgJ%JhQdfD{{i*4HuB)B14z%iX^%AYSLX5{fA_2GyLXfEg ziC!Em5wbn1%!Oe}ejt#WfGx$wK^GxYI739gCk_n6Wt6Q8=P;kbMKci~!FB61R2brg z^1Pu~r5fFfcpfOm0Lyof^PML_;xKAC400@v;O3xKGE1r%#GpYr(iyw_?3njydg<12 z{3GIZfhf1lzgVoxq3^WHUC(u8aWY!@n_2aM*iHN5*sy)OTK<Ie%VRt04UWkm5Q&4m zHPcA>p3W|ReV!iEp0c(ZmSLqluJGgd%BVX*MmRJCD27<(O)bLL!ZyK(vW}*}eEK8x z(UTjgOLGI`A~h(cOUX3HeC38>N>o%u`t_Q(lMqM`ZV<8AC(8&kNBQ(JvIvj$E4zNl z)LKz1p`nGoyP1mQFz>?AbHi)>TaWJ@CSPNAeTbVJMxdgJF2b8JS2Y?KZu<PXu|_X( z%-{~Y>PjgtPj~z1Y&ff5t?AHU-825`#zgxqo!6%s+?Nzgk`25!1fP>IvnE)nb&kB@ zUxNM}U(lgYMQ0yqntf3v?9DMQ&QS=u7Y_1I-69+x>0Y_!1!|b6X}=4iw5i2t{y{y{ zYOElvLPV7G*Ls}Bx*gJ!GZl$+BEBDp4T=Z12*J?FQZJ+5H1?E(xRG-4%rDu5j|M5= z&qkI=M51`n_NDT|a*#K@#UdwVxB($BfCm^sTOl18aBw8{Ths%wtHdY4_UFs!{aiia zhvPz$01<Z|(cJee1=Jg2lc)TmS|djU;XULkL^@*z==Bsj>6t;~7@26^m`1@FdyZ5n ztkxQvcaV660rwB^D%#1S0E<2)(~ENo0ml725IbsyV0t@9ceOMOO5}5LRtTZW#E@l7 zqO0BU9SGH$sY^}SrlJS4rf(Yu)YC*|QW}0zs7ZyB`&bZ`5Y?;2U*v7o?vV;j^pT`5 z{#tX`JKt!HrIHbzl-V3l7vG!E+x<{P8`y^=U+i=Km=%3#w(ra8J3(bJ9pFS{tCR9| zw)EYFqE8T}U@T)6R4tf(MIMJD2t0cV^X_uAb(HQgnQvGVsSBZ9GKaS<bk8@|&!rw~ z|MZ+1dFNABlxN{Ek+noF-$hBlz~$uGCSJ*lz9cNSNU)*7VqjV5cFBu$anWg6CKiA5 zb#?W`Vx(>DQOf-JT<g$w#`x#WT65UZiL0gm@T!XP#dmmok{)i#Mx%^}0!fEVghu-& z*>|yip>bH8XZw~rLCb(5??qC|qs~EAd|3bEMcSA49p3liqgK3^Su^dslXNX(*Rh`A zl|h8LXSd_htCt0P?fXKq&7AB6CwR^lWXf!<Sf_{=sUb<CvO(c&X}rIPYKvB)v5e~N zlO=snD^^XLDUGeC*CA%oNA|p5i2rASptuaQ|C5;G=@UvWd5orL%l}8<o3Qobs4YK5 zXeaJgBbpXU$k8q@mH9E2``v`&`|B+<tLw$E6Zits8qoKh=NDPx4*jWlc+%jw>C*or zCP`%(|M=5k7fj`bB9oXB?;-TE;F-kaT|O~afSBJ1`$!-6kT`?@SZPocii`v^kKn%t zrtd0$zPKd#uez#DEKU47-Ju053-{23A+(gs3;rH!D6et55B+YXx4l+0z9N469s1k( z?_ka6*)bN#tJ^*m;n-bDFc6FK!3F%!Ve)|^_n$ZQ0(%HqqCC4b<u4IaCkkV1{;v0C zW*Dba_qDL?vpmcClotNfvbSVP!iCuFomj>5hrrl#{1{vh^W3PIMp{zl*ushf1fj<= zwpp+Ua*!Gih^@Yet8V%^5&gWGr)cX#7?jK$-v@!lUsDt-st{Sn=wHM}bn)y1sTV;1 z2hTt-zx-)L3=jfIjK)Ef;TbN@74DJ(CgDST;J<C5wSkUKUC_W#30HUpSQx};HA6|* zmb?sztehR={av~&gii2;Pr$@hbj4SMg;FquQ$U3udO-m2VZ}sUGxP*ET!Q1x1zp$$ zfQ&_1oCPmMVVIb}B3{K$=piKbVE~w-S)helcmN@YTQZOXm;i=gtVLn0okWNPa-D=& zkVP$~g(%j9T?k$x8U!(xgfT9oO&pFhs>>s4qCw!IF7l#d1Xz7}M034GTm;2X6va^- zget1zIU0pyv|=Mh-VPR^P!RuxJ4PNH0HQqzVhYF<?}3{*975h{#5KlOUU(uXmKqLJ zQUDNvtO-*UL{&CMVgPU=LOPy9k^)3V)j=%eXQ<;mIz~bEOF94|D#js0a^ha}#a{#l za|I(c{)1gKi9L|SCq7|4qN7?^q(9uGlqCjG^ng25*?nXIHW)%Gpy65=B~mISLU?2v zj)XLd&`8E4DNdv;VuVTt;IPmlDl%7FkRuSF+SMsTSa_u^nxj4nA}ng-M%bYVfQ{w6 zNQ}%#jkus0xC1Y^0UP*HTJ4evT;B_HfD=rC{P7WlNC<^k2#m-GjSLKkhzN<8NE*<k zW8P(xJc%5HLO*Dkfgt~gf-p#~MF)=P2#@%PKxjZnro@UUri(PDUFKnF?nsYRBp&pG zQh8&QTuGL!*TUt;e)I<n&gN;l29kv4k`Sh0?%rJK2Y>j-k$|R>jF1t4U-t!oWyWUv z+-7c~U0faES^$Yp6$y4?h=y<oDGZBh{-8*mXNLeqYqp4bhU7DuCrPEJNZkTo`jHOE zKq%b9H8=u-Wkk1>WIJesDh%lQD5w1KpJsAqZ0y+ym_a_|pD*5GC#*vfWB_bFCX+Y` zQ9<YnTxb9!i-wjNh2~#;(dP*;X!!L@QpJHJ(3iSQXoWf`lt_t2?k1L)25XhTaVp7& zqQfM_fhJgBd*1)&Q8|er#DR#G*$rsI-)w{qtbk~+p+QvXm99^U3KMWXCziPAb$(`& zh-P+rXhvjaj!sDc5NB;FMvx2%c}gA<Km)}XgqxN^dB%f&_9YLU>0Q2M*t|dtjEI(H zOE0WNw|q;nWKsa^T?has4ld~r$_brZiwPhqw?q@PbgHyyYKumb2MK`*T+l47OCg0= zxO~ZAsA6vgi)&zuwkT>eX^^;F5D)2q2mqf>-AiNWi>u%Ptk{q9?1>G1Af+avYY1zs zU=>g_piYV46B5g;hU&NAD!S|{+6_}Nc?7wb3%ZD;u^@}G)Q}HqULuiey;#dyl-W97 z(y{#IvLyc!X$a<81c4+}!#Ugn7n}eNOoMyj!xw;(^I^dqFx3$zt7D960GKM7#hH~V zr3U=Li3GqY;lc?ZDy@DC!#XSqP;44lY%_&f#A4~W)~MtyZ04Q722{egI7Z3xAH2v5 zz0{De<_k3J3#y6&=DkD4IBdGgYZAPR<2fwz>B2wg!zK*mW`u@QN}1DQsX@dnFb-=7 zX5Nw&U#}p9##*a1!N3kQ0Sp8Y(b8-RA%wVm>$zy&yIg@c$U^lQgt*Xam+)%WE~+$T z1laJ+Kb!+6ERNpv4d0wd4}e4e?41(^Ca*%odQKiCxkBFTP2Ui1+(-)n<$&Z4ZW_?k z2!j98;Rpl=ElS`FPT_p62{bNe01L|muHgR7=n{_Md<Zy*f?DhywSo!e1j2n}4J>R; z*Sw?P!0zGftVE#hCTR`V#GV|Yu0gQw<fcL4((a?OYQup<A1Mw(oIu)Wr2n|h;xMoF zs*RU=?<sxcLxAu0j&B<9fZ-+v4j$PKxRu+e8Wz+q7HEMO00Gz}>Is;rf)+1*_Dko6 z5_oC^uXu=K5W(!8Ko;Dn^J*^Vri<sQg#wEL1K(&zS_1+DSOBl+529MzsOSOLSjtL{ zYT<6?5U)D+Und1X`gU&`pc)9|0!|nNVN#&d{v*{M#15k>0w)IY{w@dqpb9r{=KB8) zik!e4$iqL}Ln)|53IEUJyl&|t4)$W6J@^Bds0$UxF8h{(`?Bf-BeCH{;1u{lJp@8Q zB+vpekPs9uY9g+rQt!#OhUy|vlC*IHd1@bAZXUbwlbOH-gKnx$m<mvWepmqoeeTKT zk8dpm8|$$HL68J3@(b_}QrIgAnGgzr%fhwK`^3-u9C9LCauExYtF8qo!;k!AFwbW1 zyGF7bV{!o4s}o&N20aA-jIRjQu?rh6FMkw6!g2uba`)Cj4!FZBi$E|~&OwY{HNXXy zoB#~G01S{uVgN=BL(|LN$GfKN1WTwCs|zSmgAAmCqslTBG>{AvZ~&C^IXnNV`l4(H z`!WcRGYqS2?u76NmCy;Dt=7JB6*}Go8*>P^vnN%rOpxM6^l$+5un7y(DvL5IcW^)> zggQ5nLEL~FxPclx0TlON2$QlWC~{8Wa*#C%I)s8gq$g02v`HV1P%d*b|FQzPv7r9K z34})SH7Xkp8Lkq{-t8tZ*{ca`P9w?A9S?+0H=GGT%Rxj^Q~#I%6Ep#v(j#9@CkezL zpDrR4m?Iz3LijY>07WMO#RSvq3*ca9z>+Mfi}dsn54G?+U$w|)MnWKU4NZhxv!NX7 z^{`C!kf}8ePE)sT#3<#hK_t>PmTP={wI?%ni8{9G7B6HUgk&envONEYGY>Tzyn;Vm zgC~H?zXt3VSZNA{Mhh7pU{|38yR)lM(?iI_(_XM0;L9b+vy=5-INLUE8w71jZAD%- zLbP^OPd0o7Kya^c?ywTLyizQkszH=*&sw!L8cSm@3ql9kavOFv@$i-+L=ShjMD(={ zL-wdqH)dnfPY+ADN|`=8o^#Xn1Shrzd5{X+rc2W|0duxN?44l$BV6);HGpwTy_6or zRIH!?cgBGtc%!}C!(RHS5ixK)ph8h0#Y$nPOTm;(eTcI}wX__#hsR1F4|12}!cY|z z`=ka<*%VHhE`IcbDP*`Xi}hNNc!JB64!rnHS@MPGB^df;fK>kiR9zL-9K=Lb)I|kS zP5rnol$lTwl~D~w7F>8yt;LdCls6>mDGSq;V>nRhxPt3Ikn_TjduJ+$6?pDcPs!<+ z+b4Ps%Z%4}oR8F;-#FHU0gY#PlFoSw`~hyp0U>y!2-rd~REWClfD_p7{pN3k-+~tK z2=}^5m}fXR!*)h|Cqn$d0zZTe1cN_}Ls(cyhwr$F^EPaU`lx&I-F<rY^0}QmhJ}my zhiaydI)<lP@CwK1QiWri8aYR<#gwx+LR*NOzvp&qz#hnHCb&bL7zC&Lp%aY3D6GR2 zd=-^c`?Y7guEV;PQxunb`BGvzP!YR|Q@N=lc$ueZCHVh3Qw2MWTe6#vCr~{Z3iyFK zSVE6Kd5klOple8>g9(}Qcuph53cW0F2^TkP!Zw=WJ!r!;Z1D)pR!L|BCpeyK$bcr0 zLp)^HT{pzS57$$NxIv)Q$Txgd3$i;?mvv#6!pw$oA(wJ-1`ULQ$4eK^;`k*7*Kk?W zag{{PzrYUUqdY|XtO-PTjh71<+6j!7b@_v7p;mDPKs5wFaz%wORo8W8*I;nG$7dJR zm)3uM`C5Se$7f8+JG@#Ry*A8Re9afIr(bhDS9HaTY|)l&*^o8id^|{(4&;4p-IiKZ zwnW@~&g1=T4ZaP<fFyXsJ?tX(UBts4MEm5US!Dk_?*UH7r+uamuSS5Qxy^xL1X&5p zK|Bbw9{Rk>Z}&5yzUrTT=^wt|>-^bwzSz%}a2drx$UYaS%XW1aT3Eh#G2vQpJ<M-6 zlPvz;e`xMZFfLjb-6dq))7Mi1Y)x!~!jyLQD~#{c`q)c-+24NHqgNNcyw|V2Mg+e< zc-IroywER~PPK*IOV^X_G$q_9{AaydI6gplyO)fdu@?bQco9bK9=A;aAV!o3@q|PZ zCITFU_=2OviZ4!x&}Go$i5EH~as+8I;>C*-Rlb}U;6%-cDrdT!8PR5dmo8;m#0V5) zMvX)*;!LS=qRW*xYgpUF)aTBnSA!a*Sn>ZR$C^hkcC-r9E6a^yjcR;KaqP~HU(v!H z8`mV&wpX{JrFlY!jc2&*-o2`~t;(-8xeDgF69g=3fwj(5s+e%&$9K^hHfi(ZM9WlD zRC)&_@QbKZ@%Fqcx9wM}iA#3fDm%dExpp<H)u=kH;LxK>2j4q+BTCv6Yxe!il(=H& zElq^XW$bx%>({a8)F~7w_pEJ+Ufh9&%&2ckvZuF-RDFB*@86$bqeqRLQ2YYH*Pp%z zI8pnZ>+e4RBNA|;-+-8Cyz<T?(81>ne9$@sC46nZ`tHlG!q-|D39=1A6s$YwMkKMQ z=YTrlhiU9thKmptD-p&SX*?kXKfM2u#~x-5fsIB0OTdGk7ikP~$OnxiG9n6jTCqhX ze?(G9D5I2!Nf>R!QAZwqgi*#S!4y$D>}2dR%<sZX(?P`4Y}3sL&3seNIkRJv&O7nU zQ_ns5?9<Ob0S#2pK?yC?&_fYTRMABll@Nt94*9TA_)6Hqk~qhDG*UGyz4S~pCk=Jc zFG1W+)ILew69qcri6yZUl(3~8d!#u8CHB-bRj?7(fHFMARQRJGQg~}?)mBe9aYJ1L z2zFQ$!y78qv8LVc*X*v<6ITbB4N<3TA!2Xara*O0*KzmkR=ab{{ju5#qgCvLCERf} zF&A_RN02cRc@f-CmAwlGYX<-HDPF-y_=BHFoSV1anobOYk!H*(M29#(Nadf6H^%1+ zNjoUxn0v6Xq@{!x4tTv^|Gn$o_o7uf#)D_1d0lnkdzrwPOT4yPovF<VXz*+fnq6jJ z1{Y^{mxedyyJiT68sj1wctEa(_O{)btR@%e7i36f9rOf?dTO0cxWbxZ^mt<kNlS1- z4K38@BA5nWqnDRB?kl7s6TlXmY?oy!Dr*z9KHTf30esqMnXP4f=k2nU@n^}6_O3mi ziS8NQq`SquRM8ucL6K_wvFDmPq-F1fD)y-(*^4sf_#c0q@ks_ohVdqKV=77kj*+q9 z<OLIa5T+e*XgQ{wRSf^WcJ}~$w+DC=5*ntRa%Mr#1Q%=}#~*Q2A&n*_UhzGhS%9eB z_HlIR;ErZ=EV&|lABzqTeEhA62z4R>mS4RtcC(Al55&=<=#2$2CeXnCJ{CQqgkTh7 zJAn&wk-KF14}b#f4$o+IFvkJyX(9BSxI}ou5rJ@P-f5u(DOa@X#L#fxVp+UssH~$E z&Syo-;RkKV!V%t(h^>Ph40-supy05FOhlIpe;7p00kMcw)Y%Ebzz<JoVGM(K0uq6u zf=<Bico#W=5v~9ZSx`X=O}I!6p20RXtf37jD1jN`!HPI!A|9l8K@Ze12|x716Mn!) z8Vnd7ILeWZb_D-}I#8j8Ja_{bK2gCM)G!7`xT6%&A%Zuqkq9@)p%FAeqZ--RgcpQ{ z9(o{yCi;jFM9kv}Ct$%SwgH6MouCENIUX1-IYu3n(F7g%Lpqw#4sEDH2*2D3P=4Tz zSQsZ>HVDQqmQapE%rXfs;iWIZXhbVUQHbFJT@_cDPA8&}oI-5b;+_~zbIK4}Nff6$ zOK2*~jkBF6QYTXI8Bl?msD;}a*FVb{P7pp0p+8w?L+_bT2I2u7ZO}mwktl*(RI-c^ zvs!m*01a1Mlq*ql25CId33eo*2j=KQOJ8b^KqQhVAsuOSE;55%^ddUOoCn!l(o2J| zAQkL*f)4+NDUpx5BsA*)f(|?|ij~f*gCUItF#`}9_z4Xt8U+SNT+$eQVc`z#Ae;$O zFv~CA3<o03!aYbarRZt(R-RiRLH+5_gz7AX_?#yTtMXTS`c<F{WoQlc`ofjj6PQz6 zC*lN~SBT~?vU}xfVWn8vvtIT)2!*G#?mAB-!mzTPHLT;HxX^d<BnYsG2QwC7J`lR# znn+ygOKe(3n&bc+q%dO`@{tB2xU{8#;DJnO3Y6Reg$LsE$8-I0$P>sw64_`+Hpt-& z(;%Z4RBOp?(JGo@VllWc&?$A6AX5o;01=~MA#HylLE7^41SwrdGoR@aA3&oP&Wzc9 zU6KERD4am924k;#Q5(9+0yKu^+M!@cJK6kZR-ybPY&;>X(Dbm=!hp3It_=E52@<rz zCe$HD+ZkGVE{?^iHSuL#>{!g27Q{1NF-2a0f-Zo<8{ud}g}r)FqJTF5Hr)<yJ4qAZ zrU9loaOrVp$}=Mag|};@!j+>S1QJl99-hEL7j&Ur8zAEscDV?65fmNZ)*%2L5YiL= zuu=)8021Q>0t<ue%@zd185b$RAAb6w-{ymL5sl86e{m5FAOapqFd&`nEKkuwv9t_U zY>P?s*U{dUiZ@H5W<y)zzP780s}+$7r6}Wwk~p$>)wHD<YvD{IZq!yZ=ZH6pY102n zT4|i+aAHM$(1-R_!<~C0GK?W)9tP9S#5^;>Kq}Jhm=q%^Z8S`a;^Zhx)&w@awb^b3 zF^xJSS&h+d##Ty|ivSoXX%^#8eewfqm;x5PI7nAvL6UKbvDs#%;7UzEK|5FE1V#A7 zk0m1TJEzFtZE%Uen~6bZP}2k=$ai4W>1j<Htk`_rCt^W9>rUTH<fX24KAZOIa|Z0= zw&u94U##n0yIh61t{i89DbFv7SmrHXEXYqB^cspb)+TTH5LLeH)trG9bDJbjLHIg; z^dUS%p0XM5n8!WF65AKi_Uue__2`rU4fkMM9QI&Q6;z@gllXF&L2?9ggmV9sk2u~p z!=VQ`Ji<nm(1#u+(T-RQW$oFRIt>4}2_Z_I>fT(!J#L|eO_CxaMD@ouz%pigJJj-+ zH>2M8#*ac&<sykUY^W<e&|M$avKN+_jRBkb8{_r#KNmVYgKfkNZ=CkB=P>QL9sFT? zxb;gMe#lGP`@*u`(6Dzt<4`cX=a%CZPvBfebehXVT3y=RNx>be(GX6Ur0XX5y7AxG z{huUcAq`P{0B8UT)Y+pOt2hX(UeOMJq+=ORjSdoy!5`c~8H6A-(jfrPp?sWz2*@GQ z%!z{T%Y%r*ymmqR!Xo;bVSG42mmop|=%8Nai3fU1w|v3_>qRF*hIs!h;aecEnXV7@ zau4VzYqR{y_b_V0$_cgd%hOg)qJGYWbnUTtZugYWomfrMR<FcjFtHMBhdONLnh>2{ z5C<1*`A`nlBu7~~Lb5C(0O&;)giLc>EicT>jLbxz(4;wp;w*-PF!my=M8kYIE+bBZ zDl}jY7KU7Q!ePKr3jqf?2*)Fi=-y7`4pYXo9PETj&Y!A-2_b6-c@J71G3RCov}R`Z zo(Tsb(Q71841)&v=5P{~h+S^&)C#IxUN5goaSku%vq}-hXmCvQP}tUx2f0u}R_Oz4 z0aH!|BCZ4?7Q{RTC#(Fx9Y_HNoFf<AVHch4(%|Dpj1d`oF<1XE5l~1+Kd#X_kY*bd zhflImLb`Ets?k9-<)Wt1Dt=K#Sj0spqEg1sI?B=1kYo$q@f-n09<A{k#nBnHksF1M zA5ldgxkVtcMF(d@B_zcjTVp1QB^in1h$N&T6%t@3vLai;A~AB-GIAq1vLik6BSA7G zMRFubvLsFNBvH~$!f_)N#{^V>4>*Au0dhZHGA2{<CY_^FRDl;ABm=f!7I3mcG~f>U zPf=>@SAGB*$c-mqgjcAfb0i{aHfA&~QFJasqevn|oU$pBGIts#R%WGEP@*d(axAbi zAwz^LnX)y&l2&XbEtRq?;UlDQAxh{n0HpFCs8S--(ii{5OH%GKJGOF3{t{3Evn~2E zA_h}Uez8qjAbkG89hjk%Oc4!{;suUC9=<^i)ud|@kta033ACUSMq@39Ca655_oxuV zOkk;QA~QD=Eg=G5^o3tu1T!_0GZmvlvJy;iGd9(OHut4pt^@zb!5-`fGhkCU0fd0q ztVUo*c0zMBOY=2zQzIJFBcd}sJku}tGChnFIXy)%T5D>kqCAsIJ7Y&VuT!ZA#!a#_ zO=wFQw15omBNBLW=L%;dN`ML0%1ye{6p@3@-XT3>(G-P>5KV0g$%V*Xpg*k-BCF;- zX@Wof^EwhVO&;_@+ru;0k|B}c7W9A(Y@vV(1492dB&8g1MpQIGXo5fubVL6W4!?6I zT9i8})H_`iJVSIuOH_8+A_fQnb+&<Ogp^3V3nFgxL^;$w3noqCGfdzMB*yHk5W)+z zhkM8d15<|^I034Jsp6&sFN0w!hv_ADr+0oQS+Zw)x+egVXL*|Ec_1Po0>DkXX(*e) zcevpa62yHt27VL@e8h)*NaG@4^p{K^O{)iZt~5*EGyn*7e9Gq_Jb(~bgdhw8e|~9y zp0XuOXZ}_PBPP{QUjR@yW*o@WOr0rIQ)hJo09A3vyvkHB4YW<QR7o+_9yC=WOfVJ{ zqf{$309;jdo>O=-&>p;02lBE&nSxQ*^iluuG*&f+V`eo4((Xf7q9S_09Z<t6nl(N3 zlu!M%Lq!TAh`<;rq6!WVSKoA8{h?12BwZ<wCfKzPl<HiU1QMJTBEl6rD*>4(bw?qh ztz4l4=cj%=g;Qz5Q&IIF;3qWf0d?fn7l(&rj3)r#wPLq50J`;C_b>~v!4OiRNGU>O zN!Da1!eAq!SYh>FA>v^L)m?{iCiGNcxk6aY2mjQEeJCU;l>t3;_8^e8OTScFbCp<6 z=T)DxEvEE)f`K|p;E^I}lD_JW+<_O|fDMrC1zOYuc=H81zzL>+G<C@(7KuI@X=))! zk|^nq0%?#6>5$mAYTuTX^ez<ofnop7D2>*rjhgXWE-8~Xsgo3qU(eJh(sqvOsBYcX zN(WbyI7wsipdSFQAaYEtYzdb*a1XO+i@Ip7BDZi&$!}9hY{}MalSRq2h>N_abWy2| z+RO;3vvVESYICe|FE=YYPc}z)a<Qm&LpK1j?iRKd+2SX4s}mv?cWtTmaY5pg{<aAM zKn6nL9<IR=@Jn89Kog|vHO97VmltpCV{c`Xfy{u=W>Xg~!@iOr1D+Rm$yaX!h+*BA zC(^fRH5PI2FML(kFaItMB%xlI;so;7FI(xAVhIH__m*<01f=(LLjxTqAr3TQVeANx z^oWm$g_R6}Z_Jk`y7znALI?j=0GGVWgi#nd4w!X8*NaZTf0ws!V^@`K_ie`lZxy&+ zf43B9;*;o(lxS23kN_Hpfoyu1c=5=1xi;Bu_^X2Vg=f?%rZffyiD7iA7ihw#k^tNS z;4DL6jP5K$`>tOVSENWPr*^8R0F9-H>x}~;i`n?6enSXMK=U*LyguwA5;Qsz6>ZTN zr%WJ=x44a|B0<M2*>pf841%fxD5O?{qAUtjgvumZ6WY+`Hxie?DvD}sB0xccKzEdo zW4MhI8L1d~HyX}55|ooIDk}NxV#4-C3zK=#xI*!ArwTdH0w6$XA_yd*8qVPsxZnhE zU>a=aA3WwD@Z}%$VH5x4l9tW5jspOX&vz$ISY<Wf4-N@Vp#c|8fRwqIn(-I~xH%2H z8Jr^`n>{&Ec|wx`wm?r{11f=+1Av|V(y5?IsvK<zstOves$g@JMw<zbO$wz{DhZk@ zLGXBeof(>W@&zbJWjA7?lN6sDwvz|6Fh6;q#o3Sp00wrT31C17^7*NvO3oxAL5a$! zkP2Ye;R?J#7ML>t64az**+V}1r(8Knoi-Sr>mSbHXqyYVp6ihMBgxM4YiHSk_}5^T z%O#51sF50up)3cS3%U+z?VQ!z%1Dp9g}ST@yR_?YofVJ|Rwt%fs}V`8uPeL$$UhF^ zEC+cP3?jV(0aX8LqP1Qtwlu=6$@;4?Stc}qf1~3B_!_o2)0g+xjMw_8nM|&~7@XeF zIRG235!<yC`yfQH6lx+v8{0s0OClaSx)7<C2RbcwpbVxVxW)quU>ggxKnz@TZ0+-z zd9tvl`7ga1NBu}6h`>KiAPdyDw6~hKVL`hBAh<<gxYc(;e>);{+dxA*o)d(;ns#8K z8=lE44Jh!g)k~nCltRWW0C=ljyPHBlAcG>pwnG881p}kkd4=8cxA$7J{aU)8dP1Mn zxDn|D=0G0);T}qXX#cXi!KS+2TDxk1yOLC5{lOrfRlx(hvp?IH{5!Mzx~6AhKBvGB z>LIVq8<qdAj0&<Wsjt$Pm>QgHWWT%ZT&ax2u}lbH3Z|}F#!b8c<In`W`q@OmAXR`8 zw8#p;tgKu7tT96DM%>C~e9OA*?X(NYjwfu3>CNJ-n;^#|bd1M*tXYKI6Nnt{e4Hqb ze3Nr*$9fFmQ2R+=bib>t#B*HAZ8|lrBglum$U)-Fx%|hvbwETQYAM2<ZTVm&;>}Au z%fx#pB&HhHr<P6t23`OLF6LD#B4Y%Vfdn0%dmB3tJR&S3Y^G+(;XKRKJGl?y(^DbT zDPqYASkT*ix2dwzJDo<ad(GO+%2j&Jtt1X>!_<*%)d{WC$!#_)-KS?lz99nHXI;zD zyvzSzow@_m&}SSXZom!PKn<S2z+-*Q>>SMT9MSAzg5R51Dx%xNT)X-lBL18@q&>%L zV$0K9FyQM1C@40)_ze@8BhHe61FfmqtI@E=+koQUAqJ)*LfZ&FczC_Xkw^W&W!x@; z;TNsZbVA9&%?u}d*u5I3U!adoK;GzW^K_3p8a&w`p2tmn-5eew{@u}3rsR!-v0J{R zq{cXGg5yEE;0{hO%DdN<TOwc{j;Ld@vvTGm!rNe3)m0-vQGg9z!5^-{6UgS6lX;mX zB4a4pDvW-JUtrT2XqB(NWWCF|?Vy9mROuC-Dtnvk%|2$uej+BmX1AU~tc`52o@)On z<lV>y<m-(o0BqOQ-qcM>NfTPw?c(k!0_-IM+3%UY-9GDq9(h@w(Hu=8{yriS9wJ^k zGV;C?eyZoa8r_lrG(<xMDwo_r-_(U(-F+$ZCj#d0;%Rxn8a$iq%uWx`&Z1C2cjG`2 zFn3<=L2H}%-iA9KP+{+mN6Bsf?9%R!T<YLuYWZ<L?Q|f`dK~Zcj_(5ZBG#_$puD5P zpdU;D`HM{bXhQmPUkAG1?eH9Hd0|AmmisHg@TiW}PJrp0&KtCN{l7mt0HQ^%aC+oC z3h*Mpi7fF@8GLc#3@bHS@_6eNAR`WIqB43^$k5@V7bVc#E2byTo;Es4m~sEdOAi}l z#u5f#k;>mTn;(0ss8nwfmM*%SL6k_*BE}Sd`mu^bh+NH#3mZNRPy?E)k0(l=Ou15r zMvfmv*ecfM1kW8#u(-vdMGO!PdlI>klgXW{6FvJ@75O4XrFS}BfPiJRZ%>>$c?S3a zP88pdHiG#Zmqejglqy*Yeg`DL;lu$dU(W0ivgDp8!t^tB6{OXXg6S316pxfm)sq7V z*7sCWyI3B7X5-h#;|YNT4W9TMdURJa@t$VN{d{nA#4qUD#jAHR<DDK+I2ki)-IOQ^ z&7)V(J|l1CNGo1c9`fq)fdwCRHOX06ie>a$aKi=gQ&2+{1<?`YT=V}OZQ7yWhdP$% zkf2aR8O4-SP)S7+fMBr{(M0xPG@wT=1oO)aCZqt#JW0HOf)~P&a}PJ0WaI%M)!d`a zG&Q|2!X4H4V~;kRgl57CGH60hJjw_WfDc-kfMu37-k9SiCiGxVav9}dP9P_2iKC9b zX=lP{2{nntG5)wSWdK>;i6sr79BEHCtGJkFC{Zp0#0y!ul4W@|rnzGPdh+S#3oq;d zM>FyONeT>DzCZ*y;{btWMt4$$0vvMsQ_d|<Wb`PKk=l7eoO4c@kdshKDMYEKrn>4_ z9kKRgl(eGRC4rS*s!gUDX+VcN#HHv_t9|~dt3Rl!no$grcys?xG9XeFEUqtDxm8cZ zs_84VA4%F*k8;{0%_X6!YpbwAd{&s7>N4x>M<vXG4;PLF@NYc7W_0e3(22%fMg<>C zFu(%$MT4O65L#=vQ=(ubj@WSG(Z2!nBv?9fo}<dV2zB}?SF+N1uXYR@6_}AZa-!D4 zZn}$PyejkitVYxPL-aq}P>I9PMIRmU$fTNTEw9RHEJUp@54&iwDVBV4%B=3`>YorP z@k%@Xq(dllCxk#rK6N+>_OuCU%dNLlC47PgP+!|Cw7uDB0zw{1>KI=TiJ;3=%BdyR z;F6x8mPezmD`}{HLGJj#fCoMx=74W*`A4DRnGw67b1wfX;XRq&Q<f0@U4u1^O0F*J z2x(5c=XMef`M|bA%X{Rdv#vTqy8o^2@W2;-f(|x3g9}f=<G%Xu$zR|5_0_-rI`YYT z&oDK(TYo$Civ50=__a&_xLTOM(6~qGI|iNRhRW`k>AL%^mibf(?-#}BPJg{I-TYGY zyXh%UA%80#wCdLv>#?hM35?(E1lYXiMK5y$BA@n>houvUAQ#5?pb1Zi!W8ypa*`um z3lnucJYi`ESRlhFzJVGQqR@pp?4b`$cmg))K@D;U1wR7u!z3zki393EWSFQuCqfL0 zQtZjXK0-qq;t+~lJYf~Ph{7v^QGh}uq7jieMil=pCvpBuqZ`%5!qcHnR51MDolfwB zY1m^KTzF&a>gdNn`XvQ^@P<6>!Hh$IPmqlCVF~a+k3KT;k&y%=B_-(*F)AdFd&FcT zEeT0ae)1!leB*NpdB{XAa+IKBr7N{JM>?i3j;kDF=wA6r$kh^;yzHefJNL_A3iF4$ z9HudkiOggwbD7L+rZb-j&1gz<n$)bOHLr=yY-)3x>O#R84$($#_OJw7u*5F=;!SX_ z@Rn&Lr#XiSNO8&&nsM}FJm-1LdMXnIbcjbRdUFCL*rFZqI)nw+dCyVaa|CM;<$z@P z5fwCr6#Ih~KmF-FeRffz{h;XIcnB>Sj!yrhDI%#LLApbc+S8;-OsE?Z1yRvW4y7`U zr3nE^Q)IfdrnlTFBU$=Ml`3Zm&eEL=bP*0gj3E&Y<taN^dC!eZQ86N&BMJV%k4R|m z1VsHOUjq6Ha@YeK=Co;Fg20Gon4=InSY-#waEyD9^&?l!s#DF1&{4${mOg#sUT67N zz6Lh0PhBEVxmZ;e#?+*TEoo2t3PPd6F^(t&>R%zd(!#nju^E{`FsN}*sZwRKnpNmi zMH@qqzCZ@4SVs<_<yp`w2MM>3i7oa~hgzQC3f4f$8-`#$uEHb^Ml8f+R@>SfHkOW@ zYc6L0SlZ0u^`@4aZb++o-RQRTxrYCR;a(}b)8$h2vD%HSWXG#mnp*ar+)bl+rAxXK zQ~|dq2-OEtQM7;f!zd<@0V9Ut4J0Y#MW&J~ClcZVVYEXWv^YjNRuMRr_V>R5wudoR zX#yA6f*b)5hbj=#B(eoK9kT$!ee?T|ap<4}cd*o0%X(DtH3<&^gVhO$ppHnmNRFJ7 zFMVC7%P+ZOM|#Z?9>t-^k3uvA=}E!~T#yTAw6#e$&M~0A3(>?%R;bu*rFlumWi6*S z%VZX_U?Uvf#hw?i&TTWA!7SnG;*`8{c43!a$Xqy&RLotDbD7^f-7u>+bbg*GcGnDD zI~V%UFkN(`6`j*WZ_Z9C=!E}@uY3X{Tmc-ipn?>dfTbEd10`x$Lt0!?oj6=aH$70t zB>d11Pxt{JX{c{iMNMi`V^{@iP{SA$;f_)SjtJg>&|MnQBu#VL(@h9WC2T_m+>jyw zC_uzKo^S#djA9!=u=RdwqUDTOx-fe_!3{J)Yg>!71Aj<IGuojIRa6bTmHEXI%5ey5 zC&9=90k@#_3~=xA8Per-^qvR)!hv%Z(GQJupYNQ~Is;naj3)G)A5Cx`8v4%^?|8WL ztX+^+R^SQ;Il>#R=73{-<3;v3!xOF75dx!fR5pQB@pLF1Gzm+dbw;5)&<S=V0Ze@$ zI+)CK@K9?-=e9;*qWb@RlT@(d2|6guM^H<kN~{A2I`F_Kgw9nfXC)SI!jfQAJZTxq zoaR|N>Ob_c3CJb(FiFM29fot|TjD?~S-1x&LW$<HH!kHCpLD`4K5@=^*^UrjxW-}1 zTsa#4@Cbjo$@6?V6|$ViJWe{s6HfWicV6Nq=X2yK-*GQn9^_7ybms5+xr<9a<MlLi z=Lu`(kEb@vEBb{<Z+@pkVLAukAVmnnkdHJFAxuZ-L7CJoL*d_v2c46FB(l+tY;YJW z$moU6`-1f~5e6d2Ps0mlu#1{3p-jx}03tv$`V6yZ-A*7wDB#W)m97XQCjk07<_%Hg zk^xb00-;1l?g#&WtfzRBcX*}uXR>r=rl)w1M`vXQbEe06*(Gt2wtE}sc@lV8V^)Ef zCxVG*dkolehF5W@_hqh!dRqowbL4UHhk-2UfG!7dC^u6wr*n7$d|7fRphJAZ)+FUe zbY#*8&WCijb|of70+dh>p0FSpVFSp}A~qF%&{2eL6963mNl)+xLdRS%(lT1cgEE9U z_l0&MwH(3V3=Z=LGLm;jR)xN20vdn_@Ze;CLx%H0cw=^fH`sF4rGu4MXP0++FW6@2 zb%F<{fgadityg+9=!h^_M_9Ib0Y`!>hj=`dffeUmi|1JE6oZiHX5@8OB=>nUn2II{ zX_Ux;ifI1=mG&us0ysaYbck{%J%=Sgr-wwxIb^bgp=bg@$bdaDLe79Z_a$_iLoTEw zGnFPI@?j0801Lff6ImhxurL*dMroE-C{=Y|+t4^CPz0aQ1|h^`V#s8l@>S=Uj#$!; zRRd)KFnA`gjf(SnuE$=R7kdv^aHN-tn75Dd<c*2=i3=!-jChLcMT!?Uh_V!smKaO5 zmx-zfdMww88Tp5w=ZOoskfo@DtcPcy_c>|jW(j#-82E1o`H`bIaq@*6GK7o8*n}a3 zYSw`rz&Iw)msrLaLMfsG0iYm6K@|>SY^BpA%+Vju5dgpu2f`5xoMRj_`DQpqWLhSZ zeQ^IL-f<Usu@@OJ9yY;M_izhZ0BqBSC1V*l!o>^3#Sg}{IatYw3)qi1sF9>qauaBQ zvWSqFNO5{ugN68#3TTKMSePn#awT|)jLC5zXnPc>asqjKlgNq;S(kXJnI)%}r*nS0 zz-{#<Dm8g1cv3Sz!VNg{0z4T2!U%mZ1(Ysj0@C6q#zQvk5CCYybqaAcF=H|TfHI&` zIxGV!cfw@<myI#?nW5Q>gzzpt!#P01IW$r!{vZxZ0yxsiId2tLWK~_q34pM;k*(O0 z82M!^S)PMNfqaE~0m+##DTyX&nI2h+Hf3-Wi8^;Ca^W_EHCUgS`FeJFpQ{Iuo9X|G zx0iZwL{(HlRI(61jR#2Y^HlqjW`rm~HdZ_YBz}bwL9w$5wio~!Fb8%8U98cd<tRLL z1bviqLCOJv>(Un@npG88k%TCElSgv2LtWQ3kcgOFh*e(g8Kk1ah~tG`jOT(4_kt%W zpZnN=E%c%qNLmkNq!3tmAPJ?gcao?mnCs-FBPUasnV*_9q`;E`%~A^h<fPnGN?CM6 zuSH1ipe)xD7-*`dfyhO1I;Z&bh>^&rQ`$&=%6K*Ukngojg4#uf`a?MwNa=J?v1m=2 zghzVBM?FDKICDad3X^4eLYI0@_@t13+Cz%!L!{b)Njg~7WU4^Qsf)^}enkH`;Uua8 zbU7&$t1&c26*a3rx~sh!NH*%L^Mt6uO030dtjCJ1$*Qc&%B;=mtj`Lq(fUfO8mxw@ zPb$C%AR}GFgss{tt;b4Es_>~ylmS~X3*Y)i8gK`MGEC_ttD5JS*7XC>pp4_{MhxXp znB`eSlYl<jrN~G^?^>$(dQ0<Kuh=6{1SJgy^%(T3tI#q+`uIWn`VakzLKJJUeq^u@ zyF^)m3!mh%0f4b8BOeYs8Tev8A*(|83XS9EOeza48~Zmb%S)xiOBeM|%8{@Ibx=Lg z0vq-Z?!XL<prskuK}R4D-@u`~6n+TVIU3*uTF?ogp=3kKaV@|`=UM++e|2-~g0xC2 zt4EboOVvj&@U=^;Jy<KT*aNjvOSLJKH&Hva-S$H@pbPXsb-;7B0;@*z^)`&;W4YC~ zb6Y@rn{^q>6@IHjStv6-1Xf~2R-YOKumD<)F}an?8j7p8NsG1t(6p>%v#%svUZo;P zrBqC%E-Ru8T3~-!H5nG!T(wgIOwcz>OBN-HJuu?3PuiIv*KhvwsyFB>p+ge1`$4F6 zT(eudX&bO`tGiaGLeBvSyQ@P%unXBxNx-ALZUl5K!${pbFVaiB#ap|f%Ol{pxVL+_ zBn!8+Wn1(GEivFDIuSqednDx8F6gVh#@iF0J4)uuO0gAMw|oCiy$2ChICIqI1;fw| z<uD7GVFIPn3`mliT{mv{m<tGjvE*ha{smx2a$yS0zz&=l3ASJj_F&VcuFc>L0l*EH zU?(S*Un-_$8b%J*nKFR#yte4U6&AuZGQtm>5jKp&;n*X3WH$j2W3@tKT<}*hpa^_& z4R4cS8&<?GAj3tYVjIj8P%Oo7lg0XF6kMz*L5vzlY!7y06F{RqJIpGuuthEa3*2VH z4CY{~kV(@Ey(zE~_8I^(Fbd8v2YB1F9zn(-+F}9r!t9Gedsi+*Ag5GO1;`=74J^bf ztjO{b0FXRw3NguIq7hm_N_uP)hg>of>|yNd$jj1VhZO(0N~{a&Q-A>z#wn%)f?*Fw zvdG5Lod<@<EbI@v+&ux%149;ES%3|OkP7$<63M*GJ-f=;62(X|#UdLF{0hCbjCMe5 z$*&cot^8t>LBy$CD<XC_CAKj0stlPi&N=KG)oBkET*)LX&0kC}e%l*iykBi(z)Bnp zB~$`npbn^@1{N`ME&&s6FcUQaz9yiyFVF!_Fa?AQgrhb@x)#s_UC`bzbFKDju{LXI zur<$C5TVcyIu-!R)@h$Mhj_wkz6NZike#Gl(YbbN0!`2cZ4<rrYrz(xc;F$D03y|P zZP~VM-Bwkt!4ICG1!FJ>t1^o`9n;CSX)E1q5k3FWZ>tbtu+&Zc)C!@}%+`fQ;I?#2 zFgU%@Glv2|9UR{hb&YX78bHdWg9Ok33`|i;9t~@<mTn<B*MA%e_izo4P&LV;0eFBz zgPgYlgw=$bb+%DNC(XC4VFp|X%j)BQNss|(t<$wp(vrQz0g&0sQQ3dHEOUJVjjh!M z5|z%v6DLsGkF5vMmK)S&ZP=!5+*Sf%&C-H_4wDcEn&7%QscP6!8-_q!lC2!)*4NOY z11qp?7WCZFP1%;M)J*Nv*rwWMooQ9gY$U<i9Bn?HP1~LP(mgHHH&$%lLA3Z%*TjGt z=N;1oLmjuE&@|B!;XQNL?bXZM7qkeyVD10ipO!oZ90RbXRp{3XO~P(6BET;Yu`dt; z;ONi++axFpgiE(`CZOO7(cnYJd?AiTit!m#QiT}dBEVNuPW8JNPSb&tb2}%pyTE@R zo_D`ng~m{Ih*J|`r(<K+(nf{{=)e*zPC}9MgH(aCR59d5{y(0pzQ&`wD%0Vq9fwJf z<2#<U3IUI~`_}|h1^qw^>d+`gC*qLf##9jml28rja0^^;0!f2n`0xcMa0Ent0*YP8 z%CY3)XX4%GLCFK%%&Y-_Kx<V34Y+UuRsP{6UK)Uo0){TqR-))0G3fClz5$*cyNfR; zumP1IhZ%9{S+{jv_jOLT1Y!pbWS9RgnKT$xbK>XchCdf{Ngx<o_vqL-#Jccyakonn zPThmUWXx>o!Crtweo&ikb(j-=jDF<_0RubG1Ta7)Yf|c7Cx##KyErj*Rc8~oeg)nj z3!R%0zuR+d_0Y~PBggLK$+LE3$rt`RAS+@m|8NeRAQn7u!`5OgwB|%a7~u{5&{!hZ z<Co#Ckazmd@BN+zW*!Jim;(dy6XSOnbo9A6WqsJEef)KYG@TLB7b*(B@adNE*+&jW zAw@0{;WMs&?1yoXGr94=42!^_{dIjNPZ~*n+Aa(8upsj^&l8_p@X#yr{O<3Okq|4- zKqfTw(gP#=oDmMMgnZHTnX~@`WiSoNM?-G`7jn@8un;|YPRRT6*C?wmDzp*0VG~3U z84JOMMbGdPpDzu=_L7kWmOU0~?-5nM_hm0Lt%3Jx&n_qn_~wUxEkELn3xCPjn#D&I z<)<@I<`EHXfA}Zp!Cvgdp7-q&^D~dOeBbIB0r&opZh0;b|8NhbkPw7leyer!8*eDx zcTl+O4@2S+B@g>N01l-9Ilnvl>DKu`pSmof81k+dsyhXKP!DKCe4R!G&mRRs@b6d> z@aWs(nSN!Zc_+>P{LnA`A)bWnHy~PA@wXV|2&n>;u+&ztA+@r@oTL4r!u{PJ{ZAN$ z3t|*Qm=F)$g<l8|f7t&eF;UP&fB*(foOpqv3n*{l+L%y5iJvDcU358naS(?!Q3es7 zNCD}cju#^vK8)A~VStaKUXCnzGG%}q;ABzZNhOMqoTXB>&}HoAOr%L^nnXF1hOTz> zxTNf1u1^lDJj?|;L6YfFgh3cpOE>FDR~Ro~=;#{Y$UT2?<MJy67O7X82vbzD2?7>J zrGf8;$(QD+UurT^QPY7_XHTC(_PzrWz%O9LiW$E=LD(?onoXDH4KTTK=fWvbe=g1U zG~qe{I^d!AL|~GaF=v{#{P#uBk+6ARJ~6WRhg9Pl3r4tN)VAd>okO3w`X)n%5G9Tl zjZpW?oI88|M0o$hjT<#jQu0P!r{cwo8(-K!_RH>GbfNT-YWp6eMvi)LN2UNo2*w!4 z#N+9wuCi;1xdL+mCc4}}f^a4mg8Aiy5Jve1h!<uEhOvU$qR*%oM99S`6cCvwi5G}6 zs-O-KfhUO*45|SdR}eBt#LWU|tExT@!f7kPc$=vpA9zekq?c55=Ag@N(!fT7jNH)` zg#rL_xwfRtu}Tr0L8*lmZ~DO+Q()<(qb?OXNJnIh(Lu_B{0iWvCb=x=r5bN6E~y&o zT<*J>0>u%bFOBmu7&Bu`bEG0Zap}SUuDo%k7&>7mh-0F`jY#meDo#_}5JG{CSNyrg zlT>k-<{$rBX~pM@9eSGL4}8RckvT;NoeZTaAv~edOJ72cI?l4l#}0KONvTmGiyO{2 zA)SR*T4hsV_9ax23RW-I0`Q=dO#@gqI^I<1<VA$mZ1c^R`rNHtG9g9i+<~qIY^HT7 zwKS>eC=8%rfW0;Nr9$mQXxw_8e2Ln&0??tU7jA0z-6W($s7mAp0&6lA@aTuX6FlyX zqZ*z;FhZj!9(1OL7oN%8aX>^0(F-%QF905_DdmI`(72}<J>uA-4INN0nUy#cA;+i_ zmbix(H`u5X&J(hT2NgLU>1azI7b^Pbq?dkyNF%WdB*_3MGeOUUPCzppJyep@AQb|r zXA=J`0K6`YeoP5Fr7cAw+GwPeW?F?x{tjHe63lRi7d^B#3L(g|;ir$X_ZIRDR@BfU z4{v%20CLF%7xHdB!e%JjuMa<gbkk8+-8&2K@)~Th&u)Ba9V)*(^Q{qLAr*hNu`967 z3O~H)dIAxG2ykLq+p1Ez5|VJk#TLPqV%nG;p&gvSVtp*M5Ti2A=8)>bu4@;2*cXar zZu#cH`T-nK%nTtm2!=n#ft$sl&2c*L*G&j$z*NNxfCBuU^u#uj-yLo*^oX4%;z0^E zP4Fdq(FfEd(T-TWq;sF+4D4j*FQS<t9#G4~2T6i2-)LYDiEx7)GT{za42plwdkOyv zoG^w_tYZpMNQn`Vs6-}8Fo2xF-RV--Ec>a(g^x(!@R*jQN|Z1TCrlyh04KN;9Dy9y z;GqUxg91OO!xB0$<K#G!f<N>FYJ`~D3xt<8rroY|R@|LnPEZ9F?yPs1^4WSI@uG%! zK^Ww?2RAmcFG5t~9@>}&ibimUYWTw*+Ta8bN+bhKkRu+-5W)-Wl@NoVK$4WSWB}NP z5Vuiqgsz#}UtoCxBpf3E?qFp~_Er!YfT9`!utzsmaT62JAQY-x28a>|C0S0gl9voX zGDF$SXTD$uaA<}+Hc1K?Amjx^AV<zZC#L|Q01n59OF3@w1cZ1~l+L_PF#Z2Q%vK5s zm8xW=Jn88Vd*YLK1gg$JSJ}#J(vq7gAg4LCflh>IfDZ0RA*Q-H&3IJvBek#=uf9Mk zT$(DMAgv~IGRB+}$WJ}SawseDr$51Hl%q2#!5r{06{Peu9t@4=EVtPj%B<`rLM3WX zfBHOWQd4IqsHqT807^<?gA*@tDp1Ll4tkzL74X{=JKf0{e*(0DFGv9>E6E9lG|&Tt zpr<{gaS5{Ow4>gcRjsxm1eo-dR(}mZSFdBxdft;WRaH$|iy6_Qf)T9#5G(xj3C@h2 zKnbsChd<I$P1A6Q68VVDW%(I^7)Zh!_ee$`i>ggao<IZhOsql$6QciJYy$`a<e9OQ z0?mwdgfk3DSy8~!l^0OxrO17fk<|H8=v7QGe?rPZxR#@`Ww#(1bM8yz1l=wnCAi{+ zlaZkG0_nb>2G-aFSpGy^A3gU;N#X871Q=ZA&IGy_!teR^wBPaWNxHi9s5((Hv*12Y zy5uczg9FoF^ez}v1V+sB{`=eg^4BgEh7f==OWfil7bzUxC1swcUiN|ox)P3VhLw`v zq!2j0*Fo@2NQ`0fM))QxzORdwVww{Nxmp2!iHM7A;jZYw2G797QHac7`Ypj7vap$h zrz<+nsAzLm=5m+4{Lbpa)4Sol&@lzG11yliLlOLPbD`8`ILH54&U2=7oqGVlI%De2 zM71-X@0HY<pjpk|U~`@g4WT_B+R92&bd1@c2Q|nc6#RHwo!Pokl3G~KWFCo(G~H-W zFX_#&<TR<fi>Xpq=LgfU$1=EZ=v0SV*0ZKHol8KQSJ(R1^E33Wb6sMx3Tf4?{&lSt z?Q3I$5zw<Hi66Wn4|_1<5Co1h3eIqdDsOt!$>z34PYp{h$2!J}hHtmceQtE8TixSc zce~v!=dMsY&Ix{Zz3qK(eCJ!=`{sAQ{rzu%2VCF-CwRdPesF{*T;U4`bqTg$33&&` z+K2cwoVT46heMp<qW<>AJsxUtle^p>$9KrhZE|&sxz7J1SVOTPv~3mS5oIqg2ny&B zk61*!%_fie$ynUri>sVD$D9+&!#r|S3*Et3rnS=Rd~uM!SLtGQ`j|WJ?Q&QB-cUb! z){)L_qZ?c0L?1fS=WO;l_qOccCcz*05eb?vM9L|oU=4Ipn{1;tllQ=e#=9PXB7lM% z_TUC5j?(tG?|kHF4~&@^zxJzN`SE2ov*Nk_&aZ1b^CBlYe6bwzus7c8o5%X(yWZWY zUmo+QCw<dZpKPXAUh<|7_v^o`cFEIMG3zL_QcM7(gdimdyT}Hw12Y?acw!8h=m*@p zUJ+(Yf(^Eybdh)8d!R4g_EwLtsjVFP(?_22;1~b>>&ajH*5^6Au^%<)w_kpai$CeI z_x;$Nj`CE$AJpgH|F)qd|AdeMMi>Tf5G7-<mU-ek!wUc(5QcUT2U<9Wa##g;k`n<W zKm#leSqgx5D2G`fhyZW_TObF25Qnkq2+ewh0xSz4K#p3W73Jsvgn+ibD-IXX1!_P+ zJoqW&AcAOtCNn#veW(NM@(~#r1!s_{#xOG(VG9v}1!`D5gMgC&_yKR=k{<j)DU`y_ zBfBl^LiVG&$_qU)l)5goI_e@n`U^kvTEp*4LpU_UIB~o<WIa2q!~a{uJQSTd1Vb;R zLp~G<_bbEv^SnSL#0sRnKLo_i^FFeB#LxeuJyUb8MjX19K^iq!1M>+08KR*NvL$tx z1V88pPw)eLNP`@aLld|}NYg~30RweF1vNk&VCV=HSOYZ}14VF$QdkHg@CG*Op+;B; zBe;Uckb)*a3Nr8@QZRuQnTNArf#=w*PMefTq%NF63Fp!PJRmeBB)Suz5BqRNNPq_* z&;dU*fg>;nX)zMJnUqCL#B^-KLzKt$o5wv&ze(i6YwSZjOg}GlGeqP+Gz2qz1Virw zGc+u^NR+*MtjB|l$bghYp-a7gJi~rO$nqOVhP20r^hb%rKQar*>Dm%>EJ8>D5q_~H zt00o9;0i$$0M$S$zX_9E2u9h3URa0@_yb7)dM`9FisfO4C%BmMGJ%)~uXQ*_4;Y1k zsG1+#5$(Ab<q*gSsYT%uk|RI|^Z7<q>=1e|pCi1Hp(MH>fI`56$|W2`GYmh>8#7Xi zKSS(Dj10Rl%tt?5$dDwxhJ?#5`^bLGNVts2x1>b-`^dcH!nhp0kW5H7JUzGkyM1)a zqH9a;gGj?<L&6L?eDq5ITuX4%zg6Us@;ZT>XvT#gi~t~lmfQ-hfJr$FfGwdypdmrI z@P|{RDoMzOcE|>DU>RiS1$5k-qBMvUs1DD-Eu&ZhBuNxR05r1m87OH1SZK1C!n-ak z0$Y#=f4GML7zZKnM_4KXSonss5SQiuG^KbfLxKFuH^WT2ghV*ZzV+ltzzod0Y(4qh z%#EZ+kW9zETuA@?Pw!mIh~&P41WbO6PpykT$F$3d<h1rXNX@KE$P~=_)X3a(vjY1} zKk2SsEX~3Q0IR@?K3L6E>`2$-5hw`{$oL5opoDtx1Us6K`UuN{2+omf580p%+ZYI> zC<%9JL=~A3>UxXW^ar}2(GnpVBZvYYa2ZDwL>~wh9Jvoj_)$hgPsrrQ&{4|>ZOu1y zP>-}w!wgfjyhwelKLp)RM(oeWyhgh;NRWh6ReVbY9m6&4Oxr6pFm2C&<hTj#Q#Hj% z231e=98k!^P;a{?D47y-L6;=|V4H%-C9+dgMi~(>DGo7Fs*w2=Ik6X{a~F82LN;*| zyLiIQ$;Z{{gq%5wT;Yjb=@l4R2xO5%70`qsOvPid6p^5T@Ql?{Gu7v@(>P2|G^Iyk zRZK$F&(ga?1C>(>y-fa`J^f5jg)B%0Mb;;s(`Q{!&J56zoX^!GP-o>+6IIZJG*@e_ zR>!PJ#LTX?ti%4S#4)`{Ek!z$v&al38z||-IH)21fK(H3n~Xfs4K*9a0VFz#oHN=8 zt6ZZt5}SqCqCpWOGMbYWDiZkeL2hcqL;9RPoK7w<h#@L3BNzidu!Vl$gtHvk5($HS zXoM-i0xO83m(bV)bx(-@6jb)CP|l1y2p!i3r9Y$lS!qRA0p(A^G}?I0%ySJ|`n=M* zjMl*<Q)SiCzBJTg4b%$VT6x__L`5}y6^XXeq{3qefR$7;Q`A^8s#@wMW!k53O2N+h ztaDrl$12Oosw^W}r*<+=Bk7QJ2&jR@E!`?ngP6{lG6B8%lg?-dZQzA3U<iX)+=AGP z7yO5G2>`%trAj<ctqsHUJj}ve)|}l|H@z~*lRu*M+W$<~s|D9{ZPRO=$JTXPW-Z+_ zl+f74**NvfLG4o2^W6FzSl$)WthK`o^}XTRlZEVxJIvDOvI}GCuH|9~=$hWP05YXm zulCx;IY>NFdod~hqq5d3(dvq~yV%m6&6MwTzUB(w_XW2%h2QZ*Py$`gFZ)(|y}C1v zv#v$8Vy!<k&CpX5$=}sJ#QZjPbyuH_yT%h>cQr(H4Kpr%PjM|;3Z~%Hqu&X=U=GG$ z*ds_#V>I+hvo+fdKX3<(!jwyMhfIq)PD_ClUSX1};d9f!v+Lh4<<`?pI2>*?5%w~Y z)Vv@T;vzmY5<Y=pbG4w_0=ROpiOV}89yy15VjI3<u=`<))8b|2R!Ic7BhFzR-r~jd zUoOUCn2Ir-d$1=1IW<OOIF93b!%sP8xHFzVI<8|q-eW%QV?X|5Kn`R<9%Mo;WJ5k= zL}pzA9^(f8Qvp8Mszd!aM}}lWo8&}RIEPb(HLkM^*n(NO<VMqgJ7}pu{sCxkhMyzj z0%JLslSC1r6}ib{2h*~O`(ox`<)koWRNiFGvW0fAD{QO6Q%>c;pye*p<)1TVghS>{ z_Oczpg=Bl?M}g&F6Xsne7t+{XXn^J}!{rj|j(wA62w~=#@Md%)VSH<W5&Q>tV1`D> zvllo5dH9fuGh#YcJCu_xC(wdUNU8$9SH|-+Ha+6risyOOnV!*wa1ewsNQ752XnJli zfwnS;Mrfp%Xiy8h!7IFaCIPxC!4q^Td5-8q6T;Z2HIvq7ex?ir8)<|_=jy0}A@nky zfoTW-OTodbK};D-#sCYR24^9W>65-Kmj(;mOE#OXw+vAREg*wQi-czOC_iEX+fu*& z#b=|#3+8Q1X}!3fMAB!KWkuq%sjg}W`Hn#;Yb*O|E>r8kU~5o=KIx;rN(+n<2!rI) z0zznqAabb^plVP%m$RZZ!G<5a=nl8W=4zga!lvm(LaN2SX(YIX%&~=AWsVrgq~?i^ z%nqe*d5OmMYrr0BbxZ1ZYou^QhFUDDVd%gQObB^u22m<J9T4ospygNo2b=g40Stfw zw1)#^ZPzA<27JH>oWPp%g4Xsxg3thjC_rw&D|JbQ%Z<v@6+sd-L7g#y&^U?<{O#cX zmZjx>Z4<z5kcOYRVzt&XiW|&9A=$xP!?GAqgm1crlQwVdegPMJLFLHpY@YA>j*b1M z6@TCe|LzX)9&SuhZ`aC{joK^0IPjxLZ+lqp7ZBxUfNtpy!4W)fwpyB~J_;-B5y2>! z6OhIzjPPK9WzoQJ4Ug;w!vTpQ0u>$!L;{@zXYNe7gADhF=&lSJCj}c%B=3+Iz4(es zWpRzEgmjQ??cN!Q!EhSXxb{{J_#SW=WS~m0hfw-)y+}Z<N(mSDap{h*;t-JbGNdfP z218I73}SOPhjJ1}E&3KE`<`aq77Z-_hp5c)*Ul*(pYlP$?~qQx6`Tbi;0;s%RtDT4 zbe*9n*(N-d6>c4;^8oj<Mk?<EIS5#kMOrK@%fTAWd4b0Ev<`5BDd^|j(vfGtL{}_< zPM<|@sKp)##ZfH9Q-t+clyzW03Q21|^eV<<Y=Wv3vs=u?T`UD3(Eubz2v*EQ^U-xr zpLJWrMP1}Y#eJGF>Z50j#%UZBc<PLc(1I}-1cf^GYghIY5cZuw#uqsCRA=en8256= zr*${Rc2C9*FoKn)#=?qqT5JeymxKl%S(t)%RUZ_m(W7lQiVcdLPyqJTvG!yS02v5{ zd$<Ni5L}O1M{Ws>6hH)e_yU5Zwi7^jd2bC4`t^_JvJ)@^(n5$TZ&cp@%K(6<_J?Qr z7nu2T;XTfP`Jv7fBtLmnPk3^nSdKc1mydas*MnvJ#BM+FX)FPDrvi7!k4cCFO?bN) znxTHRp$#&GIEeU`KY<(2gxZ7<9YC0uSo`NNn592yarXprH+Q0scYnY4VfUk(Uu}@D z1P*$7A)k0;=S3m;#bA_!cODibfCgen6?Cuo%87?t$QnbDc3wxXFrasH$8-&OffyJ? z=d($i)X7KbX<7~eRjmxRz9G`k(332P8L&wq$;lUS$<z#l*}ut?*U40Qhwh}0H|Yo) zecp?nl*5LmnM}pquYKPi%CA0=ixC0iVoGUo%D+1SJiy9q>&e;w=`Gh64ejUt<>eXl zstK}c{@#BP>Aw@>5}0IxDf}5ALveqH=L^6R{tRpVAdm!rsCMoamlHUq{Y#h--<KBw z9tMF$O^CyX7B5CDN2?jJBo{wEJdvW(I~^5Az7rC_2C`l+DuRspamA=@Iv#5HgD*`0 zAJA}}n6ax@fD;}5%u9k&B}<nmbn^5G)FMrr7DYlT2~#9VlMhkqII*Ep(u!4Y1{k>x zhz<{<*d;l!L|vp8HK4_+h{Kwwi%VZLeK8}LGaxTKbb_lE$jX)#UFiC!Z_|krGA+Ic zQ4{UM%$sL^E{X?T8_prYI;<REZ(oZ-i5f+k#376wO<<`1Oj~Jf+qWJsw#a4d1&dVd zp6KwZd)*apvJ8U^K76pVuq|{=A6oQi(i5XgUk?A#MKFK<{+;8b!vqg<=HKHB&;wj4 z6DC9mKip{?<Lko%n4m#c%9(JND=*k*UwiMFw^I-1^zmRIJeU(m4(>6ylL{As0E;sS zn!s9uA0=qQLo!H`O*`3;^C5r&YV}Zo&>UFef*Gc90*WeT6TpY_iQ*7`{|PnR5*3n| zU}X`-!^|Sk1+e3aE$YP=NHBV}BrHun2@`8q4p`BR@TCEykokpVnRpjrS&^9m4EX|T z9l9tbi!Q$O!VYCjlTR8uU=e7bT8P2eLq)*y%@b<>UWP<7yfAVMI)yMQQ=4CP^#YwR ztqIazq`dSH5#We&LKgYd5x|%YrlCTnn+7mysi&rD(Wjx}6egRx>h=y}Cxn5jt=53* z5Ng2sDcCMXBKgpl7NNu#e$E7t1309F6l@yN1^_}X)IQXK6J&%kS*0?a1)5bC-TH!- zTtXSZrNg%N(5n9IRM{Nz{But!#%79a8ZX#MWeqKvrkg$f3<p!eAM!w7WzxNHZ@x@A z8E>cK1*6Oqe$*4lMY2#)G8Iv%M4x?eBF0|;6c?2OuQR$*q6yZLY%<CZMhGE=7J`#= z$tZsWYlwV}cu|P~s6Yuno><X^E-qpfBY+0~+KjWwCksIWCG~iMh1Aqq`|r!xIn)6j z^gQtgTuItj)C(wd0g5-_w86B~P>)?@y{GYd!rXP=owu`AUR1SmTI(!C*$(-~>Bceh z`uN$y&FSF_UV|<6)G!6XNHyuqvgipgyZ}R3jQVg)G;vA((Fds*W0DM`jFX#8il6kV z=97OUFiag%BSR|G+{F0MLU0Q!@x~*6m9|^SY&GRpb1QsN(_`xE_QI;ow%fn0hIsdk zZCZA=s5bARnySq{PQo#zdr|%C4;<3qcH<4W_2vIfd0czQ4cy=cH9P@e-a}R$n)bA) zeU2r+klaYnQ7%%b#({kMTo2sQ8W9Bl!x+^H+SX838M^V$aKN(&d46#M&3pq&(KA71 zOu&+c#R&z7C`;r3)B!}mBQ7#Bkc><;m>JfPXK~9xg^swMqMWN+zv~H&l4g;mP3s{> z(*O|3M>Cr_(LSn~)(K3oDe9O6W+wQ7HB12um%z<LA30d<vM5CtQPCA3`C$;F7yvq= z<yjZuqYwk7U_Flj_nQHt;h6^e(DYC_`+D3-Yok@1dmW5X-_aSc!W<{%1LNJD6l zsM!S1kt(#oPaaYN*~D&;T~yO0W0^Qr$}Sb_3dyPLKo^G`5{kV--|tM74`0^BBD32i zPP+IJNuDnNhza6DmdP1zsh|`8NqGnx-3Z5r_(YG;A_*}+M4g8qMls~nWG>fr0$i#q zVfPDwHDv<GaLw`};k-yNRTF^ZI0RSN)MgUwxT)E}g;OX|0Ur8+!4nu%b2WH|2;r2U zen#=0D||=`9l`@^l;R<1xJNPc5QjaK1_cdeMI01Cj{hv-9=vb^8<6oI8fGCLsF1@W z5QH@)m0+YLJ!#&QXdfm9BB&%aDN51eD>D`|IN{I(PX%|yxG}8~^_Ya`Ttve#^urW9 zb;wV}sMMi0)m2;VY5+=L26ym64>cW*eO#3de)IvWMU>+S&cF&aXdw^YAc|VK+P9)e zm8y@hs;P83*1rBVu!E)l7f2er)1ID{siko%T;*!hiWJ8m+puNua(dYpa5k=Um6Pv2 zRM@V*Km@iZMjNd9kR3QdP*@-o5P-FhMoa+<R)_*<Qz6=lAO;<dm;#^hcp1x%wU*)u z?PxFZ15%yK2IU!tM^2DgqUxZ1c+{>xxNBYP1`n)a?I|xE+tZQIgQ}W{2dKD-UQFqO zrIKhzEG%MIyj~@-RTZyy%@7ZkW`e$4@!qC1u!lsrK@OR4hbz=XU6`Q231b+=I;KF} z0AzT>9sY0tu3M_B_!Y2%B}#iwi`ZODwW{B3>Sacf-#F~Izpw4v364OHYd|=<<V1lV z)L{u7?D%sj_(MPcSW1YOqE@Jy4NHn8%i@g&prdJl#5Pgj1!0im9^BZ3eLO&jYTQE` z(`eWT?obVX*h3qfU<?gqpb2usLm3na=h8s@<uH%g1V+7Cg-+mQFpHVY4|yuAih_h= z_`@A~u87SZLIY5|*&f|kg+uH^gHYgk8HOoq+zt)sO#tZ9ncnnEb^wQF$Ro|9fPsBp zKm>B|N3S+BG#nu9k8<4N36{n*oLL=`M@M?nMX@uU^^AgEn+Mp!KHT3z!t6X##MFuY z%By3ojalP_4({l0r*w2@Z0o7pvW9_lRb6aOhX+@Fsl+J%K}~syo7@3-K@dRUo^%A8 zwAMbio~0ZA9u4ICA|;puKDZ#cg~#J>+8*;T+1b`PL|owvcQ{Bs9ct*9yV*iOft$mO z4Nh2O;SGn$NYVl6bEv{l`@Xfyu7YeyGjE-nl9QXo%n8AX_b`Njv^}J837I2&-0VV# zLbjn2Q8ryAD(84np6zRCU*+1$KEcf=J#kdmxDqb+2h0uSZcTIAT}pUGJN%IjQAg{A zln~b0jU59?c;g<)fU=(vJ?0Z=0NTF}HkLyY6PScbj!<-$2+)=|!I>scm4S&BWwdWj z#Z8R<G|@{k-{+5j$e#eJ{N-a}GkMFz1bG5Ih)C2K(c8ruo4`EjF~cd;+a8g&cb9E* z-zmxe_kQ)A!4>bXvQgkmuK41?ec_+Ge1TsC`IYfwc>GAbSTg_e(2u_4uK)bqPhK@I zNSOD>>8seqe)ingy?7=M{mJhxCa|x_{Iw_%(&8TZ!)L$t*Ay-E1K{H2U*yG7W$1tn zJOeHuUiOt<^En_yF_HsHpy`pG%_!dJ)n4jZ-~_G-ppd~Rd;|Glpk8rc37X&uqF@TD zU<v}s3Wi4ut{@DWpUmAB7JOg`x?m1oh79VU|E*IGCJr0uff~p`DDZ>G0HFk)Ko2G1 z<b2);lHdrg&=aoU3H-n`*uye#K^!$<7kc3rg5d;~z}jqK7mgu4lwk^<VH!r$Ra{~J z7P4U&p5PkF;YV;w6N-c%c!NCH12Y@~_0?e@s^A3{5tdP*4n|QF3gRL%Vk0`@BXS@h zLgFM+Vr7Y5C1PSGYT_nxVkdgyCxT)qisC4eVkw&9DWYO3s^TiL;zpss863j)wPGe_ zpc!s~B}igSykaa)VA7PpE#@Nd)Z#1><C+|z4h~~6GU72-A_~w!Jj4Q{oPZM8LOT@Q zA<R#wR9X}M05mwmB_^XWZlen_<C=`X8pL6Eke&)K8MbVU2{<D(mXV2!qc)BRJ37=Q zUPe7$l_H8FKcZkb4x;B#;Wh$fKQ>?G9V8_RWIYNb5SF7OiqR4TKr}K6WQ2qNAdEpG zq@z7XBnrO35y(Rf(H<cR<21ekIoJa>;37FbWK0N>I1-`>kiZ}CLnN4_{4K$_)euUm zBufV4L)3sSunk(&<V|{H27Y7-T3}8pO;f7lLUQ0z24quy-Udpc2KwVWk|0$^C02@u zLl$H>f+YqnqE`l@eS{HKJxfqh;8waIYB9mIJ*87_4A<R)T-m}t)PY-W6k2{nOon9? zs-E$zg9u*6A(;qX>Lp(WV-V~@HlU##5lku^rcBx;U>2TLeq~vLgl7KbOPXMxf#nmH zBWNOIKiVZ%LghY=qi1HNYbv5><{)Z*Aq`c5V<yP#jFLap2_p=HH^7<yF_cjX^x8d~ z9D?|OFtmd>(84j4!z%1mrMZADxQ95z+zV*H9W;Y*a>LPOnJ!QRf_O*6kw-#k1w9() zF(4-=AV><JR3bJd@0C#psh?HCXKnSF3;?Ha+5>U=*)X(2Im|*5*hh6<XLc6F+6gD= z00D1~lKgZ4ck&@nngC>sCk^32!)YE7{L*xe2yW_Ttxcbxxx;;8r3u`QGt5Czriq6p zlWbn4RkkLLil*WvBWKEJ(&%VHVik{u=mv5okalH}5-Dl6W@-*;klHAXf+#^&+R~h6 zio&K9L1m3DsZ>JYkxFTkN@12pDV1tzSZ0&_wB89A!4;5@6f}YVeN0qIslgi5mRlWI z93&XF^nf}{f*<sQC-_0W(5MQmff|f~BDh0+z!z18LO;}n4$Z@&us}@!fw)XTC-}-d z(kX%|m<)u%JzRq$P=sn)=?UC`CgjVO+6Sk4DyX*Jn+~CzdKVa|11hM2U;zVw2r8i( zYJJ3tHvn0LHNr!r>6$hHYsD8C%onyeDx^y4JT4)c3~8B~1VNIjspg1{Y5*RDV2dJ$ zj6CaqXr)0msgRQEm~vsb#%3HLX_AKKk22}Fdg+WBDU_~jX>#ei!fU?ftEjFf6xJnS z-m8s1>A3D_z@jQWVriJ_tCMafegH$~(NGzQNQoH8dd%bhIq3&n@XW>*nw0JpfLIbq z2!RbbhFtv8UE~D~p@v!#hGC>rT%14<NP<8Rgh4Q!LNEk^K!#*chGm#QZQMp~(2&g1 zY(bbnI9aS(4h0Qy$83~{bOb<g90x!ZQA{pIZ@`7g)&<ITnthCf{P=4TIjp=LXk?hn zJR+=;906&Z0Joxr*H!}9cBZ?=t7+mZyo&1F!sU}rXV|u@9CfL}maE{ZCchf)!O|_@ zF0A5S;NlW4st%??j%DJ`WSE*ILJltDdZw2i>}TpL;`XaHwosQ&Y=RgFh|rL=kiueW z3lTtwg!~NJHtxf)mR4+v2^7f-97!M~NSmbYwTO}bwwOe#@rj=Rif-{%xQt7=P)1Sg zOTU<n>Je|B?Az(u2!@b}j-<$xe8|D{f@vg3>Gq0A2v6?r?p6KJQ|ajF?$Pp^3yrn_ zEZ~Cky6EVoFAavP=7R3s(ksD&XylHmxU%aM)+_(ktyo&A-5zOd3NGG$Y~eELz@{y~ zhVJB6uK)V&<w~%VI<5sLa0ffEAv)}OC~oPxDUFO^*|4sk@C+06LF}&M-aycY)RGB= zPuswS7*)@--i*q8m9RjB=#Y--ppNR)5P;NB{M>{I6wm=B5C(?M=#<V0keVC`4cBl^ z*z}DANsfJpZ?ybys@(AS?3K*8jE;^li6n9VD##Cw9>F~@h(GW{A+Q`I)Lg;#EePvc z2*c*TYN?p^aZ=)F=7K5Y{x9Dma^TWy9`kQ%GO_?aE|g;CxgN5PmZjt-?7Qyo=3Xi1 z8Zg5eVwoC-&3sAbRWWsxStkV1pdl67e#Eqx$fnfr8nw|Ib*&_^tTUuCT%Z6ac@ii& z%gvHf*P1{*Q7x|YawmO~fnE&?_Zc;eUJa2ERDB3Sq0&e2S%M7IHkDW{f79rR04#v( zzcS5!Xbc8glNhN|-0XnKOo2{_0V=JGIBy>$JMR8&FemS^=B}naf20Nbu_TY)mo{?W zlCvK_vi>GCB5N=~`?Ek7Zn_$DL{IepxgzjE)9pYzbO9?c!)7v)dhXt;;|Wv&URj_C ze-Tg_n5JS7D|c*HCK<KN@_*%(l9(1xwbe@7DSg4oY}FP_;8vgnz-|?ag9X`yRaisc zhffO*#a5A$1b|Ql0C>f;yZG3zjuj0F*kYwX0NhxP(IZU<sfUso!;&<BS%gtX7*fyU zg;`+RPG%92wIJ*9zUH$fb2M3g?%W=9-tKDw_w~TuH6&B;Ab&6iFYG4sb76Nb11D)G z@AX?Ya9vY22LGk9Y(sCAi1_}|Q;$ej2Y}BBj!OrED}O}YaoQ}~S^(r)G;1A2q(IMc z!_OheWk76+m>JO-9S{IyYgRG;JpNe#1X=)~_Di5-+r1rI&`{UqoXZ73*-<9V@pk5E z#yU_0!(w)Cq0`X8*>3l4zR@jQKQVw*cc=oe9yhiIhBP1-cE2WeXCic9Lw4FK^dSc{ zeG9C8_b38`Dc)jmM=NrGZ!lv=wq)mZ2X}6NbFLv4#ZJn?5<7BwTSlkVrRBw&M!#ie z)PU?IpK;q(#CD!I22bx{xNIhgOeEd~qHgZFUqvLIYW!bJZ20Uco(9apO;+Fq%7r^T zc$%PY(wO$;T9J(-C2Qt*1&6K!x_6Qz?i5Nk1!g!`QnGqWaEYgDZ`*AlPV!f#9+YeO z9#`~<2lSUWu1IIFmOthHnHQ;n?=zJ<pqz+XEs*$*%Ap5>AY!&+Aa}|gT7;eBAhh^_ zJAm8or9hm|xdf&_pbxq-LLzN4rJ4Ka1xq@lccP=aB&Cn$04L!tW}|_Jp%r4G7Bae? z@A(gg#2bpb!fnCNtq`Z9;4iW|qc^&xOQ3CTIYn=&D%yHgV)|6}Xcy**EJC7Rq9T(w zUli%%#soVGCcCUVJ183av$G<tOMA6j`?X_xwrl&gb9=XY`?rI8xQja{?)tcMpbGE- z%GIG}mOIm=dzhPhyo=!$r~<KbU<Pc#EXcbKZl|b0q`aDIOmyQn+Iy`(;W>8X<O~LS z;%^GZ$!20Y!js7Vz)#LJR^v6^#K1TEWjs8oH=o8=ip5)_G+^U`UOdTXyf<!qCW3qp z-o^ZS;maoy!+%7}k1uJ-eBnvF`6<UH=6rbA{6p+~Ao95iwt#j1LjW*CBN#SnhU7?| zb8Xh6U;+=|Ie`{fs%E<&6SnK*2<Fq1WT#-HMslR;i6lufxd|{~yC2@!Ys}bhWEsLe zNA8>33;RYz1oFsY-uFC;+r0~tG+%mQ;P<5lTz%Fv3fMzQ(Fad%)(Vzct*IBDPp)K3 zt_k0B3g$Py;K$qFQ<fkyJ_?eDGH3z0+@zZDXyM5vT_)inQvFHpaO)X;1QM{Ze|-te zC8Uc;Q2@yQ>Mx~zz|5I*;Oct{;xI~Eb_VXV{t3pwnTb}XUqti288e}{^6OyBH2n3O zv;Xuw@z3C8V1M&PzV|#J667Tt>}6kuhx9+cMX*2hOVjqpoAn2#`P5<PpI}Fw082b9 za0A4!cI9RzF%bX-oM!&)apR=JL#J^%Oo+&3?8S^=|Ngzx@#0_r8H|Q`V`%IILN5Xd z8uTHooj6*@%B>1u0>#RK1x;wU)668dOF#mANW~H9L=#Ix25=g{g)MUa#Hj)T(nJbK z9<hofY0@4_oH|=NjXJgJ)c_s{O|zGb97Y$qsDV6z2OpQ4O!=CKp{N?eYju{MrE2ws zQKTIICu-!#HRRvG_68R{iqxO8j2k<CT&j{~L8olp!o}!R108p<K0kH+RI=bY2!940 z8o+Vq7fuyp*4&$8=FN{kK1~7V*gb5VcBk0WCgp4CPETaPW+>G*9n)P`zn*<Ncc;0z zqOR>vC{gk2pW=Y#$|(_dq^MWn*9Y{@BmsN^MSoj9`T{t?KK$By&o!;e!;P~AQ>Y}J zh0=P>J^1+hNgjK!u_UFr>KYI)E`Vc9hX?HmEIp@=OK!Q{`m>Fw7fzTlfF9i0WH;`- z!%jQutm82}*D8b!FxeO+F2@o7nJB-q#Op7^4WlzGt=&#g;uVw9nFWXk-y!M;Xq4Ii zk4nS>IBuba9%9dhV15CqO=AKm0St9eQ6mp;fO(+=Gu+|D4K|R$D57zIFrfuq<m|wS zDLVP`1g2_urWifcSOYpb?Zi{h7kW@<5<mL!#1DMZ(Dcqc_k55ZJ>&?bpGagh;tFtN zp+br#u<Gk671mH=3`N{2<tYue^6a2VE4?(+I#ca50AGO>wv?Xm=!ca!B#8?lMCN(o z1QtfwhN!+;3xgj|v>0QMCzg^n*kK2x)mB_}Wz<nf4>|!|b=iGl-db<XHGmF`(Be@b zA~gY3PWMFN+HAKyEdUl$@n;*5*5fzbb=y6&l2%`h^#yzrj_w3{2W}$ZdI>iF7-2}A z>NB2fGl_?k6J!YGo@*QtB1iUgSYg~C*BiR%jZKyrWRYQ&mA#G4$Y(aF=-Mr!b&|-y zS%+U>)zzn8@DS@xw0`P@sjEiqSSy!SSj9^8k$APB)22G^R>{x==Wf3ZcU&M!P}$zE zD?w+HI5goWk`rjQ8RrvNH6#wP(Y`?wQ==0P=^mfz+~@(-rmkO)!F?NL!gJ-bYgL1m z4(z@Aj`r7hi9LY`Z>~wi4LKSC*&`&NA!a|?r<IrHTLK+4bm`iBGX_y3F=2*XdNJXI z4*r-Y35}@v$RdnFkm#lsF0#u@WKF2yz3rl_zLx>D=e`GX`l$bYa{__?AN%=}@KOjS zumLi9@dA+Gz#5`3*8=-uK8#>bLC6XK`&>bh_gSxh+e^Z(5Oux*8bb#<5P_m(v;=j? zihZ%z3$H+gjy4#rffqT!0TalV0i{o4cX45mW@G{cD)1>XQqZB60zdg_@Pi>7A;nHm zgio}gH9Eq>4ii*~cL*T>11z8rtymly{ZKk!45H+=q8<i0<0=thM-pZf1W8om9Jk=Y z32-ot#ry*wU)aqHLXfnm@zIYP!(rU6m_-5_FlyW(n&&j|2U7*W2hhO935=LM4Fb@R z1w?@((*Q|HZf=o0jG)~H2|OK~U;~xlUXDT;w{-vkBBNO22~3FpLTJPyM`9!-(6qQ2 zG`>KM|Et6+Gnu2g{6im`pwW5&={ct~Gjy$N;R|0Qxh`5MCA!3o^^Um80Ki}eO@ILw zLH5d6uJJVve1XN-@q`fO=t1kaf;VKLmUNy^BhENwq9`VwHu=LJ|2W5*crX=!0@PGJ z07tbda=t<lg`Ze47G#z}!Pgb^pa@L^{^}P99_TLz20f^$RB%lYz(O-i`5^<%B?C!h zqaE2Ghi2GD(Fwk1R{_9iM)5Hqm%>!0no+1IKoUNXR1YId&>st_bAlkiA|A|Ggj!7S z)0oZ_D=UrSL_O0+s7lqIK1`r=xQdmXj&!5o5XDW5+Eg3=>d2{IooaJTiqagFRY+r{ zkX~Jb*AwIb90KB3KGN_J1MZ*<(;(~)u+Z4XYC#NUlxEZ>yB@rn@&zZQX(FeCKvEzw z07Ou0b?|mpjh2)vn%#|PMM2uN1;DeQ<xkuCN?YI&Ww2|DEnT@X*feBh7fID$d-!_W z09eEs0RXIE!$4Rs5d{RfNUl>DMTSr$b93UUYyh^qTdziSuEnygQ?zMXe`xLmbCAbB z?okTfe#Eyguxe0WPy+&n&P4veNYLhsRURyKM(Si!FqAO`Khz@-P66z#sL<dj2tlFM zI<7+{0@3q9ux*k;kZTs)U<X6ke)#)nAUf>f2S3;U1gceO4Vm&3bE$w5>9Rr>bU{-x z+LVGeEb)g)K#6*I0t+<Wta}kfLKAcV5A=A#AJ)iJ>bw92T>ynQ!qJ9k#n=-wuJLZf zs=(IV*fRryvXrT8<(p{ph8Z@&j;Ziqz!Ev4O?j)1#ysUJV^+0kUJ!YU%jdOrXOs$F zDCzL#lprvo8e0O_31IL77@RV@+tqF$#RFz|)^)R-?M`!l`;?PXLk6k%o^tDDVj(;? z0D1m&s7FocPE#k)u(mC#<2xWuU;0b7#v78A%;e(1wz#NP?VAZ*2VtWWWhpTVli0J} z%GO%UQMR+0EuGgt3!1?ncFGOh;0853fw#E-ZEhW4EMp<RV1RFW&4bW!-JGSQ+*v-i zjs7fxV905}zc@i3zi}1sQDi_V`Je%fiUMzKFwRFt1U%TNVGBLw-#6(Y{+N;j{r!6> zG(xe8O%O>}u(UPEU5bkNvv7lahJt$;PcXih@suDpC3y}&a$lg%rToAerhr8O%_SX4 zF;C>FwyRS--eT&SJW|rJF9^?E!`E~G=|yBYMX;BWe162{19Bo1n-aC9mk852f;z*q zi)LV7`zd2*<I1NSOcb!;75=z}CyH0cJLZv<ly2e^r6cL-s69G3lzFAM{u-k=b3j?h zhaFD1n}`S8xOpZm<DteI@VrI?CVx8r(g{hFh%nsp&P25eI>9}s;9Tbge2T}bm}}MM zb2Ob;<FPXx`ta=C%&u`Zr4Qdcr+oeBWOohgAwKn{I^~@K0PW~Yp9JJOMYTp*<LkVn zf@{6|`9jysr10I=^*j$GJg`P79EXN`R4NY7(E-G;6$eGcrG)nYl%O7ny)4876>@k4 zNK%fr5||(To})(Wr{eVI|ISYj((i>f4y7c{e8Rz19zpq-s-)^+5(41dGA<1I!4&jw zH~Nn{4ln>;r~)S;$hIs1{Dc<*fc~(eq_W{YKn{D(fECn03-aW8R3HE>@C0q_0V8mR z5)c18@C0bk2650Sy392)?*8)sZ~sIv0oAWh{zMO2&?zhiV_s)Eim(Q6&>P}M@P<wZ zoiLaB?ChkYI)?BG&7fxD;AV101Z<%gpd)B@zzG}+3m}UqP{0YsU=-G23ZfuKurOnu zf)D)=5CxGv(vS?pu=b{d5MSp9M(Z_fAQ=2%9QLF95KsZZ&h^C55;5`D0$>tbtC}{j z1NYBI)X;E5hHpOW^e8cI=0;oEL4};+1@8lGeo+6c=@Xs7ao7-Ya)$O^Km+!GcjO=w z+`$#1BN7d<5C1R_cjFMHQ4vW|76-%#y)b@Okqiff7aw60N6`0XQDST{S}K7D&+P<` zfE;$GclPhOP{0q=!4h=;pagsHYyP192m$``4J5Q;m2yHD$l)HiVG~A!5USxGv|$=f zV+5RnA+&)Lh)8ENfgIvN8GwfPT!SDD5+O~1;+DeV0^tM*G5`)TAsH~Gum=f_!5`dV zBel>qXaE!@qZ?LXS7;y<GIANN0t5}w3kp&tox&z@QYT+v2NXgc0zex`0S0d31&Dwg z3<cy)5;*{>9B#o~OyDR3z#eikM^4}+V{#^a3L`aA2oeG&{b4Hsrs=#a39&~8(sCw0 zvMA4lDH{?hQA0IYqwA`PEwz#>@k|UaG9%B@?92`^)$(iZfFT_s2*pFTgv5@JVjIXQ zHCDqi7b7zlu`Uz;^VGtQJvQ?eXJ!uaLJLb^4&njr@Dd>-PYhYpHC=->RZ}{6(kIoT zF*gzgAk!e1<0)>F3xeiB(g7yV!774?Dh;JO%2Fmr^A`;$1t9YvIbnv1ku6}-9;D$m z{E{=<<1#toGwlvDv4}XwaxmSpFsUOn9dkgS^Dc)HBok6Rjx#xzGXRc~A;eNfu%sRQ zAsv45x%Q0`@P<FbQYQl-1|-27?!h!@vYJ-tGlIr|US~#RWQl@iUjo2rF7%n$;~*-t znwH4~E;KNEPWiB6nV3lnjqaHw^ff@#HAvLO_9eS&z#4GmMkzETDpX^Z!hizvnOx4r zE;K`D^mSPOh$)bCGEY>tXjDcvXJLqxJ#3UaoK!{=NlVdYhPE_nT2!{O%S(d@OwDvk zr<6>?bUHpwLa~%axl{|?^hzz%fHIUuULbVn)Htljo@!J_dDKjgFHFC55hoK3w{UYn zOH6ZwPp5-KyL3efHAc_$wrJ8u5h+6>^+P3eMs&aio&gsu)kmXfW4uq(QZ;H+R8?Em zRbQ1m7>f)>;TuL#Rp)Fjan;GzV}W3GI(F4pgH>3El~{|Fvxdr8k5#Rb)isc{^~}gA zWR+HJm07EGJ)G5AQx(;+bqm?RQeK505=_%@bz>rmTX_{&&sANw@CV#t8T0~Hb#+(C zbyZ>ilvwF?UGr66_f<MdAj#lWU;ULH05(|#mSBwwZQ9iy-j!d^)nFTzJGM1nCC3lE zAw!tq5Y`l3O%-Ba)k-^dV$YRGIhM2V)mKRtWK&jUSC(ayRbyKgW@GkMXXIsN)@E-O zXLD9(ca~>+)@OefXoFU0hn8rI)@Y9wX_HoImzG#j;0z9dRGF4r?bT>YU<)`zRh<@U zRn}^;R%*X?T}?JysTOQ=R%~w;1?V6iVu4DPz!ut}I}f28^ObDHBTRrXI#|_O&(>JU zb_CXd3sBbQ7Dxs7Q9w8=ZPzyG!gkIIw;$fE#Tdv(hc;b{wQfcBGxT<HH}_WsH<9fB zwQ_Iva+gqEKbBwlHduQVR%vN9Omr^7K@i3u5e~LtM|Vb#Kpy&y%T%{jujCcTK|{Qj zbUim&skY0A_eOce1W4cy7{_$GV+mS!aRcC~z6VTw7kH(FJvyKaSi}-sgL$2|HF{NZ zEf;k;mpjVWe36$~Wl+wTbac-*eN9z<#Y1xI6?Dm!Z}rx8^|gLom8D+w@sd!CYSw?* z_nAt73E(n$`?u1N;1;UT7WSbI$n<|tmSdH$WXCrN<tr7=CTcM5Gh$#NF=lS51A--( zf@_v_d7*Onp%9|OgSF;;e>7L07lTn(eP82(TeXK%*XUTabWQh%b9H!e7=L&F_=cmX zeD{}Z9hh+uI9_uiGz@}4i-a<&hNTE(g_*)AoFX_LaovzZIhaF4d(H&TA^@sF`CjBd z4uxz$Brn<oNj_sm%D6e6qe?Tk=hRdrZ)Ay?!a1OWLcO9SP9i0!SU-5xceR8|zBmAq zLI*kkLxQ(Mt_FKT#N~*f@d7y{xVVCuVn;5InP~QpaYS<aNNY~O1*Gegs*aOo#eJEI ze4)5hahP}K7k-s^gMV~<BNvTp*_Y{;n1fhF?>Bip`5<g)mhV@Xl^2*jS9NpQh&}n1 zm3f(Y*_oeNa+#T%`?q0ShhzMuU1X5-CSq4oMquoPJ%rH>XGcd^3SOxHB`ZQEY+}W4 zz(rih1$7SMao#y+cBW^3hJ$MP1TaT)SW2LM252OOQY-~i9H(`lMLco`9(@OUR7Y20 z=N0oAaL8q0PC&pw?wr*J`H03t&lr0UIt})?FD&sFmY^IC;owAhq`!HXXZdr_H*{|~ zr+ZqZbK0ky*_)X-f1`Pqh1i&bnW&rEeH$2goors0TBnCPfOR>kk-Dg}nvbbjI{3$u zxJQRxsF^KdPgpckv?^+X;g{5CW4gNM90+&<sF!G|@lwc2a7gOfTK3q;sop4#=Eyve zB9F{M7m!Jr76zQeDS$H0jo?U*Qo`fhXFM<{tTzZ!*~y)XgMeB8%#}P(miD8T>g$#` z=s}o7s~hU9jSia5_?WP3k14c5vfv&_;a{`)w1ecRVbrN*5Pj`ehm-oZ$CawDIe@#F zx08F$j`^zJs<*2dn|0c`c^Q4D`j?FtnpbFeOLcRv8mgJQiJy8s3Q8h1Dz3omDyEw$ zo~Mw{j(Gnnurx3qLMxsbsJ{s5Bk~NXUO=hDwI?zRzDYs83+qA=OR>^`vG7n2m!i6^ zOPR1oz1WM$R#Yhyi?B%B6*$zqG>1Fvs}}%nujI0xd+XNryT5M~>T(U_*xR}NE_oXq zyI9KOG9U`>VqoVo#m(r6w>rATyS<Zmr>PpKH}<->x|y&48LE?9$$5N<t(tdtTf2ok zn!g)~^%uK+T&j!t$a~w$X}PJ{gUudnMx?FG)O#t+n(8uFt)qsaeCsK4pqdyc-n0zA zGi&I0ZOPCH!zk*_<a;)j;?NRp78b419<7I5&IFc?>bT9@z%82tUC~Y;C`m2b+Dr&Y zU<U&L3tS`JG-e6c9K~|0V3I7)i${<l!8t(=&F9R;Z?uOLoq<ju-IgNrgl{Rd!a1Qk zkgIvQtNMm}xyrfPmIqh4jU2h*y4Y(t*@YUKi`&?1_=u7G*nRoOfjfhD`=_ORyQ#d$ z;o8YHciOiZiDw`HTCVDN<?Beg!g9*Jk$C0~;`6Bg6>W@p!ki&69Wh5xZ|8Ow@b-Es z+z#&Kj_$~7JUIgITCDd>;GLj!Dc&yb=FW<5>fu&y)Xp7k3@;U?PdbV&B$&_iNHG9X zk3%a07EWWjZ{nQOdwid*@TTMN_5$~qqL0P_Xj)mH=28Soe&k11y?Z>mf4zZ;-Q9&f zs;|83o_Q_{`PqX$+K-soi~HBj+^CN}wX@yZo1R{~oazNv>bD)}uUqAm9=!S2x1}AN z0Wb<*hzpPK3uTZ%V$kTcig?}m4Ov*uchCfBtj<X;7Y&37)o@PeK62u44xiKx6+E(z zF&US!8Ci<(>98q+avalsZrkx4d8bH4Iu{`S5Z2`898a_FNtcs1!F}Jp4{WF!6LAnP zrV#l98GDEE7bX%jE_z)!6ks@SO<?rBp4*Qcn|->;l{u(=9ILlJMV}q%tJ~<M9OQr= z_=Er3zrER;pL4?<>Yv}Zzr6UXp3AvhL}62zG$1S46E0Z_xInr!<i4UHwK^jcJHeEE z6Er6cGo_TTId!}@fu{YhbB5>@AYQyML6Beo4}^~SvnTBmkb)2k1_%&wVt^XZTv?=O z0)-c0<nD3Xw6SD>7bldwY8N2gG9Wr8B2nmWVv0)Xjs-ZU3W&uQM97WvY0*T8QR{>Z zj41Ksj9uG+oG^%E+P|y+wh5W2fsVWXSQAYkoXF52$F5%`b|`b~9yUu7jUrWA)L==b zc$=CGYhrI+zIFju+*>y<Q^JM&CRUtyBVLXMAqsXZ`R-xEgCPh0E10q7$CyEfZoD|I z=%$8CM-Hvm@8i#`Q~%|RSh2ttVe6h$t@y+ecd~SNK8$$ci4(hP7cME#HQ%2#tZl+w z^d!m?)B_wB7`S%e;}nbQ&0O4i`0}_-Y;V5Xu8EuPfGpkkBKq`=8s_keG=8)C-@)}p zUv|iqwB2(S6=)K5mF2fzd6ZSA8HC>HmYYfbQJ5Nq)nVA0g_e0%UUw6U$JlHlO8A+F zt+^*6VJf=z;)Rx3m|=;|MTnaJV%>cxBZ(Y&xFTglvKS+W91iwE3SQNM9g<K+iR2Dg zkTJ?PNl2;Xmc(u8Wl8W6Wf7HDV!2TYez-#l3>+@m<da{<iKd!t#%brBcz)?)p5D!f z=Z7(N$>*R@?n$VIh925kqIZ&q!WoCeq$r^${4k9@%WyHNoq}#!UYHwIdTFL5m9PaT z3Uc^pq@F@(Dypr<DyxY=dV1uafVN29tdri#D`~QB`0H)i{TgSg#ul2amdI+?EQQ1_ zo8Yt3R%`9Giu#G|w%qDjYq#KrEAF`DmTT_0=%%agy6m>=?z`~DEAPDY*1N5*_VTI% zADq;SFO2*4TkXI37Tm7?sj5&rX$D)&V(`O-O85gb&K$>Rt0SzTX_A%A5X@Eac`8CK z#uU40#v5-mam5OUs)Q}=Fchf?D@QzX$zGlShB~CQOzXwvtqdN7C>t!a&v9aei?K=v z;4#QzPIR<QmAs>a$s0AjWziPFceT1&7dN#<Tw~jUE#&;;4l|8-TiFXo$n%YS-_DAI zHKK4V*$Emrp+zV0Ar0ee8?~Sd&avK|H+^x>jrCqG=n{?~V<e&}+;Yo@s0oH6KIGsh zbnwSLwMg2hu60A(xaJTlo@@}XQ1f+hF%VLXTbB5Yx#N?bP{lrV{OUXKeESW!R6ngw z9jJs2AN-cCcU^V=)Xb_xjy-P)4!i8dZa;g1zdw)I?yOG~J+>|cql^}0gtDLDKhjqM z6Hm}6?fD~qctQ%0SpE3sooWHe{zoYMon(IX<52Vp^a2E?t}p_`S*MIN0x>8>TN~OH zlp07sBpI+(wX23dwqZKLbN~<f@WdE0(T_-=2Z5gQKqrRsD;d&IJN)zCPhcp$kP*g) z)PoZKn3ppo+(Hj*um$mGXS)%aE`&}r2@qe{!IFGXTIu@*N^F1(VBp3h!)Ql2W|5@; zpa2fdSO_;bp#vKV=VmYP*hKu7IxvcnjODT87_+2-J2b-^0pP|ZDDr_+VC5>~5RPdI z;sUh!LmWN-Nly;1))y1VfDyy+#zKsN96jRE1dSxeBYQFtgj^~a<S1F>sDYak-~k_+ z`b!KHAwqjxLwtKF<RSl&NI3?8js%%yEpHhBU1G%_&WPj3{z1oyc(RP9v<E6nMi8{b zLR(=;A6DYi7hx`hnD2o@Td={2f%Nf@{t%>3&M6P<<<2JJbW1s%woDxc;GCLNXE6<V z$V8ga3t`;jL@t@hP3~_GZGhhivVaXkq=JOy>6{KuAcEKt@M+AP9X``(mM`HTBNHKl znv7Ege)Qp=0mb7+^(j(Pkkq6b`KU&^*1y?d)Sfp<M;akXJ(+UFkL}D}09M(`S8~Ca zSV`pnP3$2;eFh)}@gyg1R%({(Ag2fJxKHyK>QIPkhpP`Qq4_{M5pUWucsHFLQV|)G zXBLN@?krF!M_E3?WN{$rGlmIDurpMsArId0VhPOP4qmu{4ag`N5IJ|a7j(c0Q#jsK z%G1}s2DUhSRfk^z>&2VULl1HYMGH}4ge!nU7F3Wz6JP@o6|6xGV^D-UN^zE&F2w{j zct$bwpoTRhG_#uxEN)y2TiKSv1RB6YKUfh5Nu=@xC_uzKo^S#dj3O#i!OIE4zz<Jo zVGM(K0yax~+SE3|v5=K4LAKl7?}k@9<VCG&P0#@&{4H>O0j_1ehyvv@*SUyeK`Q+J zk(}bx*9!N22z$K?-uewT9?Z=|JbLC?L&QO}kyuhCK1&8oOgI1!j_`y-m)^ip?X#gB z?Fr&*-Ue2dv$)CaZhM<h8HC~<*Kh<~Af$s8Tvx0H;-VJK2nl$=WG^I+tcjnxVbEfj zfDk%?8S?Qwq8_9Z>qtTdUMyVCI(f8KmSL6?G-X_Bz_!|Xtdfz(WPSYiD+DU@iS^Lo z4@Y;p)x9ndO2A^(Y8V}ph=V5H7veZbn8F*j@RJjC15Mx~4L<Afk2fM|uacR{#^El5 z!<%Hu8mG_a)h~<@<K;TLGyuen?Q9`**BJPrg(i4PFVrKtc_hJO+=F8XX84f*2o7X_ zRr?-db}{SF{b3%(k#(Anodo!7g^Rs7i3t=J8_oDyJ(IjGMqDAB?8=(f%m$3Fxo8X> z=s*OG^^H0*jFDKRCoaap13KEE$UR|a+Iahp*Qn#lc|!&{_!b33P?E!k^hMdmwl%rU zjc&x9pa`F612!ijkQ1n2dg_rky*J`9XUIo}>}Yl+*6|Q%zkme6ZsRCI-tmujBIGy> z_VTLsY-IGJIru|(t&>onjKoAiCkTQhs&S56aNz`1*(E-{fSVT_#nOa13O#B(3V84w zF~G(t%>!U^C>O`aUe&-K9vuK5Km!*i&^fc6&2^hYckF2>``Hx)cGK<u56#BeH`T0m zf(=x{*3_vx)kv=LkgJ>B&~Uf;@OCDezrf@ze*wrvPV%<jd?JzihdwqjwDCQ?gifFI zMg*@Njf*wwUjt9hiM?#V2LJ{;XaWqj!eqjGVC7}Bh_B0&zKQ(f9BecJ4@BvY;``&# zJpc!70|3V<c8)q{wkM2+Z~WrpBLF=hOb&=|{6}Bhe;|MbU#Pvv%E&+x*=R>L$dSxy z+O{CuzOC@NZ+%FgKmF@ZX7WWb5I8z*7bUX<<`4*7avZP|56rL#bmJ!k@j=m-dO-&Z z2&jO!MShI&fCCW#)K`7T2M+wld;?@0*)?%|0V)wVf%0(zIRFm-q+k$XkPm4PCMEy^ zx!?>;79S|_f@!dVrGOmU1%okxfqQo~;g?K{w>T5Af!zmb@y8qju>)l=4KPS0SWtyn zpao(eCZty!MPLi^;1Bm86tssJLU@Bj2n$9CJ=Q=9>_G$`xKNm;g!T7*XJ~|OC<<_h zOLxPD*-?gEfp;eOg5tA>&9QGkm<DkKfG;3`fnX6sG(8|_gDZGyhX^V(XoC~+SnacU zNVA0#;fVo2h}Us|30OXU7>bN%5psBZkahxdAP@g=52b(`hNy!taDVE@eqNV8$}k0f zP!9xX0xO7GR8WjjAOy*`e9gyeoD+g~Cw;|1jK(;I*|!n@!&r>dD1+fQe)(2@5}^W= z&|Oy01-j6F&qzsqv277?jo5gMBtQxE;0ahjj>*J>1Mz$Ta6<I(1b+~6yMi4k&;_92 z4dEbhDi8qt5CB#{83uHY{03bDNstmp5f+$t?-u~<IF0tmSe`>LC5UkV8Ic7kjLMg3 zRHlt+m~}q!gLS}zCK)^qIfO4zgw%mQ8A%1lD0eeu5<$QS)sPOeKwT#Q11|sr6O}5U zXcEW4XHnn-&)_*omTfXglUs6#*%5x!AOoo&I~ZAB?I;A6h=#a<m0HP_CW(j%B9#`Y zbs=Mw+F^@(w~~UGk9e?;{g``?7&0{Jl5csEkXVHO1p*$0<WJ=Rik|3}+5wRRS&(Zf zY&PkY(>M_~;0A7>22VhXkjRqYD30{FivjQpCvX&wgKIIN9#cVX0s%*N#&h_XkBDG( zg2R=jsV$@_f;UJ#1YvfrP#K3YGR{B{G+9lrnFJ7_j&?zs>opa=i5xW9aaVI~G-C~> z01KA~86lF6iDfz|VgkBp5*;v{1tJ+Wke%ie00I{n-wB%s7Yt?z9?tm!yQduxH<7^7 zc-#aS<5_MUM-Y>TlF0-rD$ohG)^R+Y^+VI)0<X6LV<R^h-Q6A1FuF@XN*LV@(n>QL zkuK>5NeKZ*hqSb)l!yqDBBHp<Ip^N{FYK4^-uHbz&r^Nn@04AtWyt(TJx6BB@0f>2 zrNfIO8svFK@XwdH)KFb3SW|~8q{4;%vX_dt465UZ+Lq3-w_wDQQu%QhX&T}uK56yt zF)Et#F9Is%2=i7_?o`-U14k^#APr@i+$v@d;BuQP3h=VmoDxe~B^!$+nqigpT4j$Y z{p|`8WNFQqrz<$@@|pS!4D%%RzZJIj!VP8M;xgg~tAS!vqS}SHgVJ!KWa?m!h}DHy zjwtZ2Rx7_KLzxBJcNF-^XV!y$qzUonBzbt}Q3U>H5W||<h-5?D?Aq`K{77vdo--ZN zwlstv2!tRh`w1}+rKWmB`a(G4%Ow263Te$k9gbb`II{k^woi3fLy5F`e7tH>7lJB} zSQw8w-4En~A#g9li<0o@+NtjaG>o5nBqtLfxSB@Yo3Ni?UK;BRgk5zlyp6d>wLQ~> zeY{AJr1GT*JB%fE$+Br848%eSNPJQx#-00M$9Z;z1ZCu!NSQx>)IeBRF-_2rHr<lB z*-Xb(PR9azZAb*oVUXR%H4BNia8=hA25XAo87VRB^$~B_;W}XOUoVh)?gwp5*QIa1 zGS{Z2vEo-eOW?4>8QLb@%j5uA)#o+fJkn+mB<$#=0`R3Ig2}*5M-Ag`uQ)z9`fuBL za!c^*NL=wkuifDTw~d?U_2ms&#+D*CGWHJ|f#I1DZ)W_0ZITv4W*!eXw{ROpcpI5c z+jmsk@?wY5gQg?PW~g#!vuYRcU9*Iad(J{9*1)Q<F04J1oXGNuF%uBN2qa@glHuFQ z{wgDWZzw7x3<@^X*~CCq{Xn8+(0v%`bQwZnn<|Npj4fKP@=ec~Wn6;{`M+(Fmw&v& zkT_+AIv-mJy47&X7kY&j17zJ^Ga>uf?Lh51Z(jca$wsMPob`Ap`yu^QRtuP2s$l;N zNxCzY%EZWl+kLXHdrQ9S?y91eJqGrvc(=ayYWwxE0S#s|`!`$rC%;gv?X&(v!p_PW z7Of(7!pV3Hd!yrcX~*@%3my^-kt?*Z=kSsJ^PvCor<e1cPgCQ-!p}E#;c!PhfsBsw zN97dOz_(B`@JShQ{~4aIF@52?-h&Sq>=!#dIwMd3K!<Z=_&h2OTh;R|yn`G#B04iH z=t<Vo_@?mTaLJ!uZo^&{q&{W&h;=3d=$I7uFZnE;1lJjc=x?6A8>YKMeci7EQVw%s z;p9C=n?+O5rVd%OQE1Ni{E{75DPktnr83ebf0Z(rsza@_H3}5&Cp3D)O4x+AN}t-s zfLJk)Xk#dQ<i{qb@C`YvIK;>-%KUnR=IUG;=WEdFa|STbX${D*gq)g3PDQpMC|}SW zvpnO(Oukfscl$9TCMLU)u!0Ci2<Y8A5j86N=^D3pVQ|ij4o3YD1~WD4<HgXN2=0=J zNrC|Svxier{4<CPe)Hc_HT{#=;{Iul^O?iv4E3oD+vgyAr&-NpiJxs#>DHA-2@I^^ zljSjv1Y|Scbs0YOQ!N(HE)UJ&C{OkEGr#xbLQupsRSS}j3OM?6$iCr^R%WCXm%?wZ z&_08PDM3CN%2>0qsN#zJXn!_tznC1eXw(M>dU0M?EUt<!PVLsmSid~DnE$}ao1Z0$ z6D!kup`>2H!C?rVRU-MOM6^t?_>pA^(JaVen8(k+r>IAYEa6gNSSD{?s<Ic-7!Z() z6jEZlzkgc#cEKvlplD@3ImOQ||8d2pxx$uV)n0zp@$ss2<f?1Qs{6pI=f_p=yH(!- zfygVeop#>eazaLF>_mIQ*zZ|uU+sBMaXFsIb4LxV_~~&oN^?JrTrav<HqKhmi~$A0 zNZSB`LgZpg7~aTTNtqF`1O^dO6UnjiU>1A!hiR-SCF_vLl{l77%L>r51=89YmMp!E zmya1+1wPDp@-;NSAKy*;(94$8zFs{*{g3E9cy_bxf;OFabJUCZt<eSnne>Z?(rS;l zERA8~>M}~XT(|*hoaf8;Hpfp6Q@YQ|Uir!^QvlQe1Zy4Y=I=kO)o*bEKWW;7*w66) zh^!2rQ>eWEbSiIP?jrB!1pj@<d|9HHIlw(|vE?^RTP;G<c)}rgw;gvWHe$3u%Fazv zDiFH3_3PsfiF<B(elk{*Z8ypYDf@)`b4l_`P!hj?2?tQkFp+lCPF1r?H3;RGjUjrG zsrq*TEvmo6>it>EKc!yS8KzuWx4Nh3O^DPVmMT@{NZ!{bp(7aFmfGF9`p7-}kx5>3 zi`8bwJ9dfa>48kv7m=qzhs|0_P+U<dk?Bm1as)t50%n+_e%-1*ykiDLnRT0J<?YCA zbQvVZ>Ea*_3mr*|5&C;3`dd6iC(I<BzC>SI2~zA~o468AYC4}y@FRhy849LPaW!L9 z;l~KTh6*eo=&Q$=j$$pDw*sNB4OEvxGxmxRA`wH^Zb(dF7L!h8<^(biV(R{h^GWz2 z)8O}y<%i&SV{EXAdeGCan=Ie|ogKU?)nq_D>ceQ$;Ok6j;mXL+#R<YEN{<U{rd1vu z|9t}5Ew#H#-MP7-?cDh=&qq^h1h-{mkr`$iH9GxOdfG%m_pjv?q<D%|K%&x5p)XHU zhiL$>vQ@W<*S5R-7bI=&9lA<Hqi&#jXX|h$@VPHxVmuMB45xzAn()A8H=YJqsM+0R zU&CRmrvwunw;CL4VHL6$T){aKhQ2z0K0R~o|AfHLMfq&l5U*0n`nXyaxl&15Rws1g zo}YKDP?aUnk=vfzrkv*hTw|^kBoiED)TjI1KslWBI9Q)F^((j^?!mTlg2=VBWCB&W zl@!(rYki=`h_!4`xB8)fPWc&f1au$sb6IwJyxwK==Ie!6T)Hmsm!SCB=Ev*IT;}u8 z>6+%>-%5Wxl;0s&K7$Fe@Y<gdf97y`MpN<jb|vAUv1DiO<oDIwZS9L&Mjq7h8LkKI z5nJ$ow6KH_xBv=1mqgzeRWl0qe!c4B<;#MR7q!8ierOjhc^YtZ-*diy&_R(zw%&bI zjH+j)q4*WaSMMiIM#RV!D)cB^0q6yc@;^1y?xBLiuh?&5|NIn_ox2Y4u4M$kRgJp> zx_gQ-A}61R<8KE0h0j?>?-%!=d|^Mh10bFD|Lx+b#r`wchp3VZKM{{+am4;FsRY@^ zDdbC$!kJlLc{iFw^6Y@aE~!mT&_T$&%Kn#XVtN&)uQ|EXl4>&GdsN_lh<#F@CeU3e z<)`xAs`ehg`{NWNRY8={vcEVDpnAH2Mr`+v+TU>t;T7b$d`oq_JDNll>y`T8)!sx7 z)4gys*xzBaSWM>=MCR4uLa~N}WXbKR>r#V!Wx8j9xZ@0iU59tGpMclfbe>x0)HnXb zjsqlL1w4h6-dBmTJ9*@#6?XvSFgdI=%v2hT`+p;`=|aSM=I8kWpbE3D6x3TO+u4Sn zO^sb#{!wi4=c@S;Zs`2)mG}Xm9Xm{x-21xL;3#G&$K^u!J#>n_+7klcMGFJtPS!1j zmH#b;3`rkW1sn+8c;3@%J%ZwPEh(VZ@9_-N`897DS}|}9fl&;sl7d@i=Jf*R2m=*W zhJRBcPmcOh#6==!M-uw4w-$j$b$X1`B8yK2fAr(bGo6EAB7NU%G|!tyw?}4KTWtUh z^&H^iCLC4DWg@}rt-UlYt{lW%9BYQIF`q1zNt5J;?hCKia`7Hl?H{)NPrBCWS5mu| zB<YsAwLM1CmgdYl?w5{K#NsR3@kBwB8m8eCtLk1#2YFReyhIG__f8003htc=a=yNW z_&&z1DP90PruR_6qAn^onLCad8ZW4H&RHyJ@AbT858G+~aIj>z?-hdJ4|!__J%C>r zrlj`etdZQNmD0*fRy3IV-w_IqYYvjyQI7g`C$VmqA_3=Xb?pio(}w+|YG<ad=Pa=( zB?2T+p#aoeFP=6{nv9(t{fsr)8lFsasL-;vdExClLM&0*lU13-H+U2Gn=(Ms(k-4j zIx9?WC}y3E#>_{r3E|X)BX=0OOZp`1(2GxV{5L^QZ<OCd(Hx5>q1_YO3csxy+g8Pm zw+&0O+co(D-k6y0;B|SwG1v=S*8BN1d!-ZZh<H6u>twn384zrByn0qsWTi<Z7JAfx zFac&f)dYqJx(Hw7_0g7!sJEOvB}gdT1Au4w9kHn*R_!S!hq&Jd^;JDxnw=re0pxOr zxTWk%C$5i!e{q^_e?&W!RL<gTN4oFH+QY9a#lO<$l1VQm4W_edXg7Y9{(nAMb}4Q2 zJx9C?*?$id+<oB{DkkknTX_8GRXuY%VddF`(C6P$?P9IlbAh)*Ne8}5y;Q!hgg7S| z-@9J^ubf?1V2xVLHpc@zY44c58+@*qHRkiQu>R$SYAZ4q&FPgDR$QYQ&-^;g(>Idb zde7Bd$`pPo7W~I<%UbQhc<8h#Qf`;nhZ{-dJnhrOYI+ob?qL@^z|~-$kRaOuOUv!z zQ7Qj-{7h<A!T5sPvW@>L5&N{2l_ZWCUqd@8AsnGX>UY0y4)l!?YgHz;oQ!=CS5ZiA z63rC3pxdKsFMD_YEj;&i;M|Rt-u6=sIUS};xjEEOBFJLPNZn`0p#-4s-YMTlwCVm6 z(Y~2ZbrmnP)Njr9JuFX=8mge|JydJS&SGP2RTJ6V7EL|IK&6L=(}m+eT&Z@5@A=Az z9~X#co_m6{>m!t3GNHjeG3<8h8f-ODczl{-5*UQ@I#{YDy%?1q)bGF;R2K87rcL$H zOoilt6vA@z0<I8U#Mj|BsRu_g6!{Ws5N+T$A9EG&@z;jcx#^{&9u{p~)tC__FElWu zOQf=H)i!XCP$^^EDg*d-CqoVw4J6J@IVI}1EH{n01`$=kBlVwLX%{A&^d#ZN!+e`N z8G-yb5GolYg!_4h3~m&-3=*YyyqIQc%?{2w8<)>Ql8{tj2#1*`<a<QOh%r0VpLr$( zN?UtUFm6;IP_Uj{vp0TjUs8hW63nGVUTK53vzP}U#zrW!&ISr~9!#Un{gvJK5>W;h z`9xmfeG@|yl?Ic6chF2<vtVuq4lc-%VM^F?qFr5p$e1RU_Ju-%rwW9kI#$+x5l#x* zZMx1J=MXlb{&_bNEHuCZ9NIN)P0pz_XjTW*^buGj<kqRnr#ef2w=fxqg6v}~-8kFR zb1>7*SYLUV&&n?=a#!Zp9bYuPe2PB2a&>&eXR$@3mMirR9av?^?xy9J{~&J_(Utzk zRbSRgDtnU(bE9^mb;)VVa&1z@l17aB?va;nWUdK3v{WtDBx6|Lrs+9bBA2zdgC{yc ze`JpRLDWiSUA+?B@GEf&$@@5#Da9`ZJ%<YgHp2JDhlOi=pYU6c=}if<3D2SP0Gs;u zn<q(3ksloF#n}lS{??Wne3y~uNh5CIK%TOQp}&DAJ&ac4=O!^uGIALUwcwm_sF{sF zAAZd}v6kTTri09ZzF2N;EkQRmAR?&J_V%`WG9<mc(2LwqnzZNb(2m%r>wbGhm7~F+ zacrQyKIWb`Mv|0oYcLC^eG?jgP3grL)WC+fX>b?~`&6g4X7ae;^o!eS_jpiC5b=oe zX`ko=))8)XNG{@Lh@ooRJX_}^{b6Fr+L*$V_DFfJ$6SS*!u^sj*%-d*xP15^cX!<c zWbiH}sb2q-nJAy{hZcB9hvy;{*EA(iM3!Anv#*ISBCLLLniKj73+^eyM#eDdjxfI4 z9=6wRjUTAF{dhiiJxs^wo17uLMLGXd+jP?-`5E0F12$x0W6RrpVse9($uAB?<e%OB zcbDbulQ)kP++Vna9|%r_&iQ?EDfzYaRS`dIAzmS{g6iYpe>?&?gMl><K7KPu3|q!l zD+Dz>`grsyp?9*wJBZ>entbi`lf^gxg4|tDgdM)WSASZcwAy|=(Y5X2)l~55sJuJ5 z9s5aIwv$@a*f&J~brQ0g>1(~`&4S+j-STx93DM|Xh~bhmznc5iYh?s|?TYWsqVRk0 zf%`evL|05*);I4xnv3d*<xU5On`hfv7vZOWKeCPep8j*o-{boGL@W5_`bpe%PuTjQ zK;<7RmD2SgeEIiQC_?|gBMdXHqm?dqF>I52bl;|KK94-DuzIP4qrafcMQK9j->pQI zS}Ru3IC%$uguR`6@<C&m1ueoJLkRbK7DipHdRd9xsAlN8Z#qfVcR(&5u+g<HoM9Et z$Q8kEir+^RvKxVqqi93lcd-KS{9Ez8x8wH1F~8Wll{XV>$fV&-v3Nvp&;MW`O%h^_ zG4N4|Ygvx95s8H`JmOKXPTfHII^j-7LG~GP14Zhz5W_|zrnJ#T#SP>%=X)(%@t#^K zeyS@fIxe^@dGvi(^_imY!?$uTkkl5#oT)sm+X@**%AD3YV++cpCS8=Ca*qkACJ0+` zbcMklwTL=pCOH)mL@)Dtyk}YB<YkwwU4j-0#|qM=xiRvrsO?i_k2(>dT&J>-h3X+t zi6(_XLsx<(aKz|+lhs133jNS#3Q)PVDftj>ET=};lq#PDv#cj1KWnga#U}da<268| zhTOqlc9j_N+eU8WR*Od8{?GTC$?JegvS=E!nt|H6;`^1wJ8&m9WT^?2saaLg68FS9 zE8P!(1;~X9J}J}S`T-9v@%=LSe`b#I?W67G#vQHIJw3-SMWO>z*@EJpe`JYsgG4pE zCufv_(NgyUs>DAI+0=%(@7fbR>Tpsq6M%&Yur{9mGSCj8KyIj+5I6~-)<`%@BpaHf zv{(1ief6{xKgtn$nI(WL*IuTqp28v!t|{mn0gup~2oeW|sH%q>s;60N)*nrJ%#2$h zCX!8<x-*HruhgFbCa$%C9ewzohnQgT@lq3YrYLo{s&UgvETq^(gK}o%4fRy(B<N=^ z{v*SbtUz_qUhUA%3f7*uH<{5!z6sKGN*kKda+^aB&gFd;7~gTf1E8jTmIb67xmcxM zx0=^kS82T9*R7S)9UG;Oa+^uV0G|x!wC$sZ_)`O26N;BdXO<ajbi3(Cq0!kKvHLL@ zj*xCml6PU+*3Y#YOj0I`^>Rj%95!%C<)Z(iaMQ#y!KL0t=<lW?9`#S4gcAVVKw(3C z6T?`g20{&gd>daJN%Ima*ZY6*iqt$=Jg!O{zv*R-V<o6-zNXH7yGrOg1pa@6?YW`B zx2idz2HddLYQw`sO*D+H2jm+<$>R$0Ho`_r7{-bi;s$f$^)E!VU8P(ci(idG4@c*( z<IuQ|7r+u!#I5wEyS!n@xX=(X$})7*d8#mkQh+)ZY0hVBWC#vgD2Ew>szErB(P#AY zttcY{Un6R~d^&*zoD%?>=1`Al^dCn9)Z`c}4M&UGC^eruPY!r*%zc~{tBxWJ%#V{= zh-1rMBnetbDO<Rtueozwq<YN9IXe$vUZVE`k@6G$``d{%Q8rA*(b}cx2mxQJ&I3Z` zZ;Iz{bz=d{(KJ67($NcAxYUfM$fymVs~uT{6!O7}p(5V0-4U8$9c0&opBoB<F|hP! z6KrHg8}=l6_~PCSciua90bN+43SZE9>axs<fm}0E48@ynsCV!!E=V(m2(!SsVj%m| z0B~pe3BLMd*OaV@d#=jVDhTsXyP7*kfFs;&d(S|0Ax>+0j7)wJArLLKvS|H#NjMER zc<G@6asHinoRp>+#~Yv?EQ4Vg_zRd4ftSS{Fh-p@-wq%sXC|oB1mRQ=zz@-|$<b75 zh5(g8HG8g?)ax1&>w!b-K$`V(?&L~CSV0*DQ4B;)yDr^aCCY7rPXq`8)s=0VSFTT_ zEer$7at=&#FH<tx01F+ODGefGa!QF_ER3g)1bHkLXom4}fTesPv^aAJ@_dw0Bsy7O zy|Qkj9tJEPK$8n&S^nLo)S{E`hR_+2(U~i$FG?~>At}{qDQV4?RS<yM5hO1vX{`{M zDL^7MRdVH8nyd9e;@vtx1olD7f;VtkQ+04m2`FN<_7XynB2OT`0qw%ePbx@=ag8Mc z<g-CGxu<kC%95hF(Xl9j1Yd~I2H~R;)5SL_8Pyy8P9y4zkB0xoiY!8{rGO15>+HTC zGpqA9<(EI;)orL*%&BgTPz;c-M`@$CuD`84ydbcpkFSRlwr6g2Dlzfk4hEY;KaVlE zY=6-AE!93tUK?Y!#Y<w}KqiIQq@!&2JrUP8>CdF_^;^+D&JybgGQ<y~zr#unj^_Xi zcvG&+e4|*j;1uCsV)FAza}Z4?J%IcSMjF;W3_vlbN^LH4lauvwLglwh>Im+E;HZsl zsj%pO6nN;H{`!x2(&aCfdqwc2Nsm8FeHA9B?nM&`qGH%H@RKk-D>mvsQSeW;2s67H z!wj2qo)shbDNnQaBARTlRM1Y8CILpyY%fAX%AB6@7M;aYPu7Kc4Cc+tTF>~m5PfWs ziiKI@KcV9Ju|1MzCJoLfPr-XRxf@=+n_d^~R+p$#M)}eeXbupWmtT1~O-9=Wchu%& z{033n=vLp@IjJT9CnG(W@d(*KzOeYu$18IBI0P+@-;GlAe(dufn$C<mk`+0!sM`SK zunw*R$-0yd`?3zOq!(2A<VNpojHDFg7U|y(lQNx<MlZsSw$Vsr)({%88)S1sF^n=y z;5my8+x}9Tl<W5GbA*K)O0B4RU1LOIJLe;`2jlFz=nT-xdm{byrHHff_;#;<S`0kb zocEKR_<MinG?yvoGB|Ao3neuVRo9^++L!h|UT<yP7FwU@xj`AGKrNd6H7#>A5|=ux zmom}J$yTx>dkp=gG&lNMzqw0{PPuRt#h)JK8eW?5-0m=Sm69Cb_9n+FJ&LBFynu%O z3)vLVQ97@NOfX$DFX&tB6AQPvUKb|B*ZVWOd);cm9CUUc-PpHPw2fx#NfbWE;y>k% zTOXiF3C$v3pr&4Di@Gh$P5M|}vrpB!Z}G-S=$y(uGulL$!S28%kTNECu(YT2dmpDW ztXE}E?`Spt3+Z!?kxw?E8+ib!!@7dPw0~b-G4Fk6c76)P%$+A43)5749$ZH{n?<C` zYw_CYkjAZKq|{lwIdn#F8&%!tr?rw_SaRL=lq~tZIM$?k0b_jsBcCSQGbDjI(z_M) z8fDzVt$J3nfT~)k`(Dls#j{L3txlF0g%Gsgi-A~Zlo=VyO1II>#z`l+Lq#V)oahKn zaYVenax%E&d$X@*w3v$FFQr*lmJ*5l$ki`8(Lc@k^W*J06TgKA_|_)%5Np-3@HM@T zy?`+j_4@QXi|#&US-O<Z=24sy|NWzL+s3~xF~AB<sflYr%q9g+Pjf1kh3OK>6mR(Q zJp~Kdvm)r4+iS@m>N}Rdql<U4B@ABUeCJ?zJ4Z5*%VF}#&*BRj0TP4Q5>Zo8fBG$u zG3uu?O8yPb{C$vF$jE^k>-Bu5<ciGp)4(y!=TfdjCOTUp7ZQM2H_?}Upa&*BxSdUI zlM)eSthU`CGl+k@tUq-#8=@317=zB0gx*i@AIw*hgEP}$j1Mxn<U#&Vr{gV;D)OBu z!erROr<;Ti@gJTA_&>p$p}takSqrGUih80i)-z|grJq_>8*R^x_W_GmxUEzoBcOl< znbU4JpVV5hPV#RDD1NRor>c63R!LjGRQScJmKea$s&Aw8v!-mxq>fVvN)fSSY{Sa& zUX(+-JIE1yrIh$n{|FD6SnG(NZ;h?pr*rsj_egW|p^@mBK55$4zeC`8R9O4h=&3-( z2k&ftRfs*r;{)8_s67b{`_<N#LWWT~^5W`8sM3cdxK6qS(sBxka5@@uCX#XaXVsYQ z1v#wEYk7KX<k!Le0QEnK(m}w_s1q;Y!OAXILczY-kA6c)qq0sN`G)V&_KL_~A=Wvu zKC_PLt)Wr8sUD9xu6WtZe7FLhJ(3&p)UXc@#`90vWlg<EdVY$9IQw(DZiX~Jt8q<! z{AF}xlB1=SwlTG?8PJ38m7j1B5e>)i)h~hdCkx3lfqKk|A!kigho^73!}rLRRbB=M z|Nhf<ak482zgy>jcG&czP-wr8|KJEh3yJT4z&jNmJj(rduc2u&@i{|OtaD~!m&WVY zeJ#hEZ^@~fIxZ4B!$7G~f4{ibj`>8y^#AGq)wCkiv?k=k(iYyo_9tikZz@`Qk?YRU zL941(yo{{jD{HfH1qnGia)#i?3=_deQotJi%U8zXBcz0zpTpm2{vrzvmzv}w@f1_i z@Ev+|rW6v*eE9dv1=)0W#POfVEh-Qq3iszZehUx{;O>X8VS_V1)Bx`9G6Sm5SVpOY zK*dp-ek222<T(9xyBW6S$&>=x^aT}5Z?k!JIB49?<B0V3cX`PDFYbF#%qZy(hsNb# znIHB@ei3{os+R<5<K%dLsG(S>4+z@Y@pVaBFNIN0CQH4p;9Zn%9M6jy7$UfVW_0{p zxlxsZL5=LeX>mgXfh~;Xf&Qyua?RtuMy(ZIgCw3+#{IzEv7JUCIas@g!6pX=nW#J} zqW9&kmog{>EO7gEgq%|s*L*-`S9LX-uM}4PZhd@(i}8CVv0wMn>fo>3xWmm+@8|R> zl~1{iy8ZVC3o-)r9!pKFw+b*mIJbW=O1mn_6Pd>F2K(!BEonaC?yl{2l{AsBQxM)0 za6tB8(BNalegKBTrPPo9-tz7FDoCRwczy`{IAEJ0?`0I8zXo&2DEu(%>93)$jA(2U z+L9=H`%=x9t>NbVQw&G9JxcIIRWJFSUk{`E+N}BBlhJ{-&xA7OoouQm)i*IA`#<w{ zo>8dZ>}W1l*I4`M?m`@1u<plL1-IBq+vi<HN*_enW&M612Rn(vqp6H|zf|BiEzMOD zWYbgb>&AM>k^gwJfUEQwfs8RMtF9wCGnQAzo^)HPi`zX-p`osdlA(sP$a@&dQ(N+H zb=XTNj>owqEbM5h?pa~jFzNgC4kD`BX&JuSnp-T-<1%c4_ScrqIg3%A#G6ewXvhLN zU-KB_o4WQ%g+Mn{^Wf2O>k7$qZN&gdICHbH<sX3_m*j#*^yavhch9$mH$VD5wf_<9 zKcAKr8u+;xE;RW2=#9|ZyW2lP7$BjX@DLtde+xJ`l|qQXg?^Z=;gGSZan#m6+!tzP zzUv)8tVr)YPG=w|I!0mZaWP1=!@5hlAT{C$U~592lybj^3bcInmt`dg93@Zj=i;{0 zk<DYsa-D6ru@<XeDd-KD5vz3mk#ESyP&Xs~tbUm3E)x_mp@2ioU267zs%s53;_<pc zvU_&3+38~Hx^&lD^TFUm$$x>+U&HW=2&{^k%c|~l;QQEJ{_c-{8a<<ix_xCjQZcE| zA+sigeVuy`|9q1oNeKTTsj3#GoG!oROZH*uQ3}oNj$_stzT)$`5YWC-Bj*)godcWb z#$b@)xX7=+E%x^i>WlX(9czq!-(~jFq^b&CWO-kA8+%0tPzBgtT={>Vz4K!Xym+)r zpMx1CXB&Fza-00<f&?Y4!*r)9hTGAvcKUE%{96_NTZ&l$w>xr%!m~Ac3d0zh7pPc) z8#qMCv@z&k%6me`%;X@?2I<>9TU4emp}bP74}}HAeh56#Fe=W0APLCQu#@4%oW@4G z&-`~cvDzfaAiDZu=jROh11p}ha40=C9j>v~OMmN}v>*l~p}n|YG$<!r_auD2$|EaA zPvbIa;<^44N&iITNPWUR!M`ou5GSF+czyE``uP4%;zor&lqZGEW{3D$l>?<xSu)hJ zCY3#3DLt^0ZO8cD>UhHzR17nwna@{WHC#+KSKacsb{<}ffQ$e0O;C2kpzV$q84)7U ztSMh9jeaXppTO`1(v8whQKH$E{M8~R<XYlnOSs(Tj%=p2IG1UQxR$$1f?RGf+L9Mp zCAhQHIG7o}RbWoIYpi>qYuU<Q3|$Mx24L(v>v=0&;4A9LaEdOL`_Y!66jGx-z7CA< zfu{rW>C-Y}@vAzWAE+8?uw(mNIg`(tN%kW$+{3m>E{Mc&E4R1*8(u$*DkhgfQnuQm zO%@j9{^8cuxreHHttR?u7k^Nqd-Q-np}87*@#)5JT7a=o+?0HnQ9u4hI&Zicy&1p? zFhC_ln7m-M+fL-_6iz_O?cg%_4kKicZ#_#fkVk+-{yOG(PTVqFlp#LvawfhHAU5c+ z3{?I~39L67i)b{uSF#C%)p{xslPob0TAo85OqRpjhwd91$W)tQ)0V(459kam!|Fe< zsc-^GKY>|W)=yaty(8lfRB~%|+Y!=!dZw=mSDIhffakdr7?)eYo}7}5O=uO)&D$8p zItQ|+hlyN&qp%s`o@OjH_kgIypOw~h3hKuav9ckH>l6A15lX_qI$t)6U9)T4JX79> zJoctd?m3OCYP?TgqCo#+K1W?KE-`HRY-Q_guR<5;jF)xu+MOhjc3&+Yt!|sXiumc_ z+WW?|x~Z#qP<2$Ua5~25J~w6JHIzGZR6Cd6mU1b5pM-Dw@Cl3o58eE?1CRUb!cE2; z7#qG<M6Q&tvrW$f!@n67ALwxxJ#o_yNZsQcUe=Lo5=jef*kd8Jh@gnIyt$6sy^qn8 z9=gURBg0?J{{SZ^$j%WxStQ&K+$O!$jHyGl#&Tkq2e>ToVF}U%PcoawgiuJ{^>bVX zY=oKQe}xT5O1$Rr+1pC)6qTGWHilL2Y!#wkl<Srit!n5vov?<W))*3`aHSi62bj)G zq_baP=pzrWYG*};9vk&N*q|5B8z_z=J=o6|f<y<D)7hEGny#Rq`ujLLI2j!ZEF$EP z<^Px1tOm{|;TFodL&{U^IXhsYG{<&SvH%5NXfrXfGhQ#voPSM+F}pmycw^}M9-Kqv zGB{y$MLXHzXnp0&%Cf1udoM*Mth?ecnSU!5F}@p<@#g9Xv3AUUTJtS6$a9|&Tre-f z=(ZFW@vt;`ep1f+MoGkGUv4LPl6=kWCiAcST3kAUQQJl?zYQ(_N*#-nxxMQ*IzY>~ zu*f9&Yr;EN3_tYm9%FU>WVS#NDV;Ve-N__aI?Ncy@rrf2Q40w;-XYyGHwUXJhAr7* zaD21vA9&aNp7kmX$Zjn5MHFWcD$sKlyh>OC$s<WHJ7)WFEKF|9F}1P`5Jq(2h_@oi z`pDo1^^KK$IOjn?W#iAn&k@J1n!l$lxGq0t%3m~X%#%zD6Tf){B`lqYp&UKiT0sCQ zKfAgs27kJI`G@<m$Ur4c7j`pV3*>yH(YI7k>ajN|ryZ0Snd{eqYZP3IgD(5*{P@MS zt?&1GM@amD+OPnVI6ID!(p8&(|Gp~2#LeU@zu|yB-=FrPQ4H8;-=gJy__8`@+%bPX zA71fULd*95rKjQ<`6lMy_aTxk1Bs-Hig^&HLU*W6&~IJR4E`|o*vu#zM}5dOA4A*| zO;;DK9{2vQTwV~I0*57sA~0I;Dvp?WM5wjMvkd1dGR-}(jO$)rI+rUemkhy;6~P7I z$ZX>fAl2@<eX?!s*~Cie5|GV?pCN78=;IwP6m66xNeJ!dw9T)Emcd)hB+AS?%?XVx zrA<3vii2$u@HXIev~TN2Y%~k-Rvjj+EOBM@umnKV4<IsGh89GT(yNHyi-nrTam~uq z={0CucKFLmbplx^l$fE0%JLx~%BZq?OKJoK$ty237`ysdA}Fd&ZivZ~Hl1PHmYs?6 z03<B+Sh0SbieXDFjrp=53d{`BF<&0_vK>MybM0n_0WBtH5yL~1bDH#H)ysnaSjV5I z3AdYIfDRLW`FiEc8(&_g8qH7zWxwQSaBNOE@7nb<{QRI7+~}00995KtV!jAk&2xit zv#1+HEY`G<sMY}(tMt5dm)$iJ+*VM49@@q<)?2O0Oka}twk>M1at}?GT)bGZri9<E zxOMWX<Y47MT}u_fw4|}BS}OBOFD*glI$;!nhAR6D+<k|7YRL)>II9Za5J1p6#CJ0y z5dtcvFVbeGBhF{cpG|x){Xwf{U;CQOeT&T>TL+dli*qd7)1}3i+?@(YauB+UlE??~ zUny($CO|MC?=7aXt4gJlDKXAzC}M~UQKl@lEG1r~YLxBm>jWG`@aJlo^ikiGeEySU z`*LetAXhIVa!UukciYAE_{Wz&B_*Zn96$du+qhec9DPm$X4+K{J&-1lF2T^W#?ZPB znR^v@J0j)EV(8_R6_Mum8%*a?C1}}@e3==&^?QX+vs#BE9$Lz>qoAjz%JRCytb^N7 zdZ6^pBWGSbf}3a=^B9skfaf$Po3i>^KP5|MY~X$KzOcqYxyCVUB-g0g_n27m3Yphh z0)<q0cdmMjt*)_GDf2t}IMpJe&0MkR_f|O0>~ba9!CY46T4nwrdG5UX=eDp07d3fj zNBtUa-x?Q%VeiAQ0p10Wb!8FM`-qb$@(9MmBpX27kb?Ly0u@c6I)tJ;j8*{ui>mRj zsdWRnc+NQ+EFXCNSg~PFeD<_Pxz3rswZ>!6l*3UaNM=is1K0FOk7B0I!xh7LoI~#z zBij?BiP<2s$XBj|5yp?Y!@fzHQxixHQOhkORHH3c>TFn_KNc+f`^7f>x$RiVORk!i z){K=_6)%Sc*z|yGQd6G`8r*V0&!MAg#)soV8}W+SBLc3J{-dM1%c_dR35p2y4rDx% zIc{Yk{_(b&X+D5BDuyCxgcrM|!PtevB%tda2jGC20>qCh)sIBAVjgU%h%$dwg*BKI zM}aZXCA;+@Kc@*DEn@4{BT=<aTELFN2}g3^kj=8X-ipv=UXT2S@<M=<$%wq`h`8ZL zNR!&K8xEIAeCsExh8FkI7|JpN_mWNe#zMCY1XMc;tOIavSdMzH+NkX7&W3EL8dR3W zRgy`K&xC;OZtCA~y4#p**p?X>NH5EXe@L^$Z<5JJnyItdjUVD+ocp;Y$TH5&V`A8w zLVFxts~!Q)8sEmaof#6@&wVN2g^xdV6968Fk~kD3e6uY*hV?QDE!pSMX5M|V4}xiF zu|PDkr~J*KRlO-7ECV=_Xwn0B(!p9IlYJrkf41iR@dqIE^9t~fo>>0n%uz?ur+?!% zQ%M{66EzkSycYJdvmMcz6Ot!mfpa^7;?D(tnE%B!)FMihk(uEBfgi5PE>-w3f`2r` zJnr6BcnR}DDd{iIsfSJ`yt;+F&V27<m}GG5^?AJd_eX;)zX@_RqAQr8eap#MlABo8 z@y+6KXq3TJ8T3n7ORi{grMWIy(&TQ)G_)1zJ_RJy%Pdn$FkA*@n|mK^PRZ(XOijMq zZPF_0*Lr?$D$E2C)j>}BVo#K3>Z<_fw6Bs?y$9vC4&=PAE;z`4{?HUBJTg8-Hwo4j zM_q=+(qTnLSb8#xLv)EB`}{a+*>&^j-zIA8A!ssJ9hU;<)(K5|0{^w24t2gN2DI*Z z3mOi+0y<2k@J~M#_UWZ>#la?Z*Uh5&eS0*|aBN%0Q1|8(Vf^4${Aa?D#8ya#Ff^|f z`cjynvK6qF{Hp=L)Q<;wBTV#FXS@z{E2#aW<&4zAhv1ba@#nKLM-1gm3_(%qWRljq zej?bZaJ{2mvFoBDGt(dU`n{gQCaE?x_BOn?qYH>Mae6&~tDj0m3PmshLdOqK>~|N} z_RdjrVaFSw^XkfMo_+*P9gsXtq{G<gN7>z`*?(@ZFH(SNQwE3*Li_`^+R&XC`ny<J ztZ=ODO2vKt>E6MB^C9WA^+H}*1G#IoiFE#+@p()CX}znchDrNJ$%%cFxi6yx+Yo(T zJ{ZrbAuynw%YZ`7Rf+4FXinLMIzP$j4au42R~3G`OYy}2C|PxJ<*HTNo%m;L&>~{K zqOw_jx|e8FKtO*xhe|T%Z@q3rw!oz*$H;|{OWAwM<pNjHn_*4iw~N9L5+(UY<?s_^ zd^&_OG&gx-DdlWW%6wk&&k{CeIQNp&=U;F#G2g$-+@X_-rjmI`#s4&+vFJEes;j?g zqbl$Hf%pl^Ok!#god(vO-4%Y2G(#v&HcI;;(d@!)Ixdbh3|GtWku=h=0ZE0$jXkSy z6JNt8nu3W}sOu^k;!gcAc+-idmmp4pXax}L{+@oAC=N;&N9JA8s;HV|KxHcfiXmX_ z4>3@QL}RvD^9)t94o%a>$&1JdNN&#kg$vEOvBzIBHt8kd(A=G!ahhkj0?&=vzGMjv zb+LD;@(mdC&l<N9ND9^OGKh~b`l&dFz^Re%-EN^WEXJPbPET}}?FSXXfgtNzBM<8* zHr%*QJ=1mmxC%)G6)bq9dha<tzNfDyw-E23{)Vw3M0h@WDE4fr5j;Y99)wDiWWmF@ zeHf|hGapWdh(MDl0we{UUTDrIIu|K<cYq&@$NFWfDGOvny}xioXsBbo5HEl=N<lAF z`qAKH^5o1Wsid9B!O@TalkD=T&~S3KnFlYVo1ebzRNI#{6u)+GNhm%nQidVVHv@uV zu2F1FQGak8AK}Hkh>7`ybdlTd(CtzNNP%l`*jS9QC@H#?7n4m-Ua-V_Wh`o~#}cW9 zurxNDH>JnQO2&~(DdR;c^CYcY2cynH(6Xb1rbc2;a9<4(&BlwwB<;-=R3yck5*t;d zXdb2dBY>Q#iQbCGUo-b+N>`G+$XPS5k7nK{W-lJ)Dpye)U#lqLt-DG@L!W3oWmrwu z@A7mF^$q&%C@uYTEazzsX!x~DO4gAY=Q@<%ys2h7$SGHO^!HP2TWGMUw8?q9H@nP3 zmWd}_z0klY_*OgSNlqSBo)VysJ@Y85W|&B%I{*)mBQ)yfB`w)S528(cH$-1$+lzTk zm!ho<Xrgm<GN0=mC-ICH-Wp*@o=&RH-`r&l$3v(FKIHd(S&CT;m7wcu8gIjw7!mlR zZvE$n1b(*$I_HHLxFVFh?l*_*iD7g{QV}V>6Q=eNrDdpdFaC00Fo*<Cy-#JdNi5@` znv9?Ws)aP(0FqOa{>HM6BA&GGJ{twg##9GWIhufEbd~8{hZO_3JiBsk%s}$g!vqE4 z?l)m4cN5);s#CS<gLD)jPG)aE+>*TtBHGG5aV%<R+a$#H&^DE46tQS5;5n+~ZzgzH zG|b|pe=S+W2hBb!Q0`ahOe=e+kNYI~GiCdA;GflbtN|@yWOHPJMK6t-OmJOs(TOnb zt6J@f=2O4U`~>^2<0HiiJG8F#;17|B%HQLIJO*AzM#?8>D;7BEmnh9~eabZ--~&V^ zycsYN3RL_V@n&Zf>Z!!x8_DubdEg`67m;CcA}cz_C|@Fa@tDu;k3FSW%#kX@ty(dy za5}dLaC<pASPJnvT>tPA|2Q~2eR&Ywc_;FD)K%&(2d!!8j$!ho{<$*@C9*89r#%g( zem?*pAX4<9c<W!~v>V&`<7LO5iozP7s%5D~VJM~$yR$<Uh1l>JH50odyiur;SgQ$D zyp*k0Ua-3Q*!p$N@Xkur@)K?LKpYF3w9?JxuTy$12F{R7@*bFNA>+1ofiMeeUK<so zOd5`TMZ91NnS@eU?OwbpxkOnnFOP`Qa6IT7@6fJgenv@d25-9j%t?g;s6Ge)zS~Fv z{1+<Ca(kHcKdjT*D3evI5CXeLNSm!5U+V^d8cZ70n38$5&i7IuQ|9dlx?iY9F}LoD zSmBPkMzud|Y|-uObek;W)GzKS3O?1Y(k`K$+sxupN!(u6Z*oPPC-nx1xbGh>x;~n) z($joWOzZKvF;TCo?#g>FN%;4X=J7T*PM15fNPjthJmW>?XdOojb=S$ZOS5eX=JvYk z$0Mc%_n-397vEQ@J_lzP<O<D_@PD26fOm-ezBu@}qmrjT@W%gOes84v72C6j6)Pt~ z_qvK(zScKYn!mmIScPR-2)DSyr<h(kv$-i%QX|HYkhjW)L(TvG@QwnaAs9&#oU?^G zfR>C%8r4<|UoA<_QTix=+n+Ov9>e0qN9BXdLdDR%+1&lPLCjb2ZY$PcY?ShSiV)mN z?2L~p#>kmK@d)b3$LLh9tjk*g+bu_ncW`&6S*{bcAuJv0`D&iva?OamE3W4(^j(^o z6PZHT^KI((7*-4&DC_h62NK2phY}rY0Bp;7HnwczkS~a8l~pksw4yt?8FfS&Dl=p- zv87!9P+ZWjongTLOOAq2_wrE=3L?=O{W@{JQOD|)RY_gtY<)YOhD&{sckEqN54&P> z<|L#yQya4n#h+XB<*Ny-OF0xZzy4rz%pXN+O!GCK8c}diY}HdYS9NEu9mvO&p2V3% z-YMIb{-cjW3ZmYi<wAL+AGL!=9jKYg6VdxU!}b}lWnTVow&&8cUo5Cqxg5PTH+^Hh z?9J`&s2NZDPkihlnpuYg^(EK#AFor%$X(l4y5LU*#sPZ$UfU**yd<EsYHiOC3AOGP zT?<R<e@H!<*qO&pb4WP1$d&_3yH>3tTP_^=pGmXC84d1uB%u6%%;3^xwjJWVc2sjL zWw$9ad!V{)aVxFc8!qde^ix$Jv6x74a+DosebSJ;B|y!##(()p83uf2I+wleVO_E3 ze|0?EUBXg7o1uF%MEel+&8h1Z!9jyJgJ^fJV-oLY?>8hezh>%bGofX@LlHuvAxWyw z<N(X2^Bhq*`rNzZjub%zcmuy{o>)D~!mkhbYy7?V33(Lh-@0-)LO>;^$bRiR)e|X| z{O~I4q+O<FjcaMzs*&#GW<54sK5ByXGlFN<BjlwcL*oD7Ly+A)!rKqj6T3JVA4sOw zuSE;&?uY~*w))hTmE3Ta$YkLAkj7KXKZ~))W$BvK)qaW%ge$4-<<xU$d;)P9;F&cB zGPAGhr&gPN#yb+^xte$->mSUl@nttG@B?j!SdL!Dz#r{o#%nDX68Nnksl3(VG)?Ry z&@M#H#OIDcB`d8ERGM*d8Sek9A$210x&JrkR?8fr=CmA^57_}rE~kZApz(S4&(KRI z=NkV3J%8PR<O>}AqFdP+e@<$|&>Z1<5hOCQLR;tS%I<4Os&!!!egCN;Juhaz3B1<Q zy?CC}66a*}e``o7jtqPqLm3L<Um`4}arl<Y;^jgrse0YN@Tr+*86WIov+I{@*jRp} zo8`m`-yf^BKgHws-89ZCUq%WiTIi~4$KlnVO-Nc_769l)pO5z=IG#Ju-P5Mrpyq0J zjc$Fd8fL(iQZ?u94jb_?3*0+Xg>!2s`6!|mR}B!~s2}zJ+16X*`S9y8$v>{6h*lI{ zws*YuLpdgrQg|8{wc3BvN+vwd8Ki*n=7#g?s@ldc<~kJxBHeV~W-VuxidSEcx|nFl znAT8EA~QNUQZ&`?C!bdhw!e|F+YYg)8wYxw%1Q=guLgs!2*BOxJG>md`fB!~jNkN- z&~eXDT1gxkx{^u3SDvAyUBS?HLm-+{FZQtF0zQNdqcu8oO$fmiC5Lx;{t*;kOtulP zTw!T^Qq^ZtS(V$6ptl5_<k53KI(}sq=HSWP_P`<(Nxk2L|3LD&nzG3r<7R$>8b~-s z)?|d~dI8L}u0pAo$;LPh8zv0X5JsG>c4Km&dQt^1GW~yb7j2uDyC+by(~mIyX#L@S zsET7Ky!M|kl7lOZ;7Bl5C_iTYNx0Rg=E=OlYdli=LY9o(ED)G16bPSWDU3-Y!ShAE zQk?cn;UWqdoR#oJu6_9Qi&Y)`zPSa)JM#(PcmuTzC9;b$wLco9!hDqQ@q{&@yo9M$ z1AP-6=BZv%apw)r3m82StNR>s7R>ScqY&0s)6@QY1*&&&49vy8dymPjF)sDshQGdK z7^NqOA=^qQ1C;@pCU&LUpQCVB*0LB2W^je-Via$T(0zviVYS~33)n&qK)t=PN8#H= zcqIoCOppbvruZYL2>Vv=IVJahe!<$p_z}KCj=;%4xk5_Qi?F<wmn1*UL<hd<<71|D zO0xo8Qg?Yj?@ilkNz}rNNUlp&C^#-i;t1<HU~ht*^8^S`d4H_*0Yr(G2km*0&4)Tz zn#CBI&H}t3kK7t_X8u)+s?SBkF>V^j8|gWy>h|+XjsrZ0WsC7!2eQh*LfNE^fRZt5 zk$rIqt=nB9@cgfG(9RnRTX@J*8>}z==`x0PDD44;^r>&GkH!xF@AP4}2^t(_xx};d z742L4*0tAgCqTfjDfS;FrX5!H<9`YV`o>Bkw2t>=8Xun!ImS>M#>8O3QtlTjmkL(( z_CF~Z2ZJcD*sJMxsPOX#v`VjTnmkujs6^lYVe@OS(%Sy4b@TrFlJ|`#LtCfCPeSTJ z=!;0m9uKbhiY-a-<iLk*{>Ndqlb-@_LP|bziD@kdB|N~8-<`%jkc+s9xIg5MogJ{? zd^l?e854VWk<<P6i^#K(VzI%3TS-G0dwIHPKi6g9MCdo8moGc32Gbf{?#!%huU&n{ z&NH9gomgeiZ23%Fdhv6(X+OKgew6)sJ&au^t+C5+^0oUV{ov_kIaB2O??sm-8DVgJ zKlHGUqT>A5e>*y5ya&$||6Wlmet-AuAIDST-_wt<zkFUky_tXcFAf`eFz~FsckLzi z?$@)qy~<yk+}JV$0QM9B_dUB70@Abs8P0$#!XOS`5Kk*e;0z=pj3eQTBi)K4e};n; z##Qshg&X4hh<Zy8!<*ZNZF}DkW#Zobz+=h;czF@>+X0DH@hpUKbTD8)7+5G1Y~=GN z>g-G%Mf}MJa(Sxmn*lKZ|JM(=^GRO`>RHavcMQ`fxr{rzD9-$Kbpp9pCva!%_ZeO^ zyt;j@Oyr~wG2JG;jm9E21@S9=3B=Bb_k2l;UJ==z5)umA-oS`nvcVpZ5Z9j)-OZE2 zGr*)@9+?{uU&caH48S{kxVhUCu5-B7N>u+71!lpph;z8S0r7Jecmb5`a-?!{h_NS{ zoS+3t&T($jM66?E3yQ-17sbTN0w5eG6M-N6V0FQ5<1t^PuxpbgsiB!Ehq0<(xGPba z#VhJ6QH7qvH2n6sjVNM;=>9BN%FI)qk`fW0_xFo{dl#vagkhIL3{*xI+<s@ShGcL3 z==UlUTs177E)dQeAw&+Z^xI%-iSz~uM)`JR>ln%#7T9qc9aj^PtuCF>^GlmDr&Zvq zWf)TiD;Avay_9}Jnuv^rVo67LpP&ht@d*X7JaddeQMC{K9iCye<p|$hWN4np+Y|X| zPr|z9hkzR~cT8NMea;y#t~T44x?>)HI%aAg|INBbLN>$Lx&!7I#`8q7jFzwYYeH@8 z_z+--W>rublE!9?x6PQ32XCnGI|Zrzn}l+PX*)_>e4E4XwEk@I4Jf9g?Za&2n7_!T zTQ)rY)YYs-{J3(4(P+x_a(c6&F$EPcwH<YTd2edD;1-$S7k@t9CYskV0xEmV>$}{7 zVuJFCf<^BHpS$vOsDDM23kI;^T^}9}KbNK7!|xyRk0DdCCqHL?C|dMR6@+>N0*JXR zVfpV^_-xboxGwoNocP$eJ!Am9Uy!^$3u%GTwEhrM$=L+7Qo^>!AAM$_Us<nPhhY7a zB8%^LXO1K@cJW7dU{}6pjwnR29Z5}FnSPmUD1?eB9mdsuM&@(jDZ=g2ri9<dH49gg z7E%h$;KZiuH{qGli_5cIAtU{frhb2jvcU!zNXxcCRT<QBK^mk(IvLf<u8g;;L_Dqp z-zrDw#zFdbXw@6x(@yM}09y3W{lQ%Au{bM8slyxj+`ASRqr_l{B(8x{zh)((S0fxp z!7OLAMeWUXM^%uW&?eOmDZUCvWd_b6(%T{Ozhx}x-XW#HjAayY)U@Vv6Rg$%klF@N zdYkmTHQsVdTr02BwNzaD0Y9KsTvvISyLg$r%tZT+74c(-mVT#?Gf*%cLm&2>vs)RA z$T4F0$?eXp_Y<Y};Y#zTxPDrNhSimtL!i0`LIjjU01o1#KT>6z#(nL=SQm?zivwwL z4pM3%D!Tub_3*F1a=u|RcB#Yp$IMVz&d`aZ5DhvL2arlmD!jzRzy8L?O~K%lIiKKv zOM-y0i7P`zt?}BZ$DVV&TTy;1@pvUC;_pK`@+-=DQ{|tpD4kl_Q7HUE060#G)zN_= zb>jYg#uQ`t=z9`_WGcI=GeZl8&Jj3WsQd_rncA4^{}6T84^78?yTCUXFnXiAyFp4o z7~S379nu{ej1K8W=@tP|K<O@#Zg6xX7zh|U-1l>ybN+_?^4<G$U9SsJKgvIQ3Q7w? zKi2^e&&lU*B(WUihRZ0L>!>)~E2Q>$>fW+JW;?h)>@gw79kkgTbISd$T%IT}vAPhe z1n)Yy2RlmNKD*^(dKc^XjN%0LhUTcorbRn8e3mT%`UwMN^WE5kT#+O<-zKBd-!4Ba zoI=<wSPU#qPO!3l@=kgM2o40;tq*4Qkg_}2i#b(szadxkXLkDK<9!up9U<tUUQ61B zBBD8$PX7wZD0kF_S&X~+(7Rf-y<<+zg2jkP@QRX8`YOhY5pwI=g!o&Nk6N#aJ>y*Z z*9x`yxEvVJ4z-`TJc2R&+hx!=RIvnE^N8>Os<@KsC}~WcE|>uqV{HHS_-x>493~dw zKruc(Md53f7%yI`Xv8<Q{H9POnG-i71{~}*#POgcev0%p!w9qA6PW`&zcSh$2vHbg z(V)RBvm?;R?-Vx5h#rZPnW?JJm}0ARl#&@%viKFG$sRrIC}T4sTDTYaNi-CbHKZiY zvGNx$B$(HR?NQ7XpvvZk*F_=8y&o`b+1jPQ709+8I0!q?x1`E{tirMbQj+NSxgW>6 z>Vm1;0=%;WbtxZzbE|DJx`0Bu)CJ4McSUR@){O7uRSN<+zsYsJv;Hy<E&GbSH9)vz zSLb8o;j3uMz+Q54L@A{$J~t?FF!!Xn&~$Ey9;^t89i-A?aw#8`RG31WO}L<7!3gVS z1R+S<N=cWZj`;m*LVu#plBC|O63c|C>)V>le_dL9i|KyKL1+OlGU}&99QG6(!gSaU zA~z2IYEY$ADIprvP!;?7;RyD<%=mIc*~0=GrqsU|TqlyU{+RA&qsGM;I<fo`mlRYw zvmnW}{9iS;BHg)cCM+5#;=ok7{eAG2yu!DOFK+koS=j*LrNXLND_&EDCUeDzt`qUq z1a2e$D5{b#<cX8Ufl)ZcW!Fbel4Z;x(mcoaS}>e?;V(n&$+sK<b4^@pqsCesFeB89 zNYHkI6R&`i;ryBpe`UgfivEHdzJ8S{{q0jo{6VQaZ<<?9MkPAO;`Zy&!Pn~>$&)c3 zE{AZJcM(gk!-QtpD8g;Kl;w5zf+1=Ms*|MR;8-5DI8YKhs+&#rpoX#@q32koU0HQr z8F+P%^{puGLsePK73a}lvkhl(@hF=TfWmA%pT2lDaNY6FHNJ1C*4)F}sR-^%F8nZl z7i_0hiz2?3C-4bpsi$euG^Jk+E2+6pk`4`gwDP*mOSFH<_1*`*)-6LwwpOkC|F*CS zGq*|?EW`0F`Ji5!w7~78*tQ36TWc<8RX5N&08b!P_&q9Su(1BX==tPvglO{&0YsR| z5U{(>u15h2$NQN{0JI7(x4{xM&(JMOB&A6t;hsCHiGBs&P})#$`2)@bHN4}8W+ioG zrj)#}!!LF^FNHX^8*qP^c7Gp!Ru?-3N|=gX9d5AGs12l2jl`>O#HxqxcWeJHj&^@5 z{jsvor9Ik-mus_K8>2lR_u0qqV@ZNC&m$n_P0~7=9#$Sb`X1fS<?*eSR8J-wVYBxn zlpIBs{ryEX_ZG>F%gDbLX52p$sW*p5*8_(0DBgxC_6L=oN)5lE9(K(c?bLs?PuEKQ z^Lgc0G2pA>vCC4;eOJ>;UG4u7v+q)smJ&#Ohe6<(;VaGK|A^Vl)E1T|s)UlF14AFQ zhix)lJMEj9rOF5(>q+P2z@yGZ$u3goF0r@hskdHTDd$~%irsxf6R~fnbWu}+X`?3& zYqbQ^!dk;NbYBW5Kke|%mYes!s~iKRjpJX8H(iq>W$524cqV8&1%6@-l$n8hkM}!x zt4Y41dNJ)sF2+zVP4a00{wVW`_$p}dj{-m35-fj$2v;u)%k(10iwd671s;mEhpY_? zn<m8k9W^d3zF%1j>m410S_RRMc83jP(gW6gVpvPK)tvI8X7{9K&ttvPWUH@96mh&z z)J9!bCztz7lvK`$ik$Jw+Hts-8vXR<);`fT{KcMDM)1Q0q%KkXsUk7EPQd+b0Alvq zBXRSiBC6xB--<wF3;oXGtdpo6Q79C>^XrmVz;F9h=dilv_n7yNmJ8#@H*y?(dvO<g zIQ~%GmkH3DW27!1t9_evld|e>>v{0buxm@NKGgc9wZ07<C2_LzJll!zgASZf%9u#O zp4ptZHL{rkmHyAAiv;Tpn6dT5^Ld=t2=NwTd}HEt8+c~gKDPSwy8-;X*9PRc!<@L& z;+g|m{rB68F0Mw<>@mbtn?sHIejAv%jfOyDh`XD2fTuU0jpz5MDx3oE>xVwNUELdH zSxnB($9E9RZCQWS)^9kkzOdMS>+!j$d2=CQ3;HD}t538mIQK&}<|p*UPiyo~d%0WZ zm|OS$TW|EOpWLsYm|tQ2zo2^P@0`M%hPqgHa8ln_cj+<TEoHCJ#CJjcIK~y<^#w8C z+fhWm!jDH^M+0aYRSwF&z(yd~g{R&uNqU87$9L=xLyWTT`+p-0T$>^IHS+kF<$sOk z<QiY1SNf$d82tfzND|A-3w7yg)&XL-S)EcaU>-S=4B@rtk<{NCO{bF%{{vodR7q#1 z6py45aUQ3c^KFPM%C4EF9{l$=0_UJoJrQDP^q-TeYLSp&hS~6FrEa-Gs#Mg6c4zej z8D0i$JTWJH%Y%R2jw@VE<CLlgQJ4!xY|3p+erBXU{i~BnX-eHrk>5e;@98X0MDp{W zZ+22n7At%Dy;i3DFogTqB;{(@eT$HG`GIfNYS!t?ucKm>)#f;nJ#C=VeCG(&J9wO| zTIx_Na{Se5E@CeX=JSxpj8t=eBH1UXeYlrkrbyY#iOcFT(<@z{{AJLa=*`8tsM{w> zU88l=#E%+ZQKuWD_#kKaXYGQc3pH68qgjoZzRx_@#-5vJa%V^MYcaj%WQ=MT=1Q+Z zQ?dRlP7dj^{k{3AfU6~wwGe>EqE@IuqY(JWP6`EWB>+1zHC;G-a_yAKZMyV5AnZvC zsZ<G~Bq=;Cg$AjR^$CYWF^f=E4-ubg4E7nVp#=UvAd&%G&8}fhItax#Jp!cB{%7$| zc_<`}Mg6?85c&%n6z<24-KHu2!;all*~0&n-N!CPy|&0LLz(RbBy4U{^4GmPv^+MJ zi^Wjj);ueMfm+H<Usj4|1y^mWQZ?r=O4POB6V_Zq0j<0TQx#pXOC|o`pKn9B;!KzX z!4wq$)hGYD#*&E=&g^2r+<mYdZMHoQOx9tT(+lD73e>33W$qJA5{^42E$O{Ef32rY zsIlg^a~e&9^q)fai6sgSl&pjHBd4<Pt?pSfc-+);>jT;SmoDGV*PaSIy`JLD#X)L0 z>WUly#;C*uXX0^W)v0mx2~vzO=f#55mcI6%VAQn`4eqd67n20IzZhNg^U9H%1z3_! zxF7z$e1*oOjPy06ncLOjBabrEkA~Dd(X6H<mnP_*e3|Lvd%gggZ&gQEiA)b|lngO= zSBE*-lm11e^8!PKrlizMQ3?XHC%y_4YgE}O_4?nc<%dV?`Kt)3B%h4?_l!~3Y<R6c zT~*{5i7HcN<fVai?dL}bSW3e7g8)j8er%HQ^`a_3=xdW?_tBAP*rC47%P{2^symBG zm<+Pzx~FS2&#UVctGi@wuPI?e3T1Obl)C7*ExNb9_hGuea|wiA$*JdI`>($(#YvY; z;8lL{mMFO0SbYobE+zfq;Rk4z`1$)ou|(6?m%0s8jkt|80biBb3*~EQy_hhmsyXa# z6>!ixS_p>T>W2Rt5=;<(yiopcBypq>=d2LP_^^vB_vkDF-B6gURJ^bLN3WD)0YX`= zfOPHUv1G-t-jx5<D-mLZ^*;7YH%uV*LJsno)&vPUI);bA6iKy8m;XmrI?$f#FaCeB zGFAzxrbwIbAi(2PfnNdvpn*by<Nxi;j{<Vr;sv#;pjX+HNkVf7xioUTjKUFinkp7P zHRXbo;Z9P>AnmFelJ;OO>CPGn$5txGIP6l88q!M#=1$-qg{nyJwWV-m%5z=$5vqa_ ziHwsI&>3cC+GY>jLrEm*FZ3f>sg-37*|p%it*sr|-PH<n%m^TJjJ3M*7v#8R7sMTz zl);7}*+lKx9H_EM3z-?e&2O(tF~29cgCGUVU2t{pFrH&*cs<*!jdbfA=2Cw0>{$a+ z7Nh8Ghg(j`Pda95QRs^)v72Q5QWl5?V2U#TEy+ot5}hct0;`yrL48IErf7s4PBo-) za<TrHg&f57Rx0v|1FMI1>)u-lr&?a@;T|PtKbnVW<TQ1lwtMJpFB3MUQpIj8kjWOv z0YYfxWCVATMHIo=ZA$Q!Tv}6YW@<2F3ROwM?J{KTjGK<&21b60#!UjsV2)5@L7P?~ z#&`ZKs%4tJzBF+3o4$_5^X{29HqQSwEo0o5NtXPy^G6))X{d3(&dp=nWgubhQK|Mh zJY-uaVB0H_(ig~VE+#Edqd{4d@lB&?9}$U?@|_Z`Ms=-1JEkIL?1Z4wl#$KpC^H9Y z#zv@-Yhxpr<@FSwvd-hX`~M&GI{ULPMSB04N4Fq8A`^r7`GY<<I4p}yaz54L+W{03 z5$hoC+GZ9p7zA9cztm`#&U}3=jf4Q+R+9642rR+=*E$HeD`)3KHOn*=BiqI(sa=(U z(NDW<t?KLg@}fLHZ%BW7Rql<M*Xm(NW%W4-Aa7b_H@^0d#>|Z%ScTsIE6<@OscShJ zOON3;IRPiqBuVIq@nKELc+B4>xQOy2#h`C4M~T_3Mra7}O;*ga5>UneEPh2QR`SH$ z?K2)vEUShCGK6o>Ods}NDFsS4*C+@G$y}QPsxMv;`j9svQ1Ye$C_&M>r-VFIB4E2V zk>rcuUWzOPTl;*5SEi%$wNk0`6yLF^>f~oQ#gD00KD-LBF_#|w0m%mqiD3*%iW|Ez zmLub-|FqZ5Hoq$k@X;rp)Gof_@baeD%pSbdV@b+?TRaFo<#*-qr7<uh1kdp12`w*^ z>U-|(nR}SIf|i?=&hdlw65J1138e>O-@Sf~C48X7q6{CED6hAjaAv|o_cRG8MOtP3 zU5QO3n}qWD&hy+{dGV9lU)wBwntCC$*(=}uq~h3-&|t>Yze|T!&NKapaHWX*9|ay1 z?<H1ru>cBF?tKOSj?`}@ZUPcwxFslKo!QoJV_*ZzPJob|q>5)q5*Pla6bh$<D+aRa z##O=W-lyDsl^3HpRhf(OVbG;JXgunu>wNn)`3>E!0g-#?;mwPPT#S}RgE6u{dM|P# zK+_g4J1UqKRv@1&ShRYRW-Qg>J5=Stp0kZ5n0~h%P1fKmVfo>o%@;4&xKm9|Vg<nb zx2X}J%K%Ow``Ioo-(8fm$g79shhmj8*<E6W*$#VKc&q??h;~;JeYx{&{#QSzC0S|| zua6Eq>{Gx$k5JBM>KM=8bWKNHrrT1XGm2=sds2)UHs0{2Rhg`@E-dMbMEOwZ6PC;0 zfP_MU1ak@5?)0oQj-Ja`{b}IPH2xFzZAppyqp1kCV#auwQ!~56^YpYo4w2D9?aZ6L z^-D7RA+-qv27@JqC4RSotD%3+V`A=cSm+9{9}eu2zD3hW#O#>DukuLGDZ{4a!_J;? z|4VcgoD0RA(3VJa75)k7x0huC1_A+r_*Co-ond8(aLQxWc8L&(AEplq+v6H!)XBr? zYh5=F4SmOuBd(`@<jgS#T$d0h9W?r-K-#mb?%r+;&BC-s=OJ+iJ?ZYA_l-ZHyzwW2 z#w05ud9q@9ZvBbpeYq*fRP#9G?EXVl3a@xR!XEt;fCy)CizHXG{Rp$F0Hu1$aeL(5 zB3&&9RIxsa3mX5jn$qbG!$p#^Cdi_zlcImu-d7B^%}N;(3XScGs;Xly<brVxV81~T zucB}l_WUM|=~v}3cWPyUzSjG#8qNXYP=pW1T*_BrDCa;DX&a`$1lAopwmJoScc|8B zBJH~_N`}GYKerf`C(tf83(6bXZCBr5fLSiK(b{*2QI|ASHGS0xIzORFGZ#;hmBv>< z3a^ZU05j4n{T{7MlVwf!t^{}cWFjhnBNc%V`j<Ap3j%$czDb()ITXqY4m_WL_UD^I z^fMs(FZKe`nPN%8*~!QY44c}8Wb6nf51=tfCBJg87%Tg)0sPxIIb@#r|Cp6IcM+Xt z7;e7A*km{+-!Ux3pt@9GLF$}vp`2vnkdP1zE)pWPAK>~`XpjkUPI+j|Dw*jLacz0_ z8YoA^T}%p|tI-`wt{~Tw$<0o!l$S|Z=opp|gx$=<0cA5b?amdFpj3GL`jMbChiB`D zVK|57?=Ts^UiI;NTJS=T*>Ez)_^F)HLS7X)AU;qn!;FQ~7j!VE_Tr#`#SfWqn9tNM z#F>mIS6R@>Uch}?z+#6#S`KSQcVO!HdYff>pF**J&w&l$SSApxXk~U2g=k^~#-m?p z{{*Xz8~RO*B&nP5{zyFxlXF1btT?XZ19b^xw}cx}q>mdz2__kHhsx>sQZj4)6C!eJ zhr!o#q{`E0s0lW@Q&za~NcVE}sEeW&3-HAh`~i9xtD39ky1%NGF3X=l^j+=ErS$jm zd6F%k?mj0`*7vj1uZEQW3PsSg;$*P>m$QVEEa5^si%QO0OBC!Yrq;=h8W@7y^DW@{ z&lZdHPhWKl<pLUWjHsQ?9kV!?Sg!B5Ed7Z$gb3j`7_7cHWRAp-g5_rL{|c4>TN6o= z85V*AU*auvD=vp!4hbTMv%FgCtXjx}F*pSA5(yed5ntI=3oBuk!$clM%TamE3Rv}Y zD?OEdjrKz|hfu9^c<pBs-fwzU)c{QQZx~82qQuI=0C`@UGvY&E{4KFsa{JmWXKow3 z+9pv-1&wMIsd@vK`mLWHEuDqg7S&BZYITY^xP9xwKGY@0J-NS!zODqlnIrm_N#ymQ zMJ`;Fuv`PYuGb!HDDHNBHry~J1p5A-g3MfZDlelQA=8PVoiL`~gqd&*U_MdxiVJA` zAx=3;W-gKQgsh@@aIhJ2(~J?4c0J$pcieZO;dz}0lwAmi$dLMshM4zPLy27m-ox{& z5B_K9sTSI-TF(?Jd8z8M6b$L9>PbWB-4vGlu9QtU(YHO8XuNu+g&JFr>J2j;>5b}A zc=!gFkc|f<T~YePL#oz|bo;|=R(xCR&D=bT`oyUwG)=8ONn0n)n>$3};ZG>hJWr*v zm*j8mE`*6>YU05=hOBrR2zAtKg4V8-ErOK9El*4i!&LK}I;jKtd7nkhj&Ly!I$j9X ziJ-IjNSQU-A)w%7blxFMA~%cOp;tmNd&??u6yT`;ekkR=uz_h01yr%A$aJDk&XPRR zlbX>1!{>LnVTra+sNi{C*SMb}IZhXS#ryhWh~H)!oqkNaLZ>2cvR(wVz>~@Qywe2z z8>8o-`yz>S?FPfF>75gP)@*XP<h%E@y8-E&xo5(@HPg@`nr>}jUy0gor2pHT+b$Ur zEj$e2flcVL3U-w*hY)ke1b*-QIhpB%M8*m8GH<W>P0zX~G;^$X=OYWs^Fvl;&&<b^ zt&hxmseKc)xlv+091GUG-};dL7;-S7X*ju`aR2#qKXT~FT8X=ITmRo_C?-J<JIwkX zzZdM~LpwBpC-df+WB)C@AJoi5>@`Tu*Q?7*g{{?3Lome5HxMM<OUF0#J$Q(_r!Ti@ zi2q_pkYHGtZ}^GUu$b4dMB4Dv=3(iX;b#}aas(std?Sil(jf!2oM{-YzTgsc$q<Lu zh}&i~$O^;K4wo-YP-A99QfAcn&j|I!VDavV^`D{K_ILKpOk6OW8wft56a>o;()Pi` z_79mq9f>J$RFAF&LCd*`PZCH#5**okQ}rJNv(k|*)fvOBdCX*HIL>OK&vMA6xi^fU zCqli~dtxx#YQXAz{G4{|bJJwj)}#|bbHxm$LG}{~4w@HGYK+L9Z=O@k_Ff_w19WXP zuWx8B#>V~VMs@AIJfLzMFpL-ob86~Dea{$|-*guV?OT1?d<e;O>2zXR7Y7p)lKs<^ z;-`K?$ziLR<v&xQT9bBk(_Zt|>Zy~LtCN8N6GwEj12dBy7b9zyvk0`+G_(9v*Lbgf z=vzI%&s%M?^up7-QUmJkY}()09xkT#OUe72$Ej{GevRu46nDB0eST<Q)7oRxi=8s| zXV3MVqoD^N0JCirJQ1V|;MYO<lz<Qs4(ElQINtdPlK$(9{+}|F$DCc=1(TAW774sR zf3%vK85#dR-6=^=@-9HyIE|K?RQluF#sdsd7>WzOf?#293GhVwoj>mz;5f_oXY8zu zkSCO1^l>64p!%c$B}dVz_T>po+C>BY)olJINd3qV7&y1`K3Vq55WiJA?*|etTw(X) zeg5Bj(8FO~R!mt+Loqz$>}TOF%SEx#-)j+SBwkUx`VMQStd3vN-<FcoMa0_#=$QoG zKc*6@@bQL)h#ZrY^wJ%Rpf}90$VRBuzL*`WxRax}?Xz_f#O5e1U?tAR9kHqCokT1z zIdZen<~>Oe)iZSYS?cv?C-3dZyTv8C`Vi}}E&lc6$k|PLtuKVzDAVbzzgtV;+vi%^ zXfi!{Q6&da%G4i)naCO#;y*0rf&+$~l9HsT+#`$0R+M?YtHK}O;IWr+zUPq-1>^?8 zaFxo*$@Rp{<tcOJnU}30KI-^RhHWB+tYLC7BwWR#auGis-IFw2EJdI%%GXGvE?1-J zV7mpRIbXak(xTBawo8(+7sW>Qk6%S%dJlS}ds8&Ai8j_V>PVEo=WV}Cz-JK2|E19; zs`)NZGgF$x*e7~C)F6B0P|v1p=UP*G|3JEOuEcBS>qXC*^#Y21N1Fa~Jo)xe+3W$~ zaahao$@X-4<fK&DaR~j6?ydtZwm8Fzk7|v@jJ#N0E0HORuw6*7DA>qpt<P<T9#(61 z+Uwlrkey3wS$dhtbBn<jY;3+9jDWBEP(j<oC`tUB?DIhCT@1iXe2BbJY`Yvci>&@n zTM?d*%C%kuisrOXt6^iSarX9=$7#l0E95&T?OUe+zl#xPt3`$6hzWB;EIWjK0>aZH z{+}3q0tZw6hsQIx*$08ZmtB2(rz+nrfPkm-Xff;OL$1`&uY8v*PhBoP0vm>2Tk9fe zWTCO{M4#a;Un{M)BV=~Yt*0gkZ}c**No*J8dXGc<wtKv0K$k~@X%ov{Y>q|Oj6n16 z<8D>&Mfz9p4J4sM`^1usP|mMzg4fM8D9D#tXvvsI`HJ-g>(Yd<%QM!1YLq%i4OG8l z{JirlS=ftuFfafc>KF*MUNO~uWy{j$s@(a#C)H$*!+R;XxW2&~I`933!Y}|3WI$;? zd-U_Zl|fq$YVrzOp2y?K8;V^4djd0m&P4ZFVI+Tu7Uk}DCF@%~<YkMH&ms1pioxAG z`hjO0fspw-l2<-+tv*yYzv4s&4vZHA(2>U%eaG#uw^yW>@O76;iFU~TUgulw*Z=%{ zN$`8Z`xq^Kj36Qj>WqFx8P5AQ;xwb?1cLVfFAuNyZBG5H`q+QauJEaDP2*}9>hdb( zC)C*$nr`}I@x8I`8jgnU^jn^q-x49uGCTVe_C7=#38-Ota-Lawdej$$afgbTk%A`b zBJ~#{KZiKV3PmkbLWRK)pCy?v=)lMzQ(9w9$<G5NLbnzI2GK0cQa&E)1|_IMtidDp z`{BgjL})-gmy>v}l_RAxnJjMyi0jLu)h7j%LRI`aApXe4LtG0N&8XEQ<;F~!z|tBY z%$3bh*7V;S#igByreA`CZH#Nw&@~3{@PaDM^LSOf7okBO%dvuo9Pg5!@Xb`Je&!&I zFcnznj>6*oi(k06)17F`qGDMnJT(vj)y?mb6n5&!W98KO5L$UK2*+g{(<**z-=}8i ze?<E<aHfdED6qHy+3>cS$u93tCf<q78qf6))}XzS%eW7kE1@oY+=h-Ezq4BqGi!#6 zWv;YQ^2Ie=H4ygNQYb-9qK<7u;klx4VmFLaO_4%S6c*;;txYA7CH7#Ds|TxoPiZm7 zF7;=l@f0~n^o^P2Ggsr46xmwn=qpbdTpj>j?fvmE@y-1n7LDCK2kt4xoP6SyjZni7 z{u8arCpQNg*G&8QQ=`<_d1y_)4jlGaJn>?erps!^W?`&+n`&t_kl8;&{+dhpiB1iP zZjT5YqC%~jL}|5l!#$`qL883ym`=<QH+Z7P|6WgOaq{nq*Y{R|^bhzN-17LJgqDtY z4fW)x&-tW3m4DFcSO)XYv|rE|@-5th;(yFf%kaJyQ^4mpTAZKpzi3ubKKwB!r<?Mh zk(|uxGBc;9>X+(DET@gE6Wtt8iGxr!0E_;$BE4pyp8bl2sz3Ic+=F`_#Q(uaBaw90 zPMMJZ+jTAFif?o5t6Q?)IxP=+QWc;ld+uU6p(&PvTPdg<!MAZ9)hAY>SKKNuByZgm zamW%pjiLTJQufIap=iH2!gCug<}Xpd|Aw^wwU}V1dlo4+YvJ|o&;(?e;$GDp7wn6H zpW8O4K)~d+QJ2Nt+RB2LLxO4Ulzkq5y_5L!aMji^>)kuH6x~)T$8=NgpUY-OQsT6} zoa_o^+FC(xYoG6K3#Jt~zPxW_-`Zu*(7WSC4i0uDn7b4cIxv&RygwD-CM%_K%nhn7 zUq5`;FME2~)k(nA#9>(FcGjrdTfFC^T1I4~$LSeq&~zFU_;!+e+sJU7L!x8zv+!%t zMdhcqOLKF&n(y8eE<7E36<`G1W1@jIj4?)hFdrQy%?+)gk6AFs2D9jb5hNcy`k(#U z)=rWqd48qNvBCHWy$r}${mXrv&uRALB%V5Wz1I2dSX6^mu8rDm2H<KpffV~oknWDo zr5HYzAd-3f@5nQz>f#7DN1FMtLGV?pjJIzr$K4_$8lxOh$-EnMrI!HFgFlOLdl8YM zk(T<8gcK5W!iz8{`&&LV@Ym0glvAJKD$uldxfB-rue=;$@$19d=^>U9Q=&fEVoeY{ zInEUG)!hV6jt26Yk@W&bo#999WwxiwM6e6iE(c0=v6|?e>VZ4$huKX06wQ`c+(Q9G z2Gu7_Ffx`ZgS>8?_$lp-I4e7Wnl1xp4!wpa+b32}9v2VhGZ2CM#{}FT<gx_<nn($< zN&~aIx+de$Vt!D28yJV0!I-2}>);b#;Ba5)oNu^Hp|n#4)9=V5-QR6^T=(Bqo^jM< zAGJ^U5g9!(Y2;!Tz;Jf+cY3AnbLA24WW}iYq~_}<k*HpRLnZ%%iN41~T?wQV`)J^W z+K4cFjSRbR-jJqBwue}{2-OBg`OGMFv({o8hj=fw&e!-wrWfB`o;~8QPh0$R<7SSJ z{y1>!ycY0BTh-YL<!Bfa{U{F;C07{b)~$iyR_10M<F1wCh)q;@Aqw3ZmkLHL%xbDw z+1+h3a#ByaYO8sj-8HRgD3WWPaLky7xpZ=~|I1Xufvj?88JQyAYZT+%bV4=^D~XIt z)cMimhFRtl<C4aWgddKLIB5*Sqy&sPCmJLU?1^3IhDw!`2dRk=8ciI_Zk<aW7TXUi z%l7X$<O&m><qu-j<l5n1$GMq*#xotLReBRi=w(uHW)%Nk)IUhe%iem!Y+NNjYmAy# zKaAUGGDEbi=&;$5_hWg6&HJ||e-GWXBQ~%rOx`s)dwW{{wpbf8dH=S?+uJ+Ba_h*X z^W&lS^QhmJDC~lU%yd4#_z0_Yn$A}f@jL-#zqgKgC|k><=>rv=t<8KWUV7KK8b>u5 zTqKzGbmm=Il1^HmGrX@}HhvwBb!M}4A>3GB^+uLE$ZRezr04gcpzF_)mC=;Oe%+{s zGqf4L?eFl_^g0CV;T)~4A_Zvxn87!mU#1=xJsJ>l&>Hvk-1>~iU^ou+RZcZc4LhRC zpU0)G&Oj4&h!>CqCGm?>kE|#6q}0oNTKns^A=^=-%Rqii$XO%Oo{e*TL{!!<r)bNb zmQ-SdD?=o_sb`mWpDN>L)FW6=>AY0aHQ2D(mMKi|L1wJ$<EfE=BYCrv<S&VrBGKPq z-daZj5<mP?SeThVO6wXJKb;9+U{O5mI;7XV&w!f<D;nd?Nk8Wq^s=dz<M%#NbPe%C zrw7zkl^oi?q+D_n;CNPGdHl3wZJs(oq>_<FSBSHC8JmKwp+w`@=;Pf7PonJ_ZVmLZ z+52w8(%Znc_{}q`RO*!{EgeYQ@N=e*59?k3gx<3Lodf?epZ|>%jZpRWP**hn)F>;O zavb60uSm6)8~wIzJIc!MSMkPE6T0-pPo8e1T^rc~{>5_Ny^S9t8jy4WFV6WJ^v;V$ zM=r$O26&w%0yZZTZbL>-yIh0M@3v{>g40$1`h9*Kv7zf7?D&!Jo7orhr3HbIKK(vl zOwZ+BXiRtaJ8LP4xRQNo^pEDZk!mkC!#@QO1P|dp^G*0I(~tE=EJ;H9{8F}T%1j^( zzT6bZzgU9eB<^0W+3|Uqxcy!v=HU%ybTBn(m}uBaS1ryvo9SmX3(sxc7VIOQ#-Sai zWSyQ%Zho9G&=CAFs{j1s8lhY;o?L!!it?}R<fzd4Df+=w;;T63nEL|`hHE{+)+1fd zuo<*@;l7SgAR}Y=lI_}eq;6E{wCw!iXNrs0by1hzF%etGHora|M}3V#N1$+Q?^u_c zcx0s`4_0@u1_4lnN-+@3B*ren1jEW;oNb1K8BF|r!em8B*KTJiE?W~t|4Gd=!s1j{ ziM<|HV@STDG5;9m;-*dvN8X>a-~T55{cU@Yz@iZA>YVFL5l|xuq-26)nsHMPfGk3> z!l){^6_62``D;=@LSGF26J(KH|GYoY8jK@P6{j@NlpKy=%}jhwH87(fk0w8mC0K$H zc~L)<$i+<#5MB&alf=T@uoy2ev3BJdy|9@6<gjrenJ+Mjm2l}{3LWi@c&%{UPykLQ zAg2q6Qx4!s15`)>2?`Z(P(#ZIIIbI<^PvBW!hjtrv6QQUlxv_>5(qZqp27pLWF|6^ z@X%gkshlJ~A&{#K#rYlZ`m0{u91oBq6l2l9P)TM0MmI8;$r~4@G*etJ<rXih7ANZ# zFXfi1IWwYtG4eP_0Rt#&Rp$@RAq1%uXtbJ$TH)ATaN0sR7AzUl4UShhYVjwBHWY5w z0msUe9fUt#rxl(k4euK$`mS?eF#%kS03cWiNjbt*6lP}+K)cS2Vf_Gj%M4Jtsko-8 z?3b%x2*ICj)mp9h$%z*5g(g0Z-D{hT=gh&S-LRiu<M?zTs|H@#yFI$8@r?s<UnG+$ z*5Yp<1k`p&`!3Z8A#Chj)fkXkZutn{CN}!dIH4cVk_jgUg0s$@M5Tv3>`o9zs-=~( zTp(C<xRQ3j%rQ(fgXQBcca2;QnRld0IhpFk9Z2>iwTvHXyv(s>B8APkfL9k2FM8C~ zKon|^pS+S9<wmbG)Dm4_8olKcIYR2mrQ>`a#mnYUdI$zfwR|htw5;1`A7HwbZK%d5 zg_CJWTS+ra0~ljI<gHLbYX;y2X;MyV3X`P~aVetrsSqMR*a>{$_*{x%N@H6F!%=z) zaoj*`NdOoQ_ZJ-?aT}ZRQo+ns^iTqT=K!Gcd?*|~X@uudtp(0R%o+g#kZ@4iSZ>!a zf{uWgD&BSiE?18IH?BdWJTVP7J~|1M2*eD6VTsLA*hwPzPH@RkVA{gkIlGJ~{YS90 zh(t)|v07W|H6=eYyRW759FP#J_y17R_+l_-^fl-|+Nhq=_15go1$&@=fuvo*o+Oa9 zD>k(pgWD~3^-lX46Q;IX0qF^VvoMxgsiY8~1M)7A6W0A<q<agJ_uvBmFiR|FLVVZy z{L@O0bwa*-3Gg+S2%lUZeQQKxI$wDeI0dNJy<z*@kD%?wt)mpu?AXwMzs19}HX>>^ zM7};UN<c^rj*sZVRt1oTebemN1K|6@<<=3PO!#mbz|2W*Dtr{%PHWd-Oe<QU*>S zi6Cc!yAc4z;(-J*pK{=eiZcMoGF7Y@IDs0jPwpqu`o-c2@?b#h=m;=?YLR^aht!L$ z2ogIepTL3p%BDV<=q_$UGB#2zj+IJB!CP?<^5Q*=RxQs+LmAqlp?|j-uVy``uMJI2 z&LADY3@oI|1sfX&_4RQPyS9@20N`PBj~FE<2SJuL{}8q`%H;q|?CIk-{^XcM0SWIO z0~~RHP>5B1Guov$1-8_0kf&ecX0leEPgoDaSYMH^URDp16|*M|3rDEAVaaRb(z~sO z5E2Ie9VAyLrx#jSMj+_jFsST|;&3q@M_vQEumoDC0dN4G<X8?Bklza4PnOm*vVb#Z zz@wcv;AAHBli&FwF1LIUivU1g-zQ;Y80V**Ti%BO;m!rD=ZR&A=6yPy9`h0f0J(s< zU5dnq3w$VJ_sUu|Q4_{pV8%>2L5c|j{Ds_gqOBx`QrT>h8njYuql$h3M`RgLXwjIy zB9V*qa!d4LO3ao-Fu~(P?GltxvaiJ~TEw_hnXuxzlSSR|ZC}e%G^C1hfywgbpZDT* zU$UdAuPs{1H)EL|rA(}&j#L16>kXl0;nrpi((2T1Ymgr|xiM8dcPqziv(Y(o!J#_T zJDv^JG)He8sg0riXI}0pFv@!SX=Y+fSE7LsuFVEQq%c8~oQIWb#(NKr4;V`##OF<i zlcL}N$(iMwg>)=|ak|C)_{FSv00;oY2wf-j)do&1V*JSx(Z&_eGmmozioMpFUxM38 z0b$#aK^Spk)TGUsC1V>nZ4R6fs;YR6rEZ5K1U3p&dX<xDo4y8CVK>bI*gae(y#V7n zcc)Oo5CQ<K=io$fFaUEFoIyp9YWMlpXzK&N-u3WS@xat{FRl(DK6yFvS4S)wiwLk? zj!mr={|91Db_*i!%Y%$<(B{vR>g-}M>~686(1dfC4BTyG)-_xXKeroO)27)Y5i5tv z5)g2#S~AisDdBp+{Lg}<43LaV(X`!ww{)Ic+h)|tCd0bVIdUhH-u!%D<vhahN&4d1 z>t<O(b7TF1sXZ0xe|#HGgRPmhniEOf194$`O3I_^jOv;GQix9Vgdi}6EhOQOogBLN zg<X>UT(RmKJzHh$*PAC<+jm*G^9Y@PTdf1jIcv*=r>Jr)Io9<|qBSRQUNTEXI-5z# zrX((7Lo(k4j<g=m-cpvc{jQ#Dvf00swlh3jG8bzi=VS$9Tq75qJ|{F5_v^qiyB7*W zVexF<|M-|s;*`qr8N5cH6S=B|?-_OUo5w;4<};1ffji`B0xNqtT>t{L<TPhU=!#jy z75<^v{tk)ZsqZ=|l{rY#(5qR?t3xHr7zR!Po?AjbHO~~Q!Ism2ex<;~1URkTi5z>P zbH*^c-WL5?q5^>ZZksUjhB`S6VfG%!3Id54h#&p&B`<@jJb5!(2+P)wD(Su`<|%~* zb#W7_&}%)v1p6#VrXbLq66+bRiHVVkAGw+R_#=q<GFZPBm#{*If|jAw?mE$LEwhEg zBW^Ob>B_zA=u|Zn(SBu*nHLAru6lQM`f||S9IKS>FR1|25SmRbmQ!fEPX}}0pC?ur zg25|Z{vcKgg(0vu^41G~<W^n{bip8cp`n#rLQOsMZ3wF#j)#KJ_2Ch80T!{xgoxk* zx1+gT2+-ZA^~@A^^>H!a@-d8L4?5ZO*P4*Q&3u-8a@lYmG=?eZ7EmF(H^%MT;dr2P zRqW=2WwyRPqR4rf+Cnvv7@A<~=1j5fOy<vYG?G|~0yf^~Xqa67QLiA+&e3~hC#hay z>paK7gHt%X#2#ZJ6gl{6!W?eR2nc7)Pxn|U(xA&O+g}0wYAL6UrN<;re~7Ng;X*u3 z!nw{Q-Sn&27N(+xU5C~)<&-0Cqo4DJU2mVlF*g{|UMSEKf#2QE*PqelEnAJ6bP9}g z+thV_i%|&Uw2K_GQMOW3ddBJD+8Y|(CW2Ntjv9bH##`d=5Kj3J{u&2CD13<s;LrgF zffY}$6?h6VXv^X3F_$wdm&+t>gF=VJl8YaezDuPIV|snZ)KZnJRTQ<YC7a9=t}}JU zV?PDdSv%A|ldFUMsxhJAcEiKB5g}?QO%`ShRBL2VrTo!kxBk3xn{n_vt1*Y11SLJ; zbpJn3`DZ}-yFfkFQB4dCrY~&ov>54OK?_*1x&_mn?V6Iu0Tv(nEFL*2o4&U-SVmok ziyi}p@PW*gpTN#Rnu||mAK9j)zPP9=PfHn~9dX>mykyC^zn=lJWJ+%pO>TXTgMEoZ zavHyjsFo;Dh6L({1lfiJKMx6s2?>1>687rXk|9u5&o4Z&ciHka$p9SnDFl8jc>-yK zn#KA0$Sm<k?k3`QOe>OecKhqUwTg)e<Bcf5R54OO5dkz+jtu!cSKIEyb2Qso)ka zcfZ`N$R4hRjN-;@8)&V!j7Q5LA5l*qfY`%b$>;BV*VCn)X{2E9!GqNDW5D2n1c?Su z>D!(HHK1*7@Zm;S*JB<!;_aGZn65Me+KRyoh>J#n_%dV9qMKa)lA5%Hp-F^nV-a|F z&{HYk`{VnUiEFP4*b))SR49B(ZXmix^<kcs$2qRK_N)J8Wsi5t?}o2cMNMHH<Ke^7 zNvv>UEe%Aj){Pn-!4Im$I;zmJj>KXuJaj|T={<4%pNV_|=1;0$Q@5sS(5Xl(wJpDi znJ<yK{wv`<<B>8cyk{DoA1OJ%48^Y9r6uACmMWkm*mfoA_HYz=Wxx)la8UVBoY|!i z+JJNo$X2I-n<?A(96omPFSDwC`g)-Pa=#bj&o4p6`3lYxnR1*M-8&O;p^CngIC7{~ zz+3zGcL2Z^0)V?g?8=j4v9&>x2>YQp93qw;uu!Z*EQnBtK&z{DcQ}b!&V^6ynn^v5 zNiLr(OvGt2Pr!C4jXQwj6S`RZ`QA)J0O#kIvJn(ALvQAAk?b=gj^vz%G6u?q#n*H0 zbP!VhK<bFBN|I;KoJ7UM5E#00HQ5u+gyjzD#lk6Dc_My86Xd?_^=j@U<shn{`lW*# z><cU-BsXSZ{Y`TrgP7+=>9vqYNd~EDI@a2Tu}*z-7P!PNYwC;moZc@BU*Fx>cr2(+ zDN1ip0h0<_v)X3+;oWH*uJd9-7PQl2rG?kgto0!lwAuDtCQ}a)=S?b<@2CdwW4hV^ z;|9OUxcd>BbEp|yI0yGl!6D>17XN2q{{vrwM3fkSP>4GuXR+zD2!@o+6@w(4Rsj&8 z9SRPj<YNPB9zpBSC7!K7(@o!-%ivg5;d^oBq=VN>3%Z<@g_SA1?Q4~(g889C&?89v z9KoO@<_Nw)Th54K0(qbU*wA=cLBQPm9T7xIZKaBEf~qQxh{cY4US5S}zXDg%jCD%> z$;Cpd75yJ!U6S&$x&<}tWk5PFrajrZk(60bwMkwNs}ex>_8W#hC)tfUZC}wiy?1L+ zCXIt2GGw!YlkE&v+$T)4mGG{tRWT5^hNCq9%QmX`6~|!k5O^NfRUyQqas_73UIvH@ z-5<5EmTxMadx_j;Zah(<bUw2I2wuRy;I~5a^&0BLJBLA^lF7?(i^XwDDoLZqd8=1V zc=X=CP<iY>CV3Q}kR%JmgR4HAw{Nz5{Q80FfJBrcNP!5IiQ!6hUoG#dVW979oM+iv zHQe^Qb{<o*hJY=$3^>80E`I5xnDM0C@3cl<CUgJAIKzI<*o!yWOSQbUxKHZ_)b`wk zz^ztvY$|Mdzw|>f*;PG#Gs0aJX5YN$DXpMX{%r%86@Vi^JVg*5B@Vw<sG<rEe@mlu zCz(Squ1u@7yk&^CS@^kgf(L>|qzeYnAsxGDtI)99fayOG{keg!2CHik+FH&0lI<Yf zG53@;_<d;lLl2;dT_C!!8<~=NwRde`(|uUr*jFj9u<SO}OTgLjoIW0CRb2)$4T?Q^ zMI4A;$LG--dckQDSfM#%85}m(8=^lSL8g#NkT=<vXTv#-)qnl%@=Ls#+ni)m6z_`Z zuRm|qnRocQ%s$szV0aP%C*N018T$f%CGAR)w3z=k`RAc9efSS+IY>e;;wv@L-)-Hm zuWbVZeUc)NJTvaDLL^QnYB8X5@~D>u?=|U(JSU6jG`P$JGUsN(1l3KCq)rBjV}%0b zi}jCv4$=_UT)6S_K$e*w7^@YtAfCs+@>*^}e7ytqv#_LZuzgI4bWVUoWkSDQz{@PU zc?k|_Vti}xa6UV+OF1yNd}hC=gt-MqB&k*f;mn4(&%5L+AR?%^3S#w|q#$>%<n>@^ z#8D3b>&%|1?)?M_|H}k}n)Z#hG%gaEBM(C}0wU10W65v+B#TL!B-&lB@t+rPIfA7; z+}rOAa@5VSJk-?*2ie8iS9}pKQn%Dg$9X2QQgc1=n0YNvr%Yc?FmV=|rtA3TR`b<x zv$9U|VGiI+v;sAX9`m6y3mInhQv_G2c!t;_a&n``L8<|TO9z)CE9B!kd?=EC-j{f6 z#GcsudNuz)CHWs5?8DM(f-$Ev(#&rXv7m(Rb4G6gvJ<dc_1QQ!yJ=k1CrJ`1O1Yx% zx|Nf{avC3DSV9o`A&4i&Xg8eSa#*ix@J%_TWReO(oV%R84oKcb{EvWb&JkU-RG}%& z^z@C2Y?{c#GuC%t2f7VLu=#7YF5G(ACkA>k`GE5Kk<CO6YMEkssAZk#A(s8=Qk}xj zJe=Jv!w&yMkF7Y`(mNv!8==^yhhc^d6bPcCmmK(5aX;1@jqSilbeVW8$uq_Kx&cx= zknd=lS{HCLGfhIc6v2K!VudEMmbIx4u#B(A^@P67$2J?X*<dx9O=@6pO)Y|G%HyOn zCq+#z12M>a=VlIKG4OpaS-OhgZt9kWX{D%+hS&8W6G{E?dIQWD%oF%N1DRM>Yyi5} zf#<LCnzbrcp0#hu`&%DM*7OAn()xjwOg1fI96;D3+HkB~>DP(bY-kTcbGV;a_EsX( z0jRHL07L5A+FZuUtJb{N5j;~HcT&N*s>@D1S;ZVD211P(3_^%)<HkQjD~b&BOd6SD z>N5N%tkK`p7@zFb<(a7qfM5DTa7ZvUQ2Y3dctRwPGp$lXPENw}`A~F(Jw*%|2c?c0 zTrABlPjaPAo8NCAF3JL}IAD|TyfI9voLC(?N}GvjnQ{4}Pr+(71Vwz)HgY%OeG8f} z6%Z=;cyTCDmEkX+iIg%y>_JlewX3xP4Enb!9}owiY2n%Izp0g@ZTIY9!B1ZOzBrca z<eItW8R8}aYKjNUJ+|9^B(L>Yv^--Q%G>;|!S(4x(@|=%7`-E!f;7qD3XoEM89iCV zFL71`ms)DH5o@x%JTo1ZT4{eN_S)0?+;U%P^}~@U-mGs@WnVqWvQ??^?~I+1EeZh5 z{L#W)fZ(5DSxNR0f7itSlx&Wfp^Ym=hiXQi{7(g=4!3wr9lb(;=Qmb=8KTrHL+HDE zq?DNaubzm<fHJ_@pVbVLQdU7I?l5=9hayx5>~k3xV=kb1;+6ezdw((uMf@jeMC;{r zSHS2!AZXLOPrYX<Z9-UTMm8&)e$G1dJDdE#4yw&l0Yd?`%&<yTH%wU|9HZFP&wu=O zu&E~iiCH#{MeWcKCHoYw4~E@frb;sQ^Gm8D-Fqr3el+%@($DAl6mV`+o|+QxU&e)$ z6Fu#IIXp*fWM@whhr;L{SDq?yWlI2}!-h_M0-JH3eZ|bzB)`>9{6q3Me+4!mze7AH z3$_2Rk6he>kQN=L{f8Q3r+9pJ_`ZD|FAan)-B6Q=<uVgC5C)=pUtxjAJLx8Macj?+ zb|pPKH_~lR{;E8DA)$OebUL6ym)pGYVn<xa3|!4x9yI??Ty9}IRK@5k<gkD0oXzjw zc|rffk}2D7+@zgrP9ezsdz&B2f)g&%=YEsTimg-OUH}GS(+In`HJ~p-p#Fwa1{H_T zs5UD1@CEI6GGMZXX`^q0tO3x`4L`HP<Wxc<f2-R7DYjh0j2P$>_Vt(st?eq5%69xv zIFoawd{lqeZH)pk7M)?Xf0XSA5?tI2T_Y2~Bngj;5U){lj+3KH#v_<)@M<Tx-swOT zfXK7ZN_ixmjve6XN2pZ4<m*RxcCU4NilTU$i+Mmn-l&Zb1u0T3;G>vUFHo?+0;P8e z-c-97Yy~&mBTy;$c5^x=K}Fk|U9H!bAKlCzyNN5t6>iiEgaq~rk}z*47{IB5NL&@? zfLR%)>6WJA-eHBuq#)-T`_MqG-ik66jbC{;M_LNN*TRP60<71tY)(c^%7@uT5FA>i z{LJwNLh*)f3Ctr1{FYL!@&)}i^k@DJhqSh>Xzj|fAe5j(2Cn3cT_h6wkNia80P$`t zBpz2GGr0&taDA;#NAF0(#wv;$n()E`aLhAmZ&S1xhTtj%!(KJlZ>^ldCC^~~ZmUEX zxg;4YVUk9mnSGz!m)={6dqQe5{!kBYMpj|uO|s*2Z^j@P4vG!=)IupC3i>*<>@_G^ z0Z(b7cWkL*YY7(#-F95`vISJDt|F~}OemKVXoPb=9)<>hAQ(Os00RUgq>Ga&#pIEZ z7o<_j=2OqPn;;3@!S7J#GgBX<QxfeP5G~HksD|iV;fnm29Iv6xwARJis08(y7+sll zo9ln@ViNLa?};22R6=LqLV%J<L%2@zvS~!)kpvUfK+(}0GOPi!{6q7MS@}Q!OV4mD z8FrLpfjXTNamv(&7W`J*3Fcp+>^2`QIdHK)rVy%``Iu?e;D`Z_)6ges-z=>BshHC{ zu>XK}<IZ@7%VF;@qU6LlKM@a=f$z~FpJ%zadZc*rfmNbMmYhduuwbA^38T68^+};s z5&#H3_9cM<g)*@p@zx1UDKZ5KijjVLg8m*rq0?v&2tyuxsC`sQgf-A>_wwvovk(Cj zDAf~GC<tI#rZjgpRIdpS&yCJAD-k2!3384add&4>2mv7SJp^K0^w2OJu3IAVKRN_I z^#DJPV~Wx9+6oE-JrpVl6CbPx+y-|%ZdGFkV6G0;6vi-_t1&5qT0V7`RV@zG$PtD- zm-OWNQX8dGv*nK0iNx$W7TDCsn#+M9oybIq)0iZJUWu(62g!8gBg;0MRHmCwq2Q+B zGjw#zuV;b{Anb6$D|OQR=VGfpEcs(BY~=BTf>7N9K6}J>e@uir9S0m)5l87{CS`;U zX}P;QhZ`J5R=Sp~+wrSVE{(dDM(0O8oPLaCGEOTrKZ>LOQH={Jn>o-Z9%8ScIdd&d z1P>@!xG|O5u_^7%Km`sqBtZm7Yx_OIBpW4vE*C&r#b+d!Q*ip=oGPfE!!z2^vDPEg z2n|mp_@dy!6;r?J;ZV@*d*%?$Q`+*SvXsk>uDZ_0ZDLegmW3PD^T~r{ge<(;Uc@sq zvl=^Zik=WxrhYCwVV$68687i6Vy>vO{GUu-0`@AKG+c5e0|lzsA?HdzJrj)N2$#8V z2j__PF9JKBWj6(7|4s+qgTG+G7!Ps@L2+_vad<(C5~uQ#={bnmrXi7LyfW2eW{Pa@ z`Y<OvWl$~cB}#?tsByu?e<ne(r>g$pNao+9O!1jVFlA#oj|YX)L{TYGpK5rLMy!=K zh17tedx|2&*4JH6KC+schlo1;!p=sCT52FeoN>;kf~nYE5d<Kp9=}btv0XruvN~Af zT_ZT_5fmV7m!&-uGDAAGAz^B4QRleb$?PnrMe#Dgs8k%!o&oQUcMk)Xj@BVa#5m%J z7dv~xh{S7;;v(>BNE|TuJb!?0ByNlev`4;TPiSaUJn%*3>L6PaoTl)=Z>AB+Q@ddh z%;ZFCfb=<qWA{|KMtflrP%84de0uM-wuNeZzw=Z1ytx>L-SsjcicRLq<XnFjQ)U`= zy?gd=H#R$4o(kvzq?9#auI^2QK9U{$jMeMdU+ukDbk2#|O>I3WT*D}|Lg8#$apRBn zZK?XkOJj@I<Zq$Cr;={FcX@Jvd<g3GtLgz`=Vg<@#n?ZW+gL57vS_Q_*<<64gRQKz zJ%!f)!`xd2#ocWCzca%igANSt?(Uu$+${um_uw9ayL+(U?hZ)^?ruR7+(Hs82?Ub4 zJbRyd&c3(KuCuHDw{G2cQ`J?!UfsQVbx-%|&o_QNL1J8{CJB>G-N1l<tvd8Ce(Nx* zOZb;XKUR+B-}o-3q+J6F;U)ldcfbdx;Q-nxLN?MGNz?-Od~GJfK%A-OkjVG}2<}{d z^guS0#(b^4Fb^LLr*8=awWzI84D!#Z6emmJL~0rhF>|gp`^zPa3}d%p9dPnlVYu`z z9B1tojyy}{R&b}dmqR$9+OLGi)T=&Xj&}<4LhhKH#lV{N?rvXLd(sNQc%GWxb|a4S zbUfthYsOTBR7w~|3g-ag)B)CD*(LnkE<X1+sit&qE?MrKo2Uju24kCDiRi1q6GtuT zq-g~WXy{7GV<X4}&bsjgX@2sENP3P-b<uTIIZv5~e!;aN{u|@4g*tMS+U+m=tO8zO z`r*hK`UHPIdI{TjN`toV{IR<0hm3rjg_mSaSfc2L0vTRn`PX7)UgCAv;%#0MZv-j> zuHcf!?Kpf~ey>;++cx981URlaAo&mPyx^)?17D2!Ht`6P3VE)`IvtHg1ZMHzvLD6U z)mgp4IvP(<zUo+dV}#{*tGB7<Rv@+I>&4WN>Tc3i<4HH>X5nBt)pmH968bGrY&c6; zut=?c8`0)1_4*RRI>3>N@&NQ!0|Pms+S)|lweyb^8GV>vTn@T!%3052QHDtdM<kak zA*NH2+sL7b<$~^8K`ktya3LWTbU1#fjFxkjqBoq3(c&QvY*Z(N!aS^r?(^W&#x~I* zRsS8{{@vI(T<zS)JgD55!@{B}*EFTWoWl3vh1_shvsx~bbS#1p8<BuIV7eV4It|iG zA=7h2F_s^;pUQH8b!ba`hiCd&B?y^~4V%*lyL^EY(js!|ryj3OVGanE1KSYoj%U_F zYRJe(?6{Og*m|Js$5A;A`>*4t*CY%BT!I-~x2BsTfax@}cvBHGZ3PsDVPE^7YS3+s zTtFEwLS3Z||B*;-5|*DU6g;T+*XbQPz~4_qtshrF4Med9dSY_S$@P>IH_AvWJmebL z^^zqr_*&$}*p=eJ&yb%#U-D4$V2EnJ9gd*sjzsro6<k%l$@1p8{R9+^^6HMlOIV!Q zA+Zn3)l*OahjC}_k**Dxq4p<~MX(G5X}o`6%>xqi2gy(T-J2p`IE(mx>WbkI^+6WK zX!=K4M=IWiy0%Si%Yd#73?Kzv?q#tIM{&5Rk5~D?$N!ptPHB*LpPoEo;q_3^sCJA6 zitP{|QS^!uzi8uiM-Xq;nb-h@NoClz6av2lyhh$hrKuF(2dGkwLT<J{#YN&_$V$Yb za8b&N)q`ZZL%F;YMPoZvkSJHQktiA;3)=XUo<vQ^4OiIrIz)(rixg;xq6(dnErwTj zC3A(5w!?V-L-{t5Dcyho{`r`lU-@gfkp5rU8>NomAV4uq(|w?J=BK+K&D}@6tufqf z60!+T-bC3tw?uF+6~dd$g9_ZuG;2k3N%m=$WvSc^?n~}Jy#r8@S@+@%a}8yeeCn#l z5`SlY+4(6z+V4$Am%j{emuh<tXz_b(g1A~aJWE2T$~fSDB%qoHqn|f*$OaXse~@X8 zhEw!wkbnTDZjVJF;1%qrqys&R_*a(I5z_;Ch0Hy+D_NN>0*<pqj?q&4gEr3XQ0B;K z41pxv`hJ^s!g;LUDEWW|yg=$1C?HP(uX>2_7V*SCoQ9SG(i~;nk6KQO9B}(7oaYwJ z`J*m`E6vE{xA8D4mM7XQdP?Bs+i^nh;{6n3<8Y$fAcXathZ7-2DT8I{sW2}!xdjK@ zJOFcs6S0T4kAHv6pOEA#CBg%5Z@%E&dH3=9H$0fDx#h(igY;nxN5Qg1{3~FBJ@~gN zwo<BebJ`#E{@;rA(zRcL=iUz=afEzAhi5(y@0$ze?xEN3r(YY2MB@#XgU7?vfX|<N zMZA=n&6!ovo4}$43Ib#?AHsUx3ydE_Fii#opbMPeZE(N<E#l!<3L4r}hsoYDDLds5 zHHN8$Pft#Un9q6p%=k|J1XwLRDU}_;+IsJ|e{2C5#)2_}Zg@Y8A!%j2!Zffc*Z!iI z@@SNY-r&X#JtmVv_$*Njo8o|!+1Ty`wv*|PI8&KZXlV<8LLvlPY>`em9L4nHSJm^S zxM*gxNYV~<^nncK9C2(=LS8C~sF7WdA|{>`H`{9kB8SrBxnfz>qve|R)BZ*okd}`v zQQc}7OMI}C^^b#%nrBUR+vK5*+nK;Y5YZWN<EKoDu~X8ATRGwew(UMrlRHn<sT8r- zoPo=HlXFTEc-)emf_r@#nnnGV>bj>H0^wpPSA()FzRJRlC<K6VrF9~nvo-A8%F7JF zbu^w0$E|O<*{ZsyimKbp>zh4(KmSk#`(N&BmxkWVeR>jvoGLOXYEj)wj}kXeV1Kn| zqk!L|bOcazYUI6Aj;Kt8kB^Y8qy0nYp6|TA)!PWz-pVRhTaV2G<{HEvz&y&qfbp|J zsgE)c=`I@+(UkUmi^Za0c6;NZPz#Tip#n*@DR8z4CP1FZ(3`IZ;NtC36{gD{hCs*h zIvFgVm*E(sx41isiw<^Ri(u8zI%ni)kwjE6(_l{yv1J82((<)oTd3;yV)r-oj1O}F zL?#m3rg#it@d5%k`%9|4nr8s~#7>C;?7$)noY_Y{&^eg5{R*+TuQBMocu`7u{`4yt zr&dtr_k;6OXW=kHex#D4IvgbS>q|elE8>z0d8jq`?8AYXD1pdH`I3Aoz^r+khH}C< zd)=<^MYhEC(ExosodRZYM19e%wa70E>v#dA3WWEyIHusP62C;7z$47mk#meuJ$7*r zQ)v2PNswv-kCY8vg*7HZ4O<RX<@Rzop4(e_9=zxIds5%xds5B}wXt}~P6W*C)_^?e zt%rc*x=$A$>z4{o<$p3zIZ@c;V1jUPQTDD$kL{E~$cGlHB^5IJ9L><X@>kBx9E0i+ zm9Zy)#LgZ;xbkYrY1K+0B>jXq3ws4-Qr#dVaB&wdY;7P_;-dEki-@T+hQaG>Hd=vM zuF5fbLujoNMzZRO^|1D;PRz?dA9-M9l00gTm{tFLs!@u_@oiru+?eEgPkDVskQJ{2 z3uzuDGzfHL*C@0pn|T%Hx%tJ!LX~66bP-VZnLFTAD#0uUR3|kN{9OovYWbd@j*bZh z*XI55!n>B~H!<;~2XQ&|w~^HS_=iyk=%7xe4|99kHEX}$6^>;(bo0kGfq0!LYfRwt zE!Xdr-&=(bqnppn9%_D~`>`GKlDmCs;!pDady=<vWF_mS_QUpYaH|TqnRV5j@w(cS z&dNpHVtI`-JVhL%F@gr1vI*MhMD;uhX@gBGQ)0Z&yoEn=qQE}WXchlBjp?2lG`)lt zQC&v&)v{j(NPm>pM+}|f=R?k`L*28*SfugeclqYT%dbd@bm=J`P9iik0BP<g2;3B? ziHe36NMJaE$YWeiQb{|_kW16BV4<IyU>8lyW{|3}8-}IxC^9uZ4rX;9BvoihW|KqE zhBKDa;fq0~e|h-Fa~{yeur&4PA`+O`s1eD>VJgek1O{59>Ezi_{>Ai(R9N)al;IKf za%EDis&Qx-VVFXxK;l~^lu>E2N$uKJ1=^w4OD7JBl4pFW5e1C&1L$=x1g$U)nnCoM z&0xO^`oFZx=>V{3dj+pNo?L6HZ@G#-ullo^v0ue#?5I1aWaO<L$OGCZ)D?eRrT~92 zOR~|=xwt(wO?j|JF2oyZNa<bYAvq&=VpFNU%0&x>iiP2&h9xT}B4E}*K=}pBc%f!X zV%b~=c_~btv}}d+#CA0mwg7@KH@kvS!7A0u9<oTQwj%v0W0z7p1;N_1Bsbm6pQXgn zA-VKf4SY=OG(feHp6a}xJ5dyCq1bVm0G#g_k<eH`vcU;&yd_Z`Z02c(P(U=s!Tg4f z#-nc6?GV+Zg{pnB&p!`W-3>oSu9H2A+&BCsavvf~fHOZp)lxhy_-A45rOOb5s71Xs zokZ#ovoK4#&$+c!X<7Q)9jQ%#j4Y-nbf4=06#<YJdaz7!tKZ{bNeyEj$H(iD!Bdp0 z34a1WvQMp+18`^lq0ElKv|!QE@S@@AyW^7gXui$w5yv(ZSnF4GZf(eFvW!Xh#2||y z0+e+nU*{iNtGK?rZ%`e6Ps@B{bpJ^T1Uy&froc+l9elTT_SKJzPj#5RGdfg?#}co@ z`~r8BRTs=b#xY(?LI@;0xKI>dV<247upWHe2bjUbcD)@8g!3vmjpa<Xdsa!9j)*wJ z5`KKj^zQHfO@)oE&y?T$QK%_sgic#kHbQIJm#hmo?cyA?ISl-a%FtZ*<ZB6z24L5# z!(f(1P+X70{La&Fa0$z)m|gv}-qJcVe@YOw@e5}zr$Z09cCu`C+=+&4cu<>RZnzfG z5Pnu4dX@MqTZX_|Th2k|vH@ZRk7M^kpDtDQPNqKNUus#I8M|yq`n2UB$yG5Q6LMpy zDu6HD#VlDAjcr3YL#B<Vfa0~I$k>abty==tlF=q9mU>5K^jh3W|4nug65Cm)>{a6j z@@b8C41|^vs%u5Uo%KD|lqzh$)(o<Lw2$nUP+5dwm*tutG0GLW1xctMh!I;kYo9fv zAqdV4qOkM7f4S@qGPFBNe7lnV)#vH`<fHzqgc2}9&mKtQ${XHsVd~z0PK&8DpFcqM z(LE-mgOTNSKydZiX=*}3@?y4|iRCvHVZko++}G+6=!xNGO({u^F5)+R4o%NTKJ037 z4iMiMopX+twKyl;8Q?`;`(Jn;BS?PDzp=LC(@$Q)RSc;1P`~-cxP3~N(tGH?eU>H{ zbe3f;yxR8Br|Bitqkz@@+Ju>J+iR*Xj{5f->mPl)-cx<`$dOp!kt)J=u_Sgd?;ZG7 z^s~Dz6t5unezZi|e~5<qlI^&CQmie_^`ga~?+n+KypHv&DD@RqUoaE(>v)JTY|H0( z8m}0?yNrj~BZX{$oHIFK&N)P)5h;1}LjbXuFU?ff<?m>N7c})<8jy*MIn?$HGIMs2 zkcQ!1kW_$;+hv>S#=5RXtRI%zPQkM=eS+n4w|1w0_*OL~v*SXqXTFx<AwM9^e)kCo zIBA`bWZ!M3^LvAEL=jkp{o|x>zJ%NcRUx6fzZK~ItkvzO&)v)IV;t;KM5+nTMzNit ztbn0^EO@rg?Es$@5UF@~^artw;jF~XK-&XG#%76!6aY@@q3Fe?7Vn>PJmk&u_RKw0 zxp`m{7SQm*OmZ0YNs>SyJtf!@n*jKX-~wcRyeY0F>68k5?*7qVh9uk_qe}+DF$N}T zhP-(GkUJu)(2rRU!2T5mYldUiVn8GmZ^X;MfBMP7(Mb;QVorEwIrl7eFBn&waU^ze zyr4W6^EgagI6z(~`aY^kC`8!hnzwYb@d9`K0#C$U@j(lZ%Uux}QpH#q!HRtep?BX+ z*ChC<6<Fks&ai;blE#Q(?~i#2eMJw9fxOI=GnZaKM@K2_tFSb=#IDoAWs+k<yPOup z2Yj~Xc87YAE*OM*V7)#86VL&8>F_N=Ig>5u%F6}CcW@)8sQaB+wfeFC$@@&-A<|sH zb}s=x6cdiyFr0^VbcgkWYAD|GQD%kX`pBa+dUUs^QO@8~t!UnnM$s(cGiB}&y|o;) zqhko2dea;R<J_li(WV%XA*n{t_JL`-`@uG$_|XHjUj|6$nMv83+(YZgj5wOSEvPor zn$`METkC89SCpvyBobie`xYULMcO4GU6>7n#1#W_cY$Ky@*QZWiItmd96=xX%@VDY zNd(Kx3XX3uMcr6}JIGAi!KqGo^@jY4Q81ms_%qA*3T9NDw^lZ^nTw*{=qz|wBHetf zLko_L3$)wXy~R50HR+67I@BXAmXmzUD@|+^9EM;S4l+-Hw~H)GoHD_1(hUTq!!GHh zC6Q7oFNG&96vjCr#}nmAxuBy!?a2+{<Xu2fW`AnWyTrg!%SR)?uOG(Zf*2e|5V=_k zB1`xrVN7ZQ-1&5ZSR7>Linuy5xY5TLfgGvg5n%Q(>YGq(!LTH?;=jnCE^K&jfu!sc z8+rX;v}9h6fzmxVOs^raJVU$zR*7q`fXr?aTgPDXg-i5!p<WJ4p#Y>cL;oU<j@RIW z`l}Wlk~UbyR+hwoHnB%^ss=l({H16`C8RfSoV{WkjbfBUTI7#!xN|4O)swYaixMnA z$&qVt;tpm%g18!vnYY8S<t5Q@2r$)_|9mZdy_Ebz06^T1Sh2v_2z@f~6sPuDTpNJ* zi!O-~$ks9fsf44&(90>d%V}oP5AImBTVSIB@lh<Kd#?R{!Kyc^708wmUV>(it2w06 zVR}(1%^P_{ukhVVv8qjR#)~2QDXvTj4gIcinfD{XRD63`@o78cBtz{`K~8yD4ymh( z%usW=QDs;L1i}9ch>CoG=kV_&J_uCz-Y9r^OWrL@4kaPxz0uTZH3niezIZD`zRQ(d z>vXl#5fUkW8`P$Iro$$LqZSJOo6rid*2*W8mlaaxxv7E*Y2eW1pXp+CL1EO^+~po6 zn0T??aCAuvLf?I<z!FRG9lUr935MkMuMrI8gJPW>#_xq*XyJPV?;Eu}qePt{L1>mz zN2ILnYI~#lxD7?8@0<FS<t-0r81B_^juJgY(Nd0zXe&lYYh_J;XC9X$9m(3KU0^)$ zQU5Aro-(AEZpAwPOlF0MaasXgF4Q1|!-JrcOB|o~0zkC^cLj_PP+6Hrpjt?DT5{s^ zu72x6PJ40(9~ND#7}*|3g&<hpcEsimG0W|#nq@zO6FYv$YA1KK{UXcev>L5ZZ0)xS zh&!fLu%T<#6EQ-wU$Hd?GB^!A^9#+^ogxx-lc8ny6?Td+AJcO-9<)XtI{(b3<L0BM zoFR=;F+W|kdp<7mQBO4F`t(Rfy0T**^FSFr5}k3HhW!JLw<GK0#gv_#b~+1y`GY41 ziB}<-)QgHjG@HU|BBK{AXfk^)CQ&9fs0{QXIB+a!Gq^M;j4_zeQK<{}2?^z5O9H)2 zR>+W-vXzz3s?}vUn^6~u&A4Lpu@~D1PoIgv<}t9-H_03ww#NBE3p(mtOZ<XVl68nL z@{J?hn^r?jCJ-}4pZ)X&`d|RQZ=mc?&!wGsJxFa4eejq*EnLK#&(Dl)h!}|COTnzS z+{GlPo$<)9thYD8pbz^X!UE_H^mA0_XABV&$<35^)7%Nw6u}`}Bbp4yp!BD+;gHuW zmlqx)eWCv-A@byxg0CYgg0O3eIzlw)Gw{=i_vij6Dw&wkqL|`!BpjE0(U>;j{;_en zTx(fg0(&v*O(((lc1jnF!%-&FBQdDu>}@03-BCO*<YbDw(YL~?<Y-B4_MS6V5;y1t zq&52m{fwuHNK_4v%kPdIk*B3xb?@#18?M@F6=T5%C<YOVLLw1V;m_y0*uNQ|BcG8F zeOR?`T4TIgi@U?DH49C}Axl#SWYiSL{!A7)5C*i9hD}u{kofz^AJBp-@z5&MUancp z&}S+Jq_MpU@=&!`Bg=9mOaI=9XAxk*k7gOdmKxS*|I#n}U3b!Rx!>-slfWp^gw zRk02c<bi0`DgK0;dU2+5`8@$n0T{9Tp!|_EQoiKOO(r5=lmy3E*0CSY7w;IQS-d05 zvR@6xJf4Et(gWJ{Gkn6s_jB=T)=YN-c)yY|jjn5`g<6{Tdo+&(td@I=m-)<8%J%-? zbe8oQ_03WheMuhx>Z)V>6~Ic6_cGI_z*v^*(|8gUeVI>x$>$Ct$ePo!UI5aCwY;Vy z>^?M&WDreq1MDxJ8^J@`xnA*sM^?+|ZE}56WJ^ihM)Z$$I$=mAiA>Org8=uhkpjgk z=hz~@`X&vfJpHb`Y0DC;CW0GFrOko9<}+$?LEIkzJNwo2A~E-ayv8p^VTqVEc}@&l z;<${!MzQ4C#TqF=5vSx(N*lo}T%qcVh-RG4K8?NjR*dSyE~Z{Cehs!PogKVLL0k+V zTS879#b`pmQsOc(7a_%TYWE*Xiq`zeT8ikV@5POltBH-uc(p3bM^-iIPX6y%6C?Mq z4G=i(#o~(SP3khOn<t$w(QiNp)jG=Eh&MGFp`8;oHJ(9TV!HUIEIr7aH$77rI7dcZ zzw>%OFa=CiKf~{+@)DD6{^kEm0PyFUk(P|NKmXm!<F;4v5w9nsT=Bd1C8{eo`$z^e zK>azyl|p*=-E6kq?<od0m6}BMD`o?I)Qd$w^u{dhHq2TIqlZ&Og;8EO!HOhg_$jHi zO-9TI$3n3&gk^?*hYbtRt4YbegFj&Sh~Ar(P%(3kYb`cjs5FTy45QGFIr27?%2rCe znT?(9ET>2Ni)*^ent)mvRb#n@*?2J75m3;z`U|uaNsr+<&W4SlWFVs<InslWP!j4s zD4F=>%3W<T4MdsVSHaK%;C`H>nFJ0qquse-Png>Ek|o8@S&bt1>BiZ0<|^pNKfE2^ zl^hki0|QLwAunL&lC%23l;$h}arCIkl4G0^C1gPZD7&K|+LhxVbzaliAzeS_!kmnC zMh&X5bdv#fXWC?zj`XPx3l7Ws;5plb&RWWar&2@4oGqfk9~s&6%KR68sKspDVdu}z z5#o4?sH>aNFZEdzt{qIXr%!JrPGjtCLRzMTff5p~^ocVSHAiGWE|@-6N{mW%zMkI- znpx}CV3I`Hkd(E9$gHcl&epok)f!|Es_j(W?Mg^8HAbPG{+<E-5zR|3#4iG)mu|7y zp&++4yqP~Sg_v5n&VbDJw4*nVNjGznc0b6^j5B^Du{A+@408Ia&mL`W8T=_Jr!qQ9 zIf?C)m{;GH(}2F4J82-?Y*#Pb_fmhPn^Jmf+#&pU&`-Z{oxA-ye_Qkms!0-6bbif+ zoABrS&HiC=RA!Rd9;+Lf?>B5q^-pgtyW{INMy$V#xrKgj{5JIGVzloZ{q;qa`euym zXS=?OT@4@k%Z1UoHe&NDme*GtpRRalt_94mMP6S^e7b&u-2K&eE&uu(1<j2n&37U5 zhf)0VU7QEsg&QvqGjrrYu=YMT&PC3j3)#7R5}qH5QuQ_zKmBOpJ>MV3eL6KVzu>9* z`nKqL^WHGm9sGv)$d*PkapATi#LPVRi!uIT^rt%s$~z<kujN$pr}AqoLrRjW=XW*8 z&si@Y_PI_skdHbD>#1qK;>;l}um3dAJQD9nm6~_pl&f-NCgaV!GB7BrI3uZc=|C(A zhfIN}_P#<gEtMWNFMpYQGPP#3$pr5qJcW?2wLm$8Q7x0^+3MB=%w{5$-{;589iQDo ziBbl;=^5`xkuZymc$5=tZ@C&_Ig9b*+b0Ps9<*Q3RSn7p>q9-%6ZfiDl0j>ng`~Nl z*_NO+(I_0+hy~u~f6mDyF6o|q7~1#N<y!ywd}jct<xjTSxK+=HV!B3utXaTL8$?Dd zy(Q!klgIXyLcPJm!#PL7vaaYwhL7t;gDH(`z`Y$(cCFF;*Qk_Ehg)3hi)-IkCOs2d zGv*R6i-?#%?+?1>EYEJ!d+n$VC1|oUEWdM3jy&gjDg7HO_I#m^B=?sbI?Ge>cPRWK za6F%k+l3UCke!TZOyGPOIvH?SHXd#_JfuSTN>o%IXO6HehTIwM^Qe*&%78_rBiQmm zf#0&4E=DU05G`I^ofad~A6YR-?vz*(D^a0#V;RekeJg`0Xt`qQyY0wg@=U7a#OArO zLR>*6A0Hcm$CKX*=Gu!0!-C8YruG?GMn*9eYE$w71+KO-inh6SAs-IYoLj{{7WxyD zMKZ1wcwv!f7dG3!eu*Yt{W{d@U;)CWd$nRFh0I-2EYHY;VIag$b_Q6_Er=5ZiUZ~$ z62Jm26v4(5i$N0>xu{fDbAE59+6r93A?|mX8v``gjF&}nTnAQa4tTFFoRmKU26VEA z!g?xH-dqxLxsTZD9~Wq(lbIkE%qFOm<tipB@()_sDmzA_5{^1nd=FgS#2+z#&D4~h z_>y)L{(;HoZgAbT2!Jj*j|KjwH7fX+bm~5U&hqvG3r$nt!iOAwbpp>+AjiPVw)!;) zv1BZG%s~Z{djiC7L!I=->>TIohp+lyJrTUO-huEdrK?M<r|x67{3Oqx*NksCxaz!3 z=Flxt6uAH5s}Yp*wRL4eB6H>N>i%on4pN)TN5eFT<7oLqudz^19o=bb+p11i?#3lI z*Tq%<+JKVK>GTy?&v(B;<dfg=yDq0hBW&W)^dnlfu^e15@%Y^`pB5Vw!F^ZHiTCcS zOdGl2Rjh6#brh6QODBcJz`JB>PQUYkM??I3wA<FrVv<eEytMkg_UCk0!L=XsE1b)3 zm|Ppby??FS(P@`L)wSC68O_fJ@u^R2b9$=pXtUGr2{oq6+r2rVA`4=}+x;9K=<Qy{ z>tR>0Pbh|@@{J-JB3>l<3X9!)@iTlD8e1(+1ejJ<w`~+PLWt|9HfWVOG+>5ec<v_l zgaU}`mk2;aN`xiFu0g|}i&k25vXJ664S}vQI2T0~nH~5keoPNKm+4E4q(=z>AB|=( zl`%ST8!sYUGfI@b{beabQboJ2iwFYfLB@nA?BB?gV6XkdSykrawCeTUG*TZ=Gi7j7 z{0DxcrN0k5v6e}9P~@a#q{B3<4&_)HhlCU1N`<z><MLS?s)R-dIk4htE`(vSYo{oe zyZONPS1G-;6?s+ajE#dfdo~!mj=m(sdZ)t*?L6PA1b&G!9wN@Az7rB-!pq1h_;}== zqg?TdAnJTCk2PcX9X|JE_QX?a);T@G0>^O5%SQ@9EG^rE4=3PMH2TTxB^eC+6nEuO zv`92eQA+OstfW;b5&23f+yLoCn~skrR^AgAHV+_N!B7*?TTqX;c$z<$h{O2l*;F&C zYZm-2dsTNrQ>f-5OL@VD(e^~rIPgnRO(Ye2RJZ0@hfWT_)tK{Md5&c7s`Rz@W@ofR zYLvV?9lpzQNH5udFL$&B=&o8;v$Z)nFO!bd^x4bd{fd*M(@KsP2MS)Ka*y<;s%O3A z(vC)xE)&kx`g<pZqSb>zMf^EvKCJ4aBl%4De6G?1)q2jiuu6LQ@=1bPb)nv8yX#B! zN?dhDA0}5jd%rihCvoTp<*b&35;YX*)|y-g=(T+P-V};cZ-K75Hb_3x9E)mT3Y%IR z75~wanpAJYqPjk5^rID-J5z5bGPOP%_@k{Dr@=u{bz?E_M|-t;gVPXfWrlmz_pj_k zJ=M*PjUSz^LI|kLLbCtG9;EaI*S1;I<{tUa?r|bK9AE83k<<a=NdS&Rl!VA0^CQ(^ zrqLJOGhA$bAFGyrP?~U+v>$_+J-sB+cDjme)?cBQMQiXeg`}&QKa$HWEWre{12Wax zmtyHhk+#FizwHC@e#e2EeofE$nOMPTubi-@)@<?iWCTp^fMwC`5!YPV#h(L#N9VWf z;-Xs!mMc&D>QC<xXZ#2sg(JxF5Xm8OgJAXzt;Yj!deVtlg>OCD$-Z(uu)lG+7(GHN z2%C9iWCVRgY`}REYS|jv%QLS7MxGvgAS)u0S(i>H79S3xPYr_(L;1Q|rW0$yQrP%0 zT5GqcQppR6PB%6Z8)5`BC~2`uHuNMEzvg2r&udf=VE5`$>@&bky>3*N@pr3dZ}JoY zA*g8<I0>jV7U=GHKbsVoRG${qej=d%9sYDAe5n!GQ7!Pjt|9ac6-7;El(C{EEO>;r zQ%|o^y@8X0wv2?QxxLXp3!H{Y2N+fGHK@-&aWcN&h&T)r7v_7<=x{&ETNgX+q#zKS z$!;(4d40~w{k$|xt~>?n)u5YgB7n2Ry57={N0%rKmUxb+NEhMb=xDL#x3OU|&U%ad zh6%z%v)DQ?Yb)#b9KhD0*d(3n9_{$`T0wV@0zQr?_n;h$4d(VPWhgw=s_K1Bc2B~? zHEzn)MJzeL4|z#T>ufgb7)vWzaaEbQ_p4tth3McIGlg=9@8lbzEZAH1@qk-c<9n^K zlm$JHeQTd92y8bNChV96VK%6Xe_za77%yf@SyBJz_Z;|1b2OVp*m*O_F3fceW8=j$ zeB(#K*_*Oug~=09tGjLRkX;a9`YRk`mgy|$^4AKB=H29n$n9=}aA|rvPxmqvQOU3S zG$>-@GSpZ0ETSN>x7Z39!e@ydO4gia{NpYcWq8kk9Zxzh>z13$CX&4cUU4xZ{a;fA z(+&DDu<gBlJt9z;60(d!yIG7fo)e$!8w{rAn*06LSQ>2j1I`TE!3!ZQ{ruWoO>}G` z$un=K;Gk<vT*P(9_m+Wb3K0GVXR+Fb`&xkK@-G_VzJ)od0{Yix1<)nmmF>&hs+Vj4 z^+h>#D@HbEzhEk&umwT&XErZBD{5d?`rD0}t{>oSmQ#Ps31{#2V9`Q-fI?WBQM3Ul zaW{;XKtVoReDG8DXYCO<K)twSr`2Z2uoWXJJ~97_PF9<vh>%`<`wO}S9qn!s_Kt8p z|EO4EP+=%;5-pgL7tDP4%(ucHwFSihj#hSobL6GH6c*)n8*Ok4;!8zB4leL6wfMg< zMoW3<gFQe`cyWF-W4A?VyJEyd`^SEa0m%^P3p~>ch>A@mjY}7e%QT3~_K(ZWjmvXz zW$#BXpw(w}M~i7DVQNOb?})3;jdv483=QI6+G2gNz*}_3xcAfI3<G&X@ml6-*e}q3 zHwP!J87x=C4;v(Q5#n<dV>O84|0co>=S7R-ja3iB_}QFDfJ(s942D$eFkYbZuo@0I zB<_hOt3@OZTFK*BnhuOZg?F$L-Mzjlm?nMD=1;}^+#H=ulzh;gl6xW}a1hD33ycKB zPQY=8tU&4b0NNkYtgA$S`o%}nP`~k_%r`@7!_A-LlW3O!-!CA;?`g&O7ue<cop?%s z7}cSz<??TaRN3xi+3(T;6Dj;+aSH?KRAC_hc{~R~z)-sV6Fr6}{0>Zu=|C~e_o={_ zaGc3Sd+j4y*y@wG1+T3`M<oYP?^qC*p>|1oR*Gnb8Cje?C<E8hWi*wIzBq9rnj?4A z<=d{fv@Pe67CKKe7=<{zs*??TLjeP0=XY`^m0D$a`2|#|n4I!}qqszGvf|fMqV9O4 z0Jx<W)b+O@sJ?&*gJAO@mB}(&C4ZzWzXuJ&bFig3co#HqfyK@6WJX^ssaqArR%NX$ zB|$9T%^-ujM-byD^@J!V%TI3^0KVG<d8v#W-rcMFG^BU>J~U|JIeQu?RV#GMnlMtC ziS~whSvG%7IW8>D@2Mv!e7*3~1b!zPv94H(qyudD8Bc;X%Bnl0L;%&_!q&nT<Q9{H z1<Weu<E95-HFOuc(iX1q6&`x#^2tej$SuThiiLV)u~=o*GzZ~K7E9CHeeK5z>_;2t zC7l-uTt+X*v!+-l6@$`+{?@{1icxUVRp#;!;uTCkw1Hu(sDj8<4IOitGmAyzqnKZX zqP3K@=|iP431mU&ZXS3Wa7<n(nHjAHtr9__fE0NsMxl-v=@r)RDz#}aI4d*TXf<!A z3zroGU;0e*T&66Yki}$3Q>?d=y*qhp1?skegklMlS}8(xFjVz?cp8C`aMY>|R;>Ff zpw~sx*LH2na(Txq-QC41myPPZSjoMC7&$&h3<E6xOi;)Uu97%);7N7SuNtkD8tb)S z>B!Vl1HlR<bycSP;*Huy@<O*mH64SfCZoE}z`E|dy58Qpw;Oe1q#5sfWlOVw#=KZ6 za`mG|uoBVuwUxNn-LMM(_&)IfD~uXReB;GfEq9pyS|H0sw$e5xf$;)Sxj6nOaaebC z!tVvvO@Py?C~W_X=m$~L;fCIgN**fTt0N=Gmpsg=wS@OdbxXA#D@L*6gajmA4a#7B z$Q#0RBPb4*4*3q)sF>zq03Xj7iU1(7@CeD*yOVz7S1dP!6v&7@NM2P~q1|4fG77a2 zy`ib!YbB<rl1xjYaeR`d$H<S>hTW2{Yk<mh7D2Dt%Bu+7R;orZ_CZactjN>H`JB>U zD~F#?NEQTrN<t9j#dmMigo2L}nX0kb{PIW)%5;G~JO8BHqBV8GlzpldH?1RP$aJ=* zL)Eg)XP#!b{D}atYg;aB>o7b`3u+tGS(w`CYn1Xcx1Ee6TVw-z_?`4bhzu*hDmu+7 zZxIs5=X*R(5@Kl<!Dq!3-Gp`7eOys~Mr8HSLH3xGXlZGIA&do|Ppv3HA+0g@S};dG zV+Un7Jm^Dyq-s!Ba<<;%#a$vT?81nh5G2tsucWItf1qzG(oxqeFlwNkFAPvcjG-(R zXx&<%5G{V7d#lTvR-OyX&+<?&impl3E}~Tn2|jl)@coxM5)?#lYKg^^DioxgigwqA z*o@iw{BCE;R6!v<-q|(jR9S44Uh)ThAes$=jFFk19n}FOZ44(Xwbnv_Jdf=Cgz>T7 zT1)rX3x_j^4>D9N+V-Q{;j1~khS=&TVCvf0vV_{2{))&7#m#`C=Us$1&^r(W+X4A$ zQPa`9wE4UfhQz0bq|Zeeo!_AVv(6--67yi71=!+IS#hD)Rbmh>3{{dGu~dt<t_&8$ zs>*Cd(c=Xxrt(gpBkf7w(o3L?-cgW=#VP#0?^047(MueWKj}g@aqS(_qUCd}qlad9 zX6LPD(*%Ny3<g4+$F=dpzg^@n97VK-v&S#cOxn@77(#W~oHgOj(4Y=yznq%vr1~SL z#$(nqj|ndik2ebL4e5Q;pC@_TCs0sAv^WtxS`6~t$uE`2k<G1z1&)1#T`wG_I<MGD z_}Rb9!bG7tmQcJ>_s7ua(v3D#Svt`{-{qs0Z5Nll)$w?3)&=75$||-BD{uhEQ^4`v z@U>qZ>aph<;uF?$l5oy}E*ltf6{`sZ1gu{vB)UoN3pA{{VS9Ld!W6si#2WH^9{2|8 zCxn=VLtCej&e?;aiY8;~CH};wP|b6<$~!EMOBDK2RD)tvP&V3)i+}>B6*boq$&xoe zr90$lLX->6a|^7AVr<oUj+Au<(Lyw~j1VcKv6Q&hUq<YTk8EI)C$aq<U$(5i)l0Ej zsx!~$vmKYby7SAet4K5P{EeN5+=609KGDeWtnd=A%9$G1YR4Lwk5}}fvhWhk$r0TO zMiwl*;Ps|#m^QBCw3k{0w-nIP_2sX2ny90eJ!PN9o;6Bv-y-6lm>^);0rmBx@6Mxs zfTK^OqkN^sthZWsKft6VTJIqPkOV`gFTkangmYw@&)%6ffQt>)SDATJ_=)f-2=Q69 zZ2MY~b2jP|gfR%7tkszZIQV>u=pgt>n_nDbfb)mo?_y975kH?X)9|=H`q(Y2u;oA6 zYBn}(id(K|yM_M8+rc;=Q7qTADOa8RT1{N02l}^;A)_Za<@Z#8PGM+|9*lkmYhnkR z6N)(j?L<-mfQ?&V{E8b{=>8ojloB98izdqpyT5DfcxQE!nM<}H_PeuWkwmF3{Dog; z(j#8nEwrSeT5;vY7Fp!#9#!Ci$cu0}rRZf(nzF!p5`_<AO6w%{%`8D+?Vv7wD1pjE zB+kc#Wu*-f1z_rvifz2g`9PGG1L_m7H8198UR3S*Uhdc++OS2;v{nw)JyElDy=3Ge z@WYYi&FFJ)=o}PB^FoJ@7xNMxX&5^1*%w?j1Eobd_P0YL3M?V(C5iCH>lq~A-q?+? z%XMfqfYR*|U50%j@n!N4=ivp-AK)oWLME>^DR$?+s_$33LUaF=9%pJ?jcH)tV&dk$ z%zt}2=v{%dHwP(&mXnpQY#)%_XfU&?>1Z4t5n}ddzO>x^tcJV2B#cwuf-^T-K_Y=4 z|L)zvn=@1d$~ZONWXSmhZWzIMSkNWtnN~;?ye&!=uk8?JE|p`hJ&cg_1bg7iZX=2W zy!^_dJinLNyBIf=n!r3hJk@QbKcY$%A76wN#+vo%`F_Ncv{@;SDil~`!zMD~P$Md3 z%oj0UBv<`Ta5v(V^OF93mq6464OX>K*aYEwXl`&M^=1SbK1wFMFPAE@;p&Q`<eEm{ zX@lpelz4TR@x?2Qj%#|=$gCE-*k~tK!^|_>Z1NS=c9yedOz|Xx+}avtm7B!76j-OE zvS#$w_n5HpH>n-<`sRA_?wB#OhBcTsCYs4w)`spW26$dR1T;Sb-~SB$^fLtcGnD33 zds8L?uWoFlwv_x9)9BW7q*km#-%3EQfr)#GLDN*|E|T<_nQeajr|%huw=->&>dsGN z0`D3FDsKt1O(D<F#eY!`t7g4#E;NrTM(TCEmg$Do>WuJcL@Dbn8Vz|N?>8{_IKKZH zB)^vsy3ZQx9(`K&LS7rCH{GbFD3kHGZ~8<1%`E!od(Hq|?R}M2u~VL!%8%ce`kI<2 z-#<WHipvP^B7#>016Po(f0Ujp7q|a@Hu&dPq);PS2f$Kh2Of?JLE~lR1q?=D!?<0# zQ%hvyaEbJWbN@OnrIHE(lj$5Nr8B7)$-UA!RLSNt^^|k~mC8gA+T*t8KCPUMCA0q6 z?tf`FSO{k#kT+Up(aD$1z}y}eJXt8xDwGa3YPXvYXKa&}SL!HPu2sn~dhtr{i&3ZR zc3%{QzT0@KT>e#g+|%>b>cFOu@5X$*JN@>yzo@3$oyT&u7>J{lk)+2~Rbo}i)4x8r z*uIrudwDLVf8(%Nq5fKdtBcogEW<QEYlEcoV9pBlz4Wxc^?pJeFzBFxi0@$goxt^W zt%%@BlRpl{9EW#+&EsoS^RXh+`ybhLSy=kDYfk5TZApHOFGOxv-hCPCM0*|daB*_^ z(@l8#`-4_uO36MtF6Z&p61L=Y>^?UFmBgkQ(H%Ub()#A6ZnpE@p-x$5R@7J%e)H!V zTLhB}i&qXvQ##*>GsWOC2+}S{7Du-)Z&9Flp7}-W)aV9xgz{cBxsx!hZmRF6Zae27 z)n^Lrt}C<1Z{yS5rQE%Qrja@-fY(DUsyy$(UJ~Ez0<RRaN5ROe*6YQ4m#MySle3v- zxsA)d^lTgK_e?W&&7!pTiRYSFh<H9VSv+|`ZFyy^8D-fQgl$@sOUCUwsyritPuB;_ zZnTu2%3e%q3Ndx)KGpobIK!(bFT@QujuO%{w6EyUGk!iIq;KkX*r9L!5>?p1GKQ(s zz&b@<*w8k|w$sr5b(FA?V^u|`k#p0C@G9XChkbBj=a(PGZtrF~O}yshy9CK(dXC8z zBmFH)d^TT*d;}c%kbLz1dDvzCQdyi1L%CM$n3(%5j{i<L9xknAI1ckq^Ej5uwJj3v zk0ptYSIYZVi9$zf`y~7yyZ7TY6~t`qBP`1EyzK(QO|ng+bqtTP&65pn3;m7)^#2PW zt87*BI)b|Q1dvRecT)5^THHxjzPTdT&3rA+sZO&$kglOg@0nA}81tJ^g&^!VE*&52 zD3+@~x=Fb89CLHg0_g6*sF(mCfO7+63j#j=0APRtC}8maw*`!VryvM`;IVQNfI0@H zQgiV@1O|-#@#>;vC<e;FjE(VsVh_{f*UA6!^$GyWKfd1o5(CC8IG$QO7=yzgtxMXn zI~+xXV<z`F(?^q0MgC+AIOK}F{E=9Q5jr^4?0aa(1fgvmZL<nou6Oh*{hOO1ukO(3 z4K^UN7;Q9Dm3VlSb5LDJ0uD&M9?RnB6V$^x0<a{+8?tLhMly*qkP20(>NgUt!Dgfi z9)(~Q`1~wXEf2nWY|33*kC4Qo$AeGjdG`lNP(c6PR^dm>3I1Vu=wJOJdhvQ70v*CG zH?Bp8h{m8Ij&#r}g~t<dSv}Y<3@bdwth8$u4Wd*MnrHRe0t#twbg23IXdlz%`7%j0 z$5S&KOocsX-E|ldHAO6(rrxOAtn@i;FlKnaQM|T%MPNoMI}zpr7)NX6Vf}Mwyt6Ef z$4+{9?XpZE5eWQmqn`Y2RKR~?6iepYt0SImPFf00=%p`L8iiPrq?Jut{5FhA+{|Ry z0L74p3X5+8{zLUxHj&1OnXflvFOK2Bs4w`&YCj>hX(P)dnxHI>L|n4~V7yYN&_*DF z_Mf<?(*JJePOOj#wax<zG)739oXz)vlwdDL7pPN7S!KQd9;VP3njtT*l0m|)7+%1- z7&%r5^7_R%0V{>m%$sDn_?OBzx(6Oeitp;g#KDx3@4TwiV&_SCz(t~#GSzZzxTgPV zruN^~{0AdBitCp*(H1ka2uUG*s#{tWlUV6ruBD^fgBy#BSGLBqUVT-VOu{mFpgPpH zC_&2{epL7LrW!(2c=SchP?@GqG<{<v9ina9YyD@oMrMO>JRwH6u(Z&T@YE>wUq|xa z&UwQ}YheJ`<9sXzpyZM&rS80sz`)1kG~g{6io!-0SHs}jlZ(Q~F?-NY+f_&=V{*gZ zks;|IVb<6g7(28E5XK%!i49mS3)6CIa%z*D%Hue+m~{v9SwBA9P@P8Q-(8eLm%J%@ zu*``(9S?g_|0;Y1%l0XZo!xf-gW|zR6i;j_1^V#0T)R-ctBm9Kb6idvg%@>atGjVD zOXpnsi|#g|LoB!)X49ho62Ywh?qaR~-7iOzDKs61G13o|;+eGbM70l|=Et!cmS1&! z8IjK*Kj}_DeH`aBEOnI!e*!D`e>=a+-<6pE@0BRP_(^fDkLHS6U^LE>9F>YQdBUuG zdDXy~EL<21_hk9$*~n0#5DCbKDRXbS_({?gCuYmOViJFe&c8-H?|+QOU(qq_KOT*e zB~dD7xdZ+mdkhoWo8AQuB?*UPFec4BhnCjEQ5c<CX}P19jRvhmP_JB=gIPL>+zT^o zcdH30Gq*Kb4)O0Ju@a9_U}+Q*I~C5N@fIE+Y_pk2^RKZf<nNwv{ttQr$1gA7dh81U z^q(HB_!n2m%tiN3BleN-9yp<9c>3tkv=(BU%4tWBPjKviNU~?L%9X+M-56U0opchZ zMC?Xt@vZ-5B>t`Q{@a3>e^~sNSEu|B7DGx!y-uPau@KbKVi?bATmmT)BH1!rIF>>u zpO=fDn3o(*r(RIq+BB;e#-?6<BB&7~UqEO6h^s#z(M%;(@5cDyY&l)hZ#Jmb>qVJb zCT4&2`I`4Af$U8uu;<lNJ7q(isXisdm}vuyXVR(smftq?4KR^>WQyeZ|52;{ZF5up zcAJd<#cjHHQA>kH&6Kvf=c9QPZi-HLThhwnV1^%OLOUI8Rl}$ieotP+kVCT>)pvOH zk4FfCO+wAE0U4(0u*V4+=&>Zr^3tG1yiA4vjEP;ha_800^20c$yEE)yM7eoMHaS#` z3gi2FQ$Cp@_e`C)m3%bUzdF*Zza8oSN1?IwZ=+uR55DsMTzMb8`+teoRH^?JuhTVQ zi0c)$KwbH&0Ewr1i(~A`<-RR8GP<w6=Dzo;4Rx?xyFQk!QJk9<WY^;w4h8&o?D@AN z{cj8E{`UCv|DhG?nQK<3!?Lkx>eaVPDa()qW?nl%#2(&zB~*FLU^<4CUPh4oAJ}bL zY_AfJOl|r4<GZ^8en@5Yqw8xVilO?#Z*a%8V`b=)yvV(aF$|u(7N&IYdOBUmER$%& z0zT2e@zSUqcA$@<@hi8ej}lLVjW>~^1Y`GiHGO*jAFV_GwqgG-7PLS1(SN%41Uzy; zH$he)00#2Ec9Q?MeX2@<QcLMb0;zygrbFreXbP=t_FCzg+;|jO=d?JawM;P^!*p=j z-JT4ZE9!N&HPKcz_nJE*FZUKD?{OOj!L;?4iEHrvQBJj3;^8>(s8`!s55)N}2QYc} zk6fEK`QR3MqTJHO$D|uGVr*lNVRCN%&At~UPb=q3R3b15Rl17R!kjwLnx{r~b_c>` z&*Y7tef=<%E8zTb`if^KmM3}q9xd`)|9foH6HFEdwbD`i{62bnynLpNG)OeHDfv+x z`~4Zbvp4nDed>M0>-ily)v7iYz&B>sz^nbRiKwT;kM9`Gx-!`&k(I8-9)LOK@cvRX zlGeZ<!4Y;M!Ty2Y!nWkaIt%jYe*rQ^mS1}un~trAVK7(I+Q+;=GkR1BrYp9^IAlo; zz%2|N<_c`KOz`{-xdBBI>>VIj_P1_c%T%M<?ZmN}<$@T4loja_t8`#%fBeIr+lC~L z<0UbZJs1Z6lm*s>M3$$kQFk%C;7KAaK@jUW9>|}(g3@NCbaWqv+hjW)y&`?J6V7#T z`<D{$NU@R-aLr4dO19!r;}_&H6o+dK(cRbL=jBfn`Lkx7sLblmrzUYYoh}EUDc8|6 z{3CiTgBjG0ZyHg38I=i<>TXjuDMIDdGZaFDKNX1eM0!DtOv#m?xbxlgQ2ei{o|Z%p zH~8?f6b13qx|UgTKvTK*jd63=QQ$^m5Tw1<@C(pDS$w7&Vjo7edp4=nH2HMX6<Dp1 zRPDbrBwvw}EtHJwx?WaZ4?lp6@%^+IigUzx7n-SDQFOK!WoTio#IB9zE;EQFLYdjE zIQ#0Pur@u))g;r1{M%b*C{|6mX>XvSz!6$#W1b7zg&lyB;}Wy<bQ&ZVD$kYyo^tIo z%*zR4K4W=CPmyr6pv2P94q>k^86}PHei}byd9fcyY>iEC39%dYN_Z69wNAvP66G85 zf(K)+3XGhTjFJ~+|DE`R;WA9LGmeyrB2>?%m1X^DvL6er{&Tzt5pf9DB!6A1_hWtD zXPH<ka2#LdN!oCXQ7yR8LP2_?X6i%SXU4RFEuT+?KM!9$|JZZNTr7PWRp#thgeKVO zH+bN%znU#wKTH=V(Za|rewwWxE=HC&yw8CdJAFO;DEHNh17$kj{`pDW#RwvvF<b(9 zl2*{~BROJE|4uJ@c$a=ZSvF+DN4&mR>KXUpd!+l+PzFRp>ru1dOJILp!O+`dk^ajl zAKxL0?mr-j6GWw>W`YqLniBZA2?M@csw~6X17a##Ao*}N6<P^%2cZ6&vn56T)(P>z zTedIJqSJJCl6&dI2ZN-bArx`sMsY-O;s}}e;{zOT;4tuv$=G7z8Gcz=t?7+bDAnzd zWIB|DW`YGHy?Rv4Z6FG^V?loT3thSoO0x1GOOsFfEJx!)PWSXt=e8NhA9x80Rd)|B zTA;}gFAaMlISZCPnS|I`$j8`vB=}A5Q=5l^WGjJb@szQ&`3JmC1E{>-oR&T+{^2;f zRteP`HrJ~_FqOXr;knWvB)d3y)`KYkbV+Z#6)q}u#RnL0S8&uAP7Z5Mmv)ORv+}eK zCyCs78R5Y!Xj(c6#7v9j@hD|Q_owFZjZD*jC?xKA#6_PMLwNfcARq7nwU0Ntz>5+- zP=B~?^FBoU_CUPpku+?$g>G^cJb<6kEk_#;OW0p7ks+C!PaTI7tUD+QkC)WIs#&O~ z4Tk6Z0m(YFOvRvG(+=<;kv`)rSkfWmiQZYtnEY5i)#?7fh`wt0)IN&7PJwM1WLY!W zNZ;qe%YW4~U|5vYq_0eZx9H?)Vr0PXv3r)~Sa21?-o>#Rc&4hW)3fgxs7JeF<T|LN zI<Vu~kB|Fk6l|31!Kl@m)wEC%q7&}WZm<`4um0m@tdCqOmOYpjeaAu1<QhmDcEADX z5uFPN7he|r$fK68t711mv?5J^SV~s0qP;EN@^##%&cx>wazvZ*a;uCmxTegFntUM+ zIarSt#A&5<c8Es{O6(-4IKdJ<(`NeP-py`%x=%j2btK+J$6g${Qa_Jss+*Z^3WyRJ zTtL(5VQ8ku7?qSbT@B0B<&FJLL9|MN>NB{^gs_kka$+ul_3xnaD$%>4Ii#zEO;;ye zms1T)E@u#+OZls#jDebUoyKX2&c)7uuBt};Fk-3qaJ-0E-%kUhBqo<rVa6&tQQ`6E z4a}erm_;oC|B>|(%Vc5hxeLOwiAY#6MYs#FBZW`<nb%yxgg<lkl=_FRt#JFz30S@G zU23OR=858{pQY#?z;W`IG3gUbJ<;gu<z3q6k^CU(jh#j4eA&uU?YvEr`KZOam(?7& z&H;{*`Z??G#%)=+fR9as)@5BcATX+GkP9hCi4Be6oXO`HNMss(@PVjl_ebmB?vod- zk?AgwHVGBA>qLN?RiO<I6YL%R#p#;((hH{Jp+;S^>~&O56FG{XeYu3(*!AqU#Zun( z(vmB+R{|dwG-s?v79DRzvoGm@nqru-T%wQ~Fu@#?F>Rk*sZo9C7y!NYh4BwGQFWdP zlPZiK)3tV!p?%&37<G;483UTRV8#igB6kN<y2==gL|_YQ;96URIPp}*nLMih33{F; ztvk%ZV1D!j!xD%5|KjN_yqe(O$Ne!zjNBM88b*xn&e5Y=Ku{@>lvYX|Fkp0dj&4Z> z1f)w^Qcx)o5P2vS5aq}7eBQtBpRk>so%6cy>%J}usx#S{Tf&Cw?cHQudwdt2GNIr? zNz|Kr;zTcQ_H<52)u=cm<jGG^Q8)viPs5o2%3rRwED9C2IdOgT!^aj|Pd2cHj`%9n zY#$qnFUFu_kS>*Z;sG1Izr51ciqDCE!$Bwa`+yyiJBcA|k(<fBhX&8&mgQ&sl_AV2 z9}kNOep?cl?>x^LIAAGL5ICk%l-HcGdO#i8DyXKk-OfdSuTfK`B#@Imn#(_#l*evR zAf>VWpJ!lGh4+P2f#E*Sm;oB$uo1DiKm$%PAXItZF!`!)=A#V)**Q*L{<K?h@+3tk zboxh=zh_)X5HNLUGnXEd^umsTK>;YQ0w2)9{UgM89H}6LCrk=u*#YQXPS_p|w4D`w zWukt2b1|byXu>zn_VISV{Oe0HAY+@}cn?j%y_p!wUH0YeB1nEq91=oaVLE`K`qf97 zZ^H2pkNcFf{U>eG(G<RUF+qJ(3nT~O6$AAI2dHYvLa>w|0HXvl1^RD@0Nz76;MC#L zv;aN~D9H0N!U1R+f!tH)93#5_l|~9e_WKd6R6YFn({Mf?l0^>8-z^#rzKF<dD#{?L z&j`dV(IYMaXPU<x`Gl{%;z!A03VeXiEg)=t7^-TaH}Au7G3*6*=+`hhk7z~LeAu+m zk%(yE;aBQ^ket&4k@Pq@sz{JoP<X};5rG^g9}=#UgY}t*etG(QpG2}{?%(dI%#AoB z5(3Ofv5d*#+aF~(vwHFCs~<lpu2JH72|TV~PKRU@T8?8ymJrGuQ*>+uia9YoUtlkn z^WijODaoJ(l|s;*VjcvHzx*Na0sC*wQ3&+}Fg(84fw4*sLaCiF*qk8I9^XUi@k}N` z4#+li0lck^62lCGUmFlU<>cK=z?VhQN}y=x<D;K=i!^&rk@8lpB*j%n5rzvK$kG0; zgrtWHbTvm!aVJSg!x00z;Jx^?%(%LhIHFST(v=jdU@2rD@#8Z2>tic$GlH5CplomX zpgHxbpN7o_V#f=S*ZLPg+8`Er;2=l?O}i_>n?0OHC7z}TO@%R%(cQ?iFm|RZjWgc< zd_UQXO!|=a!_(X0aXcH2O>;0^U21(Wjp1d65M1H^ASL7A3^{xzH8j)yG*g=~38I!R zf0C}|My=8LfObCp)|Rd;E=HLe|9CuIOFkPoZs+5c9nzT{wwnF?G8@B~6Ct02waJOT zr2Cg&LM18nXXZi~xxz&tsX6hTjHx!+c8GL_n%w-&oS4hpl30xqsKmb%Qwg2n39YF( zo&07lLq8niKqrvmM?RW6XqH#i$=F)sb5NZ|&&m7BH9wg@8*fuEV#C`fuRm6nRNK$g z$eD@U%%e}`@zrIyMVt1V@+X4xc*WViM&uGgA57iYQ$?j{g69Yx_KChygDl6Yh+gIo z1hcGy3i5+lOU&aO5rw0j#n)ikSB@S;sXQAtj2@TJg>eYyDUdo#!O;c+2;pR&=VUh{ z$q5Ep*;9I*5o`42OpKHJV$!2hXvy-(YW&4=8H*<aiZ^)~;GOK3HN}4z%OpO~2uq;) z)bJt%qS<NuVWxaBX?*cOscRa*jfD5WEY%i@eAI-hjw5hyvkX_tm$1dh)hf9^FQLLE zAfX{CQ&yHOA<F6_v1`V*UrPQ>g7$j^!?hNuZMVESmDPPPe$G^k<%)0%m61w_W;-#c z@dt{SSnIY`dR<u*bGe_cmT1?|W)CBzZ}bYHo2z3K%F+~S#0V4&A`w?oC<>5@2B)jn znT)Sfux|<&F;93P27W$EU9>^+E>l2iROT_E>;a)#BaA_?T#aQ%%|KS2ps9w+LhXgD z(4xQcYO8V^iCM@2&5VpFu?#A4+l(?#Yki*TLkSt~J<sD`<oYI5F(%4`E_Nb1)e#+t zB!S{h`hv5X(u9dpF}<3jtHy8c7T8SLN^yaIEX~ZFh5Mad3ppUl_EgV~UlM$?a@2Wx z5tn4SK%OLJge0;ldSrZ&aZ3ZSE|2NmmN#28^;02Q<J;w4;-bfzPtV9C)l&_8HMK~Z zE$YLGp85oN^3ZOj5&c4u>2=y>-T+z@7_+cs>4I^^uiWT(B1;HqijVKMX?t)N|HpPw zsaqjeptn6ST!l4A4Fvf8GQ5uv<iR18EqGmRIlgF_LTCqjXx*_$zQE^Zl7%eYaYz`l zdLF2XBj$bqV$}Oh9-?QX83oZ}Hmde-C<^ytgb*Q3TFatutKa!CR~Gg*#ma(h`?Xbj zdhwc}ZCT$M9VK2CIAc84Y7%*2xOO#ADlssh5Kz}1o>HY}>TfFJ5TFgrFrhB;3Clyc zOer*r!#M=$0m45W#fcwh5rU1!+Vd0x=Qf=jYc%_%XnFdYihO~N+UNm#dC603+;1H% zt>Pk^`19b#RMW-}H@2PGioKG0Ebp$2jchr%d4xrMH8nPGU-i^X;HF52t{O#-`rn3h zqpD>sk9gIBGtGPsLcNOf9c52E=Ui^dMXyDf2wo0g(}v%2DBIVydSJij&WJn1se!~# z1AZD-q{-t@1+s07+=~xJY6Sf>VLhw)jds6VHGU6xtPUt?4x+!c;`DkIlxj){g`OQV zh|y_vMX-M3f*eJ<0Kd`v%&#}Gy-lt7zgZ4lv;vRBJVTa*O~yPW#D?Bs(2GKbIgLrh zjRvLkR}$s4rkn_=9@6A7s2AvH6<fX3_o04WLS$NI%?lZwZUG%_;5nEAUF-(8@)Fi< zOA_A=1!R{--V{{hJWCa?$ByIJLfVy0zZ!m19Qu(1wAw@7%^6~KcuVw+<}yCwd38iM z9FU27URQ#X7{n#5=n<C3{1uCWcL-zAf}*q7rBJr8xER>FL4xKu>s%BioDPB(akNhM zSrOjq1G~YZ$IfW>YKpQrXnQ7;BMrtRJjWb5J46!NNORmjT$gT<kMD-%2$vSLm}n;1 z6~DnHZ0*H^2H0O(Lw@tZ%zsQb!Pz^a6N&MO>w7v(VkAeakb`yZHy7~?G-6k~I<+1% z(c-hK^2MiiV?TA<zJxGc)XW~}&otXie`T2;>Evg%CO?Nmzvn@PuOL!3X-Iibz!pgl zkdW#|ZT`r9KA{uF&+)z-^?r|x_ZnY(5XZqNJg@z+IHR+ZI&~iTp@&jD4QY~TRa1!( zr?G)Ub-i+JeHK&J+Rp5z4L;^@JX>(~%8|%??<%oG%*xnv33=4R==CT6w>Z?H2exjv z6jZnz(z6`)aryb5Wen>|gz^g3aEZ&5rqF?dznLbsaL`K^CNsB^^bC>_yA-8dvz*pJ zle(%j0Dbz5P8+%`@Nww=+zPQ8LjmOnn`V73>COytfu<U-we!_)A%je&aI#c52)d@S zc6(g2YR*{rB>~tGn`cBoXNF(M?kRpZ$I>qeo%+r)OHeFbLM~dl-o?qZu(?*;BPV+! zu&Vf^Z0^rGqV(f0wJf>%u@b+MCGn+Cx|Me?*-U5wr-m*vOf2LM?Bw)-tjX5>KWoO6 zY#V<dYvToVb4)Lr*V8{ZXB9#y{^qMSk*{uKTt4Gk|M+n*0a0jJLMY3#v-shT8KS;t zQ&3?#y#Lb%bV(h7=WrA>Zs9IC-=f*3QA``;oG$GO7?V3JC1_k_pKGKhvnFrYNIT%+ z)Fy1gq`3ph*R~0D^2+r;l=mz06>RZ;wyl;BBbyc@5q;IcI4H0hA@mm``c%H(9wG8( zUT}JAa8SKMn`_s3TF78`P(n@I3~8^Cx>{T=yuKxz90mDuT6i0hkNPHZUqJNy#ti&Z zVs`>j{tHzeM(`EFSM@1S;O0b(Z16FHSUgWf?Fk#e&+j?B>}#d(-tC{I78n10w!PyX zUS&e$T?NTRS4lZSN`*nm=WMp2W=M_qyTj@dypRKiNTk7`*j8Z~TO@y;`p%a(cf<qL z`!Ie+x&l>swRL0-(;{+MCpk==9216wZ~V&z)*gI5`5{6+Z&3a(U;1gPB2Z27RjY!O zMcp%`qA1{>!oHH}G)1+|!?#W{{qL0?Bq$|->*rw-gK^3q29<k1fIg_J>_(~_aMhN7 z(4B^<{_K^TA(J=$qKaRFvc0qg_5b7hP};go`o>6p_c@SK710(a`+7}j<_1=8uq`Fj zriPqVvr$qv4p8UU?3a0|CbA$c#x0{DrqMun268?n+4+(^Q6K;QxNqt(>T<)=n&=OT z`~ZS0_iMjj+(pqVXV0ze?5zFJn%;vJpd+SP7x=N$T8BScrx%-0unNt$M8C^KcQm0B zxs6hW^a;d%Wd@)_*yR^@G&w5`EsXRkv3jI)^z^^~EkU<E(XR%YKRpNfztFty(y!;% zCHsBUb*zp2Z83j-GIef%mw_)@bZC?>q<vN7P2DE>@@vQ0XwTx&2bxRxw@Ly_<6jxx zbwkE~oj>zJOb8#+jAb{Gwre&16S~Pqd)DRs^F!w?GZ7(wmut~L@`eV$1P44w?wU*e zK8iM%p##W23_vdfn`Yy@RFAUqzBBIi4ahh5(y%*4Sq4Sioya5x;QyOkqWb)PA^=dI zQX}VaD<ld4<MpxT`l0TiMVUg{TRk@C)E~!B3>5c87!1V<-^;tMmUxiIAo+wbw0X#m zBaXfymdp*vs|W2YAQ~e`vKY=r8e+sgv_!%r@aJ9%(6*}BhX3-w3s|crJLJ`5^|2<z z`XomfSnA_Ank*s;lztakpxPUDQUUgHOzM8|OV1E%W5R35nAXz%PFuu*(z$1VSlVrd z-6(~YSv9F3g`~p_Y1B6MPzdv>_xbyJuir99HqD$j_dvfb*N~r5M4sIcv)NtvYz-%} z>lED@;C819RbxI~YsRJe3C_<hCb4Bt?_TX3Pdin)9k34*J6H&RtVhBex-s~{01Vf! zyT7-sNS(jOzOTz>sV<46DK)IyG`kCKYNaaGj<%=<3-a4km!!n;Vc`N80y@W8HPV^8 z^{p8bTs4TBN!UaUB$Am-ElZ&<vIzOt9vNG7G%#61nJzF~pLLhz82h*7iX+ok#7R%K zC8gd~w~|-S=Pm3$3Qum*4X#T3i_Y-4H6Eljsgp-l?-9$cn{0!l?q<|b(eZ7L!UVf! zc{rI<E+4*4F;E{BFxw54oR<F<h9`M?Ov8BtcQPPt9UwQXJDm`EJ>S4*pVEDTBrMx* zGdETxlD06_;aTMQ*Nn!-JQIh9J&BOxWnvCJ7U4byj+0qhYN&@NT3vUJq;q!+IOM%Z zQl>8!eNyccr+N(KiWT8+sE)Kqhe%+CDAdt2pX?OyIODc}nz0rXc8n?zLEsi`uR>vf z=6FLX^f9nO@>fey0BcsA`^zbT;io32B{0h<57Q{4U7H^y9tPnR*@*_n1WZ<bEEhG8 zKL$n%QUmREY+3g|3Os-fdzHx`Bku+y(u*l#C7c3s#_n3S7FKV?Px&#Z!&(>dB>*X) zm{Sy^NUc*MOrT{XR_nPAk<!)W*$uY5^FvegBMb5pzQvH+RkZuVk&L@hqp|w+Z$bpx zy<UHgzC~<wwVK$?cY-t<Lx9i-yfs-vd#NqI+4$q`H?JykWGX4#NRUk!7INVsfTLjl ztM|g=87(*xy6y)nPX;Ha{tFK0{)~wRQjJI3Uo$>hf$5>PiyY5!PRTL>IoW*xyO?K- zu@+Cq9>500l)Pc`zpkOF`*RvphFjyLn|kLCJXE?LVuyvoTQ;kbQ;gp66zs9*K6ZZO zBFj}2D}h(}lOVfbpRBo_!UcP3w_kJq{)guOn-_3^Hvr`Ds3J&mAX4tXv4>Jn8N=Se z`X(@v>1@;M=1KdTdq+>Q<x?GuL)Rt4Q3v8+p;>;;e@}TDec#Sd5)nN&iQx$-i2&3$ zMPc>&*{@QS)l)R2+ge$V0+7X|Moket@WR+yNbiTReO>=SNBZ^-Es^I33V043r7Qw$ z`~pHy&4RvR2-$HGCZ6z)&%_J&iXS$mrv2%|0@%4ER!o3UgJA29y0$FCZE2WZgukEV z_*ON>Ey30e29R}gQ25=(9`Z3vdNP_&oj71>+)h%B0g6y8PTVVG$4TiL7oliTmbS71 z@-;|Ha=O@NsYQXU?xR3{CBl42l)CW8&CyS8+(Zp++{j7`18PWV*1twGzu;Q+C!*ZL zH|k5Ouhe)w5gz%x=p94_7AUtc&;F%DE0py0s0x)ZPyhL-SPZYO-d#UfWWhsW?_7N* zOexdfCLP&3czT}hQr5rdQFx4B1jGb^C_8@y04mG^hEO!0I&>rw(9n=Or)kJpl>BAH zG!mYyD!n=^gMo;}SvSXvM!6Y0RCtf)kM?59UAbsM=)qjec|KoF(XGl@m|hWARR)K< z`8+A8c!gD4sKpt-h&2CvfzG%M7@CK_XRe_#<U$u316=PE;H^i6M61K4Wi}fUafxP1 zS_f@I65MgKl{|*5G*<fx&|>!lChLYes}~>Mzch+Pm{EFI#LyQYAG(@Hei6JuZ^bP# zBuLj5o+P>j*hfCvaCDR-a@XH+x6BsmXKk6a3U}?gyYy<Q-7o)}2mXCz^sHeu4BvqK zlEs;Q2q1Tc56fbomaM7J*ZRF{@Y40@2~V8pK-x#LEpWt`97iIH;@ru|+_d{9mfn0O z@(zk+zI(z{1rpzi@E;HT^nEh%^`Farsl(=kbNbPa<S)kSE4H6a7_&PwVT(>x+a%s& zgKU#>p!<bf^t1(P^<ScVusli*WL6y(WIs!zgzGKLHrw7X5&Pn_lpJZYSB8+<zHye_ zj`XirhDD=&G2@DxG@ku5aC)Oi>XXg>PfNX$KMfPTm1J*5R>pL+{nC1Fm~E@CtSxR2 zE??xA0Xgp^R`sb7ux>%gSw`o^ZG~I(s}0(ldWGNW-D>_8yIo!v+Q|CYG6$fKNuFz# z)~cw4yLGNFFzu;pXHj}lkeVij+B=QizklStYxk#OjB_GejDa?`W=FhANUdV4JS z^=o&Z+Bf)7LjTWvjza|V_aA;!$0gLp37oJ$O|9jL+xr$6rn$U$shp22yZXOAEWd4R zqJWE2cmo#Trvi`g@^}b4X&LKQ$*}lDa~$uBU_=^=w&H|1Idg6w(W{ksIUn6wE80+H z6rY*Qjc+;CI-ZeOrY*&;B>rtBh&rBo9gOpN$yZrU_Pd%;Ul0*_V=6b8WDID#bGIZu z*M^e*MFqY2k7qAi&pSR0oj^@yC_Iy%u5Z7T4qtj)6)i2)2>Skx?OI}<FwkIt`p+?z z{qMZ<7DkP=+C+mWTn$QBuSV%)f>jJ@gLqFuUL=wxKpO!`U|l@8qz-gGCe~9?0)U<c z4S=nWGbeIMrR8d#XieWi#JK{f2b6<WsskewzwoD}U`QZ28G9Qk)Q3-Zsb8KH`S!e6 z|K|ls*qZv|=D!A5CtrT+#D$KF!s;ctH<&H3!f{M+ha~rd7i#+};Xe4nhh8q?;|e=R z;ig!jnP0U8QdGHRTsGHLS$SMmNtmSJik>+F(tf_ZX1R#E8?xkaaoumsUh}=btgDBq z!%j2bhJB&<L>Ho<W`>?C20{B3+sLp%KJ9eBTPme5NGBh0a51*sajCD|l3Ji`O~bE( zkP2X|b^W5<Xz>@BPOu)i{pRXB&g-89d_db2lG{e*eH!4AdD10elf@gkgm+RNPQ9cV zePF4~g*C>?4d_8WSQ?nDGONN#(6W&O(SZVKO0XffUu_FaiJ<<YYg~dG42FR+;!~fm z!q6z@Wkqs*hqSAX<m)|}2C+mMu?W87@P={zE)6(~U0-*o6xvC`rmT;@d;r{r(%a05 z<%3(Aa@jIcgQSwEbz|$%Oq{DJm8n^^^SKQ51vh2;3^C#GSSUFZ6ZM8rqv#u`Z4Tyw zhdc_;lA_4=?G&b)1z`yLQQX<=WrJ^=TD)@wuLUG_>IQVnhxGh=A1HJNp*t`3)f+qL zAXrp3fRpC~E1e@JgBcDk(KWMLaw=a;Gg0)txstXPbZk>rvhq3<q0%fD&fhiM-^KFx zlzqVs%mpV@X^OgS$l=Aq9d^V`Cx&gm$r7`0v(^uJ42|f&(QH)URo^Cl2rRI@9#X`% zCACz2J4Rw?s$U9JN9yr)h9Vshm3k#SwgVNdD;4+iD&xj_0wEE9s%0|FY6?pe|E7~u zR`XVx#6FoNzJCE66nJxMxq<DCzMyz>LtI{lOc?Oo8B4NjU5l&J7L?rG6U<JjMV{1* z#|d@$)qh6UwO{d5=0qy^Yqri7C@D6a#do~P6Q^2J+)mNe)=%2@=!Kk*m1*kfuXp5x zyo@~--k@pBJ|=w1K?J|JeU*!h#1154)f+SPYTG6{PA1B^-?bP>>IS?_2V`I5iSm<U zn9M6<cQPgAu$^4OZ5aa_n0F%S%_dUs-hvG12laCY>QXhSs3kK?%mz;G8oWldj8IID zWlWBjPfoN=z8jjHT$r5NnVde9rrU_LJ~h~_7Ps8c-;PY8Sc$MfQI%cGQFcU%4@fPu zOif%9xLUIloiQmzOg5HJnRHIwtY^IY91y!O7`1f%ZcA($;FIlyf15>WbnBw>>U<Yx zJ>3k_;7f1uGBv0hFnVocw1qQ@pa6V7oZi--{^F`PQa?2v7XEMAIw$e7wOqkiJASeq z0U+{git!E`0dNpJIwkSVpV<hSxiDb%u$|c4)57FWozo@}Q_B5cC_B7AmoRhYk87$R zQ}K&*()()}=e9Ffp@KgAe18*OpE#0}=4R1<SAr1CZEg!*teddwzTIxoHs&`SK}`Py zO)~Hi@R}eu`jl87CS8ZXTyj7%O+??Al4wW?@4N@9yOLP#NpSL*^)OFHjQ4LIPHi5W z0Tff=i}PuYaa3OvZ(#8EutjN>KVX@K_M10?+#N*9K4uzNDYf5KEgNJi%7tg-u`*io zl0>yEKVGt1Cb2y;=UANFy(XarV_eci69>R6p3#om#BO;wZ}Qi^`UD>xSaVisl`jdr zH;UbDX&RV`+~HK{hIl}qh2fV4bf~&0XLnS|#NXp#^l60WnhbNU<%<=I3=Uvz211~V zH(s1gq=wY`d$)~yG(pd3Nng0#utgAaOK{z5Scj|#`n9J*+T=x*qj0QqBu`3?Wto`( zOe~`vfsg4U)<6@fW?F?1#mjXqSxAT9rmtVL#CW8Tx@N}vXk~GU6L`Ltc}#u_kH^qa z0*ot`%mw&v{PT%8TvOL9h?!HZfkd&im`JzpGY`)#?Z3QI{j(ekS-FQb(fK1i?jOP5 zF`KzXMw^otn*!pBP}swZSQEw;{q8LJ2K`^A`9jC6VLU|+=x?7rr%Rw&5+mxPLIF$5 zDO|;fgNrDMirW{FN(7SjvA7D^C_cE!J3#)ReBs*a-u~Sun|D&=Y?&$6V#vT<9N?Tx z8w#z2Z?Re$5h~4@xU3X~TK$!}cU=wU{0O_Q%1{NBT&&zIRslwn5l@);jy^;T3)s8+ zPCu4;7MokA&Fae7e3!<&X06{cR&Fjr9FDEekL$Tt<LGH8;G@84xmIvSY`-z39IJ4n zoTG5CNmfFnfG4Lw@F_5<cMYL{t{l;ix$fhiz5CfoBx_IToRdp4cJI}_d&aIGmlF}$ ziG8=9IJ+Y~ca8vRFIOE(BGCzpJ)xh}kL5_gy357bZbZQLc%4n@mEGpbc{pG3k=%8S z{`y_^k{_BQ*Y_*2r{d#qtlT}DXY_s5a637Id|daq6P)O8;Y3LqxDxK#w2@++3%#Un zMA>(u6JRSCJ^P$LxQ$qdGAoDjdt2awdC#9FM7Yhyg#EO=5Al$HrX^JQpL3ae7cq4y z)1Smr7{-)Uztka@#+%24luCLQ$S96L{pW)l8M7Nw*#9cha;VhYO{T`Wn|Jz&lloCp zFhQyYY+wh_J0%J<^;UWpepzjt(Zw-drsUbY1@#-~r+rW{w3fIR4uB9vtxV1C)59Qd zX93`X|KiKJ#|>ktEEC{Z1SZORtm{}S!exU<TaGw@4{N%Zs3F2cz?r*JI|AsywdIgT z`;g*NNdNg3{}zHvhOpW`Cw<d^v*FEa`JJ5Ax7OvDo(Z>Wv#!s=ndbStEpY92Sfc$r zl~b-pRv}lEdrS#|*Vj~&@hp)g3VsCO97OwZ1CHdcG4Ue0E*?EDjk6Dz#S;7Z63nb& zsI*votn+DE0y$0m<VwQI??-bSl<)hxLw?4*#ZW$dwQVcBbMsbm)0(aUu;Qd+L<-YX zqbq=)n^6CRr2T4|xU42+$I*G7&@T$4<({;e!bv0;3nikQ9#m#u*N)JQ*T$Sd^4w_2 zI#V1^>x$Tl`ApG|KBlE!K<UH}hB=ZHQu^V!sZ8UvpCE9<1A4ao-Tps`nA~K9nl<l} zA%CMsg+*!Tei}di_x*k~#cb)ZVlXMwbOS%AY&c9_ZTOYGy2=S`pMtiVmsUfKR%>+^ z3UcSf&<g5)i!a#Q`JJ7Ak{Hpal=wWnl$3&UKkNQwroBz(AHyusAOfZfXSYqQ3^!J2 zBaY@``x7NNzd!2^6?bc`uI6=C7y(15LpJ-*T=8;`n>nyc;Q05rAjTJ)*@AxGJ>61; z?dZ}8sMu<|H-mF<x$we%c)by6QVnj1S)|)PH>8K+LvQIkYy8Vu-CcT~mKsKkFZh58 z++;cyOPZ&9$Duu7u&&>;(#>gp#HEH)vQ9iMZY-~%2KSMrU0ez>0TI+8e?PJ`GPTe0 z*@xtQpZVd#2UaR%=I5?ZbiwdG&FI|DxJ`}NN{n_6P^c+_u$J`E<dG4IL?;KRPhZX# zf}@yVp2!+;kz!p4rXe|{Tn1xSz!cnMcpe&e7@%kcOh$5*HPCr`_(#24ga4e#b`U<j zcu5aS)B2}o_?Q4nrNDmK{P^eG(7Osh!UpymCNj*Q{bCjp4gv%Rp&1Soaz<E6$|IY~ zTgpK$5zpw&Hh$_yP2*=)o;!K_GS=aw(9wdYaWd7O0N^>y6L{8I5W62f7J@*`uc8<@ zdDBXiVoI%DeBMezpO{s=SPxIhj0v5Mt}XY(kpTkBW&F--KZt<?72)m@<taho94p3H zy{f8CNsEIr)fTtUjI7wnz)I38ldEzaKd^sy`KR7}BfYeT%jvBg6|xFEW)CXvgzy-V zf<1nH3|U8p?No?LLxY%j9bZ3oQm^#JqBmSCAH`L=ssFTTBXv5dBs@R#3eh)VLZ&KI z1)MTChz5?EJyk7D(>>+8=h+h0qH_cIhQ!<(EqB+!npLOU^Tk9Q#Kr`sH1Q?0EXX|y z3I+0qBl)xL9h+E9l-(7G8WPLs{#mLywaL}csE{%Y6dY{36m?3WAG$0u!O>f&*IfmR z+3F7K)$->iPqfrk)jqC2sL7V9a};T9NT?gu6d)k4eRp5?<;_(Y(z2IKs6wZ<{A)0X z<#(2pZVi$tvzuS-$2xLOX!^81jy&WZ2^#kBvR76`Jvx6UWOfg7y{VZr@Xy-UfQip! zBAdY|ttrIN)4og+m3EN%9!6xpRD|z`Vc)ONY@)#24=+h7u0O;7ypt6@KTWJuB6w9U zs-R`Ir0|E`V|BtR>}Nm{fnd`Op?=f!uj`p&*D>U~_w}`N=emO=e|N0@etGnF_vzoS z-ps7OXYziv_h0`JNqcSrmDq~;d!*AWv?fs?Pr%a@^#oJd<=jWSP<j$ZwW&IDer>cR zW-J7JAwrlb-YW6W@(umqxH2IQ0Q^5v6CnaL6!YX0Lk;4nk!JO-Cy0^Q|7gw~t&tQ6 zqmdGRhfe-q@fw8RbZ0D^oGYzu?BA;vDe-wJ0@!ve&yi!Hs~b&)UY4rIUg<B*7!=Km z3#}`+9|BADcVGK`KlmZI(&RXrChYN3XqB<QTCEUgp3#>j>7f!p3jIFAz>}kN=`Jgh zW*f4y^1(_+#P}wck?vQy?TL%gFfFrUZ*A81L0C8mgNl&ESfl4T?f>xMAgk8L->;+( zS6UvuzyGW>ZWG3>T7LEQcd_atj)!7QyHmx=PF?1G@=vIls~C90NIj5AOU-_DVKUKs zw`<22TNck2e5zJ`A7^7g9B9KUu+l|G2kGwbLaKdWu40Uc@-Um%o;IVQC~bu;^^qr{ zPy<S^qHUl;geveI<7WVn-KThOB;Q)?GVpXW@s}w;hc$az2zC53-+Oy+wm<lkdoeBa zcziSpYxOZ}O@o-84i!Nj%{|CBJ-KONs|CdyadRyG<jyeFljq5_yxW-x76{lvMDj5C z63N}Pm~d*rfQ!cl;vv<|(HNc_D7B!kGYvJr=y}OB_w)1ZSoVu@aeJr#hgsfA+|-lV z{IK)J>3kd#GcaV6*n|u!U}K23u$yoQ^LT(CS%@5iOehn`A+XOuG64gW1Q%de<El^o zQ?*w_J}!A4ufYGmeGZM}!$%`-r;4BK(s9gwQd>MZj%k+>r3q<xa3S32?tVos!X-1y z?hdGqx7DSbfbBE4?~ZwHdrG{x(fwf2-phkGqHq7?aj1)oC|qva(*9dJR>+x61G~$g zrIHjjrE5~}o|~Qw@7~Iw!_SuL_7v4Y_Jk5W@D5PAC<_aD*bT?m(Ud`meu1W`8rp11 z{<V)Ukm`NY1+~fpw9c&Rm8Ti4hS=dOh(bLjAYw}H+j`n<@`q=c;>~%B56O$kbWkKk zFbjaZrs>S$`C~0!eCam;K9Z!&fW=}$a4nRs4`{C0Hm7<&U;w&DO6qO<+j7hCZLDCg z+;*bkUl^|c8e!fKV?B)PLGA#k_$dk@+A3}k2jAiF<B}7Mzc_a!_i9@@rTjqWHITH4 zlmWFg0&2pJaJd1%&yT%6T@I8~rG6$CJ-pS|;s3!9ozHr35<@7w^tAb&i7Le?-K?9( zrH>2FgzX7%g~?KHUbgnCwzeE891bj+_-(p>8+yWX)BocB^CQt?Hgr;>S@8qwosd;U zChfZbayvNA2euDDsQl;vn>9tycW-$7r4x&qtMH@lv;)Y-RBuI5ImtJz?91Fq$5mr! zu8*;FT_xnJUqn@JC#odJ8yTtw6bK}m;P}1^5E?=i5a^1Az)dM>Ee}9qK?D>5$6Pb* zSXrE8Kjr!cv9!|WV_mx~A%Q^oI8P%33%Oe<3<{{XFbK0w!TX?p#=lYC5taushW>my z#B${0m>I77>3|_ypc3fIAU~kI@>=CN?ZAB$3rVOL-?*+>OIlVKx>LoGfjSTD5a0{f zKoC>M*%+uJE$~<bQ0x)uPV`DG=XXyMnj6@4A5$eJYFr!GZ~93~_-X9QkjeiDKNCa1 zzlO3XVL<mPu|>df%g&`{&XAM~4Y$-ttX*^@+V-Ko-FSZN{sE_@|1j&Bm9p@&M9%i^ zig6&iQ8;xBF=Jo`Rk^jEA8sUA<P5MMa}qZxYl51pmw8~dvr!UldgOIL)vIF$qoaxR zT&QKiu4Wv}elnxFEa5*xUAJ%aONt^vPMUd7O(|aFn7Wb)XN=C?7ehwjOj1u%3W6vv z5+fWNeI*Hq@{r)J-xyZWjx)Ou#8IWFtS0}OF`K4jlkK+4hY5hpr)F8mVYo(HOSRt9 zObN0ih73^);*;fcZ%SF4;p2K-S2{WCl@-*SwWg`H7U3CF>}w@Xu}PYFF+y%IN@XEO zSlvo<&IXYU%qoeGY#`76+y9yE2o{sbb~0GvNhwjLlsf^p3HNrq&@CE-NFhuM6wmxO zd-1SIfaobHz(txFUu2Tb%f>Mzp2C%=Z-A`{434#6Pvdk*A#9D7R&%X`0zxxnf_2<t zROg!$UT2bm`vXb5=rWTwiXxTBZM;0VYUoCf)a`(mUOwN&?S8mps5F|#z#9)=LJ}NV z>+cF-2!%EXvNicyAUj$Kieo!}yzJr}j?tQ>5+0=Bw<h<{rW`B|m5sAV#=m6|JcF>4 zaev+$WuR^}C&ecFCba2IX;XXy4ee8wp#B$wam2eQI^bEys7f#Qt3%uP+qF5eJ(!JA zd$W<^uU24^sZT0?oleONG_I%3YZY;r#5o!y_`gU5dwS=j%VU<?a4#tc*)iTM-%nlX zko=J1m2^UQ3r-{LQKN~xq;HXb;hVHw>Ga!b!tD24Si_!{v2NJCqJ(@mNfG|cphl5c zsr$Si>2%VEy%YXQRci<zn5K6vRH{hVnl~I+wstKxK9{a{>X}ux8k()0mAWJLEcM^+ zLt~}1)@18F8`zsPRZO&`(me#vN-66pPn&MuAJ1wQ#Z{^!Dvxr{RCmGO^E@LrWBopx z3~BJr4hpdB(cu|2*a*AU1@1fSqonkm8D39i>t{M(@&2&);nQBDtk$|RG>k++sILfJ z9N%zE_PCtu$GMRjRa#28CJQH-TZhh3^!GXrD7|O!IXYtFr0pSSoBG$!*C+A$3PHn` z0l|wC#w7$u*M9So1E`L~Q98ER<I5<eeUbe5*~g!ut7x0?_I#n!WMk)j?wC%8=SI-< z&xxhPq6!0xoyQHvCZb`v245hspYw+mqA5ldcMKqe>Iw9DS@dHc)~0uBvXz&uU!aHV z)-tm*6nTRm%?x1R-E5g3IW>yMK3Dub^CrLd?dQ?&P8kh2+YjZV=a%sGo7Lx+#Ynad z?2Up}Jylku>dvv9>N8Kr64Lz-+e|u|{lVQ(z>g*!;a^aMH)tz=quXBV?PkyS<v$X* z<FE2_y20A_<0v)C2fmM4shr{Wont^RjtRu5L$1|+w-VYRDEq^;Vj(UwY8Iu8w`RbW z*gxm>NWd2I{ym<nXV@vt<H46I<HKtdCpof+4V@~meQ^Q@D{gNfRA@5s;*)m=u5=|b zfX?dVQU@?n^s~J<nFAMrozh1=IOEZ!7kWVAH+tPUpkDpSwfz%xv-mlmeLUafr7teV zfL()hBSB0Pcg!A}gMLy$$~H$M#TV(mzJbGl{G}pM&P(g~BAV!%p|9O3^a=eO=UT6% zCd#D7D+4B~D8|5Hx;Y8Dxt<Q~L3nTg2D)HJF9Fg{ozV7*qN)c}`k3VBqL_Q}6n>Od zD+P82_%c*n&+)y;^C57KnhJ|40h|3$xi&E%z6lcFyyrmIi%QJt<8(>?N{V=QX$0vX zrQ6!nthc<4ewttnIj9gC2Ai*DW5H;$3Tv{;CK86b`Y<`Lf`K}~6{wnlW^$+P7LMZ_ z>gRG?p)7w_EVrsTi9b)oiu=vhS#N1z!(r+U6`os+B9nq4`1^cYO|<WX7<2jk$oZ=m zN@yqW8R%AQX4@g+`EAM#Ldb)NmqWx=uSYQ79xT9bG-yOPRf@>jNRuRZ_5R9Hj^`wV zPfic)MYDdvfoT)46x_!a)RUmW!ES)q++@f}_L=YqxwW%x&;!l#%pc(iV<2wqC1>Xk zEVDu}G01`mgj(FVE&EO_6`+>GDA9QsbSXy9XtY~A0bH=7{nv!IccK>zdS1{+Y%!n& z0z_Uo^WTYB>q}gprI@f7o=6x{Thbg`H=IQ8Otw*m;<$(DrsjkeBclN254l;VvBsZ< zRbHw60kH|uIZHGoqWZX(gA&b%G4o=H?=Q;MK&bT#Q_Y}B@{FlfG%T`hiY_Qp$ki+o zQaOk=CEo+8e<^ziBwFZGR}vdUxXvGT+{{xDS72G3@A;Uy63+}!7(=6`l}|zDh|lWv zJaenV|AcW1RnUr0yBKU}7K)KVF_C=TwEUIHh<0NpEUjL}k~i@qdJ0FkyMwZioxI3W zQ3hY{DQW&t0&((k2S}_O9vU+>S@m2eTQ(X##Pw-Z^MWe~GH>g_O=&2&$!8%pt!@_$ zu`mAGkEUFCAEk}CkwKl;lZ_!&h)s>y9jjkqGcR_M%_6GY+NQq^B~8py8%mX^F6ggx z8)L~xs4*J+v_uZ~D{))P<RvHuOoS{}gZaYAk4$HS=!<%aOTw<EF9DA`RccJ*E{}_r zaqs3@BG!`z9lKJT9_HfyeQE2@4L(vv^SjBQTN6=I9+U~JMqO!<uCi~;G~)rSF(EcZ zW50$R=ujWb!4GC(#}FRBDoo`%Im9#;ZW{U_$&MqDj*iL+#ILbYMeXKhm$4UH$%pOU zOC%ezBt|h_!syDO8qRa{fzbHfRA~Dw`EZKvcq;J~mxA+*c00Cw0K&2wtGJ#_3W_{R zsIC$CbiGoR+O>DfIrCLa+kKkx9~k!iJ|9z_FNvL>^cnUT(Ng(tes6>S)v7z&r`=SE z5%9IU?k89$xQeyhV6Z+)wp}x`GOM+6QbX*Ufh(r2(k<+XU}G=}(5LY#dSklAJS#w5 zaV|}G(`=;x)*wF_8hFFgwY7_0Pk(s;n;qZPIIoqADtWueMY4Jjc)$%<s%X2K#c))b z@$z=HnA6nLXyDRUF^Q2o$z&U9s-CqCRs-5Q|5{i52MqCUo^2qss8X3wcwi81}* z1%t)ZV80lW9x{V*TEj1nHOG8pa{ci0Wm?Vf^z+3B{Mj==FWN~L!)~GJqB}w#jj$$~ zt02^z%n&sIIl6)pyBL&neh)UuwA?4S)A_Jny<y2un1^g=kr-(hW~7><J~=WxHJy<z z7RM4)mR|q;&G%B|D@!3MO}p{W0~w1p1X@hQsMi_a$u}(9_UHy7UfJh|GmRRvdNDf) zuTPHO>k2$48gJ^S1`e$Y0h`kc%XbznAJT>M>3#09%mM+do*h`_ZgY`h74R7L>PQ~f zOmyl(Rb?Ohxkdp5C~v_#et#ESg7Ux60Nl2Jl?dWXm%a<#mMND!|14WRXHQ((JD;HU zvRr!jkUrJ7K;qAc3~utr>ay)(>P*VZc|B53U(rk^k8?fkXCId}GWu91b+St~Z)?UF zM;wD#wm;tK#|H1;D{sw>mw$hPD6tWqUJPNL-aiKJOG_~Xpm9L|@J1X%aH@_*2?KXv z`O{0npxl>QLEewmGPee@eHuufF8uR3ZRp}k`;vF(YQAaAx#=Ck+vk$-OyT8Mw9l_6 z%TELU@sqw`kcDT>`!%U%WNT<MxaDSr7l59)F+euvz*qo}9Fo>N+pVUMJ7`dud+<2I z?xcuK*EOe;F8hLyc}Lvgq7t5!F&6tUI_g;yv7;ulhUM!yq*mX7hSYwbyJof<OJ!oY zF=<Px>5@zYHu(bW1U5^50w(ZwN?rgYKqct3a#@y#I}<#ylzx0%iN^ISW{LHPH7%xW zb6rR-|0tGAgGsAxMPCelZ_+GIew<{`;r<<M(>)BO5+PxsxcIl#5%CWnl{KjWUpxAF zwS*)a2C(_M(O{J1J&M9iVVhp=Rut;YCZ%YziP_3T`?NVcPmW9#q%Qul)iC9(D%}6J zV1=QgEBN?lPjl?d6*Vm-n+x8MOmZ%i%N{G9%kAxJRed2Tn_px}y8k&WS9Xk4k_Fh< zEU7iBsl_05#~?t<|18}7T<e7tI;IVsETx;>rmF*1qRwM{K%?~A*Q-tH4m{7yE=o@$ z)*$p;_iG!5F<Y?=z&b=|>P*}!pDzXZkg1v1$0(`f!R(1*>kp11yFRM?i!~;cHfq(j z@b+Z?CS@gh=d;6F0+h%Rf>pC->Fr=#)IIyis-;)2$yzII4*R$rb^qs+D2qe*J#dt@ z?8h->CfgY_`nDx}9>ZfWbk9o53i$+MdPb(KDLW_KaQ}zCRrGQ$tKC|w3+c!X>kYBS zsDqtkTSP3|og89!dmC+~pBmPm#DP&efzjGCaM23{*Eo?|RkY*hCp<m&SN$IkIAgxG zd&dshX*6;ClM9Gq(eX3!@Q1UbO=1G=W1isb?H;fb&EMzzFc!8j`n_Eb#P&H-vw@A> zRr(Q!PL?CaAkUY9#P0#_@hArlLqat$s#}1LYuZrlAWe`O1PEv)W{f3L%%@3#VIy`f zVfN?kyF@@;Vn@)6iV<)}U#Q+(IPrzv_N%CW^uhLATueC0kO7!Bex6LT6Tk<5!kJsZ zoL3Fb4{I>2!541C79Ee*ceHBBA=qmX9c`sj5pl+QhuW)TjZJZqp+;i0H}B2~f*XZE zFRL$Jg7jsW^s}&KEkXwJOp9$9azednuY$^6*E@Esv)Ig$k0r{n@@yNI#HZR~m;MgW zWDIf|kY&X-<~)!qRHZV=8Z($Tuyy<tUHGWaBt7WCOR!zi0L9oHBkmFID;?d}jf>^z zdBgM-O1n?4lYrg-Z7nC8yv583;wnBLK76laxZv9LxWF7gn6R|bxoqvJ0jYE-HI$eB zWKLXZu|z4=WU$0YqrH>JBv_$60Q#K3qka8=ew~ni@~rW-OQGzWObFla$+$5umq$Mx z9#TNmiTMoel5UmfcJP@!=Y)NsD{;a$vr3Dbl&>$ysK3_lp5Sg~PNj^Ql&DQ^^YLRy zAZPV2j4?mbxI3HrwGOE5W%6&7>$QQa=y}<swxq&tOk`!~KT0N`nq@7DS*>Fa?Tt6u z#pcACYGFHP8YmN#qT=}WJN%V76J1nnX?2{yeKoI?PVkkpG?w&PDA;Ba{6mfG8NEg| z3b0;E2ar0C0I?UkQG;tCP$>BO9)q~4sgfz}rJ-6Ls*ns+=4UD|{S02%2iF=JH{NGz zH?``)RG1mvgB|B9Jen)p7t)CM^h06N3N+%h`}XvT{heuGgvWlT@^E(dXDhI~{xgm8 z1MNH7yf$wp-#;)ItE)(+dBiBtnV*9s?-^y=SM0143BUQKv0KYMoghv3Ui=bNMVL6N z3F?*b^nRuylc>2Yt10UxA(xB#&i6&GGbE`1hH51ls`YxaJFf|+J-I)$`R>`>UBM<Z zP;b`QOBK+IM8Y~$hvWkFvDL+AtG6DQ@B3X9<E8ZzAsV6`VRjjxXLwY=Nuc=TIBj1G z{y_T9(I2%Unj24c)^|PQtKOQQWMD5Wdd#V}+2~Lm{(%FUYLUcRD*{Wqx9MO4V9u>? zWw9T|GrKNWiJUHyQLwP6l?CfF+?&2%Ag6wG7a{A%)<f#^pU%g=2yOa5fldUR!&&C} zvuG-w(#PgzRT{<?@&~k0>EdNehOr3A8$i6p-&ekiO`{bB2EbeK8Cll1+bL_%FnIW- z$=wQr;@!nJ+1?M{z91l>SIY5m7>t1;?{w$*I*lfo20^ut*j^hVrTXM|XC8Fg8b>n) zTse+3dZ7;KZx8Gj)M9BlnZi=HjM^s(n0|^ae|5mH>;j<yA8r4ceyVUEgNZubBuDIw z5H#~?z&e8_u#=6?-Z<<<LLT@S9)!=jgwBf)#L5+1{91ttK2KKa^m`AGLRp?Ydbw76 zjLZnCV0|%fLrlu*qV6d9v}ujMaBA9AOZm7ce!2$IG|?zJZ=m7D$5MHzGxXvW6o{bQ z^U>kMjY(4XfC*8i!{rKm+c}|4H_bZ(6vLsDqwL`nW@DVOLi1x>sVoBBY|E0I-EY_Z zbm&3pe*e@&q$%JzdGRfRGD3d_=G*b^O)jvQybS(|BgA}~uHbFDN_p-SG0iXjJ>Ya) zP{)64O8M7<1YjGpaT+BtW1tr)e-V3Ik*zv3(>>`vOw-2+7`l&F(R)da8>>-TE|}^H zFD?wPtcgX@dN`ad^gii}NHFcy9Z(eWt~k@b_gl|$LHsvjp~m`AgLDn;wNDH!9FU)A zX{Dxh$HwJB!_o(j=BYcj9-BMlQIb@6Kilf(IU_|6JF3%`H;;CHynL)0B`fMMF3oVS zN^b@Dy1$n)dm-!>tJOw0_(o)9BjU@H$GASxwA7^FcM73RE?>(@2Q{#5jzt3X(aLtR z8kNmXs;<cDPP(a)&6iA@$E#nm9g=KzbKM$Ock_K!0v$O%1`0i}WMPwt6n23IeKkp* zw%M;(l->l1EpYPeiG?d4lDHOZ=DdV1ZIn8)hf<v$)PvpU@7dQ8zu9Ul%p=VPxR7cO zJ+;TWdL|@lJQjV;Gm`l&AZB6>uk=>?u2k>ut~c{<P21CYaJflgE|Eri8_A*W(AVBi zC_^_%gM0bgjs>hdC{IT=D1h|t=evT$>Ynd>-FZ~0pZPqPB9?R;TB2lrFYvR5P!id; zhdo+QBDr_2CWyBctqQ++S+@VOLFmuQZiQ{=c@-cmiY3(fMn7;Vl;weUeCg+=pX%u? zD&o`rpYNYuK9F$*iAxDl{7ule-vWQu*zV=%{2F+*8ohfuPoT6n2y+_KRAm{?W;p-n zMOPhD!IP&spT=hh3!7#Q%mA_5KEt}SN~Aq`Oa0VG-d00Uj<Y>td4LNT{Cbv<*%R8m zN>qZehgwlnuc*^489LC0O^{Q*7gi`tdT!{MOTHr``y+>gIBqssxzRKxq8ueDw}my3 z@`-V|4STMmjT46WsE=(1MC`huGQFg)`I4GA99WzfXD-4mP|lj$v*BQbWWtjSC;C@p zn16{ni4TKtg_E1H!@YnAA^Sl{jT}eO$O7;lT!RD&=|6b9JkT-K5cq_<jInC0bMz#N zbV2}akpx7GlBT8TiiPu^@D<)k+sZUki&OJKrN(%gV#k8V_-@p6U~<)re<3m0NqPgT z0=`5KgLv`)HA>Y@0(QIEZJg%LXyJ;6YIOpRxn~bzm*;QjwjZuI-KM8&HlOw)-~+c{ zu<kM%rf*rV4QQ&?auztt-#B*y0B;TZr^89^6vbdWdvZTHSe{Ya-a7?*kRa_$Fp`u| zRS6#@P63qS5z|l#ON$Lcdm+!ouy!1B`FgV&)XuX*dW80786#>HX5TQdN_(XRPv1&8 zu$IA%u{~B0qd{+xq7LIFmA0tnr2YgT)^tBkNUV0Cq)1icJMyK}*%7sRFyBw6jh`7U z>?0n#h|(|tfP+}jQW?M9Op-}bvzVkSdqY@Ygcw7wypqUoXm#RpJ<Ga@j7mSb+A`3$ zlz|VYnJ!~7^pvIHj#vAQ>U7gaA*V39)MHRqCfk{-yLmzB|G>bMI~*CP8iPOqi>DDu zx<hKP#I7-2^DeW($@7Zjsd-AN@MI}coy<pu-`JP8*Y#y;+OnVFbkqdQ((X`I7d?CE zm4CHR!27DU&mQjX5n^tpsY&EvG6<*LOfs{}=oR{Hj8=#v2?zrj`1)((6~=CoxDTCK z=iNL+@1r7i_faHl@F>h5@(m->6}Jek14V;?jpLk>fIlC#L<?LxgICB@NKfa%5gf7Z z1>5wu=mxIuk~%D`pHs9i<*v95gko;6t_-6?qkdVqnPl>E3KjvD3VXxz*HV<}BGS)r zgV1$j3sgbi`{l2g<2H-UAYYIlQ>oI!-BQa2g;k-fXwS)qA{QX$>LJ`i#|S#Ps6G<E zCd|juBs2>dQ!{*>{Pi`EQs;t*fX#=8EWz2C<AQVLIz~lg&~AG5qLTz40Lj;M*(*Z5 zy>7=vwGTNgu?$UcPD`W^0wP(Z2#9$d?}syA+uO?2@Q%oNKlA<5Ony^FJlupMk)$`R zhV1}Yx&!XQPg9B2a{-`EA7Y9qR$?6F4K3)zwdJPT<{_DpJYP6ECUh_|)-PJ}cEc5x z(^k%!;lMPWL`T1oNF<Eo%*<okeGqR?9(=LQHY*N2YD+AM@d=gZE-=4G;0i=wG-%V> z8au}C9Z794$bWn?Ho#mI^-ji3x_rflbw()zLv3Wetl|Yw_{-gYPmz+P<p&LhaMIMt zZ5843$~*3lp0glx=;V`EYR~neO;C5|lUskON%hnvk=Ps7{tj&NmOYKcyy1W(cXS$y zkpy3FvsI*wPdxn#WJKShwqwNd-Gv_Q@sk`pF9^uG0A$|SvKvY{(Wq(BH;0d@Z4`K` zWInaK?s|#J$rB}$c2s%U3J9r?@ur<hozZ}_Ex1@)gT909kAd(232DE^fNQ>|P%h1W zk{K~=axTV!ZBWuNeewfx|6fX9Of-mV><huTj|;=*_>&M(xmGKy-)q}FUoy;l^3;NM zrJqV2O1i1ECHMFe&EF<HAjcuqRL|mXl&=DhpDl@LL6omf6c6RQ)Y5v{vdU^WeX<ol zJ_rtzs&UyR8vk<?{LjJv$sGokL#KBvFf^zMG6Tf-B@qH;m*u<F#3|wF*YR4shqI1j zTUmxg3JycpbsQ8890~yF^TXD=GsnP<lPf`Zwc4MX31XG%2+I5Y?2Y{}3h+pu+X(UK zr-hfKDtJmi10pH47?d}kiWn%~6Kf~>)6a(lHobX>nqfiwe@xwlTayjj`0;IQu#p?x zjM3c<G8mnsL%<QzC@m$@j2<Z^(kapnN{4^~A|j%W6c7~<5xh};+|TpA@A3N=b{spl z>%7kM^SzT~ihcIVRQ4(C*BtT`I&}vI7HU#Rl7wkVCMoYtAyE_+6u%|?#}6l2jev}B zUqPeRuMsad<q56)SX&2E*}0?qU;>%r)+IUW54j6X>;zD0hNKU>#Ccb38y~V(?aORr z+`9>qk%alaWFg;#GWgRW+%JBA`)_BkF=C@9w6X4-`n-&)GYTY_pjj7Z=q<@du?b|r zY1XDM9C?oNp8_l-HF*?AdEg0<TogBBC3l4DbvxtZcE(5e3*lBx5mFDatI<(pI*#&u znDM%CJkICG+rW4?n^;EmlRA!-%tL~Flr(OHYjUJO9K|DF$#cVn{B;1w`(tEu%tq?V zs^25@IL$wvi;S)=E!*g!O;Ij36Kc#XLu8d;ZKbjICV$}OKSolFT`k1PO3{}tNb*tk z<OboVD3MAe3N6j5+m3|i^qBzYwX^Ak1dvyYUMN}t&JB)OGfu=_1f#SdUXxdE6L2?! zF0tKS^%#u3{>dAY`Kznq8_(uX!c;Q`64}tW<knn{7wW4Ls~=Nlbps=?8kZv+!>%_3 z$D}#qnBUj9+<0l?iPbXTMY-`ZE{IaDX|RQDP!JGjnp@!R6XmM}H2df80h_d~&#J+@ zNKPX%)GiO;U<*|=2BxHwq8XJO(4QfXBh?&HrW`l@O{;<}mlq_-Op254BZjhrHF@0% zOG%W?XS{}UH2wxsQ)S5)p9s~pYM*UsueeG^R*C6vPe*lVA%m!ef8=Kd%7D;9$te;| zV-kP1<=VEs@>Yp{tx~L|l@kD~Kdo1f3ltpcuuR(X#c!DwdcGCkG5zgkyrwU)`9wj~ z&y<tY<r)8SalCnijv;$eL}|kQI#~S;pN*(ybn&kFDcE>$%TP8^-~BuLyC0zi)#|WK z2;5VHB^$dYBTqeH6tS&eT5E2ZqFOR(j?_^sMJ*3kiCrye-UHz@x{~)Js?kcdYF$Z~ zct|Aksn&BD-3|!)h6W9EgiU%%3R~~$j`skc>gM77NUO-0#q|m;>GvojleDcpCkQ%x z@#mZRK-YX$*LSU!x+Ajs2IZ8+vFuB+%ua@SHNn6%OTWxzW7ucI$Ccot7*4>H?%uLV z)pGd3j>ET8gZG^hC#R;1*@i4*hM#1O7#J-7Vtg38+@LaUp?G(YT#E2dGbuR>xeyDb zE(^7v78-JvX}sx_+xEX}RLC$UJM<=3E}p46mbs`~tN2^P5Gx4AT7bbi#0r<RY>ADb z-sEO9F@pJ4aJ(G5Wp1VabJMHx`V@wEH`CJpN<KRPj)D9w=c?wnVW6{3{3-Q>;U-6j z%|yP<+f&O*E!!b*$*2Z=5{ZC@1flYE#0B)~k|hH^hZF0@E-P(l#-i>tM?MpX0+mD2 z8<C|;)*6r$^7!jSxJCK4*a8Czx`NvhGy(DAJQz^SE6!70t~2?jrV#QVX+v4hd*qwZ z)8w$@{KTbpZ+Mo(dA?+fr<>PwlD}RuDS?F_n0(F+@6>jdsXe3oBB2#37#Ql|SK)E7 z3HIJg3e*c5#&|X_yEcSc_LHH6X`lsPz4Jy2P~MegDffHpiw;MG5WLbLbcOr;<1?PL zX@pT_a$ngfS0PC@y_Y(xS5ZGS^NM|xETMv9JeD!Dg5A18qTEyKJkO8Bn|LOlxgw-? zr=b{p<|EXIC2!0!5=Bo7`b;&Hz7<?wcJol*x~)e-bhq-y$0Xo}}^wKN`Km)Q}DL zE?8zn2`c#Bu8fqw#~4El9MdOLMhAMxwY$fa0CWutTweV~3CCddlQcu@Y@Cgl%CNHG zh;Hw;w^An88SDx^r%FVDDH#F4ijQqy`!clo<y-Ip<9ZAgCzi}0W{{C$K-0VWuK?5- zK=Nl#hnv5tyRk_)r_TBS67j!<>C55uGgOtlL4B#jfQ~Q<XBP9esU}sV_ROGbB~5Uh z;@S4B*YKBa^SH>XAscGe*zn-Ao~SQPqux)jR{fp@k%Y9^+)e15M)=Rs#EH}=mo_xL zsoa}39JP&uZktgWVb8jIB4<&Fx!w(<6g{b_@rcGQCy{QGG4asFmEW2VZhjW>w@rT7 zo%E1G*!yclhe8J3n8+$n);@Xo=`fp{MzF(H`k$s;*_jmss#%@%*Jrb3^7TmHmxHT! zy`5Z(OKXuRQ2?c}!tdei5FW*|&1Wn0*E$oyIA(#e`6WHo2>qd=%h%tURV)2G|E!+F zP;Jl-%$PfB!urXClc<(AVY2Ysq`RUJd&Zvd?WhyoH@5R{?CmCO=OzpYsOzPSC%*hz zly8zY(@mA~uhg&Ec(Rpml#~yLVFIJCo_;PrcOh)Z2!$yL1}QCdUlhDKFJ&47Ms85P zYM?zF;qv_&I{EbQB{g3dfW6T#?bh(Y^!$1$_3GYvOZgsCcOFD2c{M#_2ai)g6_Le| z<b)a<{$)8xYF?GR{rU9UXVKt4yYCJcGDX@=A0hN?#gDaa;XbU1QGFEqxJ#w8)FKgg zXHVQ!FcrY~jN8~l^Gol`FGj32xf!n<Ds<27HqUboRayD8lqCQeM=LF|PSlE}n<N_6 z5~TJL-oI;u<Z4qgb>Pm8ix*97Rm~rT4HljE+T|X=7U(FCc%iEt<+6b5aI?wxzo9M1 zo#TIYU(#G%c@yR@)NotK>+37_i|dcPf-n5`2kMrMtTl1v?`|?a2Gs8kZ~zLp;Pd9c zAoP<WFpa(>fH&(z)YMS=?vKvhnuqdYlUW8)MCM8$<%H|i@9$T`;U~i1yB4I6gR_nk zV!(nGoT?SPtM(oF_QiHt7u78$O{RGyWVAOtCC+~fSr2qo+_p1QVd%AMDJ;PcM+_h^ zS>PwS=@`fnz(H+)*SeF~esD@uW;$htG-zR;jlrdq?wvlozn0wlhc%n3l6p!K#vZN~ zz18|90qBT%cJU827n|^p9$E=0I(<oMuF-*_KIogVP3$nl8B6-yxIlNDlzX((w4CPW zDCO1nv04FDfO)v7_$9=3!Qk!y;**M)xRjWv$!MP&BJHNy(gGnmhUx=B|3*sMMdh=| z1X80?ea$E`-O}J>)bwKEKt*Y!^=1MYZ6tP>W_g4bJt`2(#%E5nzaIym9$AT&;!F(S z!vxR|0muK6N4PXRt$&Inj-iB^8Lr;{<?P3*1@PON&l|SAO#Jdsp@%>sidUy{R_Zo? zkS3pPrD)@Nxadn}7ERT>Y?hn9Sup0TZ#G3nH?^iW`Q*(FM{!)N&g8Ab<lUov3@%H# zo85j(bLyiD4|1AW9=!;%S@g+acn~MRJ<6RuDpXLZyfyx?-EG<M&-DVih@zwDjSr$% z3n-yDwHGx*LH!<RaxI^>&tT0M+9!r8zv5LI^k@e+ICGrmZpVp!A(0`p%iP%Vqlm+_ z+sbZU5}uQYJd#!j9YccHE7MLCb59siqaXcbMoc?|D`vohkJK+oEXrk68Xuu46FLxB zXK_A7M=|kakix62AQA4#X@aCvROtSgG!nJZC&LFCU!xiyXMIL&HrE$Uz)QMum|Hs= z@T8^9ZBfCt?5b4*f21e5?D|Bnr9@)_?-`Dh7|ME>`fD2o50jPwnZ{i$))M#s{xCsK zl)>{5`JI?gyr=c<__EECp}${J#x$q?n%|&yE!#FNyX+Kz2={vQXD1wNJu|&>2ki&Q zey^Cv!fSMu`Qk27Un<<bvG5<I-8jzP2Co9}9EM(8V|MEmRxd^Lr3AggmUV}K6I*hU zE}^&SLd+ubZ5vN*b8g!e-?rj^{0)Jz$KE=2zNHsDN;9aDQMdu`?2`PwQy}r_MCF0e z?5R<}Z|rQox8|+Wv@7t73DaZkTY(P*L$9O&yBDs{e<Q}!W3^mmp)RCVX0xQ&=f7R* zADBN2ml}QZdr|$*n+Jd1J^%CJ>d%Jy-<=174k0$XpL}z+&2@J@CT~drP-6vlKyp^u z*oB0VL`pX0D5zBBcnZCU{UBbdYBGaeCE^kq=&G3jv9OG&+nSgr(CI$exEgKW&`V_X z0RQvrI|n>Ty<ABpAkKX*1x7MQZ}0EEluwgpaCq@!T(i!w!Tw*x6q_y|a8T+=yF-Du z?Ya{TdyQMovuM6^pF-j3dSCFDwfm8s+cS@hJ{J!=8|U3D(#@v*7I~aNdW}Ww=h+`k zAi_Vz)DPZlO%jhV4W_?Qzr068l~2Fhn)LG3n#mLE(N68%{1-39zci!|@Jvo+Q6UAf zxY#0-s9rvuN3_-_j<HN8g=x-+yj~TBWHEyo<+@2b?%HH14W1uw&;HZ3c6ni)@Ph35 z<cH<^oAiWn)+n>M8M+Jq_`?@EruIksy9MNVk}@#1?jt(9*7^RutJO%B@P!%0C<g2G zNM5Un#{sABm=^t6NYNFEGmy!3r<WnU3oyO)%H+5%$G6!3nx)FjZakUF#bj;-O=|sW zv&Es!4E1ZIGeQ51I6cod{vWOsjLZ}Urt^{TjPZJ9Noh=!Lo?4DTyFyYf1fnY;?dUO zIf3+^Y_40L3WNY+pIVPM_SOlxs8M$=BgRX9#baircAl7H^S94)YkXo>rW|dQ0`6%t zhWri65+Tkc2o}1STaEKI&Pb-p1o<a<cnTdZ>R{PinC;Bf!?s@d8H5WnYDS#wXFX<K zI(?_7h~7%o)au2gYIYpIPA>NChh2F9rp|<J172JEjCQ@#bQ?_;%BZ(dp2szk2lS}1 zHTOima5W7v?<=Q}6Mhs!cEe##=|KISGOQ*K3Q_i~5WdfL9SI%+SYoeb)fwBziK!Xf z4SSw`j2sWrJ+k>9rw6`Z%{NR?c+0z)#GV28*ZTyQUwfb6|En$wT8{mfChaSOld6|_ zN=+h7!B`OUL3yPP=SKjh?SI?N+-7{hJ#JmWKU#5*S&mz2b@`78E|!bB0v~h$YV|TH zTz|qg$!>Uo(Q&WP6n+HK(##M|G83a?HaCGoG=xEWIL?$qAa5b>gPurp6HLXIdroc9 zx8dsFm0Bqu4|ZX<ILeCkpbQ?(`fgEA-NG^XqzrY=i_!dr`0llA=)jZj?%Nh*nwP(Q zK#AA<Y3v(YpZPBR@w%ZiidRj%_e+n3oP6>5dn7%)-^K&q!)6s8e>;jGRLrb<qyBG6 zIFBgTn$irDkW881By>E=ANKRlWfL+fSHp~tgb8a*!|s&BMiQwp%C;I;s;&g;XzXoX z(F&OU^flNy7UHcm^VK&d-3clJ5SvbvIv^E$wMUNI^NjbPm5z5jt#tTTD;<B!SvQO$ zGmeRcpPo>27Xp%o!eWg}omt4+cwhp<sUpF)1kS=L8W-LwB~ZX4)+^TdfCCT>*mU$! zLOG6FnSxx)iKxwCF9}UAyarDflPL4PK-E+=zJ!7w1Hc-zZ_as`Os;Rl=qb5wDdO+l zc{r%RC=zW}>Oy%7JF@LO9gmcWCH;$3q&r870HKwXY#!sh3EHWaQ9yER5vi4XqK-u@ zaT7JF&ryma$yaoN=wD!RpO8S6kA?-i!{Yer<Na(?61{T-2L+#%7ud|X2z1xaJ;IvF zUj9zLArH)}q~C>bGjH5qyQrdj5ma_cX-egCjwzO{L%u}gDS5LqLfy6uiejw=V{;yb zNxC8mq<}QyJ6ZVOn0Vl@y9T8Yjd{L{s82W$irYwM+6G*)*AU2GUyr;vo=DrXp+=b} zn4z4d$KWf<Jv7E1ei9&1S1N5_UfFj;MRO``v~fiCAOOZ)otxA;44I(5=>I1sknDCL zslmON#3$}n6fWl$0P$Z`f4IL3Di0ays<STT*9Y0?0x5;icJP0vUllH87;a&+kp@5} zCuHAt+u*IJB#q;wJ^O%XZEj%V$kW5N$(vS7i@CKUsRO+mv@Z+czJY-PsOdx*kfeE_ zzO@!|dcu!gHwjxB6km0TG$+`-T741P%^kZTp$VIKR4xY~4J^LiL{6&?3*Z-Mz0HK) z$nftR0rODZ+^L5r3RufZTK2`Vt(PYW_@DAZt~8qTKD3nrN|)uwK44jbBz1~ND|^b$ zo5lSP4B;s@jux@paxp=+j-)=kQiKGqyT^Ko>>Hf48G`EM2!lpsLe?AGoWCZ3c&1@= zVLy2cO(ud$+}pRAH|2XjyoC09BZGo&wl9R_$n0P6^u6;_z+*PYrQZw_Yj($>G5Z^{ zP!EYz?fvJBD(`%0JqG#r0Gx_HlEvH$`e9y~_jHvzIp1nbZg!Ph?gk5(6$6S|LInJt zQ|?NtyP4cnm2yexc>nT@PF~A#MJ=O(q@=Ugq2e0m2yPYcjq7dU9&*v>WUf0|s!oS# z+(j<0e_)BEKpepzYbXzUinAtY0uQcRtZPqRa+FpCQ$RpF!U_<}RBjmCM?&%H5%~j$ zF*?1x?Rvor5bLl@2$AJD3HiZOrR+^hx5+dt^(bX0)6JxY((cBgq;dZAMKW5c12!n) zG=eJeqgzB*U+|#F<yg7L|85k8zfa*oZIi7?LPQ%2;VKG6Qy+&=nt&nGg@x+(jNtB8 zrqSCK!`5?`-xT~z{lS5Qb5vqRhj*;tF%d=}ieU!vPJAS(b-f0K{g;W|1^=w7380Pg z6KBPRGyEosCY3uWF^uWFyLaALI8FyzfpGDpvDDn4e9+=uxI$wwy@618b-g;>7L+PB z!qM0ow^%a#)DYv7G%-QrRemMJiXq)YDu(IEcKU!2tCh@s<U7=*<yNBp42sUHx;(Wp z5D_izk^8VWui~G5=?qll7Me4Qdmw4EvW8^-%dAUFZw^ZLDczF(`^4<*<FDrej%`Xb zzcYJmp7&&`eE*_zi=B6o`i$GH<=rsjp$Rd7;6po){J>6P^>>&aJWS;OwZe(x|BtEK z-}sNbW(r6k-I@MN;pp0%>d24({I&cm{_NOHM{2(lqd)6OI}mP6f-P)d%WFRxyPpBl z(C%dKDJ;GwGBP9mUFpnpN2M+|sBf>|N#gzdqd*6c?2Ug+hq~Jbb9%Wh^9%`HvZ4PO zpi5GLraoSXx<Zi@OJ2nsB!dW&!hZpjd^~i8lh*zamS-!<jn}<5A`O|fGc(A*$e9+> z;rBSejI1z56MhdSZ_SD(`yxZjCrJhx3zcN1iPNC-0Yz`>Mkm%u$$G}~NYh?(qmXm> zzo;oZIxz<>DHzY|OuO$N{TVJ%`JYlT<EW^3VDx@++$$z?NN~ar8;3+)RDyr>8Ip?J zm0ol&u4u<wv5m@<UcZVqdCDXCo*pk3ls@8&)qDqDy9<wEW{K<NQ($7BFq1Omwu;n? z>I*U((ZK7s!Tl5At{PIP9{O^vC}tr3a0)JkhUINrv~*aDfbatW@Z#QNhB49P5VQN) zE_FFq@N7>|@hW3^b_$z2BEL6f(peX;MJFVm>cOAZWlOR`kfK@it&|GP>gDTMMNK5K zRnTSRc;ch+$?xhj-WO(w#xXszg{M_hHvwWxS5w-u^+Xp*f^J8BVRnLiwt~c3xk-{Y z1u+edW?a-~{WG0)vYYy4gY(}C-2!6IlVP8kme1eKYw<3*Qi#wA!{jl^YaGq&Fd=vY z|EE5iZ6=!|JnCvMn|s9Y7c`UGD@PzDN2no3WF|*!KSu(VD<zbxRms^_BQSqY`d?CX zA&u8EH^C|gvY)|f2fB&lV6Mnjh4E^K=gI8nohHC<Z)Ax88D?$ap4_}B+Pux!tN&Dz z;p~gf6klVKlChbbQhCD(sowh;w)zO@#qB#Yh<^jhM`)gXxZ_2BSU6L#*F)=zyx0_J zMlCikX>0Nk*8BkB7uor$-T5euI0VoV$HIO|`=7S5e>O6^z!#R|8d9h^Qutt+UcC=q z?aW%gn5!vW%%K5#P%hIh6`UvJw4}jd3`1~WNvT|63>zFOKa1Oh3dh2wzgu%V?a<2} zBR}@Qo4q(uCmGon@YzXt)yzZo#Uk`Y;a|mkqm5DvSQ)|@39Up@R!V<rKuEN@yv87w z!_6dUdAcQe7Nmj)B{kTY5o$R+@cOcb;j(d9xkiqip$EO2%N4(;3uwGuoF6S&m2=x? ziU01VCv|}6d8Ncl*X!p`zAF@memn2Whqh`JlmRY6M@!h)6Y;tcm<p(3omPM!SDqSI zz8A<|><Xt!rTZIW;YbT;L@`ie1RE+0GC@K)?c|kt!l~`TV!{>V+4qG~S?4XeRhI00 zs>Kj%Vv_d!(rc=UsdV>f0a6kC^FbovuEnox;m>JBM`J|>^QzMVYsBq^tX(S8Uso86 z@;Z4-DlY(k<w)pWsBJPxdI9OR2)?vtRfIx3Q*JuVqRH!P=9FkRTAhyCk~%)cCmHww zUo>nvYkYTw8~>0st5VM-QOa`G0Mg65V&qnG<!)A8xl&cA{h$liS(H(ylf?vq#AN)X z>5TLMRO3gLJrRnS_`n__sc#IWzqOprk4A?vSrZaD^W0!z$r|NQP@^*1%uDuhu881U zbkGk_<ZFcobc*p??jKSWO12tTU&~)-muLE)NMKPai=h5io%sm0R@UY!gXVX?<(dr8 zf0Ub(rB%A(^%>h#N)F)d7?o}k&a#fDzkfe*)p*h;>@-LoDMQi<l9h+>s-L>53&yDb z9#j9zqvYLL3~_G0*Pg<Zr{OjHF!H~oYK%JF0UVXkz*N)zh`h5f7T#I|4_m<O)a(0Z zn-uRDXwe(GwrLsjI&Lf*y{Zo5t+-BhUTKOXcra8O*$}DPiL5de?KZqdzxs8IDGYVT zF*huW?=RXp1i5I86wc-7?!>`AXtjLG1K-~6kqKe5Sak2N?A8v}nmq$qy)c>5$H;5h zVLH1V+&b^PcYggd6B0`X$u?bS*UJFo2&YMkK%Wm49AB6KW?!@>7yB}K8AQ5x2pa~Q zw|lF*;lcx5kJ>B>N>H<wT?@R%%V4UNJQR)<5nzbl>9mj1m$37vsct1ugG@cVXvf() z--s|}{IrEaD99(Uy%yF#M%|#tSctq?e7qTJm!pfbiyR*o9AY}u+9&Hu^A}fBIr2>5 zCrA}-j;?6mx`|`W!#)aS;oZCXx8I$(QEK2J{EX3_5$q;@TSp4gOC}V1Py1P1M`jI< zKJ{jcY(mRLnhgRn{9a^OcCmPEc8JOfFM+nQ&L_2H2zB*<<M^yM<;Yk<XxQZNq7GI! zcD3s^pNI2x{4%8G{`t(KVF2=wmY-3}C)kdv9Zq1(hMNsPC&KG%?DxP3k$j*TK$3<9 z@ekt!UUFi^XA-mMnj2y^ndtB$#LTagzW9y9D~O{xJzyo#ac#$UYr^T96}-D9j<nkT z-ptKB;>}?Ob0*h#6r6IB=<?D^X%Rv%=<hJo<xp)44;bjn2<anNrNizH3x+uD%Z=38 zjs#J<Y7$1+4tqJCT(#G;&lrS&^42FGmX7-v%@z!DQ|{u>2xmI?e5L~D!mz2g`Hpp? zvmNE?T3zr~hbdk(>?aW>$7CLJ2!HvGeTxC0ljL@D9DeGInkb>5S%uFh-PRLz>dv>w z4t)efPI?1j8&Q)#*l8&Zq-)RJ@d-XT{HzBBJtO|En>8YiH}QRtJG#~GF?#OR*7VL5 zps=Hd0t<Ge8;;sr({`VGXWehdoV#0%q<2S@w*6)j41~`a(aLXFtgZC8YSAX~GtdtP z^HeMbGXf+#byB|c^7<Hg`e*~@eFv8pA<iBaMXv;7yc;LI$)%E8&LC~_KAmiuz7-xi zkGz|9J?DI{;NRZ)dh;`U>{=-4HHY`ntwd;f+28rB6LlR{|4D%mYZ9Vb^kcexmvqr& z%U>nufHLgFXJiHby>!NBsQpxQmBASlrfV~a2%xhGP~QncPX+DJMyTk@#nq9qeeR~I zh$u)7Z^MD0x<OO|PQbTKstW9aM6v@MOu5zOv0so7_Mtxpx=m=w^Lsa%w@Uw+3ZqqJ zMGUuCEH(?j&j@~6e-Cv2dFc-0`VMUvi_JUsWDuN6Ar<*v^B&D{<CBj0^{)G%9>;(c z+IQSNA83=`OIL?D2xOc<L+#~4ja)-L>q49CK05ZmZSMzm&IdFN`QweGDybq>1)M(p z(J6j(6;3)5zPbcYGKj{%c>g)aqJ>GOT{jZq9I0UQ_?I1&Ahki79eJ(qKKFn_Z>(~^ zL>Ns&9!kxweWqFee1FF!?zlW!$0d5NF1mXgqNEtDagi_u2be4JU3Y`?a-v#VqxKh~ z#sWaxXjmx2eIW6{o42<<`qRuve)z-`y;aBTkA(|;yiZN5C1@DJ>jxL>;S=&F10s_m z#+D>)Ug&b~e)8De`sJYzNV6tMrJx4VtruJyhN;BHTV<NC#_Sk9-JC>hITYUiT(>jE z%$m&{SGDBHs__Z3_*vN&e&geIc`z^LV^qt{y@Q8ae}}hzIVYYtz_Yyj?=9~PBR+c+ zUL`qABpv?n9MBgWDpC}Keu1<t`wKb(aR;$to6ldu+iY_Z>Qf8PV`asx+>_o#wxwj( zOU+Lv^KSShdNQCZ{$=4!@()ks@$^8;_L!H5B}3!nG`42^TyFv0kJx8=QmCVm#d8p! zMcNn6UPwkp%)77aO1#~QDf2HCjgw>FDzeW<r)Lyf1P7~ryb(<Ni&sl|c=-`E2uvYX z0HHL8Ot%o<3cuY$+@%FRY#$-j%az|%qK7QUb)n}roe5xb@zgKJTr@@Rlx}ix0e;wK z(G`QD(PENV1pjwx!S7!Jvwx^$9c$AdsAnJ^%1p9cTn028O5dr@M=6sRUb1Ij<!v}I ziGF9)9(jFN=tp1Mqsx_J0m*EJz9Mb?2YP+Ewzrr(Z~fG{b!u{}R5Tm!Uy-75i*o{T zR^9iDY4O+lX~Xl6Kj5aEaWub@v(8gm&eL9<XM8`;qPfVHxX68g&~6~VYkIN9!g=d1 zq9E%+lp78<(+qrkQS%8tj*@5&rc;vQ<2B3gUov}ei<j*cZRvAF3yq2o3v1`AqPp{3 z^OWDJ8+5a)W^N+}34Y#zeIC!Qiau-5nqSb5U0u{>9S<!se@8lPb}_%rx`kI_NfmN4 z3E=IyID2lFZW3E8tjrjp+;9B2U{?aM-%?BgyrMI^x_A1ADlw~kKV=aH2ZFCiCCwJb z(Fq_^%Xc=P|1+l?A_>$iPhryCzE5(piAy!0r=yl_YvtCAhtSos<Hw2x6OclzS`C5Q z({u(-+1Gi;oQV=x{BULM7G$(SJF8aKPGE01olWINjs2Sgt0#6{cXrm^e6eYDp2&nm zq9E1xbjXUeeNJ&P|6b$wF{AkjJ>=QzOJkGPm~stQc;oKf66zeGPmSf{zB#v|V?lZT zl{#s~;v>)aDqfr%5J!`nq(dp~0s#w22peOue(&`@S(vbi?~h8~cAkJ&-D*pix&SnN znQ>$u@=!qN`+@km%DLYwIlqAfrK39^*KAA=zy9-<`^`#|8J#uN)rW+j4a@A$?w>yX zi9A2vdG+eRAsL3~OApWcPdoKcYBwS7rTq+eb6wgw2?rK_I&84yHOUoViTIXCCoOxe zh{_-1Yw1#Z!DFJWQoIar={x3o0nta342jTX08P|0TtGGbnP)t@#L{v<fz~wGcqq*w z0ij1{HuxRMMS?b;{wGW(YvjRSArmCkH&0UZ9dX1{{g0lJsnC0RLY~~wza@bXi6pPO zQo9^U?pd)v`?M0$^P&x@vf*Rb8fc+bt5_DOe8~W!kweg=7`vpK1nlM2)jbCJYcP4M zD#z-G-_WZuz)md!c_YaOa?9z7io2Y?ipO{p@u36}%vGA=>B3ZendQkG@}AY9S-uOl zx)^ZSSDOimZ#dC7+zUFh^Q_7bU29s9sem}1$y6kHq%LAI<U&RDNc2EhANfEo)d~`U z+QRzEEaAoEd_~>>fdU%Cehs>)C8A%lSVEsbF>mIQbD~)iWrtmCrlbJv7I~l)<8g2< zcV6Vv04+Q|fMJiAAo6VvoXjl_-5&F|qTJ!LllJ@&`UyhL8*xhD$%{6!UR0I3+b{e2 zhq9eO3gs}Cj6v??h_sN&vzz6!p6JAK)u*KBcj-|CIYGxBT<Aj-r$%wl$4H(VK%ct9 z#%gzI*_7lw02b|5CSZc&c19XVZj$@ERcNMO@fSY@Khob^NO-JgA~=#Bwl}}+*Rdkc zOI?ppcK#F{zFveZfP5|O>F9VVM;WcU=#s8+;Qq@ejHUK0WYzWI{m@1eC{S_Ge&JOW z>-9t<DE5VMdb3C}#lAyPu%dIk!LHD1g5lMoM=m7^G%nlgWnWDOC1nJ60>SGbyu4cR znP6hye!K8>QhBi~jn2Q2bXnMke(xVbn{>q`&9Ujb+YA>iw>L@5PSSbkxC^g$5BDZ0 zPWagJ`^3#3>^+1<0jL~Gaijx#+WN{zWS_aQv6R=7M!`Z-3Kwh;^q*V$w5QwxEO1RP zJEtGyIs^t@Fz**Y9JQ(>c_{A&*bqy0H6D@N5{DJw=iXQau}vdAg0~ek*14TZZR_`p zO);GD6zBGMgv8THq-gq5?ZRRbu>UAbvf7dD!?}*)<n<+QpLKT_S-s>nRjaU8g?<_o zCy9RvK15*zJ8k2yn?7`!tDDSY4<GJ9tD&vuIv?PHBlhcpg49tX)Gs76qN<(AY>|9I zUC5+Ua7?;wksDvEIb51tIIb=4c5tr_yo-Sh-0H70h147V_#^>JghL2gQzU`sn4%Yl z56M@0XPt_1g%fj{E0=Cm=8FD42`^?jJp|d&_7+I-nO!qV=9jXAxcGnU;*>zn@PmbI z<%<9vKp=oxt>T9=@_MF7d8Mg`F_(yIjjHCc$kXzDc>u<wTyFy|X8TEtWYX1mYKs{# z`0Sh99HOw~4LBL?ijjR7rcqZby4esgh_-z<0J)^6Gu+2bkxe02VYc)pZgw@uw@o_A z?q)szNg!c4V@cZ$n&vudIpX)x#^~9^cL`yeQrGze6hGh_Dc?YK5~aBrJ>B~2yOu~F z`h-?fr-+0mC&-r~P|?eWLr1!S+E~5ei<PRp<*ZOKedMF-MdO9*g*oV^?`8vS=h;bF zjla(dEd@PQMR1JSeQym|#6r$)W5RzsO-V8{KP#*F{Jgvb6h03DZu-AtEFZ51<{-7M zt43rV@Fn2Y8hJpA%!RSv?X8BqkP}K!kf4^xdrbj`4Z3m;D3xG1CLty((@F!#=CqOJ z6E@m?QuRsQ+l{^2e4?+UZ}E0jF#k@RbpaM)0r0>1zDP}`S#`h|U(jTg$NZXF`xF|# zW<NCU-B|q3n<7|D$>h7=EBxOXHWlKnZ^p8pi@i0|5GWNOaM_O0w|WxM;;Uw4HyKjr z_rVNbSpiK3`lEdMEvcSfSSi+3o3aL=bb1>v>5u77mEC}>t&W7qqfsi~)?*G0-xA5w zF?txVI%nqyx&;v8tPg7^dh?U@j2M$d>Lsvk!vXh(>v^d~H4tdTI9>TL%$0dUxfY&S z(|UzuNV<R{e=XvLa3kdY{L>5p@$nv7TQFTjtXOJWRn*sESk3sTP-2z4{6NtwjW(IG zpK~61Js0y_IWmu^a=i54)+(6SO6N7bFf<dXef=J{WlZi8k2`l|4>V_I{kGApxaVmZ z)pgM1s`e%CGN!ONs416Aip|{SotJI&d-DWGqj-FVQ;w&uD5FJ+?`aBBV8Kz*_Y6Nh z4=zr1E#3MkZ%$_$GV54?;UAr=vSRW!_E`z0hk_0iUhTdsRvBTjb!MpvA=p?%w`WmB z`zQE7czAkA+72tIOo%&Uwlx}p;P&*>!t%{+JlW(AVG?712Nq4V#@Nh=u!(Fk{AvnH zkR43mAXD}#{Xz0ZJ^>A<TG((}e5!Si+ZV)1l)3e*DNg;|3_naXDCyj|Gk=$po^W0& zW89K6AMiBDM<(Uqsx^XBKM+JnyL@tz!GC)yF$Bh63l7333;K@oJA;Xw>#N}YNWZwQ z9yLCnDKaKbTSCS?_DUR0xT=oRiFfIs70JfHr|>fBg2!W;MiD^7^l|A!?%17g%;7O# zmyY^^Mr(m*!!K@%H+6i!6ua5e2eW-VJo%Od(s-f^coC4c?W=N_q;PBW{#7J#YTCg@ zKZU<y6lLNL#h_WrPt+oE4?ak^$fbw{(Z&;)v6}-@9G~n#bU(5oL23SdSNnG=O`{Lq zZVS%dipII;9z2A|2!0Hb6KH$QQ|Ob^)XX`vB(;g&c}-w~7yXHRKG55k78c9eN=l=F zFBF0Ode07B=HEZMv86(HEF*jxM4PsUpywg~YXLhlL<54K6IC?mjWie>xb(5fR&bV! zVTs?@EZTD8{BbHLvi5v><e)W^4udyC#hb0BzYD+dl&JB?tA)WqliyeKlSrI}VuGjC zC~MyH3w$-(VJa<DR6Hh2tU6iT0hMi=##KlfX`3XO$00nIDq%EsG^;6)j!`PbC_fo% z)f-5V(NK9ZtagY|zr>&^wKUkZG)1*As#;n`TH1q}tjkp@!@Y`Enz1s9;H{flHa_DQ zV_F_|W37U*V)gXR1TBMYDO0evp{h0md#s%QSj!%Z_-HnlZ<Sm{d>B4)cp7%olPr>u zgozoU8<((ho2ZK!bKV{|W`B&Mq+mFYk47f`s1mpD)aJZ7=^mwHIXIbMQK=HF?Q%LI zRsAT(HZD@>xgm^9gE?LcuJg!TQ*l(nkN1Xg9xs*%yW`LBEfV88r<oNo)q;#wN3%a+ zt_%o%Uak1BPEsbKQ}@I<!Cf+06I<3OsAt>=bc8>7bEF$Hu9Go0`4CQ#6^CrJrM5ej z$X?V@OVAAs=DBw`&AY6%6h?UyPgypC=`d8uuV^X2>9<~m0b5v$n~?g4JT!@YDGz0- z5_>^DM+FMZaR%)8BY3LgG^u1lYFTG<#-PFLle}-V`MqAb3Mq7r1bTygG*fG$TO;9g zI>iPKeGH2Gat`#wk}3(!c67pn;^JX#$q`zV@&R;;*>rSp#$=TORrB=P1#~l*;Q_w( z?|Bx01wMdf$WtNbf+vN-$?O%A0&O8BzD589JPnr%I5$v2KnE!aL!C623pBBNhD)N* z5lVt<c3bmc)~YO{+f26nQGeYu6HkSx`VxXp7WgV^ZsGLBb6#k_Ti(cP7{F_GoRWcK z4<J@V|F{+Zct*q|1%V>AG%C(@?d4Yt!WgeE<{1&mm{y%Vx>u>$v1a~BO09a|PEDRX zd6lLdJG5W&+$(NIlC|25wKkl*&Z{Iy2FPGbBF9Xk?VoJ!Pm4NA^1=1!)Hikhi$;<T zt1f^Yv6J?tVZDjm9a0>Ez$>HTni2St6vwiDCbUt~Oo(1!#`HO`G>*u47x<9l7#lQO z%ZW|aKZ=h&0;^A#UUV$pg)vPCnE}+uW&Fvwd8A#TG3o6*v}&w$R15TKkCugCEFVni z#W=)_Gt*`YGh!EAMDaPtd?m~l8T&&3NptqErXr5!B-&WW?S-7M1?bOq9lY7IqQzmB z1<|yU(>AujSkVmc7qR|k@t1{1SN*B7e~>UQGCwRtfr`9<1<&#>{X7bEOzi&9W@=U= z2vT|yw^~kZ&jj!1W?qfukBO~oLUDmAmt^r;`7)v96x$8|bt55L1}R#JsGX65KWHm~ z3*=`h9@)Ug_-UG2A$lsQH>^J&<tV<v;VYR6D|z>TL3<>3AvX68hWCi|pOmbqPs**R zVsO~h%hjy+;nWFes}M(PRmCb(u{RHKDUp8GaA&SxUJd6JO4tkWcp_J<=Np^*$^yXE zUu}3AmA8<MayQ2}Wc_a}r>!{r(@GCDx;858v}I7zD9_=Ce47T1F)N6{$C59||Gwi3 z8jn+{m)E}i?lK^U=Ss1PZf`ji2+QNJD$mz```#uVU3=T5R(6`8L`c5Io6RNb<b;J- z2noKP$-c;Br^YrXe9n&saO6?)pXrAU&1+3xYsy6uDfKO@)Yj&l>o;?H<^y7J=MY@w z%1U5jlu~Tui@F|E+})omXku&tgf26pyvwmRdPZZ?e*RD4lAxMHwWFY|XMJ+Nu*E#Q zr`ciuOSLI^jhTzAZb^o9JFkG<TJ8O{`JcR4gSt^;*!0ijIhLDE6ZR0d@)=fvM{|5t zf(;=Nv7yQtvBS-GDarf(B$kI+HZnUNQYJb1=QQ>$m!KONV;~O0@UkH>E#{BqA3na- z5bTkGwxOEZuOj-dcgYp7@fsL~QkV3lwm9*HL?`?5TMN7dG#MsP2jqOq)c@A`eIRuM zH3FI>NOkL2u8C3u`0_+_7ewdjnDf4TMIod)&-TfrLA?Kb>|KU+G}4AO7kBjL6^Jp8 z6B;vd|E=G|BOhmD5a%Zn6XGjr(Mq-4`GY4+PSa(-8z>RNm8mx<DuuXRvQN}Lopw1t zZe+_O&t<3ub)bL-^<<{QalbNdxfOoeBTnrM3;iO0G9vt>Fa{icKb17|V@Wf4&2Q&B zv(~YKz_e!aYUQ{{Mf)ldFr!kM#IBP{K|$Pk>n{=ms470g@j1z66L}D4gfO(}BoEn- zD8d3&uj(i1$^~Luh3}*+0VJJo+~JL{Z(}Rbzy5mQBZ$mTt>JWdL}croKPzd&L@NIB zG@{@;fB`jS421k9olbL{lr_fdt+YWuE5oAd8L?;D4blAc%ZsN=>&oBTvya<fWCc(h z@wgu@J&je|%tOw|v_T_K1jjfEt!U2o3$AzRGc~%KDc`qJW3FkD#6Qeb>r&5jyIMZ@ zKK-03eIz8h--zF~f0~VM<bZz?Do0AiJT<WXTs-6&ADWf3*L}CC>*nit2MiA||Djh? zH^9F(q7W?j?Gv3MC~(!{c83W45lKiZn4{G*J#(|xSto)U9JrcA+bZYqx-0r01u<wZ z?kbb|8Xdg_+Zo6g=E#Vj3YheVd<qaVhgstv-q}lD0n&TAMVKWNOu~_o=4>UDg`u8B zX9_VtNMlK??nbs#E*=!`9vH~WYDH3LlQ>#7cB;PbXfn^%RFN$qceklcsm}D0mEKSP zR+I6~Gc;aWz|6C?pgW>s&ty{G4}<^qWZ?UD?hQR?R7q!;1zxhZqdTdCyFdBnLL4NK zEw=D*rCLFMAp6lHg9&T0$s3+;%0|Af4rYsROTd$Is|E<^glV5VKsgXANEx}8WCcJ! z@+5npN0vT7@xB7Qxajxs%r6TM)IUm!)Jv-WX7H{|<zNx8_9OZI>`-ECD%D!j%GI$` zfuakU5pbbNw}kZ|4!e^}4?WR=_LlffiVu1BlKB-TwchTHjZqxL-~AGeKm7P@F32y3 z!hd~Wipl}iAfxgFnbIFUuv&087W)n0e1{VDZDUe#+|%y?aj-33^#NhfvT<<MkS`YS zI3(ud-+%5zl_~w+?=Kx-;>zonRWT00E0*JrZPEC*9i=9>5%f04Z#V<bdK*2Wh8q=! zKib;uZ=p^4pQQrT-%rCiT4O!xKlbBJwlLT4d3EjliKK6-OHTN{zn{r(F4OI<`rY2Z z+@XHSqpndg{G;l5p|}3~-XJ{}YS{1R2EL4b<~NQ=)BznLTNY^2?JA{dy{0Spw1mVD zej9u<zE39k*>{mWJ^j;q?m*+Z`Y)1`ZHhqo^MaCW{iiWwwTpfBtwLOp+gQG|EcVCW zR4hzeG)0yxZ0Yexc1?E^pt>L(^Kh!gy=2RtQ-#ftTc3j6lB-NwLe3;9)Q^(%os&*Q zf7;%i*FV)>+LV{O_wz%{m|e?{)uNDWOT4ry#`;ui@jbcO_*tsvuQQX-Fq&UszBKlI zV;`deechPdA7JFF^_v$kKL^Q8P-hC{=V9t$38rC*x5AR{h9y4;!)Jx1JPu10IJx^v z%PQ<w!CdOU{CRyCL4DkND%H&h+8dnYF|O^ntsP49oSr>AH<>i=ZJ65CtJIGpkSt5s z-4^Rob^5Pr;Z%!`+CvwIdR^Iq7azPWRX^U_Lq_Z|!^-ceSJQ+yes*gi>h>-`GkdcG zRi}ba$(uFxhAgM41>>!bVHHU7F8s^iZHUs+-PBV{A}?2$I(fILyLLuu^Q+XmcT@e+ z%hwc*uKDBESn}qp?SLs*k{+87qN}8J^QOm99oDd{*F?OhtY0^Ej_lEdM8w#`RJM`d zjdj28KDb;@r0BzPaeC+%-@DNEqb$tRkKKm6P*P3{dofd=K08f`N*F`pUo>o^*6S!| zhbiZAyMGP;G@pl_p8r#lNgeMQ&4i+_*SjB{8kOMrx9;9$c1+aQt08@ZE$Zih^!h-9 zif#M#&s1OUULHJ7`=<V9u`aAD>ZM(n>^687AZW5M7-@DK9<y*fsue@i@R$4Y^Q(7h z0BWuqMs0QTFgiw<)10T&Fgi_ru#cSRyxh+#;IJK7yQRhGn`G|ydgBN@4`4ka{<CDp zqs3BHI$v>(mrkaOI*#VC#JEqCDBU|LMNn?2#8S(xd+pA1^%$a&q`iAsU)wgO0CbQx z0k2}tXll9fb_z@`F}9Xpl0Oc%Zgv<V#eG=;JM^(ECW)4S%-_TUtIfMuk=ixE^Oq?W zKY#k$r`_LqH|E|@N#VFmS~fg0fzwRb3dVNZP(4YZ_s{%rH8$ym`_%0C{29)>GI_ul zJHvUOCCJ@yM{CwzOI1Fp();hBW0NcB<oP7nt|!{~t+>;WYZ@)MDO&BHvu~fqvLqhd z`1AYh`_`+L2UmaTv<4mj<9O1dVYvGERMzk?k~y@Tszo}d_mjm*a~%g@rl_Ufq88w~ z%dRc(9bmSY$Z}_uTSLdQqU?Xx580EQbaV^pW?=H*AG5SO>~YhokwxWW<W-_%E4poh zkPkXG8^^}98dUk&xnP!*Y9m&$KE4Qn7(rBufT9-5|Mc2rgFoh4M|)lO+KaGjUi@JT z`uZ%$dSpCxaY}8m@0t>}jL$JRt~BJTv<~PBLNM;)`82Dq<x{;)6Hyf*<vQ)yoC<x_ zI~B<7Yv43y+lJYD+L_L;Qbr$8eAHq2Z(!bwzskfKrj|4=<yn&Op&WL@ixAGIWykM@ z=+I*6+Qa-$jXtok+V$ClcWMh~Au*0hK7sSW=gN|&{a@POKOOkqIHf6kND0|@9k|rA zAbUW0p-JV1utFH~6LA@WtdGz|_ehwcj<o$WX#wzk1Y-j4o6;Z(CIO<PvCoximl?bj zi{WvxTgQ-dp86wJD7ZZv%*bntZ||7vmSYh43v1JeIelUG#u8?hnpQXR>%;}s^y$fH ztJ{d(a<)|X*;E_w>Ks5NE-=?>D3N_q0$$=5{UA$jUFWR1a`T~FmwAHN?uVN?J^NTI z0blHlD!bkGSzZ1Uk_2j=HrFNE11;L&=WTg!TIatnK(j4h0**Dy5-k{emyCMs*8Zha zbK7Z#j7ne<J{Q<e4Ri^*FO8G({rM<z_roF_A5if>XNLgBsEvn_<GDw)w+4@=cphK& z%Sq06XsZ&ovQC${B1fM;UG`L2%zVM|XhgO7UjJ*AJSpQFUWYM>zYl!4C&w8XfU^p9 zjgPEJ&8jB@-%EMqg@|!9WQvN#K*ZxZIz+Ph0C(c`{&*wMLGQNB{3_X?xDf)`vj)Kh zA!eaccLXZt3PUe?On+LdJ0x3=3k5Y0AsT|CqI3Eo?Awn#c+Yvi`N2?hk<dp__Y7+J zggXMzu?wdKIoClPY!|Av_3R-!8BgR^0!-nO!fqtqhk%8`q4;Sy`2ydpKJNIY&L#gC zS6~7^Pujm1#(nKXxbPYU8fJ{oswu@$pPWyr8Ei1`0Hq0W?7ZA>x;k&6`2ZH{a0XTu z$i{6kUhTz?>%L)(0@S8zOfV2nV|J!p>3{W9Yfb*Nb0YJiq`p73KAZ{(;^Ys2vV79i zQkEi!>h>nX{)}X4E_;Siu%|I}$;g)R8pYi<-=MHP?*tdm7HALZK^nN@EwS-}S82Z0 zJc%*dbc!;7>%NbCivGB4y?D_F3xUIxT+-#z*HWKEYp>tcwhLTV_&*G`<>x+$6Do*9 zPK;M7iWNSIW!aWvb|XqkxJ<4-`oS#__CI&UW19XQ)tKF0<2yH&PzwI>Y|BRp>WtDg z!j3|QBwmEkuiH{1f&$LME^%MDC3Cd*(W1tI%to~yYJ#{ik;?!oQ+R_bS0p*r_CqjW z)R$dWGsS?txW8TN=Y2LMjqAdC(&=GLiA8HMb6J1h(`c(gn-D!~p_LArpR#uJokW>< zR+Y{><0#S!RvjHrvT-Uc;dfCKMbB7Fo`cS~BkxnQM;b7ey^v0aA77yX#ER8w-|Z6N zy>Wu73zfxir5DrUKHZ44QnG`IZ%2u(;;W9;B4U1pPYvG{d%Nv`Q$qM;45M2vyr7M+ z!X5WvX*ku5fo83%=7pnpP>JDVI`&w0AnO8;6BZ=9j?oM#gql6I$)oE;GHsw=^Y9xK zijI>o1lB+ObzbCv$6puL%co7Q3+q3fEAI1=kKJIEf{5C3laJWNse~b(+_DBkOqfaZ zYmvCLJh57S!bA0L;Bfo4*#qZ_)<lI$9BIqgh+k@JhVNv~>C<13prLYRZd41v_BvP% ztuU4t<#~|qDk0E&C-i6Q2l-+5E@E{P=1%FBz`Sh&lmerEWz^=BQfV{vCS<y38`(&$ z%saz>kY6MDCezk|H}Re1+|5yyj{+SYQ@#C`fUw)P{oXhlP!5KFeIwN(kU56y&Qbg? zb{C*W(PWA;$#qp8LVEwJn3>73`JB;54p*Cjb+NV}5x;#y1qDTeFm08~?9AKHr{bf? zDYf3Vl-96c1A2-{>gyGhtOy;_;_G6X69=O~y9YE+=Z=ox4=KCoddgnJJSMN0;Kw@; zRxNk=Fj@&z_9XXCs4&+p<M?{Y%*H((I^C{f>#{vvywc(n(C2#w_mTO=%~wcrqZfcq zd!oX5Nf}eG?|0yo?Kv%)*%SHp!#CDNBz-5TocE~Xl@E70k@^j?>(0{F-FtP(()+ld zO0qvBQ3O|Zd%n5Gn|?lL^|l)|yW?7)=HN8&xHo5nBpb=NJ8f?Na82_UPGvsoOun}b z7VOP9y`Du1@V+3n+?j?cfAeO2Gq7BzgHxCKdRm7W3Nsn2dVL`ObGx{N$FFf_Y)Nr3 zvAb^aa0Vxydo!dJZ}R2)h#&ToO0Gcd{R3w3r-(+AT%un0;rA{f+s2EVt<yu_B3k}= zO>RI1E|}o9QGfLIIJ!UddhN$nRAJv6N40e>^Eq6>(U|1w9-h!}=kALgqjT|li->CD z=$>~vs=Z|cBGF&!I`uHckIw72Zv5)Ed3$p)|L2D*67?wKyQVan(~p<>>&`0+O}!qd zm%^#D%HjH4EIQmZ20V|?C-1)f9{>H%_xR^(L+Uoa##;V4X{iH?_!LDiv~d3PVZQP5 zK_!g%3Nm2ufM2~ZNv&Yy?`}Vr?dszJaQOub5varQftv`DE<fpg6zS_kVn76&;~@4# zhzpL?n@AdnBa0xC#o?f=IAGa(ju`u6LOG^<n1wy=YdG#KrTl*0Fk^aBl*2fAcRAH4 zF1ng{e-1}AiG!1GtbRq>ZgT;P-`}jbR@E?~35&4n>1F5G3l2>csarIoh6vIH=#!DF z03=hy#@f$Z@=FbMg63KZm!o6_-DEN-=kXO=83ju*H!HO>M=FknlY78(K}u}~1}~&b zGV@A^N2Y6_5;hoIHU>O5!e!^!a<maKAf;6jg+tQUeGKf+40#TSk=essN0`m=WG?U2 zJ#;0nxl2iKOzTb(pDGcPx5;bm^1Wzy+RdV5a8szCER1*D0*n@juH*o@Qf_W|-**0y zQRY8ysp91VUeZOOoJDqX_)n1M^#DG}G2Yf#u_F??`)pvAEZG;gUJnh+<!ePz+C*4x z$+>UIi$h{rYz2|Fk<~o%-aHCtMwIZl5Z)Qpr#y6Bx-iAqiUtiP@Yv4)u+nd9Nnu_{ zw2o(bl6G&5n3k#gAcFqcsC5+W6+G%S4LV->+*-?|+8vBwmyO3@D~*;Xt{)UM&96l_ zvMMaA!y$%axlmjfj46zvlpK}xO;lsXIDgQ&V_A8vp{w9Y#Mm)PPe5F?$tEY;A(z`> z_0{1E5Phd9{oRx>JX)L?V_WSOey9!T+zxR|hOKU^<ELz&ZMzw1eGGT~5Ow{xX0EQ2 zFIX|b;>^u5ddEN+tml%XCq7Z@{Qro$3$Licw$Z~=3_}myFmxjd(&*4ggMgGsOLylC z-3%ou4N^*nltW0jG^l{Ipn!m&$b7u-`OZ22!d|oX+H*h8ef_ot0evRDD)_c|4slS& zJD{!#YDF$@tvqRD*r$2M{L_|REe`S|2V!Va@>ovEJRwa_4Bwv5!okUYc_HfQzS4m* zcfO#l%L7D}xruQVmZ7STjyFOkvtR#a*oPd}djP;uAi?+HqprKVZqWI+g9AbxKt{xX zTXbR(W*lxf-fEl3B|T{01AP;aSZfT4QiDb7Lc9;hs=AS6RRf$?@{a=|Sk1M>;`gEq z;?U=#9e_x5jyziKrH`pLk3#`L3rZL<>$CMnQ8%&Ga-6b2t=31)gOk_q!G7Z4NRk*M z_ZH0Mj4gT$R!2S<lD?Pnd9O$e;&sUFPBG*@Wx@d;@_)qZdZu1IF;HDTCZ4I5>uL9X z1?I0X7Hqelaz2s@8O4mK#w4&@$tI@m#u2?!%|=-Su%)@ER|D;*p211e%psY*sP36W z(sPGhbF{>W!VWh6mG+c6F)zjDl>X5;4pTn#y(8;+|1)99I2#dS-Op55c#N{9_D;DG zS&kwrpr%+@FERP!1%$XLh-8^K-qLf>h+Pi`*nfs0{UK8Gq$5Rzz(84dE+0hSZ%jPo zKs-FZF5FhBIAgtiKJ^naZ4~V^<U+i-@7QEq^W$7Y#epw-QA1NtKg-R2^NP(<h}1wg zCO~)9XwmU;#UW9F=2+c}5J7>b{9mR;78RAg2Tx2S)u=Xx?PdlE{NU4M_?SVgrXb#; zD2@Ruis;;v)NwV4kh=m?97Epc33NUfY{~*@IXE(F>0H$5G4`b8qoRq<)z(_GRm{oW zXp-|y3`&v97lWJ-C&-dl#{KpX+=oKlQ@l(9<Y73}A#YCae3`uIrj{`)|FVi)upw=9 z?#or?^mRE|*g>|y*mU(o6w7HEYenIB-n5L#k&0#A<MmmBneXo_Yd?sQ1)U!r#W|BR z>rv<(DW4eh_E7iTDlC4SzQH`<{H$}!R2pRac2ZryRgXj|N=P&!8rQKguYcIy>H34* z;J%?vtFb)oK1h*i&QljE9WqOwKDr*H@cD~tP-o;o98$z*N7a{7%V1vFZXS%rYwDls zvsbEl4naOVx+Zoag&Yp9a_DSVo0~>$>GyFs3d;Mq7-<t{^6S^4GT|ccl&vx={rHtf z-Bj!#Jb@IvvxB@@`l}UlIR4Prib)1fUQ>PC|H1P*VTS^8@Q8vyS3xcSM6)dPg&oY! zC#3uFSSWNvZYRV2f`Jpl`$?Ys_1T0X<etFs$VHHf`Fqtrr0!d}Yl>FM{EZYLRG)$b zV}^QMaVoFvJ&h<_DnyN=M0@6+UaTHf0azwB35Z4HB`KqP>;NuYs>II@NRr)pCh4>f z)AaTCJ4YSkm3T(xieKUFK_hJ0TudcL@s_AouJ(w0>XIH&j}&sSJdcN#>Azf#gOVBQ zF&pY<@hgaAJ$;y;y=b9&)1b$;ptv!gQDCE`=b?^?2TmuN>=^#5`lt*LNrPg^LW~>^ zc!&Ez6wldBJa}>|RdG+BJo&7&U{ImdE)8MKr{3SpGR<-Y%rqW*W<5hI8@-K%W!}&D z<IZ-E*3KuFGbESb4lkS^;MD!Op^)t}xxyhi==6Vl*nK3SoEN945@F_M#hnjJ<xqZ2 z=l>c|LeEetFTDRznN@ZM{~J|I?n|blG5WldeHEb~k$QCTS?U3RP^3YTH-e9BS?)w3 z+>a~u2?GWXAi$a@!O0L1zf|_tt3=EDo^C_P?2__w_C)72{9-8_&sfAnDP%G`&{auj zI!g4-15Drp&S&l(O0*tL*$<0M0@=<gcpv1f*mEVVm^&!hx<&MH>srBm240Dx2y%FP zZDcFy!>_Y(ivCK4fy)u6^iksHQZh<~@=8%}W91pWo;=GN)GPRy3m`#7X!s5AOC~G( zt-f*Gc6yD3=_(L6wrC8r5DcRJE5m{xe9EUy%A0$Qf}RvSzG8|btb6R6oXkzMvr9vy zs5)XeFrqatoDU#eqAL)oSLS?OZ2}pyYZcdw>`uWl%SMTN^gm1T-RFH+d;emZD`B>0 zb!yi4X%YS=b##4ejNk=v#rt21gBMKg=f2%On(nKbk*3&<RtZBD^$%pKmgXpX$V6Ra zO-c&h&j<rbh$RoCp<=7S1k`5KUr#<dZnXyI$amm?G^{{cD%KQz@`;?pU*?~?)z5FQ zOyIWCw2w41*X4*?3hW=xMv*RKMXBHi0bdL$AFPt+2)0oEv77t+9%1E3v6!{ELjFlf zN(B9A^7F&dsdVOVa-#>XU%ZK40IH|_6m3ES+P!OI@vYj47NgvGFgx_amlJ*W4qrcy zXZIaeT_7pqcJ+tQWM6H#hdN-xBiY?GI@EVcLX(Pu3IL3nYIzN1bk?PhD*!DE3O6i8 z64LBeK1Wf_sx10N7hJZ+<tWw`JmLvvx9Xg@jE<8~$*`l2u)(XO+5ilheze55=tzsC zV6cP809&!p-p6*U=3=I=v1#ouO3NL6G_J@Cv9}jRw2NP9Fy_hLETrn!8>e5`w}x@V zG4C<W?|+vB9z1-XF|N8`C6y{;lTSOnJIe-kZC`AZAZNJ}>mM)t7Ffdgr-UP@RNzmk zXi%BVpEAYH%-%q-b`T>psNCjH=Ce)?VcS%W=}MXFilVDiM9~{ju33XWuivm$WnX1b z&aq5A$IlDO>iW|;QE^{=jkM{{Q`S#Eayx!bN)sk@2I~fPR&`c-`xB}>Z6Hf-{P`zL zwyR-4x-R@rBRB}C-}P2irs*jItN7nm9ga1UuGr~LP+m|w_-{u>XJ`GNwv4}>Ji%|r z59rN0x*}hLo4OEMT|G-OABz5T(c1K;N^gY*_YJgn547jT2DimZE0jr9$m>d!cH#tu zW%gCNp(K8dxZsyBWv_f>2WdAyYTUFhTn%c3jJkI>rG`MQLOwQIjN^h(dw<63L&iSc zOqz8M<D{qXrD@p38h@4yxo<tyv7gnc?EAzzU37XQ^zW_N)`-UUVaCJ0>6?M+ollCP z60dH?yhE21%OvJrFJ;s(v0j<IzZrGj8-6A??|<3K_-{=@ZZspbYw2cXAha&OXZfk@ z+V=o<)AkWjS@t=Z6%Dz$fzWlb)VX}wP0`+g#LoA%vJ*Bv^FM<v2<pDn_7u<r((sg+ zm_OPUee^l;(Yt3o!91aR_rkuA$!v64&ElB%IV`Hb-fXLWs(v}QmKcayt60a$;5vVY zPX3nuOm^Ei-TV1#=XctWo%(-ApTcIohJ9-{o`~)I5z8^*AG{g+??B?w>WBA-JiV9G z|2}v1Z2gk{@>6bM?a^7S%%`%TpNbi)dm#gFdM}zEpG4mNy7wWzISh~xdIDAgpuq%r zA`ZG6^3gB?ai3)mtNv(ikY)?rthIbJn8Rz`_!OZQ!%l7?c96!dp1`J<zP>!SGZIT- zmtH{N$v&BJU!&=Wm*UNn5(QUKPc_AzjU*jwACmiPSGkZld&risnSZ`gpq9muKJ&Y7 znOdkllZM~n@Eg8S@zx+ioAC^j)*nfo)W@@(_C0qS9h5&;Q-y!^QZv1BG8r_+*|BI7 z8w+psM*3cA)%xAH=ojl#XL4?Pxu5y`-y@cuOgHQNyb@C=bFR?bTq?8QU_o2cQc>;i zn1#O#cDk5n!A1XE82yeWmAyZ`>&X(++0uV*vn!MF!26&bPh<Mu!*>UzkzF6;zF&!L z=PhPA`=>s?@3VL~u$FaiMc8=ziOpC4E~ZBpknNw3zX@lg@_k+>bdke(<dgKxudb%b zHSX3N$RER)Mn7DhQ+}72*QZRbA{_WD(sM1j{k@*zr_794TY2dZVTu=uC)mBKeBH*= zcZzyLH*xuHZ$A4Rz3sn>+aexe<STHI=TfY_H;OQGK2zACGxO?#{qC$~|F`i6cdW)S z4rv^^Z7Q3nW_dXAZX9G*@N`nJB$B-QpmJ`qeuG=Kv4H{4jzWE!O3*-FNbZ~xsYLSe zK<^hjiKoWn#-@ofm7)Qvxen=%GoM7ILaFApx#a5S^*)&!7-~ls5ckj7dmGLgJaKIn zT^XG4k>quKD8gn!^1N|DZ&HwE#Ww5ts}+IVP?}YTir24Jo!<7eJ#uMX@HBIK%X~WE z_Oa)3*>h5kw*STK^X$)lpF@|7eK(VzSvYP+`Du~=e4YI@?BDb3g>bz8PFEk%Sv{k) z$k~ix4x`(O<0{PAN)YO$`<C?ZOU}0xx!dK9(9hKL+v$w_Rz!x{$n0%n)fC*+c8;CO zVzlM$`@lj@3pImEVg#y>jUHBIxnt{!+}#b|09x+>z|frTc>9LyB7c<R6@<&hahS!C zbhc!fwb*kvs`M*${!!_h-j%~%{i<zd<~$mQ<C=QXhbAwdg+BY4`|ozGHt(}l%qx?e zN(1f^a)*5gElkqVgkGd%hdOZM$yPfR{QYpw`xhyuC6r<w3W?fv;=z`*J_M?m`xKj{ z%d{z&z5IbU|7O`%93Pwe%xU3+E@Hp91s8wOc+Bi>8x1SZ+WiZVLG9$b?*z7Js+D36 z{-X3_k4k>~DhCQQSVrJ8VTunJnToMDFxl{Z2=SOdHgp`3Q;hxz{EA~;8;aa~Ln`t& z1*u&u8Cw7Vjq|UK#UWCCVVj{0jp%!H@~J%gsn4$&NPtfP@g2%DFC-gccwupMw3#RZ zohq7Sd#`?~2k#<T&&N)Fs9-1ub=^h<jF?T+V#Ll%sC@y9WT7x6wy?b*G_N(8FI+Zd ze}m`~*aG{`;2qir3nJ;jl5jVm&`iZZ>Wxy`9<NAzhglF2U{%i&1-#rz4fpJRg}a)? zk10R`Av0wlc*6tAOcXTO+#H~f1<0|S0k}^9>}FmOblZBVp@L=z0!sj_U>Bl_z?TI9 z#4`#IL_c$YV&Wx{6Ld;oe}@<e5H?u@V5P@{1<Ry+;4m~t{nV;yK#rJAlJMmLIvx=q zVYkSCq14to80iZX+?s(hH%Amr<RVWR9;Zkhn}}wwIURSNmq!c|WAA4Ks-w#hfZ+~& zamm>UvT}Au+)1oxOy-#VUAld_VQ}njW=B@4pLI3=hP6vU%h@`^QON_J4`v)K4aF8O zP3#gKat}m_P_mIL?-PA_m10k2o6C~9CSUku%Ct0{^haE@LqaJyn-Cp@{l2YX!>@VP zky$wnwo)!c$|1Bp_3WSYv8<l33{f9LiIA+?FHR!L7u~s;u`gCsP#?+$r-8IsR_M;M zq5ZWxYbe|vpsfpnG66vFDo)UC&TtEE*AoMWae@%VK!}(p1TOhq1r%=t8?p2ZXyJq~ zEvcr7VO|C6Z}Wzwp&#phbE6MrlsmsG+n;k#$lz7r>A~^Xmaz=^lIkRddc<;fWU4E# z0Np&A@ZokJBX&8LKnyWwuOHR=E?P*0zck`ul@)P<hbkX01vD%`fyjm~ickZywls9v zW*?6)u!V^az?8bEbbusn<?;B$<asj|!1Q9CpDBH?1W&JCYkk!C@;!(L(2MuZLj$Py zT-W9$%l@FWh-$=FsDH=a!~Rp-Jk09tC&U?^i09WzvO{%tKx4--T9pB{+jjZB`yq@- ze>2rp?AHT=K%i!=1cv<SG%n*e2n46z)<@)>IWqq*_li7mgap>yN?HQ(1MKh#FaYR& zwlWV*y^FC6>RB$akn|#OkmivyRJ#ELI=>Hj7K7fuR3`^h%pmCZAMmqgqlraq(?Z4i z2rf-!wVJ>%kv0<23E&Rb2H4M%z7VeI(PF{01G`omAQ#bi>G7o;I^z+|_fPT;v9O+G zzEYgB@K9VM-JVS=^Z}GQN6>7SdIPaw>DA)Ls)~QQGZyLNAzMkc2idRssY-ZPeK75B zzb%v%@8rd1D=HX)mVhUycNHs{I{w<=aI7kW=EfbmTI$dS@qJ2gAaBe*I7ef5m!u+W z=XNWm$iz*F%WJ=NRIh&zD{@doOESkB4dx=GJtVr5&q4lWIkmjAeTm_C|K(E^crD<Z zddc4F5k#tfFbFR|6`h0%B|;r)rb}<*D`AIUrPU1Nub*1a&Zgj#d$Vg5N0d;Xj6und zkWoe`N-?2{m%f23b#=QK*fAzZ3<Xg4z(CKIDjx#v>YU-LE2ia3_W(e_{Xj~V91eK+ z$?&}t)ZQ%rs<&)I<>QVYsdhve{mlzOOYc+2n#Pb6D-NpSBb!OD@qjd^mP72M5`InL zpV@gv<N<W*iz2Yq%;qoZb2=x##f}7z#?SpKNWLCK7e7CC@ec;X0Z8>w4_ISkZg8t> zkJcIlI8Uipy0^PrTOZ=&P%S+^fTJ(I-Pu~ApfrDh^x_XIOLtQO?S3*n^D@d48B3m= zNZDJ@RDH3x)%TX==_}dxUy}~Pj9S_7g)u|%GMppil0bYA(l+_!?6*yKYU7fE^faCv z02~Q`!9=|K2oYeQ?)o~hwNW}F=eYQ@K%#dAMqN&T%f+Kf?Hc~`#G~EOQ!4g@S8iwa z)|te8w47*WEMV$P3qdhSZOwt-kw_?wA(Tz5%ZW#Hj)UbA|0|3Ei8_(A+&}Sji;0kZ zjQu55;uwg`OtYr-&jkDnVuh2uh#2jAzZ5(!A{tI&PWbQ8)Rb{TW1Pp?s}u%X1a%eA zB@;vN+T&%DYq^0o<eM{rTnT|$!@1=Fj7*0pe+Vjf0=}+Oy#iG_xO0Aid!I#dNI!vv z9ga|K;i2wXx?xGyktBs!?+6rm4I8ulCIOW;qQha7bRVJ%2p1C=nHlbX@a~@Y6zHQ4 zCH))w!#E)oZG>iu15La`#}Qyl=XQ14#o$L>3<n-dY%#<-jiQ=8f|L#Z-N~<PU$_MP z20*sEdACUp%>BWwjT%U|VvfMlMxhx-2xqBWIV)ob`AS`giOGfU{%thSL_dLep<O^I zVA&BUt&h$J$x!l!!QIBGpbuerTprdS9QM}LpqSE21tE>wV8|$TaNzAdOanYFWn7ts z^m|S=Ay|))%nt+rpmcWF9OUHG%SaD==82%AV9IqPj($rijGx7u?iO(e|0Wb`BR($* zspxOvHStW*v2%ST@g?3O{WZbng9@}AgIH5=T{ci#x}eN!a;t;@x~Tu9W-||X{g8j` zK@^O72w?yiX8p}bg-?o<pH*R0Tu-3BhO)#3p)$3jNeZl*z|4(dmTTHs@Iltaptjk! zb54^?!}Zq4bbF)_+Xj?o5Anb;<JOZ++mhhHG{OP}`%?m^fV0u00;zxCoy@X$0P)~` ztR8HXU;ucfv~FgDMN@z@ZY+bao>dbkPs(ETQY=GM?kOIB2@AIs-bWF@6pDHtNn}|| z`@mcDqF7Ypn0;)FcuO8pN7NPK5e2QMU=k$dEMc~0V?*+>=*lBHCneLKN||vyd?pHL zm_fK8=x(f-v}>eIC}oJ6q*T4zkWa;){E{*IbUYK^v|Zdyr@qsV5W_EpXi`eZc@Ib* z4b<6kcA$dN5d?*R-#4NpAS$HX0p6Vk_cD>_5Jl7hi2DQhLeUcFHG%+T29lodx7o5O zVQCWNTL(S4w_XDIi$RhbN&+NcVU+TxIEu)okb(yQHw17dE~%eS#dSpKG#0$*AP}C3 za^kKlJ-$&F{)d95p6>&OaOrFwKRl`6=?GOs!MUf?>=SD24(T`=@`Ih*YiTj5CCrLH zrt#nglzGC23P3U|eLsBQ!5R02Ze)|C1Fc1JC&QwdwyfyiLA7@>wU4Q&I!9SLt*9;F zq$%j{W1BPvyu3XK?Y$Ol?})M=NJIyk5=O|PGYXMDqyud*HN_)rk(6iW1^jHx(icyi z9k?A3y5aG<?zR81XdOt{j16^PWTBKE>SO_jH8-?>`RKgB8a;2-mDwPzk=I^vWD8r6 zkb0}bc7YH>R2U^Ze!2w-a0tqKbJ_6F%y}AOfk@z-&nQ(3mOhXgp#CB$WY+47au`ei zA;5R3L<*FJGtOsxdk;9V2XcXdSvHix#mRyQ;QmXut>G7YyHMU@3+MA|RLi$Q&E|-g zlUqMiXw<lAU}1#T=mIr>#DRyg7Kg%O3@pL6=CrM*j6eM+FDm_$eIf!yp=f+5WhegI z;GG?#;tS~AyQhs5?L{28DB!R-$gbw_vTe@d2U|$nGo^HP5eN04OIyP`_h}2y2MGgE zA-^3#d;rePZSj&?_^9HTCiolkvB7@v=XPYUhBmBhlra?cl!|<G`<2~&ny{K#E9S-U z?GzeaD^k%a0nR-tetgEV=;)IQclhq}ml3Q&WuDink*`XfB-$K!e>=x=`tegfrIB!# z$$oKz<8kDD`@HEJ#0lW&wu@$XWkJzy0^zkaRSDQoF-+a^{2i;61o88>^Lf7H9sK+G z5sfo{yF*d5|F6n`&?P^K3PUeivqQYVBHEy`XF+eWgKC$8>S=?Up9QyP2WKebU7;vV zC5F{^1FoY3$toct8-F_e{a@314olcOar^i}O+toLP23#%Atou@j;~aF@$pP3+8Gs( zc~vY)Y|qpND+DC{b<+96HzXvOjJ^MYpu!trX5g*;R^SA8q_aUd{gtII_QlWNCY)F1 zNJ-S^-=R9u3dR*7JzVlMG5+)cc@b6~gu{NOJL3te!iJItJh2|QOEw1H!dojfw4Jvn zjt5|hq=j8^+Y4z?b;x@y@j0{rm8e2!(yX#~sx7DZv^SLAjF}DuL_US6>0Ul_(u!wh z$D4A9pk0F0(K$TidLA$o>$sDWrL0{z=$O>5jaYW9y7KG8^Bnp;I<*wz7a(=-iHXSN z9>PIM6-!tLAii^^8<2#E>*!A(6+0#ciaS!fqA_~n#v_DK{*7?TD~PsK*0|c1EIxl; z4WtPM)zwEh<dTX;WgHu;A66vee6ugCv-G5-=A(VRb4}s70g1VffgkM>lwSaHGw`Y& zo>$sU(QYf?r^8UG2~Z4V6hX+hSLl<L>BGt7m=FFA;T=uykGPl3{qgD>tQa?y`RYJ- zsrt3C@`s_mOsFK_=t=SA6B+_5h9frm5%ecSO&({0<Cp5V>-Tyk)dgcV+<w*BVSG84 z?~CM*iwsAz%@0-`oK0(~*G^hP^Qt4qbM6X9mTx#JCb`47EyH+cA*&7`3Ty~5h+?nR zqFxf<hqRbf1%>#$Vnp0e_`_+!@0BH3pekAUtF>a3@CDCCh~{XeyJ<BFT2&HMB~S`p z9|_?tuKlKJ!CXu}xmB$r4Y0^#GY$&Xi^_hgl-t84wPmaNWjl38y4qP;XXcysQKyX3 z&=VTTkePu8SoJ!W%epzIx4c_In@*G4HMk?f`tyWsXleZ%VZ)*(5Q?j9a3OEJIb%;j zu@d%GsuxRC6G>8g7For|%e?9NBFcMO%*v9)B>iUlHnDe6vrF=%OMB$KpTOWvM2jX- ztAX=!TS>e{*V^i@CUzjF<itR?B#*sRZH>;>7*yFYS16=Txta0)l1mrk-AKQ`^Med1 z4+f?|Dc`fK`nZ<FxuG=P6=6aJzEe{YI=jgfK3wD}60IS`-{r1KhHGQH8qNL^8-d!? zMo=-EEpf_v^p<OXdp{3jvksv@x`6LuMrh2#IFZk$82eg-Lq_sHkgfm0__-TJ=StA) z-gGMF*kD|3>+?+-r6I#6kd&9*MmK*AH{J;7EZ%O_?`k7(Z8%Nvkf!Hl6MKRILaca# z*NCQGGiUkeR=N#T!I?49*Fs{=oIAvvIx!++#bp0`am!`d;lN?clPzDelYeVDf&1yW z(882!vH%FIu@4dZWB0pm8dE}>NBDVO>z!0-RfgcVUc(OupGMqPfN@(<9xL6B*ATxA zOOkaUM$D;e*_*}zqSC>RF;!7|tyV=2b-KQ%Bgd)qFI&Jfa$4XU;>UuJTzIC=NJ^Wd z_~oZqQ@*ceQCwJvU})9&&@l3H#_Hd&<l7J5r$;c%AzpQox{}X`*R**Vd~Vl<KY~?y zqg3fQtB)nkEM&cQxbn$M)s)G1pide|OLr_%*sxyc1e~mRmBC)X)E<)>Yb;3QefO9I zhH8uQ#J;pu?rr>zp4(UhJ{H}fX^F~rJeSsybX-7~)*sDbX{?42A|jnb1w{m3=!h*2 zMAA_aq!NF+{<_U$wL<2!)**}eNTb3k#^+J2#&-#GFsg^MGY27QS@W50*JfZlu<Y%@ z#a8L}UeC@jNXXOIrgKZdDlb+bem!&iqz-|-Azm$8ng`idD3xCe-&vVuY5r{|#&+>p zue^SgSoB)$=4#F6MtYxf{Vns*XX=-4%0GsJz4?^=HU6!Vn5d2GAg1L0E$UE@S2k}> zLv~ZSj#Amq$b7X?xc!=UZ~(wH;ob)yUbU`qEu1Bo_7+BV%m%$(-cBRdtN+Cp@%}BG zctG?i-WGHT-W$irpr~*zm8U6j{^NO1_v~$I$KO4(FrbCSZ~E8WR_8sqsy|*qTs~oQ zD_x+Ln%dy6RjP7{gWv8I6)Ee5PBwgvc-C7@)P2xXm6+XI%Z7dN{r&a5jcXpus^KCm zx_C=_Ug?v}(Lm9a-t*ripyR;Zm1brH2*#w=U@1=tBPZ1y5djRul5i-PFY9h7C6e9e zpU9cDQb=XI7s1Kf$T5f^l#39vnz2+);CompJL+XO@d~Wd0UN3(8z3eoZ7`58?k6Bq z)+v~Qi-8sBA%q22bQ?-DnS3xNNj-S=3@(}@e#8cUTlph~CnZNfY+*3Tata=_KPXHv z1>l8GYMhlu3)=wo4TA6oqY|`(ze<0amB?<SW%v3>0sy@dZRQR^dK;$Ysa8Bx-l}U1 zwENN%ii5IDbe!3tc@jdLp8m4zr=VfLilEITT!={ZFJs6pB_~(0&Sb-Xi_xS}uKuzZ z<T@nkKpI+FjQod}Krj`Ke=mSNa6gsg1+Qzqm)yWvpH_K}h3xMin{W!<?5|8}fCGx0 z3TA(i0Q@gRGP)Z~;S>-6IwGkDyR2zI-(Em)!uOKZ{c?1h!q9)z=gSkeceZO<oP{6t zp9mzJr^j+u$IZpHHu730^OpLP<FvSk)Hbz5`VGudS#M#S+R~>6`1afYUzC9o8wPC% zK>~na2m%Aw!$-m+^$hWfky%F8`w>P)Lnx%7=$%(dV#=LKBXz>*Sx}%+_i%xLD~J5< z9;qz_86PRz`$4(xjy~uE6hS3fae50Sk-L4zKq5=xqe=y?3(W{++D`KrE28&NWwA`D z9??T`A0hBz7FXLnIO(*~uR$WVJS4+Q*4G{mrMd4ewVhuPj41Hmx(sl}cL*W+@Mt6x zYZd7vgV7LkElbxHAj?a=)@f@qP=I-8J1cbB2n7rUA|%mZ+QIRcEwlz6k<Ej8&c}Eq zXvUwfzpy-W1z&P+nBxN1)ENQov~>bNjo<1g>&VGP##6WN6d{p)(RNJtprQ}vkDAvX z9MpHLrXST|Boh`Xu*{#SMbp?<sYDD#KRAdci{OviOiE}&L{;V12Afi3BCdW-adE%b zVLg(HhwH)N{{1<oPxyEYAP&@~gvLY{220Ob0gOu!Uc`c`^;?d?CNAbaGBa2Yrk{CX zeSn0A2ev#%#Ib%KBVGWwufTP{^le(IhKh!cX>!CnRlFRo3g%t7veA*K-AG`gNa!j{ zf(Hb$5laC*nxD8DUWrOPlVodg4nmVzND|cbY~-OBW;UnF{TJJ@5GqNOkUXz3=FY0p zMs}Yz;6fB|XX6qg_3pf4Zw3hH;5ZbR#O1u7gi^KvbpiCSl)oPEH(MYblgOsHS-^FR zsYKH({R4khJps8*39z(ff+8=tu%NTQ(>^!caMHT*5K5S?p$Pmjz7jxuy9^5w+<%`T z_C0VolJp|y?)Rh3r6$8THy-0xPD$cuFQ!30=dfMIG1}muLS#Db<s(Yd#v8!9od&nt zW~YdD;JGnQSLQ9H%7Iv_AIE>etb0=~?+nU8b17xVwv;03h7)M?#)#;6MTswjWFpum zS`Nik&{e|;%-tH4_;W)!cd@8U>@aPmA^Xk!(<G`>8$)yMg7uJ7C7W%`#bQ~Situdm zCmg7Z$q<&WzG@$>N)(^^hpr4M{4%BC8zJf{M|q|pHpB2>jlt8PNO@`&;d(Sl>m2n& ze)lk}pqz6OWWs4sQy#<BR7U*VSW$iVNcKHM@5nUggT^1d9A2N@*}S%l0Fg+Vss@b* zSqI~8gi6pH$&UitdOYrV%}S2v(^5+ZX$Un1=2{H3%$`Z<j>lZ#`NW$?zXPY&ZSPy0 zCM=5Qj%tT2HY?s}?u%1*>c&Xxs|j;fDe`naN#H(UrBj|n`c}_S&I9P_{>84TJ<%&D zZ!TBn@8=^$>jyE2Dcy6e*3|o>4-lS?IPB(9eV#D$XvnAXdfr4Mx>M(M&xjrJH7`!@ zdUT}x9c8AgPmO{1Lqqr7@$B@v8l%0yg{~3r+UGmAM(yg0O^4oZ?6qo5m&O*`IxpUO zB-fhnsV{Y|Uc3vKthM+(w$%IQq8`O1@Soy)x_%49tN}uo-Dx<)eGZ|OL_)k6j6c|0 z5;gNy+dSjdYj<mFDkc#!*Fu4$2RUeLe5(j=XUOy?PMfup>4jIWU*jol)ZVNcgD4tM z#a@Uy(POmKACXz|Iy4dF35QLPluo&DM!vW2JBK$KpIiPM`q#Vg5!_-^)sXYmJd((3 z?9&Nmh3vMS41nG5zz9Z30J^7w2TE+e+-wmAi5e-8dq*x1y@h2cRr_JNi2JMS*S~20 zk+{+!$ymiLZ@YUTxgo0J4~^4C+g)Q_o`11q5-ds${y2aQVQf%GYzmgN_6RBaW6grR zbmU2Q^a%QA$P6s4h$A-?oK~*C0?4+@CtQVHQV9px<%~Ne5_reCC$_oAsT2*DRhgF+ zA^sSUwBi1fgP7SAuL*^G&}q!$4o?D{!S$H#ViSFQaf%vtQt6PN73bp({>8Q}PlO=7 zzIrLUm1!CNwQMSUgb@WAl9;-2CMCY?MqO+Q0GOAHP9ahIQa_>4&s_(u9~6O?1g7EN zNLUBA*IzQTM|~u67%2oFzeHx6ws(DYtsxRR`1UV%zK9h0Gfb5N#}i~p#bH-Ibr(__ zSphR9JVgJeR@PhqAiLV=$JZy<PfAh5k7!ig9Wkf7#%|L6#zJ`}O3@;z?<cs~tzX(D z+BQfwji?w^lCK?a2d%B;#~ci{=C&N!=UWOhO#%MjEF4k6q%cb+@q0}W&`#;2c9BD+ zjRAFqB0)?igP8}GHmB&tVE?t^pPbmh@n1y)^X=WT_?Er&U$4eLr~>nTx5?fJ6onB& zwsP?C_kJcUx@msd&#Zmf`;)(@>a&d3zjC;ART%73*53JXNNRwLfBhK^3V70o0K-C1 zQ`Mi)c`|_SMURY{4#zQ6h*H*q05fhpcDkT_9GW<fj>_@kEQ+$hl4=d0K#=5t=P?pN zsP7Q*nIHY%0@>%Cj3NLR?-J=C+|#ln9}W8n31-PseA+Naw|*U*e|!EuL9_q53jKJ4 zgCrLX71kEHn`DC&?>J@)$bSrG?44Q??QdQb18}gvbgdt36}q)f`GAk!%>Nk%2Z1#| zNqi*wWYJ34;ptl49UyA*3^K_27B(+6&An{wt_9e-T2~4Dq&niy0tXgk82|h5w)xk6 zgMZ`$$80<(r>;|$fBvC6Ps0(foCJZ^Bp7v|M_5-$7{(8EuM$Pa&e#HEwkZWD%z~f| z+z&m7&pb%0P9V9QtXU1Dx2MiH-%SD6OHesE5ope4bSd~AAf*2do!xy}UwI12tMD_Z zmBwXY=%7OBOU~hWldAS8jSk8WCkjdc(ozqQ35Lwq^3K#Fy={m#y9(k*!n<rhdXmwG z0nx;>z&IqGrl|ZGhws-6;Fmr4Hl;IER1W_N!~ta`+XBR>Fn#`nlG+s6l87U0VqCH^ zlg8W^=#%T(@jdg8<+${sM8<YgqciB77i~ZsD9^5}csgr{-w@n8F5XWq9A^C}<HAei zQYhMixhlu{O<dT_DGNJNyv-OeT>^9w(cagENtc@&l0&aC(0jVUscAfD3|uS+&O=Q< z1qVn0NFDq@{l+0UkRBZZLH`A$DSct?kYy>_;wI_+m}MwxciFb)w;{JK{d}<%jXh{K zAizK*RSzj`X)O31Ms%D*_;cA0BSL!H$8nF_iCE8!R#$eAjd|~r2owzd^*eMC%tWm# zOB5ML9ALPv7#>-bw($l@Ltyh0Xo9GezkO;(F@T!H*F8;t^l%A4oEtxfjt4t1GYrBB z=9um|#<oQxvUuUdYVc!!r}}`{DnBz$1u!d29CCuz_W`MikbJ|c!aeop9iq8sfB{G{ zofCZDk|cmp<ZYwOtTEvXTavFX{9PY4F^!hWkjYmECt2?(kL%}q#@U(ybO63AgB&uy zlL(-$6>h~!1xg+hypo+i48J4qsQsD1QW*qjpYyD+uV64Zo|YvxeW59q`XKf#jB#t2 zj-DP^Ea`k4d;cvjkIE@%QPr9(K9+FKVpkNo@EesOg*gH;ACV{CM#BH7=JHB~153jm z&W5=`@=sfZLzaR5yyzJ;T5Q(9ivsjomq*1%Kemw;b_!m!By2#0u$0huN5Bs<Q?pCx zyyR&ux#3+Iw(HB5;#5(xQBf)!28Tm#>JHgg^j0Rjlw?-mz74W(mOLR%{2z<)>*rno zk#yVf^tS}X6vJ?rHfewBd_WGOyET8U(etm399eE$y@?Pt3i<MPTJL6VWgOd9EF*50 z(r@o956|S$&kE0}k^&j}cz%9A(gx(*sa)=E{BTKuK%Ub|SxLr7Nk)hKYX@@Qn6hT* z3qeBg*r=J;A_`XGHwF^n!{QefLrpzAhCK4`Z}MW;`ONeQR%R%@6!<G6_<2MM9anh5 zDR?6vzzI7Gr400>D-<rD76C+~XjHTDUKK^G+J5XHLi^|6k;12U;~F%mQjs*MnZPF@ z`QsKmzOxEW4#HlFQwF7x^zr=K2_xGF(EXO%+zbscjwP4_9D>UVsu>B%^QJCy!-rl* z428XkhtqF3l|swmeDH9U8tWxQnQ6@iWsbi!#B7i8hh5#2mDdUNBdQEXTt;9PnSqm@ zdd*%lyo-j2=gK`@gv894v>i+9&qf#DESYRWeh&!&0x%_;nI)pqZl;2MkrF`z5})+n zWCguJek<(H6a#)&ly7-;8CVpV*MRbU-XwA#AE=?XQ?H?<&s_}ko_S7cL}_db$Hvn) zp!22fs}!fHbNB(7ut5G@HfyRUHQUOT5QZ7NW-In4lZQsGr|R3hIjptKZvz#&A)Fk} zxs|+6Wc+CRmCg6XEMxE@7aIsJc2N9Q6as%0e-aeAU)Rr^tM!&Y`N6HFZk$5M*cNOj z(fgDr)JB`-6)4Qo4!fhV4K7olV^;@SGdzoxFMC$uPy1F%CpcdR*KdeVYXnD%!(~u- zcU19LOrdgCqY_Q~j&G||R=c&#`|yXxvG5M%{SFA)IK;-1Q95I9UI{~ej|r(6K-Bi? zKrkm!Jv3j3Jop`WSNX9B$z=oa$Vc7e@eT}8l}~hM=HD)#hbr}E`YY51FacGqg~H$B z-C2e$c^7PZ+g-`6U0Ac8#o(Uh{GQdWp7ph!FMoSB7<;#ZO>*tBU;S<QT>hT2vezon zIDxCzk*f#l*L|V^AM)+;$(A{_H#+*Btg3JNW~ZC&3_P<z{NS&xVQ`V+{D&@1!<noo zr2*`Di|Jd#ZXx+-Hav_S*ZXrN>O12iF`;)zqbH2P)`77I$0^(6o*PBA01Sfz(#uF* zEUL<JTRPF{@ewnspAc?)xcppGl`l>mw<DK#v0|5nE6cJu2R^Uj!b+ZkR1sufb!pDm zRAb5Ye{T?S#SCaQ56C6C@I=9%gbXSJ2<5sZKyyGlfZK>T+%9D3n-R6e(SY_kg}V!x zgCN{#V(8UL2hd|Ukl4|g$t_f{T}BXYxvshv-Dp5WZV*Ri4aZXyQI$tY{YH>BW0iko zO03REb~KG<d>dVp9HNsS^Aa15XJQZ59AW4J>!Bb36}{eZ<1^=0=I&PjjVO|dyIcIa z3@F$+3h((L$+R*1!yB7M=T4nyNIQzJ4PmFu2*zD!37&CI<~Ebm%D@*jCqIe7QBpd% z0f-Lb1FZ|h*b?tq1HD;Yx7Xmr6!9dmVRG4=ogYasahD~uB)Y*QEqx@){VjbFGJV}W zZMZpgO+5XDYUZkL8m&vMVabP^p!rF2_ZVhKK2MYP*l4dzfY39I8CHyoR-jxw)Aw>} zbwtS$P`?=|ARNMbOyG&d&%FVOq2?+ZpbxY@a<We^$WHzeY={1vc*?Cxc065jB7Mvb ze*_;_=jwAA?K)sAYEK&PPO=<3O6IQ9bz2IS#sr^Z@yKG?X1HDFja<JqFs%ByeSQV{ zO5^6K=`xA1Utb&{JXLu*3;wauqNx~-TegH%qb3FWmcmGuWw@5Z|1o(IFzSih5p06{ zXGph@M8mqIwQzQKwBA4jy@$|}U5t?mq`7MgE^J9;%1c_<z2X$w?&k^$5UP&(_sMyL z^YI2r!KpJ-C1rXVbBNg5I}hc$*GtSkws5w!mVfTpSCEb#x~H>miRIUOT-Qd9LGLH2 zKdY-I&9B~rgC3Mox$N3=q>&q3EkI_2E*d!F4I0CBzo5#U4_srkAt;lXrC1WiQ@Q1) zehxooz;Y;UUeMay+x3~oB+YNGE;oxGhgMQPjelubsrDuS-KSl$2c@0Ti2;b>Yh4=P z0h(t%%HE3PnyrAuC_@?lUu{_2St1By897bk`azZ~^tV5n77+C^AZ`g#I~$Nn8|a}P z7&%v&g(S;)6NrSNB#H^@@hjmaU;#itTrymJYMa6iq(izKmXNJJv3e*%5H>?rxPf0! z3*f{kGh0GTX9%KZX?*?p6{hrp`DH4s=$wn8HpQ?X$XAZN9wZXmh*=AjLa6Kgo!@d| zPUHkU8$}-)AUhtgppuTrDbA3vZ8;yFNQ?bGkNx=GeZvI7XHJwEZu@cX_Pb~SM(X;h zZprVxKvb%Y2A&{$-8pchOKCs6L0i8;y9fc=N1(s!WK$}KZToK?WT(7N{@kMVLq3D& z%{xPX`NBQj&su)5d$=!no6(!Jsi&Yj@*0Z)g(JQ^nm<+<DSU6<FE@AWA!SyVzomcz zJv$+$*^O|ciOgwC+LEGkkBkf_pp}U$j3|ltKpVmsMlpU#_NReBL}Q5?^I6woDUWcC zE#f4~bpco$6we7)H9Osf!>TJ-_%K_aV<LK%e)eGI-QGWK{-s!5sM7m8a-2d9`1nNR z`w80Z#JVoEJQAFrhW8suXcGTHNb6V5>=`6=TY;*TTX)di=GQyaFKOHYIvK5CeSQyh zuKwZIq!c3w@SMhlF`_ZVhyIIf>bVE_5)XLUsR0-H0DoEJ_N<-=#Cq<}b|Iy60ldu; z+@iU<1<B?>aDRWWK3+choOyOD{Q4yCuv-uBACl-0QL^UH`h|4MneGRUkVAx1>~YJJ z%=%v5TQZPdSNj%Cmq!xq&#a`eq)0aS6fAYl_|?FEWqRM{vjd1NoKTodRO9x9RPXOf z5_!kHBG6`(qV*{n3#NUc!hqRQCr<KXa90wO0V2TZ7?NWQ$+idmScS~hh$S=NZ<Edm z4f^kn8%Wu5Gn6*?9R{d(;<6<K-^7uG?vbys{%vLr!f(7iCM(=cy=`Y~;grXjTj2oY zI}ny2bIlw{&#jGq08m<zjZ*z<B_)ZFMT<izxYQphEG%Yq8byCsT{1pDoiGGMSrS(I zT!3&K6STySS6e!)=i4&qea~EA`VRkX+z-Z4<kb>`2)wKUXJT8mc%p@6)4)vCkv#p| z8X2Yfs+0&Xsjhg@gVpl?l<aqoqGPqcp>iBb#*HUw`4HC`!PK@xk&cQFTKKL!HjAIF zFbqj9H&_qpEm%|vUNtIHVRo(JA8bc!CPRvDtg>y{NS#ZO3871HVbix2onddmYu{X= zb1Cz#Fir(26Zqj2WTR(S_T$4uGH$%=v<-zM!8zYEz%pdsXamRwEp}{}GVJSnIoR5< zORfvG*&}0{0|M&ItH7o?<!ti{_iu~ybtPXT7=>$gHYg`zZAzbPMbT<E0CQj980G-v z0Sv@Qc_?!de+dAlq%GR2YueC<&vCO;On9%(L5WgKj9h`hutkIbBEYEIamXUtcdrXp zD~O_O;#K3Mjqt1#5IwoJj<HNyIfd|)3<{3KkcxS{DdeSWV27`y-&dwIa%m7)H1F~( zSyedWFIpe!Ol%)gv2}ZUaa%Sn-0ijU9l_w^_@+2-4nolc_?mGfC7qE@JhHuOd(^}D zDNk^=Bu5d=!3KaF;5%!gD`@8|%nu(*jwc8JcrwJ$@8*4oP;weV&b*R^cSkZA;#3d& z-fssjoRv~~xq{VRu=S`#ccL8bp}zl7)9yk(NYE@}2>zbhBh6;FAH{;hl5+tLjP35N z;cAl45oYbO9!8W7cXuf{B}uF@J;i-D>oPX7+D%FpUuPL5UA<l^4f+|%_Tps_gV9nV zj71C;dAdOR>^ZeryEdf~%I=<OG}jzwBEPMEY+BAaQIRxN6Yow|q>I=a%h0@)t><qi za^A*ME-p1y*F@CcH%ucQUEuUlG!(XN|9qtV{=w^)U%LM!l~DRc@SZMd;Hg~dl0Vl> zn#zg14G_|(jS{SpT6ovo>?_`*9<AQAiNE^JbcBmZZabj7`)Q!S9bRf2&yf+JcG^{D zj4RWOl%w!eOwnBTtdOA5KYhult><B#q_>#Mo)9DXo9Ubv+9Uhx5~qpy_iKjvxGkYm zG{|W3hpY!#iQtxe^iRNqVJ90?Vf=2q9`h#@++ZF7rU{uVu1^o*?o)VtJLDxjiD8O0 z_Zky$`s{N|PH0o4Qi<&+oYgVzXSUdaMHeYh@Z)aIb@m>ejS9R-4){hJoO#z8d2}IH z75X#r>kUJ?^d!Md2*ms=aFgfpxRtgye^9|~Z+mVuT%I{!?HMM<0MpMoh(CfH<{T;} z;O^Oo+86oAuq=|uR<IF$zrc!QRJ?QQ{SO}??CW>Zek5RLIyfts`0u)eJYLf_<R!yb z0+2*UKeMo>r}PqO?yJmSSNK9lUHJFbu~6Hi3W!6MDk2IA!FfO|eUte~0pCVyCp?J! z;!aKNIF+lUQd|>X2gbtP&Oz)Dq>j84kRoN1%%4{gre>q_;)iZ>uty{%X+&0=*f*ep z;2g_b$KZ1VC4B$EEh)*Ip~nW-sje`JtXf+x4Nx&qe`t%n-rP>$=iRCKgeC170Hp8a z4|nWA!0Z*{h{fbn0wgH{jsxYXZ{+32GVw_#F|l$vo^ky%0IG$PSh>!|gkH<(!~zCF z9ytQ_R0truW<BOI>=}Xa?KcHdzJdEc&?FjSN`e>N80mr0sc0qdJT0c#$5w%C$=lvV zuPk9g8Y>Tigy&V5J$N6Bvg?_ND-{<J+X3k9B7%BwLe}>gOGX6GBG^$8Ot)&o4+=3D z1j?F0q~{~0vHqw0N{%-glotHn2kIsLqWnzHM^slvnUW5lmPK8!ykg>bqHfy6j*(qj zY*U*RR`G&loDa*j^bsHeYG@9w74N=ct4q$wQ+**dvgE$v`y;KXX30shkLED6^C<pX zh6VSzMJ@?bg4|T~xDRxn@&Shn$;aeJHp)$}MpC%_K~6=2ezx?(ZbMBWS}+@B2C#Zn ztEq$|%>w~nQ#Matz7J9(4lL0b4RTIm)mrT1Z7QapymXxfo-^o^I%ll)UbeooTg}<M z8;#P@aBxJ8c?(dO_7Wbn&9n%+^>MCG_rJ=<6_g5kwO>3Jkx$c~`zL5M!=>L%IHDfu zsi8#|{9L9c+jZiUqjSB?wB)ly)KTkC=D$Rudu{$gGFZ^vc69wFXc<cu;}P|Jo>qTR zp_}5Jvtk5-z_-r2nF8t=r+kw`;(s;3q0$)jbOZlx@(EpIpm?-u37IWl9zs-pBJhLb zakdN%B~sj9{!+WZNSmvQC;lKo=Oof`*@k|WnGcg8Ye!zTK^!Z28Y#MtVK3N%8$i8t zgywecC9X_7;p?Lj9&KS8Rm^%U-JJW+fktAO!<=`@J#Lt$S!h`5W8kHCR5YW5LTpa& zV_~0C>K+FI|2A#X^d~{|LiUI1L37G}xRZ*9J&xM`tDlOXzE#R{PWsuacWdjuHHJM- zM(wK$^)bG6_XX`L?e50cSkbq3Jwj&Rf|f?Nz&!oL`|E7i3xl`5O<Av9Y+on|u5}a) z|7jNDsn+-Wt~J$MMpAs~Bty-jaZXmeNvz6aw@OFf$54DUt&aS=wrZEx-WO_ffHGU( zW)ZX4`8Q<0^!xr_mb}(A$F$&VnJK`_DS}MPM86P<@pr-jy?rewF&f`C4YYrEGE$t{ z3FN`tVs;+=L3rLA{$ZysjnNKcqcoN?1#8bJ@JK&!*e^EUAs?unRBb#{`mg~zyMi|7 zM7EUY_}j**T~BRJ8WFPn+f^wvEysnkoL9JO?8&Cqx*s@Y)IQ$dxnC6M6+-G`Zx{4n z{eho-rv(q~K08wcog%wf;bG&`P&3!?;PpKV+p=H2hYCLfN>nZJ1W+Zc1=t8G@#v*6 ziE>D|M@*APpO>U-qbz2B%MyHYHR5l5Mz-6%UCXljpKJ5dZz*T*&;6cMv^Y2YV6ZRu zIEdieq)o-+o+vw9VE8~-cI=8AO8D!?fsI>&&X_3{M%kQ=rO|Fq)z;JYtC0K67Jtw> z=L#t^%v+G+<9W<ImXo_|-a0V<a^t1D?nbm#OBqwMZnCUuL?Xpi2^ArEq8xTKSvMu+ z-;dZ2uli)$i{Zb<E6=^zMT>Ed|9*N~?^t_X`{6GooGSp&9aU{|5=VsszuAh)n*o58 z9&1#^{UrKuDhi~xjIwG#2E)^x{^D=_dgJT_)0jiwtbM=`rUWsNM(JW<QIDKV7}*Zw zp+4+{Em$8c68x>4TLbDP5`zksKOYgJi~}kIc!E1(q}8x^-H+d<5tD3VFOl-p#5^_* zX$qV2!t+AEkYv13@@)6}iMkUnoIm_-P9t-H5^aC*tLYb*P<U0W2uOMi<Ln<E=`#co zzgokF9%5tY2B^gbhEIT24)~tM(KfuXhH-r&K7&+IN+;KkW!8ylC%R1@JeE89pm?|F zdGlI%Fh+$Kr7Eb%Sc+597*x_ae`FTG=c$WlulG^n6HuQMt7WT{i&ZpWl03?Pc&EuZ zf!LLDVsow0uK^&6DoD@__`yunz>2JhZtTt|*c}k_jXo*z4u=#0GSm_@s+CC2Kz7sF z-65);E@UKh*h@H(%e;!4n5vI~YD<2Zx2EbWjNm_X=6<2dvTPq4(*RpEpg|>cUF98$ z!LeM0vI_l@7b>S4Dd`YNxewp~bXiKr@pVSu=PzTZi}DK@R;z+>bbvfCc>I_MZU7v8 zGrZjt?@f#fmjy-=qoTw_sIYhbD$^5>e%gRIK8#fQI&pmmnGjv1{7iKilbV}ZEuWK` z03j-A9jErtI5KrmoD%yaq8t;f6j$Lg_T_3cl4^_sqxujw>^U*qLl7MXFRm(3e;qOI zo~aS!64#_Dd8cpXxkN;lv&YuK>bFN4Zu<Ve;u%m#Y&pWOQ1EVkWawt3w_w;4LfKj% z<u{-r)iJIX0Pimt%~P6qyRJC|8Mj7jj+SeVYl7p<|F0?vr&tuztndL<3QjJ~Yknxf zS40(s>1x>x-j7=Dy*^0b(#2oMBs0@b1)QMt)JR?&Mz`EVRy`3aIe8b2O4hnNa|Y_1 za!zkDsx%toBWBP)G)bcNlP}UMPWz^7JDB`L;;qc7?e8;ORO$Sr!clxrih36XHR~U# zfRS4;JkooBHoTu(r7=xwtTSgR$L3kP!jSaKyx0Js%Z%xNw_XE7Q!vAU&yk$VaDshC zm=7<_FDfCBKoamZQLQ8V+5>M3(@`rqO<}F*roqH_GYxPhd+{eaY9Dnfo7V^jQ5x&8 z^??~ar(Ht+hp7AThN}(Og+DVGqmSNu@4bc?jNW^V=$#NHNQhBK@1lj#OLUSTA$spE z2%<-i9)!&2dEax+_b=>q@3r>2_jUa)b*_-dDI5`^{U`L|xumDl={E|8T}jSuNie7( z1G^!FJS`fa%N%5Iu2t--ISE+Q%YhiOG3!b4&r11ciLuYYsKkD3K^LCPuwTv6hh%DG z>&hvE^$`>1_Kd!$iHOs(4zuu+Jz}Y#lzKG`hQKPoX^de=0c|2{DK#Z2)4XBSywQ7f z*=vW-0&eMIQVb7Pxzg1L^+b}|b=-3x-YR7NjdzK52ttP-^2Q9;&w#ka&)B>58)-ww zOO|*OIizS+?U!o7@x6I#q@KNH{0ri!+{(`-#q%q;ATuPklUZbw;nSO;xLPPv!xWIw zEY7Z^M6+>FGT)f$eqlV=*z79iS886}T{5ZJ_ka-79I8dLsDh>?{F1!yF=QnA9pB%q zQivZDo<JgB04L%<n!b4!8y{$9l(;y!_x(nU)6<8OkrZlE`(12kG3_ISh07>e4*36= z()InR%*@!h_e)wb@fyztoW|y6xNzq52+Um5Wv1eCO2a=ShI8{Lee6c_v{f!YYN86^ zx^HANs|b1&rR${?iB~L0Q$t9bvMnm)692xL$`qPpkwY?gV}D=F=FH)2N+BnmGND_w zXd!L*cr3bGnV9Q>00b&Va?M1(29oW8^iHF_7s(Y73CoqH{FnOI;UB&zYXZA1)%#`Q zZ!8+dm+L}OhHF<w`LpH-EXVERJGZPpJL=^*COJ<hJw09gA#Tao4_PV;uL&6$da$f; zCHj%MFfsltVSV*@FX^r|`B918i84=xS+DmeYQ@Ei8ZW0kLF|+9>jKI3Z;hJtvMPN@ z++c))5A~i`)@?4&KOp%;HmbjvJ*VBsZ6@deG$yR8CC*u77H^>S&6a*f2>sLprc8Fk zCAL<i3=MITy|eOWUGRjY@mqZ^CL4gR2N8cC^iBhK<Nb)og$zJ{9vX8ATMe0!CvQ%# zuv<aNiSNfDWGZn)18sN5aUbsT_$-j*gabC-KN%M0W5?Hu6!1<GY&TZTj$o@N4L~-; z#$4c9eC6{VyK46;;~nw>woqG+PmfclNaxs17!~Ex5KEdiE?t%(55*RjG2J`QY&)Ev zXNpLjvWdzR+V)1;#;KSR4{Sr3lGlqvQi~BZ4^x-@EH8Ptm2@1UaUw#6usXRbU`ZJ2 zR1Pid2^-uD&a14^k0vN=XecOhW>hOCpHpkW!B7VIv<{ueBtXu*`hHD%hwKKUBmqNF zO=CeB@^zZF(<h~Nzfd=tcZ6og;M4XsF5RDL43S`~)s6S6PcTgMF!&*Z)?x3tNJ(n7 zbf}#^NT1_sT)(fYbo@#E+~B0ZFw{W~wk@Hj-ld&MTDj{!;l!<op%m~-?Wy1{%It;7 z7;hb^s29W)=u*eF<u&1~7X2&o$uCQ<CBC~~Mk+3e{PtV|dp}Yc4jK!Jv34IJ=Hd_+ zBONW?+@IG>#ZMNpBWx_PY;hD>u;p&&{LD&y_xdBu<ZYQ^G(gN>+Hs#x?7!cQ)(*_p zvnh83fErP*ZyWXzzQhs5O#kLe77bcWU9hti4`}kyr5f#}FD(wr330Qt_S-{Xj&>ZX z!3e4p%onXO94mOwRUpcCY%RN~fRyseU6N0MP~5Kv*~PkyQ=i?_up3`C)(IUtS$zEn zLl9iX0Jvfb4>~>;^VID^v9A>e)t<@=9|XeOZe=`L>JB<54p6)M+bPa3EsvDXV+K{^ zW*82dFMhEVczj5Uja<VICk(UGK-89dB6jfwr(6p{TP8zGkrWn7Ysb|GZa*33o=Vx< z-<5mQa1Ny%s#tt||BR!r;JEIoD{d8gruF_*n$)*t%%)?Ap9S|!YwS+RMrlKh7A=7t z!AA6Ytss{!lRf^ZM$P5&Z;LA=V3YlPV5H^{O)?|{{Ern~@9<N9!3lbPC&2$VROlgE zY}qpYPXKF2T<x@w)MBbw?Rm++wcSjKC&Qb(gukG;f^`Ipr|lAFmjkr}uQk+28z)H4 zaGJ#?70(1hPPazRBDVwr59<`Z)b_<qGfE1a4%qW52w~X^p{-R|3>ys<K9O8B2)Rqg zyPRVgCf<e$NUW>PZO6E(3-eAk8U7H3zK{j{6X!NPmyEecBW33BZSo&|i81O<tVEN} zDk}Qrg5AA|Gu>zA3gg94x#xk;*8^X(Em0O)KYlmg^!N+)ic7X)5%upPTHjmXF^z=v zm)kVlvfnR_F3xo&uMAbMj7+bLov%z@p|4D1uFT$DnO9s{e7>?Ayt4Z4Z@eWXJld-M z_v#ttwJqnh-Jd5-&E8~(dWx0-_OGs;W3COqJr#8ikpFP)GI;IrJwRC#0iXEnMXBk0 z5l~J%aGl+!@wHFO4+4dEnQZr&UG|yZ_rK*z8B9@rjqHPw^;@m<Tk|bT!4;XZ|7>u5 zyHJ9Ww9K6SxQ=qZiIx<ihD5z?1*@ugAm0VXQT8GWZ~7R<H?1@ekz>O(S`i%s9{Fn9 z_%2I+W2DfDTspZ-^jK@YW{w_W^=SMj8A*hZQ<TGPwug3J&1lG*p*UHDD<+4|tD92O zU>8#}^~z}9RxE++I)c}Cm4(3-G3ekbd23(A*{AD^Fd@CaTHzAfiINY~QdqNWYY8yr zIO$b`Cm)e++6JWBwVmm@cVw@x+a@~QrW~H%eZ#)D{Z>oQ72yhqKV*5+J2>Ahc;EXI zzxeo0{A%%E>-=)IK!W2|vEkpr)9E>xrSK?*f-7@WW_;K)yf2a!md9n!*5^(j_upe4 zT!=s_m0-4fZi14KAF6Rn^$+H)AwmjkdsnL`s5dL?){?d-f}PDWjh>t179^<1;M2&1 zwzZFP4{TW$E8dXVu;s-+|9%hpli5U=p2oPJV*Vq4doKC*k`a9_kM{K0+I_n9Z}F#) zMDF$^G~S8u$He9W2nk?$Dg6XZ48Y`b7JOQ2_ikG`3`r6K^JN!?#cBKw!_=F0wN69I z*W`rH<8Ah5@R&Av?4PrbWs5k^)VN-7OytYFIzQUK;G9A!#*pyy7)I9GdFr6Zvi)2Q zOEq#vWK-E0c%+l9FNMCV+7bF9L=No9RSmwF0X4E?oh1xq4Z!Y3MnT2Ob>6`(29E0A zi~C5~r&f5&IVTDvWQ>feC2=$<pW*7#F~8zZrLBej-d+8>hiTsIGOyy0pZL?Xq}sIE z>+wk+EjBsN)_Kxi<51@g^&4_TB263YM9ZJ-{?6w~5;Rz;3P`5qtbS`+0JB?p|GS*0 zq5{65Ox5-)k7Wj6JYI<I@cLl=RjO#)_{rP-EZ{UT>dyaXUn1)-sxvI&?S!qLo>(-2 zOyM{@txORFGK-|IkEtErDNuWsKC{uX9U^&6{9cGzhq!!h1DWTFB#C9TD<y`~cIril z=Xu;PC5kTxvL;C%w6ca%kPK~UJuPp+pm0by*H(k^w6UdY%iOYMwBS&)YZ?aM^om{c z^<rf{3%+H~wvCf^%3w+h;>dNaZsW-FY`^8m_ZgAqeDA*;#90t@(8gI9vfuzhaok9A z6={NlD^ZeI)iXsh%<Yw$tTo+bNy#Ma++|5mbN31p*P>nES)G{G@M4N!o@y+w5!Z?u zu#F<LsD+eBP<I{O!mTA`#)^xQs*}m6D?W|<pj|%Wv|ld}M8nevBmTjsIrXXK$ZeA5 zOIpjcVs7>O(p|VGK<vn1jMibXSS!A^6Sq#I+sl3H<5R3B9`*HWcV3?B19>E0{+?XA zH!V9^R)13vw-oAL!%YzU{IWb{5vS(qSECYARjc3ioMQ@;l-I<Kx-^1AT|+`^DCe;c zYXq}8(#>r9;r!b-tVujTkL!Zr{V@=x68h%oLQ2NZTUGRYF(Q#2+=jvv7tHnsG2D2! z9n4CNeil{nrt>9|$cJr52puDpMum53?0Tk@8Q=TCxn0ITeh0e1T83AwHVa4izIgPk zj0cj2t<qhg?=R#Pc;h{~5;ooVdkzi8J?f2U4{Nu}4ZNg#@g#GlzU4m`6Vf`;$#dDc zvcr?vE|$D6|36YK%t7(6e(=N(@Ud6m3+h8bSc))L#x%b41Dpg#FiBNDK%<!nh?c3W zOpTH3f|d5rxFr-JpOmerMoPYOTo?-ZzZ!1e%gm_~Z0g)TasV!J?4l2cFQJJ5N+}-< zy6NMLQOOSD_lm`^QtKx7*Xkj9IE`dHO$85p6%6&^wy|6zp`2=+g!(|D&K5v&`}&i? z)Io)GFsj(=Y@(0@_nr-ncWsfwLjKhy8^sdul&G5yUZR5Yw}i6zq7vgCg<te4foEVn z>p(+H`Rob-?dNuJIeti5<$$zTcNFq{SDe}0=7;vcem*bamu1D8+>gas;|v9Q-uw6v z4zb6S*QP7|4ThQ?i0doW78ak&5UC$3qCC6nS;xqb%)u5yUuqju(|ao(Rg^^!K1e=- zY%>AHBW$Eflo|FSmD*>p^#dIFXo$C2mWac&1J1Du{U9s|8xSqi7Mt%;f5-`h1P{kH z>!X7%^Q-<oCYA|fy;8Q)Fsk<c4b7K@_AEroQDZ~ndcKo2<phPT4cRx|+3!W^dt_ta z_Bzwr9LTBv*_evNe}CZM9BG|0;UArlO}v4Skw8EK*?@(qLfy~NExi~yw<V~5DK=hg zsfhs&5p=j!3jD_xT1uc1#RypisA41NW^v<MeLKkrJ?Z2(>Ash-L#AYVT&3cFX@ z@wEs|SXx$iJoi;94h#k*#eYOFGnwqygw-OsF!jjhoenaP+I0V>3@2orewPlnat4sv z4Er5yrC9X63QDiqzTY*ik2Rjl(XW~J;F0`jF(HA)14*cio;bzk`rPAB@iJ=Oa?35n z@d`$tSlK5TmVzM(Y7r>oalNZVEpkB+m>HEZoJ_1alvC%FR3g<v80>5byCsA!y%=%@ zr`R!Sbxk@?$h7rGbo8Ukhy=vT^z4_-b3t*<{$1Sq>IZ1Wegi~ftM-s<vW(2kGw~Wb z0v6#|P3?~yuX0EEcR!U{wCyGt$NiA4(;A9faikH>x41GjOw{cCID&)a5f~+3w-L*h zL)mel4MHvFtzF?x`$fz<vpl$h;s7cvd8N_t->lGZctR!62C3A7!S#<pLyZB5gHka_ zOUFFGRK9`Jg02t%wi~^ggdxsb?h$wt)+dSA-Xvx?m8KjDYVeTmx5pPP$Tq50ygEEz z`gcb3zLM2f4`%_X*+x!0pNDiXe?3wa+w`o`gHmE2Haj(VqS>bt)B{A4v98Cq1P;HL zaR}y=Hf6*kmz)qJqK3I|xR9H6ICscC8}#iv6*NJ)P>lMR9nD4dkXE?}Xk}#fw3xCp za+lB5{GF?wZ>9X5J#9r<f}>CgHHMp>0Be$3ES?+<K7$Z~ZbeOpl!dB?3M?FV>!~j- zx;HttSEV^#o?G$6YTvr8bv}`!R<ok7Hu}{_C&x>_kF-0cTfxIieF8Pz_Z(y7ZEacv zFv#^Ugw{|3V-y4s!MsC%id5Cxk=6}1u@(K(rTX-em^<_yLC<{jOKRAhG7OV#bj>yF z(S%U0U%n`~dCW?W`4IYLzueF1Y>_%KnfO*n`u-Ym*MIp}C$O~<hZGeYuy6e*q4L8@ zi-_fS?V37s&yYjAh^s1v0)Me|Ja^XSd-Nz;<2F6L!~K9KueKM?WBS=Yoab~a@Cg!x zPqrdW{0uWY@n9+jSx}7IsMh@}GBrV9^ILHqa_`SHRMUu!&7R|-1!wEsxX8c0rSa^o zP32puC~YB6Zo;?<dy`)a#(ni~y*T<qy+)<Wgg(+He2FP}o#Ec;(K*S6`5vaq8rg+l zcF6x;ZylS-qR7U|JS?7yZJ0S|Sy}b8(=Z(UH6jD2h)VA-<5{KaR#9+3Cj1|!*^EKC zneVNjW9T62o7_q7-0gdmO-L2`br!;|e1-Je&4B#V^Yr@r9no*M6K|hhmN3$ipCU+! z6uYSj5oshI2+xDGe+O<v|IR*Fe-K6|oWt&JNd7Dq(_g0yFvB%&a!_G}XUP6Yqtlqs zA;+7qYX>>VpEVsT2mbk^#v><=rl7Q+zhX%T5yp6X;dgC)GykiEY9&^c0$5ghF>~qs z`MNu*)Zi&yjF(ooK&BkXx_<~>qw)N~F$6D{9z&w=_R8$X+4S%6_%Lll_+pr#kfO_Q z;a(LyArXmR+9Sgj3zAs^frjx3X*+CkfCG=ZGZVoA)5S6UubtHofdFO)b&-^ayB+P( zuJ7wN3G!Th&F1}2#sFd-;UT4o(@cp9mx<GuVSkQSp3VW0a})pt1JvA)j``f=vy^7; z5x=07VTH_*+LgimXO!r=6=raru-pcQTmFzV<r?)SYjM7BP$s$CM%8w1+7(SP3czp~ z;gYg}C#!p@rF#W~<CRU`(U}+X%?LVlG3sHc=0op?Ce?xV_mLW^eu`621J8XM_A<qi z4IL8&N*0RIRiA>b96CsJK9@=fH%;F0Lm&4V{dg*!d3QcXn%%f@QH^7cAaw*&Y#3$_ z75x%1gB)Dw4A&TeOPH-h|Fw%mZ9I-Gjj+@p-nd5wGb|)Qu@XP>YEM7HSaHf|G0JgK zhR67+$tD+Jj+{BU$kk$PZ1I+7384Zt8~C}o<ED67X_C*j*Z~bE&3CB((tXhu%G-AI zJzLc!KnfW?i!S|%cbTEfJSS(8X)H!EC%mG(YBWp!9uKouFw7X62~-KR(+aQ)iLxRa z+19+XASHRX>q$v&vB|tl+B9v&8uy%>#Z;@B{TCpQW0%S##L;S|v`Ltj{hG!sOo>}c z8}pjj?#$%H)r?-~Hs|dejYvM<(!!CjLl~AmF03aERm}X4#>9?!oq(EkdDVD$$LSxV z69;t@kT|o=%Hn*{qF{4)UXS3}yIj`-#~Jp*xdk{$LX<64@f?S;geAOThG~DD*m|{n zY?Qq&N8BphP8-OuLZnla9f8#)n*kOn*E~Q1_%2i7%TAgUlmQ*P>T8b11@vy<=YfQj z@7PJx(Xs4~p@yd6nHm9Xn&su17VKI9rGYb?9$BO)q1+PT_|O8AP??evb(Z%zh$pAv z3=KdLs@}?_oT_0)<(y1b|An_u1$naY@-nP`<M5~OzVcP<$ugA#sKQfznlMFH=}n8V zRA<L_i%jlx>2Maerfs*hov~ZE_{?%#Qps)Gp4i$iG9WH<+CV#|D<N@Jn83)(E`{lp z2#FLBzAW8mb*oAUC4nn|MJh6eZBnqs@@);W`zi)C#ERBZL&1N@oD!xi({|c!YX(=C z2pEf|TCtYX2RpI8*C^MH-r{(g*Sx|tWbDKugEH@QB)j7(n4{=S;r?(mul!OY5)c=O z)_Xr2v_x<VIcd?Jl}lx9i{KM02S0w8>d*GKaHe&<UwP(~$iqVJwmaTf^=oPL);3;v zVMwj#z|75Dg@bs{tgNUm6SWLBf3|kCq=ma^$*-r3dxLl)wQt%vKrjKeuq&3{$oHpK zZh7fkzpGAM9f!i@jc>uc?tc#Ve(sl1=C0=MZso4h6Wcjf+U;ju<aAhM$LnFWqt}-n zbMw4#+pRjRqWV7eE4ZeMkguDfrkjDUhl7u-*c~@O^D9^x?9t8Fr_!fWqaAtpJLKm( zy~3+i%s)YeJv={~ui+o>Fv}wg00lLw1Ch#}$dS%Ij@vPnF8C;}`Kv|7f3^n_==*8R zfdema#2AU%*uUN}k)bJyT8*1hO^3dT@*d0sMs%vp5Y6*posISrOrrDsMu^QqILm0L z`xnUUoog7Wivp)dWT$oC(KtCDV6n`L=btt*)1VhOA>0wGOYL+!Bpdkj4RFb41Sh3- zsrWbqa<X)te9EuDsH66ro=6+hYl)$*^O{}b$SNvrXl3DeHEaD5&z>{j@2%$PSc8A} zI&6D+T-R{$oyD`tuU0b*%+|M{X;pyJ2Vl-0lo<Ls30hRn=wg(LP+bSX@4Iw@AwTbG z1AFR@f`{w{>UE`NHdQdaF?+PRelyiZ5(YyigH9~&y-p>fhPaqXLj_LIw^Pms`!C-+ z$JdPvWsD6|MN+qqA<94-WD_u!k`OM>zqtu=TrNN7##dY2PEzpEJbS&hW7Htru_65N zQoOdEv58XVDG0&z9P<x8?O9pvITxl%he)}6)%CF#4`6~tB*9Ylc)QpOj*v3!h||>- zRSKI3=2FEI4qV1N+p7F9>UBk&8^oXW+C^{}HD=h)0l_!MMn`q0A1Z~!+Q%3Cv<K?? zG}QaZo(Qj?`u=sk_`&957*<5pUVLrsWpm_B^xY^Lxrdwj;>4e{h-EWxg0qQj@?0$0 zCLx6nq;#8~%-=J`sm!s%l6<}gyx_yaX`QsLOnK`SM~5du-^+r79xukRNxt^h<%Vbg z)M;+>Vf>v_aYiXZGszF@$^R1es~s?9v=r%F6emN5IR08c7oU2ZR-=I@fW3uX>V~*0 z&UrB62<JRcG$K{mSi6s4q}gG_LJZK0?OD1PfJGl1f+~I@J268GK%j+oei+wr7&(47 zaRX@?^As3(PM4gs;_U;kWZ^BqqI%7RYmF(4-6iaf?R;57Be|X@Lo2!I*sQVft804J zWk$9jOkjys`F+^Nt&e~iCmqgW+*c*R=^6DK&Sd@;I;=|=rwAif7`yFE8MsToe+DLE zKq5uLHm%Gj#a4Vu;`orJ0I5Kwq?u;S#0Z_GYD8)%T^^yo!df0)!iCskBU90sxLI>A zey)+o?WSJcIUBf>a4zA;mw9R)+0#cV$Rc}))d+YW?c78$Wo$4h+9v!FQ4Jm<ImNhg z8k$jbuwU?%G2kr_*!;N1(~CJ*1SnI$+0nmh<a_XeWonFenn_)MgfCv{jyK_Rkts>f z#lz=_Ld3LuOolu%<m38BHs)YbO7(vHTG&1A(=Wx|jr=mZ*11X&j5mUd?HJZ^osEQ3 z*dQq2+BDE>g>jLeiy~r!3$qzy+z?!cdU36;A=*Vn5w2d6ut=SM-Y+h`Ys{UWAC#`~ z9EZ>Whu}VNIQwCf|FeO8%dN7OA#sE8rQ&<`7ieJ$r;V*R<q903t^8YYEnq;JkE%7t zf}Qw+y)s2%ZHwc6ihV?`Cl(AlEX&1~d)~+j?()gB#l%_gqXlswJR_i9$SFw0%&DX6 zEbh-6c>?Y4CegDCAr40LR?T=fAjU`~N-GR{HUq-e2rer4+uqNnc^6vy?C^UZglI46 z{m_vjN0Pl{kleV(?kPOZEhU-#u8DK`8D`)gjRfFkyMyJMrAehzf91XRQSivul0Sm~ znhF7^jI9F@K+5nXR&nW|=n1~Kj=0Di%%zQTr$)8PM&?h{6ey%YWd;@h?^)uCt1%g? zh~LR4;AX$3vPj-$LdvVGyiaie?gG}hO!T=Ss?rS5kgbgj6J(1JZGdsHDV>CxmA()^ zr!vtHlOa9d#dE0Nj_rm{VfxRACjSY1Yu(3))fFnSC8}szox9!8rjaJE{XUbX0L#MJ zr9XtPTkbTRmZ?%vSNiqfLZ+og)=$;?pXRiFkp=1|g~}FAvWiqVxz06e=2W>U92Sgl z<F_Umc~A1IgTNB6l~Iegvylq&+2Kwt@I-QQT&ZrVgdQ0!1u~CEuAb*?)4u4fLW`t} zXZM${7|UM<|CTyJrADLR>s_MoUeZ!)`~*eWAvFrFYe~!Icx-Tw<QoKoOL#G+{R)P_ zcqB4O^+N?~sx>?%G$|Fg-7BqB9L;>2(LC}=d8KbY%fHexAOYrkgOUCcq$;%7M3k9G zJlb4=-xoXh;SFtY<>T5X?YH+oX7BIYefGa-SAJDaO3iBHJG<?_9Y6x(zT^Q2B0(>v zR0rn2%&x-#&<P0$Vti~mThVT9Vd1Q^YvPq9swU)zFD42SDw}WFgOv~e3VU1%{iq;* zG=uT(rb~2v=A~Fnk2-c`MdU`|4??agSt0J`J4yOVjK0ChoDrQ-Jcf@6ZW>zeLFdhr zSu4L}d0gs8V?0Kf_K6o$ZC-g&$K1ED8LTF7uO30N%c}e0`_xqHS2_Qw?hrDjTaM_; z*F8qk$^#B+S#e_{tG?Gpo}#gFukBZr`vB~h{QejfbE)#$M(9?=Pz>y&#v8XM^`QaD ze83sre?Ry4XdtlC%1c5uKm_=e4YTNhWm*Igb8ZS3v7K@}5vRe|)@i$e7(s(6AJfA= zyksiT-1XM9oqndYx!RfOG$-vmNy8f-RonsXLU{z3TqeUszeF{a<71G4t8%%#A#NGf zN7wm85YAKCGyB{QM=J{hES`W$6(rXLUGA+|nZ^go_<Whmtdo8cOR4vjU*5fV{_QOg zJM?bBV?92C;P<>`v$tKYAk#O<VRq9DX*{p<!q*&M=gC5a7z(*uKiAm`{R)$gTz~iP z^|pgqa(UO?u^&g*20GAruT)n%5ZIK~e_jEadWl$_YUqM4Iz7!l`5&&JE<2|5DJlr9 z?k*Gib4ZUFvOI5&5<~KSA?f!6OHMv~`0Qm><9{Rhs~Mg2>}_!M-F$qq{9nk?WYu{~ zyi4apwnzi_4c!Xi=aa9RzrR*<S=D!L-78JXSCPDVp>Q@3KlKU3oxr1XueW^)-!nN9 zQeL$(YUrkLzSQgbskPFma(6^}+D71?;oU=r81sRVtIB#;Lqp~&)j2WP&gI!x+h0`i zz36QkVoT4TsiN$?bdjMcygz>;Vu(2_AtCxzc$|9F3a2~$ykvTUedmy5MC9!LLRqxG zMPK77&U;aP@kGoq^r$NHvG9moH=fYg-gYGMC>IucvL*+f-0vwJf<&J|1?sYvam^~L zGburR<14LWFzZJneOHlbqYIWy@+sXP@TTdBU@QY8wN;0PNe#~jVH2I4XWrAe=B1zD z*2K?r%owGy^v!l8v?-SVW?j{pSa^nHS!%saXk3xPa!j6l-ksrR)?LSbt|*Vt&RFG{ z);3<*=Ha^@(etGjw{i^9qBIH;)&AW3yp7Fl8s=zqWkf*R*($6lh;P2Y^6EiUPrJ&K z+%%4|_QHB%CH+%_E4i0>FG8NoeEw~+GKqc)waWFbmfU#y&uAYVDJPG2Nv7;2<2<kQ zTuc`}tveM)pQ9b3xXW_)lcr03-4V|_Cn8DXZb}J|Qzk!ZK7D^m?v@ucaJ!O2irH#! zgn0Jds4#aS@K>UAlFV~@MBVbdi*wZSX4-s<fwyy&n9;8k*3NYM`X?P<oY;Z<mZGs{ zYW;<tY)>jLXALF2{O9!7#J=`-m$x}}euG2*L?}G}bEf7jFB`aSdnIQtV=f+ev=&8| z@3<au-TKq#A$rQS@CiC6kY9Pw6eHCRvG@9w-I>?@xjlABAn)sm;I&meM*lxMrt`+T zo5>Y-e@f(4*LEHRIYa_ob>2P{(V0g^3vEQz`W$Up?i5pgd3*Na_2<I^djqEwQd!4{ zGwx+G=&w9dbWlp<0I@9&byhwxgJ48W+yvrfx=1e;mit)=bFhV4gYc4COx6cljRbNT z<`d^A(VC=m!dWH8e<|<_`*%1vuN1QNb>fst@yG>{{oiefZC9r4$h#q}f*Qg;!uVUe z(HKnv*8|qheyr<jX01{ajdId(mL<0>PMMR`<dDlPMj*AC0%2N8l-M>inyYahwF9jc z9eKuwpcZQ)PDZwDvu`c3oF~{2ST)#xM$M>@O))bxra0*TcRP_%?6PoYMl0%++32Y1 z>iBh|*Sbm#e<}X;hmB2|_%un&bA9hGZ?Y@AZ3y&*aI+h&hH<iBouhPYSjg5GVY*mG zl6wT2F|~oU^`*2HFGrM9i-#loi#C2UlIVAbWZI7_pv50z)06t&q+t4HjyZ;k6qMP` z;fE_E=E(MeJ8dxK3WW5!I$+=`vlyjqWM2WoJ7NB1A+J1+#^$|;TaI~2fgOfeO0H)C zHM^6gK|_p$haM~UGuJe$k(qzgaBu=uwB)@lk^LSPmNk{ilM!LOnCvdBPfV(SzM?pQ z+AgL>AePRoFdowzCUSH`weet41ff+QRy!(MT_+6tO_(F=|0EX=5IPR?m@GqB65`%5 zPU{)8?*QQ%I(ktdbBMA5X$6WkVGI`!I}ZAk53)yyM73O|x^Y;IontUHOC>AG<Fyf4 z|A4DFc=@C_ul6VCFS+#b&S|LV4xNA;t;PJnWWe2MAyi@1Vm{#0$H^`FGjCNvAq`b< zQR|>M9dqQ|)%E9Y@mL%rp4G<8wS;(}itr^WTD+zO(?$=QXD$W%1)!IW$1H+o00nuK zvFQOn9S|qk085K){{PA;a~_cbkY)Gm{}ix$xEVLC_B39VG3?b7>P&&2*%&fiPDMPH z$CF2LVOZ|--9GGg>(3q5iRQS}BCcRy?Y;;y4nQMPJwFxmo3RM_R|BY$YfV>MV9UwN zLXWb~oKz*B-i}4BZQA621Af9YS9CXaiy;5OY<SxIj-3@9pmUn$mcK<|wP=&UF1*9@ z+<e67lL(eOfWUOjL0EKASrFtMPIzz2px)JhV{y6w$Vj5c>F`#$tm1GnxW=+gQVzl3 za}udAuQext<x|T-|F`dr<*<UAP`0^5=O5TjGT^qUQG)@I5fXZm#st;DUY}JTLc;JL zwoJjKCGfu)o*3EX)kWS8>^&I?3=qqsMC33>=GDEC(cx(4a;W7OvaL-q0pHt0vyrD3 z<iALB=re3-Zq<|=tc8x<o?9-@Netx~k~o=4rD1QM4z^7uCX406z-dD&Pnvw@o<6a_ zo*KU398VZ$e^f<ziC-P+KtXtn!QD*MLk0?H0G@MpA6EB`a@s%K1Jb!i%U0;-$q*gb z-M);8bL!^f{wxsgpd1n{T7~pRdXQ1q2Yf31IqZ4EH))*WSmc3nk9v6dHq`S|{aSWb z#`lBxf`HF>xQ|<H#KsRA+k5JT{WIEAer2O#Je$#KgzK7EwT8^NicCQEgAE)$KLtv# z>!o0qXa4KvQj9>@9wY4dg|JfT6qdqezhM4p)Ms(ZuF5~~xwsQw!Tc@f*+6=!g56#W zZmbk4RfQgt`XM6j9d`P2bok0Brv}6Bx6!LHg;9GyiTa?i0@N00p@b&=DYE?4r|En1 zyG+wF%vcD3g9I2siV7pBKOGd81?r>M{xaN@6Ly`xWxNMc_Z<)cD`Dc5l%Hj`GK{eN z<14l>g!3-37lg3*7($?}Sj*(j-Sv6o`7R0Au-~iCc%edCXPPb{xPg!^Qrzbo5}ej( zXeJV31I)8{aqY(){c<>_)H!&l&#tfX1+I{@LsHnTgH6_M*4XeBhpV+g@&X6AStQvV zw0ptv!ZBq`doNaEd!2cE9qT{c(Y8#hhsoj;OS6aH2?{0^0_5sOXaERKfbE;GGCvp= z2=(Yy9*vw}>8wMBfE{y(#MwL(Jqko(F6>4qk|qS>-8!>1C)nTnq{R;B1VOnHMv$WL zaIUj)Uya*xDv`y+cmPAQ{I8dZsmN%?{2yxB^NaApo2ZxbDTh0$O;mH|<LFRjND8*< z(f*}SO0l)qYn$U2Em(`;d>H-U7h*(<S$!l*r&mIFpPgLItO2AMQJB9}SOZR(f;Ik! zh_oe5hycTiXkJ#+n%Gw59*{40GtSsj%kYn<tW({0(`P6^Oza4UH_jL~-xv|&6K!It ztP^@nGqfN`!@@AZEChc}u*Sx|NvL5!fpctjn*|$`m@M?jGdiP<ULFPd2LwG{v5cY( z*@A7GM%|#<=<X3W`4#coPo*%u2`FCU_q{>T`ypE`0peE^#ICBuf{i;W?j&dXn2s1z z#auyM`{?b*g%_q07N#u^jZM~fJpKZ`Nq04ybg>6o2O`!sC^F@UVs#3eb8e}VR{Tv4 zUPX*uRGxw6;9f~4Y$%G#0hpQ?X)pnhJV4l`T@6LVBvf4>D@!DP=i@dcB&aFqLF^2a zd0v-v3Z1{@6A>n{W2V_O$pEpz!`asGS#V#-kWBLXhjXsS<PVUfpNa^I;vg6rL_QVs zb}AOvgr_cmWO08pZ=N%sun6W433M0;GK-2F#!3Qe1RFd>T<mh=3`C@xMddC;6-339 zeZ|z9#k4QP^hL#un_r9A;5lui4l#LwMfnY|(*QM?cD~}KO8<$BZsC$4&3kug#S->t zDbonZm@Qr^hIHlyXTxR>k_9YNGyzV}&>ChkaLp8(WhzaVu`I6gD55`7pqT@4OU2eO zY+|DjcRcA_bLn!oAXE(xZ{()j=XBPI3$7InfTf*$uR%lxlk8x#Y%+_ydocutpgTg) zN-_J(pzxD67|0HpphgPR8CCfj3e4^XkFqMOpCUoAB4vw$sUloZY+OXFk%b$8gfY~O zR9_bnO>rowk|{k`P%_P64+l_S^7w0Iz@-&y>qZzElICP=)#CkFWsMa1H<;AIph)4W zbwNND8N7;2G3WA0PC9!6jJ#l-NdQJZbbyJ1kwaQA01D)DWYA8Sh@K4^s$mPk2jQyO zLUh7#=EQWrF#&7<Iy+*3y*ZuROM<ye5}N&-Pk!tcm&#~nmHL#YQHp}W@prkP+)^CT zPgQv>EC7y=a?HgadK91oOvF>OT$jVF$uNdaTaENhECYXI^aYm=3?m<gCxc*;&1APS zHa7QX*O}*<5i}uUF*5}jDQ6m`Z<<;vVsRm;IS>RMkMHfcK@c;cB7zZj12cQxyvW!h z>WtzNVDU#oP>L(J`pTl&-?C8L;;$#`+(*j_a-1$>t6MkBnl9Wf6r&UnuM`GZ%Y61t z+{)9|N}2@>>8AK>i~2WjDP8QB0mM7G()`6o&LCkY9d1!ej<(cAVfMfnWfkxsMf6r1 zB4gtA&E)pe;-<5F`qC^~g{Unam=-Yzx@JTE?^2te8C1-q-Ce9}Ttt8i!UYk7A0xUy zP&oKK&Ik%Uj8qJU4U#?-PPUD!V3wocCgu_O^Q+9~QB1<IAW$^S?Cs_)*})H*gCZV~ zNB^~{@ik}0)ens@95xC5tpKmvO-vf1t-fm(Ym}G!rf1CNiHoAQbhu|G$oo46=i4sY zk;yKG157I>%KV}=vUffux`M%7^n6}V56*m8U%k`@^iq7jk5u!c{!FJU;>&-+loa-p zY{c&wu-?Gb*K&+{R2Z+J8*0F8%LxkL><LI@-SFN(|K?H*91UQVk;Gv#ed%w5Md<NO z1wjL13VQeIWz`>F;u^Q~i<|@-a<*%%gmsdkI2=157*IsOR-)@D43M&c5&|J(e~3M< zu~1>8|1L4Du9<Asi2>bC{;1I77Olc{-KZ<fngDhSNhnx@>8P9H(2e2sK}9%jaat;y z>qxn`MuiS)%Be@5HoopiBjPfyesLh|_K1})khSta`N4KWN(vxrRtF1Yctu=Y>K64} z?8Ej2<7HOv`nr<(WyHe<LfS6ob@mhTBAWUlLK7COP&35{v*;M9NM90?q}C6eJmY=U zM$A3PB2hqOHqz&&8lOKLp;6go78jd62Ps1HrXlDsrxG|9nPgFk#~X>avn&HQj231h z`Bcalyol)$!#_8S`23+3k|a7^U^*|HkqzjCAUg^5x)+ReP8&&eOG!ta_CqUe+_s0% zIgN7@lgE5jXbU11pa*ZG(+pa*8uYV?d7AsDONKXfzXY#v04o4UbtJ~>m-Ft2M7red zeRV9uwb2SiTPox2ePmG14}AU4uh<3FNje|ddEU3W>u+oUxO}!8W3L2mE{SQXLWqFS zUC`q_LPU?BE<t$yIJMp&0Tx4%x@S*VNgKPKw54wo$&@Y0CXBS*)xH+*OH2HhP{pod z_jZY!pa}9lCaoT}lAfmOP7}W5!zFY_lUHX#1~qLv3Efc<?`YU0Z^r`fxR6Ze?je>; z7f$)Q33`-CqYHnNnMf4Tce+qQ&~3qd=Vsbo=3^Yu6UO*703Y1##miFeEJNs)OXii! z@KUCSXOu~-EAHD(=Q&<*_cY5~LfNxmVLF=X%+u1H_|EFX_9pi)_$MXZG+3u7#(&VH zzX7Pp+%JpEwO7zO$xX~Yi;~pba!(8FLf)e12X23II~N^Qs}x$jVPj3}3~JrSU3M%` z%U1m25C0SxC2VuG0N?=B<L(1BhE3zMqDIC%23hr{ATmbjAI+5f>>N+P{It#DzBuCw zg;?7k*;zh`eu-G;V7EpwkW!%8z5ja5loN>bfF};<Oqju`v=td&{7wEg6DYQ*(>7t) zsE#5iauHN?;qCOaO&woa+FDtT+N34JF}}{Z2-=X-^|*eI##zh@S)~je_0#<p)KLfs z6R*^qzUb_r44bx;5WNVyX!rM|<&FF>%`iSTr8T}dHvUF&1?(AteR2Yo1(4Cr+zCWg zRgn<36<lq49-d5@9rcKQEjrM`?hI_tjP)!K^#_bluj|&rwC8YHdIhih#UVsfMFdHI zSnS>mREW+=91qYZR-IqR|EX!ZKaziOht$3wV&C$lmK|U4K$8*lCV!nyQ0P}ityiyf z|410^__|&v(Pw$j6n>A!a<K|xmmL?N7+1E{i~~?~+U~bZl8Z3m_KdV}7Ek>CT5pnz zuc+{8)`QUMl0id3<owO#-}@GAz*Nx*CiH=k>|vaZUKHFhC2GmxPAkgBGOIL!19|pI z|MQc4$yQILIo)S6YUW?Fm)Twb7Bs_WNJFMEP}8?7?QfZA0};eYK>8-}9IGOXfYlcN zhv}lFul$=>QtNMkKqy}~<lhlic2`~g1M$?Ww-=YrKg{!+Z=sRb%spgstAF#RZ?Sk_ z`9zz`iMd~K?%n<zcVQPZl?wt!v`_E5Ggz(006OdVwIx@d9zdv#v=$aPp+ShEImXEY zgplAl>cI^_JvD)5fxfDKeS_JMlu7nt>)`zZ+dFn41{pzn)hz@yMUm<7>n+6cRx=1w z(Ym^--T(Y}=0<zlIkXVldc)wC=f$(rxnupdGpt|$9b7@={^HlP_G;X}J=^U5H{#>7 z2|G`o68JGqdV+jRd$5z3X);W4CUsc)h#8pT4m&!*j*@^%p85Yn=L3$ot&fNiN0LKF z-$GfI{~d4rb3N^3>w6KgU|n=hJ%?uatMl^Imu-IZ`czubJ;VF7<P4Kd9&pWYveT(H z_!Osdgv!N@Y(N1rp;LYM6i0<IK~vszG><*s1Ye*V0_eU%^FD53ss9yojtYR_Zmzso zCjkJ_wBKr1u3kZLf#AoBnfD>k1xdh=q{qj1OVY)s{+&$AM2DO1hwUe*qSPe%wVuzy zn?e8fA5K_klBp4jeP6!yeS5yi%`gR^eBt{P&`?Ka!EpA}`nQq%u=e?XO9TK=#%FI& z5S1)a2)oq)tQ$FO%BfuT3I_VGG7k?U<!0)bJ=?Uwmc1-^Y{6p|jYQMSN8>Y1?<hM9 z`k0YsLi71}WUJuBB+Z*+l(?Ev9z~;6`tRjJaJhrU_D3_ZJvU{|S~hxRfNn5fWpNL{ z2RqYT6!6e8jgkXDno3+}2#>NYe_tvu!1G5Yqk-ovF$`OcRM5IJ@yX|tXDx0^x#&PX zDTj?gAXUBb?IQf=H-hAB-qLB*PF2niuTJ+(c&e_ahP<_KT=U-7Qp0*LZE2VjMJSMU zdtCZuSdZ7nNSXV0u$UEC^FHU@_OT>0Fy&C{jg`+*B7E#>=^qG;Qq8gkfE;ijk*apl za2F6e1@tTnzd#qqUattSiQUFh7eQR@?E}S6Zh1Tu)qp0GH%dl*eLPAx6bm@3A)lW) z7e-NJC{uL^DGANp1Sq;t*KL!VL5jj4eu7M8Mp{e+<YBn)6EOOWAhCdW1I}pW1qHr# z$QGVRr;yQeu6>sjqUW`9K$cTBVhiL1)wTjBm%p05xxS7oi=y~r9zF`qYaUycrS5%O zq(GyVL!u~eW{=C)A*4S4&WOg(;hj#kiyo3yqLesK%pAu6uZ@eHE0%`&ZnHSBn#=*! zZAA^s;_|=RP6poZS1J7!6TzY|fuHr@Xtwrh(iNRz<W`pE##Mt~vu#Gx<+N^TxYWs& z^L(i5v9O~m$qKHv|5omFR5QFB_o43V!KY~wS~q{bT0vOeVO_`5fjs#iT=C(g_6bcB zWcnU+d`*?%d2y{Co-I+FtLMRrI9F>w+_NEAKMp?pb&O47HOvqu(5?<A6>0<!;VlPH z1i!Nlt$qW<Ag!LOI3tw?dv}M?;lD&GFjKNw4+CA^s3!^G7x~bliNIamtn7u}5j>6f zrroU7Ex_k|x@vDWlB=!pX5osq8G<x_$Vyb{UbonmS8!LC9{i8!nxmp4W}nAt)J+u4 zOI$R;QD9)~`q9Go*uRjmz#CKgJN&Pj8YdS`62nW`m*H#XeGwx+1v6|^WNZ3T)n!Y) zOIu>Z)MW!Vf(pICylyU!`Opqz=8MgE$$zayg3@!z+|jh9itI}nA)7dvv;u#&U;mo< z^HW=%{%TH!ibm!`u%GAHiJqpm_+}5OJhx(Ibe+^zlDpr>={J7~0x#Z}oa_Es)uo1E zJN_4ly<$Ip_@f>O8xsDv$f`Yx&F>z5vz=FHd56|g|AvDm*_UU(ZX*ii9~~z~ev|{$ z)j!trpDX*70A*TPDayLL#b!Pepu7b`?nM<aIU#&xD@D}X4cHPE0pWxR4UwFf;opqx zzMa1p1SkNoq#yUaEoGV6gvAQg1~_{c$@!HCabc4h6onCAQBE;xIcu93k-5xB`LM;M z5hH{$U$K@vcmu#BARO5fct+f8HZ=&7>?5TYvQsZXZYzd^1R)W0f7YXy7XnfaxP35R zRSx|9uU(!3@KAFjMFunyP*!jAAEw|jynjU+`86y#v;~_9OMR%QR0F5p1)K045VI>E zfOFy-BSIGhqIL<VJCiC)y)#qQ!JP0TF=Xe}MaP1qS|=HIrfkiv%@fTgL|#6t*5We5 z(HMpz=%nJ_^IKLa<g~c5mR`ni?~n{iFX(%gzwRbnpTZAXQKBskQvfunt3El$$=_tF zkRF|pu)!5&3r=_@USHLLPtH+@&8=^4RRZ7C1EZXV6Z&*g@>V=b;euAN@&tGF9rv27 zIO1xGKR|p@6N2LDxODOaO}dRxPE;Un)%46Bx37*ynNZ-c+O2Q<D~3`4kPCL<Ktqy) zn`+l+Us<7br&fYh=VpYH#Wz-pkUnK4Q6QMt>n@Q@Zol-iU3QKwe>tD5C~k}}9M&Yd zn`cbC#1d~9;AoM_@3ES%Fru!KSC3Og*J+%Wab&t1QqnB68eG-AId*rw!(Ht9w^t9j z&9ot+<;h@?sElH+w&8U8)UQF&pps_8-<}JSZ!O7BKdy0>=Ut??LEx9@;koF>FV9t9 zr$#=jb(gHx@9n&9jC=3t#_VqSqxiAGewx_nkn>|5_fIP4O}E%lBR+`WRoj?noo}JL z{$Aa2^~^D!|A!w-At&TtRtUV5zTmB$#=ZKw&0ilh8NYT}{i@^0v;Or@yq`BCuR1Sl z1%r&cuyw*HzukSTe>*z*6J0IQ1rlg*$EjH+u2E=v8Lpzz$!kWe=Jo{Yc^V<lYs-iu z0bliHea`#F6if8xo4og_Wlo-LOC1{C$IE>d_49C(^tVgTr=3%IS-MTE&x?If2_a*% zgh8_UPoBNf;j*1RD)A&4^~%K!D)Dc&*>pb*Bjga^d{mT<Ug;n;$j31DYbwuW2{cF< zLcCq{E#wk0+8lyNO|7w;Gq_EK2l!@etvq|uo5SN9P@CCU<EXs$apFZ*Q}SnwUHq%t z7JmUCX|##iop8>8-P!pDLx_d4>rEp+a5$!r?$KTJtRkUBkk<gBL%l(G2HxAgf&{L= z+-N3^V@uiS>D~YISnxGpdsVm+41eGv{vKm(S^RnS5S7c6)a#-u?UYJF+6N=f{0cU` zEB@xQ*EJyEGYje1Ao3!cdW&9v!zd{Q%yzVmg$`<ir4v%CXjj?$IZ_@6(STmB$&!CW z;DmuY=}$mCr7PD`uiEFwI|IJu@s9;av|zv@$3gKPKV5H{OOEA}FJG_!*@{fswpG-0 z>BH`EiIH;gNqAXP%un(5=35@n%f}S+$Np@9QlHi?V-N?FOamb>`s?g?k@n|rUh6E6 zg3Wh>R-twqe>5`~PO+nRc9<leyF?fK-t?i{6I5@NTdB<`!B83ETxV<j@29}j%IoET zJB2rEXDP5}yW0GJc_#|4YwcP0e4X!FK8%xpuD9HH>K2sWV13Deeh68RKyLi3JFAin zWpx^~UH-n-@d>-6x8NEr*|q=l)G3>G)zJsR@5M!EOl83y|5<gbpCPO?x#582&l@SF ziK4>a5A4YAe{h7*M0vVvhc?&&01W`xAEij}9z&(Nr;A9}<&nUpTE=<QQ_Izga0K_l zNXwxvaT<{fp?J#jEIzG$s~|7O14i7_spNijyA4(BaGW@Ya2i<*H#ajST7#RAjqem& zrlG&yg`PEp_C?S{Uxhx{KrgUg3{|`t`$aJE3)BuH@JMApOu?j1c{BR`O;QmsRh7D! zRW4ZxgslM1U6<mR!uWp#*G&qT1QJeuBfiavy&Dty{awhD#*hjn39T|;h~FCyH5s|` zxA(u^a-!FPjYSx*S;;XMBfw_NYuKTdpX6lsB9@iHc=x2h(~-fCXCy{yx;c`7>+R($ zR&sqdicNx7>AZ;z#ETUnD-}^2-{~}@<hGn4b>UHgY%zXZ*a6wmB^NP|Xc*!qijX*D z)-(jr8Wlbe?E^r>Tp-By-aKo3>vR)|!U&mB4N;1S$iMMR{Z5xh6&^*!9{`CAS_}aW zMX7H^fwQA=)Hss-p*#&>Hz9D`Iw3xDT&h{z*@BibNi?4t?x#v@yTydq!0@??SZ6bq zK(5G@S8>dNu{n!Iq78T*DKzw_bVlLWdoXcul%C0%Y09jpCmSY*4aSf+CsHv=!&a{j zEu8FFjKPA!^E!+EBWcUcqCv5f6tN*sN}POgBYlm0+w?Ixd?Pu5Bx%bmiR%<w!Ud!g zjz^=P%6&=K+fB^2NbxR>H8&g@P8`KGjj=YJ7BZEF03;P+q)ic%&UL5sF}rDY5g}~E z3c6KHUZ%N$Y%$x2X@Res1JZ#h>C3(;f{hv4)D$F*ghefB+_o9Uc4>krZgptt0~a~- zX*5vC{cAU&E)(5H4i7#BwX98ir8f3Vy-Y3j<QAtam!%-Z;Y>HhO!CxpPVXe62ys<A z=yU1R7<l^j9*a4*Fv68Xw2e5fje_+yDaAZp-TR%ZD-?d6@#BI}%KRN6H@Q4I%|m%7 z`>{th%*7p2g<(3JYg+a0Sr8~;U)R$<C(SjxgxW~fTj}3=-oG#+T4KxwDA8C0L^_T7 z=*E=wCh6k^NVWmWF5><$i?Pmx>yc_Z1c@ohVUanf8jDR4Iair7$DQHkt}UaLg95%& zzfSAP`?jAa;ljMY{RC<Ydc-TcWA)aDDL7HkQUD(jkQA&>OqfdK>dh=XjPWR@Nl)c{ zbB(BF)lPrJ(XRzn8;D#{#;T;k|8NM$hXk-k;`7fLE4g1dm`CM^Y1?%d7Enu&X^^Yh zp=fY<9xe+ld{Fc13EU=cxvI(RXYi7+ocIrlm}E+<3@8<_N}UW!rO>%xwL6<$^ZY?+ za()`X{BQwxbRjes+<Z&UXv|{Zme1H+cD7XZuRIQ@SKgHawm-*HbSuKPEt^m;*llw) zV*bB`8KA_>7i6bVw!B~Re2YZ2T5R$aO1X$wv>HQPgWIRQTmo6f%<Q0027NM3D&I)V zHH8IIfMyis=P2a7|CKMdPFOre!2-oUU69xFc?$%*kXv@=X3=lguTJu*u5yFc98_DE z!=rMmw9iO6yonz*rYa$p*F{yb`ZaC2v}I5f6d`VTmL|PUkGG7{YOI=W5hKfWk?O){ z@Qw7yAZH#Sx6{{+tj^%Mt025`7qC$K9S5biLs_94>wX2-|FU3f;o-ixc^ufwIimsG zwUc*Ur~yXVz<9)6q*4XA)mV+hn0VwpBefG6^eH^Tf`CR0eQ57;EoojkQ+y-tsDuws z)A)X!U|6;3#s|kDPzE%_WD2VtR{zk~Sa{HQ)SmnQG4+;FZFLQ}Z4xX&1Hs+hp|}Kh zcXx_=DPG*&-Q8V^6u06~iWe_lpwLoE;qZRv-f{2mjIn=a?6vkY=S=Zz`t=bHJ+7$$ zr^ZpCRaK)U?wBb7#EPp!Y_$|b@&}K&f`PQP_3<rwonIkThKLG>Fa_i)WeHWWtxM7E zNZQNS|4VomS%{Ltn7YIm4q|<kFMAhbo^%m}r4obh3*0~&a|`$;H8^}AG7bfzHRd$x zeMaZkH-(ZGloo``n>6__`kPLsGsX7Auhfnu@hrV$IxJ0NFYP#FlHK|_JwWvy69`iq zA8kGh-qc50mYeQ91O~$xCKClEpK{tPcWBM$tkL#T>+U#Y;KyozCfCo5u}X~AJ|D$F z9h;SXXmnL>OTCNdYR#W}!Cbv#d7bkB*Gu0jW-5zp>W?-zeGPx9na*S@ls*;!$Od|u z&NpatNV=AKKc+{@(e3h190+HZ3FaRNcKeBbq!9?05@yK*eSm&&hlA1N#D_-EMx^MG zTM%8PL}t!WKT``M=kw3y45DofK2#4Ow}`;%KlO!)RR3Qga57>IHsJ53@aZILO`A~A zg8*^~*6mkJT<h+nkZy*VPufySU1`GWS~MAMSVb=|;nk&*rS9-!|BnW3Z)Ohi(?^CP zA4|>kA;R%7qVYp7pt0pL5$qWe?U|q&P5#JieiE)h`M#k{&)`^np+U4Vfot@|W+@v9 z{#Pxor$|EO!Kb`sLFGQ|wlsbl)}b+)Q66-{TO+C*smVesk;HmDzWhn<{NccvalfDA zCU_GlA|<k=gK@Cojb)*GPKdsG8~-LW6@8G`U`U6Q-(+S)m<HRF6=E(jF39>xHeNI% ze>iqV<b8zdrnSw-!@Pc6$1-ij#&+y^FGW34gw$P(-|7J$E%arFRS!lD((mLR={ks> zSZdl87o=xb<7Y9I#i<r&uiBkF(pB@4iRfNljl;#Ygzsj&wTXG%ly3lvpAeK@xfNhC z=9MRA?f1}~6ryN<(BByq?*O6Sh_hsHl(Xa!hw$)Q>4iV-jcF@#d+`co#;*dQ*+Sur z47Y{n<OQs|MJCRLR&7Et0@a-@&0QyjkamTFJB1QymHBwZB~}7XGG(%YUJiAn=iqRQ zmgT~9OrXljPehTPcBPpuHOWhrA2S9}vT>r@h3Ofk0Wa0tJ{9oZ{N(GEmWr>)zZJ2| znN`Hu;{c___A#LP?AQERO9_Nxb%pI_)Y+e3bS{-BO%$?tLCgsYwOPC@+e;(ZU&vHS zWn>oDq*u>y{Vqoh0+6&#D`;GFbR1rgrUR7p=}Hm!uF<>INpR@YsZUwD{0J10H*=_n z9CfIj{XrFh8&q8C6)kG%R95{78cB;Hb+aq_71-)I)kyaoZttiIx7E14)fW=<#`!fk zI7??SHjKw?U9+}S-{@K)ZR;J8jHc*lb@b7`Gg<ye!v%*tTq8Y6?`Ym{+0bh$Tk0S+ zNPklKmV~RD*N@|MuXAIfw~3^=KC6rQZnH9BLw!u&hk7Tzjz(fpgFIsUyUDJWhThVp zG1d&S?OK><jG;4&5y|47!}Xq+ufDUtKAEP|*4RE0K4NMyW}VwMo0uts`aT1>F~?Po z=Gy}kTm76P49W@gsOIh9h(el|IqV?L!(Zx$a$@>}%=#kF2Xit<&pL=z#oRiDrb;`9 zY6Ax;T1}R7M+}ym#9~HWsMYGG$Ie&BuIy$gnBP5BzrS<&{yy=$Z{v6Wx$l8j-#=U( zKbE38sp7pLE50B)ScaIVcARVkXvAQiAg!KgYk;gNTaY`AqONfsHT{`2PP52Q1Mg3- z=}y82a3Ze`Qf0E=zdK4nK5dq9O?y|9Sg6ka%MfmBVYj2lg-_q@V%ir(J@8D^Mvl)_ zOxF{sZ}S%I5+L4>2N)bMWQ3#KK+#G{K&Vdw7M2%p?RgcOFJ?^-d}uG`=d98yE@s#< z=7J126ECXXT!nO;seCzOc~L#SHT{8ff2QdD;iG{)vnjqdy^&w1Uy+R6dwK&<6U_v& zDfk05>b&EVsrIX|vm_Zi?On(oCD<w%j5vH<i^uxKg_`ynrF>NlN9|@a@P_EqO`OiP zKfM7{(+$nB0WsGNUXvl_{Mqkk`JZA(LP>HWYUir-$$N1>G|BO&A`6={f24k~%jPra z)onjPy2nUrWzfvE0Rk;}4J2@gwVDj?>!hcqLs(Mo4ae@4lUhyZZ#!+z0(E{#>E2&o z{d7dQ3#P+9rSz-$4X=#ytF7YCi1LOnP|;PQGg<hM-}&BJfkuD3Y!3Z?F8;k~302a= zj+=J@CeJDzdpS#Z(7!}^FcXNiMfsoOzDHj4A43Spo$yu5dccxiF5@o^&3X)8^h<aR z`=R^^a{an8?sIDR_Z0QL@mFYYk$0#bSvSR>Hu2S2Z}+g@@6f8$%xvEK=wT0i^6!-U z0}S?kc4N$YZ&g6x*No*a>HSE|<!jZ3^=_AgE|l+tUyq{WA1~K)>e72G-hY`@-Zjb2 z3%!r7C{VY=?UC_Q834xnT;HD)mpI7)Y&zAa<g;&MAD;8c(ueE_rToWL5#_0pi-!PW z;T<r!bNwD2n2l<HhNtC3(z9fu^q!4=uSZ*|w3kI(zPNjBFsVq%A>N2rTd?-1k9&S1 zChF1ph^>7&n#syb_Wsa>P30(V#?l+9+VtwhP9+51z%vf!<n|ww&%u>WcK=OC>5bQ} z_Y89E?^|MNrcCO?m{+Tb$|g-}dZhbIln!N8X;L$GPT`=0wFMmWl@iUg36kc8ySquq z7Y<DTuFoS^ru5vJ#3+zft25r0+If@1<A=+|-(twg0!`t`uC*dVKZ7#jNr_8pQBdL2 zu2NZPsuOqaehRAku(HT_&T3NqO?@``8^?`&0gFRa0fXw~(ino;UiRMTrBsX_c~duz zLZdBn1R^Uhc)ZYgGlFG#&l7?=9Ha&gqfl!nv`S_OjkD{XX3ujR#Zgn%kj7DwZt4HM zpZ5cCR^a6)dOK$Pf}|8?L|(nj%;R5<K_HoS!ke$b8mjy|`C2!_<idZ^<sSBvlhR?h zytIiM#M-wbKm@RdJYrA0+c2u=i8X1o;lfcD;H;P9(?3n4hK{e)d0HsD^g<;O#@Btf z^*lLF)BwR#^uf7rxcLn;1U_5JN(;nDEraNr0qSy`W3)UyyCNz)YJabne}rrF8~=#7 z8bEXH<Bc`erWQ51{HXx1;7t`EcysTrqyuT^?Z0=EvMyv$HMdB2=95<D+98j-nB3>y zyqj2%Ww~ts6`XL3q(sDeXSnDkU=gNxtYB#({lSU~&%1CTWC4-I;5(|Tb&6x;>j$}z zkK%_fvr1r?6TC8ufV5E^1^deQedURAH9_}#LT^IL7`A%C`S`9h#u;z3wMG=rNAq<X zPtcU38J4UCLkv-<yDgKTt5^xLopFmB?K5a_h*-l~(wBD^A9MGBz{7joM3F<+&$d!l zNa!@}2401M_P)UG0M>`Rsopk{DDO}x+|yGU@EeJJ8JBVqt;J7G!0tQ-d}Y&!iK9ww z9m|IAU+RBw%n#@^I}wa&Ukw2}G^A8ADfdzt8ojM$!?c(af{B9dO1>NRnhzp<kO(&} zZx?E>!xZoFXrzhdy;GEd?Vm=OB?HX@36i2+rCN3Z-cD>sZhf2b|CH>VBTw=8(CPXT z^ye}A9iEZjGLamah3_ez=*{j|x&gDPch&3P=~nEac9Wrbf3|(Tllcei9?4RehhW_b zzl%6cd=K>}Gn7Wa#y%>;1SW^jwk{?*C0o(F@yXtJw88rDge)K;5GyWnf_0l6WltGA zChPawoUV?47b_G8A$}MH3t7?A@=~GdFn)|LkU{XKS(!E*Z-rk|+UhHr6MFy>HKA<i zf8@h31EB3~`D)a{)`p*C^@j<r0WnYOYZ=vyB4q|HLJVLK>;6!@%%qGAM|d$JkIpzx zC6|^pFAZ^)M<`9}cNyh+tWmGY5y=*=$iWn96!8;@+kDOlpuPoAM|#LqADZ;CyI_U= z6NC*tl#CpK9Y_y!53!LedUfTc@5y(uOOdCFFt|x@24Ux8QtrF7=1u-ly%to^!Eoda z03v<35n_@(O!J&N@XE}NR6?dq%hT52RP$}MyyC);ez2GcCj?(!p5@>u9HHnj$@5Dt zh2o@8V<!=Hm^|4+xU@95Vcl>y)#lKc8bstbgefl6ts+bZM;Tkb%6RIb(z++1?0oyp zW=k-#k_D9PSX@eGX<k&x?sABa@2F;Vy~7aX1dhfGlQhANL0PxMj6;#9_(g@n)>|ov z7p-B%%&DfHufWNrH|7?B8z=he?vjS0TN$5Lnx~iUs4pO?`_Pa&tG{T-iAt!4*(wUk z>o992D1NCx22}djBS<#zY3~Z))spO4U$#G%L~B}<64KS|*`4a-INcXal~YAI8S>}f zu2jJza8KyzKIVL+ZnVodxzb08cP~Z4NiC%l6kh*o9P5&$e@DkjAxzN6uG*+nk6@yd zt&$^<R*AFD3N!0m5;KOi>rro;QyJ>xsF#u#4oXU3#m0xP-nG1>+oN2=lNg@%Y%fKM zdB+?!qxXJU+8fwO#d(i@t<5MMyJT>`w*(0e(Lm}wk-dB%UA{T2#>@)|QZ$kY0C<!* z{q==xxokB%b!6|(SgEwvndw}AaU5Nm0&7Pd*;PBM5KD%^^o#Za#8+X~dm8P+ppbFx znR@?|Zl5bh5w^B0NLS`rCA5*8loVB$QD7@U{++K(iF>3z3hLGQ=C#cyu$sU~Uj0=R zT`G@5c!S-KS68SF%Fer%2lq?5Lz^$Odzf<NVuUWVsD*Eu5;{9whbC_b^$<UPjRD}Z zI@RMAkcyey!s6hCF$oOA7MKtNU+IBVJE{Py0yh0#4jSiQ#4I)fdcN#5dsp%Ue=X~B z1dXAB&3)9j2#(nx{GfbQY_TD27D?LP%`et56X+)~hY@}M+!zzziQw?T-b<WOjiJqG zB`K`%)iMZx1QYMUUSv?DAoVCZ*6>JwTpED;8p0a0;fvny?l1zsU@f4E+nF{EKee70 za{UaYlcm;);9|}cq!o&#JqcXpAi0LJv}BLB)8HFZ;|0q4b4y29@g*&68aEa=>#KRw zFg+l6f-UIq3`jONY!yF#oh{;Nmc%f0oBbwW2+^+dqhSC)45Eo;MZ&g7`rW*<21bi? zKM@N&Mt0R;7hY7)jeXmQ#B2O9;@FJjzc%K=T4&Ngr$2GFUxHcL`<v{CAJ6g5C&3|{ zt06RqLhld*OUTrH@NJ1s2t^<q9ebrEW_<OwMfAmY!E@q5*@pD^-(18;g}L<iKaGxm zLf*M;IaRlW#mr$-T{}?tUZsA2Jn3Hrw&E4uXTA6%uTuYb{M3SX<=#|{v#u|+ueq1x z%zG))M%6I^OEk`Md`fL=?7)m=e_x(O#s#TC7F4CiCJrto7CIegc96{SUb7+c5!_{C zDj9^`NfRD|0sMSJI|zojaU5$v(p;(}f4eYTPB^-kq`04ddZ88GasQ7Hj)46v<v!1p z5c)}MEE{l0Zs3V`$g(^7hx`$?laEqwu7)sF+ezjlB|#6{DS?&RFOTb4za=awA+B3A zL=UPNPc0mXm3HDEe8j2Xz>w==kM0Oujg$i#(PbX^_0K3oWo)oC90?t8%OifboTuy_ zyP_2Jg@pJe>=Pwa6lF^QNDDu@4qX=(f2pQ{d`BDDbF9Y<h`>T0!hQ8oDSguK%{!~@ zfe}go`aV5vienIm+%7|$cM+qZ?a|4i^KJdn@G6JJLMUOxJHTKy3rj9s^3X_<k`l<Z z8BN?LK}nd48!mp<Ht_O!kZgryHm>xup*Z@C1jgY|$1<~U8J*B527df7fz#k2Pd~SI zKTm!fZ+_zsH1V!%Noq=zaU6OfpLix_@p%^T0?&|yh$t5CsFH{1T9_mODX&d!Q^0Z} zfjnzoG9+&|DYrXYJ3jiP8FHEob`XveG)&iNmq|+<i=UD)>yt4E7%NQ~TPJG&>MkQ! z8k4Y$XSqW1tk3qm03`82Hr5}1VG`;09vQUFk1^3salIS=3X!u(kJddLl=L0%c{MNd zPM8FYF|o=L&k*~NmbtxNlR3ybw2!}Y9~&K(@h}FxPewvp3Krar+FTnpxtU-QobWT2 z@jV<5$S?5MmTzH_lXVx4tCxF^J0a>n>C#7AcS`5D79LdJnG!9dORC_9E|=jY=hQBr zlRuSnF=n1GW_rl+d|S0&I+Y^=<Qv4=*o}f;E0l>SmMbe(h$t50PODQ+mrG|U)JJ$L z0ma>-h>R5*wiFvLrpuKpW7dGIlwleVktNrP?aE3WGYa|b3OSriUDjC!hMyhU6kXR) zZ3Pe$%9RE#ls@&z_l_#P^cySU3WQ04^KjNe@BS){J1I{X<2L6fQe-3h>m#@MD9_9& zmxU|kugr|Z$j+myEWW<H8BgmuO)M&_e9`{gZ>;h)KxHjnWj$YIqh4jRPi1RHWqV6y z=R)P%lgci->bf>iY&ZOqa`cyj&p4C_@|(lxYoP`wpO2j8%5cXOl~pU+=VG$w_Lo)n z>gNod>bsv*Z&~NRI?;ZLpSeI+i-`ty84OnQ6n1#c2PjMz#JA5mmHb6d{1*>?3|H&q zC4%k7*&=Y>^r@X1O;<KYcsHZi3(ROwf#Q>K?+rnlCv%3RA#b{801ab^Hu>h=(LH@Q z7)R<cjEnQ_3*p+6FNMA8QW_xScj{ngR@@8)P{Jg>$s*g#VnyHLYCalXh5~s(H1YlC zgfpf4cC}x;WUqQQ+s$Fxd&Nt;B?hE<x`t|*lmWUi!XKm%<~Iv>8&d=VAm4|`inT=2 zv-vz_Ew&ELW-y8bVVE@MqQhrU0Q40D4Na+5_hdvwf0NVDGsf3Hb-DmxFo!uBr03T4 zXd6^XJ}k;!YMJ;h3luD~S!=HoEpzLXow{ku_e0eZ6uI9lXCrDVbW9cs>r8O748(H` z#A~w1po0lRHAT_%FBMO+zZi;=c8xBX{84|tn>$(f64R`JViC$v%qKxM{|1l4ykhEP zH!o~zK5Yv0visU^w|)a$o;O5au|!(^i&$r3piQHcL1RZmC8}4MCe-*xd)rcnm=$Q< z!1qo?&nrRE7fHROR!{rrtIm-U7A4{|@35h02z58&(E@7Yb!?YFY<V);$6(YNdHR9t zH~=GRlum3IBc!t#<?inU;^~{qg(W@hRm8EdyqHA%H6%TGG=D<TsD=DOFrXM3dwCKK z06<c%M+TeMIlpM0FdDGE(GQmaMqHu-M%KF3bD}%qVrKheRX{NHji_z?Z_6=BN9(zw zN+~v4FvfL21P}IQ$z3c^20q|ejZpk1CzUWdQ~*3|9-SR1S+r*Ofjg!P15i5%PRQ;o zXy<$J+XZzW0=*tUH{3?;I-C6k>S!f~2{x2T3kH}|^^!pJUK8WG1>nrTsI?a3p=|K* zzt9|XlbFG+fqwn&>J0$gxIo^hzazRfnry-Zb$AW69BHwopKvK-YWse^&3PM1a{G1t z7m>U<GMTd_N>r7sKMM)o(V5)Y-deNYOaox%CvSDXi9g0jJgUZFmx?D_16g!O*~x=m zJ<ys)*e*<&tiY@sqO3OS6c^uQeu<V{yQTm9fPg{7`wi08RR(xSOlwH0b)!Nwf(l$- zpDPQ_6=J%VhV-1~3EU_$*}NwEb}MQoYL2fNjQPjro9iF+Ef~Ra@`jbsH%(69%VUSo zXDf52A+vu+X28p_Pj8^q>zKqb*tiBpcyrhWOc_53VagByfp>ZPc`_Xko4gQ>r(0Jd zBSa$E(5e=jNRSZAJ>8iK|G;Ng51Sqy3l<Mag)3w#_w1`d4$L9tjD-q}VoJ2KX>t$% z4t$TGWS@lUz(OK*ZOvSBBpE?LJI2n6&-8$4br0#ud`6x?xn+-!3tzPdBH1Y~QHaUo zlG<LDq#I(+Wt>c<i#<$4Bu7mnoBe7rjNqFL&ex>Kb3ce)BfMQKT6o9`-qVg*%l<8d z+x0P-GCACV(WdSC8>(tkv;c@+2(&o}^sElUwj*%3Ap0bkJqV#V&Cz{<Jy2Xjn*Oz` zYS7zg%>`pu=ICTX^yZ4lheZvpicnVx7kiFsTaN7t3Ap!d%#NXmmtWFz65H*UQ|<Gq ztO_ID3qwPW!-wFbyKj#c6X8dDCx9)p<FVZ8vDQDiMQp^bM`OCk_4a(~?)QbCdR|4Q zw6Q^~?{y2D%BNhz$@{PiqQyv9Mpiye7u*>XmFN?5?#rfKO|(N26WocbOY;0NgY_Cu zWAo*tAT({<c13%IQ+UONy4W&8;5+Gf;_OJjZbT|Z*%VglZ|=o>sa5i&4E`HqKGUV@ z9y-B?{oL8e^qNGcfY<Rwj`($ynLuc(JUz~52IzE#)-++CDc#GDr}dcZv)Y}4l%odT zH3ve}D&JR8+HA3o7gZxUEt?{>#$&?3T!!9ONV}<{B*wUSE%kFSjj-i;$t=yiP^H;2 zE$rm{N+Z{fnVO6<Bz$KoRWO8pHLGi;WTBBp5TsoWnQy^lT`DZ)@ZQ0^tu*F3dylkz zu*&dWXVRS5Q7D#1HQ{Q~n<h)hDV))zam)FvbLYIUiwiN)Vmi&YRLRKi(#oUM^K%UW zC)cQXo#x|COt-kpacIRr-g}|O>d-pny6|Iej%U7-!i~hDVNN`*5K8lKhv-;4uJuma zc~~>hjuX)=8POYn;B78SF-m=+$a2aZg2Ix6rB)Y1toCx={=+viF?Pc>#E<zfv@YI) zJrd`dfP%%4$qgoO-4@#ji%LXty*7x>oWnd$8?LEStgYC$h!=83dhD2w1yg)0c#tj4 z)-+mwb`GrMi=1;#Q@pLcb=IgJ15y+e|M8f%5gtxuXGd?CV7?iaRAOTG<eabNGfN?n zW8X0>PPm#DdRxogBtFCJ@?!e>YXefLl!P8OInR09S_luJnXqD|WEn4UZ+o5rfeH)9 zGi8frelZ%48$}-E|CL>aw;3A^^7UEkM^RoQSxmM({^VuxG|x@NG!oBFNl-cu$CS^y z<E^b$EaKSS1XJd@FRt-M-FlfCa-Z1IzNl$&6mq_M)uCROTXaeDNa}FSAue7GH@^AY ze^$$FTBYk|)|@_j%k`qZjlAo=^y{R!7y!=0&H}$};#fMB!GO1l{N;^t8%`JCH~QAr zo?aTjP&e55E#yNRQ5)~gK%Qa}*riGdPw9cYo-<aC8<VQ71DE#=3A+r%4;GCcyE0d) zniw2Lka~B{r!+)&SYlFd@8ssksj@dlZNj4SJpyZjayURE#>jt^&bnXc^jlGk-MBvt zB9YlObqfoA9C@cVnO#*R+|1-xd^DKh`sWD9pH0DEVD_eAxmTjBFTdzdK^OlwJFGG( zp<)8R{t&l<i>2nUH<2)b7@q9<Pu4GtAC@|+dI1gH9$|^=ru*!_J!+G>Lr3;fth$;R z>H@Q_IZsfupuL~ONi=SSyg#RpH~E!ot-OtnWLW!hlo>rSk2_Y>eR}e={NYb_QR2rW z1yb<8#iWnD?*+cN2BvoPB-Z)%rv+{>1WKJgDUk~y41bI~T>Jic+T3|;L0|f2nN&i1 zKoU^`^IJ01rynUdXxYf*X<7XFuU3TYGF=B>fVvU6&qwU>@<$vQCUn*`kC#m&%ZMO5 zbuF~(xaa8IAk}t>;Oi_GqGa5R9iSj~sOEqWy<Kqa@w{o54u|q+^5LZ^x5qep={0ry zmZ(b}C|lkhRH2y3Y&4)uWNsV$0^{aQiK|iuqY6ws{b6~3t}v4YG%fGeYM`xx$zy@I zfUlAJWNL+6<I`3;%?jm$%25jy+?i5tHS3b!(kLpqTxxeuL|)aaF!`X5n}4X~M`Q5J z5U+u=85+5~l1H=;)Q6L)3~x8a>bj0iKKMqk4xDwfz0KvQeK^oNk^a6^ITpK*u0bsm z=N^I@D9O`m(;r~)@+SN0yPyu-_S=l$`klr?sRE22<152O36I|24!i4uL;|fkNz6vr zPY7Mp284Dp^WpnKSz1|DV9&Xxiwf{7;f$}}{dsWOr%CajW01qCj?On^(BB;u6mK8z zvnWFTCUkuZZ7V1a!<gT_eKCK_-J)%%R0*`B3PSGeC^3>_W7JaSv9PnW;DPvH2h(~- z7Hc6---Tk5?L=9qV5>&Q8KIU&Q3neZ>YE2a$WKa*ge0>m(v<v=*W!%&vx}qD8l&+= zjf;ODY6vv0n57fP>Jvx9i6J>3kYkA|qAJJW5HYhpqQj{7i9J?@yd8GODXK_B-}B#X zoSNrG2u)HHbC>4i7kg0?9|StrLP|Z-WpiunK@J=CMhwj*QN$kM!)la;rMb1W5sj17 z+NO<)q}8RV4i5GCIq&Kkl`?%<3?JGpMxo(XhKG$4$W$>xb-X_HZ2^*aj;){h{?>Pl zs(ila*gTtN>ME+-eTm|~T^pI9dJfFHs%^-n+)dvsgkE(Y6*@ZCol$SpHQG)6oEJZM z%Dn1-kTo1-ih^!Ax7QKB-u!;!dukqq$!$=4#I>qF?R_u|xEv(%tS_qA8b)oMVkpaR zon~p<YW>VHLfSUNvuxZp%YTsHHYfaZt8HE!fvpWSzzxUiE%BB_@?t)Q$=wqCZSxrG z1fPlLik3Lr%@-`12Cr4hxa7}rr)-OAw6%rmzt)SGEtG_R$$L(s4?V;|Yj->{JJ+2f zE?q@Rp^hGFRt)^Z#K!oK2)uLcg73G1o?E{*-Sz5f_oA!(e1lPRs?K*q%9JTi3LT!` zw67!tvFuc;ZM}rDhkyPUF8IA9_t(YA$6_Uc(D)QE0kJ@d3<KCC{^YD}O4VOQSUO}> zzp!$<>C?;Fzxwm$qF;Rl9Hdn9{0OUveb=L~{J&TIRzWNdb&Vf{4qHr%geE5_HpR~G zJmbXAA37=dS{O)&NCV+U0F<@NUsMdH$?$@zYZN#T-;Q2vp|J9970jwXgsPEjR{j{( zzqE!W%E1VPStB$ed1IP^y>!8%c#{8or^84`3DK>-4A+0THW1vRs5Lf6^LUUV9RS9o zfVnXIy{w&>uBSwshhmU!0AyzRI=EE=X;|f!elOQ3-k@X<F3zjf1DE>2vKYK-T!v{H zpShp@>io&oZsB3*wkTN|PZBeCh?%h4hrOjnkVPLMfpN*+Y-o<s&|`B_5&Z|K$MIWg z#JyO?5rzp!PiSyNu!3k*W};=^(0@+~A*Hp)U!Rmirc7NvD5dTnl$RUe0+iyGi-HwM zbyQtRofc^*AQ4I*PM0WuC4>3du{pJdaYUn}OXUC~N(`#g!lB9&tU(7;G3D5z^A|Kr zxm1&u15G@`w3S>2qtbST0IZ8>8-QUmn%)+7oZ(6Z!TkD!Iw&<W{8f8&@~6ios4ag= zf}R;cU4a`^DcqE8`)1-4%Z<J&?{GMhF4=Q|YE?QHWY0)avL_q%ypXzUWXVInPu}?g zO)sd_8X{idM3(6;!v!t?$RCGd1>{R}=s2ZBTykT4l842)3Bwgd-)MUm4ubUnQLNRJ zuhnH~g#3Jnk_oC-P9Y`w({(uhI45|00R^%^8L60Lm<w?!_3&;j0NS@M7mn{$NnpS+ z3N_F*8cHxC@*$`We#`km<^LZfA11D7Q>*n_E3O^jtz<X}#vac~?v&36d9%o@*Y6;? zzjEK`FnJC^RMH=z)@@O8KGQ-l-xwz6Yw_w}F}-K58*5!{alL0!|7{4{;`_yPk}XZj zJCr1!?%mw1!sh<ypp}1?Ue$+j28rHHaHJi^@UR=T{V#4r|MsQJ{jx#g#3EWCeAww7 z_oQ2#|JIV?`#uSk&oFf;64lxuaT1e?rXGp$&GeV9Has?aQO;QBlU>9cmL_uf3e){Q z{EpU$3mr#GlM9Ee-V3@$_Y@^k<TMEwyuv|=ChiN`+xNYW<%#-Jik5ZbD;*;J5hQED z=vF6`!z~4SbJliYB<FAxYM*Vi<KuYXjc36mQBD=BOfEjNdRu;qh0x++q%Dy(ncj6I z>tI)v+M;`d(i*k;ila5{d&#LAcO)Z3(qM`M{YmM<A$C8FwEuzn0Ojn>Q}O437QbYO z7iwL=kz_;9EKf;W0Ylz*Q54GX_<^5gX2~bHv~tR+FPP&gX32-NxSGqj#$2{RTXEE1 zbC&#qVEJJphe`SC%l4`u{PmVh$%CP3hfC#p@q(jo*?#>fOmDbVx6chIs3`0OLf75Q zG1aGUrpm-RQze86Wr~7}?$Y<X!mp1ld3+aZyzgo^sipAChgT&A)Vj=|7g&0hWboGv z_E$lhmlC6GrkUH!UMDIdV!@%CJl-BEXCWeaYLd%IWWm}c1UCRXpy)GDKpvRG$>{&} zp5$JcyG|jTC4WyxPy%X>jb+PfS)S1xB`%gK)b1d%Y|~qeSAH!UYZTB%M1U@Gd3PQC zArS?Rh^qc-O}4M9WTQ0m8ToN=gCrU#M<?$4G9A-l%ZOQUA}i--6s~$#O7ZV3y7e2x zE$Akm;d{g)Y90@0_rA$>n^zoVW|Sr97w^jbif^9KbpMQ5+qnovK1hOn1Jkv)MHCP` zU)%b@JQ4mhMDa-gB({ViiJG~674o%vjS3bT)M_)7--fAkcIVwd5qL`7<<(L*Rx?U5 zAQZ1Qf~NiLj<`KYjKx(j+Q|%$Jh%+^U&`L;(3NdrO)!p8ha`cQ23~9yi1Q}wdA($o zjS==JHf0v{Q*I!eJ$RU8&u)Zx5gRp7{e43q{U+I4Uf9{Wae^Z|?p=kNbu51d>f@&$ z%97oIYMezs>9l{%A_G@Pe@A?KD4BTbctLtT{r2o@RGyHFAV&FeV_Y5%ec~#-H!)r6 ziQQg9L6W3&UojKjHoMmOmh^8pOaKWrxac8;0#a)Jgh8(Jpo<~)4c(;}10F{85K7yO zK-fIeSFw$FMmg?I`IeJX#ctEpZS!P33jLS@F%>|!62@RI@w<nFyT14;#Qc<O$JJ@~ z1<72edN-{3>z@h=A_ohsZmFdhI45D)K9}w*4F9#+L~%`Supcn!Zm1ZL`*AB7neugW z2)mH6Fxn+gREa`e(SAgN%*@JS2S}n%lOlFRq|8cFvQzn8mr!Vq_^3}KEg@2eS^&J@ zRH4MSHKq2fmNV}x0W&I$wGb7j7h<+Eh{+U6Y4U!l`v(0SvESW(?7wkxWCV6g)FyYs zcMm0dfrbr4#`b;G?sk@d2g7z+OZ#2(lz*jf=7>MijR+xzaDb&4QP((ittbtR<`)rB zDTiN?&NJ&WZfY9)W-|LV6khg8zDNr|_3J-%4wG(#n9H27fTg&47Tj=yXQpKI&pc~v z>4$s(o#Fm`HJol`gx0zQaFza_ZF7x~3aIaj1i=)M;uQfV-BV0B>%PjtNJWOxjICu| z4krtMEY%_Sq?rW}@T+!GNMCYBLKa+-C+;-z!a772I4wV?!^$it7i2A;iBG&WVlp;F zPMRBfBq_kVMw36N?C?^KFDZ*ZioiU0SRNjtRCom0vR1u11YJ>Ervr2h>2woO)@N;W z&W3czbG4=wU)<=FhY5_4^ech3dgEw(8|J2~M<q7|+M$OD7{^}s6WGZJkqtIRXXX5B z>ssS_!8Zq$jPwVbN7huKqPwBOj|l9e`MSuJdYQH!qm~<62plVG38E1qg{7oi$EF)} z`m3}b^yzKKt?eAF=uSq=I;2=1Xk;TR0H6h%N_}_92sKazCZGzxa*#rVfa(O-<gwBU z|44%v!>e63=mJ2>8z%C9)uGK3dQc@_Qk2?-MGM;T;Oy^aedET#c-oAJQY%9@3YHU# zA;O#t>*g<|Z)s)x`=Z!e%fKnP{vR385dl`_V?i}h&Ua(JwkWDj6M?&LMWE6j#*vL> z8O`h?71pRHEKY3Uc4OM(e!SHIl@sw-h~fi`aj6sGo!|Y(tNdr8B||3QfRGp=xg@`c z<YQZ|t4e_c+n^Q3wC7mjn_!`ftomI>TjkTR#)FXfU`^$4J~t3F8GtKh|Mud<>Y_^K zI_f<xlLR3{`c<U(o$O%yY099z4=!RbyR;M{ybu{K>m*HWauR!$g-mJ}O03dtA5q#J zk%2p1R!v(<DBm5J^A>#M6uxjXi(GjHu8v)(uv9D~RAe8HE@F(0ijS{$Nvb1Os3>Hv zlz(wZZjPzSt+g+Pl=DGCI2G#>RU3rjnqw8tw$7@$DK-SgDuX7&IM<uz)Qf0i%EKM% z_>{Wuqr%mrn-b%zZj-C5(c0!_Ae>1*eRjKEA>&uL*I^oy>~np*Vog43@4nI~BF5hR z=Wh$=1GkQ!O6z*B;`)-~dVJ28<x}zhI3|0c*V8+V2wjXwvbO$bH?999eKBU~H12RQ z{>yR9kaZ%|X)^X=GWFuK&xLrpQ+a@LZN1a<$BWOy7hm)1XHU>R6Mk;Mm6<uan0vi9 zpK+R9sh>WqPex>`!*!mgc3xt39)Dt;CB2;5`n=#hJ<IO=#qjcr$LA^8%jHP<#={rX zjPwYD=!P{HnRT3rwaCjg9JVwc=S{_i6-(!>>B}we*j3ESug@qO$Mu_q(K}ZS8y?Z$ zP}wuQoWI?&^|rHaGhgj5UCyMktrxN>L)q5w*$-9Oo4_tp^=yjJs{_#0My2zyF8e{M z%PC*ugf07*ME2uKm)T5(bC;Pj@5XN*5gP~DH!K@Z&#tbR8&*SIVh0;8Ri`e4X3i_w z*2Z5S^+OSzegBN@mb>Z3f&GW3>%B+)Ha=uW_UhUtI@ZVade!9$e|%H%$8Bt53opmF z>Bjq3*T1%`zhc1;sZ(*#rj1VabKR?CbI3(*!}?O=k!j;!)N260)AD%iK!Ee*r6kAB zPW{hZ*GJ;92Qdyn9XrtI8tF$8Fm2}9RQ}GpNjKm}FYon=hcnXm9}o@><hpCrwnXHE znN|9$Hal0;CXSQVYm9^I`R?mk0gkU5pBIOl!GGN_VeZ&^uD3x-=#J<(B<?WbmMKI; z0M#EvBvb$pzzP5$0yaVFAOQFUfB+_yZ!R7R1H+h&C!0$~qM$U2`SLBLV{wE$4qKBg zWfQUVlDTgBmT|Q(0vWNHW}DTCEKdGd(slKb0vovH+16BB)qD}$;yL*E0&zNoA$`r^ zt=a|^88DUI`H^>Up;QiOE`Q3?aimU`s@6*%ftWp>xoe4(vGrn|Xz2N$e^wgh8jMCu z+pp?CMzYIE3g^zyZIqZD@&5LnM7wS`!g&_iRQQ@*VkBDB!@0WK<zT*8Dvn%*crT9T zb^vHWIv9>-vWJ+UkpAc0#d@?_m8qzHgLI07xyCu#y7cv4y-JyGLEnQ_Btz{*U79A_ z-YQj@ns~`jOs1+=+u4h4;rphyVH-8Vm3=*wuNi2ZJPx}8Za=!F$=8t<6U(m_5SiQ- z9K=np>6eDbOYVx$Pf%nFU|%t?$JMpliy)M}lY}UXNEC&EY>+IqLC$L>5?1TqlObGC z%>?nylj|)BwgEyKDSAIf-EdUjg(-pWD(yM0=YPP~jtu31DNBT->ZNcn(WycBB{pv< zTwPW66%(a&k0W<lYu)|;SOu5GgK~VWQp8mStpI|=UUYIg%;`3fKF2lR3-QK^<=+6; zJXOf(i(k_mJBWj`bb>>4UoEKulVjl?e-38QQm1uJD-!3ve3hp!2TXANHXoTnW0uT9 z;)^WDImkmScxiU1b6h2WS1BW#!%Cl7iLGOk-05&I7rMD|u&<I+P4J%XG^z<k+O_6b z6|$S_`1`qu0j<-yP?I(u?DJSFMM*zL<3jFAJ)znEiXnm#Mo#j*(`{xS8c!uLY8iGz zun2M-9_IywPHeD>!(tR`YpPB2oK-mpBlNJYoI;sXT3gSUwKZlxa#fGu*JTuOpeiyp z79m5MD-p#>F54CAyL4X1Vn?}bhuvsRW(xhG&O&W~#T<wf6RZtQ;Cv>pdKNs2!9e<x z>3&7~x0fX0lTYawVVF-ffvDdkwxW1S-$DpXD;OnwmVwY6NuX7oN(QFUgVD96lD!au z{Vn2!Koep+I-*FLGb$DP0eadz%-B@<ShOGSY5WcHwu+2AGb5OdZ@nHPC)1E2I|Zxc z&y{0n(m8DkknpUyRF-@P@N@X9MUu%c$I3EOXYbNFxgV)Tnu(no&!;@yv{$1ZEnWRl z(!xZ!gr<ztKSkU@Xz|~z-*0*HM9$Fy?S|E~gV9vG_kaP;@}!+4KEoKfyJ_PZUy%U5 z4fI<a2g)T$V$fB?gWP*&xxNc0ELRfCf^%~QVQx_-PrqRDN9E$sH`NyCv2JoqrILuQ z#x&S2$x<{+T?Ay5K;qFg6C{r8A<gXKfG#%#l4OhcYMskSff);#$B0C}i+Nvv>`=&y zQ*gX#AEjk1gxr+$juaLgO)qbZ1C<65ysaOXyO0O%lir3xr7?BGPAw0uj|XWp)J-JN z0oVz4l;)6ep*Y8U<Y&rHfQLa=hV0if&|bs;&Oqw%(60|5+yyQS`feI_b(~ZIMRtWj zqe3E2I_N;YIYLG@N<Q(QF?F5)okUP%Q^sJd5@ac0xPfH|8GYgrnWVfbUej6(>lsqI z11q(a=})XcCu&wqT6uy~D-c&BL^#n&1#rC}MdHU2^CTI=f>bIerg@d*h6+IUUO*%S zFQ#>q+TeFBg&O}?Mv+GnE-VgH3;Bt<lRV}St~2MUtAWB`7s5VQ^D+|j__N4ZNW$&E zCD#lr_jN2*5ro2&tE|Q1X=!);x&?DFVWY5b-jh<^mFL8y&%xY^N2ZSH8Kb?^G%SsI z_xzJwlaz~A8W6>3{YD6OP5JhDvPS%{DwL;ig@dcW9{&kN!!emU52rsHE;~(NgJ~U$ zKve)s@RP=2KQ6WR2_c{FLG(l{&A6^f10zdn#6<$jV6VrTe6HlS6e`?-8N~u2p|r%- ziV8RGX*k;SYt)0KKD4Js)iXA!I^P`g_F+O)F@$;S@V?$4<Nq1L9caE`+{X&B!}{<V z6G*M7x8WE=a7!O%ym!Kc>wVs+DJV`h0YvZ*FCweG<Z72ZG3!km{#4%?e#@Ec#3*BO z($H4>o!?6b%y84Sw2KKY>CRX;)XgQEWalVZNtR%av;xJBC!p>oghC^KEd$K;dPf#f zb=UWe70$e=4A|IZHEg~xnWn3g4gMEFiE@t|%^(jPa+CA;*3Nv#D9aU64z8?7O1u&G zmcg-30U50?;VXR9aR2~F0Y5_d`@Z#skZcu4GVpqf{ni1}wc19opX_T&KaJf6M`L!A zW709(w#0GBaA|}~BMx!OIz}lUiYCyty$QdPypII?*xhjT7o3HWE{D)hIMM2$L-4I+ zQx0V-z(sZlfp9~LT<!HKISmhzw})(;U-4h8QyoZCBOOq*OHtXk?(r2TNlbEAdz=tr zcygP|fGkNzGlnA3C?G%*{6oEnSBW_TfGCwhe+0LgvsC`dj+Gp{JQlRhU8HeFC=oR| zdjUL!_p#dj3P+s!E7h(A6XeL<C1Uo&R1p4mtGTJFft02i3SK2nEmCBT<I#=(k4GfI z+9aa+V~<ftbqGKg&Xbwz>{Rd!{oj5mn2h2}egW$!0-lGDbQs|8I1Ab2)=AK4<p0|0 zSNx1_!-TReiA>TVT&LmKj<@|kg5;>mtx~@9EQ<;k$z~}dDZB-A?h&Ls!7KS-F&M8X zoxAoqA{~50G`1v4;9@AM?8SCwTzEh@#5kbRsK-!TImM-XFmDgEXnbdU<`KUv%`qMq zM!SKHmU72SvOBFRID*ahjt24YE>Q}wkmZ4K0Sxz;3>P*Ynhe%5=0yD7^+^NIJB;V} zi0H?!u8~U&u}uHH+r;UmJWP+2w5>xiR-T0<IWJV?V)C@X;Y1p5M2`T@a8-UR)Td%h zrIX^SV1lQ(x4)x;&=aADyWczc=Y5Ov0Z3)Ha)4>~IEJ-Oj-&g`|25kgX);M{e>VrA zZGGu_zHjS&9WC9oe|<(qS%$9hg*R&p(atLleO=*$K4-($cJ2?}2`HXdu^hB{P|{_O zd`f@p5*!_wF#jF;!Z|tgS7qfZ;t>Y?*C+9`3s*BXUa-u$`*73uPdn;gC_mNM?FX?h zWQCu)p+CD}UQ^?6z!47tv`=A(pcBldEND-cfB#pvlwVrpa4={MHy*@HY#zuA3>apR zrmPMa{rZ96r*Fx3tXC1=y2Xd)uXGsE{*07ChZ7jb69MPc!H5Df^zc`Hg!`2rkz3)p z+{HQ#h84JjsNj(2gD^N_I4d<|#|>*L*|+wKuYPuf7dMVh1oefxH1+|75r}MnfV$~j z1crpU$}q8!wLY?d6;vR+2}#)$%)+MyT|3eq4v$=ul|^2R2u+C^xFOWR!|Aidwa`~4 zjxZr!CBl2@!sk#&ST*PJ&n9ygAd1c=We&wDDAVk>hzwnf7#xiNQAH1e7+&<C(fZW! z*!ak6QHdJR#BQPpaE!c1q~kBpUoGmjl30e~|1m6sQHJ{Q;}1BU9`T>{G*DiXoe}sm zcF;Ki8}uQXcb1^#2h#UA0O4RHYfjW}gEmC__7JXwN%=&SmW0m&ktajQe#OX^BUok? z@pt-3M%|jfvLjFIpmfD%IY6Ah`p|#!ST84}zclDL4wKT|85ph+md&v~t0xm^GC;VJ zahPC0CJHYLY@1A|!amB5Ime6}I4e7e-Zzy6CxNji)d?G$ZYmWoHKj!|iqjyC&o@or zB_~a&CrxBMP3%t^yv7+f2FmD$90iZx<V&BXOA{(dC)B|Chm9@cn_ddc;2=uZ&&jBJ zM>Z7=@`7TuB;#og;i{HsRP5PjS|l^)XqIwCX1ilEtNZdFLro!>dOa}rbtm4MjDYnl z!FIX_JH;ufs7@-9cCJL%R!aHPDAYxs$5$iaSo(tx)JmVhQxf|X=6Fh0#GuNyIHf>Z z%6_=X)~JD!sUxFVK@d}N@=miF|Kw_WCJb>yyN=1*-)9vM(YU9k60Osj;m~g`ra)5S z({tkQJ#%0;pp6V642?X55_;R3SW^(ar6vj;Q+D5=*poU~t|Y%^Fu$3oaQ|hUkmrGW zC6)feJ{J8*03tovDiaRNPpr&PX6`}oNHE(kb98?`<_ZsHZ(8(AO3ZdQ^rL1}N~u7k zJ<b75p{IQg<6Y2+C40$m5ju>S0mU795{YZYHB61e<mM4=1-kbwI;$xHsuwPK6!NF> z{NPsmPZtO)LMTHZb7TB9Ou-l;EOJn6E05^i2|cCCB==OVq~ZcLmjs;1)Ofy11#};* z^~F%_4g@Q-A93i4;Y~1MYy`N`@|zh3=%6fTsu$ezr^7tl!=V}38Sw7d%9Z2)$6?>5 zxr2pXC)|QIVW1T&(X}=VI2;~S7Nqgkb&de_w;M*{3sfl)M)(6J{xeOJy0$tV)xUwu z*{-&dGO7YS{M9TdL43$Y=H)}J&F?xQs<Pl_P9q_ARQ1JEbUn<xrUPmr^a|yOzm`+p z=R!$-qbaFlM!`k*v(=8<vvqRor>CJ`aPfi=<werpw@lKE&<o#Xm;-(}j8W6@@hEXL z+lZQD20|MT&UD^SzDC@orOK5mt>4zA8@<KFX~P8=RqCaxV|;f*Gj;>fR5QJDTh+r# z?(c9nS5&^?;z_tQ{rT9`evG=s+~j{){~;ZbC)4n>UA4Cp-_t{>gjUtiOVQ?M<L!_+ zsz!s!8m*~xIfSbDlXmKUD$;K_>a#%WVoyEai+>xKN<ZvfmA{R8fgJ_(5pDV2to1F( zW)C%0TbBxCAWhl0M+_D*ZydIVCf<XNI&?S|bj*(Q7}RyYL}&!MOAD(bF9&OEM<dzA zAsJF4-|XwU-79H?=*N!f8#8uV3!BLaTM5-^y(c!zcxRAOZE)Gr@-|$@umjEbNC!#7 zhNK26@%lB*Hdpmp*ZtKvlnK;W;6PM>#*@$r{Ou{;w0Qs1V&4Xr5o**%XM3&z{c@(P z*@-9Di#O8IPAJnTNZF`C0`?JtF+%|dR!GD#ev27qf4`XNt(sDCncu!MmKX$o0r0MR zf;g{1oWW{$Y369-T-36b^qu&#fBV{A%thst=*eY2O2R?u>R5%8zMPTh+<e{bdYXdn zW<Yq~Q-(|{7$T?H+5<peB<dlL!CC+7#nq{;n~A5``l+OMP~bejYz?26R?rov5*?(w zOF(pROHnM_RIqD(s0iz->#bT#9db0qdTXC;E4>zCw@r+`;4RdVj>tHO+_a1Jbr<rb z)ne*<6F?YN+38qKh{Iz%!XIEG%fij$?wD!k>=;1+L1LJYZ2=716X(DNk>%On+vlv3 zQUlO(v!J;3hAI9amq=*kFB=O!s3|XI%S!p2xs=J%7`n*B6tM@5o(Dse+77bIekNth zFl!(u(YoI#Q9jv`mTROZh~kA6O4Zl<x7ym!-Am!O_YI$`bM7RyIoeor<x3ZWYI3K; z=T6<IcZL)1Y%-_vo(!4sdQmJV-e*lD6ZnL^2SvQCb$?s0oaJJR>m~I*5J)){Vhk1Y z3rm1ZB58PAF+fcx2+K$%D*|volTs_~Vy+XRZk|$%C{JwE*YgMj9Zirib%zFR(fZL= z-~If^!!_`N9nv=eY3i6HqwhE&?$eDkGL8;L^`T^+oP$kfR@*@dvO|`N*+$pN!!Pi* zjl=j)!q14prJ^Zhe8Nj`@z77OFbM;J0>Rfyv=5}Tim^3N{W-^FO5rE05xsy30tdqC zLWD~qvg{?0dv1*Zl;S0!eluWM9}+pLtvtz`-CC@nC`gm@;APpJ+3!P^I$3g_uV+*J zc6KjazGT`Z9Gdu3*373htb}s0eEG#m|GvU7MIdIX1n9YtTOc?qPWHty8uvsa^2CBz zzhB#CHb=nZ>t~^y$`sJJ9-2!(!}deM-kN!TNV2-<TEupGRDZ$;jKuwHv7lsD&OsT! zOUwZ0WsVe3k_u{y^Vj@_`Y1N2mO&fgQZg1%N~H6e>+O0K8FA5UGA1Mi#{lPwHA9wZ zLzHT>dwu<5K}Ib`WTpvKkIHaScVf~8Ot!zyxgg&dgV?`kbMD{P0@?PG==O@q_G;kv zTEX^4U|MZL%GgUFHk~^Td<ciVgkk#<_Pu|*uYj!H({(g(3zCwF7D9B*MtdKK{ocKJ z^+Zrv0b6@NJvf9#A~kd2jv#d?58)>BbVEH%h1eKKh(`4dSiJiMNI6=wbG|M2!40d! zd{aB&D{(97PwlM}beIlKE~*Aig=Q|4ai3>ABRpjX`{vsWVfpqVKg~9AEX2OB&h#o~ zL%5;k#y`l(b|uk(2P0%3NKHCABre_vjkTwfy86ahSVc&lPR#|f1T68m9AWIyGBepk z|07)Jf&Qt$D&$1Yf%BmOkC}Cj8oj@nkbh5NrlU%=Fx)#H(2epY*L=r#xFW#&ZY^gS zlE0d>&;H^;Kc90lgEWHbL`+&rqp6ypUAWQadlUpI$!$$xO)aE95WzhwLak-v4J*^f zISUHmCg3>}q+&{^CSVII<)neq#1=jNDRC6apXD#_?bdwMmSR{KtAw#?<CY){pMeQ- z7AM(0gV<YD*;YLm*IJ8buGq#&xyM7vh$3yqgSgI@*x3~6_gl63Vh@GR*f5#P5Un^l z_E{QAIRCA4E<JN9C*a6Cun<YH{7w6jM9)!x51@rHhFOAY$(d>>IeGj_7g9?ToS_xu z87#HD*;iTqR!9Qmc*e}|NWZD5GO>#h!TB~%lBCHfscJ_A>D*;8=d@a|S4Bfw#ULd# z_vJA$pBW)@qgoAv^-;@q2gk}91#%5lELxTu@f4&@zs(Oz(sG1;ZxpWkd0X_csuKoK z`39-+q@1O}QN|OYcjfVC@R~Xh>kkubV7_fetzOpxS%0kcyAgG#6iXSbq;-|OYZlW= z!oBva8t?hJHuPKHOpCDSjfoIk=ELny>#wu#HHNuRDshRD4N2IyEU7gu5~7A)A9mfl z2CkWwa|dZ!b;(j`MTOl4qhHE54o0JL^3}KMU&{CN1KQQ8G9htIkJC+b|FB+SnaA4= z9-Tp^(pZkn2xYt0pAp>CUQaQ#kJ7_G!T*P;_wZ-y@#D555)zx(TkJh*k0N649coiG zTe~Ql*n3kHjZu43HCuacs*0*zMHN-FRe5}W_w(GZ=dU>De9rs2E^*CsHP57_KOaF_ zkxRd00<`8{`3C&b%fNBbkN)`19iW|$Y_4wxwp?qo2>$ub*fNJzL^2(yUI3$!e_p2D zE-O<By>uAw_<OJUFMyIA4UH7k@LqI;_dyj8R=K#e?&3K*KLUEhe7B>a%*#l1NpWY( z#$=Y;Dcy58Aelwq0Ya(e%R<4zs?n@lD&~}AGh#*rVl+E2DpgNmRWC66W>TSFbU%jC z{LrjMA8Hath;*hvo#hDw&$p3eKIL4o<1YvVDPZh=a>Pv*Ui26jU2jE<v_66~UC2oi z^9v3^%|ry<REYt|{cf2RMqcbAN!=PEfZ-V-n)&YTPaW_`t&`~4@%8DEcMa7;c>C_} zZq3KcQy)M$%;g(dvB$&xG0z)lAq#EaOL^kaut2!(-H?l3Ikr#({DUr<lu5Ip@b_tI zxrF9WxUnz#6#Y>I`GC;vYN{Kzum2ZOKFhriR7Wz;D?Olmf}buW$l1H>aa12K?-QA9 zbn(fhY}G=Iv@{-0l8QY6QXGLAdVs`YunBzr_wmJ1A`&V4>0e(x(=pa=>fFv!&GcFw zk7XXL84%ZGdAi%I$@U!NR~0{_umz^>0t~<OS-mDNG?{TqRXO6Ri5I>;Y$Bf6=Q-Ey z>8olr;7(P9rwUnBsbnScIh>cYltwy~7X-M5AUNsm(5i$f0?9^i2&Dx2<N3mZNAid; z5BP8~A{amMsjZ7=7xQP)9>laBE?O}K(NlV+`W)pK^$WW9awy(OD(;?(u9^JG)ao^p z_{9rsB*Ee<9)xU@7wW-`IgCgrP5St1>z3|99SdX8<R%Q72xZkn*lJWjm6%0LqN2n& zH@AtIx!rhj{G#MX>H`9qb)%gG+Js&cu+H__P@+gcr?}R$AHy>C;aC68Y6QroN(fw% z=N)4mHi`P841E6l0t3wtK-^J999oWrkV61vaHda_@fVQCBF#2Q#YmeAK6Z+x#K>WX z=6S;z7Zl@@x6k&{d*mx|-yg}&c*E5uQZ5?FPnD_8Y#@Q1l(fLcx1p3dV~?;2oC3JA zy<;O@s${KLx7pbG8A8u`PHSnYbjdkc-tFxDl`nOAM#0XQ2?IVJCk_p5EL)v8IM+^u zn4vtDw;_0oYsTM9xvT89v)zriuzg^dk|xg~c`+y*o32lcKEfC*Z^20(_9|?1{VD5M znY@138~D*aE?o0%y<!xNRNL6#OFIL;{^Vd(0%umRR>`^dQP3h`u=Z*KH+thac|>qU zP7)!F9IG$=RGQ%?KeJN0FkZ^D#CgtCC04|zX)Lnob)IyhnHM21V$i8=!N|uc*?2i0 zPSl6eicxOg;^0iikhdQY@>YSHwC~c)D?jN6xWH5ZA__4Lj`;r_Lw2KaPq#T={boIv zg1Mzfd2o)Ax3m`YTntiwyk|xGpZ08Cjofc;=ya%jV3(wtYCLK1+^Hn*n@bd1IE3uV zZ>#r+CQaBhl=U=PGx1-Q0sb?sXr|qC=+lk?RT^fj!D*%Pt-2$-^SV7wZ*Xv`2pjZv zl0};fK1dkR@JuFbh;Y>M-B00kK5D#D3VgAmP(2{=&l<~P>P{^UX{sRmi3z9?AkJB~ zg86N5B$PQQ&SO1_sgTcPkS{Y;r&x{V^(PlzWh*Y1aTVBZe4NDn*S$!1N#+Sfd`1sD ziC?fEj7Zz+1AC4xIXK2u=I^Mq+kaX?=lG9AY6@-rNuqt^4yw5EctJ=0Nr;n6<fi*R zMFt|BYKnt3ff7O#!~n3j5ZBw4eB`v5KrRx@2bY9^g<eqRdcBj#MX2EMK1(1q0K6`| zxR~S94bds;K|@;j^^pb+y3aeJUJm)05y^hjHgcT}es>1o5O61Vw}F?k5%Kz_hTMDT zSMDlA6A2}=HcZfK$;9h$;Zd%fe(vN_`ZoKuNXRFHGQK6Y3L$-f8z9l+dXV)qYWR>@ z&b-FrLyfWVitGyF4H2F?=NEo5u0ce0qmI-)h6#$rSUArxdbdtDpV}xImhHk{t~AD2 zVR?nD?w~?)yM2hamK#+`@S}-}s9&|>RcCJ4py7)y8Nq>*&RO2O?$?foV%WeytM-%1 zR{RiE(z@n^4{vxmBkT34l6LhwO}^J6CgL3prR7~%>g(|~g)F^yP;=H6^<JL^#RL7R zJ0&e@EY%<T<#>L8@om9E*`sAVN<P&TKI$Au7JPSJ^Z9#)g@BR@S$dx!Q3;BU?-j=& z-#d=hmFYl%ofyG|03`dB-N$!V!=gtzMzOBxoGe3Ci>XsdU;g-gY`Usxd|GA_`M`He zlcXXpDoSD#cH_W!iHeP0>;7D+f*RBenZr~f>?yx~9OBgwPYn}Xp?*u>`6*Dm#i@{! z?5L{m-iU8%V2?BF)yk+cfnR!zq6?hvZY`(Lq9Td&i3>NO0Y8!*@~!sU@m&tKH)GWy zXctT3y4M1F&;&}#I^X5{c`)gC;#csY@C%+O6*wSXQ)p?`=0RIjc^tOEggQAJhE`=U z^ZEf<?u((imniQUk%(0$p`p1cVH<+^8*eaw)iQiNpGGE9D%JZ<y<IMd7ZrIg>Ii5X ztw!OjHB_1(`LHx^mvwQkHU~=V>?I(ptbG<>)=|pO|I8fP$R4NEgxLpB<5BnDx-`-y z<kh5alHbG+nWzYRR4_1oDm1!8M6et?)_(Xjw;#|k{JqQO{fxgxbz8BO?Ga_XDx_A; z40T2F;6W5I|K4LA63Dz+^eF@M?HoRnmvI{o){(@JMIoyU^fh-i-2>-Y6F$rEJ5e>+ z-h|rAcHvk~F-*cQC|+E5sNeUik-VY-=EEo;7x->`oV+4U>dr&H6SVy$3<m$W-YhYo zgR-4z<)A7g)bnP~Y}Ay#nCa0#W*nc}X#Ov^Q|OVLQjX5NV&~HcV^0o>kD?vr8x=_3 zj&xWT5(HAp&!^l)y&e@QK6Q&->U3Nn@3&<g;E|qsXz=qP$4|EDg-gNmV!y<dvTA=( zeWIBck4yLnnPRon-=}3R11|bl%7-b8A~s2LXadjFLPD1+BZLCU%DyVo#c%u*|Jhs+ zcG?O+e98D!N4CQ9V-z0fLKjIGx{S+(SWR9cvQK=c+=_o@k$dfl;$SH^cAi{u5f}M> zKzQ&DqgA#VCwnzMmr4}9$Nx80+|i!xzT47?iLqq&%~lzyouI|(g5B>dd~^H@dVpqE zZHqjqV1jewD5>DP)dTB~1H8aIkn#bc;VC{$JdsQcC^#2sAluzj_5Lpt1i!HKGnP;- zKFa8Tu)YMs1dn0{ww*G)KYx}96N?lC#NEq?<e^A9?7lDT5&c;u?myTF-408~7<I&X z`b0l9C1Sx+yq3i<&4C~!iJW3_Uj-A{nFruKBmim^;BL`XlJb+h_o`IN=l9;nG^rj> zs?tTPGL-jIEk)sA%*6l|JY-&+ydx%Rj>u&T`s(gD0%IvfBlr~)xxEnMr!|Ts_rIwj zGx6Djf+GP3YWW?&C+Xk_Yf`mBdL?%}+f!%;djd=hn(Y9I^T{0sCfw#JKbes9BC1#+ zN{HeoP125J6^px{u5R6y7SLMvO|~1*hmY~eO@I=kvhT<=JeO-Gs?C&wj)e4k7)6)Y zc2Kl>SmYc>(bM3!PB$-OAVBS^JLCu~B8$oC$}jv~OA%jK&i>}PL%QCY6sJu>ZZNcQ zb>#8Qh%@wV!Nq7`6K|-OfE7c!muonm$3ttQ^NlnL0aBY~$tV;{BA};COnn2G7)0_e zz(y0-?>DBXJCqWAAM-7y3z|CclknAPI(>cyqc{nx4^@g7k}8A*_9?v)J4A60ujMbe z!&*H7K*6Vt56@G#A_1{>3=dM()*le%QxgMJbMgB5@H3K7;@XVO8G`^i2MLWsdGaNW z3c8i#8Lg;UEZbkaL@p!|$T&R^ln6)1Jb^UDs8G^4X4D@~Tx;cj@Etz@AQ&=q22Zt8 zykxsW(k%1S=&I6^bs3Q>>SayirAE5#E{YhjNw9l5b}VmbcWjcY)9D6WT?z?6QE08b zf0{st48@z|Yy?nX9K@)7RkNh#<GqYCt4p*^m$W#>wId<4rq#pDdFmx3(E&e8aKw^S zTnYNHrli-*xoHx#mX2gkF?1m%bT!$PfH}RH8#+x&h-?N-z8R)C59^0dswn0@4AEkf zjdk11n-sg72EM?~&B#?}IS>&oUr<wFqeD-l)e>h8xf0*6lV7ZmJ?N*gg?4tJLG=it zRc4}}NJES5)-xB{X%lMD@DveE=fnPl*g6PJAHJRfUj2~p7l4YI>U42>n!{Z7YGU?; zFRk|0`(~=KMUvDtui>SHm#9MZ#m(t2ToXT0q_o`39pcQ!0xa1oERlUPea)mK-!;_~ zy2TtBUSJq5sWc1c88DDpSb9Mzmg%+iB+oDP`OaFt@ccYHqTirI|1}tHNiJ8+abahb znOB&!$FZ^Z+e<GSHq_i;S@8Ua5{zh$fbc&Ckrc&gDm*16B(b>}rviqPJ&vio<c$iR zvJs)~93Db~Ye5fB6Q32qPWTG)N{Na?DTH%<o~0l=UO*PUMGp&s$7ka~H_ll2GmEX4 z=1a0=;QSwCGtCe3;k*L0yT+{h4COj}T>p^t+)ky69!r|T_aR*dUmV!3eCGh^ubQ|> zWv5<Ap0i;9Wv}k^|2uHeiKKA1X#PH+;K6cf-tv_di==J55oyW&0W%jGV$B${W2<-t z54Z~B@;+reT)wpAx>sK-5oTo0bzUPTW*K1q@zu2j_aI!D(Gu4$u%bSU(uXD4dlEj^ ziVL?+f<f?f9LQiOfzl{}<aj*o)7WQPv4-Z*Kt_SbZWN?gF5Q80tDk}yD+Kj(X?7tW zCMZ(PwyWUP!#@4y$3#{y2dw56_{<Oa;M}jv<X>ZCttxe_TuS(oLS?d!R?^Hn-SoLi z)5r2d_+J|Ha1--lA=McI)kC$Q_gOD1(H{d=U)z;hVLDbT6Khh!WA6HyVe6|&1=i&Q z$#JDdSh3MSAI-A#G}{BKiV{fYLs3^ho^~4k%Fs0|YJFsSWmdiAlCO5MiFCS4@S{8) zOB3c%U(95%;Jb;QWvWc~EO7jRz)XTnXK1~3R{W@B3a(D42D@3mm^tQ{ne--8Vq#Tr z-nJfD^zKU+iTK**<q+E`S&{wl&)w$*0-bjA13hbb_&%lsMzyxw%!%J<h)5w{-0(kN zzL|qL;42y7%R#^~N0f2y71mW2p+~jr)1OP-8onlqXqHP=^~u}{J6v&VO}1GGX*K>T z5L5OcG(lrt_t`(4v;S(FNS*FLWU)zZFqCkL|D;3V4i*2BLL^Z;?deeud>|9GEs6t* zQM)GMr@jFZY~d~hhzFb0|4JD75z$Du3In#8rJay^@7Ux7NgEhf{1Ryf9YIOkoMb~k zUptndoLIHh1@^Z^F1JMqcEo6R#Cdik?h>*ZJ2*))fbdSsmeCG-$QEnH8<xKk<{jJ2 zj?TB?J4z8ONZ$<E8A^5hOx#1FsAdKNS2^cTkmdQbkSIorm(INy0`+~{4PnVLEQt-8 zMeUZ5;I>RnFi|g;NHu8TzKi31jlHll5w;W;#wZPnEYT3phb;>L-l{&Wfn?6~xF?&u z5!HCMeL2SEj6b@>JzL{k)Dr3D9@@pqd@k4<VY**#`nCt|(pa<i;GNnwoEDI}Uv)Yw zjlbKsBkiP?XnSuDAohsIVDGYC)Z(2Bqvr>?3T;%x*QoEbrV$t_he*AeuPo3=+p$;( zXB{n%`k;htbSwC8kz)AcAyn&bCBUv+*8vB9Dbv#Rb(1r_G~VqAtCn1^qx+gHhO?t= zPA1}KStc!(#_kd4OuYTG-X<x<=PHVkbKQWv&M9K0>Q=&<dzdzVfwI;Ii$CS^GkRZ! zXqBQ`I<nle5);}7+c9I`=GVF!{&qF#_U1iMDo9EY`3*I=C3YFVyATmh_F=0wzD;RQ z>Rv+`=)sTjq8wbYc_>9KXtNDb>a=No*QJN3wnt}Kch_x&W<OpDDFB|g>8Xv9y#SVI z^uDt@To5}3sIFj!u}KD-#$9sDKePI2^WS>Lb|19^#*|)dD~a%VymZeUQ0RHz-sRjU z?^WB~L5%LiukVw<n;cXu_f;IzO~J*CMUDzC<q+&7^Qkc}^=m@_Y{}6nMyldrRM}9K z-yaYp7ofj`%3rq-zhOyq$*KZ*s^wMDfDR7IB}THaL3F|io=YakrjH=3PZ9#4f~e8< zkTz^+^5y}Fr}kkhc#_7tVPXYTd}Kn|Cszsa|1V(OM?u;b^(*wqJ=qh6MZg0_LmJYR z+bU7&={Kod&zm{^u&5?zm?wxuW!7uk#tU(zbdZca7Og8eW9_G-_ofw{v&N_NCM%!J zse(O86%|*dj#iT^S5qL#mb^HTs*7eh?q`#Hvdynb!S%$<5dq`(<tofQ>+>6jJr*Sx z1HaR7PR>?jj?dPH;0U3^aR8`+P(l`Vp~j3P*9V&Cla@Cy0t<|FkSrXpO1?)IZw<OA zCk3eKQUBGTrIVwkMtxB)7P|LHozyYf{dDAxgie+P#>rwJm3L`d%_pEyfq!v@8G?z( z58LiJiB0~_<#klg)7|FL%JC#HH<<pireT18oz}1Ss(2_ve5*JD8-Rhuc>8w+3~3c8 zdnI28M-|lujkW>CL=(goGRThpqU-Q?2*Yy}8e8boSZo?2P(30H!SmnsBjI?ObK(a+ z(bW=fTuPW=lv|uop&^x<AoEQf;iE)^?dch2&{(~A4}o>d(wffWahsF8Y8%G(3_pFP z!+kFxZZ-wiULY-}>u`VeD835gUKOWH5t-$VhjRO@7w4(nY}c?$GK+onXWRngHU$to zWB$QoLCQE%Lwb3gu%nf_=a$-i5jQrcUTF+1{Fquc*uX3*5Ts3h(?sy24?>ra^BaO5 zFblPu*1@f4I~pfdFsF{$Xj**DZ&n-)__}@Q^0c|W<7?py2AWkAi-9*D;~%aUfZ#m< zYBu2a)%1A^vrpV&ISq<C_4Bd*U!R%z<QW9+P|cpYQ$WMx)QVz_IUQxC-KZHO8~F@P z_IxuAv2uFG9)Gnv1MA3AtgZz(%v~f?Z&3u<mvBELI)=8;#-N4t=Bam%Pki&a_wHzQ zUYfiApW)sSOr9bCth7V#xXGku3J<z9y0PgCKu*lTX8^mQV^E<GdEzPcGtLOp?du#W zeHQZoSOLg{`g_3?v=EEc(67<JzM{vVhc77e-@j5XCk0Uq8?@!G4caiae~*S_Jz@mM z19*Z8DTC5J!Pyn6#0t*|U*&O$f(okWH{nFmjW@PGvv=XC?l_Iqp{qSGDe4QCUAf!c z0u{hQ(XZ<_fJEQXrQd?@SkP8FF<-L!;L@>5X?5lD)e3x9G|cM!lQEt4L9)YAae=Ha z{Hp;wPXs}V{F}oMxgH-qu=$|F)m-^63BTs5UDYcLglE81D(aOXPxNn^T!}11aV0e2 zD*jS!KTufF7WrDY7q*%2Jhu+_LM7d&k_0ur5AzqarFPU<wm$y;N9uT`<<Vk;_h0Fg z^{%J2_kE++-yk3F#-<z}KS76PH3iHE&LdMs)C~(AUu)>HKIt{cR`GAlE0%q>s;D#% zx0F@#V=c-<U2LxxE0^Vp!P3kN_0F`yQ%-{2$oDVsOv&~^+p63X;+48q#xe70{73pO z7K&9`!2?t$RZieI{k#gsfRxT?(`TaDMj*bt@P|vx7e4cuP+3LTGz^j8peyd(Mz~03 z;BdxCYaNd_1a&-K9HT~|C}W(|!}-i(s7AhKxu~U}D2c1DTlKS|F`N_nIJHj{$;vxD zG%8QO#K;trrDyzF&wEHVQeaH3aXl7Y^9`96T5w#sLT(@H9%=ArlUG}z+33GI#_2t* z%6>^D>$Ate;iB;CZ=?1^cylzL)ESRC3jbFd$+LR=iHpb}S$sm?RE$BTwsAyW@JZ)k zmtbS>pFe_4-S2!NsT$jM4CN;Qj_yW0a{wKw+m*#>0Xp%^SH^sOzRAkB+5VF-`VbBh zxhtPms5&ouf4#y4WQ*0t;S9OwE1C?@l-l=OumjxE&}^b<Xz0g?RaFFq-@xRVh~&=r z1ec%^ZVOG_d@6_q<y%13ss~4x#I`?AkJ!AWNYR{A3SF;Jj56+qnrc5sEX9i(MURVm zk!7f(*GyrW`QhOd<J^{kkXnuy;eDF`_ksDdcq$mtPVTdY9;bgoMvI1V?F@R7V#i_> zAq_DDEFZFyNO{FrirSnUUJrhktGPCxCq|~<OGV9APd0Q<r4}MS{b?Wd0<cmH)GIC6 zWWI$WU`l3M^iMdEfQ&53kfwakcXD5gp4}cz*`+XB_LODamUvXWm26qT%R8Y-_6;%j zbK^|f2%RbEZ}2;st(KDi+>k_8HdeFNE;Z&mtdgJ&r2N69Zu8{dhHG8Y{ciWMD-C~u zvN31-R4*O*ZJhW#X`|QI)_od->fznqpQkbEx5QGYR_z}+y6?ACS4~;(a}Tg|Il<~N zK@E%c<2Ene&x$u;$imn`oP7PzVzR(OP6ypcc4%N-r1Pj6>lK0)Vf$-SmwMeCs@_aH zUG<O<#XiVqvCz3*)D$b-!$Ia>HOLY~5>>#orJm@MsJ81G%|XrHsDmb?J8P2GaVfP% zRlR4^8)Tgfo(H?H3<>)+C)wS==?6RHh!cI2pe|VQ$*K{lmgbblVVul6e4}y;&8a~> zoUA{qMwONc;vJXzSh54vs0+6!h?h#(9%N~)3uUI&@b}XS`D(0CETmIL-?bU4$MrA8 zksZMs&msV%kB(2^oG5%+P6)$yIg0;Xv8c3!a1YuzedA8qpDf5SadpLp*2_H<c=l~l z8fYpbaIL0%eNTJ2gDQ9OW?ekXO2@#YwO~j=mFCiz&<L>y)=VFj8K|ITMybV6*>E!i zmJKgE#Jjx?z=#ZR#EWym^EzF)y&0=%59+fD_v^5~13GD`GX`1LH-|X54`x6A?~H}? zT4k7Qq&T7h4{Pu|Sj0#$@37LR=u<c}=O{{Dlq@S&O9?MRdz5CMHVERu2Hxbx6t~L0 zo3NGtkeO3I)mHfDC`V<n(vULOFiA4U&Mmf@@lM{ykmV31d`$^qVWp7~y&G&UpJjYJ zUWz*GiebgpOg}mlRqKgY<FnCNP8!0YDdznqe%u9~vll*Oi1lOQK~(ta$Vt|ZRZ-9u ziOi5aZW?K(QPWcC<o}La4{S-<UviK?bCA>%X#&du*~!d18U%;W30hp6>$c-f7}z?6 z<ZhZjHBl0gO{XubnwFtP<SiP*a+dA=8LPdPIWT(tdCC)agf9rtb}2SuY0@N|244c* zr_fLsQcZHscBYZ7AM=TGwAn3iXirhfYPa(=GC1fHi6=!v{2cFU18>`TRy^(f|2{}A zqI=f?_97a|Qe58sM!0cJ?|EKZ*5UHB+ur?$g>kKQXU1`B33wn(J933=U9}~9noIFL z9gQLvDF)f3gD4wV1CbF2;qKIgw<s78^=Sy)=@UyfCP3pwU&`NcF%h?D@{#4sJfG{> zsI({*K}0Zu*qMF^W-y1xt5*UGfG+-5oA4QnBr<UW7W84s%&IsP`Y0wmF3Slet`n$% z#{U=VwdIJEiQKvCPDdIk%;QmERg=^50Mj0>tuK#YcOy3p>6ln7nGW`$$g>cXn#g&^ zE9~0+#x~xHg!Ak>d^B-slVQ_%kTHPEP5)mt;bC4h+n+6{@+K##c$9XfGK<HFP}k(f zwO{ype-eW24|xBVE^$D!o%)kc%l0Bv87axT4O;mV7LOy#vcg?3W9-yd9kHAnuh%;6 zpm2E$oc^1}qVI~s*5p{)z<Q>CFC-f~r;RbKh2NNSTs;|Aop^pmxW&YWaOH!`IWli& zTJ1gp2%38p`bj0{58tGIqtoRZ<+%K}^5MWi(#JfhoM2`rWwsek`_vwAiY7Y;_~?L> zjpgDbqHHfp1zE169C(0HERuKx+4z(4Xrm2dhY=khxk~QJ8Hfe7I&;(!DdWO1Qwj-_ z=tnn)L@P1mb~EowQ_6+7?N44rbb8BJxn16v7AG3<c)idD_ANZd(&*1BXTTLc<aqsR zc*ov*MB1-|so$u6YjYAQhqv5`D4qCiCLG)mzo}i`|G(0<EM`y3DN`{f`|g`-YzpTY z@v}<k-B}uW-y0LtmYgfNfM{B$bph)|$(2iC%nSROrwygtXj%DYikAj6Ym5y{qJYzz zxck!L)A`ao#8>RYRNon1(A8aU8`njj$cco@SVR|=H+_a87|EmKP1zaILp?Uzvn8kO zZ$2Md)RsvQhTQD1zRnxVPRve|v@xgp<fbVtu_o$r0Y7tSj#GAH4*JA)o1tcO3Xsi? zw3M{{UBve1wd!U6z$G^*Z*NMyLq+TcF=Li9Dmf0_1<0l&il*2oAzEk<ki4!)_c&`U z<4!taUz=mZ4~hQ#+j;}6(o}DWFTXk9&US@i*!q`cdCd;q1|1!%Fz5~5bmAz|LF4Id zNXjZ?=C|2DZ@&CJn;~W|p;~zLJbs#N;LfiFz}vSsS_0s<Omxl6Z({my^go9RV=#5Y zdUG+J4x6G?Bbgbhe4sDZwz>pJyiHYO&oCRCsS<lVHh6=vWfRB0Z?nW$6*_dJOtc!) zfgusv{>XUfnlips97Kb}P;3s7c3_yQR3}toZ$99eQs&c0j;gN!ByNCn2O#<55{Z9c z?j|RH&~So#3Ir4-o(F(f<nu<BTB?+CnK)e<k$>d2`_)^lay@B;#=aEZzQNPOT&NNe z0M|-VN0Z0ILbrK|FeD3`8~+%|PHbgq%P5$gxeQ88&>+cnLWu#KvmOYK(@af%3Xxd^ zAn5^+455I(`^1q^`n%(NxlR)<M)yygGdqi{>p0cWaHtVNDR>|f1Qwbo^{8@0$wJb{ zhp3eL*&IfQRDrtR?L@qikHf&GNH&1COI63Pby4ikaj*`n6a0jWK40aLRvH7mKxGQ4 zKbPvSO{f<@12hNC>qmccBXEFdgqjl^ih*4v6MCuutXhlEa!cJCy-IKybjiVz0X)@) zG)gqOD74zZD^c-bM_MB-WYcVyKz*p8z5q_*#P|vKm`7n?p$5y(-&u&X)`@qqi{3F- zBkI=HNdZ2lMu-1#i<*VnyE#MJ<wH90`lbRD8g4j{W-!Ql-&~jPAzsPHr10Tc6t`~O z@Eb)o7L7d%nvpwv(>fj?<i_ktZF4m|Y^VV?G22$JTaoQaO6t$M1wFE%*!JFcjX&cG zSWSO{*48zO3v`GJI?$&@LW={2L&`@(u?bJnaltOOd0=$O5MC*D3K7?+Ux$;~jYiLw zwmlZjRu#p404U=d6M3gX#14y~0Lqc91vfxLP+tRGG$-ew(n^UktTdGzuZ@$fBaTO* z>#zIjSPZmxqG{biboMQ_<KQF*O+x)j#|0&nRRv*ukxpMDb%=snG?N7QLbu{m0gh>s zCFv9icUSt%%|wrNt<=*=H(=gvIW(jNHy-hhH;N=FER(1hIsDXQ0!lqm!lk1tmRNS7 zY7<7^)u9pP=dK%1RGmjuV-sEDqiyw#(Yl(Zz$2l+DY~{Vu`WL4g$8f&<M~xS(gZi+ zx53062h%e{QQgRiu4}dK9^Iuo-qH(r|J%?SNM$`frj>cB&1|xXda{{o(oM+<VgyXT zLm$}n-hfm{v?68J)g;pS>b3OCiqUszJas^g-r2_qZ~Q(bP4iz#(Tp6MAoL~(5KB}> zv`-dSFj5K>{6L-h;B%C;Ueq1@{z)rI+9%Rp=x_;QUpI63cIj|~-DB8G_idQ&jSck2 zP>jKfp8g5}vIg8PeW<ReYtN0-t6(H<;Y&JT@hC+ItdC6}uITHu4<*(Q?!6gV+VU8u zC)?&rHIPp&Z5z@ET+&SWHm4}06+g7+wb4iGRUC9o8e+I6WPgMr&zRA(ETlZz%(|IV z|8cQ_S5)^XRuA9<{y~v$d4MKW#249x9<`ZGMY_k10T~ydkk4di<&*kjUKe~hD&<~* z?V6T4EF*8?2vcSy3S!TCW+WJ9jRFm3Zw)3h^%C^rmo4-sR}B+WzA@)fd$ncF!RLS( zA3i$SJV{3tyY;OivPVzqNncYe2BlI%O+Pk_K$|d~<EqyBG>vzHo+V(0bUGy|OfO(> z1A4MKGV*1_c#{B4+>c8q8INJ>z~}E%@e*rLkUjAy&?SmKIXJIBGMIz;_V4|f*uR`R z&MjmM9&`~O<XCcfY_>2LIz!1%W5&+owSMBs{)8TU0yWB@`2^$oPV5c%!R?K?cqejc zkbbT+*FHaT3?M!#Kf%w)m=G{A3OBM9UOde?S(l&t<0^VH(s(l?`fs`M--hVze&g+l zDDJWm*G0fp9r@$-M}wCrXHMf|&?(@j4uMy{kYolPtO<ml<nV8>(gq2BPGlBO#UC@C z&F(|?@Nq-oj|LyHze6M@w!#p$CK(ZvfG`t+qh0kppYgnPkDex@a4m64LdQ2gSFRcA zn@yf`ry#nshCW;k%ng&Ju5RY0LZ!fvfr^&Fz&t<Y6WCif+n8x|YV19P8|M?KrhG&q z>0Mc=MBix8#i8igvRBH*y*irvBTQw5Nv|MAAl@Gr5Nhd^9GKu)meMHothm8a!^Y|I zef7s~!MikU=j58|wDv2&!87%aGoxeQ^s^VtR~3{`S{|G6^Xw<^!g442vh_$?^v!vx z&^f4I7M^V%9+(UN63a1F%`q!UfZ4<`2B?aKHGG$DsqXra3u?3;J2zF&+3xZadru(o zW!EE5ORpbHMf!uNRgCk9R$gP6JJx<N^V~VC{KDoZ!;cs6uPGO8-U4ws!pY`>_^m&M z?~RfSOZ~*r@%u|CHO7P}sgo9{V6=&!QWA0b=u6Xmwh7glS3UHs&pmCLP1s7yVIJlt z(WRZsO9}V=-WL5FkN&S4Ag&0BP8r1-wW&{`QpEia6-U)y#vose)RtUmDGw8+Y7sng za>3Bb2+iocUu~zv95AZW$nr%>8N|$AZ0Dg3k{m2ABwuWNaJE3IL|N$x#;S_0tn*2s z)t6n&bANmrxC#Kr`QkC)@SVOzD<O6DXH)#Nz5J)!l(Pd7&xa9<zFL|Ax=b-PYk66l zAD-t4*n`pbc*~}S{z^MP8uI~8h`7r9wL0^mtLeG{$r;{m<}6j;1?%cisuV&Vn?Gk` zwDh=WRRiR3iH20A>DzB8^=nHZ$h|jKOzkv61{|#Z+h=ZqBadE;1m^d7DR3Io4`)h! zVv7R5Vt=e`69e9Ed;BoZXeGwtp-R{1g69?kPvQ_hkA7KjUO5B|r{U4+g|RvETe&DR zm|7x2bs`@gO$SbrzuJ76Ps8)R2>pJ`13I_XDkUSYhhTOaP;;CJH{+|6eamqt|Fh(E zRm0MLx*XlR^#0l&7*`Xe#gyqQ^F*^*l(79@F<@hh)bU5rXtJ%|%}*(*z`#|Xu);n9 zGsIMW-;c8`%gr50NjoMN^pxbQ&HN*4Ggi;azIPu47<GX=a;&?Kb-Ur1i9Xr=g$^e% z9Ggdv<_x`@x0<?I)U`o0T!@E&C8|xty-%&Y-*|ffnr`<2I%1<Dhf~_ldGs4g-C-;l zsP(*wW^^UKtQdM%y*Ec3hX7_jfxg?ueCLmazt_!HD7u$t%j*zpuv-YdkTWRkI3-O4 z@P}-RcR^^bV^a$6S$r#ssf*Taf|3L|zTN!o@s^GdU1<mrXyFL@y2VOlPpXHn?1NAc z`16u2#F)d7I%1Hz9pt<;;LqwvCE^H^FEM!6?l~1&|7<-2CZm`4TR%#kM?P&<YlIH= zAtHl}5;9>1Sf;zrUN$v3OCj|pZr9do@RyW!)$_5A2hH~7PK=R%59%D58rJWe%wumo zQ}~}xm=ORVjBjpUV_x>q>*dL_Enn7(hV;Gvd9T1KfzpviA&A^Ql+sf^mhGrLriD(o zr;1MVom#SP#ei&2pIyCd8XdSiD$|;xT=o8Afm<K-&9eLFWtKP2D#cCurI%xLyQ;Ay z<@ky%<Zp+5HigM{v)l`Ts}o2$<T&Z<%Kk~2gY|CO-t3mjCCK)=+9+yCJAFXyNC)<5 z<#N3$DeSTQH*2&5S;lM4Ci&Y_j@wJlXH#&iB<74{P<mG;5d<!{7e-n8772RrNHwf# zXeO^KhIwIkVtLrs>`FZ#c8nrg^@hE9@$Si}q3h=ANp#GI>hRQab$k5b;Vo`(clgFr z<^J#WFiQ|Gj^yURpWJwLXyP&~$|%h^{@p~-uoW8R@O#e*-fLzQb4-`p_ZB>pH}dV7 zkMGi+1w+K9X@SF3lOwxEv5l_G^NCrbSRLpeO*>LE`iO%lg0aD_Rr|t|olAA3tNP7- zhsA$41$>E@1*6w@Z=2~wTJg7Dl`(Ub{#V-XGQJgp`>K%>V})9YD<BoDkA&+|7r(I` zNUR^8^WIxjFHe@z)xL}$RmX1ThHoVrPl+ErbSAW#6%F^I@$}y=OJFf*8X789CrJkY zp^QuPnY^<JG@`D0@vWQvX(TM|Ts2vbkd;b?E(viuGi7xA0(bFeAPyw-NWUo7cIA{~ ztXPS26|(=thAM%3Ze6f~ccxfczUdvlQ)z8$n#ZTEz(4qfRWK*s%X{YLCCF;CdZ*Ww znyD4R<x~aiUMu_-;dR?u9(0pPEt;H`vm=<v-O6=~Pgy?W>60%o?x`XCqHlhH)v(@o zb4|P%Omg|_o$`v(?(Q&Ma)D^p*Jt~CRI^PcW!!0R?F`Bc9){(Hh1~VLD=ps_hd;ae zu{HWa`BlWfKRkBH9j3x)CGWz^b38`NA*YmBBZTz`PYf9sFDn=(uS%fLY^DLBzU2JM z>Lr^nhL1=+8)bDD`BYm;2d8!~c#gVx#Kb|pfF^sYl?17!wZcX7LSupfgsqjp;1Z(e z*ZjMnrlEnx*Ofk~=3%<oZc0rSd^ajhKK=9zjdZ=Hb8UL2dr4AI{^Zetp7ulHQn9S1 z%(e@-fMaSfQk)np8V%iKeJp(@T)P^X<Ub={lnG-K$xW{6C&ZxRr-<%=G&O@@3F`S7 z0d3wPe=~7PW%wAwD9>p+WWMMg4m2bB<#H_xmK$OEbC5z)s99WQ`aE-(t~<cbl0&cQ zq6}t)<{Sb{bnZdFvPzl8M;|9yth!g%FRywwPq+8LQkNWio3PyE>cvK3m<Rr8Br0)D zGo-pokH=%$C7TKa4E4nE<1tiW?;tOxf#Xp!<-YScf4Z8zNRq3rs2z1ryCy0G-RA(S zXR_n*6c)4m&tD2$ZH)-r&)8|G`hB2CEu(Q}^Z4v%J8$Ma!Ibtqt7jzyp3-MeZ4&ry zpV}202VHOZj}Ov+0iamvt%IipNL|BJ;T^6y&z6@DYnx}RkLo*5Ry}`3rX!2YZAKW! z>St$G9k>=_8{-CA!XIR}x+!=P3XRe4y}TRbt=;eZ)P2444l25SI!I|~bM`Y)c8{WM z?Omw%n?-}ncT}g?IASmHkA)}7C4U?lpXGj9KONsWS`Ux~+pqunACdpby-{hc-`l?N zaJ@05@ahYO-0pfSL3HDKC&SS0_g?;!jo)8OaA_OXOP>}u$-uUEEipCO+=$RG#02)9 zhp&YliFJbv4WFGnmthP4v6ZHLM7fMAx{nUOUr^Zvd!Cva?4;TZ<LjsWPCw5vvD`B@ zKO3>d`Kp&y_WlhRjrnEV&-O=^2vbc6#u0D+5XtK&ok)x3ZX+kF6My@6^M{i$kY$^z z1;prmSL%brv5%z36GYU;G$k<;nUAUc%c+E5@0M>J{m|$7O>RnxX?r)zF!t3r(DO}A zt`&bE13}XxRWw+tJ+m0jDxPpl1mrAmOhp{9hbx`I>E$f&ZRd8NBDLEz`gxj4BaadV z6&cfgKEiHUW<d8K1oX2DqtY!i2}yr(jznvN$nz>R)l?pc$*Vt2#Y`x&Fd7beCfk31 z;VW1|Ygqm|msJg($t%u|lw!{8J2zU$%v*BNGVlR=PVJGZ9oQM#KqtM&Bp}^mv0n*X zb<9pO@~4Gn2~99%&yxoqJZ1c!yw5CmG;})sZp(LeAJ)-FyL%cZD<7lF-2><PmItPY z_<6Ue8x-D^<dtXIW0I9rLu%Jm&^6@i_usX1Z<<G?4*M#e7h#G1Rt-8Lfcnh82SxuE z$=xEQWZ2Q-7h5i;+QxTmQ)6zE)sVBG)LOQYEMrnyC<3DOy=OdM{o9QuQ=Ef(6sUkY z#Wb|)_!lv>W=Mz>28r`+GmRWL#|Db25*?QsU9{~IZuqF*B7h%q3WrPSKU68nhQiQ9 z<{X!bk1Cnp7^HN;AX?s(QVKqVPa=PYO9?S7oci$D6r&-B@k62|3v+RQxQJK8kOHyQ z#Xjc0YVfWxvSi|jpUB~+czrC1##XZ2-2B7!!z245hE>=9pVAM6{Xas!ITi=NvSAiS z)I+Tj3Yt1qQfH%R1s#m!e?z?C3^mT;0-FEH9Vn(AKl{680uq$@KXL~WmbS|`&A&#x zcnAJZ4i}ZX2`>c}J$`6cE+y<?&XmEZ=q%!a8r1PAdntQLa8Jo-l<Q^=M{anH$L8)< z2Hk(~<?qJGo2DFZ#MCC4osCR4-dJ^&-W<^OPNA?Kc={AZMR1n+v4@KPySwQc$Uh;t zXU{g51mT<JDZ6bY@NkWC3UBp!3}{56!ncE}j__|g<_+oP$(^Uc_6yJwJ}BJa%ZO=% z4O$Lo&JTJ&ivl92cA&ft{e10s(E&w$Qp^Tvq1EH!EOmgX7CrJ*+$u)7yo}-dT&zHG zPO;S6d|t-B!42sLny<3++e@VaF39kQnx-7+zQ|z;zh*>7_c;*iqw(^ZTFBTp1E`OE zbn_t76hVrrwsR8~G(8+i8r%tUu>k~3Qd5o^S3vi4g8}F%I<*^z{b;LH^t}L8anQ8n zpmJoLTFaDUYIxPh9PZHGdKYEq+)7(%5DP-O3R6BH+)RJ)jXzEey9hqxT1&fCEBCEG zY5^<6oJ{;`c;y$_WWK}vc5?t4Fbt1)vzrn^26!z@%2Phwy>Uf`M%M{bddYMxf6Wa* zA&L@>kI=n}46k2FPP-d=&NoU&X$alK(0Ejgel%f1L9VBYBmBX%GD8C_8m0&AC5p{j z3Xu(l6bGQh_35}vxeGY_IR3P+@K&r#nP{qBZfu9`iccLe*R~y2UXq<TrlHWHO7?yU z%X#EMWO2MjPWBc_U@_XYY(H0K;*&IoRPLJ3IvEZYbH-8Dj(7lUD3a|JhxrjNexR-W zBAKrt&W?HVlm*krcS)qxkK(8|FLp2A(p`Hm?o}Jw`)u_N$pbQ#L)RU}uewI{4%Raj zKL5;bqC3WtEav_B>>`m>AXx!vy4HB%+j&u;Z0lb8<lmCgN#YpYzn=sme?PRo`_<6+ zecSjI<dk80iyQe@h(#sZZXxT+J}+)s%F^)rljr3<i+@0JwsG%g7sFq?0nm1cy_k9C z6n=~=yqzZw?JklCUNXVpi~)<J>wTn4eOxz4QLcg0Lv-fQBvF?N-AyEC1je}u$bwL1 zlROZko`ccP;n`ye*HvSX?DP>jxa&q-H2Q%NmKdkf&ood%T8N(*=4~5Mp?gZsRiiIN zFneAsN?I&TSdem7KK%%>O)wY<(w)PFvIB&EtVtNIOH5S)`yl!hVDofv!tpHx>}<yl zwrm1_j;E~YFX}o5Ic$O*&?yVUps-E)(yiqIFaVqm2-!{^@S*LhTU|jCRrlev&{T*0 zuqG@X8wCSA{WrV&bCs{ZscP^gzCv&N77qxhkTJV{c=VwL|CXIe*V4Jigy`QzzF{`l z7ZV4hZnAEqY7ueRn5a;V*5BIrhQNVaDy}&_F^_bjw&5d7ChEQL`pQC%yPqosio&}s z2=J*&v_T)88bW{ns1k^Vx*Kz#G=y*+2HlF|LUU6mjDtTYyj0Lb9~8@B0lS}2gM_bB zeniAVzH&2W>}$z79p@QM!oP!M(`a>_qY6tIA5v_Q@UXS&5*ndN?fTgo`eFBlzuY>0 zaqGKm*S1|rasc|V6HDZr`pkEcI;RfNk(UWZBI(%-^js(@o73oi?-SPbQ#<r?&LBVz z{Zn(COx=&DeXAk&F=N3_99ORHMr2gR24<<dAh!jcXHL{lv7pLL@>5k3t`uI>0=NAc ze@3O09jEkT&O42Y$jLy=eNIUYPJlrfD-Q>S+$ks(&0Jh3(6DW2)JMM5PZh8!IA}uA z2#ivRq8P&rZX!eu21Hi)6macj3h#Cp!%K<GIJG-6Ain(XgLWhgHb0#=o=uf8LCbs3 z&jo%{fm10ZskcO?A3{$Y2bzv51^h*SY=dqx6?*WUZSbXQA|DvQ#9oPWTR7<hH@ThC zc!rYUcYaz)gpUz|8wF?SJ>%Da34Upz>N64g7b!Ho&`}3;x5yGu!k0vH(gtr!nm9|% zls5k1Qli(9nsJiHg85m2F9PoIQ6Q2|wrJZn-}(u1joq^uf(c01Vme>~XZHjQv1T`0 zX2p93(W+|KAf+aR=?%t|Hkv>MQ{ClAW9C}4dZ!jpRdw3|A<$Ik{ngajsw_(&Cl#um zE!IrTy<q{BD;F5fKm|W}_#pG470BO#UU-Um_6HC^Zpa0;=1xEjh;t4w(~WC91FC@A z6qL&uPgI#I9FH%ecyFCWqc4!A0qXxs)U}7rgvwC}7o8k+x2b{MmKv(^1RZP58fpZ~ z*F9}QNr1E&lJP>-o&&)fu$UgJ{I69-hP#M>z>KGv*XZQN<>bzrH6=7-X#>(*2T=}Q zEGNdi8p2aq*fS#hr2`^!2MXK#q5gM%&oqkHRm1Jkg0t)Cur92EWirN&D&Aoz`awV+ zL2>^-l(X67;4Y6=(z+_Gi&)}D4EHX#Ii0(b&IjHI6Ogo*<?Qf7_<(akg=FMD3X|d_ z9a}p@XpNiQw-c&JFw@bFaQ89Vw}IS2R}Wo>_FVlccqJXkPPLx8j9FmbIQo238X4YQ zcoc=qQJnZ?BlXKp|3F4w+u8t48m&i$*vj49$s*tZyOz`5mC!ROe^!74Ar_hNEQf9a zC*?=C!P}3|U7vu)$=5N|4rrx@Z3me2Qxmka60N=QokTb=zUHCyO&`;{1O~XL1AkC> zXhYDL7mBIfFVD@s{=*1g+(W^38bg%;txC+)SM!ZQ*R@B)+0qY7a-+lAA98y-817r1 z!JbAhW6;Z9UCT;Al^)?Vp5B^XWtU#_(%v6}yg#*jf4=nIl774w^!Qu*<L^O_D|6qp ztI*&=&Er=&@!K6}Pl9}oa-BYwMb03K3mu~gs?cNyt_%qwByV}CKYDRqdWJ-<`1Ieu zGdkiP`;#W93rTYc(3O^+C`!_4cThj2xYB)t*l**umg5hUOHkB#%WM6@Cr~DcS4K%h zL@QN=^&Q7AL}~0}zPKPhpH$c6bgcwLDgMMJz4Q>(%y!DaSp7x4y`7~0SFJh5@lY7> z8O-F_^bR=kX|N-mWv^+|4Wu_cx`bIky-0;vUR9KDBrN9R2?4*u%G;n1AGgWo10RS# zM+c$pw&Dk>AMrrKJ|83v@ab*Jl-#_qnRyXh%Y}X_6V=T9WOC=JLNZiKID@SD2}>0( z&h1;KgnO1-4&64pLkgF@9e*yO6jbP-u!JR!RCVTV&r5apACb&+$$R60B7Q6z$8;`q zUpAUkJ17M4bM=Z*n1`9y7;bSEIQ|->a?O8vB~%z3Ic}CH7M%3?X-oPh?FArf+Y+J% zjE{4-Tj}sBEKM2&B{ZWF@MPm9Wz))r(H{?sh6J!}38Os|uZLa~Ag<W#-byyTD0S1V zWllrq1d7#73=nNE+pyEwrL>UM?sx2I-FSUrgtkg1wa)2g341n@?PUFZ9Z2>m5g+?f zGLgwk-R<V1?VlMYd^AL!))~@DUhG^4642ch$n{o#p^bS#{4<wnQiGi%10S1%W9v|1 zkSZDg62`W^e8-O&)uz+YfS)H46ETPi^s`>$3oGh`%7NexpV(YJ@$ig*6vZBej%CYr zHc5XvstHj+Iaeo6RAWQ*2Y$c6%YQOrmi8;JF@Cb6bZRh_1b%0aEI;lw5dz5fK`XEk z!^f<ZLc=<PkT$ep=$<`Qs39#y~|l!Vx;LMbWM&b~*JoxU|LzFZJWdEFdLYfsV_r zi*^uE5hAb6I$bI*Z(B#=@K<%Td?FXKN+KZ%KPG}ti9#j%##rmB)V8YZH>>s8Yx<+A zxn<#!*!)j|RidjA&zuCgF&e<xTJLfyFXFew&XfP?D}?~k)^D(2790-;KoY~2t|5L^ zE5kKNVNG8<x=SF*@vYs`Rzn;f#3<fVz>7*A>Z&W9lrPiQD?KYHVLLt{u})L3PZda= zkH9?e625Lo`P@R`TslMhkIb5#1E7awgwAZ7rWlQWbg`Hzu;m~=!B9(##@VCyU7GIg z%2%!(?OPze27B+DG>Dt1G$^^37`z2IMsq4US!U(vW+MOfG4d~NZesE146y57!lGz! z_gjjd4?aDW(;&uY(nIp6H40p9+aPHy)jo$7e4sl^a7Pil_}CkIQ=_5$n90+}ZUfIW zqaLaxyy%7KO|qoBRb?}hB;|e7Q4-kks{8%#I>`-TOckmV$GoQ%EzC9bcRh0Vi@^7V z_RH3z+@sKvj=0q8&6z&-SuxL3i~a5b*p2mM%r6^JQU^mGpGE$@#>v$+8VPnHpJ{)^ zo|Hj^ibuaog#ut@_McyBD<qHC#e}1(&>O&0XDfHOgq$k52D?+-yB`T5;uI)Y{rUJt z((Y>N^SW3IyV^@&jGv(ESYhw}-YiWiud4!}@bGq}2k_R35HFCfJnc^tMIaK*OYkF) z+~@F+03?>rD^NfpK%tKN_`YbM`)Zx>&-w*|{MSv-=-<bqd(7Wfjjsw*r5zQcIDE8A zDTY%iP%g%!mM;^nlop0Z`45apI$x8_rn@htlYTxe$3dGVB>|KHT(-!63*<$*YNgbM z&017@UM>r(kD6k3yQj2ork)B-Geyl8MY`xgll4@{|A|^easpPAXi(o42A}EG(9dCP z1s9?YPs8;i)F}1Ql-~|0!BGU3-C_QxtdwGly-rhP_yrm#6INx-W$Q=f^QY%5?(I!P zy-i>6Y`KD%H!#DXO&@@J?{eTr&IjB1-TI6#%HYG1Y{LV8Dn5_WZ79Ms*-0f1d>(Kx zEVzW8TZ#PsprNz}FXg?0Z$$dpC1&DMCHP-Z@p&$+y;1<=-Cr+(e0?$<xahL+9tAJH z1(#?~ycVDRj@=>p1`nwK;5{_o4Evt(=U9rh4)<DV>y^xp#Zi19fHipFM0Hz6O9HM( z#jP~J?`7v^E6kNG4BZVk7Z^EtbbdI$J&E7<o^zt*{s`L}L3mHZTz{CXvEsh>Jjh4f z(XMcBCs%HEK_D?plp9u6)+)uaCq8Gg5_2i@Xp!G*am;g@H^`LFq9Z10S8V8>u>AI3 zewmP~&!m3kZ++MM_$s~HUA;ca5)-z^#&H}#tRmsg^e|9tbz8VDQ*!tdV7llA92GG9 z%633Sd<5UUh0U6$OhN?Ty3X0IB1;eto|}LX5O}!r@eXW;3H!w?a(*>NCs6Yj^EvXc z*2?1DC5_Wd7ZlieRQmib5rf5d(@hsY+}A@S048Med+pN60YGgql58!*tz%GpA461h z{olQl=>M)c3tSW81h$g^BrJ%q0LtlJr_k+V_cFB->mr)9u5e<RhV{;Xqt)IdnZ}LY zu)lx)bzcqtmk9Z-`<5i0jM^?bqkGhQ@orXVQ_m6%92b9nk_{aXLB#U-ohi=VWlgfJ zJJdu3NlxKkSJQDGA7fu|sl-W)o;bE5DMuyOaP83iaeU_LdTM<)?2ZBZgDL+5rHp@y z@(;F#QVjLpt^Zn0DA9aDOLcx1DB&@lv9T3@R+q@Vzqted8~!i2CQu@XB;Vy*#uBUl z-(NCD;aB4ow4^2Jxj1^a(u{ouqNip*>7@(v#4;lPAD-U&E6VSEyq=<)0fz1lr5l_X z8tHE7Zcq>qhweriq(wTFW`LnXIwS-{8U#f}MCal4{ygjZAKdG#b^ma#v#-5x{O}F9 zjy<2H@^g}0gDCcs1K6Dl{G92n9#;CYITjTOSExfut|RfHJ)P6UbJNAM!kYYC3jMfQ z%?pE=C!c``eLW9!W!}rrFGU}Ey;^rJe)02@Lxwgdv#oPUf^&g;<AigecQ-YIsr0Cf zei5tWFM5^064orFB|$7liRa+RQmL1A&|zr8km?&1(d7v%s|3>S8kOgnzj!OC6HMQh zv|JJJT3s3&xmt4Ti$RMrhPsZcsOR4<zD?{O%_-)-BjA7i{=}AFaA_a5r*27dizHd` zY<2g{bGkJ#4Dde5(aO+S<*$}K|IHgWJwb^5)FIP{!(W-le|uO~+@IjxebPAP-Q%8< za8PqG``G76<Lq*j0cuOYw7-1wX;ZJ*Z@D9s*EtG@t|BbUvhV2?L+*eV;hFCU&68xm z(Px99+#~caHyg)%UZL<5tnRp4EjbH&{m_jC&7!abde3>X#kIES3D)=SHC7_J#8<OO zGVQ?m&=i-z1<i-&7hQfLQ-Mncy4p{dO`fDYU9q_Ti&t%4k~~|pPt$(3%J;r%kSU=m z^qC58k>7Z&(<1ftre{ub442+x*|`nB_nY7QpJHR)Z$D#6?Hu(oRBkI&|3Jt>7>I#B zu8vw?&`FQGyceu{;%(OxaMYIt?0KcwU}d)y>MqqDRbIaB-p~HZbh}d=S^_(59QF?R z+W(UD)-t8-d4B0-akFw@FWye%gI#=4Rra@^jeAGlWpz2aJF{Cuc=y+aNqC04WB-0W zF8}#($2;Q^?@`8DOz*d}XV@1v)8{K2K03O}k8bvq!ug<(LDSRS*T3#~-oFcDrN;cm zQ|xc1{@L|4h^l_4r%@_nw?V`9dG{i5B!XlXM=jI}L3i)28;mIZ5Phi+<jNBvkX(zr z-vncQ6FF8*UE3t|KfZCkx$E8|$m-8V?4+*L$e9N7!^e3<i0Db66^RwAXL|!82P2I> za~Bn|Q+m+mQcAP&yB{HiX-#-ou%P)!PtOXgg%#rGYoDcJ{3C?Mcgg(n;vYv}joLW_ zqk;K5cyoHH-e>V@3LrZHK9rIeH>IMDh%@au@0cJx4Oqo<{y$if<f(ro|5*iTjOZXJ z;WJrw9{j(ZUzT$_;(T$@m)P$S!XMd4Ef^~p>v&nh%#Jl*qBHrj>i4-^*sGlJ#WI<X zFwzU`_qtMWzD;Q*R~EWV%eytJ+L6_-#0}&{*p|gAL$ow*%9D71OK8knt~apNQPGCv zH6>ROBtD->U=>XZ-PdHn;zt{X8{#o_Dls0`NI}KFni35TzsOO6JXN+2lQq}oRWs*b ztH~+`UZQm~eL=AOAuJtx*yGBT_1Wc`FA#HdESo_~N_!=gkMRZlnfQ(#zCC|A^l63e zOM1$XqX^=H%W*BEW?YG61jPj}j_H3rk7i}k6#N|0bO4FH?IPsAjPqk)Tk_@*i6=Z( zBv20|Tmz<d&m$CuK>r^?smQ0|()fl?wG$-mh``|!w`09u6*gbG2ZyaVIT$9Q)okX# zPql`~{$572+-D;gbVi#);GPVi^p%cx%M55h1Ks8zQENem+AOCAQJ`HiEIOybyI9@o z&|<Zxq_pWJi6?Z2-?aOq1V9vjM4@pv{=+44pqj9n?hBdpJ!Yw{-+X6w&`^qwg`9Rv z?D2^~VK;e=W(QY_8NLrtV2zRBRgJ0&kp18)8rp12wE;kubyIHWQYts0Yt;id{6Gwl z&;O$yw;3>9cR?2Fi-Uwm0*mhiJ0F}Tt7u#mqF=jr2C<prk;}>wKJzqYBT4Ym{*P}w zTZS<8-}8+v>aTKca9B9`lx!b=w!V(M$0CR2;fZ*Gr8vse=jP&{ZiTGNe1x+7R4fRM zKdVR@VibhcSZc$Z0?e+Qw8Ou_ol8H*T;Gf-MQe*YFhs8O6HXh;4CX}$?*AI+3&nS@ zNndPTU{x=tKkUST>7Xk=$_pESD`Wk^fd7$~NI+G|?=zSDn^IBT5`1jo$k}I3;c<wV zqF<uvbQzaG<uJ?7n)nQ!d3yv0O(7|PbW^aSlThv4>p_H5t1p>Bwr7ZMnMA<c??`fZ z@JhdIyOqJ^cF((!Wv;E}HfS#MS`jPpZ*?Uyu8fptj!}%fZ-JsA5r_JwL(Ko;g`yl$ zUS0uza3=V0UOP{N<!>Ff|Dn$aaB2SwiDX2&ClTR>@x;ViuxUHb5%`xfe$$g9QEv8s z1s((ooxb03Pmt<6Oj!?$ScbSb3nfXDYyiye_I{4O@BiH}v?M*X|0hS=)22B}RIB16 z{&3_>ODT>>Sl-L~QDoSJ*#D82H!D*PiUA&mRy-VUq!c@`kr$pmJsY1$-&^3$+GnVT z?#iT|Q*t)ukh0oynmRJ0t&O8guwe_0<8UgSW{>X5t;2kz3xJt%QF-R?VPJls5GC)= z4EfN@xfKf28f!e*<T9c49FFF_R{4pi?CBAHjG_$>bR;zLDmAWN?v^9cRtvg|s){_W zV1+1_l@gU+s!A(b_P=B7s^n{GBPi&liI)3uxjgDmTF-bTly>;@RX+8x_RA19*CHh* zpM$Z-jHu5XEI(>p`c5BN{(04J`=jAypG71(-o4U+=1KubYy$u@-9NsJ#p9}TJOxX2 zB1l%*L~llP|3P>DNi66p67cGim7s7^eg$VpJzwX+dPhom{oc`F(i7Fa#ACmwmM;AY zr~z$3d}oK@(v-FtQsnd~{7woLXj#P9IGzh}ieQ)>P%rXcgGF?t;hh1Z>I{f>iE`vn z=bs~ZM58?`OpenEXJ2t=F9QWP%kj)bF&ePONNB_Ih?+%|i-zUgcfDMwL#fN61cz+R z)WXgyc_kz%W}+F)elich@TZ3yN8ZrrOGCRs&kt7oE`B&XytG)PieUuFX*rt&k3K6h zh)Ej!|GjyZ)UKoug!o)Qfe8iwPoCBYP=s`Rj5>ujw+qlWj))Dazzc=v5h8hA!1Hkg z>XfoK4(fI!)c~SCxIQBuQHzSBdKNZD1eZN=TsVW>^YbMgyNZFoT~e|-zse<nmoFc` zSyB?O6c1~1vl>O0Srj!Js434*N<GCAN_pE%kvT^SDgy!a$g+e{#X%r7IO%6<3TPPz z?+)IHErF~a`6t>`-V9Jf8$~pnw8a=?kDzgmpwR(R8z89vs`4A7$Rmeha&DNDswn(+ z%$k&9!FI7wQ@Xm0GzWbemlj%8X^KSOw8$37uXGD132o}GG+H`<E(NurJ~h!iIT-~- zSY#%k%i%v+U#S^!D_F-jK>AI<;ybbwVH`7C9ONLMxLcO=H+p;xX3pmsu2-o$>ZnLW z>cI_u>3rrBKhSDk%EmaB&B}=!-;a)>g8(SSUk1rx-OGaWWg{sbY3(cPU5ndYW+7y< zTlJw*87#_IPz2C4petwEFIQThB7H2;hb?D0KJN*Xl4FmI%b#5wKv=j$Qg_K0ZATkV zp)TtWy0_R8(*n}@^0Vo5GIvORr4uuCK~vbc3w=TK!d%~-xhA=FJ>C)hcqJ5=6KiwC zBW^$<8OcHB268sj<nMUtPQeWnC0AT1{3uLvAPEYBQ+&J+r#>snm@jBD=Q3TOdiagY z0Lj&opuqhU)sA57)aN#>%%;*W&b-Rc;M2-7&yVq=O}KL0Jf=(1VCVK1;{WF7&gOY) z>zS72@NR-_-wn&qS;o-2%YgRtd^HC@IA)w<V}eq+j@p&JpBMf%PqUK&$GUkY5R{vW zu@-Vaz%0ZDeDmOqbU9uU3oHMh@|K+Mq058!qA6Y!k6PzE*&TRGGvQNvGzuKT;+ouD z>>%k_g;I9pN01=3gyJ4MPi?s@k2*IZQ7HsbSyIklkXMyTDcCN}I~plyeasjjjF@`G zEA!D)l-+~Op{l(?fY-l*CId!qTm2PU{+z!&_7KJhe&9K0?!TjK%L#kN!@&n&>ez|g zaHxrlqGNjVCZr63Um@(O%+0rhcL669wv~_d7l=P0O_Y5@vnJA+1<R{_TSWi1j$VR3 z8|H+EeUNuT;*TMY6ONSVe&h|7^7!~BWfCcvP+9K|8x8<TMv1)zi&^?|6nFCy?n?Dq z$aU4istaJjZS_Nm4b=fifB(8pci2Oz+V=rf>$f7IZSn~Bs^kUU07S!mL@(U0ai72G zyJpi5_oiQoO}}fK{!BLgJ!zt9Z?K0p*M4urx;JCQno~of4n7MLBvs>hJR}X3Gbups z4>zCjx6Bi^T!}WW3^&7)q*<q07%XcYClOnjqI7>m&u>NgPip82x%p39IUcuCY}B(S z)wM^q&1<$@gW7l<gO;J9f|fN%0e-nZb=m<+jtQ;O%I&5{j|Wa<4x-v`soNffc1RRr z+boEL&3cqZ7dw<`I+{*89O~MwrXC>wv>Oz5sQ0`>MZF7~ZwI!w>Ik%DeQRs3ZPBu9 zp|MnW?9s{?P%;9382-33T(d>}yL41tXKbj7OOy_ZsB@aWGmFSN{@eQ(0$sV5j&U2E z!*QKtNnHURT``ZlD~P&Z|7l@zY~St{0X=W8{qwGEqPw`xAlBnu8-aDvRF@P(Qi)|( zre)82qF&z4_XBbrvJAaL9zBSu-Va25>2>caKz#+&eTVklZ+p6eM>^kFc6%-MeU$6X zV(1I|-n+ukpN;Ho?dggX=skGcAWz>_#_(>u?#c4wzNZ_#p9=?S>Uvj+(1Aq#-wd!F zn>_>je+Eu0^;_ZwcI$e65W#K#^iXKsuXqpWWOZBi^z6PJAPgG_c-*`#P>C(%PahVe zn0{FMXOL#2r=$QKCO0%0I>1%bA7$9jz}PeFF|<eDkt)#7>G^I^V5nka$Z2(u<ZPfz zvtxp&cfGDpS_=)l>nF2n&lf-k6QM7}+f0&7jXZ~%3x<?>`*)8UMLb*kJbKgWM*DmE zJ$kzjdxoWZhYhEDtcr#=7{*|mLz0CUflbVVun{vY%->M76r{&uv&)rnoGG-G$s^*E zWiPU~!+;o5@Mk#gY|LA$cC4p2uWry<YsAEJTySH&xM;B4V^VLbUSM<B`3~EU+#C!& z6Frkd=R6*SCHLagw`8A=#rJkb*P~?x`y0a0ahszWjGc^O3RPC4v5bk!3}bDKN!@Y- z{qlnlxp(^0qmx$SXO;u9XCtf|?Fk+OALIv;>u07OPaAJ`=GC{U$d8NkPV$;fhV@uE z5{ukBMaFwaWO~NV&boV(T357cr<1EOR<n>7Q@4M{Q%~=EmUFZlGX{clsI%#O&z@)U z6EDIrRK;UOo*mx3?Rm-bvuE${<rfz2Ca*0Q62gWqi>B`G#zcGPe{Q}dYWNT&zi=iv z{;zkTCiFu&(IRW|s9w>+VNc(H{G#UFP<hc3Y-TFy4#S>2HMrSL;)NY#v0hZM9=@>T zGe5_$)lVcRO^T2VBMkf7tOn8Y^I{E?2L?k@FQ(LbKD+~uU53sftmo;xdM(a}ZKqdE ztXI7HmZFm<O9lC7?5AT3W{;8wna>&>t=bLw=Y75U{kKGyGaGY*yK;n9v;@+D$_n=z z#>IveIWMYy*H0Nuu7`<zNMd?Vc|I=Q^U=7Vv&>M=nqe-mVSFQbeISK*#%evWZ#}oB z-^XC1E@T;RYIA>D!b$F9i}gs4!s=|!W=QwuOv9E>ibR`S!<_b3iqO`Ewd7~*?ZcF9 z?}F{qneFrQ?XM)Cu7o~)|LeKkhuHbM9b7@UmDt=y@{Zc!({&%#4(rSiz`K!<2_!GA zrDg*|^niClu=JqPyPRRxiX{(P;tsZ8l>nK14wAw)SoA*emBmB$Svi)<-4FP%V|_SP z#2&VJms9&)XTTPWY6o<oiaj8mh7+O0->7cv;G-%YzyWxdFi{ji`z7HwRB2e0=dbi9 zFz{4f8BnJbr&ySh{6cu<yZrpH$I~m28Y|f+_^y|SoSovq-AaK;>X)AqFpR|)(~>U_ zw_r$e{07wF3$)C$)We3-!#Yoph93TlZM@nFa1?37Y;ljDK9EKjNVWr@L^De50H^@R z6vDMUC}7$JAkPLyE(|0|Kay?~VWTF#)5ClA;$ayA3qYn;kYB>W*rCd-WPp$gupPJ` zjlUvta=I}7uJ~1YDf6y{h-~E-UjvX9YoT-a!9@R=l}Oa^zk@JM{`u{_&0^ToIYPH| z+!u3%PtgJ&XV14uFAznL2;qy3#_;lT@RPa2pB;}>liHbVfh4{_DPbTHoC0qSK#lr( zs|b_21pM>{5;gDm0>QMl$K^UFstzYE8q9=n0JI5!KgYub2UC4L;X?zUU$5|NLClv| z&;3CntXEK<tFX)~h%JDeJn6GK=_NU!cZg5$2dNl<q>$Bc52&_H4%igtJOl;Z%bt67 zVtf(0Lyo#Pfg09s=g-ZxN3$6SpQ_zqus(Yj4UutLAnT74VoD(Vu?(ADM}}rEk($4< zS{^MiROF1sRnOH&nyO7VF`K<WlNn-u6fmIn@WFX5|Czw3ys_@Dq~Gc@B2eA0_4+Th z3GFy1h*|in!N{FMZ_?kHpYSeq`qEi`hliiXeS?HwoaZ$yvVwHiT;zHKz(lOa=`0Ly zzaIO}1IuQ4ILJ@@%Z^EXfo0pLBt9b5{bVoDR95;RVqX9`04SIS5azfVeR$PK3ZzQ| zke34SOT#$;K+FI=-IF_VRxmOgL^$`29KKJ}#M}NL;_z61ARYJ;P9mqKh`^yJn<M)` zEo5%X#ES}%^cD2Cvo6LV_xOk{;svTQ@k>1K1%^_fqjA;$vzXekqY%-A5i&+Csx!1I z7n<h8!ymG8M50O{yure|$V6(VNn&!=`<ZI~UWTmS&^WbkYmK^_=weL*)vKdpwhFhy z1X7*qz!1EB<&nzAg%^Rr?aruF7Ns1*9VDzHmRYvpF(oQmEuFoLejd4evKmLhGfB)4 z<Y@3hnhPhM8d|QLC@9juX_leF|8j$prPzECL&Vl_dvrq&Xmg%bm3xV^@MhU{iTdf0 za6<+A$$U9@9RKOp0uHtWyW##8R?uM+qoDNK-=}II0$N7p=D8i^s}j9J*c+Rz+xtXR zhtJ{m)}NruV%<*sQEXG{1tl@5qjXCoAQH;9JuF>@`0GLUb-+d<W4B+61mEmo)GFw5 zr>{<@(`SHV+zt<awbvgXFJRUZ#PYx(i|=hvwD2IVV@TOWeAt3?`D=CF`lxRDQooUo zL#;f!TpKOaN!s(w;N57dYxf#%dapBp+6QNMHkbqb5V%+pRp&NJ?=vk@-RMe)reh^O zi!SDD92%t8=dGix(_EQYh|=$D&lpZ{*PPS>FM1}mR-|efL_NCH7>2Nv4u0w4KMyM_ zW3DStP-77aoq-_M<?W(0tCg>dXG^Il)tI~l_p&69>d)$6>~1(ivw`HVjMm}Q)Z#o6 z;t?Gt?DeFvSf&CLBK~h=dSyX?_bzDegtfF3$fH)e1N;=e+3<d!*)~=BR5lN_c3Io; z)55cD`Ps(Ss6bO%{+(PYJ2igIPV^ml%@G8L_=bM~q;u24?)Uk8Lg9vgDh&|+TLO-v zbYw>|zq=9e9T4o4{|^^+i`S8S0szvu)O;Q+g8#cb%;gYvoL6xI??f=Z)O=w6p^nsJ zF*-wAQ3epmHBnvcIqp|o#%h}om#>0yt#QiLuRe=r1hH0CLx*_hJ01>S2M%kJKkmlF z8ih;my<Ln?5T$dhUO$M92dHI3TgP2S)_WU&JIB?ROt?>Vmpng*NkfKIt4?e1y)!gO zWmB*alJIUL{VdnzB@<%PCHAF2b#{_PNdcW|sD&KuJLvzZX@C38!JhFt(AU<9*?*kZ z+1UXRWeQz%;v12{yY5dX)p9dn^+nKj&-Z7qzth5Utw5}B00eaA^y?F`bExim;sS#y z_wR32y)nO7QE)Is{K#z!clqvGpu_6tp|dVWN#6OEGisFl38x)iGM*(<gNi9_6JK0u z&E@Mv-W_)XuiHeue=s<uUO96K`aVZG_zqV3f1`ts<bZ#4b1#9{M)N<j-Y1HmyXlE7 zEt!a;S=LE>T!xeMjo<`XW`hx)g|rfm>4fgS2QeZ=c1n8cT}TSwxRUf;EcleBqsPfh z4RNQBi^YSJ%~y)r*J?OZ1_=witBT2O(*gvtLKZhijB{HUVQK;Yn<(hwo0HS(rvy&# z5uo=-PV^R`R9XU#dormIdV|Q_C2xzLr`BvF&()Pf#w_mutEL#^EdSzD_+jn6OX9FM zxI+(tccck0U@fH;xqyH6kKYj#ZN^K{cnP#!<GPc=k-rB6O$rijd2x%!I31V}modUM zz_z`eueM_Ns-!{-&?#2{#pT?dslVA|T|6snHhA_n&@hXhb(mI`^+3#yW)jpFn>Sk% zZ-L=K^7oH=+a4>Yx-UdHJ)6*0cXUau;nnspKo>}g7BVeiDH39L7TN!Z1LgAx>f<oq z1wbSyiPg6>&KKHcy8P81{p+uwp0$R%*)v3hBK+ph4=U`9sA$C?3``JvBN5SKnkRar zBMtr%RCGq#dgxfwo6qzm>O=f?ZD6?z?lh8nwYcycotq2~0A6LHolMBEK_QW0Smkcq z&^`WL+Cbro9|l?*M(rU0^(TArC|2?)LbxH&E(VoiWxLWgbO;ecosy92RYAph%L8Qx zDQ8VGVB}>iF>3{`<&qgc=3B%bqTVR@Mu3!Wz_94EWZ_?iAo0x#+K~8R<^rQh;d_<s zeLF}=v}b)*QUm8z%@`-WD+W*$LG3;li3~xcV;B8b+9+fR5!2*p1xL|5Y>-9#397vN z1T|Ajv)1}vL}CFWMc1TLV>Ei`qXwijj=BXQd?%7xQefNB@IvVJ=C{>?qM%#3_SazR zjbSQ?EuX*d<opV?g<%*@Tfwqd79*H$;^?8V)tnY(<|Sl=LYf3m(%03dbiqs^nds>b z2*$2fi}#*=$XcdZli{xUYF-2Kj&~H^xGqF2SPG)v0VD-QM-X8;pN6*|Lzr2Y3pQDS zB(_^1*{m^!B$tuJJpgfih$APDx#hqqxb(i|<&Qv*pY5#zdo4;|5Y*&&P|x+;E;}(e znFI5wXa{{&c$^Y_>^|JY@N2}cSzcgcU*F6zkS(<&oZx@A<-Lp)9`_^j-suv!m)*+j zwImB(t$#pmE35oJ6Riql*Ec!y)n^(30#rGc@hESh(mSYzKuVfIGw?y8sD{Rv2*{Vz z*zwr9K=@kT^6!b6>EV1vNnlllR9vw140}(Gc-7132Nq*WbX|UdWn|}K_P+{Rf@(%z zw+s?gkaw??T!~izmGOcwd$z4I2qy8c3(PTk^GN5HQ-3L)QQx1<7nk;dpSJJ}p2uz_ zB)Pd9wX29d;|9|N!$HLT4!5@GQ8HgN4kjuBZ?2PD7>&ZAY-V&S2JBIip-FgsFPXmT zPjK)&pAb=F{vOZhhE43y|4vB7^e-MSKj>O&+Az!1A3f|+to5q=?%dGP0v7P0Ec0o| zMScMd&#`*Yxc%W5!)iI}eG>z!`K0ZyLg6FcramDHX=c=o0@h#jgKoXytI$`WeOUtU z<Nq4<X(kbCE{mkiys^1d0W;7dd3>$5vzmiG90BlKe-cld1O)35D1MTl2-_aP|Iwiq z9=5K3HYf1p=c_0G3Jav3A1b6d`kW`z)VLlP@jQXj+3ry_rQ?aU{qXV9zxwX4`1k3G zTWH8^NzfbE?Uo&B&8Jg98FF=YtL|yw7SEI4Q(ueU|GT>5GyZW+q%`^++mgCzHD%aY z_xD?dPw__7qhHgXuq*ospI)4leo8;#dHH7x8-Av&_FF7>buEp>_uP=_-=D*mw-QTC zKTnzNP9K2;;b3_<L<^2%1;_P-<AuTTli>tKaKd^xQ7@d>3QoNP*6DmSUI+jCxF2BE zPl-n1HxCdSp(&F4fbH;a&HYEGsl@4`OXF$nx9C#<#p$99mDT`_c=uN#fSYFK32lUg zG~b#T!h--|+@1RJl*E2;kh7hVw^HyN6+t8{ijt#s5RtB`O?a@`QtdJHPbngP5$X9B zsZ2O@mxa6t?IF)5k#rn7n|mZFE+bptBcDw2%@@zPG{$_b>q0$u>3QAp@6@FVoRxsS zJzCn+(Eb-#*H-@Dq-zW*G;=uYm8sSFMGB6H*X)WPp(N0`7F=l&RzY%uGsNjp3Y1ua zPZmg1m{SKYFbgCd-BnosKByBYmPE^V*&`xw*JaH(lHOA!w>fkIQ1R3sa$+nK>K##V zR5hhgm69KEAeL~y!`Stz<{@PI)<?YAFa;h0m+1o$gZ(XX5fsfJ0YFsv4n#0L@(euY zc&CVXo2pGb;_j)WusJqz%$^q!L8vz(LO32#Ph&z%M?gmfcL&hg7O}XIiepBs7%N!r z-k-Pi#VaA4>SZD}=}p^5Ss1gnGDf*7tBgbjTr0=)Dn~EJ)n715?GwSBtvG$l7$0x| zaImPf0$w2fPHr)Vu=%#tPbQsTE)N<XQPf*ka-#tf2KZMp_93a8(i1q)v`NUs$31Z# zVk5J9Nq)X5Y{USP&M4<}yihdmV*nKyYqVQ)oFi-8Pyo=9mCi4|19pQl3dX#|pVIjr zY3CZ}pBHnPS+0`}RHeoBNf&pJ1~yYY=45-^W~Jrb8Qrta;0t~4BF`NY3W$|MK=G9< zl?!I?rr*dB&O>NY3IPlO0D3WCVj&7*+nERuO&1ucVwaB10*HI6r+(9Rt=AmhFVBzX zua_QPzSc_S&}JwEtOlm6WzXR3%xoIzoCxv~OVi+$0#25sBLe_$%ggu0X8>6B84%yh zmwk+b)|<qA(rn^c8!DaOnC_R#sy2Ztd;7e<lXXAa>*`Zw@mXldKvZhMbE$$D+j!-F z!K6RtO5SkRbu5&08011xsMpG<a|B?Q0oWpoDY%&c&oR@L&OMtidEZ)+2(KCnE8w^{ zl<lNZ-Ut<uKbQqi^>kr4CkU%+nskPv!pVvK)hVwclUkZHULUcP2S?<L$H(l9$csnN z2glAB-0O0u_1AEBhvzv8n)Kiqjls#|(%SQY%GlGEHT`13boIY<q;%g&p6}Mt7%rAL z8j4Z(Qzf+!?PxRXq8Q?(X+p;V=pou+6vR~}C*3gLRUQ7+0Qgv=0;|rSs1CH12g-UC zi*0oh&54{)(J&{qL{S-4@Gmjtw=l3S;f_;&Ne5IE00^3OMZFfqQVip?mNcIlraC@a zi_-WNru*;g!yti(9I+lj#Dwmk`V)l}hZmzE#4FPK#-F=M>&q#R-I&7?(tg)e9*aZ- zmNCZBGLI6Z1L=mr6S>+21VwePcg0uh!sZicd0va~Jnya`KZ^Ea?R_o^Wr9N=05iNO zky;Q9RRkqmLxPTgl5ZmWCx++_L7(@0dSs8B447e)-jlpXbwkx0dq%LqmO7<p^w*sf zPM12UZ;)_j7AGIUw5G246vbDOsjrojo{&l*trQ2)>1{Sw#VT;q2CG*{M-*2P>|`&Q z%$Oask~;X2X5);`AySz#a;FW)#31|%5=sQZ5!qj6O32r3oEXcu){YE}EL1F-tXDD^ zSMJN>k(?S}>kVwS#(SYT;Eb`$`G;G~2S=e5@QCUkh;*N^$!W7j!R3lN680CB|15(b z__^WkdhJooit%J?`0smhgns04CdG+BfURjc5YM2qscM~s!HG)ix^nm<MU_SrGaxQQ zID)Mbzw0;scXqQ<5xO#&xkU8qh6J*ZrzDJA)|h7QcTvM4uNJ8`$Yd0j%q1eIJS-c9 z)@6+O#gdVw769U!k187DvpcBS_LgeU#_Xj{M+YSmTdX}-AAj{UCl+N?3D-Fk+KwjH ze&v)?x43;kEb8n>QWgVb`mXiwDN0p{Jgu0CMTuUb1HajL8^~?RgV~54N$sRw>7kZY zb29mRX6&fEf_*x%+rFWJ(e*eR3%^zotxx?#P*Om?xhGSypOE^D0szv0p<b1M-ZIO| z0?!8Lh<}veki4e;kxk=d3f+0VEK#<HZ!LGV#W~5q_6}c&shmA=Yp<1(B(nTZ5u-vV z2}i1yr9DI255liP+XV{SU>h6!@a=8Eb@>HDC@*lOY{mw&En|%$szDLi8gp2FKA@E< zim_!V`%L?JU2)V<i1?$1*Ate|Pj@5${CMdkY~p8`Mu%<XeFiYd*{+594@tj@jS$2^ zJ3K{1$JV-j^ug?g-oGb`k|w(^EDcSZZajzZNIwy*?C3vmC;_V_M$6%b?_`{f`Vi#e z&~0j*5d1MqOH{WK;4>ZlT?y8!*QadOQ096)Xqjwb`j7UF|HsS)29oiD%xz;fYS%ZM zv~Lo~sbbk{6em~&epfxsSCN_$gVAMqtz>vVu-=KGONs2w2W$Xr%mEM9!8r;U66W_7 zH2mGPy1vgUIRG96@FF?_pPm!+^V8D&$MCx3YU-kCG1CU>k2)qs`0&)Y>?K3%+LR@h z*n^q42O~_hG<PY|D$d7<^(2#vqs)#B6jstf{+asiv}0?ZS%IgC!=~<Q0f+UTFXWA` zHeWWZo>`i&d<n#{%Zzp}Nj+)*GV1y&Aw(vk@wT>^UZ7uCpgkn@FkbK6PoOgqSY261 z9s}qxSS>o;Ei;dt)=sDGODNh&Bs;4M-NBKv1$(h?9a}U?NP>fQa1<_2IsKZxmE$wa z#`w;G7eZ1O2~kTRQYbpYB_3B&b3j0`nrrQ}|KF*Q4zVyv^EtTk_)H{0$=3K4>M#$r zRMIk(IZWl@6`4Mw)8_ESc$sjm^9WQc+6RbqEtYYn5pq1I?HT!~<4wH%F<-p}w+3K9 z)lX-59$Ryf(iZ<`nPut0#c`N=JT}SOpttandC4fX<Rr%{-^_dU0dUP^nQmi4Gg-q$ z&?$F%w5aM!Nza$AA1byTjRf0@#Is)sZN9W=yOaL3J+T#yLfFw)iUPY@pH7Gx_{UT2 zw0g!^=|s|rB*6-#)toIiSPs(k>u}+65>3gC6s#QubGSNyNQ#<hlka$DJq)^$QEk0= zUaUAANs<l%T%2g}AhUM^*KGiN@xO0DFMaiAd#qtCN7PtC7#@hS)Fn}am}FebMfsed z6tG&!LDk&Jz~H@d?Z2vX3B~`u9!Q$Tb+o)Ri))q*>jW}b0;(ueWnGpraC4EgfYJ2` z#oUeWrz0iGAE1y*QS7%8EDA`Ju6@6&oB6ZCc){j_6+j^_Ke2G;3!Gl|4GPChM|Rg= zjI2uhYk=t2Zx3G|LritMNu2KbeaKdP2xDd6QSSn<UrT9x9l0*wsyZF~aO>o9@+pF8 z(<>&~rsW2-8YhzeH5AN?k}di?SfACEKTOpA_^Mk;Zgx#p1z3Dk`;0t_RJQi5UlLFg z9rut`{k6ce&z3=zjMs-9GIrT=<;7jUFhqJXlCClGJAWR%3|bgJwZ-!`((dQA1y$E| zJaU%GyQv#^`n57-wYMNK*yZ0Z>lI_3q9N4Ajdl1<ammn3vhG{v-9GD{q)(${7?;Rg zd1LIabSvL)<O&N6!8ussv?a^Fl__Us!U1G0zO{awG5#nAk?kq#E!9$LY%hoWc?(YC z^E2U)6I95zfROMoC9i4StR;ooPo#%YicD^|sSn3ITNMNA`Aa_aCGtiZN=L6}-ER5* zsc0gtQ47>g1B7}_ctwOR&4o66y3M@~ZDx6H;5|^kO8Wb;;;m&jk@7|@a`+}G^sDdP z7I}zL=G{Qd9oR8!`cv5K*RT)RusO09^DHkG9==$7^x}hBgqSqsX;Tj6T4YD`j|_pZ z3+V_VX+V$Ki|q-NP#(^fh{nfUMfB>6JzY^K94H$fXSO5nr5|x$9w^cK+5Gjn6<N4f zte4g{4U?F(-cM2}mbdlo2{52k%3B1<d2J1%933!4dUJLSJ`BHM>FOtZ?|#Tcc>@lQ zkAC~05-JTq<z3n$qX4+zJoTE((xF&97GyH-JS$-YB}!|$=4vN_fmBf5tl7^IKukd2 z%lh`4-Ea(0oxJwo!*++HtV!)X=(#j}uQRnvKB9axSH@sjV0)~`u~12z!EAlIRAp3d z(qunV`&3}H(PkiWS(bygqtH&OKRv_Unlj4xgQk2$L?oD)TfbW(QMk;qnHr`nOcbOB z%CPuiz#II|ZGqD6wroh$nLHP2_w<|m5wu3R&(t!rp7531Vs8aciR6rFhhb;qli^gM zP)V;>+&V_sb<@LWB>ROr7iOkO7eHkb+aVxTcaHG+*J(X;#Bg)YKTJ^~jZn6(gq1Rx zpjj^mqi}`2qqXoOhCsAH@8lrX!50Kq`(JuKA?8?#iDHM-Ot+tdglq>PMAI-h-p`3c zYXBgVr<6cAJ{Jupg_uy_K)7k)FF+I+SlF+p<7UWcp`E#S821fZ!o^lPDp{<W77zoP zaLG>+>~=}V4eW#xJvPMI8RR|1zd}CC>ANQ&XT}}KBy%ngA|EUT2Z5Mxe6JAvSQNp5 zwCs&zn${dJLyypxF@Q|6DELhTVz#Uc_T+KZO1@DQlS*ZAT?Xz)qhLad!m>E_f|~MJ zY(XiK#~~y){gqk44uZ$i2@oq=Q<D)Vg{}-tXDqv3+^XC*pUgq>w5KPD@QKg>>_rvR zQDC5>Zz)6;a|B1i%q}yMDXF9oASmr0IOL)2B?`i5W@{J9HDh+#Fe3{ej5(ViT!44X zjtSzle+*$zhlVYc5KvRoG_-0KL^r}oIQKJ}3CKP6yzXn6KJ7O&ZyLbRWVzRB^AAuF z-~*?f2Kdd;Tm%}T<VpTNacd2^L^g>1uW#ml>4V?OY0QqUlw`iVtfC*FJk7$BlJIO> z4E4@9GKNaKcLyq)g()L=lu>jqg}iE}RO9BibWUgUOaEBhU$0VST2_WVCgODu{r20% zBPo*U-I_zzOgerSs=EdE<xW;Cfg(I=ia_jaVaki?PJ}GrE52PM$@uj*5TWNA3c#j+ zkkv$<&BN%m29ja`Wgqv<8**Z*63&|l3J7Z#DQ!FK9F0mituy2nXF#0%Q$dw<izG(N zS_{1*_xeI;T<N+0r4Jy7cWB+YN|5`Bn$O{0g|GB@*df*6f`T>2-XMTFdn=TUkE|yW zgm{#D{hs<tgQ1QejsoH3%|!z7A$r3i_jS5SD2KrQqAV@lgbpQ-;NTXK1e}A0bVzIO z=4a#pj<?_}V2DVt>QN5sT=3iHkM-+S2a_FV#27h@R{t5jBfIZEN3-805=CAmHRYr5 zcgRNwTGP|+=iPYwmv|&@Ym(IR5J<CcY>?475;oM##sr7B+;HZ8W5rP*9jCS>2fd~% z-iLf}FrkX-V8*+4vDnj3Mx^paEJcWjOh&=gL5uZ~@LA4xqPocH;M`1FqQs`8ie!3p zAw_asYHwEx#lm7b&+K@r;U<Dk1gQ|K=acMoH`R*&ws8lp1A*jma@`l8nDXFY&)^vO zIeq+<rLR0vG6>pl8L_arbK}RtYOGX9w4VQg=PW*)6pdgqDEP+e_Fq2UuAIbOTla~f zrm)CSdd&XY$TvyLrK(5ME=aKgTp0#oNEA7ffszo`NdzGjpc><&iohqIXCu?TUzoRV zbx5bhQ?-ww4e8i_2rGRYj$A+yZQ|g1YiaE>>H)h0NrhiSIn>ZK^}@IOfK+h@`+wO? zVFoCLsoSZ>n!`>aTdE4+4(i>-bJ#YyX!@ifStxyLRO+5sVsaSb8?pa*)bvOo5tE}G z$dI1C{vpm6%O{JGQPFP64i4(;#Hzjo!=yVA%(^#G|E#*QK=#o^4{MzGA`K^HlLO+k zCKquMWVDuTQ}Rur2cr4M2)A;H26u(*iZ#9^nuB4|e?(}r$;jgBFTQc+{$*BGE94aD zJ>z6cWA+Tnrs;fmf^e`)3%R(ST;xR}@F`Z;t|w2H3H{joMZLb(E7LV&;~mID*OG&6 zC;e3oR=M0BW|~i3W5#_sRZhv-_SS`R1lNtiItgzP+557&HoW$mQ(k9ip8n6~A9Q%| z5j;B?5Jd_JK<a`eGTfHL5Y6rz8c`@v>aNqrFU&^jIE$zx)U*w!?t4O=q7V5|><|(g zWqo>Laq98ukIjhe3wYxHx@7Y2U0plXM6Su>6xJ}T@Za7te-EAjIGp4P#|u1igBA)x z@NhoYPW4uf_l-?D0jU8KN3`xGk^QHVZ|khpdyQq1Bsqgv-Wr1g=OSkGTUZ5|<H1E- z8$`zAspdU?NrurN51jSk7(X}@b}N#Zc@>`%hy6pCw^iO%={y8Bl?N%z1Stk1Nh~h2 zMQr4#ULSF|WxA>fQk6$)Iyy+#xf@Ggv&N|vp=yX9e4NjGCvL##IC${G0!Qr|P0OTI zR0ChO`G*spJEZJF<}5yckcgOAt}W>m`G|Wm2eJQs!>kbh`oWLHbS)oxJ~nBC%<CVs z8Q-d0xkaoE<V72amZbsG|Bf^m078uVCdn;2);SL>U&Gk;+XyC5FMNy1*&m)({g_yR z$NwntG<UU=nkb+ke`as#(ldINDcVQ+t;|!v2QmK6{~Zl_L<^*$UTPGN$0<TWpYxeU zW6exCEHl;N<}+h0ej<Sl92*U2{vOB!2cfshh}n+JYZdNO^2iy2dH&8N`N{&*#f>YK z?+G4>)taGl<F2<lvS0Ys1hAWIL|TMg><{yPkK51sM7!FODz(|d+OoDcRBMw42kTs4 zVHnIOzHq{J0C=Fq>9aY;WBsqcmBKFQ>ZbSsV!GbTpG5<2-Of*u1KNw#!Pjs0ao82# zjQd`FRH?g0Gh){9^?e$D(3?3xpS`)Y!GE!u&*M}dj^|+pbh=T2e$nAwf_|(!xO%0e z_>JR?F5Nxi3gh9+&UZQN6B0;$v%~wHVPe+GoqFW?hUq0oez}R+hgY4eg9Vfc7fR1i zIHJjW4Euj4%bKb~TCs^X(F3{iS4oc~|C1@VzSq8FGl&$jk{75cgw;3M_dy-A!AE^x zFU64aUp`}gSmlSPx_%n@pSpPmWVN>O$6hwPfmcfL@9C4m{45qptFM~h)mk~<LreZn zY;J4Q16D>u6l_X4OD}~=0kS(_q%A~q2V!80W3hu{Z;R``gX?dL7qV07gr=Du!e#%& zM$W2p{p4@e4jw(`yFLLC^5dNl?%iOiM>3ke`L%O==GN0szy;Rt`s9Rj2zg8-un|KB zj}o)p^2Fp4lbY<v*oj4GLvt97u361$&@9(rzOzrt?Rt65S!-5hCY_jd)cvC(t7&~{ z2%RDLogH?p${725o6KJY?*;)FA69T3_D_a5Ut@G3BV%?W1iXU+=~3CeJL(XiV0Mh2 zkUd8xhQr>ZqQi=Uo=u|{O))+!B}~p_5mOO8q0ot}F`K)iC}(5eo9Bw=thT$amhm#O zOQAIk0^xM+6WNRyfl>CNaZNVny=<#J^`mlyar>I3Jt2#sF|H9|nhFGCMImQ}YEd}? z@L4?_&2q*_#jH!S6Gf{$NX}_WjzW$k3=0bD0U!~aMn#guR+^QcW#4^%SjKVxNjA;p z;<xtv-WV~R1VdI`D%L@rUR5gZPb<OprNPT4;uZ|CTYrRhAWV)Xt^oEqFimp4)bs*Y z^`?x}Ull>hPPrM$+#Dfvq$-RHC&nm`;^S&gVkA*4%FUIU3m=r0mLJz*h_V4tc_1Pa zLqH3pF&m_Y5Aznps%dhlCvs|BjA~R@KK70#)B}lW4XJ-q66j!j2q$?&HADcfGBR*t z9VawMb<_yAH`1vRGODT<jF7W+;&pY>ZBR7`{9<1H#n}0ai8E#>rV^3Pg<CaZAw2f5 zBi-N_V1pC!;BK0BZIHi{!#)Jbco`wn4<KQ!=Br0IKC^ejR2tG_oIg6k5~>VvE3CV@ zY+@71@GCtoE2%PHT}wDB^V|L^Ru!FL!D%Qn4krGzw#G6Ch80bEd1~Z_X<+m2hNU6! z{34CO8iK-3f`_siVsi=pq&X`>2?W<DxudPXcjS_^Nd8Vo15cNr@WanBZ-T0!V-uR* zXR*i|lyG~L^xTk0_AtLI#tbzfr)AHrpb=QD;n^6w3``ebjV4+fB2G|}Q{;JBUNV0* z`ZU$zx&J|+dol73B^8*P(L6%X34geS88xaw{VaNF&r_cqn?U;^&SWy<>_e=qlHHJH zx;Q4m!Zo9&Cf2{k=}tYJ5fX)qit2~s+v+{@R0~=oC?jzuy&Y#+QexV9f~=p(Ow2Kt zcO$2m_~r-<DsX{WzYQ)>slTjAbH>y<@g{X2dG#&?-oJltmIquMVgu9<D=1VVaRGs} z(N)O_1VuA-a{$4k5`s>E;B@kpd|7#!O+9**ESAxWc{{W#w~TvHvlPHdo1Wu4q1;V8 zJx;8;Mm&3@1!Z*My3?8?CV9=4vLLKIA+Nm@Xl@u7&E1}oFA+mpkD9JDM2_<}ER+#! zo&>EFA=-_@E#Am#MY7!M1a1%;y~@f(a6H-wnm~}=nf}CDer*V2IhQhuJ({pSf<8Hd zy;I3p<FqDwvX+0_YZFyhJ;;3Sp3DD{A`d)&z4}lPA;XBAI<o<E);-A==pH&LJ9*q+ z0`Hym=rhR8u}dCxbwC2@(F=8b7Sn^<R(0&B`pt=To10jJA`~6@0m4ipicfiL+iL9N zfnI%GarRlMKc=hST~%0cP!Se-VBH`YGoO9(`inW&oKkJ7fQL=YM7#$l)kH<52GP+_ zT`zzV4i>Hi__Tf+mpNaYb@UvvLz3PrRnLu;`9GDSspXZ-FVnDqbO0Ad;O&GiCjn^Q zSXfXG{5104nr?wIxhPxAtGg&g&&Xx2dgL8%<F}D*)f&~C^XDbF62KA!#+rrEdlP4f zi(i9K-Mt`N=+h0!j%zXEpDilKqpo+-`C1#ILH=>RVavjLho&k)zFc}2t>-+bkd8E9 zJC-+4s{8%+!P5EG&$_aoTl}K-nU#$K_1>pHxv{~qx(vjV$NliH{~Awm$1Y`+k3M=E z-C*{b4>A;$zdp<VfsFo<v$vYwXc^cvz#a4bnca`t2dDf#zUf|F+|eMBx!^u8fHL_9 z8<j)QY#O20tyw)mHk|qzEL1Zbt*xCAS-e<cj0gO*q`7NmUM5Ki{Y+e<s(kW@Hu_c} zBB*kKsNO&z<=k*^LHq}$)Ox0Iz5(Wk!Eyl{PZ~%U9eLzDSD*UEvh&jAK!td$$|!q| zKtcI_9!l1nDdL8zJUDdT#FX+GR@j{CamNs=BPH9FB-6oU1Xo1ruguGu36mZWFP`*v zC{tV>Pxa2|Im4-3HGB^2VLryxO_y7#MOZ!GE2-Y(T~rHgk9T})3*B&wK=c)Dz~CGK zA^nppePVqzT-#Cadc+M{4FAXrh45h()mK#JAmU$URwizPa8=YtR{GN8aRhz2VjMo> z_GGAASrB?<aBtgEEk882%`sX(o}+09x+dnli5i<-^$-=F5E34@E>o(_l~?qoZoIlb z3whf?sfA4fo@E1xW!wM@JUoERJf*bJvX_-{V8-G(lGG=7qS%>)<aH|7`!XrHW;|0v z(kW}waV9c65b2c?zzq0!pN?EjlM3obG1Y*C@R}Nc9tB5I-<JsBSEM?At2djHajje~ zDP)XF;%8}@cQX%f@Y$tvop{BuN)DT=bk`5v^i-q*(d@$nPMOMI(*R-+wWJ)isB2}} z+-UY<0^0U68E;zL(t1ZAU64M(?**?spkmmd8EurrjJEKdxUd>Tng@au%lgq9XeHmC zm3Ylu3;>ew8%MZEfcHwOTKONh*mQ{g>(@l;Im=yFM=gmGZUvMVKm9nt`tVn6he?^} zN;7e5GLS9isa@_fE=bUGn0TCNRl66ZS(^<-A|P}kxCHRsy+WD;B0V*EsS{&ws$yAO zu{&98SSn`rGsb{;URmveztCb=LWitg4=`?kRHs&W`3%IPY!}35uquo^dwW6mp*BS+ zGu;h<`PrXB>_H}}!J>@y_96D#kc@kl;eeHVeNkwL|BER7_#3mSVe`8(V2<s~wXI@= ztrn*)>_F#b#OJ-?5O-Y8uwTp?-#A@Flvsb*J^CfA@=ICpm)A>w-hpSqI1L*%KS~>_ zm4hY8T9UVW0rTNciQB!%1+N2&P4y+SmPJp5CvrvUoJ_eaz;(}#yX`93Cu;l6i_T4b z=kkkp%`tA&Gq>w+L3?6Ek`AtDX3j{4aRhf~l)%}14x1-~%pfh}1eG#SW$7kGEh1`M zny(z4+5}FGvJSC{vt(>UTD`;b)Fv7M^KY)d**i4xDMIX^#gvtB9@zn00c^g6bm*bF zescva5Y1fxTvrAwKBk%26r42B=>+LYA$y)$h|hPf#GwV$JCJtkuPXlBRWbl5Z0k%K z?i8?ljw9x~95Yya*hPIU{ra;L;4T;@bo*Ma+oJW0^{6yP_H82BZ6RJ_^vI7@Mz{K6 z6d9|MefJ5h7f@Rf<<vSTh^nX??ymQFwStjJd!yX=;kV6Q@SFECWoZW%@4i@es~8bE z7AJMS^=FGWeIBl)T<|sBVjKMMevZpJT$c@?Us7Vlk03O@*l|iHIP?d+w(64Vq=Efj z>@HJwY>;M)8Dz71X^%JjJ8BrQ`QmgLV_YPdXkzPQ<rWNJ0~9H!NBPUT^==W6YJvT{ z!6%Yod7fY_()W3<u@5F{VmQjW%9`HEM_Q_7fd~>&QiLLQ1<7EBhs&P58h}&Z3|p@J zE`TQ}2oJMe;*cbN)(QkWG|G2zkDy_9gLpW@a(6j@Ab$UbHNQKEGb{MX!sb3i&z&|* zG4%Mn<X@0mCD>pWf1sQ?xv?zw!ctH{Dflk}-ZwaKyb|wLXB?#c<d;$}>cOp&tl;oe z5lVX7Qg(CbE)TH%;qUeb@%hK{7}$%U;hJEIuqCxIMQ?=%ia73(-y*94Bj!a;(sBvg z+{)K?M9F}W-%-r|AaXNPp&EjX=G%w5Bt2PjA7uHvJz5?-3|>)x0+SuV?icH29DTg1 z{{gYaF8gA>5L|i~GufyVU+5N7&_4qHJGAI$6i#VU)?$k4S0UB|>3%OYe^VxexA+o- zy*zD*V(kQw;r#ni$*+m?!*ZZZXfc)2MmQDscU^Jovw^ZNR+6bU+5-=kg*1F72>$^w zNdO?EB$&<D78ygJTcjTBYpVo>lIe)I2$v(08K4EI&MOG1M>&lJX6@2pEQwI4asS4D zHz9#b`=o|9YY!1EWR075+;%vXBOHNy-g(6{7oqWz^h;hK--jAQV|uO-iCt1bN7WaP zBbWG0S{x>FB$BRF2xTwa-Q<ZR&(N%yOAQNGG(I+cp<fm{reMCd$$WR695~?91i>5Z zM_Rf_J>UI4ZikEbNXJUY$;_mMXp2BGmw92OG@2KCW8$Gxo$@Ij^zR(0Tu8TYrWai^ z4CCy7{Vdj#`ub^DBxh}C!fsFS+rPgIc+t{Vt3dd^J#$*+&hh)lV<Svk*Uv6PveKl; z%y=Bn57*xZ>Gp@&$Mb!{dLN~SznC}q@#`0s1r5MqOh<!A<jDsi)K=+(xJ+T>L-<@p z=|dBmVggY@&hr;Tgj18gN@Uaq5o9`HP~93*K4pCjjdftgNQ^;^BLj_rh-xX_rxt=b zx=6PRrX%@3|6!$JyJGc;?G$4_!%?I8vGEHTV=<~`6%sKy^4}VS3aPZCt@^{TqLVk1 z-~4&rHXD5B5(i&WsIx)Y4K;sma-KlAJl*cysqRVXI$|=D0Us2x$>)=T)P&a~KjUp1 zyAFOHE9sTn8>xepYs~GkpZM2vj$_1qkx4p{$zOW_qFe2ToF6RiU3%-GyZF!hfylm; zK*$hpM(bnz6%!$C2{UsQ4@54vTL-miZ(_{ZLQT<-SCxw{ZO4+Ksl`td(<Xx~i-nrv zqxCwgIW9)TsJgN~UYFO3Rp7GIs?-x$h}5cT1;Zer0Qx8nDp*O*{>d&Y>}~X;BK<O` zl_H68J=6f@sP<z|Gk7<aXq3<)mZ_uz!d;?AX=EePYFd^mK_g}S>X9PWL@UAu|NjHV zKsmp8<h)#lHrlYp_37q`B&OJ=i#(!P#i}UVImK{qz6#|^7o1t-v6}u3<%ek2w>^uF zFeeZlE;^SQBu~HtA1*q$qZxVZ!NwAtQ1D`ycFLJ038BM1!3<nV@S_x&X0)dof4I3s z$hYI3`>TN_u6Q5~&{msmhfKg*Z@y&$ZK!Z3&wKB_BU0iOZ~RGT7U)ud<CuG};RH#? z(_Xvn0KgWTY%WZYfstWEw<mxT;QXiJl}>MFAZ|F(;qSl)=k<eBB5iIQuPN``>7%5L zh;z$*$}{xQOFzp4LR3qJ9An=65%{3_^C<>J0=MUyI=0Wg@0C(LJ@wTQ!v9@&f9x?v za#fjM<?82?#RctrKtf>eKqorV@yc*=qnoPGCc5Pfq<!y;pHCu)xQk3rdoO9;^ZenA z9HCBitQ!dbb_c+h_&^x#5C<)eQI1t84u$$#VeVS!kPc4pCBI`F1)E_(!UbT2kt*Q{ z^QXc9u+V=1grN*+Xv2ZHz!v22hd5M$t0YD$dP1yH0PvSWfw<0ya>ANkw8oD@Tn+_@ zn8y=Nz=Bb10|+Fj1U>XX22I3+6agp!7}S9ZHRQn?zz~S$Ot6C{n7}benh`oC5eH51 zBN8VVWFZfkNQ7trXb71RAN>eOpg0nekCE26#)ZmAUW5qVxJDw}ApeI(2+|DkU_~4< zVM;xc@{go2K^*5;$2;<>2G1yl9@G$rHk_aXM#vTra8iO?-og!RK!!1pR|!g55|a)w z!WF<F3o1yV2}o+>BO^H$r#LbI?L0v&13*h#o&^PX=*KQ4QN9;+zzI_@6*bq_yD;#> z6IvL<AVxM3S3agGL$RhVc?n2|By*W+Si>`i<WP1(v~i)F96$xCt;xl5mbJX)CJl*5 zMUGMratK8~B684#E_7rp?W7_H@=!dDvz+H_0xl`qOHy1^natd1^?IO=N%)~3p6~-c z(vX2%?$W48&FE5f>e7utGoS-a4oqd*k4U`W1VA+>I*E!^i~j}yqe^W<0Gj&Ls7^Hv z0U*H|)G!7`xT6%kQ>#$_8P-z`WTI|8>L?8nhnb#rjTSn=*52r|C8*=9HGoDe$Ox*t zcwiLlNWu(u(TkD(VIE1aSW6_r6CDxE2FU2e3rK5PXrflNKO5qV)&T?^fL64V!^x0* zvP#^vwk0-V#}jl=B_BBhS03nuXsPtu(Dv@Kk$~%FeWF=cc+DbcT^z3_@?0I909iPC z?F(W%Tc1>oA*>9SaeIf8pD35P>Vqp;V#`e(h(H%hkr=2L;<T}$W3D_wZfJ(`+~`g> z2`BKb^e}Q<`<g_z`W<laOn~3!B80TRXh;We`&tvUxBqu|K(K8FQrpv}7Oj#inv~${ z;1@_&v=WBKcY8;a9+;yKKMpe2Y>eXwPq@c#DsAsb4C9w<xJs`LKzkul<6uDd#t_yq zkCP*0FLNzEEfAAN;M+SYf%wV~rfwyAJ7w8!EVAyL+!D-D+4AlJM|2K^33i3nFytc* zJkVkQ{84DCURb^s*_8>x<O~xCy3mn6w5md>IM4bS(2M+x&W@I76VyPqEbd(nz#+`Z z{W%SNKEa;}LfSlYZ6e-PXG=iIVIF{^Z|IHLq8n`yUv=8kn*rB%K-~-QMoS?*0EZ}$ z6ejbLtI|(CK@eaO4`wU^SF9Y;2}m7Cg92IyKL6OUYfPeTN(T>EB86+H7Xs->`-7?~ zxHJf0VZv!w``XQNx1`fho=a7Y+oi54xW(-Xv3xlYJm8wL1N-eXgnQfy*|(wl4U<|& zdEWI#2*A5N@P`+CAw&T3j}s1N8Au`<?Z^f>OgNA-pPNSk_x7p*y({YE!WnU9<3x_& zM*DUE5A=A#AA)Ohn%9BU=A^>XqaXxNUvJU$Heu42&U7J|IogXp`t?|{>4+vew#G^b zsY~&}Ki5I)XEy=Rg--OkeR|vqKA<{#;0{qtL<GSwU(_`|kzYe4*e*#G<}MQUSr?5X zWJgj90`Tk%!#N@^KtUHk;f-*#!ES6?W&Z%kK5+SY*C_He?&DWNdN+%GAXKk<)A??1 z$y46)b5*_7yMC~Rz_;_?{(Qu*BIFzZS>b`m{nov^kl9nA=`eY`r7I@&jb~=;xc2;Z z4W4Wu|Gp2wR{<puYK1Q7qU8Z7^YS?_ecjt!>ebWvw<br~3;)0xrhvt4`CKv+Ff6q` zq6T<n{Pk%mx@4$B<Mi(?gsWN*0Ui>kvx4OQIw7^VPJn99xR_!hnn$$M<GC)v$ZQV( z-VXlckN)7!6{w{H5b!H5BALu50K$YIS`Q%#F3~2?+^***EKs#<?<#yG0Bl0co^9<+ zQ2jt--MDE2iR-xr!pNu(@HkC#GXEt3S)v3JFga|{Th3?ye8wSMP+CBZn+OmKiHj(# zEaw6s35yRaglz1%#s;no2_cO77J>jX;wqvr!kEt{oX_Q;uf^Dq4BgNS69NrWk82uj zAn-5%KyD%EFgcE}57#VI4Dket;1lL*{nlj8>g;kRLf*20ANpV-W<($OsU2d$1WEu6 z?qQkYU=I>3@Bokj)6W!9Q4dtH4Qyl8`oR?B;1SZI5<)Q!Bw-XIP$h8S8KU6{4sQlc z;t0qgrF3y-uBxH}2^2+<6g9CDIMEYhZO5oZG2#IgoG}IdV4vcE5d6snCr8Y}A*LR| zAlSs$it!jlZ%~%88F$evtpCX!ctH=e$p^a;6|Uk0&VUuvKnoD57mOzKW<ryoF{_lY z_FB<r!T=X_5h(nTA}5O(?P(WdF%?&_n_jWrdPg7$(jYbI6g#pOC6H<Ka3PE8t^Ux* zfGiCIA+e(IqIj=&IC2&}5>K+g8^JN-!VlnTvLRuTu4GaW1Hl6-p&ljy3%;-AbWI&~ zQ6nsJBN@`7&`;wA!bbdI8z8R|rKRU8YbjoU2*}|%KCu$g;TZhk9J**C-bNV6;U2hQ z6EaUK#^oI4k}mC1A!r~J$RQq<0SIP<E#0z<gt08Ez#n{$@CGluxThUPhcJ=n4yvIp zk%Jcx^DTwMBhE4{wf}JhGv@?kKobO083-l@B*7c*fqc}<{+!Qekf1HyAvNLbA{f&# zXAmtUlQMnF2hIcz(&iqt;V^v0G*OdaI06Mw#~%Wq9B!dzFsGwh@G>(~BS6pp@^aWr z05AoUFvTW0<KZ@aGaV|EFYEFy2LdFcq&eHtAEL8n($g;yawUJoIx*9DvJ)p^A`m%` zYtrI6_fsH@G63jv6995NQ}fIW5xxXeKQ;3Wt*;Me@&$qb6yB#BRskVSfHwWXHkY$B zPm??eCItpmGqp1OG+-?_D=dfQJ_Mx(tYH&GsbmiCAr`6Y;DQO!LPt5`Ao>gk7a|5I z0Uy3#wQTPvApZg-Qld$j4?23nBWAQlm+)XvA|rIb2A<(%A}U9>CkQdfNRjj{nA9Nh z11linB4R8mbfQkkEhipQN-yL|?UVfqiXb4vO*O(ybpj}KVn~-_Ao9acA9641^ibmi zQHi2Z)AS%v;y%n`Q4^y)&@@lwFh^qyGA4CUUQ{ezLo2w#D-y!y@&ai9W6@${F6u(m zOrun@Vk^4h?eG*N*npX2iXQ?&GFJ63BIGp&k2)<;^E_l&J=Iu`^-g;NHB^H&v?KuW zf;aafRRc8uf@3&dwRciuHEaj*K!Py5L2a1f5W>_ftaU=XV_1>RXc|Rbk=0$_^(11W zTTOLd|NnzrBj!!v^(+!{U+dLDs8wGBR$vE~U<=k@4;En)R$&*GVH?(A9~NRGR$?cX zVk`DR809w-r9L#)VmsDjKNe&MwN|=iI9|>?Og3awR%KUKV4-F@sYVam17%s3W^2}F z-6I87(M)odqqIb4#X^i;FotHRhHmI=UMF&JsEPK6hoa~Nz6g3+bs?bWe|!jTBq(vP zNQ=0rS-8i6N(XA4LkEr)a$;w8QmkxlR&CdoZO=jmLg5~+!4a18iQral>Go~oc5WdL ztV)WS2BNN@N~+>*kNPN>+R7&3DycN;nbL}!)+(J~BCZ%$lL)D$JShNFfUo=tuzClj z?EmSO95<-Yi5G#%l!%Fr><EwUwQXD1by;@WB%vD4;TE{SA!2uSYxj2NB6n?9`OXY* zM^1PHp}K%;w9+igatz6C*CA$hA(pqrmh85iEFpUE1w3qw#4l!f%eRd81hVS|G%FUs z@^#DCd_h(xcAyNVA=A=#ecSgS)R%qJ0P-#lArLP3&Wz^Lfb4D;)gZ3=ZZBpfcgNIY z;^3{{PA=tE&V-6hYPA<X^%vD>3(sCa&(0TvGni$AfDx*Jbm&MfI{1T=gM&SI7C?AV z<}P^q0Q>Uy(vEKU&Tc{l7(WR(fKxB1R!;~>fD-D#6P^<M*b5m@FCpN|=wz7fhW}2q zG?<B-cw$k24PL<?uE7%$2a2Vbimf<`r?`r-LJ?PZCeN$`8L<reb084$DvUA?>uUvZ z&LNzS3NZqW7Z5r+a3DT#{>ayf_n430RRnCI7@i3-{y31`Vg&(NkR!$?zi}7;^Y@6i z7pW0(i_(mxavcpBBVf`bWsw$jK;D`Xi0zFYHL@Vm@sg+U7lUyiHn9`?*p*+obw^Y= zMXo}V(lFbyGxHNW3)GBz=R-pj&I}Ym2Z9DN)PFYgQ9)-i&(pVjxi%SeEpa(92Ng8c z2$ruIn^SgAK_Uxpl$$NpM=`Zb2{m8(^dmk(O8N{fs8o-$*`43{W3lx`<o`KTWfh+9 z8J|~Ho?Qf6mvvk78K47NpzU>_3)-L$8le+fp%<E=8`_~C8lnfJT_c*J`xRKp;zB06 zqq>!26Xc=;qobj9zRIFl!J|9pRr5Z&qF4G;N1CKJEeJxP9pZr(UKXQOnuY<kK2B9I zoVTS*I$3o(Jh&65*A*fC^`=j{TU|P7Xf-hAi>WKDs122+IRmKW>@#R!7mDEx$iNnq z0bZ~=SYP7roLWDo8ZUfWSOwLh&01c&<El4rqcww(raD^XRH*6I9phRC4F;*Jnk;zs za!6HYheEJ{O)5@c4(Q<v?t%#Rfqtp>*?uT%vuKM{fgl*DdmbokqyL9&VaFk6XL4%i zF@2_iyvKBMNQI_|Xl-ci9tX6Q){KZKjRu0UO#qDo;DS2)fsYz5uX<;oI;uDNq)XeS z_d4+G^f8S(sLO4*We^9S+ppyex`A7|mm9DnBX93^k+yqpFT%SC=C>{41nA8eP@oK& zfgH?AakuK3x(ahOx3B&xu;xjYKv%FHm#|=}lmZELjcIkq#lD-d5lRs&N#O+o_pS)n zbcKm1vvQ9b>#+pMa(Ak9W9qTcYOvU<se_GWJiN61+PP;UbCO%R>pE4G`u~tRr7s1o z`MSgN8eQ@9u8%sqH3N5P*LEj|cXfPwdR%uQ5bjEW2*5!V%Kref!gt5+Vi8O0#Z)UQ ztQUKsrK~%vx2!A2z*l@bgD0lEypY$(zHG=Kc}KAPe6VZ-*^F1HthSh}#6ZRAs0>NU zT1mC7UhQ1P{WZAZnx|D7B3GR7gb=H(G*GWwu0`Cpotg;|kEfgZ#<jzJ=Qlm%7k*!W z(&;x?c|aXD!2~ru5=78|wdmarO@UR8<-(WUx{l5zIMZA$0Q5}09GJB_&f#d8<XpI7 zXs-O~XMdv(=N?Ve`Ay!MukTEN&aGm_NgQBBFVBl+&zqgTPCN#a-G1==r5Vh{(OS?y z9I^SD&ryUs*ZR?)dLl}Agv(uoPZ%f6UER06sT!dYZvQ0*FiQkk;`o}5hkZDdg_wx_ zZX{abi1VQi)-LFjcvh*!@OUDI0nPV-k84;R>2NI~1-|tHPU)=f9F6_oo!$Q+@WX{L z#YcR7@SLc>12UVv<b~VN9i6I$HAZr##pAj|aGI!He%t}$in&;evABxka*MOL<5O?b z5uvv{-2~>?3R%n{8cimo4vA9X0=o_dU9pZG&;#QykI7pSF|Psx-~wBMj5{F#g={4r zSw{$BjIV4W()<wzFc|g^OzW@hO=u!OZb%W^;~kyaHxJx9zOLmu<^^v%MgGwLkGZ*B zPNkYZx>NCK)w%oHU|42H*Ok-Y;^qN^kb8C@GXI|-EF$yUQSf;J)No-5^dS=F{nNE` zCUmlsKiMgv60JtLmUa;xb73mk5tV_Fv#b#tlPeXxQk^ie9-q-AkBaPVIg(SE6d!!C zVzb^h86`iGS7g(Ysj^_?@y<uO6}f%yjT`d+9BCjj+PPoZL!R18e9<Rb+rj_P1O4z< z{_;gU^!fhehav>-$OAG#i`?iCw-F#r2n-Mag%@Gu?s3~>A^;6g)%@A(wkp7j6G~pS z^OtTJ5FI8?AUWpGoiZUQDy1WNP8E;<0$&gzHx9@^6B_8ai#70K#*H06rnpm0A*T~B zdYJ3eFhCA-fl{vY*Yf3yp+&hJy;|v=P5%(EoV_S`FyTTIDZQEiD;B0mk|u?WB}kW` zz`J<u4y?<UF5bL){|esQ*YDuKO%Veg+?287zkDA9hIzMeWXXpGE3Qm=@nOrLLtDl? zxijI<rV}$3&APSg*RW&Do=v;9ZQ7a(6E>XKG~E+b_(ck^BMOYUb}zqJ&UZOv<|mLc zw>UR?fV4o6Q+`py+9vHMI1_{}9eMQWeXV1MnO^$o-R#j{t~*wsb=IX}L+&g2HGIST z^;TDI^HDb6e+70HnSZ1~w%=-s4M^Z^`r(HlfPsy6A%z@v=;4PThDafV9){2fI*kay z!4TRpxL<7R)wKf_WQ_7n5+Yg_WB-mk&Xyl&KlUi(ki2>JqK6w2spOJOHtFP(Ba+DB z3o&Fu&Oh;#f>dmd$+lwvC;TvtJ<D*x<d;w?8KiFFrRnCIaK<U;oOISHVw*goAVm`` zGMHhAC)g?IpoA7`=%I)vs_3GOHtOi3kVY!$q?A@_>7|%vs_CYjcIxS+D)7OHp(vbj z$Xq3CVM(A|Ci&^Bup$=gth6dBrGEe2B|<L7^vM@SwzOl9G>3qMnujRR5l<|vs_;iY zq}=D)n!LqI?X-BxmMxo;O?c_GK5kp<xa4B%t&5il)PgR(isphY;RrHDB4(nN0wVXc zo7$1-EwPidB>W*<tFDTxDgU?@x|*<n+=_Q@r3e$uaJdv$oUX#6{Wwqyy!u)f4%Uc5 zP@t9VXM-<{(DQ_`U4k}4Fx2SKoD8X~gQJTROPF(}5r@{Z&juIy-p`B@y|BedCoQzj z4>qlt2_6tKW-{coYtS(5lru{bCVY^}KVbjkPg|RTnZ-LZK(mR=9o*53JoaF-Y5*Fz z4R-)@gIUEsb+AfVbVR5V$qRSow9{UzHCXb)tzot=fe0u5;;k1C?KEdyqLyvYwPD`h z;|)oEd0vbQy?D3BDy{m#qm!N)V<_O!4=Zs<QuPZZfT0d5YUJS!Fk=~U1vs)$v1f09 zc`(W^8T>)bODWN#2mcwG#6!w;l}Jy0aw>E(jt<D(bppq|-o-*H{%k`y=%GKYIK~0K z4<WztJHFYPkiQT5{f*&ibmOO!-%VbpxW@sFG^YFC>K16I{1xy|FtGtLjG+S^h=5%$ zn87Z35t0u4VID~!9LPk`Ce7f$9CdiX67XTBl&s?;%40_oTo?eEjlwRw0^VHyl9KO< zuLz%LgZ-9P!U6t|bg9{&gE+UpB=Rp~sO!&eCij`m!B0Wy(piQ?*C776u6?CzA{E2P zz%mxCG@f(X(gM%}aEO9%yXqAW$l;GV))60R2+s(|XrC;|@C4oYPFlcsf-vMG4cO7n z3tSM4UtFvMi2qQFeZo`402+yDWNa7_?FT>46zP)&f}-Vo!!I;e5<We1U;xDk##WZn zeMW4Vh7hM3hk4G7xRjIwy|_fe<NzF{Al$lo^~>T>;h0enf<X3Yq=9LzelSg;ck zL)HOJ0mz}uij)FK)TEcqY*`UgXReE}?})dQl{ys`#a2cLl<b3GwE);oTJ|qDu_Wa< zA9GHFc~YIe31uz^dd3p~u?>bXXb}IRP$AkgF)wol_{f(*m~GQK%M2NND%YJ$9CHeI zn8y>S**y@hM+E_x2SK`5lkn*Z7Ui?gK_7TYP+l>Mm_%Se59m%T$_iZj4Cp<Fnm~KT z&s+jB<^MhP3Co`H@^np{Wlw{uK!RHJNdh@v`gUjnt*Q?%UR__=N?-<e@Inu4nBWOY zfQEY%Ll1G-LmQ06OyuF^1WU+A9mYe1eiR}l`k<X8+QAdR5@fJE(HlSdz_h?I#C+)c zYCj3s#diV;mGZN!RQdQho;Fp9`qM1^ZX>``+Lf|j<eV%Yc-7VpN+5=dg<)b_GTPQM zFIR!X+wP$aQow*L2vNu;>{8d$;sg;g99a#X@e8T2#3k69N>v(?!Ch<v2&}qG2u86E zxfD((JaJ`e!^zLG9k6mbjhyBx>)ECr3$<yqWmPX*+Ge6Rmhq()iCF8}{?f@lc*<^X zNdGoP@hpdMCb)>-sH2@Al`fHqf$)I+C5vqmL<4gW&HyQ?MV}&wmL0|<X_>gQ`iTp_ zHw|TpeY&8H9?EseVUK=qBC+=748<$<ua28UIXRKDE@;B0MN*)XT5Kr=esG6x;mM@Y z#wnFdT%8r2yd)^6c*j`oku2x5WxfQtD=)E3sftCAR2_wBSiN$Sqr6kA=BLM1X7hZr zOy>@<`AtR@(SfV8;H&1i#r@6kpNBMPzts8Ah)%Sk7tQEKJNnU(j<lp1IA>g``BPM8 zQU<m#3ny*5)3O<}$8d9LMTKfqvq@FnCe3OnW%@&z{Ll#2U?xJnx-PS>wJ0$*$p1d& zx-~BYn^#!VYi{)=S<7NoO15!6eVvys!T!gv2@>sT3#!^-?n@j;jXh?kLSN2;mb6+; zZbIK0Nq6qh2+@n@pRIe>yasb&_9&VYXut_t=!94L+!t&LBnYsGnOO1qFIH&)5!6`0 z^2YLmkd5U8X28c6>O&ZN<6Ga@1=GFrz3&g<m2a%-f#70eagJxaFT<=(75qA#gC~69 zbP3qN%1v`2Ra#p&ht0dan5J_RWakNMjlY2&niF*M9pDoUnoJM_LPTU6#-g@G>r#S0 zIHP;GV7MDc7V(L*I3!0;`pCl0ZP|RhZv-I%RAyszNFd!;6dhS`hC`RCU;n)mS*Obj zXlApT`#nTs{Hc4PD%4jyMh1)+hBqW)j6hv2Yg-F|*TM$2?>+N-+3Z*V5U+T~+uLo6 z=f)*$V!+KOe)0BbJXx@&HLjV!1-780I9&4Zj4VDKvjD>6DgV8;y)ABYdlxkbcLF@H z(10niM?^&blHG^xdp;0GJH$bYW0a#J0wMctBU}mP`-Ayr!-gSJ0rjQ;2jqT%I4(-y zhf)xv;Upx883Hiz$G842+P6#o(E^8K+yfh&P<ED~c8ryFOK~0j_kRIM5S)j4s&^f3 zCw2i4HB)mta>sJNVFv5hetrWuf+K)`7lQOOO7-<wnq^`ovs`bb2LEf&25Y4|yyH8- z04BmiJjT-m6X-oQk#Yf`f_lJ$E=U5|qX%*j3jHuRkKuzr_=3CBJHJCXDzFA>Fb0a? z4yDi#MBokAkO*!d2aQ03!&5waf<4+(J=cQ*h#*oYzyhOiU6dpkDS-}?5C@td9MMsO zV#p^VHwk{w51!x$coZHQ5P=BxPH{Mgbr=bhqyq{Eb#%c}5-1Qm&;%x61S}E&@JD=I z7XUEmgfj?Rgoqb|_;vz8R`I|J0gwsS!*BJb6n(G*Rxkuda7d;|JE|BhJ@^bO*n$Q} zhy)Qkvr{`3s91DI7n2wOmIxkkCxXmKYVsvs(1>GB)n@e*8UHl^4XywZl%zo%bOIg( zLLwA0;$tG;L{TPijoAn$1d$fXBtgC497aSC=qNL+!i^pDK_P?}<P!kr!wxG0K8aCW zE(AlP@JCDVf!7!dT*X6OAs6m=5dpAn1L2Ak2^G<ie*ndfFYu5s@dDfBhy;;C=n)cc zco$+qdH*1B_UMiHcoEuXA1@hE7V%7f6dNa02VoEoqHqK(6j9khlSu$b*hr7RL3RWo zK@?;`7&J0Vzz=~?7vt7%m4JE8Se2HBg3-uNsdFtqf{q9#5OWkw{t$>JP+XU{gG=d^ ze$i`e@s+NmmUI!8(G-X>APL#f4%t8sVo?Lg&<iYc6aNC)6@+9+X;59gvIJ`fI@Gi) z&M*)_SCN6h0~U!Bp{N=IvY5Hhn4!~%AVCm}<VZPXlEkA0SfB;Qmj-faM`SsQ07)6F zNqoOV3Jp<6hh$-{(H(DK3(24iO8`P`<bGg6m^$DC*jN~^Nf2%HMwzECCvXJ&P?)a) zN!DhS)X7u#HCgVol|j>$*q9f^bWF&kOl2vKcX5^`V2<dh8f+OBU#S@A$QR!Up2<W4 zlu!?zfCXKk3t}Nbzu=aX5twR0n|sv(c%U+WkX(*IO>Oye8bueb_!NC0nSpSTm6<aN z%ARz=nFFCsXoeT?7ZY6<pWz91720;BXac`<h5x~+S0v{GzQ70J&;{2(2QQQZ?jQ<* zBA`83oWEj}P613~!Gk}?3{Q}4#O6&#TAfN784Wcc4Ygr2m7SJ^SxLe#=~)>s6El-U z8N}%dc!7rC$b;#*mR&&*Z5dxX>ZNs&rN$B+Ccv2C(Ux8#L+vRLU5Xbc)d?U36Afny zu<(w56QyVYW@~|=0nnv-;fi+g6cc(}@Zfr(u^tOb5E|MLER`Lf<e?515?#lpvq@kF z_o#mns;*}O5!DbtDH|f-3(4RNED#FG0Ch5%gUR)teL<?w77P;g0?SAoVlV`-Ap$T3 zf=kMbT@_i{aXtZ{KAjO(CP+W3l^<7XAOCFSR&XU(+Q>2CK!lF~CQEP+yx<0DRX$^? ze}ee}XSy2Y3MSS1R&j+;Do_daFbVjnpBHfi<gkTZ*sUR<t=x(|fmJ(%^@x>_4U5%2 z&N`@Sv7qCV3)?COk8lF6co&Qs9);8orU0>{CaLUc0w~}FW58Wg5Csnx90mA9Kj238 z(RJ;5t#f4`VSuq33$rr&2)JVgrx*vf=r=g<4AJle+!h0)5D(vx1$ue2IlHrIS{N6b zu{KLqW`$N0G#BxD54`{zj#aE$J0P@G7qP{);FVAIRXLu;7gt&r1`%9mVILz=5-0Hj zBR~}Xz+0T~5_d|bZ<nsQv92(Yw*O`^Tqf`k5it>~upAhn5gg$W+Ss;n;apS!U3^6o zHW50urLbRNsBhu6LNKucQLzF+1ED|;@!%02!?9vfmH|L{+aLrMp+Rnlvg8SI688dr zD_nR1x}xh5l!3dWD-=Xw6n^spRp1Z&PzbCzc91|1X5s_SaJ5(QyIQd&w%QlGtGGL$ zTk^nLOBMhfKnLo8i><L;-9@Zh8-k_5VZU-`xk6$WawG}n9ESEcC3zR%vqKAVAEqQB zpmAXFD^S!ylKe{@>=7u5)EC_09b%=w`_deIb{QD;9OMg?Z-^cQS79fZ8q+~tg;*FP zc^4Ec9efc3lrX!m5tZi=!T;mYA`12!Q5hN-Hgn~>wLb=U^W}4!m2+=`CNokaH?lB= z)-XRzU%hb^MTQh_X2Ts41d^Z*t6-awf@DheTQMBNID9mnGiUfkDPIyMV^Ss~7{p}D zAqX;NGNV-K)*(f33WtCxW_G+&T%A=6MRpR$h2q9+q9}XTIEdE5Z`{Xz{KtSC$bvk` zgj~pfe8!$a$A;W)rMAe9d{k>xF-RQ7kKA*&Hp7?}Yf*B<h)l(pJWl`xB5+2@P6Tg0 z494aKYo9DJX1rpiWjRxNX|F73_+)sqjAp0&P~#QLuH4Et*30#T$~dP=ja;l<2FanU z%AZWkv>Y*5+{s@I&Hq5W%kaj_nKQ~lyvzOsU)vm7m&{q#e9WdZ&cD1fnIlg&$48YM znuAAE?ObB1mCd?bFqs6-^DIuQd|86WUYgWdKvFH|{3olVEdYJZQ&iAgl&J_rMy-6$ z>r~A{6|MPn!((e>QI*a2^F-S0O2%4(9$jATWy+CUwjv!*?wrq}l+ohMZlxT}+6l|T zTvVeo&98i4`vp|(WKJQ5RK_)ErL$#RnOS8!KaMj*A}B!e<k8fKl_lNM7+umJeNGB3 z%`B$TK|Rwv4b<cn)7VK=SZP`|EhRWzU{sn^>E^!9{L?p0&r-CV;JnY^w7^wq&{5Q( z@d#SYtX^e}RR2N8&gIoQRE<SKEzjG>)A3|kD7{&S-M$;$KQyh?Y)yhM9mJgcXP6Ax z=A2)IN7C=K&{JxaL>+ijz17or$9iqnoy5LmT|l***o4hrru~dAonLZoAXW9(S6$Qk ztlLYi(}g!7lU&&V)Z4%PP$`Yq@ch=;S=_~(XfhQ<zY?XtaZsbJ*%NKW8sk4f<=ao~ zVVBd{*qqA|9p3PC+S><CH`dAaY}}EI&y4NQV-3?{O*F#IWVjs6+dWHG9ob=w)UF+A zS%s{15mtVYu#KJ26s^le#Y)eZ+abnDtd(gWJ!9OQ*%J=Z5-!w${W%*R)vA5o6aLx^ ze$NVi*#E@+R0B=eD6Z5U{k2{jwl97-?@ZSs9?D!)(HD(^5Cq|srPj>s&o=!;2`*kM z9?a!j+dD<qtG(bz?$jpc*P)%;8x2rv-O~&s<p^%k7f##83K}H|m5y!2!#o;ytQTf} z<}Rkd{;Sw!zUDIB-5C=gBQ`PbamALM+|s-`1j8T5j8nM0YjSSg84WZTQs*(Y(*vU4 z)i{Fa_U0*F*jlT}O7q{gG0Bpw$a9?5mJTtSzRs@J=@x_Oir!j*Z7Xsn>6n7*p6+8i zChDtBBsaA<<Ra^@UhB4g>$slly1whYu4AQMD53@;s%FQayeYrl>&Px;?gc=(cITar z(*MZDEFcnY*W<%|UV6jq>fwawDh}&|N6Mf6&8q%dnhxq$3GRv()j2|0^u$cL?2HIQ zaLnR2_mVFtJRmX`3BXL}Wev@gZfQhb>=y0qI@RQ9Cho4jX61hDeNE1drtWuQf{o+u z5Do84#HM_4GAXk%xUqLNb2CD0Y@uoK%^mXD?bG8<^5bpamMrdvu1o5RIB|yBTy0e; zAXjg=jyP``H}8U5&48!pd8-F`IP!Y27XY(o5ny6_9Fcp@S9v<n0hS?r#AkfERu~QF zd6x$g+g3Nt5PG9Gn|sqYH*o@IlQwI^y><h9g1Gi_^M)QcI7Kdv(5UkJjou_a%m1-F z=-rOZ>m}%S&&z|Z_eZYx77o~fU!|>$_j}*fc^~2Ld{r_K3ioggjvyBdNcooUT_!O3 zm4Er`(<MsCi@DQ;G6;oINQG7y5?QFPUKkR1c!Q$`rcbbjZFq8pG5Rj3JWw}27!*B3 zXoN@ziEgPp%;P-JGlbM*J%d_?%r8E1x8;tV=U_DA(*OADRn=jg<ADy#)*sILgU{N} z&L(}?nKjr!?)Y?XKuS*ch7a*(bOK6T4d-wRTwt;DU;p<X68Ufc0CB>^zyJdcny3NI zm5u->0tA?`t5?Ggf9555aj-=$V*yyCV)sOcj*JFzSQAC?;YyYbm#B;MBL88m7cE;R zT-dOohfd=dZZ!5HMWuH_OxQry>%|KZxqt;IIS_}rIxm*s<6>gyIv_ecjAEB$E06$R z!yX*!v*1CtZ4It9(Nd*Nx^*AUUFkOO+qiJyx;^-p;9$IL<@UA95^&psiSHs-Z1{0t z!73LAUK}|tV8?s??!7$NacI(w{W7kL8uMz%q(xVzJee@$%Ca-Z?wniqZr;6puUz_K zN118)(gYVy+&J>#(;h}`i?ilR9_0L8zm6}>2^o^IwaZ2hYK^2i7@tf@n{LFQOUwmw zEPdsP5IukD3Oe*1R1mP7Wpp8!U;a8Fi?B|p!J18kB8s6C!Z1!hvi}}jZmkXwd50|5 zKI8B=-*A&nv&;UnO*7C?<Bc-TJQT4t72j&nHO@x-aIP0o94$24U_22=n<UGO!y6^* zal;Nv9FjE_mt?ZZCWBz4nsjD)LLd{Ml#)s-v7E9>&Twie2XJJeqD(5H5P}3s>hT1N zE_8Vasb8Sm3_ZN+>HrUVp7<lI_!Mf1r*X&viothC>hC`jngYf=gLuO3y8k3Jfx<c@ zYzV?S;7S3KK|kXwRLkykGBFU3+>kXMJ6y3h7?oraMb%b?jj_^#tkK23VC}3l5^2Si zu37bBb=27olhIgYUp3aSQ%i+5S|(9o;}w6d@g#|dsI?Z`B>&>#_S$S`eF#jJW(bBF zh8l9HDQ6sF=>w23T5BaA6jHCQAFMG27NzDZ;*&O5GIu2u5V`1u7VtBap+qxMp(h}s zO7N00r@$kCCn$~hB1}8hb}bQL2?|ubZj?4hVDEgf)?IO<Rm5CFjQKYZfrOdaUsopA z!&R9*Ha8xJ-Hc_ORc;n%U1>HNF`_5?5#?G*q&j7*ueM7BTZ(Dpgp3~2nrpB73cKr) zTn?b%hDt!=o?`TfV~;j;P$7VNCUFza7fv{WoNE$sLykvkI$@)5^mqtfyHuzo8-Ds= z=_7x(`8sVtSvp~fdw6k!4P^3b@P$MRI-!ck-&!J{I{yZGfrx$z8A=~k;*g}BSOSQB z_S$cMj0kl$Np@#q?IJS884F7mXjOeR{`h=zO)`1sr6*Olp>L~RSQ~ZxIauvwgnCC_ z!*^L!Td6NPX{^_0U*;age_1lMxAj68a_-?~lY(dfr5b<i>BcIcasnm1q8<K7$1=Lo z5F{MKAMQ|w5FFDwa(rqf8lZzaVxf}xy<h})@Si=j!3iLcAaoBi!3!d?4Il_a1Bf_F zrE2huUkoK34m^h{$YMhr>M$=M7{xk-Kqu@at!72C8S{!1KczVfe9&{^^Po5z^ii>V zMwDW&kax1|Ma^m4Bh~PT7rbI|kv7+((e#o>wf|?e&yA(JS(3iDo8Yu$DK=S3rMz}W zs7&Vs0-0cf7KFLtCFYMWSQi!hk~w$CB9XX}(AjWDl!@6y19RX<B$RhV&(uqcoXnA6 zJ_#D~)y9)y%%adh3CAz4MwF#gC9<&A#u~YAl-6t2ZfKdBFKX{GF*=dZ-Z;!*%4(Iw z?9C3aK!#C#BV_MOnNTuVi?Pv)Qi#D+OH$wmcaQ=GOH5@FkBLljmeZW)L}xnHxlVSj z6Gyvjr%g`qgK5}f8C>up`%rL(LoftplwwIXSyF;6a6)n3bJ95Dxlo2S)S(ZBXhbC{ zmx=yHapXjfFm>}sQ+2VT9|dVhMLJTFmjBeGCq-#WRk~7^w$!CBg=tJ>I#Zg~)TTGZ zX-;*zQ*&lu3$rLy3CJ+8_3iTz(;=uOF8UCm5|yV<m6i(lz=_>Rm8wu3qe593&SHAh zr9?0X<ZKF7vHnIsBxzC%IuR1Ap@0tYhy}b<@P~eof}<-@D_e6zKwGrK9@6M%v_`N7 ze758V(0JEUOLf@9z7bvj_(z7A#Mrw!X0U~IQd3Hn8_iC~E`0SXVAoZu%kriOpdg1m zxWS3(bf65!xCb^Yv69oKcC~~nU}|LxFBG{Jwz8!yYE{cx$JBPXxP66gl^Osd$OE#^ z-A5lzVBFg_B)9h1ZEk`93w2G0y8pyY3{Rfxj{%jX6XPwfU3?qc**=5>gm9oZbXb%1 z0{0>HZLecaK-SI}K^0F}$putV*b_iO6@d*v2LPc81_R;?H9^53N->0oK!FrPH~|wF zyx}hd00t7KZ~!cfVGqB7!IwCye);Q|<~|p)(Pf-undA@|gyLORV`N+vM}j|O5_18l z@r^s<0$qed5MxLLW=n-0J03wE->9UtUf^UXdv<*%(0~)P(1{EwmX1`8vSXNBs)cQ~ zGiA0iU5IRCBrDlTW6q5VD8Y<Lu)!AmfDa>i5r<IlqYx*MGo9^>X9nIv4|d*19UOui zJ@eVmfSz-m?+l;CMS9SAM*o7L5v}MESiuTl=m#gTAO#@=TGE6*L8cFFi$r@FuY~a5 zHr8e8OFQNx%D{rB0ql`f;9A#)T!K6H+~+@+APoBOgcb<V4p;m!*u#EwqlxY6`K&lG z0)E1TDlp)O>;MpNSVf2<Y>5a&VZr$PuqxU>7AWuz21C$r8=CNtbgx^)yyL(lE+K{{ zFu~r2w02!i(CJTydelM?Xp<l?gfy25UFx!<3{tU<XRc)74X4YPsm&rdKc@st*mX2N z9`ZMypi_s!xNcrB^4)ZtNrlo4%oC&Wl)2ngXZwLSTv3)FCgB7w$b~b^gL9oHj-x$r z$AX9jM2i1B=tDP1&i{7~o99Gb=L7kpK#)GjhaBNOqm7Ex<C1j~Y`rEXz@P>VQXp&? zA{DYWNZ7AFkhE`bGyTDZqX>fc(I$rJJ_owcS1<}$pMV9Uphf`x?sTCqKJYr&_<qBx zUn8ty*Do-_B?`-gSik@fZK%nI^%npR4B`+#@cbjf{Q@X(BE%=a_DW#z2tb5e2d&4j zfu9iKlw&U7j`4aR)-@D+_>UWxAWHyH;Duqdqa3rSxLxYF5*aXJ7~c4wF-{;ThICc~ zcW4IokDvU~wYnvL^j%C?GX2EJ%f<fq5BCG$eejDP`H3qa_NN2{_q*69kBuy}dWaN& zgWn>q?+ZVF82`V-06>((D@6#QYuJ>;AV34G2?Vsi<ij0EaKHc{GHM_kJirROXg~qP zKn1+N{(CO9Sia_aK5aR{1uP3fsHbEghmvVQ=Yzh7@BkXL2OBgqn^3`jfWMlkz}Nz> z>bt(|qqZUZ2es%ZgYddYH~||FkR>RGLqM2sIfyCrtP{8aP0$Xi3jizp1uWFUi(m^c zEFu$NL#zu!?NFQ}c(fCF!%B(6?I;Mzp`4=8fx&}2!I;9e;KQ#m0T<W>V8F10Ktx5{ zxH!4OEZo8rKm>Z|Fr28uNKC^dFhexlLKT}l$GCt?_yQPcf)|Lr6ZkwBfC5Wk2+unN zdV7SUD*wGh0EAeC0$1=O0qd}bsKr|pF<nG~N64>@`n|-U!#^9qN<fE6hyzW?q!TCs zFi;0nP=h@124LvD#F(MCQG+$;ny)B4G#d(f&;vOLg?>=Ki1CSrD;$p4#?LZ>D;N_h zkb-#=6hdK`ay-X$jEVj7hQA4%Mreq6tjBwNfevtjDd4geVk$F;huO)5c(AK-Gz30V z$CNt(g=EMsOPny^hh!UrK_EGsC;^C+NQyMMN}z{}^vCJY01gzugPDgaIXo8fvW;BG zhJ+V>M8}Lg0fQtHgq+4|yvA%~5Oe&=m_PwM=m*`o!Ih&%Ys5xvY|5vkov4&YdK}7m zJO9aujDv}^tF(CrZv;nb3reoE$5Z^I?V^Su!U2WIf_oqZJ;5h~aLXZj2qOCjeb@w! zG65LafhK?f2?~I?bcMOBOM1u(yyUJS8VJE8Orv0ny!;xz^vk>A8*@;`$*|0Uz|6k{ zr0EhEws-*`lC{YA%t{HEHaG|ySi*Byg|C54?2}E;lFY(<2*gxOy9|KsDhFC<24c__ z-lR*rG|t6zGkH2jo8W-|inj|`1#QW<fnkE_Bt6qZJp=17Sd`8uz`exrFU;~z%fr3r zbSh&E#m?Bw&eV?~LJFmbh>6%pi=da@zzGN03Hu0uLV3?JOp2vo6h6|XN`OM%;Qy$O z%g6qN$N!Aa7m&D+7zrzLxs~idba94>;fb&q3jqC>&pInV!UJ@eo7})q4P7g-s06O? zP{KJm0n8kjkO^p@2}26eWh{yot%;7CPl~Wl2Mti9Fouy30fy<(`n(7sB~peFIEUcT zV93xH*ifI#Po4NICq)V4DFRsd1~0i6SIB@UI03sfh%N0>D@iaXAcIiI%!Zf)=embd zsEIEP(=lbtGUZY)sgyVUhd6}}Gp&-9P{=iHQ<vb(gE9d?T{IIIR5txfth17~0K~pa z)I43(KLQLeRD^Ewn#8$*O|`4N;Zr{i06G;@-~54W-~~oF26XtdlW>I&IR90~G*vrY z&hu-|_2Yog0|Y>@1S6n{7hnS9dx7eFf!W(Ib@RnpRK-JRH<l1E%&JaU%*7X|fLUCL zVJ%7KTu=RS5BH>``3t%LsE$bS2RZZ&`AD4lPz!QAA^)g}07);KxDXlp4LG9@iRsUM zeAoXVk2%S>ENzLHbifl36H@rd2nkmZ7+1$2ShV`1?TQCxScEW>r-Mz{G{6*wb%qO) zNzY;rt9Xyjc-ZL((TCYhfqjT_jTG&OF+_pa9smbXsEN*ES?tgbnWb5A4Z?sGh55kP zOfe1}_)^}mImhsUV~7Ty+Z#EdJ4AqokV)F5ttNH}0C`ah6Sx64aQ_1}c!H)yhF^Hv zs1=B*Wm<#S+OGZD%`n?eH98Z(+R;kJgKFEe(<8V|1)m^|No9$;6`rEmo45sz6A;`0 zNL#N3+wyv$sFjzF0J2dS2O*G?hge)r3|q>DTAu^BZmo-a6N5`I0zmlO7Fw`movjZe zw{{x>vY6HzxCB5Tq34KJ*&BpHfPqm2w_+WH(F*|1W4O&NtIn8P93_i~5fd^o6Eyja z`B_l^?AMxgioOddPtic%P*8n!UX**7f5o^8ebMO<lTt|7OIcX|h`jGjoEJcWE&v5@ z2#55viSQlYjWyqfK;Qe)6F%`18~s=uh1vf|*`HmB<292rLI1e&{g3di2{a?%<P`!1 z-q)VBiH?(Bq1}}E5i^zT6&m1DjOYs>irg1?JQLtxXR4f*keAe)&=i^u5FVltE@2Ng zhzac@f{5WXGl&#km-bYg8xAHN#=6#&RKgoAAAStdbWLOVh}4Xnw_^wz<|7vt;it0! zXut)gvQHrT1_^pRDSkXq3|_i8RzM)e7wA<>00Ibj1Th$b2xx+KLp@)8h+fr}4=V%@ z1B5})#hTE8@szzs06ouB1wg<E)g_DT90KXZRnGk^uLD=fdYFgX;YYNK`JqXSa98bx z*8pHgi(QG4k>Hlo;7e8*e%0jvke9G%xT0-|3nANw!2eJlOi}s;;KXoc&9w>g7*Z01 zQd#Cu1cu4XH7tJdmv~ID%<akNeF#>D<#d_kNrGf}#ZZzc6iGHZh=5XRhQ|yR;AZYv z^YRl6P7G#d&oJ1BMwo(Ji-Ns*Hb?uj2RY|-wt{umfIR>lImiTeXg2YYwrDeFbXI2~ zTDyOiXL`2hz{%&G8@q3X7kCEfd47R<zUPFtl0q~H6mWtu2%;&7f=r3$fF1~oZip@L z1ccUSX(VZrZZ=oz=R4*JbZ~?zAddgY9B_cPcW&ot1LMv}w^G!w+0w9VtBGi>#fK2E zfq}(`&@f_sw|HA!(!*9TRE68I)<;mcH;#pEUH{}T{w#(j-T+7xX>6OfiJKBl*UOm? z&EXu+0i9DO9Mj?IhwvTVy;lv+oXzQ+&uJLZfmgoqn|mIdhA^CSe1uLdka$1^!C5(! z3`>=y<#;^o#2%azI0IHt11-SDi4eH2Ov#D_=8x<LQ&8-OU>wJZYkA57#8&K+-Q;&X z9KjK5w}BhE(E(bPMl%q$L;IZACTrS0$=qh^c*IxEZtSrXXMr1R*xtsWaIt@g+5~$o z_FBf~j@lk{puf65_`xrgpl&X73+8sQ>V~iXkp|>biQ%23?zV37&Th2JAiI-_X>hS^ zIN<K4yZ6RA6aYWnLcWdMZ|v%CTaIq~`u|PTLZDmtTIl|*{KBuj%GH)o-2k{&T;v_7 z$hSj)MZ$q&W5r|M(XeDi>e}^1K)3{kD^@a|g+cb@t=<jver)BdpZm!l59y!}3ZW4y zA!SyfUBJnfU^>0@kdE^p5c(e+HzBv)n*utZ1X`d}b07%POYYDFa)^fr5(*H)AA>TK z;@xCJl7T6&av?y00=$lLK=8!4@@mL(uX*u@pn*`Jas{dh3bG*m`f@6dAl9yBCx0L- zUq1W6AN_f3;edl?kcWHF25*9KK%a5kDfB~6^lzFu4NmhluZiOpxCZKTApZ^aGo+0p zk~&hP?@1+0eVO^lI`&*t+5n{UTmRI%_@#QmI#hDo^CM6+zjZsZGEaYwTnAp?_$G`C zb{Lor0wwmuk@S@)fB-0fluP!|L(m6z^~&lDUYC|bQe=4wHb-KKOY$+S!S)FvoINUb zKf0*kI3!f}_1-}DTJQCZ+9TiKBbiVTWA636@tRZ@V{>1>bw_h*XTRyg_a!+bdzU_b z4=H$BsW?)2hmyS0E~ll)b|-mwo02AXpe7^aCPl|8iBcwJa;A<K`6%S7l**ZgcX(-M zsfxcTqgoe&GN_S<sClZVdy@H^$N3*IsdTp~p1-M#vf7-FC`uOkqBr`ZNBX2!`lV<3 zrg!?Mhx(|O`roiBiK_akZ~ywM$9mG9s;z%2t$(A^GAzWR_LS)?m9YuRB6=1%dxr}K z$g)?T@v7Vq`<hbwcxrp!sQZ<;`<3eZmdJZ@YQXCKjlF+}zrT6I=d5iWCYPJCC$m@| z`3*Ef`}G4egZB{1r}!+}GLK{tt+ET7E1lQzce!>h7mKd7C#J`*vUt*b>(yYWxcrr3 z{S}X3%)fTd=gB2;{Mpa>qjikecO%DVxflU`n~=GzvZLZ(pX8_b`<45WpY(2?57UVR z{USI}6E#x9{Wn@UkYgz4H`>_$eyujC^0y1|M<$c&UydVx=KuZJ&kgmro*aC^f`|bK z{2vLt+Ef6De*y)L)BiCen80^BUIYlB;Z8Ge{<vKNV!}iUIL-Xo<HkuxfQuq8HuOMf zn!RM?j0Nz}sh|lFxs1IqA%oE{iS~@0IGAvu35O6RQnVN#<Hn93Lyi>L@?^@DHBopO z)~?*FBms!HBX#ja6@GmJP_>Fx>%|n16xM8*@z_0VoESC?AkQ8)OD6*O5Y|o{tz+d@ z1uc6utI&uOD+c(GY9K+70l@YvM7J*H%ty=xl6({nT)CGs*S(pOBTttF1IVQLP;pVx zn0@|Z+we6}#<FiiyqkA#0Mj~oehxjiBvh3&RfBBJ@Pv|A64T8B;u!M3g0yYB1s(S| z?!`cMldlV1y8l1w<KKQ~7(RA@7>cTKyjCZ`_Jws#qEyb%@L3HBhZ=CZ$w!|(_B8|` zVs5Ra--1;grqyK8O;_D@kZFfdZ4kbv8&Vv3<e6+P*g}p!;-~_|Xrvuj-+j!nHq#5Q z`KDK5Hv-3=XaeFi+zA;Dv>JmH@)s3N<&{?g80w&+MjqY(^TG*X@Z*UVV+``dWJX*8 zjx1D2(ZmZKI59;h?*OqEMwQT`ha92w6UhrDm=Vt{Zm@xjF*-Cg5(;?q!%7^INTr%Z zE$Bj%2{k-Zj2>#N(Z&g8qN(NyL8ag(oO04>C!Tup>F1w?3EGgMEHUXMlv2Lnf-cn5 z<kC7xWdG3QlTl82kp>Ue6x5xBW)cr6Cy-DV8JZAlLJ#Up;zvK8_<>IvtLEzJrf<eM zCzW1;DJGc>fyGZGN@8{dKZO7Xs<6ZsD4U~@N=m5*qimzY35wE`ZKvGsR_U2(uIU!1 z+tNuMzsVBYP`r^&dIGy~3|nlVgBE(|OXKNFB@y0SlZYE~G}7glVUAg5z?e1^@x&)& zYe*cPwrK8T9e*71$Sk}2a?IRTd1aPc0(|MfWC==Ws&(Sp>XZRAJny@i{fwoSTw2RC zUA=O5wXPg{46?{1e|xf}0`FL`%%JAEXP@P%u!b6ADB?~j<xL$lmxu<ial*=yaulZu z|NpIXu}(kgFr_DWYciQ!yIL{QQqe5i47>DVLZyGqlf(&lpwkAaL1l`AHKL3(*{0m3 zE`$j-Ak)hW2RVc9#!fZmdY?Lopi4s`WNbnUG&&89D<A=fdFnv5`3~!@_kv$Av*)|$ zuT3?CyAHZjU-{*kZ;rwr)SBP}G`Q?#Ip!T`9sreUu|-n!EV{%FX4%)vP7*zs(}({2 zbH@E-)VI0S1;BYPU<m0%L7EdRfggdG+zB?Lu7=1?ex1Ny)G$*6;u&u;G78?lDgf0$ zD!;+J0>18m<Z+n@Aw)m}&WvE|0D=zgr<DyBZ!#2&-wWoK1ng;#CcYbo#%RQXRIuX- z*&F{&0;QHbx>PWS7fiyYUPwaNO%5|dEaDMw=nM<uFN)(aVCOzZBGjdjE<D^FO#tY< zB)ouz9kiS0KsOu91yFNrbeXRxNXIo^(TEUgND?uFLe+^-2vdw*^k_%D$$_wi;)<hZ zPVmDZhVX?k97Pu^VM!S_QHLjRqYY26mq6<Ad22l5BCCiQ9-zn{uJi{!CKCi$#Df`& zV39}?Xg#f|u#6ypg)?5j18|f=l#MLaMS1`ZQPiY0Ey>v47D>a=@XA+dNnrqf8O&i8 zGhZ}1U0s+J0A|jJCaip=E2(t?A}sR+S;$8nOmI$g#xhg9tjP&-01mHUE)4lNN<;s~ zQ>A>Qfe8E4Um$qEnH;q8mDEy!FM&xHQkv%o`$&T$rM3ifOfaAO6qi5KFh&g$?=q5n z2}t-B(O@d+o&;lyHZ!`!fnt<=t`MX?|2CPBDzk3obRrO=Ns}79ZlnRA=xy@oQJvB> zb>jg+E}Wstx)8M&Bw8v+3F_2rMpcxvtmQ2)<I(^qlbp_(r$f{5$&#AOtF*Kwivobw zbgI=Md6a8I=}OdJ7!|2@B_vEG%1vVmk32GvL^j%y4RWwlHf{xLT=k|>wlr0QETXAC zi@8&R>cFP5q3B#;nTE15#5q%~i$23dh1EvEkS9Pv7eL{SaI}FWx*Q1}0lWW@nD)RO zrejSoSb|IwWVR+P2mnhYD?AzoC7iic-V%B1+lGiBxJ)65Y#6e!)UKAbtotQ3WRMDK z_^BbP^)B+P+1yfm#h>>Pq<j09gZ(Kq5Zvu<YquIxK$h;a%y`0hXoju{1|YLpeeZ5) zm>K1UFtCmNm-~9@V3}HWv-eRjW(;g$4R4IWFL2#2T8Px=(nZ4qt%H7nnL%@bxJ4#* zZ;G8E$``;^wzL&jgiB0J?NaZ)-sKDNAV}lb&bAE&{uX{+o8yM~m<p|J@n`!h$Rz`A z!o5`>a9Khg6;R?zR_KB*9=yOI+t|n+-s*|b?A{l{b9gr;4Mm&W+T#BTHKR&82zkH4 zrjZb}PZzN%b{o<GM8Jb{FWs#~9c7H5I0u|0IY<B&0z$GNVjd0In46p1kc$ku(3x5u zqJydEi!>UXnUOS&@GKcoe&wBZPzRlwOWu&MnpcEQf>Q$EjG*W+Gb-rB=K4pH`36GO z;@V4$>Ec<^>_7}dfS?3{BfFA3u{;>A3koXD#>s}-&H?DOp{v|&gjM+0n{#t!ru|I( z$qv;t$@b=6urcxCZ)VHJ47jBoJ!)rCP1%&_X&qDV+3b7WP^|ENH8?6k-&)_ZlXt3v zG3&_y=h~|5vq2=j>H=xt)^#y9#e+jcHj?Jvb;<XkUl3D8Q@8)HvXO~Y|1D-~j|$$~ zrruV~eQ<y4T;094cwI~ma#2F>;f*})%Fu8RNX20fpgX}CSfK_jMCo~$3tl+j^oSEY zCkydFg&ZF7g6K*#1%I#@A*6y#h?&71ywC&N8nT3Y@Iq8tX6~Qd`Sq}meWhbRJE79f zs8RvP?QrK)07{^AraPTfHVB44#)0d-EM5;y2VHynVG6znAXpM}S3~rHw06XTS^E<S zu@%2`%QrsRlfk;yxgG$B-s5>RV<1QO!uEKyt8nB2Is@r$_r6b9NqPsn*vUR~%xp^Z zg(5w}f@~hbvEA@&qte{#e*FlN<7S-qX4b<l`{VPS`mX;6<TIl21Uqxz`(igg!X*lI zsZ-q>wx5jGkzc2_znyImtNi7G1kjyO)J<L0{om>ZAV_Im`2k?#wIA4s-RtE-_-$R+ z?OpQuo!OzC<m?7S)x#uU0hleHc@$v%nNs!*U-OM#EC7!4NdojyAG%2m?1`W1F&^mH ziS_Y`x0MG~2m?9X12=5K31|RlxKcUX0+)yj5*&j+xPvkX!E?xfCXhosM4|FAL<~rR zH{64NT-WK0okqyRJ!k_dz(4?uz#SlnHgG~n09xKrp%r4G-^B+PdZF4O6GMz)8J?jD z{9q6cp-7a#9K?g^1jQeE0T2q|CX56Pgn|_=0}TJAz#0l6C&*p^q=OTl!-|+*AD|v* zyp|#c;wDttQvuv$G~p9QAwzTk9jJrvnah9y$JkY(M_^)tNnc&OfEuzPCjbEn)S=zT z;S~x&7LuDL`U58h7|_*XHCQ6oiD5I4p&7yeFRmd+wBcn%M?0j4BpQz@LZK8+1~IZC zB|hUV65lB{)(cdDKcvfw?c#ZKV>*1}IYOg4%G_%mp+6+y5|U#T7UK)-03TK(S&Skh zM&Fwm9}4iJKSszR4k2bdVkEK%ASPsmyaGLbV=6kKI8I?e(qZv!VHbWOdC&kTAV@c? zf+Ovt6ZWGLvQIB&<1datB_!iA0uD~D2>busV>-^D)Py4|UZg~R#x(XJ8Y0~;noxF) z22&E<Qc}tIeHu84k`CCwGvLBy<Qn@hL{LcOrfFKFH5Yb~gh()iR7xdPisfWnWmbA6 zB96oX{YuD1rCDBtBbg9eVg^%&99=lo%mkVZHN;#_&QlhMD8-{=CFTM}qf!bI*BMn6 z&E<?S=HvjTD$N*O6ejyXrFldqVLnGRZYEuLW>===XZEF%!~iAW!xwm)32CNDIp$=x z2xa0TVVWjqKIT$p#%?xcRPv>0a^_(QXIffjW4fhQDv4^=W@EkpNML4NNT<}$CUchN zyX+=$nkH{{CwZ(L8$?Q+IFNVJjH&;HrKz1jc&fp8K2Uk0=U%?&R=p>E)~9{m=Wfg= ze(q;?27x4~!zxH7e-0>t7U*fIr+9_}c^YVbRv7a+D1%05eU{2m_<=Xv1v4CiVooSm zf?=S!jD=#ThH|K2)~9|-D2k?Ncb=$<qG%DE!XdP%jLztNg6M_XLxyf>fwCxz(x{J? z$9Ynmjz(yF9@~)qD3T_rk}fHeHmQ>)DRMrklujv?R;iU<DVAobmToDRcBz+sDVT<- zn2sr#mZ_PZX?d2w7O29Jmd8U#B9NA-+wg%K?xzaSX=XTDhoUK;rs$p4>5`Cvk@YEQ zpuia%0$r#nj$}p&2r8jUX`}xRs+g)Nn|9}$2H1Ws5pVV=W&|l|h(x2|r)j|_S^fYt z#GHhVz#4D?X_%^vwdqv3s%fe!t8%HV9x1J!)~J$43|!DZ+9!0_LOa-lG#mm*+$xHq z03F0bEC7cJoL#ZJORp9Y1Sx^A605P+XRc-jveu}z4r{RrXnjuWuNvsK+NY*ICa2Qp zx>ixUf}xU#1g6F5o+`<_{t00ofjoReTtz5Sy@0;*YY(0l!0v0m@)wqAX~7CC&G?nM z%<I1dM<~b`e!@yP2*Ma70;?|U!5Sz7xkIxS2nqZFxd@WPQmnaHEXHcAeg12}b}W6W zY{u3qf$oJ2Of0OHr^Ekx=eyEO&#owhD&@O+YMx%i(a~$YlE=}WXPq#?6Uga+{%Z+1 z?S3|GxgM32DeTl<EqUy0c^s{hK)?_T>}drOEpBa!g4`~OSFMnS*bc1O-lx=3?S96s zgubnWdhMnLEz<q$-loGws7QdB2#N^qb67}vRL54CsxoLrk(j`TjE4yviE=0j;ikxn z)JQ|*hUD@`0DPhK+|W<7MPK|yU<}5$^#)!nDvumTaQp~?2uWn*N7f95cyvcnj0kzq zZbQg!c7Vi-BnX1-#^oAre9Q-oG(_+!NO81>xFD{2@NPpCZ|3?gkw{2@JVk$WV0rxJ zd0fbPct?*!Ze#yE#z6Q(FiEdbipWREh-nSTPV7aIh)WghLmfnoC=mgyIc0OohU}s* zP&EgQkZ(qUuk~i!=uW5jf`{$G$8P*DOTjO3v@S!GE?@}8D$vYtO0fK5Z-Y>8Tzzli zT8H@#i4Jst>i$Lmz>2I)1|Hx8&638Z050YZ?upd!;i89nEG{%O?m?ObVi0h7tYD#l zEJM6a+{{hgtkc)vjJP2IG!TPUI1VrXj<$G;(O68<xDDLM4c%mh!O+;zTuhRL?$DS` zP&CW4M9Z|K0Ytrt;3S^swT$7&%fl#6$$$&W5Y5?KF}J9V-AU#dtBlw%4wYC5)oh89 zAh8!OF(Uut%}xPL)yOgLeO|QM4A_iJ2N;1Cm`z<UvJw}v9#gRxYccm$5fgh~&dl-7 zxCzY23?7e76MP#ddom@j&8SG0G#w7qkn-%I)XaEOk{sybfXg!ll}h<BouqOmi!#}y zOwqs}J-o8N{7W&93B&O6!w}93s4=uii#naw(`@t7bj|E_aVRsh6UVY4_szn<+Y_7s z3)oB1$Z#dRpb?*Q5`VEehfVT8u@om>Ib#djR5Q6L#0hLbCBz$MG*TaB5#X%D6?lUz z#1;3Xj~%T}>y!{G4fAe{#L+U(M#B#Fu*M>VE{>H^8Xpu(2SV~(61(A$CxMdgjZ)U8 zG+_T3k^!~b^mw#mX)4iCR2a$8R5j92Ulk+~+!i?z{s^2OZDwv^YG#0t>`{~&3D6FW zN)M5(6%o->YY`V6oD_i()+TIcx(}xE^u|om-Ygdf4dzwb(F@4Ll(f*Mtj1IY^-Z5y zAsrIEeRW-oSh{x76M4}g{fkYTwVS;WVdGE#Ja#CG^IJ>X9%1!pIJ8$oG{QdUCSeli zEW!S6P%KawLMt>w*9B%{Q7=g}MO$=bXLMh)&=6PHi3JB@DHdb3QBh^arr3i&&;(tC z)<gLnX~l%ged=K))?%S*UGUa2HPbgG?LDou|0EP=%v4BamhOdAXXzql_|;ft;b8v> zv$u`aW*^&E!IifqH*N>h38Z&eJ(hZ7)n=uEqfilPm^XVb_e9;aaF5n=|CBiIwt3`K zR;7V{MO9$mbW(B0csG(RC&@IeQeKJH3AjKo`~rCln!hO}DV-ED<DB2^m54F;U+D*Z zSC+p)6?5+fQcbwH7<hdfRCU)^&MM?+{Pzj$cWzfzU)?lz6IAT%0!?g`dp4-Q)i#fd z8i7w|CHOXQH^hHKRPoJrl7|$RdD#el7&3$yZ&w03gn~XqYh9d|lNqCBnLtbx7x1K# zY-G77d>QZ5kIG3Doncy#k{ET*S0B_@kk<j5U6^+-xMGu7%1IZNRhO2X5S9O(x44j5 zk-1Hm#rc+VU5!P$r4!kW1v-=|(Otp0oHtgSA(?mGxtmu}r=u1z9axM3hhX2;l~I>< zc^FVK8L6N7i~xgVszp$F_+CR(BV{3pM_Hj$S)jMNlDzn!v)O3v51-q(WG|$xn|W)I z043CeCx~E}ak-bn8IaSqdwm-o(8Ck_0sdIIKw<f$hdQ^n$fkt(m=m3xq4|oV;z3)4 zOB5Q+T|`U?92;p`>ZpLAka+-515>bCvb7t;`E+LNyPDg3w<-M5p)|vJ8g+xBOP5j4 z72MAadPA68#fO`)KZBO->TaN1(0M#nE!=LvTtg(>%D0We^@-0tk-z`X49dH_%qg39 z58Yl!{Bcjt%_}v(?c6%{w_<-=!)0^H(}>N<n=}o&&o{)c0Z|Ky04y-PDpAzab6cGU z)6i!I$Sb|4X;IOiU)M4?(A9jQ^$%)A_EfFC#vR*?P;9@CoV|H>&H)>R{D3u>0xaP7 zWE8<CNa|MQdlKmU-4C3Tzk|T{L$ppk+Bc}S_{|G^U<g+F5p-V!sv`>cfjU?MNGx6e z1fWwryo~8!|MB2QW4^XGmV;H_>X&i7lAqWK+eHu?5yM~$%HRNkU+i6={$=3?2Hq(< zR{nio4Q}218KC{SO(lTf>r;sdR^4P&zy0lA?}^gpyI*N0zu5n|{+3T*1tK60>VWDW zp4PWj_jf-0)w`&hxb6QP2hv3FX&>ubocXh!9E}S=^a(JK;6NhkHWgI3kRc9hq6(f^ za*vlAHpq;<NKxsXju#+cIeT&92)S#C+{k(KBEX3jxx(pDd4lDMEb&mOd{M$oJXUcs z#UpiM<2xV$K#F8o&>_TvHK4hQ$kQiKp(lEn6F4x3xj-kDh7AB!D!~&a(A+DgC(fQW zI#g7uHwjA@T_Q=EM5(jo%a}7a>ia3FT`Yoev+>(HkVPtg+gJwJNKd9Fp)cajt$TN5 z$&)Ep76pRBk2*^_(5hwYR)=V$AtQ&?aHkr%d)PP;qyhh`nm>EpR=pUh<W)O=>6QTz zeIf*<e05Hs@FI*{0B)O1h&GW__zpPD<lWOo3dT|sCU*D!9eiNNkFZ~O2QQv{fb;iF zM3kY4Ts&n$h|uc3t^(O8on!ntN0p;AqU|1TIH75*s2Dl{2?X8wucrO_`>!aExC<Z# zNxZoy8FDfbt0fNo6QZUI{mD=W6yQM6pK@+_LdEoa1MUSHZNyPWApN;9#{e3v=D`Ss zJApXkkOM-875QuNg&=tAk-e5+l<~*uY`bot6ut{@yz*3BXt?5zORhBsA*9K*5Cdpx zp%YltaKsW%%;<#?X!A`QPLA?{LWQKG?!knRoMHc$ZGZr)pb$n`$Hg?mvXh`c1GQ&R zAV}Z{MEIO!Gs-C~#85*jJ9IGxIGLOiHWf7`h%AMYT#}}&79&tnOl>{1phUxDl*jd& ze6md`xl~mM0})j4sDWM}f}C-t9Y_N@+%ZgB+HAv3w=9ue6UyY4Ywo$|z+6-^j*g-; ztP@T!;e{!2jcwDKXc7)reDCx3yn^mqYNTJo@|R%z77mzRg7C`^V&M*k*etL_)AwS9 zRaE%leGfhu;fPMq!G>pW(U>8M>5a_ek&#q+WtsP#S)rC=^B3owo0KqSn_EJdVvwo* z7}$bz?l(4^k2bjH$mlg0Wqn)5w_}b6lF0uZS*#8~gE{z#r0KDPzW3^~6@D4%r#GgV z?4y~k5azel#QNua(RLYXjNw)Jg&M5cgz7uNG8=Eacm6kDx9M)&@yEkrxM7JEig@6N z({v5;%}-!M4>jZng`Yq+FWvOhQBPfUvpfe~bkb4Rh}&8uOu-L#>RVm+-Ffdlb<GLd z0Shul`6db9kxyRv$ty3|Jm)1>5%}eAw%r?f>|y4RxvB5o`|rml%8%=_-+pxz&Nu|$ z61IpC{P*FHKXZ5^`e7P-mf=GF{rNv#@`3yJHhOU{fCV(5>ISGgitX)y4Rj#&2>3t= zPLP5XwBQ9Xm_ZG0kb@oc;0Hk%LJ|Ltkc1_~pbGeqoA1pgIo&G(8QS2u3~XT*-g{vT zQ|G*burOPw)1g9c_&flbP<20STJ(sRL?v2K1i46&_okP_Ard48onVKK==LGTt*(k! zl;RJygDK0U33CeRA{HknF%$d%8qS~><&IcJ`^XV>PO?Qi>>&;H%_|H4@FTY7D3N}M zjUkd7!5Z|JMgWd605b@NAB_U6Lng8ylZ4w62KhKa64ES6xMLpoNH$A8j*V_a*d{fJ zNlv1!ltvQ^Djf$)f{gNeEzrdiyB9?tPO&8ckU=Qim__<6uU@|lrvHo>Mip6(mkU8+ z)_e)fdO@s=FF1lcz5#?6<cI%Zbfo4OnF&Y8-NyyG2!|lXkO)dvC=2)yLllMpmh(u& z9EA{~#F_#<M$Qp{C(wWsw9pBoM35l0D(FKlSx<thh@OQ&SUJy`&UH4;pl`D#Hnka% zB`7qO8+B;vE}G3PX3e7uePv0Rf>7|i1ees)B{IcH5C{xmq)T~e@6I#Rn#Pfr$|R#V zooPgV>Xdn#DghIoP%wQ8^_x1}=jQHXClgGQkMwwg4t_P&BM7LF&daAFDJMswK*Bwk zs%V{5iYbz4MUz`y%s@0{(xserY&${fo!r`1wu1DiXiU>u-zvborqn6R^8g|4*QcGH zpa_@v(H+2J4{TUMQZE0n1v&g7js?|(INmtUER;h(HY($Imc^`QGfJjr_y$5<Q%DNj zQZHswOsQkU13Qv%pBC)G6&tZfZ@6)ZX-Ovl?I_1Aa_dV*1i-WQFa}tpGYsP*mz&`{ z4{e#rSjVCOve=vKG)<e?%}%wmpAD^1)(8#KnjpNWWr=E8%ZVvPce=+5Ky15tUEzc^ zdX9voN4OaSMX2W*b+GQ3YIGY;uw*vP@N960>jmi^*S=vP(=imxk`JW9kAC!rQka>w zEYO1s|KkBVzCbwv6WG8T?(iR{)ZWc1cNoom?wH8x5rWW{!U1sci^rjZA9py&0pKxm z3v%KwKu*a78S?)>KFkssXLQBBDX@<@4CEMJR=nD5uy-lj$VdL8tVu>Olg~`W0b98a z1DWy*8vJ14iuu1wD{neLOOPf%ZqHbL@jr@u;S3K%28^h&Z=M@xe?T}*D8NHM27{uJ z?qCbTxJNXS5Esgj!7`*6hzi!AhA}9@9i?aq5xnskIW*#39YF##h+$t)i<;D?rphfW zf)Upi<d^rjh9g`A&e~#b#7{s$6og=dz-<H_lZb;R!gdxgr~?&h$b&b4vCSGhV=Zb} zLmQ+`ZEItDn<2LDeJE{dOlw*XoEFM?W<BaspE}ihX+(BJ_3Bu|JJj+ng$Zt*Yh$2h z+SR^xwtN5m>tL%fdSyI82b?ekfkrAnCkO*SJfVd#3?ix4rOHo&GL*>}A`YP#BuffD z?rewU<5uzX35;+BaL9rRQfR`tTVe*Q>HvB&7({Yga`B9BJgG33In8a(l6cp8AlvTt zw<V>497m=EDL?o~Vm|YlHv#KM-}+9hPHuwuyuytmyIHc1^d=011pQ{Z#WAjNj<+Q3 zUk||2=RKKrclzNGpZLhm{<y#gJ?=#RwA=Gu3Ce`-<PewmK(mHwRkM2RKZo4ljjr{i zw>;!var)<=9;(HgJQ7>9fv$BRf?K-n1VLcLG|q90He{gHI?#a!MuA&}u=E9uxuWeO zvyuOGT)`W%$ms5!_yR{d1FN=d>79ZgiE6}NfBC(fQU`K`e5BzBgT#S3>M#OPnG6}d zQ2s7@G1U(IVIE2NTU2;1TSxVxCF^g0xsmw8*1taXv&VNwZZG%BE&zDX_pS=S@NM{t zFQX!c_m;2uR&W05kNw=Q^`wvbBt?$ANsF=u576N)%nd)5Pn$fzijqM1fWQP!&-?-a z{nU^BkYp)F@C8Z`x9TOI&h0*Ig2e2Dn)XX#PQU|WNC&~<tEg!pcyB^nA^w0c1*UEw zB=F%VkR@v6VGJq??a%$FWv9-@EYPa37J~PJ@B^*J3ezeKlMe+0Q1^&JR5ZqJ=m!65 z#_%n|g7=C-2m)XQn}h=czyN{oa2`hvzpx-?um+Rh1jqta#)KpAP!AcW2f#rTSfYuZ z?<uCC9xg!$J|<%<Zu?$91|%UH+94arK_qIR{9Mbo{J~GgE)++x6kmV`z@ZfAB?%Lz zJIY`hJaO2nYlu$Z2fX4B{NWdl03W!(HJZp70)PiFt4N9jAJPC3qXPd-fEk_f8KaS@ zey9d6F%w(jJY1s_)8G?bkrYi475V91>|qrZ#sol76wNUfXR#KO&l;~08kJ@Ta?uk9 zqT!m!Yo3r^f&docff*J-o2=^uasV7iVV=TZ`?LcDa={s@u^F8aAA0Fd7SjLIf^PeG z4hPF9VopHkuBv$oMj#2&AQ2L-9%6{z@fDSVEbxyYq^`{D@gk#f5Ea6pZW0^i>TxRS zCF8O6Qt}{UBPh!e7PUwm8SDvr2PF&AC<!eoMM8_{q$YK2EYOj9s&FH-<{{HS2Mnbw z2*N67MJyJw6j;Lf+-5{z?-sZ~Qo`{e>p%r40pqN|E=1z=enDfHEfn-&D8Rxl@lr2e zpa<MR6!Jp^g25Qb$n~lL&z?ZGda)NH!Umwh5PU%r*Z~aK;k@DnHWrfRsGu~F%>>3W zVn(wxO;ZS-sUN4vEin)r;bp4mk}y3XFFAuRSpq-)GB6(oH+54a5L5p#O@J{Sb2VA> zG|vMvB{Kt^%816Q%xD4yx&RcsAspJ^+|tq^pCckeLQ+VxHNzq;zw$ZG10*qrVRmq$ z7^yn1Gds7FC5`jb?lLzGQwb$!I<rza$x|l@t04T73XlzX3`#f+6F#w1I}ZvB5tK9L z@;O?<3Crv$e<VH`^g*lA4MT)KBZD`)$Dqu!Birm&3c@UvLM$He1#B@acHj&wO(k7J z1v;Vql5rroW5aMuUy4En9!)TB^fgTJ8H`~ulP@e#fDK;3AFja@?CZdcs4<dZ9fH6Y zgn=4bgF|7%k+3vt<jF(_hD)bpswh*ae&{@2G)50nJ80BKC-VP1ax@io)HgZ8NBaRt zClW_tW7~@KIFnCI=Lx!$lu4a*i2TurIsg&i;SgbSU`}!1{wF_{?>r0<JX5qw$uy=2 zV)+Kb5Yw|I8HqiM&9x5oJWeqH@Fg_~B1l7oETTsP6t%*{)Jq9sEEmF7H#Hc#G-#5? zpjh=RZAI4x0#^s(S2r}0+SI-hby0uvbRISJ@>EDQLQ7M0Ss4|}c9eRERm_wz01QzH zUyE9|h$q~E7xdsFDlsC2qXdco6mTmr2BR?UPA=#oK|NzHLIYk%!!+Q6UN@sE{{YhB zfDj}tEJVN-iUHiHF`Uw|AQIIcZ~+An!5?rTOCu>M&LaOU)}k#y&{cIXH8z$tpfsHN zg<akC1S>%>;(#y=BQxriGx9>!9--Anqcl##W&c$p0`?~e)-geLHQwT26P6};(fVS_ zCU8P0PT&k!K@GIv+R~3?Iqxbg6)ZFsXst#hr*<el)i`soB}Qzb_z6FjwrQW%8`7^Y zU_vGy;RJ9tKRp(XEUq6+K_`BeV^PH~*p?<-Vr^&QZdoHuaNrrD;R(2KAr91E6O?J4 z7HYFbZ)f6dAv9&<)my+eX;(sU3D<B1h;h%B{v`KUM<qp(HYZjhX7P2T2DfkzHzFXn zZMW9*gk=%kLtYF<wag@UBFA28;$03TK^9~nj>Z2+%w<{9#W~t+c-do5Or&7NA_v!# zmuvzb42%a5;{QTZDTu{g^wW8^_d32d2ltC_epgzAmt2UqRL%u7nFD#z1AT+T1ejN` zOyGMH!f40VXr~BIs^mY2#7H_W#BwE0rWL)oqkh{3d>gf32AD~@wrE9l=YmQH|5r$W zuuC)qOVq<h0w6Vihz3HTKa%516h%z327@mpRboU#>^DtbpbGqfA3ln1DoS~Oq(+KF zNX!C-uLORlwS0p&Yx3k$5(b84xLLENf{!EsY#2qMW{8XTRK((iV|a!Ih=*TANeCER zPgGp5#${Z|JQgBj>ZXhn2Wh$n4ueK&QfB{|7_O@{wI4U7X@<rmE9Y)tGk^1Vj`X-J z`(}#ZFlp*|VD5!-+L3ai=45bTV$?XOj&Om+iDi6dUktUGaONL}NMKBIfBU7YHrXt~ z){WJ~khh6fw-Aow_>{Ns4H-z4U8#;SB?c$~AHJY<F{P1J*_D6AZpgT9LMBaQnU-z2 zjBAFD*+!6YnTlq)mK#TH+J>RRIC*YLcRJ^DLT7ZA=xClvJ5o7ys@Zk0d6$4ne#Tjo z+NlkUfTobAocAaC)L|8N&4H%5Y1|o}L#UqPIh$!#dBlf&v<HckDF1xwDXj;4{&{s? zbAOnMbFx4l{-}p`C!zbN2u|S;FlhgtkA|WxT7)!OpBpHFJbIkI2c(N=p_QnUlX;gy zdZk&qrCs`^VLGN|dZuZ*rfvGBaXP1UdZ&2@g;c17c!-F6ny24qhHB_^hMIzmny8Ov zsh20Hnfh%gaf@V$ZmPN^JPD8V$iK)8qMPQWs=A5%C>|v7fu>qTXemuvNm95vlK45R zK`Ec<Cavchk-E4-A?K_oh!0hVu1kooeFvkXdMVhFp-`%E8tS3U37ypGp8^W<-Uh4> zyCrrY3XtFon?@oWy2IQ$bqZT7=xSxINu*lBvHwnaAd0cY7AP_MZ464Vo94462(}w1 zv_*)vO$WCJn;=?rDF92a0xSQnvW7yll5D_wu&8BNTN_vesS&Wi3alUsh8a_OyCIf) zW%{amoYFv53ZMn|x+&@mbvsR}yMe}gY-~G(&iirJTc+R4TM^416iYG^3^(+p&l;!C zo-E36tU}+r%Ix9FTw}B<48OA`y-!LpTuIREo6ro+#v<sj602a3?0B9G(6;QfHmj|R zTQasAz^_a!3hmIG3%Vq%zWl7i_`AX#oWyTzDK0$F>U+V&BF3}yw-#;AjO@gFOe`c^ zz6+MYX&kFx!L#t}C_uc;#6rj!46@|RtGgJ-8I8U%%)WzA_mGgc!otR>e9%Pv!4d5Q zO0dYLTG6H)NqHQ}0^t9>OU1}R%eR0_$Cu*EBrD9;oXgyc$lV+?1AxHqT*FiAJK}4; z(tH3*2=7cy10F5XG9q>>&(O&R^Xks#XmYy|o$!Wk?mk4{%5Lxq!UqCJu1{*O2*S}n z&)dKaNf&)(C9Uej?dmd5?UWAjXt4u~;ISiRhny1bGTpBj;?$we)eVl^VtwlZK-g7| zC4fEEeS6Zm&e5CQ>ynPyoDJF{A>4+2<(9(H1XdDSy(d8KDo#N1><!c9&ewqm++D5> z>4D@(&uysv*`h6Wi|yEwEpX<=*>^(SJ5MZ@UCc*e8z3+v^p5dLkLAK{<t}~P>n$Z% zE#9r2fb`DYICB5t$=%^=kJAs2*5)nX(3Rj`UF`Ik_fBu%QZE97!5K)<1SKV<fkhB2 z%0n4K427_3gpc@)PhZsd1Q2{)mH^6%<m3vG<r6U@!=mJEPxUea3#Sl3(a=w(vxj89 zC2Ag6ik_{}ZvyYn>6!liuKtyZ@C=9E2Ia=-@9+imu<NyuA&~y$mp<iJ9=CM#0HLPp z(`4*Xb{&pF4=s!l(Z2kY5AJEu1htR*ybt_*JM6&_?+NJZ#k>=W%nlhb4*{QM)Lvf- zP)_Ndc3p(;ZK@LVehmjO^M5ZZZ+-z)#sO1);Lnf#q;TtrNGM?u63cq3y|N?2(s#}Z zD`P|U@nZiVqcXKBVI5f!SU`OfMBV56!MUwK3XbRY#ZfG0S1f3M66?_-ebVWDi7F$5 z_jSFjpi(8bNG6jE`~3kQoxUf}KN`s&Sh|uS&olQkMZD?fM%5qv8KU|F!1m!E_W`2D zvtBO(7&Ley2&{O_76B=EFk*lcIlz%Z7$#qu6qViq2>>FOGl>#8dJG^!WPpknCuU6Z z!(5<0{(c?7$AzRs9M(h~q-YVNMjbj0)_~>;;=~Z0#u06y%h(H(I$nT)<xD9_9_0La z^@=ae2^o^IwaZ2>YYk+*h(<K|G3Cgj0jRz>@$v;(vuM?_b$gJbJ%3V_?me6K1rKng zPMrT}kxMGquVBT}y^J}t=FOT_P~zvwN*7&OE0!t<RjO&BbvV1$$<t@V6Dc6Qt7_0Q zXwjtazCh6hl(%qg>Q+J*N*^i5noq=j{c{PwJ||v4T<tPn>!YqVn?@b=MMYUu%2SCV z#NhLTx<il7I<fX`rL=A1p7=ZX@Zy)bOB`?BdFchPo<RVbhh6|aAmv(tD>23zW)8vy z5?11YLmq+y>hxUzsa;qKYc?SBi&ppnCmeB?VTYG?6kg@b33R<^A&VK+VFNUV_#z2A zV6X!OV6gQRk&W8*$6!PrH1!c=QrQKgiA7=<AbKQFQjaHCy!XP0C6?6DM^VlgW_JH| zw8vXkUYf`ea>_A>CYL?9Bbx}p81rC;<s}GRpML%skz6L25akTPI8&9AFBs~~pi8oo z1fUHPDUk+<z!RxKav3ycL~9wNgGnmj(a&-+X6A!6n*eq~5ufmP*$GRS(}zTi8uVzS z{%OW&qLD2c3^i^sXV8M(9kgkM@CDGprAeG>kfoRw^{J2~?Rt=*!XgB%gW3*zDz=&# z8_}%+<cb-&ft6Wku;5<S>kEpSo9hRuKq}=y)zU?8Cy>&(tWE#}J6EnOq>{`!LHHt! zu+ZwHu0j1misZ2ep@7IdNyr->los;qF1IL&Bx98J;`<i69~VWT3Y}=2tjYiPZk+Nv zqn7Ge%oYlS=g3lhD>6c^!YXOeM(0*ZJ(FzNTM1^k!;2nlAY;r4PRGMa9GS$kTxK{t z6U`I(Zss6H{g@)hBQL0s^wM0Oa0V-CXpx6Ey%^^a3Vx_#iM2X8N2x&v`?Jm1(M>no z)md-dwYYRy{dCk*S6u=c_Y|W?9DB4u)ML4Xqet2&u&p%H%bt)$JgB4%5ngAr4!7KN z+l`sHR$Gp_=A5e+`0bZxzBy5j#|jzfqARX7*AJ8Ax$%$CrgDsx|E{~=2ssV4)Ko)` zb@HYjLC!UaxB+|IbJu-$QQR-C{J><M1mpVNpU|v5xM1uLF4q54eCYqrBhR?yNyKro zx(6@ZFuAF8q$-_a-t=-8Jkq(XHzxp}_{gU=_pz)J`pB9j+7XKYNYHe5vEcYv2N%8Z zO$Q_7QVRaikE{`b98!58@OBq~!4>XkJS-XwKv4~U*rOY(u+9$P&<uIpLmQ-k!Bp;0 zjeBr|6V<`Y3##A`eiTB0oGF_@Xb=i=#A6u``C$-;SVR=S;TT>i$1R?KHz1rK1eDMY z7bTLaRUJeFbZ|!qF(WHlN#u!9oMIJ+SCpwBQHe~1K>$$T1!0gwiktWe64>YtWeDK~ zK>(r<iP$<BXhMvdga{bLNJcfX(I0MvW5q}UNl8-jAZ3f?B)R`l$p9eoahLQ*CO4S^ zC`yrvhC@g%f9XD3&XO*QOyUxoNXTJU=PpWkMLYbFj#RF(jc>e6G!3ah_^nJ}(X&o4 z3rS4W;iEM?P)9Cfb<9$pQ<}we+zUnkMImZ~6F?xr0<AJmohTERU-Tpzt#g8EUNf6O z&>%U}!Nzl_;v)et<0p$qO>1J4jBuG_9b043g9ac5lJLeol0n0Q4D_9R^kWZS3MlL7 z!~_Pp3$#q&7@2A&29&_Z7m8^#o$54^`Fg?rnCGB7{%xqto2H+v0}-1>1ge8<9kiG_ zRfJZNBv{2Nbf~%+u>MJ>#Nw7$bwXC9W)-Lb0IO7g;?)0|79^)#Wvf~3+9$fgwXK{< z>ull*sGJ^EGh&r1SLZrSyw>a?hixofO=Q%p{_O-hu)#BMp_IZ-1g4zrtkHrX33aSu zu%7Mg33d<#Bm}OstZl7pUklsV%67K2t?f%G6x$Q9K@Vz>Ln!zW2-^xbwnaF_A%+Xn zkjUd7@sJI2p9|gSN_V={t?qDf`&!!g!5i|h2Qv<#R_ls)yf1Z(jLu5l^s0Bg>}{`m z-}~3_!gs#(t*?FWi{Jd}cfb7YuYdmw-~bDFzyvO^f#Ex-LA^A=G(E6`qnm*(%;Lcm zuCRqUn_%@axWPQ!Fo%ar1VNHF#I<_v51<hv`S$<t#3_!*2-c93b<L+}FOIRF4E2wH zoJ2D<CP|Nxi(?&A^dKxQYoC4`ks_<OwMgz$kawJ!CL2V`FD(Kn$YGBuLZky_IL1A& zVTprS8OvIpNHwtx=J0aa%U~Asm9xwVppF^Nb3L;?(i{LHEH}qF-UoH&T;_zn0?n3C zu|k9e5kSZJAR9i&lK5Pchy;NV%`itHbRZ)JM`X=k4zoc>KnOO9W1<D&bej!gYEJ`_ z#G1hX1rh-31w=pxBX~dq9C-o^IKUvThBd4kAfpmsU;+<tfCSij0#;+D1-2l^Kit8L zM!@t1N07%i82egkTN~TFb8Z}s=0(n&Km-3y&_X9XqGB(GTejma_qpYG5N%&uu|x89 zTdO^9*peWh>0k!u3bO9zklWno){MGW`%=#^V-jqz1#l;_1gOQ~w_8*=!yO*n6CmLh zQnSTA>Y!9vNu1)Nqr}1+{&2cj9OW6`c*j3}f)QB33Sj65C$Jy|A*>wZ6LERNVSbqy z5F&`%aLdk99smyuE)~ka!pvQHf-6`9b8i>|L>dk8k!#UvVbF&sv_Ob<xWX|J=f%Xg zE^@PzeAOb36$~nXfdyQE0|wba0v>SeT<<ynH;_9ADo_Cq+$HW3xBv$54%B3~oh~j2 zhBCB3hTleF$zd%46I=<~7g!$iv|Rr!b^#Ue&D3YcUPCy6Okdm4->0pcFIw3&fBD>| zPHtrQ#80~|Db?Hc;P&pJ30|P!A9$lX9vH<sp5+3O=-~IkA3nEaG^b4z#KVIMf$@>A z{I(`o_^zNS^#=v~L2-Xj<~2d|!*7Bk$Yl96RSNf?Z+>@3e^4!rMS@X>4MU`&=nY2y z`;%UO3Pvcfpg$RQ0zV)Q;B^8DW)MneeaCkK$%iN_FbYL?0xU2J)DQp<h<%8{ff1;D zYNdE3rWt+bNK;m9yQX)%wg83|0Cpz<Fkm$nuy?VdY?sk^C2|5I0t_#(Bu?QoFQ5T; z&<x(-58QAGA2EbQc!Wt908jsRA4_P2NJvpBfJ8zxMf-CCct9}*(E_{R3Q!0U_QGd5 z<`jYvL{x|wF`x)%bPcURhGhtZF3@cLFlvk?1B@^XMraRJV-WJOdXO{>?NAQ05GirU zXHJ2LW=Ir*NQj1r8FbhccPNBJ*j;$GgqK)ofngsIA%;IuO-7gwv+xm;XosY>i2vXe zpZJGs^ks`Cg-u9NZ0LrqF(bBtZ3U5vb6AIz7yx;=heG6sb<v3z;{}6Qh=-U8WvGfe zu#1g&jE|TpeX?QdH+eP?48O1h<!}fYlLXah4v|0~H=qe&k!jS2joQeK-k5X=W{v3A zXy6zL?TAx15CG=rj$8kiVF&S!?RWy@7#8iQL-42r6v%(x=Z@hxeFN!zF0c#0Fa!%o zQyuUJ>Cg=Apbe_9NsOjx>9~#Es4*#k2=wp;x`Y%vn2jIljUKs<8pC!Z2uN{vf&ox# z7cc=asB0`J5&tM_5D|BoF@l+qg9Xuec=Cfy(lM1l51|tZ{UDAUv6Q~$lrPW$PA~=U zb}CTGlv8;%w}3!YqlH;O4^Mys=wSn@k^x3QaPT$}MsNjGA_YyLK<F?Dai9tOFnNy? z2B4t@V=xGCbOLS(mvSjWYoG>Wpa|{|BD(Ypn4<=3&<3ZX0mT>qB>)EMfC_3*H$51b zZ%H0;c^88DnR5SWnV6}W-q3@Wp#p}9n2Ko}OGyTrz%{R_2eCPu(Nc``W0hEm5Jcb& z7bFML762r`nu!@AojI6Pxtj%7nP$*E0R)wXFmY3f7kufLoX0$KfR_)0oTFI~t9h8l zX%vmgTaYQ4lv$dYxtXEqnN$Fp-RYjBd70{on)D_S33h0kgab&C1@}M-ct8(1fuFEI z4I3E%E}#qlpbwkC93}t*JJ19$Fd+Ns3jO(?0m@<d*^Unyp&QbU`5Ar)s-O%ikriZV z5-Di}x{)Rzq6>PCt@0`x_5#*-kPHT*Ne82CAb>UyjOS290~ij1fCYB|LJ+~B5=v7P zYM}s{6AJ%P4z$n=#1JV;>Yq$Xr59>r>T`pcVS)!yYZ73B7;tNR=W7YjlRtS7eHQ`6 z6qJ#ejV}-be&CcF$Rr-}D<+X1BSH{(8UT8VP<HW$9g(MOK`@y1A#`yB8gT?pi38@) z8ly*1%rPN?+9ibgICy{#I5ZJ55^#!QlCID>KLLoIxC?hfKYySx0M|R5x>_?(suMwx zsj3-@!V&8bB*phHm0+tnfUA+Bd!qVJOUDjRpaZKH5l&J?Wdl8=$0!exE4BI&e!7L3 zN?My51DVhc(e@FNih5r7E1w#w2r;S>^QxyRs|CWX-sY;N8mlxzjV4e8u<#8}uz<#r z0a5?3g%~<0@j9<4T9uLKq7yL(%XJT@p&&?culdRa3C6GVN`3?T4+X0f@G7tL+K&I4 z91Kc+v$91W*085y0vNlX{&<cXW{~XHjvq_1-}jG+xg3qx3plkT>yREN0I?E#u&$7> zOd0?`kPW=R2*-d9Tf`Ht&;j_$r1pxm0s4}hfu>Wo05N!z7BHr92Y7*}lWE$MHn@02 z(Rg0*59h!ML~)cJl9cliB_6XZlSz7Ns~C*o7@qn!F)<T0aT77dw#GWCCy^|Zr4S6^ z5K2)thtU@W!5vbPw-7NIlwppi*Lx1KxL?t@MM1cUVHYj35n*x{c@Y4K8xfwXOMm}C z5|z6wUgWtz(Gr;ZA|#U#3(*kV_Bb~%bm4G&jw=zQYq&^(xRe>WmBFfyyIQ^L50l#` zK5z`t@GN)XCG_Vk#d5sKt6<DwFF<GlH{b?tpax>IgCxSdm{PCLTOA2zz1S-@2VuO( zTSeq2BhyP1gK`A=XujZkb<&#(PN8Ykcd`O_zR63E-}iebz`iYTC^S_9s7f>Ao4v|Q zBGKY3_R=#lFbd-!1YW|xm_osw>ntL;rI?|n5J3VDFl&96lYF-TjwDk&Icr(VwJ_<m zjyDB<P!GX%E_F()|CF{i{4u|ZHw<JUb5bXF@;EuNBR%pXL88OBCu3p~P&@ybA1MMW z4iYE5@u|!+u6a@=6KZ-6av*!+p%M|rSwSH!QU_stBk@6*W=wi(;>Dlg9#U+(vr)xH zGRD!9Qz)_@Kv^9$pbOjb#<{`9X_C7ZBdV0S#R7uF5uwFYq9K~`eKa7i8`EIcC&4cu zfy?K}-vG%vVJ}4&0L5AmIwi@QRLLfA$&j32p8R`CQOXmWVVgWG>esPf^vGJ#%KOKD zIqG5gOH-vB5#%>C)R#lHY<(0X$#R6s)<ILDOv%cZBe-A?1*|dF_YLV$$;w>GO}iOS z`+|rE0~0U-Roj9Ru>*)#nKTHL8_Ya8I7g!}Zy1xRAL6!di)tAhsA&JYGtba7DIpbf zaWDz9Fb#ug%tFuRn<VwD!~s(~U|B2$Ju-7KCWs_0(+D)1O3;G5(1JYCWtF4Iq7upy zP9NbiAz3CNohcD55zXSg25~a(swo}aDG_rJDE%xFb11mtFG=7~MxoFXF*JW89~%kN zIs+dN-Mlo-$7Kc67hNtPL(z=vVR*3*jW7jH7X^1wc4xOmP%YI|Erfe;LYd$WV@Hp@ zoOW347-10AQ*8xN(7zj|)oNYU8sOFB1J+^<aVLrqY0cGg{ncSDkqkK~DBuKRV0=@+ z)^E+#g96wmumzq#*M40<x1a?sd!Gzg))Y6x=->!bPzKYG6|(;V4r+&XSG{&CtQj!C z0ajZ91+fD?nQIiVciKD=FhF>QN6w}lD?=FoJYWsSxdaCEl~01hU_9KdlRB%DLB;(- zF%$<gw9iFRKlg(O`7<oX%{mj&KcbV<J83?%lRnMkKcmw&Bs9g$69%uNHa1i}*!?-- zeHYpNKe%&4ZZVKZQ#vlhK^_D`#?e7>@Iim%66kH*sslSFgh6XF-dw`o&QnFGL*VJ{ zob0n40~0&vLpw`HI1r%$e2|&5GZ)}3IxQr{h~zqGliu>Z-XQ)w@7><VgW|!H8NkdD z%s4Hn7N|6y1RfA-LL?1NIMyfKWt~P-GhT+6;=e@BXPEz@<7{LPJ>JXjyG1u%<T<|M zP40yB*GKl3U^p-hWw;GOfaE!5<R%b+IE4a4h-Q~?B1jYf;=l=;)qtADEJ1#10nkZZ zkq&QEYILq@Hh#`sTNJML0I@b}AAD?&^v#accg#cE6ad?Yj?Isw+qI!Fw3bgx#83WY z&&0jyp)^YIph@yfQYM8`&;2)9uui+}PCp?^q_mM5he@GcPU@pd+=O|s?n|ZANoNE~ zIa?H`G)51xQkE3!uO3gEH0;rm<q;85pu`an<qs0|5zih`6UFRd6zp@=>Y%<!g0@g( zqyx=fM8;I?+WzVCBuwB0Fegy!tkg})?ozpN2a^B9N``nUxc*C=WKg}H)CU3VWb_-6 zbW87q@1@jp<(}-A0nAo}UOP#7@z#KqO%ehq=L{IV68T}zw}8FeRFBiYLDN>OypISm z@%N`w;0Jt6CFk+h@JyvyA+K0%8Y>SYR58ySfQ8$S!$ne36^3J8%%oK|bw`d-S(nA8 z=Y>{5?}A45R9fLzF4!kSrCCoO@*ofMJ4sYv;t^T_7eFQTN`JzM1@)5E)N*B0^nvr4 z!BpX8WK`eqYM)tk1@csX^_ziHi4XvokO(peU@ITze(zcfKT{+B_Zi>T&?WQMmH6wW zTfF64NOxi4^?BbG`4%Pz5g`Zm*<OCHbhQ5k_?69o92xqeZ}_&g_|$d!<fUEQ<z3)a z`QtVDlmGe!_5zqN`$=b8pD!t+|6DnhUcO&nKY#nfPyE%T`Nfa?$*=s&&-?@?CCA_V z(J%eePyN-uUlBH8*022mM)-iz{V-MW-~avFe_`Wa6y{G~R7Osu=VCDCWA1-6N8!u^ z1P${~{(ge~{gwX;uluh75GDkg2vE@AL4*kvA{;2NU_*xn8!k);aUeyE6fZKIn9-v` zh#y5}v^a8MNRJy$YE((GB}j_|S7LnW5~T?o)<i`N5HmoEO7DPl43JY4L!&%>(iC{2 z%Dy^12Rel+)kF|j)O5VyiSR?Je_{W_;`{P~Vuv!v?qRbeb17Q2Y$cYIidCywj3fvJ z@Fz|c5VL3ltZgfECd;lTl}5bjvt!JOk1sAoY`8LH%ZGbf&8)d1O3nuf5@ib7Gsnzy zPk$!8y0qz)s!O|`o4B&g)~;(_o{Uo`=8HguqBJVn_fFuQjSKY9X&eyF&7TX5L8zL) zZ8~flEa60r7ByXheM>^|#1ePB;)LQ?=mg{d=hLrme}ePI>esU?=N?9%CoKqR$Cdcd zQ;)quXhV&^<wo16v64b!3_^z{lntis8U#*3t2k_M!OnJL?I8~zN-Q@8Q7jQe22&Cd zLk?ABt;G&EEAd5zT(E_lzW)Du;VZGi8izy^2?ENV>$tgOC?JCzM~5cG8nS~snvusI zw(KiN13KJ^MYMu&fW{TK1QL@>6Hdqi8$(jr#v?6F&;SpzYBMZ^QPxS~1Q&8~Mu+!m z3jj|&`ScS|($r+rO&t#6(o2I@2q3!vSQv#G6G8|;&j9-T^F|y)6E#8$Hx%_g%!qt# zB+2NaY&JXLORmh9WD6Bl$C4{@)>L=x?Lrm}dlkdTD5LPy86V7b*<xK~R#{+UZMId| zG?dXG71mH=3`N{2B~2r)07n)oq-X*!JAp!Hk~jk3CzANW9k<+bPmq^fb6)_89zDp= zBpy;^Vj&gm&@Jc$GxGnbqpO4$mPv;dMxpd06Mpa}7VUg3$cA8kS)!an5SgdE208W^ zWRc4=%>;-gZq%TG3oa-HMCkd#gc`;?!Q_ua9vRdOt^KuGUx_|d!fJ726<S_{eywR) zb4%JqQY(ZS>86XGRWWCym3Hg<wB8LqT(36!?5WEx+d;3_X0?S}j5&d;q*{VVI3ZrJ z0hwN2u&?g;-m6<6pw<CG2M<PJhvXBA_@s@@BHqs}$+eT|1w1DviRO8pDAk}dv$%&8 zJm}#<!_Y@B{q&_wz}#iS8h_j^tjeLK8Df&aX-v^cHyvmi-TqbWUWo#GX{R+5d)nlQ z-3)8!qrFzK8h8IC-qa#lTz=Z8X>ERO?z?UqRqL@{PI#!nSJ7(AvTl)mlVp%2n|87x z#~H4UGkzlBh7!Tg(F{&1gEN6}wsL|n<RcASIl+5ck`q$A0A0R`AXgqzIg0rJ8nwuu zi4dYeS7aaxCs<vq0sul0lJIw0D@f%U(!j_dp&7hj#4*s}o}9R%10!6W1_O`*+Ds2^ zt$US9ju)!wnJ_d%8z0w%#k{C7D2a$Mq1j*rqERi2YV2zpwTu=v7UITx5E5GYtSH3A zlxm8C5{U{Z!4FSZp$odepP7CG#h(NPIv{`r{=#&}h7hoSX-Z&J$ak;=F3>WG>|hIB zCXzymXlMV(_=P|;fCzZ(300H)#g;Is$wLOfg<}-RSB$Y08H{2aLfBg;18~Vq0&k1F zx*ieJ*ehhs2zlO9-}grJAzH5QR#dc8FOya)GS>2a6uK7E!UvjRC5x2MDr5ARxHUAk z?{mXs<46AI41w^mjwS#h^9<6z0Ep8p<Q&t4$~llhs-P1;OOxXuCy}pct|0le9OWMA z5j;&NXaUWery5nfy;oEeUl{G#3Fsy^xyen=IR~N1P0l$;&LBxL+JT&N&PhN-l1LD3 zq98#K5Ku(2fS`a05#{o~Gk0dznx}cVQ%|*4J)BduPSvWjzy1C8>z7OkHR2Kn!^bUo zW<RweevxA+ZWbZ7V3Ue_bWuKGzD1MX15LbWD7R2F<j*czqF}$%Ik`W5`<{`_%iVqY zr@979Ji@WB=<2`q@%4&S2?XkkINR`ak3Ecr7pr+*?=T7yThLq9vF8&;SSvZr`Vuv% zLZfct%e`~eTcuU)J{)oHM}WFQWwS3`v{`u;vTUIlF7FBHsCzdU0)=2?<m_i{)6E3Q zU0+f&WJ}1;w@(?TKB0b4qh}7@(Sa9U-pZ`}Y;(=LdYAkyE^FK%Y<??6u)vl1LYYc| z;d2$Pk6Zg`8W*FeC3isRLg2#~p~Z}7ga@Bh$uNG|=<fS>ANj=Njn{J+mu=q{R)wbw z90i8B4lJe31L#&db>*!)=Wb*-#J}KVsdM7ej-S-xYafClUl=%liFt}VT>YZ>k1Jm{ z{*aTm1gzS3YDGK0@;q~FSO(XVnJtt=vYFy?e!Zztk~H><i==28MW>SU@1H#3Om>nC z2Owo{++i?*8rs8W9P$lAqMjyjT?G?4R49cM?+x;$xF5Z5-D7AHcmC3CU*X71QQY_F zFEe6%(ouS2wQO;w)2tq`?Zc;qV}`NbY!Y_)@GaPAI(^qC32;^OQ5U{RDZLYExPXQD z7>%R%F@wf_LR=}oMFe!9J)=w_)(R)>91;*P2B&*Hj(2&L)A1$4F}JNVM)(zPXOG^e zRb*};?YpprwCFOj-{$i%KhLtY#}0ys-%Xk{&^P##=IhYfFCEb7QJt2-EjYB79(vt< z7=Lv1E-mIwhx3napLl=Aj{~Xw`*$D5$6qs>$2LHCRVF)ZF8n?C-^aX4`q5T;a`^g| z!@I=@nJ16p0|UGr-Vgoz-rKStXs1uKzVlYLe>OfS{DH%V&t8#(AN~eKy>!_4))YB( z5`QP|lf%dTFLF<7Uy&FeJ8VAt@{8bY9*pN#SrBs$OsUB9(DI)_a@&p`T5E=gwVmCc z5NPYE$~+BtsHZ=ltI&4MSQM2~*FnV*KK0RPF-4wrSJ|p+<i${M5;p`)heo|-gag?! zHh~lv^*D)54DR^Zr(1V0@%k7nOoafXIp~|A(!?n{^0UqOj9RDF(XPNvc|_-lUPiKp z)#!D{iaf|HJLOCgAa{MmZ3-f4mB5l+`@o3wZ8bne^O&%=f4@YFqhV?Dk)){2*&7o% zJ%dXQ?J<%R4Hy&)5w`4gaEOsk{%LyWOGx?q-A$+(@PEm#ME}XJs2{YfLr8h_t^X;% zUQqn_Pkwd2efPt62ct8WMCQrU)UGSD<p<P%bT_>sHY5i5_>80;Eo)`-16ogS)nI^> zgukQ}H4sHK<`)cwWr5T{)_<v9oQwiUZBano8p06;7kJPF$*J0Wh0{;_UGYthY3kYL zv<eg1knO1AYdG{B9+(VQA_>OG<ldr1-NKeg)B4<kVSs1dfQIe{u~cC$2jv67aym?c z&>#VjLc{4xcg@C`3^*ktxTxqLi0_<|#OAOtTqW}_K&g-kz8%RPNRn=cG=wSSXn<H# z11OG2iV#S)Gi73G9%h*trbU7xp(QdcpnC`4%n}WjG4=joa*F0W;i)_vU{t7}yc&b= z+e|n!$Jz7^hnEl?xM=VvXyhr5@Ps2&$JBX`3qN=F$+Y2`q=8HqgR}_ji?B+B#26rI ztjS$Pn-wb*j3K|Fn;yexE(U?Y7?f{X!>MRPYbQH*`9gXpi#w-#XD9V;rmuM&tu!C9 zyRlY7TQmRBDh-GCJMEje)h5&}5;|z@AO^OIBJCkC)(t@?IhOKC=iJ&IJ&L*%v5HZQ z*Ca|Mv9-ljlSP4tMR#Br=BOmMd9bW4Ue2c`P=+z%KXzzxZytneOgsgJRCt4vL?rMF zK>u$J>SkJq$jdN8UB-DLQEBY{{LM2-#mVS~F9~<FLhhY0VgyrCRM2PA;O%t0A)thq z3v{P1Nh=tv=#y}D^zuIWB(_HvFs1t%s~5NQl0qGE9LuEDfB{EQK@>oyS5q()fQ|41 z?4nZDlU)tbu1|OY2I&7e0B{9kK$BQl2lU_jgnMOz?K8~w;c}a;k`Ce3M;3fuxK0}3 z)&`t5jmWqq%z%^DAb}-?m=#)^k0Bld)JbDmYzH70{fwqM*TfLR1RSex0iRz+1|bz| z=tJV=13AEOf=E*xB~mIv5_LMMrXW1TYvmSifYbtmj|Zq|G?LqQQk@PGWezc!=dIHP z0$3DQjgTzk!tZGN3?GG^UZNag?io?67_(yyVa=ZrNnwH#djm4|Z7UwTBp<&g#g<^5 zE)t2|W^)B+<&e2D!{Ehr{e7k}JQT}|ctwlB@Dj9Wqx4B9v0oM`&v;C}g##cRSfL!i z&u19+zE=Q@8p+ISE=BBAcza`>r0lk2#b<3B2mxfJ4LcN62bTA(%bbK591Kuww{rDY z2!?dCthAaMJtPqMq)^*pC{%RFkOKhJ(EHJ$>jpBj0UkqyzNFK3=eh!xr6Vg?fJ|8< z3!B4n*;)ON+1O@P>Th(e<xW~={mT|8pe^Nw&<P<(0NFRG?>C#@CnR4)8KodW&&+8P zbKfK?07V;{!bsD=Zai?M6xvB3$UjYs`Q`Ji48bRFgc@gQectd_4l5@T@h6(|RzfRg zRPh)r*cLQsfH4rk(3oPrXySy>fI4!_Z{;O}f+a`}0J;i9Oq$T90ILG%t}9a7*7a*f z#tj!sZhMqZzwe<|;qv>f{}yM!hm$Pl5)#H~|BIT2QgqEK%K#||T&@#WoLCZo(!2a2 zK=U+j_d<1dg?EDK1HEbUwiMzR;5D-;dYTg{kK<OX<L-_!+VN3MbXhdtB<<Q!m?>eQ zI{=xUCIwH<;gF0%B`X4OPy`n|Wm1X>P4p<IPA0GrkKlorBRI98p?573eH*1{p>l;b zG4wcM`<00Jm5V4~>Rp@B1gg`7X8;TUssPYAnWDHDBp1M3@T7o{mQYj7xdFc>Pf8<X zUbk`$f>uF*Oy>fYdAR3|cLa%4IJ#L4ob}tO*t#eiml>6Le4LuP8Wtdx+7DjIu>Mhl z(?4aqxY6@5FqE06O3K5=fva;=ONqeQuoW;dl~!Rm@}fPGCgqM0G~~@q!c|JIXU@)5 zK4X;Xm0u6G8R((Vc#WGUO%1J)tV|P`BvCd^Mt9WY3#?aFGTo8_Mqe@o%ccx^W*NK8 zS=zE*DH#uEcBP-bx4=PPPyoI{mP97?vgQGoctC>+pj!dU4$xlwKy#^y$s*Fn!Cw=j z01yRCwv`Ff!K_)~bORAL#Hq)!z_dDE#w(`fWn$k%RF6ojOj);;1rx!iocFefB!dMd zrKb#4BLcArpnn8tUj-5}Zjqt}=<Y70W3V4S53S%QUMbD^DLLqF;qNcuFpvi_dcxgl ztu3uWN_h^TQnH>`M32mc(*%IhXsTN-_!oZ{n-uWd-)`SIAo_#C#|peuSj8_sn{nGh z+((dn7&f|24R)k$gY<?9_i4DuCT?bv>zSuyb0bOewWf5Vur#MGa0XY@@a9+Oq_Y5& z>#fVOVPU2$6xs&_9}I%w&@(MHs060?#8#kaTSpLZA&p^C0HI|+l+T(#qG|#32HzD~ z3f)@vj(AIzxb+5?$(`ISR0eBut(-jPw_rv2Z!#)l0o7n7HzEhR)pvFEx6%cMD*bPF z5UGpXX{)@w9ncSU-K4%1j{GhqPF60)+S86hTkNcQd<8wH!+?eRNdl3Hb?K?JD4=}X zo6yyc)$cfi=OjU^5G-<Qqvmme0|&zdeT|Fw{b2FDhwC@3Ky9O*#wFz!IinG$$>Fw1 z*Q2f@4s(07^BCKo$#xsMwj1q$gZ*+tC-qy1pDHGh`G;Va*Sg~vX=e*kfc}cCQ~KUu zS>^Wicau4R4RWV(PEsNHf8I8{(;i(tM6(|)oqBo-mU}BEC{Oh3t*pipHk`;TWW(5= zVWhaf)ey%}{aJnA&D{hJ&rP2=!1qg$$K}fX>6RWvy@-~k9wv}F@E4aK7CA6e9dT?v zO!3euR!pZ-EI({b?@q4q&G6aA9RLsl7zA4;B?fTwl@=Dp*6pN#P#C%>bglp;odJcX z`i4{|!_i&SqSH=23)9D{J<G3Jx}H0)ypy)BEbAhdt@!z(P@S5Z>~j#8#l7;+*SDpY z1Gx#MP`U81K{*K==jmaw9U+T7b+Y`~zt8@2nkY|jfTKUfuyx;=cJJ)--WfUAh^oA7 zE(s^6;zL>(e3IymaesJuz$@e4xd_>rh`?7(f!5t8E5uLxCCTdcpG<r?S*HxbX)14t z1?{K??HUK|IS1_r1%0{~bdVMFiI4F5`9@Fvmrq$%E}l<qJpGS@6r$^c*59@e-MA)y zz8EF+C0qb~f|CS=zs@NDc{>s#I!JsK62>XH-XNNG$jNF^(4P@^=-FXEh);js`&#DJ znoUs1*GK_<RS6pi*tvx7Dt$dvzEkSgd-hL->P)4vMYfS;w}xe)F8$UoijeE3*z5=C z11;|l>#TCVVba7u1IL%i+uJ+1bCU0rs9$)cB#_@UO5(MUT7Ngb?oWB~&*O~Yqy=+l zY>{UfeP<pKq3l$R8|TmvBA7>RXzMt)6P|BSu*dgV&^)+`VkMNEafqJ!&UO;*4X}IJ z{U#UlmPg~Q<-wu#^jkEIw_6=DUuT^uT}W|BB%?acCV#fxRNdmgf1}+x0w&){26y&o zt3Ni_*Sa0PuN=-{9sb>zkUbgdX8s(+lPB|$OXNJrcI}HWW7w&e?^@8eL~a>5n;-95 z4R9C~OeO?pszbhnq7(sAv1XE3u((xwR3pBtBA^~$3)l{Gg-lY|;_|Nl{Y#F-%-OW& zu~^dNDerj^)Ppt?7THoB3#4?MCMzlJ$&ZoA(v9lMV;RGLG74x457QV#QAMkb#;Eb@ zzfAXi{F5^8t73tdvPT4>V3-3)#=n5Qmux%|GWrBF>VJp$4ivx(tVU~Tpfb{YB8R=? zqnODxh1a7F=d*ZZp>g7e*bVo@pw6=1!u?^%w0rK>75;_4oTr;4ZA7eg_SjY4{=R*y zvz)`zwP%_{LdW9@H5@?dN}u8_i}ktM$w?w#lTB7#1qvf@+@>{*r#eArMK}qND7yQu zO7VYedD~DVv><-1)$|~Fym8AR7);9U)WQ+_<J)9!*VeDq$?H^0@^+G!Dg%@EVI@yq zPO@y|#b;-Csm1aY!}8X*3U;*u4=>GA7(<2`yX0egsOXsIVsqCSHEpS$K6TL;&@F`& zPk)*KT*N+R)D10|3@68Q-Ul8c(!#Wh?=fAK-JVC_trGdZg4viq-u9`zRh6n^z$9v4 za{r((+2`@v-~H@=TTfvQ^4P(d>7nE4M(|9-?U=5;oiuAcR*7UKD84`$^hX0aG){(w zVrrokT$QBYR~*kIv7<5AL85~9#Xc7#tQe>ScZoDoTqWGCcvp+Ur#-wx!F5Cnlg1!! zT(Qbk+{q{?^axxxIx3LJp-GHvkszef<!l^AxpsQ;UYCgTb)m<<=wV9erTuoJw)t+l z`Y}3J7hkpsI1*YuMHmm}#!MPSJQ;NcVGj>P8mn-29+*91l#d{vKjkzia?dpOV5(c} zYxD86XSI`pX?LsT+G`0Zh|Raz3o?IEUKQ7wVB}EaW0gPM8ct=D*D>rr-5XEi*DPxL zE$;fJN>tOhvS0jguHNJY@d@+KgUKqJ`U%H1DVOC`NfCgO8y13~<+1evj6zOH=M*g= zl;0<CQ2FsU3~_6}ju&OyhB^xk*YcwEoF{V%9y!T{&Yd<@p{+ZTiY57lGGU;%vFw}r zH~%31*|WL}Fhz`}zOCzSeiEgs!cw{4;iHx7jo9Bq!63Y^fM-q;#VgBdBW!9^HB8o) zh{2Su>(ho2A05;(Rf?@-6Gw5Ai4E=dkgai0C(uwyry~l?GUz&eY7PB|y%Ba;PMJAN z(Stl|ZOQnOB*Uz`Uhe`EL-u*SS`(+(N^5{cPNn6E#7%YsQxRT)uAxm$rDu{&`z5{O zP5hBTX%Q?z`G-@y)k}8r)G#Wo8t`3&f&}$l3CJlZGX+QF80mZN)m+k1xrq~xOIRG2 z4NqtQ@m@u_X)_Ky`&1qm3|!8O7kBIX7<;QP%o4x_aVIZF(A!eu8rN-Krc&}wRJOJa zkUrFv1yWPv@9ti>vWfJ|xLNnUlesptdhrag(*5Z9<wl#QC#2m3$XXtd_2<d*v7va) zJdwag!eUZxk8yZVPiMR5`+Np%MP6N_uJA|MZj^oRy{pe!K9rR&M|gWZ3>^40f!A60 ztq7cB`c%H=JL5f`m=*BY_kAtjr!fI4=7Zv@8>E+xvI=sTY{IC9HEcL@qWd*pfs1;B zEB#sO3);wxZ&Mwqn+8&I9dLcA_XkJ~u{p~I;n7U>1AT8cB<Quq#c~73eetE!3`x4^ zK;GhUQmuI{s9;aq8l%JR6KUGi%6ihuk`-4#a=A?|u`j<m(>p%{j}a23N|J(2*B7_U z)^JA8O|^|qC<?cE!ZPY4UE-^*7xsZEj~Kc=UOQ8hrj+~w6<XVmMeT~newcX0Il6y7 zofMtwJuUcYsw-i1TSw)=wB~ikkR&*$$^EW|=)p_zFp~$jF-ecvCUC?9AF3sS=N*aU zPfVSX5T+eHb0;H!3J9ai{I_()-|j4Xc_qKlO%D(mT<qmh>J01Mefmr8G`8rKRZti% zGvPnkZOoJ_FEOgd4Zql>xAkwH%6be7-$hRcx`pFtN;ugCX0%k$oVia_zDf$+pc5DA zG1&*;#5^Be5kr6$Crt>S>p`-h7NUqM>6DsY5v16j3zbg^PNuG?>EXhuQ|O;5nf5@* zJrN|#?<9zTQMykKeq6VtRAA}-<~7)#Eu?qEh2Z(;-KZLQmAhScas87n+GGC_3`Zye zP)UV2L^3BsCl`RuWwyfm*<v%*T|o<H-b#7tb9$ltQ1i9lKMRJ`rY7>`yDiS=e(6|^ zm=~PYegxCxV2%!4%yc!?=ZiGihAWWw>6$+-@YMm8`s!0Y)Kds8dkDt_4?|R=CfL9z zu&L!J$IpWaAtBq`&;O^imk`Xx<bz{96Yy@ou*gNAM_7KLCrHn5rQFfGl*@f2@(Lli zw9V6kw_{Cm{fdvmQ@*jbHow({GXoNh$GK#niAu$04YV~Dm3uQeG|mf@_Zvp*l={46 zK^?O}*Gaq;J0hQ+N(~r?HKD4nzJG$gKQNZ81P}$oAE><wA*+frXxx?YhC^e_OABV@ z_@Ul_q)QyN<rv4Wd18JHz$)PqT$iHgC1um3zY|aDw(y=u@b=-<7p=fTCgF!aN}^S| zLIveT3_f4H;!%YS(|GQ>vulg|m}OsUl6L$3Nv+(n|B2i;<E5QBHQAjN<*mKW@?5>7 zB&k)YRBaNuC}OeW)DlZE9g)1s%+g*+0cGjW<fWM0JM8aQUYQr^BxVNqiMq9PTrElz zwchkj8Z<xo*DG0gIUVdTZGU1#`m}5cZRn@eyDoIcFJgS{m;G<+t|0T8$<Ic?2C0(A zxRq;+H|b+Hqaw+2>c~OH*o|oV#in2T^UqRv#p6HwfBds;^Nd*;$nw30STO;|ft~!y zG8(It&RRksb(X-Nly9EKh`iu(2*3*mY>~O!j=Z0CO;SGIqQcvH{V~FFJmaK_mDqvL z58VOE|K21?R+y0bNs+O|><TKrGoiF0nLVZKbn;VSQiEM8g2dnTh(>Wre?lVf^Yjp} zrsAtxRgViE2J8vDD^A;QNEHtr?}_6TXWZDOOQ!?&rRx=E$%D=lvFk2!(`h5RMcud$ z&%Bf#D!z`{kgkpn_#{6XJ&a<XRQorq^XfkW1>7KBw}V&=#kY{|d{*80*#~_;GQapH z|F=T1LP~>0sV?$ePy8LnS9=l6ucb!A9Ic!V4`QsAmw%jPx3qQIc(2U%wIdwV4AmSq zy3DwvFrl`fmIG73D$IwVX7GOqkgE9L8j6gR*i%Zs=ZaY3ikd{@4#}r{QNz@`XB7CQ zUoO3(zxuc8Plz5m6nUk|C+yt>)4gtZ|B>?P#DP(uN%dv-z(gePom*WfaK+<UgT9~8 zFUy^82Huf+OOH+uo+3!PL4<w)311f;a`6@Nk`i!N;a|mX>g4<Xz+c<teZjXSaO@`Y z>W?jU#A2V<KnwwX1DWR~6<^~D$g?6F|FVUozrQq=|N8W`fl+hPiv5-`N7Qv}ewFWK z`=OC-q{7Rn6OU9Al@-Sq13y$mT8Kovxke)};EWGH0Y0tf;+Ih&&doj5!B(Z!JqX~R zAnB0`B-z&zpp2aQH_G)|CjN;e-hVCFG4bbTOov6OD7JQuh$R+e<+!Dz3t8xeCM#L| z@E&R4Wyk^H{OjeG@mDN`ae}~E*{2EKR@o+mKwZPnzN9YwJD2xsHXv0bLkA0@U>$PJ zZ$Bj_U~%^^3+9Qq?#2%9(BGk&u&|fopS;><dUv_PZG||2lZa-SWm!Q0XK!ErGZDz9 zr>!B7jr!;+dQmHWVr2dSOu4@Ld_4%0X5AEF6`<by_}ALWD7$)$-1hIa1L5SuMj)xv zZ>QN#R-ce!P#Kkdp%YOZGk_gATa!0g>!d^eo`_ZV-?I;Y6Nu`bq1Q_ZJVVta_i8>a z5bIrO5MKdh4aaro@$5NRzNH+$ADdKfO?76_THzR4Ltr0JeXjyQ9fhZNHRCpgz}m3P z8Cb49a90I}+7YNQ38F`<(>7GoNVx_TE|4$7jpp&3W9kCmHF?NQU45VreTEU_Ak%10 zM4Bt@dIG7VD?<<`>XxSD#R_u|*7n#Hk+o%kPK6z3!7q{UJdnG3E!`_1ebW}x@;uph zjFKUa<2#=J0;t+BOi97X%RE8NMS*Ar3pJ~=0l@|$ZXCqdC|Dnt$g6GE0jr89_9T2R z5_2`-Fh}PfT&uo$#IH8N8ZH8}_Fx8tuVVd6q`RHn8%Np2h8&mIhNQ&MSqg#jt7aq_ zD0|T*k2oTaWE-QnG)yJ}RP{)-JV?~TB%qrix7Qs9U7*GXV>6{t^BQduHa+tm3TK%_ z^;09urFxj<xK$LfO;lo<3&{pxcjSs%3q7U<nt{!Xb8jT7Y}DV`9Wy>446^Q82xw82 zXmT|37?f!ucVDV(*Z(mZBR?Ktt3;7psed6r2_+b#pCE$+9+Q#O<+XC6I@ov$q9n?u z`;@KK>CMN+;zd^oSPAKA+i3U0$t8q&>;nr0&2@eBmW_}$uQdJ6j7&Z$rEUnTZm3A| zA4@<ufo-9}2@*H$>gi(Z+gR;^)sRS#6@e#t!2CR?j5_KhKagtIpv9ZfIy|ZAZDcMp zPy-~ISB^Z(G(9WMC^Cg82MWtAAX~V_H>>~=XV)7+xfN!>ixRM<B7C#6TAmwdX85pv zs|WIwU_iQ`gz$1J15jbA)SwU4O12$3rtc7c3TF63?zK0h?nE54YGM6B0;De$VVJDV z5A}LbX<3mpRahOKI^>A}Re8QGwfE|%sgp>n7a??(V&pEDVJ`aC&6|qEj`mNIypdzU zq@NN^r#;=K@B0~;U+`g*$TYdY{mAP?f~l#8-}sy1>HBnVp3IQl-`w*g*M5F%@Zu_6 zz!8FvFhg-_XP~Ne#SD8L$=ou@M#s{h$e<1O3Htkdh77xy{dyP@jW8e1(!s(N4zzX; zvd){c?`;x~Fu(a=#V=X&yXN&Ur)Ol0x02iIe1<*#(hpK@H2Ky$OYw$xg?#PbG{O+G zuMJV+vyCnphoVA8gAgiN1}a~{dN=z~-s1zh&0!T4?Dj=g6&L0062eY1g?WPUo@16q zL(!&b!fF&{H)f(Hi&EWEOT)T(z_7+%g68wm+~YWkt#IREsLp4@v6J1oFG~fmi>y0z zN6`|A8zlgZW+Q`tS{ZMejV`XUB-M>|$RV=xj#{kN=HuG!BYgFenTqV2V@#e+POLLM zGfptaA1X8XPQKNS#g{z(h4zdo@t+i(H;aNQdxZR_L|o!Jvi}gWuTmWUYU!5fX#Hz& zyr!ciXRep5BGByOyG$X}-!(Z|7r1#Bo@?aYyw$Xdxg^*eXeEH&b({McfFmS#0BTNr zNS%qwg$8mlFF;rh(VuK5U}Foc%L{DL3&=xt&K49Pzzm<}Gq_7lGV2fEdBb%#;RWA9 zFXu76Spa!UEyWWLoypdjBPW7f?nn`Uc^%I=G0YyPJ*go=LJ_!dG`zrfLe``K=(G-t z`4Co=?JO!xJRzJHas9BsuSK$|Y$dctVxUl3j&@~sIl_-I%oHU`<RJE&>Z(-mZUCbJ zlvZ-hVq@IAkYRJD4Pr1hD=uTHAzI+)O0UH`p=GtC-M^$0SgngKK<8Sj-?cDJ&9~?r z+Zib^{IO_iC?uYgXq;*RxLBg?A+u1lGV@$CBLXyos!Riypa=PC5P+4P6)(@1tzPTh zdzR=_EyI(=Pchs2=WRhp?OVp$Iub!Dwsg;<uo5|7wLp#AB3AoBmREY>KiavZ4l8q& zyx(opue6u_x_A_Sxn0!tC_W-krs&REkg%}p&L5qMw>W?2cNJP!WA1E>?yfIQ5!SJZ z{MIzVZHoSWHP>&oc{+kQlRQp}e5TkQe|al!mE$W}7HCHbVWa`LpTz1}-xg#f;x+-^ z9t%A4BavGHX%+<-of7k}R7jMOK28F26catRC3~$koyso+TY>%wCQ|Z`%<Lda`>;CB zL`55HPWjp<?_}jiFtx!1;KA3<=POiCA5q_DV;B{edcJzUtdw%)F=}}=G4rf2(Z5<& zvIyHLT*y?gzsBrtlip~^$nlOb>@$Of4U<g?yUiL?eTZ8K6RX3c;tyvW(xnV6UDceS zT<IUEq|doELwO9&c`QPC9nN{(L;3vA`NBf^W6$}8?Kllek-DV<zif#!fNx@GImOR` z*<GWxH#Feu5h1lM!S}YpnmVum^&RzddiT!g=Z7yI6*f3YR6LhTr2dv>)M+cYx;LgN zXqiK;g@v)C$ozVoNmQlMHu{y$oWVz0p6tUDV>Wu>&?mM36Z|V6&3{(PLIP-67PsU5 zrcDUbZpOgY=9QAy9<R}eQ8;v_IyMlTx_~U*AGW)--}fX+uA1AL0nkY^Kp7|U{!*3! z$uQPx{s*EA+D}>XR5x*o(lTl~a%yglIX%q__Rx%xTT2@G%`yf%<K{+S8G3W-<Mdl- zFu!F2mEq{uzj(n=64;WMyrbA-*j+hlSy4tBni-j<5ZxG$d=p;aEZY+`p1azXKdj18 z){NJ(?xN~alJ+DQK*h;X%e87@cUw4mMAdgxgBq)H@m=-1I$7L?S|3<iMuSsySpU4x zzWc{PNb&;x8DB_`woSr|Tmr|bCQpUkL|}#EJ;zCPQtbj(l8OrGm+V2IyO(+9(eLcd zJGHcQX^R1DH`qs{iKO7?V!wijRji@(gAr+I!%g7F_K2`RWj0E~QC0F)?E|?xU@8HE ztPu%@>|jK#K~wfhQzhy^b^#|duVM11(T|X$GNvh=gTK{>lLBksy&V~G=U4CA_h98G zehmPw3%n}NsLc9kY?OS2|1Yvq?A_5{5ijJUK7VUHYSmVuyyXI9iyp1R-bq}*h}B%< z1>1le!5dIpEImeDEf~ar#=`qh5(0RJ9CeH~j`K{DL&5~h5rqq57bWZU_c!#XMK2b1 zkT;CTRj;izR>Inx8Xz*-2Qz_0fDgl%4?|9XT_^4rd3Px$U<y5+sdChPcwC1TeR$u| zu<ov(vr;hoXEyxjVP|dD+vmQt->g0!FIPFY>J-ecf4|#rwX#wDs;bmv9A!C%jfe)! zSGhI-SY_~XKWGE=Co60eFMdarEjnw7>KuCFPlz$-g7?~2cuZlrN#q4F8Wdqd??Qrt z`rwq|;2QB1l?;3~C;;Iz0EZBCt~8aez#(^TbE_n(k<XD?PQxw$Qs1vf`DBVBW-wx7 zwUi=Qm9{arrOQX3F59V+n)3&=93YJjF<MrAm{L@Ki_v3UQ2XZ?8U^JZ;jy0Um|Yc* z|0u}{ThTA@@B@soet3~E$G4N}tA&qtB!DkZ#J&z$eDS6I%IgBSQopq-tmQaH{fsBT zTA{xJWd+boI=;&htWR}}$0IC;J}MV(aRhztFMPS_a$s5cezY>ZAGTz)LH7<T_v~Lk z5p^@3^<F2m>4UNw2FCExgNnkX;nTb=gj~P!PnNh#&m2taJ1s(9b{(P-5JrL+elF|E z=~Oqne|NmS)}C&glaC8#sX+y@Wla<Nkpo$A%<(&~As*&*zkU68Q96P~%(bsGbJ06~ zZhT%;;7wz1-ogX3#lfxBNZrFm{Py^0gs}Q=&R=2DV8#o~htFV99!<%(;k|?n33Oq{ z@pqX?uqnTe@j6%xNwlM^`X&I&|4cRnJWd>rQ@he|^8v75;VG+hD04=Y3e*)5II)01 z?-bR;a@C{v4<inw_NKv|9QU>#06#$pLQo)cv(mGSdxzEkdLOHv4*olRdhaN9Vyniv zzlLB?LTj_BDKkDRbz#GLVF1{56N%9ztkm+ayRyq=ux)c5#UzDLWhJlz)#x;We*7`A zyjY*{PX?zAbH{~@lKu<Q7L}`ex8vyw(1J;SiRyR7&s?vPQB_U=B^NYoMktM&!edBw z6JWIb8IC~y^t1v#AevZVfy-tjPuQ+E{5Or4VX3sihAlv|K9!n^XEgy^3!GztrSRFp zw}_I6fHK4#sY@QYCV@VA0rqboiw|wXf}BdfK`8wjjh`t<CbJh)-al=W+yXPV)ACuM z25j@Rg(6JC52DmVbtJq|bP@lTe#=u@_ePnMF97+OepB0KR?I|%bp_$6F_|amKq(Ou zy61e~B;)5Fg{~YxD;N^dwBs@MqOAKZgJIN`>*Qz5Oz$&gev3Q~^Ks!sP_CL^pGisX zN(T=)!lhk#X>vUpBXs_*N`ac&qSx*^p}g!uGVnIrL*|b!P5$9hRAS=ZKd7m%CVOPq z3}m`Tx@OqTy}QPj5yi)JL$s9InS~HBg~K&q(dATXe=oQWpM8Jpev;;UHI>8~(Wfvx zLd=oTp-t}UI6qF#-(Z^Hh>70Pp*yAlB??!S1`)g+CGRvk#jN=}ibjusE9IDl4<Q0A z=9I$~!M5c6yS6e9a{58RoF%uNQ--teajp5l!Y<(*57~d}xxW&1>R)(RI3uktVm8o4 zp)d-6KmYX5c~Y_#ju86t@GaLj|N4x}b@JZVtpjw6h7aGMTiSJOQ6L0g4gptVXxfUi zRNM@2Da&#*GBmQ&4|?0)w@o2-Z6l*Z#_>D_pj$xOHL0tbCv(H306>qmliQ6afvn~z za&8W#Fwdzcj3~@_Da)tn7UH~rATu)qPMQ<5!2VmJ9|8wwk5(h|W+NQ(q5#Ql`R2^U z=019Bh3{l^geemoD}MJr-81ihK*!c~@t`)7o!#59DIsxHnU=u)P)gRW6)~nL!Eh>) z;meDw=&?TEq`H5aYyOaS<ifk$Ys=7--On_I>oIibL|?r!+IZaC{*JcdqXdI(dA!i% zunr=6uCrmJBJzu3PR(OJCI5%XVgvHClULf(9M@-`IAV*Ux5dZ9$J0ncuS#Qs;tWYa zMNuVo2@>B<-<ID|={|Zza?MRd(m5-k$Ccl3e{O4RpZDTWQ<~LKYw(K<=?e=&iA-6z z&3#~duifLSaT{(evh)kbN85>(2L4w)g$<POeuKB`cRyOzKj7op!a~D4U|^D%7qIRb z<0wD<#)$h<J_(QOg6kb4$KBP~R56LnOy;GOV*|TvPo<=N6MGAMQ>`K-1K#hwbx?3U zZ|j?Pu8DNI8f+w63pwL&A^B2L3B|dRAO0YYuYWj70ByGSYl#C`l-21ayoy8|z4aLe zk>jBwtVu&P?zsRa17iR#u^%MNt5UmQnv@O59RnAf>MA@ZaHj_fvtQRa8;7DOrw(d} zhC56`1NJmI0cI)Z*MHJ<>?esDpNx?#q77jByCdwxn<?rUCR8g}gy>srx-*>{n@?jY zE3iJC`D{U@1D?paniGG=9foc;eJKDPRuMP=2|S~wY%S2vj{9DJMW8`|&4mEE5;-N4 z4H<$Lwd~kct8#%)g8VME<oiBjbYnGOO}V59vELQP19^l@)AS7ZG4RN+M(Oev4=)2P zM?()t>G2Yg^6SMtu@}oN6~`EUariRCa8E@6XaTw}h$Ui0@wPbXMZzuJKB2uPUo_Xy zoT71K=dL7oQ##~(7n@2-!Vq`XbhwB0G*~~#t45BC7l>l#RPs)7VIRb$ctRKlH?XCV zZz-vF5@xS2tj+P>2=2RoG;H+(z?$lkr`7NRB+*x?;rl+)0EyFd?I*sVOnp=J1~LqZ zRBqOfwg!@2+mCVP`XUTX$B857B)6V-jP+TOnefQAXvWny(Tb?EC+m6Zt%T86gYK#- z-8$6I*&o{wC^SRI;<|FEs|n3|B&b`4F5f#-tBGZAHdn3IPZfvSn_bLq4OGH)4tn{C z0dcu8T-XfYtEPF`OcoqO^(cqhK3*?`KUf`bF9ZkA*k*~(UoRgRsi&P3q(GAroc}Pt zwzm`K#|ow@QTtXTu=?Hp*5>_LhHFlJZ`a;Ik4?mK#9&2-mY5Y~MI_aYx2Xhx=_EE< z7_K`?t1(9)1e8zjd^<bPgRd-lV2x5f52ST4N()3L^vSs4T`t^NJ&DY2aDt?YDkCDg z$d|G-TS+$%6y({BB~~hTw7>6B<-O=nl&<HCv2?r0gHZmf?@w7=@7g#DLJ9Xcz9rvl zD~9h%YywSkHh%OL(`5}9XbshM?&o-_Q2aK~|C^iTHO4Q^`ZGAL<Xd(W51#e9hPXZ$ zlX1VNk%yOn5BVnK&Wzt9?Mbm$X)w#+FSuas$srak+0t^I!Yf4iouz+p!%@x*bDW`a zZ<$^wGCpnWF)fl(Y<8R$mRAHQZiHk%V8-x{u0o{e6L<2=GVh0<P5tY5S&&@-ycU(` zes%YGSd~%ND9pHBSk<1y!EW2yzIKa!d|s3FC$f?Df7J&<N_BN(-V{2EZRKDoE!waY z-G~v#d!&3iMS{{Q2(t3ag%p78FsZrAYxmh){mhG+#cIkQ&9x662On$=Qpn+B);@2r z`2na%vhZAV0Y$v)D@bT6Q{>PeXnO7L%CHV4^-^c*%01=C{&;{{RvmbgcM&3h<g*AE zDW|<k01X&<>B*o-BF8lPi}UuIA_c&DQFxwi+Xp)O63J0B?Kio7SiVVWD$kA|kpE~E zO3%oV2S}pG=80Q<!>L^zVZ47EzZy78fHJ4;SSkP@*v87Ee?`|GTNE74aVzu~#MK{m z0b}&4Oqg0`*!s>zg~U~}U0&)xa3qs_?yYuCURnXCIV0~ZwSk3T=Z;Js&iMr8l;LK; z?j(C7fp&GAk|Fo+4##<pZX7Np;>q=>5zBAQxi^z^kHRV+0Fgk>)-9@_Hjw-cczh+S z>lfgH8-V%sd2`4@>gnSl+l;6B)XpInp^lY;v0wju3~Y+N@1uFfcdBv#elf~8<HGo! zfVPg~DJ?=M%{#-16&1c%QQS~M!h~OnHl=~qKUe*_+OUG7T<gLi)jVnB$E#8nj4}7< zPkcV=a!A#ksxQ%sjLEB>Yxh(0>~648{fY)){t?(>Fki2K%}>av`k&`DJX2sv?H^q` zia$;N_@y549XkBs`ts7sae^qTE;(WbzjT8HS9*9o)5=SHni|Dp5;Z2GN(q|P1U(u7 z{eH~L^YG9439ra}dz6?kIULso%HosYR@i}r6NsyTj5YkO3KEe40w%9UI#uT+Q65CY z+#_%}pZx)uelibc-b>ZX5#1rbi6-{ndt|85^{RQKB1bsLi#Gxvc`j<5XYd5%0$W#S zkn({&Fcof{CuK1O#|PI+aD%Dm0pq){$8MmlU{ZN^5U(k?9|UTIg9C#p1IIxoC`h=w zDhe*llLOAhgJoSPFF0wgUQ=^WThPI2ICD*(@Ga0t??F~kR5wlu4NeWQ++sOCyqlY- zrHCD<hK_=W&L)@MdtPn5mLa%<-kW+|#6J>XR_oG1bDN9kiok{j68o4TqJ2LmnH5JY zAZ$8iuLvx=!|Wwn@Gc1^Z#VZZIlPW2#?S-iZZrF)1r}dwqPb1D&Kb+J8DD@|WN7^p zd$(PeI!G^JXU2^E(*kvBGwkq;ngY(@x(#{=q5ubTfX|;Cn<B|V5$R?o4GTzLE+hcJ z`5Qt+3IGB`-hn(pz?%~Q6aoN4Apct~000&s7=Y$x3`T$vl=a3UH;jkU3OP=8)Q%>@ zx%tSU|67Lr|9)%#&xu~c{(qY&;O2M_@&W;%*MP+T_w&)OKzG)Srz52O)+ambUuGjU z(^&Po8m96EELt6>x*Dg8CEQ<C=yf;EmMerEtxt77cwLRcld|dGh#mFld?BY-JuMcT zk|0PFv*eLwt8I6kLKywt+jhH<rkpZ5Jy}ob$T45{1!Acd7xi8!gH3~dFVSpWJOYJK z>;wJKuW*oWaKXo4=h2rSI&wxeIg`J4B6#=gHP)5*1njgQ0QBgb+oOtWK8+~piWi7< z$jq=+YbF;6y{;bePgWH>lQ))|;Q*rTw6MH{=DW|;iECnM`c83!vC0)d8=;MZDHbu^ zN9B<bN6Tlp>*UxEe~tm~FX|#w;ysGu)-|73m(^XI9iI?YIV-%V3tQ}TrNfAx^w0wM zDfJ4S)k(RQK5G1?_|9P{WJ&yn{0<RP7w~sXmzvaGMshKMp~ZAci6?NyF_;)DP^YPe z`Npa)rr%JfC(A&$lR@)p)hz`%g<Mu+C*|<~XekxAqlGihjUsqtfA6CB>TKupG%ASq zQ074}?sUt0MGN$82rhcHc#&|AJn$ns+hTH8L3paz2^^r}?5D*h0b1@@rHnuq8Usvv zibx#a8S*xw5<H7s9fO$!tY8`dA%R*AOGcDzdL!HifM-y$2IRGK!J!>KN1PPFm0;$= z!e`e?rVYVneuB*<q{FS2?XMW{T+8c=vodo~NpP4(4bqC4ln9yH1Ug|xJ=UmcZLKet z{26d}xrx*!ugp#$;XyG2DSgKXjj}1}J&22t=A4GIUkfOatmw%{<HWBy7Hbakl*z<| zSu1)5JvahbB9%4_6?SZR@mXK{t9HQ_*F1HhCp8MWbC3C`kH+AK*o2es%o&QloZ;ae z_~&1xmV1+Krmv7T^$6Sq*TVpS?=hJT%>%v0*}+0$l@8Rmv^Y5RS=8$32nj#=j~SqC zn`n<{WNhHeJs}xCz%N#XoSr2qYc@%{wBM`J9+@_BgqOjC@T55AKh|A72cx7<1?I0g z3)z8&_09PilF1`<_UOV2Djdu9L{ik}Sy5_W)b>-$A4^z`jaYC*S!tFLkdeV!tJ9P` z<k{BoE$K1@;|@@P^7nq8a?-$2UI(R=W7>suA!*M1sCH9JT=zWdC8S1&6-Z8Hb@Wh; zf55V#JPSvkIxPf0e<iJUwH0jVI&QfstO`G=%>Qv0Fce9o(F+TC5%<ma<(&M_eJYuF zKtukE7Z?Bjto^=<AnWVnvH+fb;5qlmp-M5}q!f9x)%B_T_0%ISS6lKZNEfKDCfk7l zGDDm=uTJI(7iq7j-afZcYw@UKE8(1kIq?-zw1`KIlA+EZT`!J21pz<i;mOyNx+rk( zd{W5Gayc+dPSWbYQqhf&=kuz4<@HZ|N2@_)z}WwNoZlxDI_?(4cnj;OE*ayZ8T7Ne zMUof=pX*8vzWn)=K%W|<k%Q$~T6pX|1}92E7I+~V(_1<SdbRxvRA*Z7GKw+cds_C$ zYE(Z8j^!vSAmzDM(0jev0s%%PN%BDWQXnYC@i(tunPR$H={@rEW|rGbOIy4fy39(C za^S4daJnm3_u0C=3Vpps<=+#<1Q}?h<<w-1wv=6d4|jbIZ;qJOnf?ovHI&LcY!?|^ za4Ff8m7-|KE}8Ec$?Xc*Hxr<{iGJD;&;>k4LN=RQQ$eo7vQ%}~CV0^<+=q%ZOM)IX z3A0Jw_Zn}&Gc1#B*2DbD3l9O^Qjivpj0HJwiaOc$08d9($!uFSs!wn_GwB<f&VWU2 zlC8nR<@^%+R^Dpj7UPIKnOq?9ptHdZmi&DYsV16|Ln)LKz}|2p#qz7Ol1@6F)WA%5 zZ84X=?RE^G<G0UwTD&@WTj<i8#A>{5%5@C@9uuhE0k#!nnhfaMQ53D&tCP~6rIRyv z^c(W#6=cLbJGZj9dy4tJ{jQLW7fLtVSCg8jU)r}z-%+Y@yt|<^`%vV8EpRhAxxp<P zpfDm2%sKWVpI)$)6aZBI6;Ve&l<H_Je56&=1`qb-Ub>F4mitp0$mwdu`1a>yg`Lz1 z%I$rjqK7fEHdVdm=YqAU!Y_(7?#W#C5uD}4V!N0-kE<vR_lo&ja*r*WyCCJ&4_-%u z3`aq}`OJ=V#87M^k*<x3AWMtP0`bgLKwNae`xBZ-<isP*`?KXDqN^Pb$XkM(=-Lc_ z(<F314GhFb^Eme{Va+`$2taMWUcMx`P7KWPgJC`@B)-JqR?dm1U?cq0XZTJc92%nM zO(cTmgmor<4l4Ip8)$FKeI4AA@nKl)Yz^`9Ch!~?GoP)|&^IajJS0flwA7PJtK)}+ z_V$~#4crBClBl#Z_l~26D9L7!;JvvB+f+lb=7MWZWuzv64or_Mt5b074b{EA;eiW3 z>3PT9eo<FpO~1HTPm}tsVoKvSr)l(aHD^)9+obEa$arSETQe-1YO_JAeX<akpQhFj z+#u{?fuR(vdO9WW-PV5+i1?oS;8_VnpOO`kne0O=J4TCGV#T%!umkYfQDCbPbcFAt zc)!FA*G?YQJkhguiL}+J8$dR5wQ8U%Uy~e_y-rUGXAm@kt7qHE86)uQ>zgW~ol<~5 zP!vh`v%Qw3O(t$i+FPLco@^c76hBkyz0HBw*v&I^ZRap}NFRNP!rk*{fRYLg8*AOS zn_QJb^ODrP)tE0p$}b1nF!*)!AA3qGUq?k*MGCfOQ;qF<eP)zuHtVxgB^D#NglGy_ zwDnb~0A#!~<d396B95-w<$gUH6Z{8Z5Pl{W1iSQv)!q1O5<anRe0h`k+@9p~q^^zI zz~bW64!`9j1CTJmJM#lPo)L*87eg;I1~~DiRwmU_1F`f{kpXIO@-tO`FLp%eBQoHr z*U$>sLTvhx{0GmC02<|)L@NN6m<TsZPZRuav)1AH78C#0$V|K3(26#Cr{)s8!+tbC z+i(sYR(gXpJDbDr9g--<lpyRz_zA37nWt}G-A4czJnDQC3Y6xz9PE;g1tnDL>i>dr z$~$E!!iyf&4-miUcm-?dw5ij)_EwKfp$TxDFh6{M(bzTdM!Z@wQ6`@slaqsZCbH?M z6R`-ANd1a0)!CMh?^ic}73QV2WLN%{Uieh%T>@MHE)WC{1`_xoh~TAg{h!kJ*NY`K zeqn%cthuBc5D-DM5MPxeQmlDTAO-V=2TnQ0N4kYYDqw%)M}Fmp^C<}P90ZW$;wKpZ zL=Z%;m)l$;(fkkoaaX5QX}CC)K{+P@*pWb<i+{nutT_ocDq+m`!h8;<fAav>!w_D2 z&fql3l;3pUeBnMzpFF>hy4w=H3erJ_PPr5gkkry3zi>JG6fddmDWj|V^ad9O551=# z7AFBSrzV~Jg!9yfn_M?*nnlrPHzzoCMyqh)X-e*>mI%fw+`m0}Z@@d68AKY9l5FmZ zecS~J1}X$1Sa6APKO@tCaCti#G;<yFP+or0R9+G;Tz4+m3ugRq%6}!5LB&A&yqi4r z`+bPISbn~tMvZkYLH7Bm56~@2BbaCeNp*%I&rXKxTe3+>!^KWXn;XfEUK*gm8R^tn z!ID|P9FmtPo-gMv|0H;w!$@Y4RKZ&+Uj*oPe01KgW`0BfCRgoDazK}p+2&g+yGaO= zRKd9egb-W;I8X7g28>=5i!6bY_GkZ9NO|JLN$ks#pdqMlW1_4eO#K@o0FdC_Hz9E~ z3C3n0o2QjtTeDrPiinm*gIr_CL-N`BrN1X2#$<BeUI?uU&=(8P-^Tdt`egmYWQlm? zoVZZEDgmW+WJ9A=jRn&H(e}!MIqS_CRsx|(H2G1<Mf4+rYg`3XO@bD6LKYeYvp11r zQ+ZPdEdRmGCS@7JEvs{Fw<WUlPP2jV9CLNb?@*aeEa;~V6)V1ECyM8%M1~ZM`nfv7 zRFAf845bac#{ewjUnmt(FLPa>vFt@Mo|RI%`nMfYcTAam)s`(~q87lEv38bmxR#Mq zTh!~p2NZ=T=gGL$9a@-ZC2N#=;S{6A74uA$9ZfXXL^Ou90Nr8-2sId(9P!$hZds4> z<+XJgFb5ihQGDvlJ?s+pW{sx&hVx@uaH3e<;#=$tRAcFs4ymmKpH+?LR4KVuZ^LRB zJHdIT6k4GanW$>=cQurkHE`xy8l_q~`&x#WT0~hb^FS@@yIS_kTI9QoI8+U%KHY6j zYC(xQiI6(pcXeWAwa43(TC|8!iEwLg+BWrSGb|%LHJ}Vm#q=94sZ=krRgb!?Lzgwc z?TK{t;XAHu>eQUS*BIr}q!ntN8MlCCn?h8>4Q#%0ouzQFInu2gPV3u<?`z~~Z3uYR zgpy1jdXk6Y<Y!UmtHJXrx_Z)512*c|wz+t4?h+9(e7<i)T-`Mn6@=q&!1CAcn#HyR z?{U)a(})LCLu+kuQA%*tQNA82L2V0)lVBOB7G?W(Q5cx<oQ}D^4)G8rsLUHOohNG- zO0w)iRd<w68&XMXCPA{$vT7&Do-e$U+e+hY6pWSQ+7w-vVvyseSNPUC)g=PKN|w*V zU67@`0<uqA9>Nx4C+f)Dq9lQ)kFxCB_w{KwAP50dZEJ6O;!bTFpmLWqy>hT({vuTo znDM36{ZNc@s7y*VHh!5@WkgeD;-;p+6Ti+yPbyQPQKMzJB*H5P6Xt)Mt*KhUEpG<Y zb@|51L#ymJrddC#9YLdvLw6|lXvWy`@Fu`bzQf_Mu5M{}yq2MNuH_8;W7?GlyHj$F z>9qx(Cr}k#mJOgx^Sq3Y&=y7`#&L}vafQepIvJ>?yvQCJooM{Ht7re*_)Nw`yixEs zK}0d%&garn8BXMKX1s_rX~LrrpG?)1;~s=twTuweqWP<^=0^}J;YNengpjJ*Kq$41 z4vU|>5L}ra0Of1a^d=S&=oRDcQ&H|O_zchf5kXpP-=L^*JGm!-)=R6%H!xA}ej}wM zUsGLSfwhmb#e>`6PH-+CWDBM>$N-pLc6?3m^hlBjH;K@4qhk5#QvF8j_P(wEo@<M+ z>0-_ur(XeGZnsNwZ<krY>p^8pt`#I_z;;G{;t2~<ELijUfr!Sbfs5HtVeIpRa<~bf zzqtgxo@v*;B6xyw{%&{(5oh3Jk)lz$9-Gbmh$Qb9v}S6*?*&G5J57XiJ!vmAg9LB+ zcIUy@<lu+BLE=(yauNC}uN%aPhfIVAuO(*Y%yVWM@49V7+7>Xo7*PEb{%zVM`A<v- zvOgqsh#*b%rLg<3d=z~YN<_`v_36b<Q{Llm{RY|*d95C!PfS$3<zyHwl73am^obP^ zjI*^O>iKPZgQ-??gab)>2j7ZHT@3_xj$7@4t8B*ZQro;@jB7cs<RL*?=SA;>#<?>x zp|11}BQfBGND^#J>k9qluF(U!cAu8fq`2qR==g$b5Q(`YF;;4X7%M?Bi4blX2163i z2_TbL-zJCqzn-$8+*Mb+(&h!=Odh0cwptocHM5ez47s}0RXbA2guPFmGXf#NW*nJ7 zdXE64)mGPUGL<PxtJH-mvTwSPHSBHKOg<vja5V)TmXg|+vJ9HdSg>QMqe}fB0Bk^$ zznYVW+|87Wl=NYdgW`~4Dpqq+$wcgkhvGZ$a(>Ym0H+I%nj$le29&dMkJ(X@SQ#1x zQ;ifM71_X${uGMEYY^Zp5R{o|zSA^(Ign=g8EzSnW;2#~B&nCmAm&V$R{@vd<dzn4 zlQT*#{w!UR>YLtt(kNXJRq(<j;jrJw(h$m@UY1pU{~&k`vC=p^5m3S|Hl5Nw{nL!$ z2lgP*J;9v=;+!8^Fxg?$-brHh$QSKG)GJXiL<-baebOmPu0P?Q^4X!VVI^h=pK-yW z5Rug@$`x0g)@r@hY~9vw{nl_D*K$4AbY0hWeb;zR6Ylz;d!5%EngVE@5`dl4Y@MSm zfjT@o5#a*XA%UDDv7-iI*a?9I!{By-aTbGN&bW!6D<Rnj;TlZg*&Fd?Us@8RjV%Gd z*q6N*G_(+>O%b5YVLwsOtAW}7vKAMu60~6(*Ff0NVIDD|rw>6K#sO?1p-3c=l2Y1Y zno=IpVM>|}5jz9PDzV%NA>1R;An<~V&e{;x|J@M}f)f2vAH|Iyz+Hn0fdXIvAN~PT z<JqHV*WG>^rU*pe0ukN`p^DE<!ZATsLe$e5L8mQ|k`mzov8x=>4H8x+;0TeD4BjjW z{t!Fx1}+T}53WpSC=!5rqwAvy0NzVLA`*v0(IheA6(n3V65^1zZHUy~&RgLIF{qhU zs0p#*U}572F;@#gr`W9$&nE=;CW*mnE)^L!0gxy{FyhT8tG;S0Lq4jd>Z#87F{`RH zj;5@f?WCxxJ=hg<lJcv!@-fEJDzYL2=rSzD0<Aj(xxKnAQZck-^C~_=7P6{G0l<)! zx~Vb;KU1D7zY;8HzAo)j)xBCBU~T7>|7t6F0IH&zG*8W}<PbJissgkcs#lRU@N4DC zx;1@1sn>$54)HWa;sVHUOSupqSyScilG_Pl4KYMA17R|NN#%=a<*<I=r5pgRE@4%i zEkP3iF@qS^u+f_m>1C?s%d+X3;+Tj+G%zVJ#7-(!9%fc2>QUn`SLaGb;^rGu0$DTX z8yzT$@tqMP6_P$STfVuwh`4v7pXW&y(g!$#ljMX$SN=mmjnp_7+eP=9ub87b8S6O# zD>qxzw)~1arL<U!qwlj5@MF}kW%M<2&^}p$Lk4?1$umD!5d)x;JJK_<)`LG;ggmHh zMdedu0hF)~PaoAm@u!mI)Vn{$|CRB~Lm&1E7z8MYIS&~1dM!JEMF2H@@Lurz?idy; z2V#%}49kDR`LYs=y(w_uR|525BJ^5K5mPimADpg9iG5R{_1Q8-=X5?)KZgPELSK49 ztW>f>#Ap`pK&huiApb)_v?00#h(-iP@DsDF&WLs4^fFW#>`Fc&e@sNr^#NegNA!jQ zK}M4Bue!)5dc;SWLBu=51-OTnCT{N_wK%t2`7so?`<qDt0JoDwfZxR5d?8E+j542Z z`i;klm}N_7b%nV!73zph$$VN#H)&UUK1PM%l~xHMMN@Ixg2-vCrldB=G|5Uk3hb1( zW;04>sZV^X8KJSX1S3x2|MV&YrTVa6D7h~LTq{rXM3Zml_X!3V;YjYCU-beN#RU}r zL{(82wNMT9OmQo<-*5i_@kK}gZ?%LR6!Ia!H-raOR0@y;MMD(<;3Yw*qEmo_9yUHf zsF0z<PVX?X2oL~dfPNf(Ji~?XM*vb3H)0I%444ob$T$jF5n$dEj}Zq3FotkOu#}b> zK7Fe2XG5t_s~$x0CqN*mLMmQ-I<qE18_x_1Nr5N;ml8sDMA^~gr$(bFRXz=%%URc_ zGkpFFpzmjol!XBYAmVOp3%x>Ej2an$X-0@oUrs$pxNypPh_@2q7eF(S&4ud}#mIQ- z4{&4oHVgo&*=EWS|0f=N8MC40(sc&Prk!~4<blEV1_=H7U`l%d9AR7zys*sHP#<DG z+WdJ#)~;*AE}gQD@PjRgD@R{(Ds$)16R!`@$3x20x;WBBD4zWCdcM6@&S<0Z?4!=R zlnygZh|69Jz>Wa+sUrX_CVWGSlp2!ZLi7eYhB<#UeC;}$j8bhw<ygZk0L6p|<3ipx zJI$i{ep0cf7BNHdsq3KoE<mG>S`D13G+GC`Ir`(txPg*8sJjsd<mf$wj;sSeAxgwb z3ptuHk%d&SbL>l~SaYSV<pR)-$N#`|GQR*2oDPLIQ*wnQ_<W0Pw&~EDAtf#72%wOI z-kZV-L#0Tf|3)Z*8ihutZrkxT1z~#XJuD2hLJY+C2_&UJdg!N+9^47wQY)}Pl*ofb z08uOxV+f!gQ?LlYr`pt9upvtgMKy__0x%^dTSpyBvH&K^YAuUELT?8$0wCu?SUa=O z)+TAP4kC#fO5xdPSHl)BZEqu#S44?j?okt8+W|zkymfKKgN_V9Bd}P#?<OHom?I^0 z_w9GCaqYwiUzx%klvGSn<tQiJpemxUTT(n|hlacav#Sy|n<ir&2llEHcvcO7nsxb_ z10Vm&3t$@%VEJj+QxQc?2!pR|`DN@<UfH2az@i9bBDd|g4l{X1$fI@g+lQkRwBjNq zW`%Io|Hp#kbuA_NWVG4cgI*p9J-e*(S_q^Yau!+;BjpZZA>LaU(Sw{ALk~B&Ab6q& z0|-jiYCUequbnb9$_D!I3Sh4*Crbg6wTe@G-%5sRC|9zq)fGg-3h4>Vnz0<n8^9Z4 zOc|0*t{9>xB+c!q&Y>#(Op|*;U9!lLC=3`gP4pr0D|M;8<ora33Wdq1w#@e?g)IJf zvJP*E_H-i`LW#1KvoiU;UI%K~`F>I@38g!dn)?+RWi|!pNgCN^0+%EH`HU^ExG-$) zqWW7HL-HDhF0P+eASA^X<57-azZ)GwtcM*Clno3`6U;%l_aygC<$;00OasBxuKukr z|71mC6g!xu!4XLWR`?5mkOHui;bF!~B{CoStR#Z>VJHCOXvhMsBBrNc>?tJVOYb7r zI0LpYde`HNy)g2tCz!`{M?sx(`ouycR0jos3V<O}atO2(Mh=qDP+{~CfQ~f;48RJ2 zCvZclhFq~ZS_~8nNW+yurNoU{++xUn!m23d1&?ZcO$;^?05uq^A#;dFN+z+!hhc>d zZ_MKg23g3-+%Y9(JcuMcg&q_*$PI;Dp%98fNJB2iK3eny5D;?4V5zZ_0r+G}SU8aC zK!ufQJct=m0!J=dl8jSP2w+a8N33`flsma%046q_n$a*{DUm}a>|u~(F4JAN|5PJg zuGYs>2H+C=!Xhsj`IHuHad!imkQOSWp&eKVW)|X~Fx?aYVZ_5b%E2ZvlW;TTG*F%h z!QDLv;*)j!<c{LhX4m>iP|O6hD~MF28PS-{jc73xnv<8EvM9~70A-MLH02-lxJ_^> zb4wR$rtnh0he@O)6p4%{W_CcUFTv9-7OLq~9Ey-v#xj(v3;-+AsLFwK^P9=UV*n0u zP8|(W4xk8tK{QFq^SnlI2Z@2|(BdH42q6ZF@J4f#$H9NJqZ_M$O(^`)oF{B70F69I z3b@LpIU<BKk=SYgK6D`^R<I#g5QaSBu?#gqB?zUFMMGTh3N$IBt-XV5|6aR#*v%w% zAbIFe0M4p|{P^P=g@sBA?$8W*6b5fXplo3*dl0}1mKbeaj#}9&TGE=fKwSxdY*m7S z9n4ijD#$}&HXBzzM0J?z!N?BsP}`K87Pxv1z$)6(S3c^o8Yx+=2ZFm-ax#{!-%E|V zTFcfF$h9<Wq2DmUvzc%FWCz7X>p?aqRxz9`w`)}icoDdv6u`HQDG>-%QsN!+(neML zb(44G6o4-ba5>)n(Li+j1QjTPv|`=Yz5qO;l!#-s%kgYsTRYe!;3o;?G|Kmya|w(j zv_uuT?w*Jn)!og6y$vf(do|2pZjH9I%}r}Nn!}^<s-(QW9UWa}|Ks6<Bq6ofRqwiZ zWS#^@*~(YOa+Y5M+70!t%320<n8o~*7(j;08#=Q#nHpt`py147hI5?d%&Kk3c|+x_ zvz>94XR8GfiBeXMoAvw}6ldANSx)Gn*G1(+E85YI26GJF5CB_519_0f^q_YcfOdTO zxB|*_s6{PjDT%t&b|wN$DcF!06tdEn9(9~g9qU!odV03TwXJa%fMNtV*S|g)3WD2d zUU>Rsi3WDEf4yK|V|u~Hj<SsN){tHITG?S{cCxc~ZEknl+usJai5eYla+llO=SFwB z)xB<Zx7*$ChIhQ>J#Tu~+urxacfR$#Z+_D{1%Jl13itr+|9)FJ1!o|5!9#uUgs(K= z8$toX6+Ur_Qykga_Jcd(n;&85FVoKk_739E1`}<&;#!Wu$h8~*O~hjroLyIcH7;kC ztNP?O$GN;s4(uw#qoW7u(`HESY*_-kYU$Bem{Y=M<xsjXoXF2Bs&Nm1|N7`y_JAhN zVeFp&JOEOsdX*{Nj!r{8X_Say&egv5bYJ|}0qD?}YB}m1yy4BEzIup2t>p}L?8{eR z1swU&2d`?PG=lnen^q39FH1WHhTjb0Uvq^3#Gx=C1rlu8zIo2$x-`W2;6ae^j0*)l z0Ok0Rax<%qpA<M9_>%z`yNb`jH$()CKM;)q(2Qyv|E4X<twuYzq5HyA<Mn*n%+d}L z`_fb_55XUPTvPI``2IU3R5!a2Xi%7~uL}1v{=6PL{BluN{VA+$lzLPBlOfDgIp4!= zc;ae@j!O;b-2ajPHUoN{HUHn$AP4LNI^tNcG-!w;2!Ks65iqC+%tIVcO9Ils4g^%d z&a=P^gtRO87Cm4CF2auhh_Q)?0XUKbd#H&Nz@jmlhP^-mG|&g3ijz4I3^lO4(+Z^i znS#PFl%Mc{j+ulp*b=wEqLYe}G{T}->6y^VK^c=lLaITuI6`J}s_EDPr@E-0NV!Rq zgnJl^B`g&yhyvEyzz!6@lxT^g_>f7syQna~|Asg$dPu^7I70@3E;X#2jxhu`kOMK0 z2p5Dw4T%9c&_XUe2n0+C4(uf_yp%BHAVVNRuYd%4z?%R_g|G>!4Ve#16tFqm5Xv$d z*r*{46va^tGYw)3n}CNhsD@cWob9m|7r2nJI13a|3y{zX2UHHmNQyCWn@NGI7=ni< zm?O{#1PL^eqQHtjz=uFMrx+Rvjd+JMNecb4i%ZLk$hkUGECC)#sGOLkB4C7Rc)>P6 zfgjMHl*k7IJczL|k)`+$r+A7YI0nbMjkt&l%m7DmWQCziiC;8}xT;0GXbhd<0zqpV z?|{ZkS{6BMn18ehP3#I?d<}V|M?PVS{{Vo;S|i1c<VgFP23FLlV}T9nz?yX7h!-)9 z1xu3+>62dQ3dI{IT_F{wi4abaK+PyQ5Mht)c$=9#ldT~U0<jl2!4r}U5(D{2>i{*- zSq`p>kaSWfcliJwf;cVV5`^%9V~B<@%#XvU6TEQBNx_crh?Ryh%7IAAmz=wiIuqZp zfyqD)$&<ba<BOIIBCX^~PO?gje2N8I!;S>Zj;sNlu#U~xxM`7)S}DTC@SRcl!kK{% z4*C}KkVsy<r}X+4v*`~BB*q?42f1VycToX0P@9v?D0-nTzS0*IFoUM)8&mk3gYk~R z1WC3mrzjGFh)Icwc?uYS3U)jh|FBUY`)dfgu^Ssa2;EdBmtZ5iQW#9ploJXT#T0@X zNK4DKi6WVZfY}$Q2}q5MNL|>)r&u6ZLl5Bu&%jjAz|@&bql*>Dgmj26#t0sh*%K<` z3Cw{Cj1VI9I3du2NndmwYhj|g%8WoMxxH($qj1Ha2#R2Yzx}e36KbMhcp~tNpRa)# z_v{4aD-jL~fcs$<8{3S0SedB=6CLV`48b8GFg+6iQ4z&T(sP}%aU$6fg7(C%4E>-b zBF<g=Dbfi=zWC3+khbCU7_d<jrd-b^1<WN7BV5v^iijXVN{K>>I~7oi0FVPkxR8S~ zCn11?lo$gCsZCqj3ISV7|FP^#K)D4XL;+&7t2VTfS0bfQswUb<DU+cKF6AhXN{LB3 z4?jYsgMiXQl+wegE)-iT*hr^!axa=n%$P!mm1?Qnf+>Ef2SG@u(P31kYMrOhrKIAb zQKBTHIMe_bqeTiSE&8TDjizZrh^fNGBjt-Ta=;_u)CmEmIjK~Za;Zc*CtG#WVjabl z@Q1@FF;J6%PG~^XLagOuj&9J90-KH$Sgw?KJ>=wzQaVV>XwHmakN7fBAs~!M7&nSI z9OWtv=i095nl6!<5k1lq%W|^Z3xE$BvDey{{~-ru?JK5Sv)3Tel=!R}>nIrOsy^Ke z^L&amOE0%TvV(ZC|9o|m53vV+Wv#$sD@}^A4?Bv3wV~bG5N{QwL26ip71tQ^8p2r} zV};q6Rj*ocNja;6He8p1Rj)D=S@lY@q`R_oy}-ZRke$OyuTcR%NIMg`*@uHsrFB}F zmD-JzlSFU>&WPHkD=v_YwN2}^I5XO*wKKPCHK#)!_1HKQ34pDYGqe@kx1HJ@kc8d~ zfNN-kL0hQ`v^8Plv;ZhJu)PVPg<CB<FltMQV!)1wYdAj8+c8tz!G+w&mE6gt+{(4w z%f;Nx)!fbH+|Kpf&jsDk72WR1+Ic%6ID6dDRoys~lUW!wh679_sD>v3Hdq<DE9;y9 z03k&)59)C=|B<_0fSTQ5LV{uNI3bW-+C7=xg|o1IG~m@)V9Q-FNnW<AUPpV0pTo55 z&CirjK584@K6{ObJsIfr5qL|9(z1tZC|$l-0)H3>qJ^{oRWB5vl~MR!O{*$L%R3=> z-}qe@(@Tk=`(OFZkNqWF1;x8w<hB&J-`z!s0*<w;d>lCYx~XeJ30AZ$$cOf=Uohxk zw76f};3*9zCgsS2&cL#(bGs<p7-0~d0LVV{SULe~nE(!eW#Cc_k~0+0f+kS5{*5vZ z02w_qS^i~U9|q!ep<gAAHUvgApj}{r>b8f--z-^TQG>e}gR>QYyutv@u5e;SdyJmN zv@+(#|4M*hEH0tfK;sp5o5Ia9z!N;eQ;xoK7sB}`K0yW+N{L;RtNOzqc1;P^W0aA= z&*^=@PD_d3<EqzNiOt~Ry!sZ9us%kPuiKM9DJl%qOXIOj2}TY8N7h#SF+ESlDn-EH z(j&l>P{(eSy-s6B7sWq}=s(&}WDJqL>9}QI&E-mcWc>N6sq2OntW^I}+x;s;ZP+-| z+dAkd3{ma?Az;3~o#oytO_0#!=6j7xPKk{p<mfw-<|~a!-oBK0=3BX(BQ=8`>&N*M zWM+xx!kFg&0;Ho*1|SO&4H4XfXuok*j$iJg(oEYc3jk|43q!;TT-~a89%$;D2!%d~ z|13z;{ICWW0uTxE3DF#+9}_TymOcPX3A0-YgL36wR?Wf?2kCN%JAl5{3*~R_iuFSe z^ur9B4&XipI$LSM7o-iOQbCS5pU7aGDX<W_?7=M3LyqX_KP*B|IKuvDYCWx}u2MuW z^iM$yfD&|#hX5Mfz{9297eCw#5!7lhIzca*4i$*RNvuTlXhIsS;4Iu~LKK3l4nq{M zf}>WGxPC$uxN4^MLLQmwYxN>8?bS9s0&)n4%1dc34TZFW6+zf)69j9e4nnihhhX_@ zvW^qH#-6IaRyQq-GEtDQ-opqq!oolj4>)VPUXwO5YUo)GEWm;>2mo|oYR}e?|D?{t z%x+3FxeFE01WVKBZq+MnV6mCyL@}Q22%`%)!r9ljk^6Jd!YFK%672*mj_Y=p8<7;R zChX_tMwI>2hNy1wd&I_(#DRG0yDp4HT-MDvL!_c=Xgbn2{6zG)3aY@_tBO5!;0Rd+ zNR{B85_x0W5!bI)khgLjhfE8V7)F~+2?9rpTI|!K7*8Rl;l}V8q;~M=fpE3p)@vMy zXV{AqBMz2e&d6$`TWmTHry2(S3c^;#Sq=*t{}~?P9$Hk1UlIZp$Bh4}vi@r-qbRyo zj7gq?@#wLZ2p>@fw#O)#iw;c!w@M205ekritV;O|3Li@uXPX5FEh??R{~iy>F2{?x zO^Nyf=;NNqa2&@HFvrqJ$A+NDm&G2g(I^eiGLfj%Ee#!muy82P@S;l#dJqVL_&Goi z8ZfEx^F3MoNr;6I*Jz~Xg=Fy)e;5|l7jNv|B^rfiED32;ii^xh{w|yT=HtRhJCqa; zMfsh*C}V*BaBzhySPy{l_zZtZ2?^|t:$?bfrr^~woXb0tf&)RPO@5B!9jB}t&2 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	t?SobrQQg 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 diff --git a/docs/source/about/changelog.rst b/docs/source/about/changelog.rst deleted file mode 100644 index f739ce980..000000000 --- a/docs/source/about/changelog.rst +++ /dev/null @@ -1,1124 +0,0 @@ -Changelog -========= - -.. note:: - - The ReactPy team manages their short and long term plans with `GitHub Projects - <https://github.com/orgs/reactive-python/projects/1>`__. If you have questions about what - the team are working on, or have feedback on how issues should be prioritized, feel - free to :discussion-type:`open up a discussion <question>`. - -All notable changes to this project will be recorded in this document. The style of -which is based on `Keep a Changelog <https://keepachangelog.com/>`__. The versioning -scheme for the project adheres to `Semantic Versioning <https://semver.org/>`__. For -more info, see the :ref:`Contributor Guide <Creating a Changelog Entry>`. - - -.. INSTRUCTIONS FOR CHANGELOG CONTRIBUTORS -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -.. If you're adding a changelog entry, be sure to read the "Creating a Changelog Entry" -.. section of the documentation before doing so for instructions on how to adhere to the -.. "Keep a Changelog" style guide (https://keepachangelog.com). - -Unreleased ----------- - -No changes. - - -v1.0.0 ------- -:octicon:`milestone` *released on 2023-03-14* - -No changes. - - -v1.0.0-a6 ---------- -:octicon:`milestone` *released on 2023-02-23* - -**Fixed** - -- :pull:`936` - remaining issues from :pull:`934` - - -v1.0.0-a5 ---------- -:octicon:`milestone` *released on 2023-02-21* - -**Fixed** - -- :pull:`934` - minor issues with camelCase rewrite CLI utility - - -v1.0.0-a4 ---------- -:octicon:`milestone` *released on 2023-02-21* - -**Changed** - -- :pull:`919` - Reverts :pull:`841` as per the conclusion in :discussion:`916`. but - preserves the ability to declare attributes with snake_case. - -**Deprecated** - -- :pull:`919` - Declaration of keys via keyword arguments in standard elements. A script - has been added to automatically convert old usages where possible. - - -v1.0.0-a3 ---------- -:octicon:`milestone` *released on 2023-02-02* - -**Fixed** - -- :pull:`908` - minor type hint issue with ``VdomDictConstructor`` - -**Removed** - -- :pull:`907` - accidental import of reactpy.testing - - -v1.0.0-a2 ---------- -:octicon:`milestone` *released on 2023-01-31* - -**Reverted** - -- :pull:`901` - reverts :pull:`886` due to :issue:`896` - -**Fixed** - -- :issue:`896` - Stale event handlers after disconnect/reconnect cycle -- :issue:`898` - Fixed CLI not registered as entry point - - -v1.0.0-a1 ---------- -:octicon:`milestone` *released on 2023-01-28* - -**Changed** - -- :pull:`841` - Revamped element constructor interface. Now instead of passing a - dictionary of attributes to element constructors, attributes are declared using - keyword arguments. For example, instead of writing: - - .. code-block:: - - html.div({"className": "some-class"}, "some", "text") - - You now should write: - - .. code-block:: - - html.div("some", "text", class_name="some-class") - - .. note:: - - All attributes are written using ``snake_case``. - - In conjunction, with these changes, ReactPy now supplies a command line utility that - makes a "best effort" attempt to automatically convert code to the new API. Usage of - this utility is as follows: - - .. code-block:: bash - - reactpy update-html-usages [PATHS] - - Where ``[PATHS]`` is any number of directories or files that should be rewritten. - - .. warning:: - - After running this utility, code comments and formatting may have been altered. It's - recommended that you run a code formatting tool like `Black - <https://github.com/psf/black>`__ and manually review and replace any comments that - may have been moved. - -**Fixed** - -- :issue:`755` - unification of component and VDOM constructor interfaces. See above. - - -v0.44.0 -------- -:octicon:`milestone` *released on 2023-01-27* - -**Deprecated** - -- :pull:`876` - ``reactpy.widgets.hotswap``. The function has no clear uses outside of some - internal applications. For this reason it has been deprecated. - -**Removed** - -- :pull:`886` - Ability to access element value from events via `event['value']` key. - Instead element value should be accessed via `event['target']['value']`. Originally - deprecated in :ref:`v0.34.0`. -- :pull:`886` - old misspelled option ``reactpy.config.REACTPY_WED_MODULES_DIR``. Originally - deprecated in :ref:`v0.36.1`. - - -v0.43.0 -------- -:octicon:`milestone` *released on 2023-01-09* - -**Deprecated** - -- :pull:`870` - ``ComponentType.should_render()``. This method was implemented based on - reading the React/Preact source code. As it turns out though it seems like it's mostly - a vestige from the fact that both these libraries still support class-based - components. The ability for components to not render also caused several bugs. - -**Fixed** - -- :issue:`846` - Nested context does no update value if outer context should not render. -- :issue:`847` - Detached model state on render of context consumer if unmounted and - context value does not change. - - -v0.42.0 -------- -:octicon:`milestone` *released on 2022-12-02* - -**Added** - -- :pull:`835` - Ability to customize the ``<head>`` element of ReactPy's built-in client. -- :pull:`835` - ``vdom_to_html`` utility function. -- :pull:`843` - Ability to subscribe to changes that are made to mutable options. -- :pull:`832` - ``del_html_head_body_transform`` to remove ``<html>``, ``<head>``, and ``<body>`` while preserving children. -- :pull:`699` - Support for form element serialization - -**Fixed** - -- :issue:`582` - ``REACTPY_DEBUG_MODE`` is now mutable and can be changed at runtime -- :pull:`832` - Fix ``html_to_vdom`` improperly removing ``<html>``, ``<head>``, and ``<body>`` nodes. - -**Removed** - -- :pull:`832` - Removed ``reactpy.html.body`` as it is currently unusable due to technological limitations, and thus not needed. -- :pull:`840` - remove ``REACTPY_FEATURE_INDEX_AS_DEFAULT_KEY`` option -- :pull:`835` - ``serve_static_files`` option from backend configuration - -**Deprecated** - -- :commit:`8f3785b` - Deprecated ``module_from_template`` - -v0.41.0 -------- -:octicon:`milestone` *released on 2022-11-01* - -**Changed** - -- :pull:`823` - The hooks ``use_location`` and ``use_scope`` are no longer - implementation specific and are now available as top-level imports. Instead of each - backend defining these hooks, backends establish a ``ConnectionContext`` with this - information. -- :pull:`824` - ReactPy's built-in backend server now expose the following routes: - - - ``/_reactpy/assets/<file-path>`` - - ``/_reactpy/stream/<path>`` - - ``/_reactpy/modules/<file-path>`` - - ``/<prefix>/<path>`` - - This should allow the browser to cache static resources. Even if your ``url_prefix`` - is ``/_reactpy``, your app should still work as expected. Though if you're using - ``reactpy-router``, ReactPy's server routes will always take priority. -- :pull:`824` - Backend implementations now strip any URL prefix in the pathname for - ``use_location``. -- :pull:`827` - ``use_state`` now returns a named tuple with ``value`` and ``set_value`` - fields. This is convenient for adding type annotations if the initial state value is - not the same as the values you might pass to the state setter. Where previously you - might have to do something like: - - .. code-block:: - - value: int | None = None - value, set_value = use_state(value) - - Now you can annotate your state using the ``State`` class: - - .. code-block:: - - state: State[int | None] = use_state(None) - - # access value and setter - state.value - state.set_value - - # can still destructure if you need to - value, set_value = state - -**Added** - -- :pull:`823` - There is a new ``use_connection`` hook which returns a ``Connection`` - object. This ``Connection`` object contains a ``location`` and ``scope``, along with - a ``carrier`` which is unique to each backend implementation. - - -v0.40.2 -------- -:octicon:`milestone` *released on 2022-09-13* - -**Changed** - -- :pull:`809` - Avoid the use of JSON patch for diffing models. - - -v0.40.1 -------- -:octicon:`milestone` *released on 2022-09-11* - -**Fixed** - -- :issue:`806` - Child models after a component fail to render - - -v0.40.0 (yanked) ----------------- -:octicon:`milestone` *released on 2022-08-13* - -**Fixed** - -- :issue:`777` - Fix edge cases where ``html_to_vdom`` can fail to convert HTML -- :issue:`789` - Conditionally rendered components cannot use contexts -- :issue:`773` - Use strict equality check for text, numeric, and binary types in hooks -- :issue:`801` - Accidental mutation of old model causes invalid JSON Patch - -**Changed** - -- :pull:`123` - set default timeout on playwright page for testing -- :pull:`787` - Track contexts in hooks as state -- :pull:`787` - remove non-standard ``name`` argument from ``create_context`` - -**Added** - -- :pull:`123` - ``asgiref`` as a dependency -- :pull:`795` - ``lxml`` as a dependency - - -v0.39.0 -------- -:octicon:`milestone` *released on 2022-06-20* - -**Fixed** - -- :pull:`763` - ``No module named 'reactpy.server'`` from ``reactpy.run`` -- :pull:`749` - Setting appropriate MIME type for web modules in `sanic` server implementation - -**Changed** - -- :pull:`763` - renamed various: - - - ``reactpy.testing.server -> reactpy.testing.backend`` - - ``ServerFixture -> BackendFixture`` - - ``DisplayFixture.server -> DisplayFixture.backend`` - -- :pull:`765` - ``exports_default`` parameter is removed from ``module_from_template``. - -**Added** - -- :pull:`765` - ability to specify versions with module templates (e.g. - ``module_from_template("react@^17.0.0", ...)``). - - -v0.38.1 -------- -:octicon:`milestone` *released on 2022-04-15* - -**Fixed** - -- `reactive-python/reactpy-jupyter#22 <https://github.com/reactive-python/reactpy-jupyter/issues/22>`__ - - a missing file extension was causing a problem with WebPack. - - -v0.38.0 -------- -:octicon:`milestone` *released on 2022-04-15* - -No changes. - - -v0.38.0-a4 ----------- -:octicon:`milestone` *released on 2022-04-15* - -**Added** - -- :pull:`733` - ``use_debug_value`` hook - -**Changed** - -- :pull:`733` - renamed ``assert_reactpy_logged`` testing util to ``assert_reactpy_did_log`` - - -v0.38.0-a3 ----------- -:octicon:`milestone` *released on 2022-04-15* - -**Changed** - -- :pull:`730` - Layout context management is not async - - -v0.38.0-a2 ----------- -:octicon:`milestone` *released on 2022-04-14* - -**Added** - -- :pull:`721` - Implement ``use_location()`` hook. Navigating to any route below the - root of the application will be reflected in the ``location.pathname``. This operates - in concert with how ReactPy's configured routes have changed. This will ultimately work - towards resolving :issue:`569`. - -**Changed** - -- :pull:`721` - The routes ReactPy configures on apps have changed - - .. code-block:: text - - prefix/_api/modules/* web modules - prefix/_api/stream websocket endpoint - prefix/* client react app - - This means that ReactPy's client app is available at any route below the configured - ``url_prefix`` besides ``prefix/_api``. The ``_api`` route will likely remain a route - which is reserved by ReactPy. The route navigated to below the ``prefix`` will be shown - in ``use_location``. - -- :pull:`721` - ReactPy's client now uses Preact instead of React - -- :pull:`726` - Renamed ``reactpy.server`` to ``reactpy.backend``. Other references to "server - implementations" have been renamed to "backend implementations" throughout the - documentation and code. - -**Removed** - -- :pull:`721` - ``redirect_root`` server option - - -v0.38.0-a1 ----------- -:octicon:`milestone` *released on 2022-03-27* - -**Changed** - -- :pull:`703` - How ReactPy integrates with servers. ``reactpy.run`` no longer accepts an app - instance to discourage use outside of testing. ReactPy's server implementations now - provide ``configure()`` functions instead. ``reactpy.testing`` has been completely - reworked in order to support async web drivers -- :pull:`703` - ``PerClientStateServer`` has been functionally replaced by ``configure`` - -**Added** - -- :issue:`669` - Access to underlying server requests via contexts - -**Removed** - -- :issue:`669` - Removed ``reactpy.widgets.multiview`` since basic routing view ``use_scope`` is - now possible as well as all ``SharedClientStateServer`` implementations. - -**Fixed** - -- :issue:`591` - ReactPy's test suite no longer uses sync web drivers -- :issue:`678` - Updated Sanic requirement to ``>=21`` -- :issue:`657` - How we advertise ``reactpy.run`` - - -v0.37.2 -------- -:octicon:`milestone` *released on 2022-03-27* - -**Changed** - -- :pull:`701` - The name of ``proto`` modules to ``types`` and added a top level - ``reactpy.types`` module - -**Fixed** - -- :pull:`716` - A typo caused ReactPy to use the insecure ``ws`` web-socket protocol on - pages loaded with ``https`` instead of the secure ``wss`` protocol - - -v0.37.1 -------- -:octicon:`milestone` *released on 2022-03-05* - -No changes. - - -v0.37.1-a2 ----------- -:octicon:`milestone` *released on 2022-03-02* - -**Fixed:** - -- :issue:`684` - Revert :pull:`694` and by making ``value`` uncontrolled client-side - - -v0.37.1-a1 ----------- -:octicon:`milestone` *released on 2022-02-28* - -**Fixed:** - -- :issue:`684` - ``onChange`` event for inputs missing key strokes - - -v0.37.0 -------- -:octicon:`milestone` *released on 2022-02-27* - -**Added:** - -- :issue:`682` - Support for keys in HTML fragments -- :pull:`585` - Use Context Hook - -**Fixed:** - -- :issue:`690` - React warning about set state in unmounted component -- :pull:`688` - Missing reset of schedule_render_later flag - ----- - -Releases below do not use the "Keep a Changelog" style guidelines. - ----- - -v0.36.3 -------- -:octicon:`milestone` *released on 2022-02-18* - -Misc bug fixes along with a minor improvement that allows components to return ``None`` -to render nothing. - -**Closed Issues** - -- All child states wiped upon any child key change - :issue:`652` -- Allow NoneType returns within components - :issue:`538` - -**Merged Pull Requests** - -- fix #652 - :pull:`672` -- Fix 663 - :pull:`667` - - -v0.36.2 -------- -:octicon:`milestone` *released on 2022-02-02* - -Hot fix for newly introduced ``DeprecatedOption``: - -- :commit:`c146dfb264cbc3d2256a62efdfe9ccf62c795b01` - - -v0.36.1 -------- -:octicon:`milestone` *released on 2022-02-02* - -Includes bug fixes and renames the configuration option ``REACTPY_WED_MODULES_DIR`` to -``REACTPY_WEB_MODULES_DIR`` with a corresponding deprecation warning. - -**Closed Issues** - -- Fix Key Error When Cleaning Up Event Handlers - :issue:`640` -- Update Script Tag Behavior - :issue:`628` - -**Merged Pull Requests** - -- mark old state as None if unmounting - :pull:`641` -- rename REACTPY_WED_MODULES_DIR to REACTPY_WEB_MODULES_DIR - :pull:`638` - - -v0.36.0 -------- -:octicon:`milestone` *released on 2022-01-30* - -This release includes an important fix for errors produced after :pull:`623` was merged. -In addition there is not a new ``http.script`` element which can behave similarly to a -standard HTML ``<script>`` or, if no attributes are given, operate similarly to an -effect. If no attributes are given, and when the script evaluates to a function, that -function will be called the first time it is mounted and any time the content of the -script is subsequently changed. If the function then returns another function, that -returned function will be called when the script is removed from the view, or just -before the content of the script changes. - -**Closed Issues** - -- State mismatch during component update - :issue:`629` -- Implement a script tag - :issue:`544` - -**Pull Requests** - -- make scripts behave more like normal html script element - :pull:`632` -- Fix state mismatch during component update - :pull:`631` -- implement script element - :pull:`617` - - -v0.35.4 -------- -:octicon:`milestone` *released on 2022-01-27* - -Keys for elements at the root of a component were not being tracked. Thus key changes -for elements at the root did not trigger unmounts. - -**Closed Issues** - -- Change Key of Parent Element Does Not Unmount Children - :issue:`622` - -**Pull Requests** - -- fix issue with key-based identity - :pull:`623` - - -v0.35.3 -------- -:octicon:`milestone` *released on 2022-01-27* - -As part of :pull:`614`, elements which changed type were not deeply unmounted. This -behavior is probably undesirable though since the state for children of the element -in question would persist (probably unexpectedly). - -**Pull Requests** - -- Always deeply unmount - :pull:`620` - - -v0.35.2 -------- -:octicon:`milestone` *released on 2022-01-26* - -This release includes several bug fixes. The most significant of which is the ability to -change the type of an element in the try (i.e. to and from being a component) without -getting an error. Originally the errors were introduced because it was though changing -element type would not be desirable. This was not the case though - swapping types -turns out to be quite common and useful. - -**Closed Issues** - -- Allow Children with the Same Key to Vary in Type - :issue:`613` -- Client Always Looks for Server at "/" - :issue:`611` -- Web modules get double file extensions with v0.35.x - :issue:`605` - -**Pull Requests** - -- allow elements with the same key to change type - :pull:`614` -- make connection to websocket relative path - :pull:`612` -- fix double file extension - :pull:`606` - - -v0.35.1 -------- -:octicon:`milestone` *released on 2022-01-18* - -Re-add accidentally deleted ``py.typed`` file to distribution. See `PEP-561 -<https://www.python.org/dev/peps/pep-0561/#packaging-type-information>`__ for info on -this marker file. - - -v0.35.0 -------- -:octicon:`milestone` *released on 2022-01-18* - -The highlight of this release is that the default :ref:`"key" <Organizing Items With -Keys>` of all elements will be their index amongst their neighbors. Previously this -behavior could be engaged by setting ``REACTPY_FEATURE_INDEX_AS_DEFAULT_KEY=1`` when -running ReactPy. In this release though, you will need to explicitly turn off this feature -(i.e. ``=0``) to return to the old behavior. With this change, some may notice -additional error logs which warn that: - -.. code-block:: text - - Key not specified for child in list ... - -This is saying is that an element or component which was created in a list does not have -a unique ``key``. For more information on how to mitigate this warning refer to the docs -on :ref:`Organizing Items With Keys`. - -**Closed Issues** - -- Support Starlette Server - :issue:`588` -- Fix unhandled case in module_from_template - :issue:`584` -- Hide "Children" within REACTPY_DEBUG_MODE key warnings - :issue:`562` -- Bug in Element Key Identity - :issue:`556` -- Add iFrame to reactpy.html - :issue:`542` -- Create a use_linked_inputs widget instead of Input - :issue:`475` -- React warning from module_from_template - :issue:`440` -- Use Index as Default Key - :issue:`351` - -**Pull Requests** - -- add ``use_linked_inputs`` - :pull:`593` -- add starlette server implementation - :pull:`590` -- Log on web module replacement instead of error - :pull:`586` -- Make Index Default Key - :pull:`579` -- reduce log spam from missing keys in children - :pull:`564` -- fix bug in element key identity - :pull:`563` -- add more standard html elements - :pull:`554` - - -v0.34.0 -------- -:octicon:`milestone` *released on 2021-12-16* - -This release contains a variety of minor fixes and improvements which came out of -rewriting the documentation. The most significant of these changes is the remove of -target element attributes from the top-level of event data dictionaries. For example, -instead of being able to find the value of an input at ``event["value"]`` it will -instead be found at ``event["target"]["value"]``. For a short period we will issue a -:class:`DeprecationWarning` when target attributes are requested at the top-level of the -event dictionary. As part of this change we also add ``event["currentTarget"]`` and -``event["relatedTarget"]`` keys to the event dictionary as well as a -``event[some_target]["boundingClientRect"]`` where ``some_target`` may be ``"target"``, -``"currentTarget"`` or ``"relatedTarget"``. - -**Closed Issues** - -- Move target attributes to ``event['target']`` - :issue:`548` - -**Pull Requests** - -- Correctly Handle Target Event Data - :pull:`550` -- Clean up WS console logging - :pull:`522` -- automatically infer closure arguments - :pull:`520` -- Documentation Rewrite - :pull:`519` -- add option to replace existing when creating a module - :pull:`516` - - -v0.33.3 -------- -:octicon:`milestone` *released on 2021-10-08* - -Contains a small number of bug fixes and improvements. The most significant change is -the addition of a warning stating that `REACTPY_FEATURE_INDEX_AS_DEFAULT_KEY=1` will become -the default in a future release. Beyond that, a lesser improvement makes it possible to -use the default export from a Javascript module when calling `module_from_template` by -specifying `exports_default=True` as a parameter. A - -**Closed Issues** - -- Memory leak in SharedClientStateServer - :issue:`511` -- Cannot use default export in react template - :issue:`502` -- Add warning that element index will be used as the default key in a future release - :issue:`428` - -**Pull Requests** - -- warn that REACTPY_FEATURE_INDEX_AS_DEFAULT_KEY=1 will be the default - :pull:`515` -- clean up patch queues after exit - :pull:`514` -- Remove Reconnecting WS alert - :pull:`513` -- Fix 502 - :pull:`503` - - -v0.33.2 -------- -:octicon:`milestone` *released on 2021-09-05* - -A release to fix a memory leak caused by event handlers that were not being removed -when components updated. - -**Closed Issues** - -- Non-root component event handlers cause memory leaks - :issue:`510` - - -v0.33.1 -------- -:octicon:`milestone` *released on 2021-09-02* - -A hot fix for a regression introduced in ``0.33.0`` where the root element of the layout -could not be updated. See :issue:`498` for more info. A regression test for this will -be introduced in a future release. - -**Pull Requests** - -- Fix 498 pt1 - :pull:`501` - - -v0.33.0 -------- -:octicon:`milestone` *released on 2021-09-02* - -The most significant fix in this release is for a regression which manifested in -:issue:`480`, :issue:`489`, and :issue:`451` which resulted from an issue in the way -JSON patches were being applied client-side. This was ultimately resolved by -:pull:`490`. While it's difficult to test this without a more thorough Javascript -suite, we added a test that should hopefully catch this in the future by proxy. - -The most important breaking change, is yet another which modifies the Custom Javascript -Component interface. We now add a ``create()`` function to the ``bind()`` interface that -allows ReactPy's client to recursively create components from that (and only that) import -source. Prior to this, the interface was given unrendered models for child elements. The -imported module was then responsible for rendering them. This placed a large burden on -the author to understand how to handle these unrendered child models. In addition, in -the React template used by ``module_from_template`` we needed to import a version of -``@reactpy/client`` from the CDN - this had already caused some issues where the -template required a version of ``@reactpy/client`` in the which had not been released -yet. - -**Closed Issues** - -- Client-side error in mount-01d35dc3.js - :issue:`489` -- Style Cannot Be Updated - :issue:`480` -- Displaying error messages in the client via `__error__` tag can leak secrets - :issue:`454` -- Examples broken in docs - :issue:`451` -- Rework docs landing page - :issue:`446` -- eventHandlers should be a mapping of generic callables - :issue:`423` -- Allow customization of built-in ReactPy client - :issue:`253` - -**Pull Requests** - -- move VdomDict and VdomJson to proto - :pull:`492` -- only send error info in debug mode - :pull:`491` -- correctly apply client-side JSON patch - :pull:`490` -- add script to set version of all packages in ReactPy - :pull:`483` -- Pass import source to bind - :pull:`482` -- Do not mutate client-side model - :pull:`481` -- assume import source children come from same source - :pull:`479` -- make an EventHandlerType protocol - :pull:`476` -- Update issue form - :pull:`471` - - -v0.32.0 -------- -:octicon:`milestone` *released on 2021-08-20* - -In addition to a variety of bug fixes and other minor improvements, there's a breaking -change to the custom component interface - instead of exporting multiple functions that -render custom components, we simply expect a single ``bind()`` function. -binding function then must return an object with a ``render()`` and ``unmount()`` -function. This change was made in order to better support the rendering of child models. -See :ref:`Custom JavaScript Components` for details on the new interface. - -**Closed Issues** - -- Docs broken on Firefox - :issue:`469` -- URL resolution for web modules does not consider urls starting with / - :issue:`460` -- Query params in package name for module_from_template not stripped - :issue:`455` -- Make docs section margins larger - :issue:`450` -- Search broken in docs - :issue:`443` -- Move src/reactpy/client out of Python package - :issue:`429` -- Use composition instead of classes async with Layout and LifeCycleHook - :issue:`412` -- Remove Python language extension - :issue:`282` -- Add keys to models so React doesn't complain of child arrays requiring them - - :issue:`255` -- Fix binder link in docs - :issue:`231` - -**Pull Requests** - -- Update issue form - :pull:`471` -- improve heading legibility - :pull:`470` -- fix search in docs by upgrading sphinx - :pull:`462` -- rework custom component interface with bind() func - :pull:`458` -- parse package as url path in module_from_template - :pull:`456` -- add file extensions to import - :pull:`439` -- fix key warnings - :pull:`438` -- fix #429 - move client JS to top of src/ dir - :pull:`430` - - -v0.31.0 -------- -:octicon:`milestone` *released on 2021-07-14* - -The :class:`~reactpy.core.layout.Layout` is now a prototype, and ``Layout.update`` is no -longer a public API. This is combined with a much more significant refactor of the -underlying rendering logic. - -The biggest issue that has been resolved relates to the relationship between -:class:`~reactpy.core.hooks.LifeCycleHook` and ``Layout``. Previously, the -``LifeCycleHook`` accepted a layout instance in its constructor and called -``Layout.update``. Additionally, the ``Layout`` would manipulate the -``LifeCycleHook.component`` attribute whenever the component instance changed after a -render. The former behavior leads to a non-linear code path that's a touch to follow. -The latter behavior is the most egregious design issue since there's absolutely no local -indication that the component instance can be swapped out (not even a comment). - -The new refactor no longer binds component or layout instances to a ``LifeCycleHook``. -Instead, the hook simply receives an un-parametrized callback that can be triggered to -schedule a render. While some error logs lose clarity (since we can't say what component -caused them). This change precludes a need for the layout to ever mutate the hook. - -To accommodate this change, the internal representation of the layout's state had to -change. Previously, a class-based approach was take, where methods of the state-holding -classes were meant to handle all use cases. Now we rely much more heavily on very simple -(and mostly static) data structures that have purpose built constructor functions that -much more narrowly address each use case. - -After these refactors, ``ComponentTypes`` no longer needs a unique ``id`` attribute. -Instead, a unique ID is generated internally which is associated with the -``LifeCycleState``, not component instances since they are inherently transient. - -**Pull Requests** - -- fix #419 and #412 - :pull:`422` - - -v0.30.1 -------- -:octicon:`milestone` *released on 2021-07-13* - -Removes the usage of the :func:`id` function for generating unique ideas because there -were situations where the IDs bound to the lifetime of an object are problematic. Also -adds a warning :class:`Deprecation` warning to render functions that include the -parameter ``key``. It's been decided that allowing ``key`` to be used in this way can -lead to confusing bugs. - -**Pull Requests** - -- warn if key is param of component render function - :pull:`421` -- fix :issue:`417` and :issue:`413` - :pull:`418` -- add changelog entry for :ref:`v0.30.0` - :pull:`415` - - -v0.30.0 -------- -:octicon:`milestone` *released on 2021-06-28* - -With recent changes to the custom component interface, it's now possible to remove all -runtime reliance on NPM. Doing so has many virtuous knock-on effects: - -1. Removal of large chunks of code -2. Greatly simplifies how users dynamically experiment with React component libraries, - because their usage no longer requires a build step. Instead they can be loaded in - the browser from a CDN that distributes ESM modules. -3. The built-in client code needs to make fewer assumption about where static resources - are located, and as a result, it's also easier to coordinate the server and client - code. -4. Alternate client implementations benefit from this simplicity. Now, it's possible to - install @reactpy/client normally and write a ``loadImportSource()`` function that - looks for route serving the contents of `REACTPY_WEB_MODULES_DIR.` - -This change includes large breaking changes: - -- The CLI is being removed as it won't be needed any longer -- The `reactpy.client` is being removed in favor of a stripped down ``reactpy.web`` module -- The `REACTPY_CLIENT_BUILD_DIR` config option will no longer exist and a new - ``REACTPY_WEB_MODULES_DIR`` which only contains dynamically linked web modules. While - this new directory's location is configurable, it is meant to be transient and should - not be re-used across sessions. - -The new ``reactpy.web`` module takes a simpler approach to constructing import sources and -expands upon the logic for resolving imports by allowing exports from URLs to be -discovered too. Now, that ReactPy isn't using NPM to dynamically install component -libraries ``reactpy.web`` instead creates JS modules from template files and links them -into ``REACTPY_WEB_MODULES_DIR``. These templates ultimately direct the browser to load the -desired library from a CDN. - -**Pull Requests** - -- Add changelog entry for 0.30.0 - :pull:`415` -- Fix typo in index.rst - :pull:`411` -- Add event handlers docs - :pull:`410` -- Misc doc improvements - :pull:`409` -- Port first ReactPy article to docs - :pull:`408` -- Test build in CI - :pull:`404` -- Remove all runtime reliance on NPM - :pull:`398` - - -v0.29.0 -------- -:octicon:`milestone` *released on 2021-06-20* - -Contains breaking changes, the most significant of which are: - -- Moves the runtime client build directory to a "user data" directory rather a directory - where ReactPy's code was installed. This has the advantage of not requiring write - permissions to rebuild the client if ReactPy was installed globally rather than in a - virtual environment. -- The custom JS component interface has been reworked to expose an API similar to - the ``createElement``, ``render``, ``unmountComponentAtNode`` functions from React. - -**Issues Fixed:** - -- :issue:`375` -- :issue:`394` -- :issue:`401` - -**Highlighted Commits:** - -- add try/except around event handling - :commit:`f2bf589` -- do not call find_builtin_server_type at import time - :commit:`e29745e` -- import default from react/reactDOM/fast-json-patch - :commit:`74c8a34` -- no named exports for react/reactDOM - :commit:`f13bf35` -- debug logs for runtime build dir create/update - :commit:`af94f4e` -- put runtime build in user data dir - :commit:`0af69d2` -- change shared to update_on_change - :commit:`6c09a86` -- rework js module interface + fix docs - :commit:`699cc66` -- correctly serialize File object - :commit:`a2398dc` - - -v0.28.0 -------- -:octicon:`milestone` *released on 2021-06-01* - -Includes a wide variety of improvements: - -- support ``currentTime`` attr of audio/video elements -- support for the ``files`` attribute from the target of input elements -- model children are passed to the Javascript ``mount()`` function -- began to add tests to client-side javascript -- add a ``mountLayoutWithWebSocket`` function to ``@reactpy/client`` - -and breaking changes, the most significant of which are: - -- Refactor existing server implementations as functions adhering to a protocol. This - greatly simplified much of the code responsible for setting up servers and avoids - the use of inheritance. -- Switch to a monorepo-style structure for Javascript enabling a greater separation of - concerns and common workspace scripts in ``package.json``. -- Use a ``loadImportSource()`` function instead of trying to infer the path to dynamic - modules which was brittle and inflexible. Allowing the specific client implementation - to discover where "import sources" are located means ``@reactpy/client`` doesn't - need to try and devise a solution that will work for all cases. The fallout from this - change is the addition of `importSource.sourceType` which, for the moment can either - be ``"NAME"`` or ``"URL"`` where the former indicates the client is expected to know - where to find a module of that name, and the latter should (usually) be passed on to - ``import()`` - - -**Issues Fixed:** - -- :issue:`324` (partially resolved) -- :issue:`375` - -**Highlighted Commits:** - -- xfail due to bug in Python - :commit:`fee49a7` -- add importSource sourceType field - :commit:`795bf94` -- refactor client to use loadImportSource param - :commit:`bb5e3f3` -- turn app into a package - :commit:`b282fc2` -- add debug logs - :commit:`4b4f9b7` -- add basic docs about JS test suite - :commit:`9ecfde5` -- only use nox for python tests - :commit:`5056b7b` -- test event serialization - :commit:`05fd86c` -- serialize files attribute of file input element - :commit:`f0d00b7` -- rename hasMount to exportsMount - :commit:`d55a28f` -- refactor flask - :commit:`94681b6` -- refactor tornado + misc fixes to sanic/fastapi - :commit:`16c9209` -- refactor fastapi using server protocol - :commit:`0cc03ba` -- refactor sanic server - :commit:`43d4b4f` -- use server protocol instead of inheritance - :commit:`abe0fde` -- support currentTime attr of audio/video elements - :commit:`975b54a` -- pass children as props to mount() - :commit:`9494bc0` - - -v0.27.0 -------- -:octicon:`milestone` *released on 2021-05-14* - -Introduces changes to the interface for custom Javascript components. This now allows -JS modules to export a ``mount(element, component, props)`` function which can be used -to bind new elements to the DOM instead of using the application's own React instance -and specifying React as a peer dependency. This avoids a wide variety of potential -issues with implementing custom components and opens up the possibility for a wider -variety of component implementations. - -**Highlighted Commits:** - -- modules with mount func should not have children - :commit:`94d006c` -- limit to flask<2.0 - :commit:`e7c11d0` -- federate modules with mount function - :commit:`bf63a62` - - -v0.26.0 -------- -:octicon:`milestone` *released on 2021-05-07* - -A collection of minor fixes and changes that, as a whole, add up to something requiring -a minor release. The most significant addition is a fix for situations where a -``Layout`` can raise an error when a component whose state has been delete is rendered. -This occurs when element has been unmounted, but a latent event tells the layout it -should be updated. For example, when a user clicks a button rapidly, and the resulting -update deletes the original button. - -**Highlighted Commits:** - -- only one attr dict in vdom constructor - :commit:`555086a` -- remove Option setter/getter with current property - :commit:`2627f79` -- add cli command to show options - :commit:`c9e6869` -- check component has model state before render - :commit:`6a50d56` -- rename daemon to run_in_thread + misc - :commit:`417b687` - - -v0.25.0 -------- -:octicon:`milestone` *released on 2021-04-30* - -Completely refactors layout dispatcher by switching from a class-based approach to one -that leverages pure functions. While the logic itself isn't any simpler, it was easier -to implement, and now hopefully understand, correctly. This conversion was motivated by -several bugs that had cropped up related to improper usage of ``anyio``. - -**Issues Fixed:** - -- :issue:`330` -- :issue:`298` - -**Highlighted Commits:** - -- improve docs + simplify multi-view - :commit:`4129b60` -- require anyio>=3.0 - :commit:`24aed28` -- refactor dispatchers - :commit:`ce8e060` - - -v0.24.0 -------- -:octicon:`milestone` *released on 2021-04-18* - -This release contains an update that allows components and elements to have "identity". -That is, their state can be preserved across updates. Before this point, only the state -for the component at the root of an update was preserved. Now though, the state for any -component and element with a ``key`` that is unique amongst its siblings, will be -preserved so long as this is also true for parent elements/components within the scope -of the current update. Thus, only when the key of the element or component changes will -its state do the same. - -In a future update, the default key for all elements and components will be its index -with respect to its siblings in the layout. The -:attr:`~reactpy.config.REACTPY_FEATURE_INDEX_AS_DEFAULT_KEY` feature flag has been introduced -to allow users to enable this behavior early. - -**Highlighted Commits:** - -- add feature flag for default key behavior - :commit:`42ee01c` -- use unique object instead of index as default key - :commit:`5727ab4` -- make HookCatcher/StaticEventHandlers testing utils - :commit:`1abfd76` -- add element and component identity - :commit:`5548f02` -- minor doc updates - :commit:`e5511d9` -- add tests for callback identity preservation with keys - :commit:`72e03ec` -- add 'key' to VDOM spec - :commit:`c3236fe` -- Rename validate_serialized_vdom to validate_vdom_json - :commit:`d04faf9` -- EventHandler should not serialize itself - :commit:`f7a59f2` -- fix docs typos - :commit:`42b2e20` -- fixes: #331 - add roadmap to docs - :commit:`4226c12` - - -v0.23.1 -------- -:octicon:`milestone` *released on 2021-04-02* - -**Highlighted Commits:** - -- fix non-deterministic return order in install() - :commit:`494d5c2` - - -v0.23.0 -------- -:octicon:`milestone` *released on 2021-04-01* - -**Highlighted Commits:** - -- add changelog to docs - :commit:`9cbfe94` -- automatically reconnect to server - :commit:`3477e2b` -- allow no reconnect in client - :commit:`ef263c2` -- cleaner way to specify import sources - :commit:`ea19a07` -- add the reactpy-react-client back into the main repo - :commit:`5dcc3bb` -- implement fastapi render server - :commit:`94e0620` -- improve docstring for REACTPY_CLIENT_BUILD_DIR - :commit:`962d885` -- cli improvements - :commit:`788fd86` -- rename SERIALIZED_VDOM_JSON_SCHEMA to VDOM_JSON_SCHEMA - :commit:`74ad578` -- better logging for modules - :commit:`39565b9` -- move client utils into private module - :commit:`f825e96` -- redirect BUILD_DIR imports to REACTPY_CLIENT_BUILD_DIR option - :commit:`53fb23b` -- upgrade snowpack - :commit:`5697a2d` -- better logs for reactpy.run + flask server - :commit:`2b34e3d` -- move package to src dir - :commit:`066c9c5` -- reactpy restore uses backup - :commit:`773f78e` diff --git a/docs/source/about/contributor-guide.rst b/docs/source/about/contributor-guide.rst deleted file mode 100644 index b44be9b7e..000000000 --- a/docs/source/about/contributor-guide.rst +++ /dev/null @@ -1,331 +0,0 @@ -Contributor Guide -================= - -.. note:: - - The - `Code of Conduct <https://github.com/reactive-python/reactpy/blob/main/CODE_OF_CONDUCT.md>`__ - applies in all community spaces. If you are not familiar with our Code of Conduct - policy, take a minute to read it before making your first contribution. - -The ReactPy team welcomes contributions and contributors of all kinds - whether they come -as code changes, participation in the discussions, opening issues and pointing out bugs, -or simply sharing your work with your colleagues and friends. We're excited to see how -you can help move this project and community forward! - - -.. _everyone can contribute: - -Everyone Can Contribute! ------------------------- - -Trust us, there's so many ways to support the project. We're always looking for people -who can: - -- Improve our documentation -- Teach and tell others about ReactPy -- Share ideas for new features -- Report bugs -- Participate in general discussions - -Still aren't sure what you have to offer? Just :discussion-type:`ask us <question>` and -we'll help you make your first contribution. - - -Making a Pull Request ---------------------- - -To make your first code contribution to ReactPy, you'll need to install Git_ (or -`Git Bash`_ on Windows). Thankfully there are many helpful -`tutorials <https://github.com/firstcontributions/first-contributions/blob/master/README.md>`__ -about how to get started. To make a change to ReactPy you'll do the following: - -`Fork ReactPy <https://docs.github.com/en/github/getting-started-with-github/fork-a-repo>`__: - Go to `this URL <https://github.com/reactive-python/reactpy>`__ and click the "Fork" button. - -`Clone your fork <https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository>`__: - You use a ``git clone`` command to copy the code from GitHub to your computer. - -`Create a new branch <https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging>`__: - You'll ``git checkout -b your-first-branch`` to create a new space to start your work. - -:ref:`Prepare your Development Environment <Development Environment>`: - We explain in more detail below how to install all ReactPy's dependencies. - -`Push your changes <https://docs.github.com/en/github/using-git/pushing-commits-to-a-remote-repository>`__: - Once you've made changes to ReactPy, you'll ``git push`` them to your fork. - -:ref:`Create a changelog entry <Creating a changelog entry>`: - Record your changes in the :ref:`changelog` so we can publicize them in the next release. - -`Create a Pull Request <https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request>`__: - We'll review your changes, run some :ref:`tests <Running The Tests>` and - :ref:`equality checks <Code Quality Checks>` and, with any luck, accept your request. - At that point your contribution will be merged into the main codebase! - - -Development Environment ------------------------ - -.. note:: - - If you have any questions during set up or development post on our - :discussion-type:`discussion board <question>` and we'll answer them. - -In order to develop ReactPy locally you'll first need to install the following: - -.. list-table:: - :header-rows: 1 - - * - What to Install - - How to Install - - * - Python >= 3.9 - - https://realpython.com/installing-python/ - - * - Hatch - - https://hatch.pypa.io/latest/install/ - - * - Poetry - - https://python-poetry.org/docs/#installation - - * - Git - - https://git-scm.com/book/en/v2/Getting-Started-Installing-Git - - * - NodeJS >= 14 - - https://nodejs.org/en/download/package-manager/ - - * - NPM >= 7.13 - - https://docs.npmjs.com/try-the-latest-stable-version-of-npm - - * - Docker (optional) - - https://docs.docker.com/get-docker/ - -.. note:: - - NodeJS distributes a version of NPM, but you'll want to get the latest - -Once done, you can clone a local copy of this repository: - -.. code-block:: bash - - git clone https://github.com/reactive-python/reactpy.git - cd reactpy - -Then, you should be able to activate your development environment with: - -.. code-block:: bash - - hatch shell - - -Running The Tests ------------------ - -Tests exist for both Python and Javascript. These can be run with the following: - -.. code-block:: bash - - hatch run test-py - hatch run test-js - -If you want to run tests for individual packages you'll need to ``cd`` into the -package directory and run the tests from there. For example, to run the tests just for -the ``reactpy`` package you'd do: - -.. code-block:: bash - - cd src/py/reactpy - hatch run test --headed # run the tests in a browser window - -For Javascript, you'd do: - -.. code-block:: bash - - cd src/js/packages/event-to-object - npm run check:tests - - -Code Quality Checks -------------------- - -Several tools are run on the codebase to help validate its quality. For the most part, -if you set up your :ref:`Development Environment` with pre-commit_ to check your work -before you commit it, then you'll be notified when changes need to be made or, in the -best case, changes will be made automatically for you. - -The following are currently being used: - -- MyPy_ - a static type checker -- Black_ - an opinionated code formatter -- Flake8_ - a style guide enforcement tool -- Ruff_ - An extremely fast Python linter, written in Rust. -- Prettier_ - a tool for automatically formatting various file types -- EsLint_ - A Javascript linter - -The most strict measure of quality enforced on the codebase is 100% test coverage in -Python files. This means that every line of coded added to ReactPy requires a test case -that exercises it. This doesn't prevent all bugs, but it should ensure that we catch the -most common ones. - -If you need help understanding why code you've submitted does not pass these checks, -then be sure to ask, either in the :discussion-type:`Community Forum <question>` or in -your :ref:`Pull Request <Making a Pull Request>`. - -.. note:: - - You can manually run ``hatch run lint --fix`` to auto format your code without - having to do so via ``pre-commit``. However, many IDEs have ways to automatically - format upon saving a file (e.g. - `VSCode <https://code.visualstudio.com/docs/python/editing#_formatting>`__) - - -Building The Documentation --------------------------- - -To build and display the documentation locally run: - -.. code-block:: bash - - hatch run docs - -This will compile the documentation from its source files into HTML, start a web server, -and open a browser to display the now generated documentation. Whenever you change any -source files the web server will automatically rebuild the documentation and refresh the -page. Under the hood this is using -`sphinx-autobuild <https://github.com/executablebooks/sphinx-autobuild>`__. - -To run some of the examples in the documentation as if they were tests run: - -.. code-block:: bash - - hatch run test-docs - -Building the documentation as it's deployed in production requires Docker_. Once you've -installed Docker, you can run: - -.. code-block:: bash - - hatch run docs --docker - -Where you can then navigate to http://localhost:5000.. - - -Creating a Changelog Entry --------------------------- - -As part of your pull request, you'll want to edit the `Changelog -<https://github.com/reactive-python/reactpy/blob/main/docs/source/about/changelog.rst>`__ by -adding an entry describing what you've changed or improved. You should write an entry in -the style of `Keep a Changelog <https://keepachangelog.com/>`__ that falls under one of -the following categories, and add it to the :ref:`Unreleased` section of the changelog: - -- **Added** - for new features. -- **Changed** - for changes in existing functionality. -- **Deprecated** - for soon-to-be removed features. -- **Removed** - for now removed features. -- **Fixed** - for any bug fixes. -- **Documented** - for improvements to this documentation. -- **Security** - in case of vulnerabilities. - -If one of the sections doesn't exist, add it. If it does already, add a bullet point -under the relevant section. Your description should begin with a reference to the -relevant issue or pull request number. Here's a short example of what an unreleased -changelog entry might look like: - -.. code-block:: rst - - Unreleased - ---------- - - **Added** - - - :pull:`123` - A really cool new feature - - **Changed** - - - :pull:`456` - The behavior of some existing feature - - **Fixed** - - - :issue:`789` - Some really bad bug - -.. hint:: - - ``:issue:`` and ``:pull:`` refer to issue and pull request ticket numbers. - - -Release Process ---------------- - -Creating a release for ReactPy involves two steps: - -1. Tagging a version -2. Publishing a release - -To **tag a version** you'll run the following command: - -.. code-block:: bash - - nox -s tag -- <the-new-version> - -Which will update the version for: - -- Python packages -- Javascript packages -- The changelog - -You'll be then prompted to confirm the auto-generated updates before those changes will -be staged, committed, and pushed along with a new tag matching ``<the-new-version>`` -which was specified earlier. - -Lastly, to **publish a release** `create one in GitHub -<https://docs.github.com/en/github/administering-a-repository/releasing-projects-on-github/managing-releases-in-a-repository>`__. -Because we pushed a tag using the command above, there should already be a saved tag you -can target when authoring the release. The release needs a title and description. The -title should simply be the version (same as the tag), and the description should simply -use GitHub's "Auto-generated release notes". - - -Other Core Repositories ------------------------ - -ReactPy depends on, or is used by several other core projects. For documentation on them -you should refer to their respective documentation in the links below: - -- `reactpy-js-component-template - <https://github.com/reactive-python/reactpy-js-component-template>`__ - Template repo - for making :ref:`Custom Javascript Components`. -- `reactpy-flake8 <https://github.com/reactive-python/reactpy-flake8>`__ - Enforces the - :ref:`Rules of Hooks` -- `reactpy-jupyter <https://github.com/reactive-python/reactpy-jupyter>`__ - ReactPy integration for - Jupyter -- `reactpy-dash <https://github.com/reactive-python/reactpy-dash>`__ - ReactPy integration for Plotly - Dash -- `django-reactpy <https://github.com/reactive-python/django-reactpy>`__ - ReactPy integration for - Django - -.. Links -.. ===== - -.. _Google Chrome: https://www.google.com/chrome/ -.. _Docker: https://docs.docker.com/get-docker/ -.. _Git: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git -.. _Git Bash: https://gitforwindows.org/ -.. _NPM: https://www.npmjs.com/get-npm -.. _PyPI: https://pypi.org/project/reactpy -.. _pip: https://pypi.org/project/pip/ -.. _PyTest: pytest <https://docs.pytest.org -.. _Playwright: https://playwright.dev/python/ -.. _React: https://reactjs.org/ -.. _Heroku: https://www.heroku.com/what -.. _GitHub Actions: https://github.com/features/actions -.. _pre-commit: https://pre-commit.com/ -.. _GitHub Flow: https://guides.github.com/introduction/flow/ -.. _MyPy: http://mypy-lang.org/ -.. _Black: https://github.com/psf/black -.. _Flake8: https://flake8.pycqa.org/en/latest/ -.. _Ruff: https://github.com/charliermarsh/ruff -.. _UVU: https://github.com/lukeed/uvu -.. _Prettier: https://prettier.io/ -.. _ESLint: https://eslint.org/ diff --git a/docs/source/about/credits-and-licenses.rst b/docs/source/about/credits-and-licenses.rst deleted file mode 100644 index bc66cb11f..000000000 --- a/docs/source/about/credits-and-licenses.rst +++ /dev/null @@ -1,16 +0,0 @@ -Credits and Licenses -==================== - -Much of this documentation, including its layout and content, was created with heavy -influence from https://reactjs.org which uses the `Creative Commons Attribution 4.0 -International -<https://raw.githubusercontent.com/reactjs/reactjs.org/b2d5613b6ae20855ced7c83067b604034bebbb44/LICENSE-DOCS.md>`__ -license. While many things have been transformed, we paraphrase and, in some places, -copy language or examples where ReactPy's behavior mirrors that of React's. - - -Source Code License -------------------- - -.. literalinclude:: ../../../LICENSE - :language: text diff --git a/docs/source/conf.py b/docs/source/conf.py deleted file mode 100644 index 08addad8d..000000000 --- a/docs/source/conf.py +++ /dev/null @@ -1,330 +0,0 @@ -# -# Configuration file for the Sphinx documentation builder. -# -# This file does only contain a selection of the most common options. For a -# full list see the documentation: -# http://www.sphinx-doc.org/en/master/config - -import sys -from doctest import DONT_ACCEPT_TRUE_FOR_1, ELLIPSIS, NORMALIZE_WHITESPACE -from pathlib import Path - -# -- Path Setup -------------------------------------------------------------- - -THIS_DIR = Path(__file__).parent -ROOT_DIR = THIS_DIR.parent.parent -DOCS_DIR = THIS_DIR.parent - -# extension path -sys.path.insert(0, str(DOCS_DIR)) -sys.path.insert(0, str(THIS_DIR / "_exts")) - - -# -- Project information ----------------------------------------------------- - -project = "ReactPy" -title = "ReactPy" -description = ( - "ReactPy is a Python web framework for building interactive websites without needing " - "a single line of Javascript. It can be run standalone, in a Jupyter Notebook, or " - "as part of an existing application." -) -copyright = "2023, Ryan Morshead" # noqa: A001 -author = "Ryan Morshead" - -# -- Common External Links --------------------------------------------------- - -extlinks = { - "issue": ( - "https://github.com/reactive-python/reactpy/issues/%s", - "#%s", - ), - "pull": ( - "https://github.com/reactive-python/reactpy/pull/%s", - "#%s", - ), - "discussion": ( - "https://github.com/reactive-python/reactpy/discussions/%s", - "#%s", - ), - "discussion-type": ( - "https://github.com/reactive-python/reactpy/discussions/categories/%s", - "%s", - ), - "commit": ( - "https://github.com/reactive-python/reactpy/commit/%s", - "%s", - ), -} -extlinks_detect_hardcoded_links = True - - -# -- General configuration --------------------------------------------------- - -# If your documentatirston needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.intersphinx", - "sphinx.ext.coverage", - "sphinx.ext.viewcode", - "sphinx.ext.napoleon", - "sphinx.ext.extlinks", - # third party extensions - "sphinx_copybutton", - "sphinx_reredirects", - "sphinx_design", - "sphinxext.opengraph", - # custom extensions - "async_doctest", - "autogen_api_docs", - "copy_vdom_json_schema", - "reactpy_view", - "patched_html_translator", - "reactpy_example", - "build_custom_js", - "custom_autosectionlabel", -] - -# Add any paths that contain templates here, relative to this directory. -# templates_path = ["templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = "en" - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = [ - "_custom_js", -] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = None - -# The default language to highlight source code in. -highlight_language = "python3" - -# Controls how sphinx.ext.autodoc represents typehints in the function signature -autodoc_typehints = "description" - -# -- Doc Test Configuration ------------------------------------------------------- - -doctest_default_flags = NORMALIZE_WHITESPACE | ELLIPSIS | DONT_ACCEPT_TRUE_FOR_1 - -# -- Extension Configuration ------------------------------------------------------ - - -# -- sphinx.ext.autosectionlabel --- - -autosectionlabel_skip_docs = ["_auto/apis"] - - -# -- sphinx.ext.autodoc -- - -# show base classes for autodoc -autodoc_default_options = { - "show-inheritance": True, - "member-order": "bysource", -} -# order autodoc members by their order in the source -autodoc_member_order = "bysource" - - -# -- sphinx_reredirects -- - -redirects = { - "package-api": "_autogen/user-apis.html", - "configuration-options": "_autogen/dev-apis.html#configuration-options", - "examples": "creating-interfaces/index.html", -} - - -# -- sphinxext.opengraph -- - -ogp_site_url = "https://reactpy.dev/" -ogp_image = "https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/png/reactpy-logo-landscape-padded.png" -# We manually specify this below -# ogp_description_length = 200 -ogp_type = "website" -ogp_custom_meta_tags = [ - # Open Graph Meta Tags - f'<meta property="og:title" content="{title}">', - f'<meta property="og:description" content="{description}">', - # Twitter Meta Tags - '<meta name="twitter:card" content="summary_large_image">', - '<meta name="twitter:creator" content="@rmorshea">', - '<meta name="twitter:site" content="@rmorshea">', -] - - -# -- Options for HTML output ------------------------------------------------- - -# Set the page title -html_title = title - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "furo" -html_logo = str(ROOT_DIR / "branding" / "svg" / "reactpy-logo-landscape.svg") -html_favicon = str(ROOT_DIR / "branding" / "ico" / "reactpy-logo.ico") - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. - -html_theme_options = { - "light_css_variables": { - # furo - "admonition-title-font-size": "1rem", - "admonition-font-size": "1rem", - # sphinx-design - "sd-color-info": "var(--color-admonition-title-background--note)", - "sd-color-warning": "var(--color-admonition-title-background--warning)", - "sd-color-danger": "var(--color-admonition-title-background--danger)", - "sd-color-info-text": "var(--color-admonition-title--note)", - "sd-color-warning-text": "var(--color-admonition-title--warning)", - "sd-color-danger-text": "var(--color-admonition-title--danger)", - }, -} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# These paths are either relative to html_static_path -# or fully qualified paths (eg. https://...) -css_dir = THIS_DIR / "_static" / "css" -html_css_files = [ - str(p.relative_to(THIS_DIR / "_static")) for p in css_dir.glob("*.css") -] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - - -# -- Options for Sphinx Panels ----------------------------------------------- - -panels_css_variables = { - "tabs-color-label-active": "rgb(106, 176, 221)", - "tabs-color-label-inactive": "rgb(201, 225, 250)", - "tabs-color-overline": "rgb(201, 225, 250)", - "tabs-color-underline": "rgb(201, 225, 250)", -} - -# -- Options for HTMLHelp output --------------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "ReactPydoc" - - -# -- Options for LaTeX output ------------------------------------------------ - -# latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -# -# 'papersize': 'letterpaper', -# The font size ('10pt', '11pt' or '12pt'). -# -# 'pointsize': '10pt', -# Additional stuff for the LaTeX preamble. -# -# 'preamble': '', -# Latex figure (float) alignment -# -# 'figure_align': 'htbp', -# } - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [(master_doc, "ReactPy.tex", html_title, "Ryan Morshead", "manual")] - - -# -- Options for manual page output ------------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "reactpy", html_title, [author], 1)] - - -# -- Options for Texinfo output ---------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "ReactPy", - html_title, - author, - "ReactPy", - "One line description of project.", - "Miscellaneous", - ) -] - -# -- Options for Sphinx-Autodoc-Typehints output ------------------------------------------------- - -set_type_checking_flag = False - -# -- Options for Epub output ------------------------------------------------- - -# Bibliographic Dublin Core info. -epub_title = project - -# The unique identifier of the text. This can be a ISBN number -# or the project homepage. -# -# epub_identifier = '' - -# A unique identification for the text. -# -# epub_uid = '' - -# A list of files that should not be packed into the epub file. -epub_exclude_files = ["search.html"] - -# -- Options for intersphinx extension --------------------------------------- - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = { - "python": ("https://docs.python.org/3", None), - "pyalect": ("https://pyalect.readthedocs.io/en/latest", None), - "sanic": ("https://sanic.readthedocs.io/en/latest/", None), - "tornado": ("https://www.tornadoweb.org/en/stable/", None), - "flask": ("https://flask.palletsprojects.com/en/1.1.x/", None), -} - -# -- Options for todo extension ---------------------------------------------- - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True diff --git a/docs/source/guides/adding-interactivity/components-with-state/_examples/adding_state_variable/data.json b/docs/source/guides/adding-interactivity/components-with-state/_examples/adding_state_variable/data.json deleted file mode 100644 index b1315912d..000000000 --- a/docs/source/guides/adding-interactivity/components-with-state/_examples/adding_state_variable/data.json +++ /dev/null @@ -1,72 +0,0 @@ -[ - { - "name": "Homenaje a la Neurocirugía", - "artist": "Marta Colvin Andrade", - "description": "Although Colvin is predominantly known for abstract themes that allude to pre-Hispanic symbols, this gigantic sculpture, an homage to neurosurgery, is one of her most recognizable public art pieces.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Homenaje_a_la_Neurocirug%C3%ADa%2C_Instituto_de_Neurocirug%C3%ADa%2C_Providencia%2C_Santiago_20200106_02.jpg/1024px-Homenaje_a_la_Neurocirug%C3%ADa%2C_Instituto_de_Neurocirug%C3%ADa%2C_Providencia%2C_Santiago_20200106_02.jpg", - "alt": "A bronze statue of two crossed hands delicately holding a human brain in their fingertips." - }, - { - "name": "Eternal Presence", - "artist": "John Woodrow Wilson", - "description": "Wilson was known for his preoccupation with equality, social justice, as well as the essential and spiritual qualities of humankind. This massive (7ft. or 2,13m) bronze represents what he described as \"a symbolic Black presence infused with a sense of universal humanity.\"", - "url": "https://upload.wikimedia.org/wikipedia/commons/6/6f/Chicago%2C_Illinois_Eternal_Silence1_crop.jpg", - "alt": "The sculpture depicting a human head seems ever-present and solemn. It radiates calm and serenity." - }, - { - "name": "Moai", - "artist": "Unknown Artist", - "description": "Located on the Easter Island, there are 1,000 moai, or extant monumental statues, created by the early Rapa Nui people, which some believe represented deified ancestors.", - "url": "https://upload.wikimedia.org/wikipedia/commons/5/50/AhuTongariki.JPG", - "alt": "Three monumental stone busts with the heads that are disproportionately large with somber faces." - }, - { - "name": "Blue Nana", - "artist": "Niki de Saint Phalle", - "description": "The Nanas are triumphant creatures, symbols of femininity and maternity. Initially, Saint Phalle used fabric and found objects for the Nanas, and later on introduced polyester to achieve a more vibrant effect.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Blue_Nana_-_panoramio.jpg/1024px-Blue_Nana_-_panoramio.jpg", - "alt": "A large mosaic sculpture of a whimsical dancing female figure in a colorful costume emanating joy." - }, - { - "name": "Cavaliere", - "artist": "Lamidi Olonade Fakeye", - "description": "Descended from four generations of woodcarvers, Fakeye's work blended traditional and contemporary Yoruba themes.", - "url": "https://upload.wikimedia.org/wikipedia/commons/3/34/Nigeria%2C_lamidi_olonade_fakeye%2C_cavaliere%2C_1992.jpg", - "alt": "An intricate wood sculpture of a warrior with a focused face on a horse adorned with patterns." - }, - { - "name": "Big Bellies", - "artist": "Alina Szapocznikow", - "description": "Szapocznikow is known for her sculptures of the fragmented body as a metaphor for the fragility and impermanence of youth and beauty. This sculpture depicts two very realistic large bellies stacked on top of each other, each around five feet (1,5m) tall.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/KMM_Szapocznikow.JPG/200px-KMM_Szapocznikow.JPG", - "alt": "The sculpture reminds a cascade of folds, quite different from bellies in classical sculptures." - }, - { - "name": "Terracotta Army", - "artist": "Unknown Artist", - "description": "The Terracotta Army is a collection of terracotta sculptures depicting the armies of Qin Shi Huang, the first Emperor of China. The army consisted of more than 8,000 soldiers, 130 chariots with 520 horses, and 150 cavalry horses.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/2015-09-22-081415_-_Terrakotta-Armee%2C_Grosse_Halle.jpg/1920px-2015-09-22-081415_-_Terrakotta-Armee%2C_Grosse_Halle.jpg", - "alt": "12 terracotta sculptures of solemn warriors, each with a unique facial expression and armor." - }, - { - "name": "Lunar Landscape", - "artist": "Louise Nevelson", - "description": "Nevelson was known for scavenging objects from New York City debris, which she would later assemble into monumental constructions. In this one, she used disparate parts like a bedpost, juggling pin, and seat fragment, nailing and gluing them into boxes that reflect the influence of Cubism’s geometric abstraction of space and form.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/72/1999-3-A--J_s.jpg/220px-1999-3-A--J_s.jpg", - "alt": "A black matte sculpture where the individual elements are initially indistinguishable." - }, - { - "name": "Aureole", - "artist": "Ranjani Shettar", - "description": "Shettar merges the traditional and the modern, the natural and the industrial. Her art focuses on the relationship between man and nature. Her work was described as compelling both abstractly and figuratively, gravity defying, and a \"fine synthesis of unlikely materials.\"", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Shettar-_5854-sm_%285132866765%29.jpg/399px-Shettar-_5854-sm_%285132866765%29.jpg", - "alt": "A pale wire-like sculpture mounted on concrete wall and descending on the floor. It appears light." - }, - { - "name": "Hippos", - "artist": "Taipei Zoo", - "description": "The Taipei Zoo commissioned a Hippo Square featuring submerged hippos at play.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Hippo_sculpture_Taipei_Zoo_20543.jpg/250px-Hippo_sculpture_Taipei_Zoo_20543.jpg", - "alt": "A group of bronze hippo sculptures emerging from the sett sidewalk as if they were swimming." - } -] diff --git a/docs/source/guides/adding-interactivity/components-with-state/_examples/adding_state_variable/main.py b/docs/source/guides/adding-interactivity/components-with-state/_examples/adding_state_variable/main.py deleted file mode 100644 index a919a2354..000000000 --- a/docs/source/guides/adding-interactivity/components-with-state/_examples/adding_state_variable/main.py +++ /dev/null @@ -1,35 +0,0 @@ -import json -from pathlib import Path - -from reactpy import component, hooks, html, run - -HERE = Path(__file__) -DATA_PATH = HERE.parent / "data.json" -sculpture_data = json.loads(DATA_PATH.read_text()) - - -@component -def Gallery(): - index, set_index = hooks.use_state(0) - - def handle_click(event): - set_index(index + 1) - - bounded_index = index % len(sculpture_data) - sculpture = sculpture_data[bounded_index] - alt = sculpture["alt"] - artist = sculpture["artist"] - description = sculpture["description"] - name = sculpture["name"] - url = sculpture["url"] - - return html.div( - html.button({"on_click": handle_click}, "Next"), - html.h2(name, " by ", artist), - html.p(f"({bounded_index + 1} of {len(sculpture_data)})"), - html.img({"src": url, "alt": alt, "style": {"height": "200px"}}), - html.p(description), - ) - - -run(Gallery) diff --git a/docs/source/guides/adding-interactivity/components-with-state/_examples/isolated_state/data.json b/docs/source/guides/adding-interactivity/components-with-state/_examples/isolated_state/data.json deleted file mode 100644 index b1315912d..000000000 --- a/docs/source/guides/adding-interactivity/components-with-state/_examples/isolated_state/data.json +++ /dev/null @@ -1,72 +0,0 @@ -[ - { - "name": "Homenaje a la Neurocirugía", - "artist": "Marta Colvin Andrade", - "description": "Although Colvin is predominantly known for abstract themes that allude to pre-Hispanic symbols, this gigantic sculpture, an homage to neurosurgery, is one of her most recognizable public art pieces.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Homenaje_a_la_Neurocirug%C3%ADa%2C_Instituto_de_Neurocirug%C3%ADa%2C_Providencia%2C_Santiago_20200106_02.jpg/1024px-Homenaje_a_la_Neurocirug%C3%ADa%2C_Instituto_de_Neurocirug%C3%ADa%2C_Providencia%2C_Santiago_20200106_02.jpg", - "alt": "A bronze statue of two crossed hands delicately holding a human brain in their fingertips." - }, - { - "name": "Eternal Presence", - "artist": "John Woodrow Wilson", - "description": "Wilson was known for his preoccupation with equality, social justice, as well as the essential and spiritual qualities of humankind. This massive (7ft. or 2,13m) bronze represents what he described as \"a symbolic Black presence infused with a sense of universal humanity.\"", - "url": "https://upload.wikimedia.org/wikipedia/commons/6/6f/Chicago%2C_Illinois_Eternal_Silence1_crop.jpg", - "alt": "The sculpture depicting a human head seems ever-present and solemn. It radiates calm and serenity." - }, - { - "name": "Moai", - "artist": "Unknown Artist", - "description": "Located on the Easter Island, there are 1,000 moai, or extant monumental statues, created by the early Rapa Nui people, which some believe represented deified ancestors.", - "url": "https://upload.wikimedia.org/wikipedia/commons/5/50/AhuTongariki.JPG", - "alt": "Three monumental stone busts with the heads that are disproportionately large with somber faces." - }, - { - "name": "Blue Nana", - "artist": "Niki de Saint Phalle", - "description": "The Nanas are triumphant creatures, symbols of femininity and maternity. Initially, Saint Phalle used fabric and found objects for the Nanas, and later on introduced polyester to achieve a more vibrant effect.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Blue_Nana_-_panoramio.jpg/1024px-Blue_Nana_-_panoramio.jpg", - "alt": "A large mosaic sculpture of a whimsical dancing female figure in a colorful costume emanating joy." - }, - { - "name": "Cavaliere", - "artist": "Lamidi Olonade Fakeye", - "description": "Descended from four generations of woodcarvers, Fakeye's work blended traditional and contemporary Yoruba themes.", - "url": "https://upload.wikimedia.org/wikipedia/commons/3/34/Nigeria%2C_lamidi_olonade_fakeye%2C_cavaliere%2C_1992.jpg", - "alt": "An intricate wood sculpture of a warrior with a focused face on a horse adorned with patterns." - }, - { - "name": "Big Bellies", - "artist": "Alina Szapocznikow", - "description": "Szapocznikow is known for her sculptures of the fragmented body as a metaphor for the fragility and impermanence of youth and beauty. This sculpture depicts two very realistic large bellies stacked on top of each other, each around five feet (1,5m) tall.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/KMM_Szapocznikow.JPG/200px-KMM_Szapocznikow.JPG", - "alt": "The sculpture reminds a cascade of folds, quite different from bellies in classical sculptures." - }, - { - "name": "Terracotta Army", - "artist": "Unknown Artist", - "description": "The Terracotta Army is a collection of terracotta sculptures depicting the armies of Qin Shi Huang, the first Emperor of China. The army consisted of more than 8,000 soldiers, 130 chariots with 520 horses, and 150 cavalry horses.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/2015-09-22-081415_-_Terrakotta-Armee%2C_Grosse_Halle.jpg/1920px-2015-09-22-081415_-_Terrakotta-Armee%2C_Grosse_Halle.jpg", - "alt": "12 terracotta sculptures of solemn warriors, each with a unique facial expression and armor." - }, - { - "name": "Lunar Landscape", - "artist": "Louise Nevelson", - "description": "Nevelson was known for scavenging objects from New York City debris, which she would later assemble into monumental constructions. In this one, she used disparate parts like a bedpost, juggling pin, and seat fragment, nailing and gluing them into boxes that reflect the influence of Cubism’s geometric abstraction of space and form.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/72/1999-3-A--J_s.jpg/220px-1999-3-A--J_s.jpg", - "alt": "A black matte sculpture where the individual elements are initially indistinguishable." - }, - { - "name": "Aureole", - "artist": "Ranjani Shettar", - "description": "Shettar merges the traditional and the modern, the natural and the industrial. Her art focuses on the relationship between man and nature. Her work was described as compelling both abstractly and figuratively, gravity defying, and a \"fine synthesis of unlikely materials.\"", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Shettar-_5854-sm_%285132866765%29.jpg/399px-Shettar-_5854-sm_%285132866765%29.jpg", - "alt": "A pale wire-like sculpture mounted on concrete wall and descending on the floor. It appears light." - }, - { - "name": "Hippos", - "artist": "Taipei Zoo", - "description": "The Taipei Zoo commissioned a Hippo Square featuring submerged hippos at play.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Hippo_sculpture_Taipei_Zoo_20543.jpg/250px-Hippo_sculpture_Taipei_Zoo_20543.jpg", - "alt": "A group of bronze hippo sculptures emerging from the sett sidewalk as if they were swimming." - } -] diff --git a/docs/source/guides/adding-interactivity/components-with-state/_examples/isolated_state/main.py b/docs/source/guides/adding-interactivity/components-with-state/_examples/isolated_state/main.py deleted file mode 100644 index d07b87140..000000000 --- a/docs/source/guides/adding-interactivity/components-with-state/_examples/isolated_state/main.py +++ /dev/null @@ -1,53 +0,0 @@ -import json -from pathlib import Path - -from reactpy import component, hooks, html, run - -HERE = Path(__file__) -DATA_PATH = HERE.parent / "data.json" -sculpture_data = json.loads(DATA_PATH.read_text()) - - -@component -def Gallery(): - index, set_index = hooks.use_state(0) - show_more, set_show_more = hooks.use_state(False) - - def handle_next_click(event): - set_index(index + 1) - - def handle_more_click(event): - set_show_more(not show_more) - - bounded_index = index % len(sculpture_data) - sculpture = sculpture_data[bounded_index] - alt = sculpture["alt"] - artist = sculpture["artist"] - description = sculpture["description"] - name = sculpture["name"] - url = sculpture["url"] - - return html.div( - html.button({"on_click": handle_next_click}, "Next"), - html.h2(name, " by ", artist), - html.p(f"({bounded_index + 1} or {len(sculpture_data)})"), - html.img({"src": url, "alt": alt, "style": {"height": "200px"}}), - html.div( - html.button( - {"on_click": handle_more_click}, - f"{('Show' if show_more else 'Hide')} details", - ), - (html.p(description) if show_more else ""), - ), - ) - - -@component -def App(): - return html.div( - html.section({"style": {"width": "50%", "float": "left"}}, Gallery()), - html.section({"style": {"width": "50%", "float": "left"}}, Gallery()), - ) - - -run(App) diff --git a/docs/source/guides/adding-interactivity/components-with-state/_examples/multiple_state_variables/data.json b/docs/source/guides/adding-interactivity/components-with-state/_examples/multiple_state_variables/data.json deleted file mode 100644 index b1315912d..000000000 --- a/docs/source/guides/adding-interactivity/components-with-state/_examples/multiple_state_variables/data.json +++ /dev/null @@ -1,72 +0,0 @@ -[ - { - "name": "Homenaje a la Neurocirugía", - "artist": "Marta Colvin Andrade", - "description": "Although Colvin is predominantly known for abstract themes that allude to pre-Hispanic symbols, this gigantic sculpture, an homage to neurosurgery, is one of her most recognizable public art pieces.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Homenaje_a_la_Neurocirug%C3%ADa%2C_Instituto_de_Neurocirug%C3%ADa%2C_Providencia%2C_Santiago_20200106_02.jpg/1024px-Homenaje_a_la_Neurocirug%C3%ADa%2C_Instituto_de_Neurocirug%C3%ADa%2C_Providencia%2C_Santiago_20200106_02.jpg", - "alt": "A bronze statue of two crossed hands delicately holding a human brain in their fingertips." - }, - { - "name": "Eternal Presence", - "artist": "John Woodrow Wilson", - "description": "Wilson was known for his preoccupation with equality, social justice, as well as the essential and spiritual qualities of humankind. This massive (7ft. or 2,13m) bronze represents what he described as \"a symbolic Black presence infused with a sense of universal humanity.\"", - "url": "https://upload.wikimedia.org/wikipedia/commons/6/6f/Chicago%2C_Illinois_Eternal_Silence1_crop.jpg", - "alt": "The sculpture depicting a human head seems ever-present and solemn. It radiates calm and serenity." - }, - { - "name": "Moai", - "artist": "Unknown Artist", - "description": "Located on the Easter Island, there are 1,000 moai, or extant monumental statues, created by the early Rapa Nui people, which some believe represented deified ancestors.", - "url": "https://upload.wikimedia.org/wikipedia/commons/5/50/AhuTongariki.JPG", - "alt": "Three monumental stone busts with the heads that are disproportionately large with somber faces." - }, - { - "name": "Blue Nana", - "artist": "Niki de Saint Phalle", - "description": "The Nanas are triumphant creatures, symbols of femininity and maternity. Initially, Saint Phalle used fabric and found objects for the Nanas, and later on introduced polyester to achieve a more vibrant effect.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Blue_Nana_-_panoramio.jpg/1024px-Blue_Nana_-_panoramio.jpg", - "alt": "A large mosaic sculpture of a whimsical dancing female figure in a colorful costume emanating joy." - }, - { - "name": "Cavaliere", - "artist": "Lamidi Olonade Fakeye", - "description": "Descended from four generations of woodcarvers, Fakeye's work blended traditional and contemporary Yoruba themes.", - "url": "https://upload.wikimedia.org/wikipedia/commons/3/34/Nigeria%2C_lamidi_olonade_fakeye%2C_cavaliere%2C_1992.jpg", - "alt": "An intricate wood sculpture of a warrior with a focused face on a horse adorned with patterns." - }, - { - "name": "Big Bellies", - "artist": "Alina Szapocznikow", - "description": "Szapocznikow is known for her sculptures of the fragmented body as a metaphor for the fragility and impermanence of youth and beauty. This sculpture depicts two very realistic large bellies stacked on top of each other, each around five feet (1,5m) tall.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/KMM_Szapocznikow.JPG/200px-KMM_Szapocznikow.JPG", - "alt": "The sculpture reminds a cascade of folds, quite different from bellies in classical sculptures." - }, - { - "name": "Terracotta Army", - "artist": "Unknown Artist", - "description": "The Terracotta Army is a collection of terracotta sculptures depicting the armies of Qin Shi Huang, the first Emperor of China. The army consisted of more than 8,000 soldiers, 130 chariots with 520 horses, and 150 cavalry horses.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/2015-09-22-081415_-_Terrakotta-Armee%2C_Grosse_Halle.jpg/1920px-2015-09-22-081415_-_Terrakotta-Armee%2C_Grosse_Halle.jpg", - "alt": "12 terracotta sculptures of solemn warriors, each with a unique facial expression and armor." - }, - { - "name": "Lunar Landscape", - "artist": "Louise Nevelson", - "description": "Nevelson was known for scavenging objects from New York City debris, which she would later assemble into monumental constructions. In this one, she used disparate parts like a bedpost, juggling pin, and seat fragment, nailing and gluing them into boxes that reflect the influence of Cubism’s geometric abstraction of space and form.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/72/1999-3-A--J_s.jpg/220px-1999-3-A--J_s.jpg", - "alt": "A black matte sculpture where the individual elements are initially indistinguishable." - }, - { - "name": "Aureole", - "artist": "Ranjani Shettar", - "description": "Shettar merges the traditional and the modern, the natural and the industrial. Her art focuses on the relationship between man and nature. Her work was described as compelling both abstractly and figuratively, gravity defying, and a \"fine synthesis of unlikely materials.\"", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Shettar-_5854-sm_%285132866765%29.jpg/399px-Shettar-_5854-sm_%285132866765%29.jpg", - "alt": "A pale wire-like sculpture mounted on concrete wall and descending on the floor. It appears light." - }, - { - "name": "Hippos", - "artist": "Taipei Zoo", - "description": "The Taipei Zoo commissioned a Hippo Square featuring submerged hippos at play.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Hippo_sculpture_Taipei_Zoo_20543.jpg/250px-Hippo_sculpture_Taipei_Zoo_20543.jpg", - "alt": "A group of bronze hippo sculptures emerging from the sett sidewalk as if they were swimming." - } -] diff --git a/docs/source/guides/adding-interactivity/components-with-state/_examples/multiple_state_variables/main.py b/docs/source/guides/adding-interactivity/components-with-state/_examples/multiple_state_variables/main.py deleted file mode 100644 index 87f9651be..000000000 --- a/docs/source/guides/adding-interactivity/components-with-state/_examples/multiple_state_variables/main.py +++ /dev/null @@ -1,45 +0,0 @@ -import json -from pathlib import Path - -from reactpy import component, hooks, html, run - -HERE = Path(__file__) -DATA_PATH = HERE.parent / "data.json" -sculpture_data = json.loads(DATA_PATH.read_text()) - - -@component -def Gallery(): - index, set_index = hooks.use_state(0) - show_more, set_show_more = hooks.use_state(False) - - def handle_next_click(event): - set_index(index + 1) - - def handle_more_click(event): - set_show_more(not show_more) - - bounded_index = index % len(sculpture_data) - sculpture = sculpture_data[bounded_index] - alt = sculpture["alt"] - artist = sculpture["artist"] - description = sculpture["description"] - name = sculpture["name"] - url = sculpture["url"] - - return html.div( - html.button({"on_click": handle_next_click}, "Next"), - html.h2(name, " by ", artist), - html.p(f"({bounded_index + 1} or {len(sculpture_data)})"), - html.img({"src": url, "alt": alt, "style": {"height": "200px"}}), - html.div( - html.button( - {"on_click": handle_more_click}, - f"{('Show' if show_more else 'Hide')} details", - ), - (html.p(description) if show_more else ""), - ), - ) - - -run(Gallery) diff --git a/docs/source/guides/adding-interactivity/components-with-state/_examples/when_variables_are_not_enough/data.json b/docs/source/guides/adding-interactivity/components-with-state/_examples/when_variables_are_not_enough/data.json deleted file mode 100644 index b1315912d..000000000 --- a/docs/source/guides/adding-interactivity/components-with-state/_examples/when_variables_are_not_enough/data.json +++ /dev/null @@ -1,72 +0,0 @@ -[ - { - "name": "Homenaje a la Neurocirugía", - "artist": "Marta Colvin Andrade", - "description": "Although Colvin is predominantly known for abstract themes that allude to pre-Hispanic symbols, this gigantic sculpture, an homage to neurosurgery, is one of her most recognizable public art pieces.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Homenaje_a_la_Neurocirug%C3%ADa%2C_Instituto_de_Neurocirug%C3%ADa%2C_Providencia%2C_Santiago_20200106_02.jpg/1024px-Homenaje_a_la_Neurocirug%C3%ADa%2C_Instituto_de_Neurocirug%C3%ADa%2C_Providencia%2C_Santiago_20200106_02.jpg", - "alt": "A bronze statue of two crossed hands delicately holding a human brain in their fingertips." - }, - { - "name": "Eternal Presence", - "artist": "John Woodrow Wilson", - "description": "Wilson was known for his preoccupation with equality, social justice, as well as the essential and spiritual qualities of humankind. This massive (7ft. or 2,13m) bronze represents what he described as \"a symbolic Black presence infused with a sense of universal humanity.\"", - "url": "https://upload.wikimedia.org/wikipedia/commons/6/6f/Chicago%2C_Illinois_Eternal_Silence1_crop.jpg", - "alt": "The sculpture depicting a human head seems ever-present and solemn. It radiates calm and serenity." - }, - { - "name": "Moai", - "artist": "Unknown Artist", - "description": "Located on the Easter Island, there are 1,000 moai, or extant monumental statues, created by the early Rapa Nui people, which some believe represented deified ancestors.", - "url": "https://upload.wikimedia.org/wikipedia/commons/5/50/AhuTongariki.JPG", - "alt": "Three monumental stone busts with the heads that are disproportionately large with somber faces." - }, - { - "name": "Blue Nana", - "artist": "Niki de Saint Phalle", - "description": "The Nanas are triumphant creatures, symbols of femininity and maternity. Initially, Saint Phalle used fabric and found objects for the Nanas, and later on introduced polyester to achieve a more vibrant effect.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Blue_Nana_-_panoramio.jpg/1024px-Blue_Nana_-_panoramio.jpg", - "alt": "A large mosaic sculpture of a whimsical dancing female figure in a colorful costume emanating joy." - }, - { - "name": "Cavaliere", - "artist": "Lamidi Olonade Fakeye", - "description": "Descended from four generations of woodcarvers, Fakeye's work blended traditional and contemporary Yoruba themes.", - "url": "https://upload.wikimedia.org/wikipedia/commons/3/34/Nigeria%2C_lamidi_olonade_fakeye%2C_cavaliere%2C_1992.jpg", - "alt": "An intricate wood sculpture of a warrior with a focused face on a horse adorned with patterns." - }, - { - "name": "Big Bellies", - "artist": "Alina Szapocznikow", - "description": "Szapocznikow is known for her sculptures of the fragmented body as a metaphor for the fragility and impermanence of youth and beauty. This sculpture depicts two very realistic large bellies stacked on top of each other, each around five feet (1,5m) tall.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/KMM_Szapocznikow.JPG/200px-KMM_Szapocznikow.JPG", - "alt": "The sculpture reminds a cascade of folds, quite different from bellies in classical sculptures." - }, - { - "name": "Terracotta Army", - "artist": "Unknown Artist", - "description": "The Terracotta Army is a collection of terracotta sculptures depicting the armies of Qin Shi Huang, the first Emperor of China. The army consisted of more than 8,000 soldiers, 130 chariots with 520 horses, and 150 cavalry horses.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/2015-09-22-081415_-_Terrakotta-Armee%2C_Grosse_Halle.jpg/1920px-2015-09-22-081415_-_Terrakotta-Armee%2C_Grosse_Halle.jpg", - "alt": "12 terracotta sculptures of solemn warriors, each with a unique facial expression and armor." - }, - { - "name": "Lunar Landscape", - "artist": "Louise Nevelson", - "description": "Nevelson was known for scavenging objects from New York City debris, which she would later assemble into monumental constructions. In this one, she used disparate parts like a bedpost, juggling pin, and seat fragment, nailing and gluing them into boxes that reflect the influence of Cubism’s geometric abstraction of space and form.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/72/1999-3-A--J_s.jpg/220px-1999-3-A--J_s.jpg", - "alt": "A black matte sculpture where the individual elements are initially indistinguishable." - }, - { - "name": "Aureole", - "artist": "Ranjani Shettar", - "description": "Shettar merges the traditional and the modern, the natural and the industrial. Her art focuses on the relationship between man and nature. Her work was described as compelling both abstractly and figuratively, gravity defying, and a \"fine synthesis of unlikely materials.\"", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Shettar-_5854-sm_%285132866765%29.jpg/399px-Shettar-_5854-sm_%285132866765%29.jpg", - "alt": "A pale wire-like sculpture mounted on concrete wall and descending on the floor. It appears light." - }, - { - "name": "Hippos", - "artist": "Taipei Zoo", - "description": "The Taipei Zoo commissioned a Hippo Square featuring submerged hippos at play.", - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/Hippo_sculpture_Taipei_Zoo_20543.jpg/250px-Hippo_sculpture_Taipei_Zoo_20543.jpg", - "alt": "A group of bronze hippo sculptures emerging from the sett sidewalk as if they were swimming." - } -] diff --git a/docs/source/guides/adding-interactivity/components-with-state/_examples/when_variables_are_not_enough/main.py b/docs/source/guides/adding-interactivity/components-with-state/_examples/when_variables_are_not_enough/main.py deleted file mode 100644 index c617586de..000000000 --- a/docs/source/guides/adding-interactivity/components-with-state/_examples/when_variables_are_not_enough/main.py +++ /dev/null @@ -1,42 +0,0 @@ -# flake8: noqa -# errors F841,F823 for `index = index + 1` inside the closure - -# :lines: 7- -# :linenos: - -import json -from pathlib import Path - -from reactpy import component, html, run - - -HERE = Path(__file__) -DATA_PATH = HERE.parent / "data.json" -sculpture_data = json.loads(DATA_PATH.read_text()) - - -@component -def Gallery(): - index = 0 - - def handle_click(event): - index = index + 1 - - bounded_index = index % len(sculpture_data) - sculpture = sculpture_data[bounded_index] - alt = sculpture["alt"] - artist = sculpture["artist"] - description = sculpture["description"] - name = sculpture["name"] - url = sculpture["url"] - - return html.div( - html.button({"on_click": handle_click}, "Next"), - html.h2(name, " by ", artist), - html.p(f"({bounded_index + 1} or {len(sculpture_data)})"), - html.img({"src": url, "alt": alt, "style": {"height": "200px"}}), - html.p(description), - ) - - -run(Gallery) diff --git a/docs/source/guides/adding-interactivity/components-with-state/index.rst b/docs/source/guides/adding-interactivity/components-with-state/index.rst deleted file mode 100644 index f8235ac0d..000000000 --- a/docs/source/guides/adding-interactivity/components-with-state/index.rst +++ /dev/null @@ -1,351 +0,0 @@ -Components With State -===================== - -Components often need to change what’s on the screen as a result of an interaction. For -example, typing into the form should update the input field, clicking “next” on an image -carousel should change which image is displayed, clicking “buy” should put a product in -the shopping cart. Components need to “remember” things like the current input value, -the current image, the shopping cart. In ReactPy, this kind of component-specific memory is -called state. - - -When Variables Aren't Enough ----------------------------- - -Below is a gallery of images about sculpture. Clicking the "Next" button should -increment the ``index`` and, as a result, change what image is displayed. However, this -does not work: - -.. reactpy:: _examples/when_variables_are_not_enough - -.. note:: - - Try clicking the button to see that it does not cause a change. - -After clicking "Next", if you check your web server's logs, you'll discover an -``UnboundLocalError`` error. It turns out that in this case, the ``index = index + 1`` -statement is similar to `trying to set global variables -<https://stackoverflow.com/questions/9264763/dont-understand-why-unboundlocalerror-occurs-closure>`__. -Technically there's a way to `fix this error -<https://docs.python.org/3/reference/simple_stmts.html#nonlocal>`__, but even if we did, -that still wouldn't fix the underlying problems: - -1. **Local variables do not persist across component renders** - when a component is - updated, its associated function gets called again. That is, it renders. As a result, - all the local state that was created the last time the function was called gets - destroyed when it updates. - -2. **Changes to local variables do not cause components to re-render** - there's no way - for ReactPy to observe when these variables change. Thus ReactPy is not aware that - something has changed and that a re-render should take place. - -To address these problems, ReactPy provides the :func:`~reactpy.core.hooks.use_state` "hook" -which provides: - -1. A **state variable** whose data is retained across renders. - -2. A **state setter** function that can be used to update that variable and trigger a - render. - - -Adding State to Components --------------------------- - -To create a state variable and state setter with :func:`~reactpy.core.hooks.use_state` hook -as described above, we'll begin by importing it: - -.. testcode:: - - from reactpy import use_state - -Then we'll make the following changes to our code :ref:`from before <When Variables -Aren't Enough>`: - -.. code-block:: diff - - - index = 0 - + index, set_index = use_state - - def handle_click(event): - - index = index + 1 - + set_index(index + 1) - -After making those changes we should get: - -.. code-block:: - :linenos: - :lineno-start: 14 - - index, set_index = use_state(0) - - def handle_click(event): - set_index(index + 1) - -We'll talk more about what this is doing :ref:`shortly <your first hook>`, but for -now let's just verify that this does in fact fix the problems from before: - -.. reactpy:: _examples/adding_state_variable - - -Your First Hook ---------------- - -In ReactPy, ``use_state``, as well as any other function whose name starts with ``use``, is -called a "hook". These are special functions that should only be called while ReactPy is -:ref:`rendering <the rendering process>`. They let you "hook into" the different -capabilities of ReactPy's components of which ``use_state`` is just one (well get into the -other :ref:`later <managing state>`). - -While hooks are just normal functions, but it's helpful to think of them as -:ref:`unconditioned <rules of hooks>` declarations about a component's needs. In other -words, you'll "use" hooks at the top of your component in the same way you might -"import" modules at the top of your Python files. - - -.. _Introduction to use_state: - -Introduction to ``use_state`` ------------------------------ - -When you call :func:`~reactpy.core.hooks.use_state` inside the body of a component's render -function, you're declaring that this component needs to remember something. That -"something" which needs to be remembered, is known as **state**. So when we look at an -assignment expression like the one below - -.. code-block:: - - index, set_index = use_state(0) - -we should read it as saying that ``index`` is a piece of state which must be -remembered by the component that declared it. The argument to ``use_state`` (in this -case ``0``) is then conveying what the initial value for ``index`` is. - -We should then understand that each time the component which owns this state renders -``use_state`` will return a tuple containing two values - the current value of the state -(``index``) and a function to change that value the next time the component is rendered. -Thus, in this example: - -- ``index`` - is a **state variable** containing the currently stored value. -- ``set_index`` - is a **state setter** for changing that value and triggering a re-render - of the component. - -The convention is that, if you name your state variable ``thing``, your state setter -should be named ``set_thing``. While you could name them anything you want, adhering to -the convention makes things easier to understand across projects. - ----- - -To understand how this works in context, let's break down our example by examining key -moments in the execution of the ``Gallery`` component. Each numbered tab in the section -below highlights a line of code where something of interest occurs: - -.. hint:: - - Try clicking through the numbered tabs to each highlighted step of execution - -.. tab-set:: - - .. tab-item:: 1 - - .. raw:: html - - <h2>Initial render</h2> - - .. literalinclude:: _examples/adding_state_variable/main.py - :lines: 12-33 - :emphasize-lines: 2 - - At this point, we've just begun to render the ``Gallery`` component. As yet, - ReactPy is not aware that this component has any state or what view it will - display. This will change in a moment though when we move to the next line... - - .. tab-item:: 2 - - .. raw:: html - - <h2>Initial state declaration</h2> - - .. literalinclude:: _examples/adding_state_variable/main.py - :lines: 12-33 - :emphasize-lines: 3 - - The ``Gallery`` component has just declared some state. ReactPy now knows that it - must remember the ``index`` and trigger an update of this component when - ``set_index`` is called. Currently the value of ``index`` is ``0`` as per the - default value given to ``use_state``. Thus, the resulting view will display - information about the first item in our ``sculpture_data`` list. - - .. tab-item:: 3 - - .. raw:: html - - <h2>Define event handler</h2> - - .. literalinclude:: _examples/adding_state_variable/main.py - :lines: 12-33 - :emphasize-lines: 5 - - We've now defined an event handler that we intend to assign to a button in the - view. This will respond once the user clicks that button. The action this - handler performs is to update the value of ``index`` and schedule our ``Gallery`` - component to update. - - .. tab-item:: 4 - - .. raw:: html - - <h2>Return the view</h2> - - .. literalinclude:: _examples/adding_state_variable/main.py - :lines: 12-33 - :emphasize-lines: 16 - - The ``handle_click`` function we defined above has now been assigned to a button - in the view and we are about to display information about the first item in out - ``sculpture_data`` list. When the view is ultimately displayed, if a user clicks - the "Next" button, the handler we just assigned will be triggered. Until that - point though, the application will remain static. - - .. tab-item:: 5 - - .. raw:: html - - <h2>User interaction</h2> - - .. literalinclude:: _examples/adding_state_variable/main.py - :lines: 12-33 - :emphasize-lines: 5 - - A user has just clicked the button 🖱️! ReactPy has sent information about the event - to the ``handle_click`` function and it is about to execute. In a moment we will - update the state of this component and schedule a re-render. - - .. tab-item:: 6 - - .. raw:: html - - <h2>New state is set</h2> - - .. literalinclude:: _examples/adding_state_variable/main.py - :lines: 12-33 - :emphasize-lines: 6 - - We've just now told ReactPy that we want to update the state of our ``Gallery`` and - that it needs to be re-rendered. More specifically, we are incrementing its - ``index``, and once ``Gallery`` re-renders the index *will* be ``1``. - Importantly, at this point, the value of ``index`` is still ``0``! This will - only change once the component begins to re-render. - - .. tab-item:: 7 - - .. raw:: html - - <h2>Next render begins</h2> - - .. literalinclude:: _examples/adding_state_variable/main.py - :lines: 12-33 - :emphasize-lines: 2 - - The scheduled re-render of ``Gallery`` has just begun. ReactPy has now updated its - internal state store such that, the next time we call ``use_state`` we will get - back the updated value of ``index``. - - .. tab-item:: 8 - - .. raw:: html - - <h2>Next state is acquired</h2> - - .. literalinclude:: _examples/adding_state_variable/main.py - :lines: 12-33 - :emphasize-lines: 3 - - With ReactPy's state store updated, as we call ``use_state``, instead of returning - ``0`` for the value of ``index`` as it did before, ReactPy now returns the value - ``1``. With this change the view we display will be altered - instead of - displaying data for the first item in our ``sculpture_data`` list we will now - display information about the second. - - .. tab-item:: 9 - - .. raw:: html - - <h2>Repeat...</h2> - - .. literalinclude:: _examples/adding_state_variable/main.py - :lines: 12-33 - - From this point on, the steps remain the same. The only difference being the - progressively incrementing ``index`` each time the user clicks the "Next" button - and the view which is altered to to reflect the currently indexed item in the - ``sculpture_data`` list. - - .. note:: - - Once we reach the end of the ``sculpture_data`` list the view will return - back to the first item since we create a ``bounded_index`` by doing a modulo - of the index with the length of the list (``index % len(sculpture_data)``). - Ideally we would do this bounding at the time we call ``set_index`` to - prevent ``index`` from incrementing to infinity, but to keep things simple - in this examples, we've kept this logic separate. - - -Multiple State Declarations ---------------------------- - -The powerful thing about hooks like :func:`~reactpy.core.hooks.use_state` is that you're -not limited to just one state declaration. You can call ``use_state()`` as many times as -you need to in one component. For example, in the example below we've added a -``show_more`` state variable along with a few other modifications (e.g. renaming -``handle_click``) to make the description for each sculpture optionally displayed. Only -when the user clicks the "Show details" button is this description shown: - -.. reactpy:: _examples/multiple_state_variables - -It's generally a good idea to define separate state variables if the data they represent -is unrelated. In this case, ``index`` corresponds to what sculpture information is being -displayed and ``show_more`` is solely concerned with whether the description for a given -sculpture is shown. Put other way ``index`` is concerned with *what* information is -displayed while ``show_more`` is concerned with *how* it is displayed. Conversely -though, if you have a form with many fields, it probably makes sense to have a single -object that holds the data for all the fields rather than an object per-field. - -.. note:: - - This topic is discussed more in the :ref:`structuring your state` section. - - -State is Isolated and Private ------------------------------ - -State is local to a component instance on the screen. In other words, if you render the -same component twice, each copy will have completely isolated state! Changing one of -them will not affect the other. - -In this example, the ``Gallery`` component from earlier is rendered twice with no -changes to its logic. Try clicking the buttons inside each of the galleries. Notice that -their state is independent: - -.. reactpy:: _examples/isolated_state - :result-is-default-tab: - -This is what makes state different from regular variables that you might declare at the -top of your module. State is not tied to a particular function call or a place in the -code, but it’s “local” to the specific place on the screen. You rendered two ``Gallery`` -components, so their state is stored separately. - -Also notice how the Page component doesn’t “know” anything about the Gallery state or -even whether it has any. Unlike props, state is fully private to the component declaring -it. The parent component can’t change it. This lets you add state to any component or -remove it without impacting the rest of the components. - -.. card:: - :link: /guides/managing-state/sharing-component-state/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - What if you wanted both galleries to keep their states in sync? The right way to do - it in ReactPy is to remove state from child components and add it to their closest - shared parent. diff --git a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/dict_remove.py b/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/dict_remove.py deleted file mode 100644 index 6c3c783da..000000000 --- a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/dict_remove.py +++ /dev/null @@ -1,58 +0,0 @@ -from reactpy import component, html, run, use_state - - -@component -def Definitions(): - term_to_add, set_term_to_add = use_state(None) - definition_to_add, set_definition_to_add = use_state(None) - all_terms, set_all_terms = use_state({}) - - def handle_term_to_add_change(event): - set_term_to_add(event["target"]["value"]) - - def handle_definition_to_add_change(event): - set_definition_to_add(event["target"]["value"]) - - def handle_add_click(event): - if term_to_add and definition_to_add: - set_all_terms({**all_terms, term_to_add: definition_to_add}) - set_term_to_add(None) - set_definition_to_add(None) - - def make_delete_click_handler(term_to_delete): - def handle_click(event): - set_all_terms({t: d for t, d in all_terms.items() if t != term_to_delete}) - - return handle_click - - return html.div( - html.button({"on_click": handle_add_click}, "add term"), - html.label( - "Term: ", - html.input({"value": term_to_add, "on_change": handle_term_to_add_change}), - ), - html.label( - "Definition: ", - html.input( - { - "value": definition_to_add, - "on_change": handle_definition_to_add_change, - } - ), - ), - html.hr(), - [ - html.div( - {"key": term}, - html.button( - {"on_click": make_delete_click_handler(term)}, "delete term" - ), - html.dt(term), - html.dd(definition), - ) - for term, definition in all_terms.items() - ], - ) - - -run(Definitions) diff --git a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/dict_update.py b/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/dict_update.py deleted file mode 100644 index 32dd4073a..000000000 --- a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/dict_update.py +++ /dev/null @@ -1,44 +0,0 @@ -from reactpy import component, html, run, use_state - - -@component -def Form(): - person, set_person = use_state( - { - "first_name": "Barbara", - "last_name": "Hepworth", - "email": "bhepworth@sculpture.com", - } - ) - - def handle_first_name_change(event): - set_person({**person, "first_name": event["target"]["value"]}) - - def handle_last_name_change(event): - set_person({**person, "last_name": event["target"]["value"]}) - - def handle_email_change(event): - set_person({**person, "email": event["target"]["value"]}) - - return html.div( - html.label( - "First name: ", - html.input( - {"value": person["first_name"], "on_change": handle_first_name_change} - ), - ), - html.label( - "Last name: ", - html.input( - {"value": person["last_name"], "on_change": handle_last_name_change} - ), - ), - html.label( - "Email: ", - html.input({"value": person["email"], "on_change": handle_email_change}), - ), - html.p(f"{person['first_name']} {person['last_name']} {person['email']}"), - ) - - -run(Form) diff --git a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_insert.py b/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_insert.py deleted file mode 100644 index 1f4072e0b..000000000 --- a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_insert.py +++ /dev/null @@ -1,25 +0,0 @@ -from reactpy import component, html, run, use_state - - -@component -def ArtistList(): - artist_to_add, set_artist_to_add = use_state("") - artists, set_artists = use_state([]) - - def handle_change(event): - set_artist_to_add(event["target"]["value"]) - - def handle_click(event): - if artist_to_add and artist_to_add not in artists: - set_artists([*artists, artist_to_add]) - set_artist_to_add("") - - return html.div( - html.h1("Inspiring sculptors:"), - html.input({"value": artist_to_add, "on_change": handle_change}), - html.button({"on_click": handle_click}, "add"), - html.ul([html.li({"key": name}, name) for name in artists]), - ) - - -run(ArtistList) diff --git a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_re_order.py b/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_re_order.py deleted file mode 100644 index 3bd2fd601..000000000 --- a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_re_order.py +++ /dev/null @@ -1,24 +0,0 @@ -from reactpy import component, html, run, use_state - - -@component -def ArtistList(): - artists, set_artists = use_state( - ["Marta Colvin Andrade", "Lamidi Olonade Fakeye", "Louise Nevelson"] - ) - - def handle_sort_click(event): - set_artists(sorted(artists)) - - def handle_reverse_click(event): - set_artists(list(reversed(artists))) - - return html.div( - html.h1("Inspiring sculptors:"), - html.button({"on_click": handle_sort_click}, "sort"), - html.button({"on_click": handle_reverse_click}, "reverse"), - html.ul([html.li({"key": name}, name) for name in artists]), - ) - - -run(ArtistList) diff --git a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_remove.py b/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_remove.py deleted file mode 100644 index 6223284f6..000000000 --- a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_remove.py +++ /dev/null @@ -1,44 +0,0 @@ -from reactpy import component, html, run, use_state - - -@component -def ArtistList(): - artist_to_add, set_artist_to_add = use_state("") - artists, set_artists = use_state( - ["Marta Colvin Andrade", "Lamidi Olonade Fakeye", "Louise Nevelson"] - ) - - def handle_change(event): - set_artist_to_add(event["target"]["value"]) - - def handle_add_click(event): - if artist_to_add not in artists: - set_artists([*artists, artist_to_add]) - set_artist_to_add("") - - def make_handle_delete_click(index): - def handle_click(event): - set_artists(artists[:index] + artists[index + 1 :]) - - return handle_click - - return html.div( - html.h1("Inspiring sculptors:"), - html.input({"value": artist_to_add, "on_change": handle_change}), - html.button({"on_click": handle_add_click}, "add"), - html.ul( - [ - html.li( - {"key": name}, - name, - html.button( - {"on_click": make_handle_delete_click(index)}, "delete" - ), - ) - for index, name in enumerate(artists) - ] - ), - ) - - -run(ArtistList) diff --git a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_replace.py b/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_replace.py deleted file mode 100644 index 4952b9597..000000000 --- a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/list_replace.py +++ /dev/null @@ -1,27 +0,0 @@ -from reactpy import component, html, run, use_state - - -@component -def CounterList(): - counters, set_counters = use_state([0, 0, 0]) - - def make_increment_click_handler(index): - def handle_click(event): - new_value = counters[index] + 1 - set_counters(counters[:index] + [new_value] + counters[index + 1 :]) - - return handle_click - - return html.ul( - [ - html.li( - {"key": index}, - count, - html.button({"on_click": make_increment_click_handler(index)}, "+1"), - ) - for index, count in enumerate(counters) - ] - ) - - -run(CounterList) diff --git a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/moving_dot.py b/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/moving_dot.py deleted file mode 100644 index e5ab54dca..000000000 --- a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/moving_dot.py +++ /dev/null @@ -1,45 +0,0 @@ -from reactpy import component, html, run, use_state - - -@component -def MovingDot(): - position, set_position = use_state({"x": 0, "y": 0}) - - async def handle_pointer_move(event): - outer_div_info = event["currentTarget"] - outer_div_bounds = outer_div_info["boundingClientRect"] - set_position( - { - "x": event["clientX"] - outer_div_bounds["x"], - "y": event["clientY"] - outer_div_bounds["y"], - } - ) - - return html.div( - { - "on_pointer_move": handle_pointer_move, - "style": { - "position": "relative", - "height": "200px", - "width": "100%", - "background_color": "white", - }, - }, - html.div( - { - "style": { - "position": "absolute", - "background_color": "red", - "border_radius": "50%", - "width": "20px", - "height": "20px", - "left": "-10px", - "top": "-10px", - "transform": f"translate({position['x']}px, {position['y']}px)", - } - } - ), - ) - - -run(MovingDot) diff --git a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/moving_dot_broken.py b/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/moving_dot_broken.py deleted file mode 100644 index 8972ce74e..000000000 --- a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/moving_dot_broken.py +++ /dev/null @@ -1,43 +0,0 @@ -# :linenos: - -from reactpy import component, html, run, use_state - - -@component -def MovingDot(): - position, _ = use_state({"x": 0, "y": 0}) - - def handle_pointer_move(event): - outer_div_info = event["currentTarget"] - outer_div_bounds = outer_div_info["boundingClientRect"] - position["x"] = event["clientX"] - outer_div_bounds["x"] - position["y"] = event["clientY"] - outer_div_bounds["y"] - - return html.div( - { - "on_pointer_move": handle_pointer_move, - "style": { - "position": "relative", - "height": "200px", - "width": "100%", - "background_color": "white", - }, - }, - html.div( - { - "style": { - "position": "absolute", - "background_color": "red", - "border_radius": "50%", - "width": "20px", - "height": "20px", - "left": "-10px", - "top": "-10px", - "transform": f"translate({position['x']}px, {position['y']}px)", - } - } - ), - ) - - -run(MovingDot) diff --git a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/set_remove.py b/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/set_remove.py deleted file mode 100644 index be5366cb2..000000000 --- a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/set_remove.py +++ /dev/null @@ -1,41 +0,0 @@ -from reactpy import component, html, run, use_state - - -@component -def Grid(): - line_size = 5 - selected_indices, set_selected_indices = use_state({1, 2, 4}) - - def make_handle_click(index): - def handle_click(event): - if index in selected_indices: - set_selected_indices(selected_indices - {index}) - else: - set_selected_indices(selected_indices | {index}) - - return handle_click - - return html.div( - {"style": {"display": "flex", "flex-direction": "row"}}, - [ - html.div( - { - "on_click": make_handle_click(index), - "style": { - "height": "30px", - "width": "30px", - "background_color": "black" - if index in selected_indices - else "white", - "outline": "1px solid grey", - "cursor": "pointer", - }, - "key": index, - } - ) - for index in range(line_size) - ], - ) - - -run(Grid) diff --git a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/set_update.py b/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/set_update.py deleted file mode 100644 index 8ff2e1ca4..000000000 --- a/docs/source/guides/adding-interactivity/dangers-of-mutability/_examples/set_update.py +++ /dev/null @@ -1,38 +0,0 @@ -from reactpy import component, html, run, use_state - - -@component -def Grid(): - line_size = 5 - selected_indices, set_selected_indices = use_state(set()) - - def make_handle_click(index): - def handle_click(event): - set_selected_indices(selected_indices | {index}) - - return handle_click - - return html.div( - {"style": {"display": "flex", "flex-direction": "row"}}, - [ - html.div( - { - "on_click": make_handle_click(index), - "style": { - "height": "30px", - "width": "30px", - "background_color": "black" - if index in selected_indices - else "white", - "outline": "1px solid grey", - "cursor": "pointer", - }, - "key": index, - } - ) - for index in range(line_size) - ], - ) - - -run(Grid) diff --git a/docs/source/guides/adding-interactivity/dangers-of-mutability/index.rst b/docs/source/guides/adding-interactivity/dangers-of-mutability/index.rst deleted file mode 100644 index bcac79e18..000000000 --- a/docs/source/guides/adding-interactivity/dangers-of-mutability/index.rst +++ /dev/null @@ -1,569 +0,0 @@ -Dangers of Mutability -===================== - -While state can hold any type of value, you should be careful to avoid directly -modifying objects that you declare as state with ReactPy. In other words, you must not -:ref:`"mutate" <What is a Mutation>` values which are held as state. Rather, to change -these values you should use new ones or create copies. - - -.. _what is a mutation: - -What is a Mutation? -------------------- - -In Python, values may be either "mutable" or "immutable". Mutable objects are those -whose underlying data can be changed after they are created, and immutable objects are -those which cannot. A "mutation" then, is the act of changing the underlying data of a -mutable value. In particular, a :class:`dict` is a mutable type of value. In the code -below, an initially empty dictionary is created. Then, a key and value is added to it: - -.. code-block:: - - x = {} - x["a"] = 1 - assert x == {"a": 1} - -This is different from something like a :class:`str` which is immutable. Instead of -modifying the underlying data of an existing value, a new one must be created to -facilitate change: - -.. code-block:: - - x = "Hello" - y = x + " world!" - assert x is not y - -.. note:: - - In Python, the ``is`` and ``is not`` operators check whether two values are - identitcal. This `is distinct - <https://realpython.com/python-is-identity-vs-equality>`__ from checking whether two - values are equivalent with the ``==`` or ``!=`` operators. - -Thus far, all the values we've been working with have been immutable. These include -:class:`int`, :class:`float`, :class:`str`, and :class:`bool` values. As a result, we -have not had to consider the consequences of mutations. - - -.. _Why Avoid Mutation: - -Why Avoid Mutation? -------------------- - -Unfortunately, ReactPy does not understand that when a value is mutated, it may have -changed. As a result, mutating values will not trigger re-renders. Thus, you must be -careful to avoid mutation whenever you want ReactPy to re-render a component. For example, -the intention of the code below is to make the red dot move when you touch or hover over -the preview area. However it doesn't - the dot remains stationary: - -.. reactpy:: _examples/moving_dot_broken - -The problem is with this section of code: - -.. literalinclude:: _examples/moving_dot_broken.py - :language: python - :lines: 13-14 - :linenos: - :lineno-start: 13 - -This code mutates the ``position`` dictionary from the prior render instead of using the -state variable's associated state setter. Without calling setter ReactPy has no idea that -the variable's data has been modified. While it can be possible to get away with -mutating state variables, it's highly dicsouraged. Doing so can cause strange and -unpredictable behavior. As a result, you should always treat the data within a state -variable as immutable. - -To actually trigger a render we need to call the state setter. To do that we'll assign -it to ``set_position`` instead of the unused ``_`` variable we have above. Then we can -call it by passing a *new* dictionary with the values for the next render. Notice how, -by making these alterations to the code, that the dot now follows your pointer when -you touch or hover over the preview: - -.. reactpy:: _examples/moving_dot - - -.. dropdown:: Local mutation can be alright - :color: info - :animate: fade-in - - While code like this causes problems: - - .. code-block:: - - position["x"] = event["clientX"] - outer_div_bounds["x"] - position["y"] = event["clientY"] - outer_div_bounds["y"] - - It's ok if you mutate a fresh dictionary that you have *just* created before calling - the state setter: - - .. code-block:: - - new_position = {} - new_position["x"] = event["clientX"] - outer_div_bounds["x"] - new_position["y"] = event["clientY"] - outer_div_bounds["y"] - set_position(new_position) - - It's actually nearly equivalent to having written: - - .. code-block:: - - set_position( - { - "x": event["clientX"] - outer_div_bounds["x"], - "y": event["clientY"] - outer_div_bounds["y"], - } - ) - - Mutation is only a problem when you change data assigned to existing state - variables. Mutating an object you’ve just created is okay because no other code - references it yet. Changing it isn’t going to accidentally impact something that - depends on it. This is called a “local mutation.” You can even do local mutation - while rendering. Very convenient and completely okay! - - -Working with Dictionaries -------------------------- - -Below are some ways to update dictionaries without mutating them: - -.. card:: Updating Items - :link: updating-dictionary-items - :link-type: ref - - Avoid using item assignment, ``dict.update``, or ``dict.setdefault``. Instead try - the strategies below: - - .. code-block:: - - {**d, "key": value} - - # Python >= 3.9 - d | {"key": value} - - # Equivalent to dict.setdefault() - {"key": value, **d} - -.. card:: Removing Items - :link: removing-dictionary-items - :link-type: ref - - Avoid using item deletion or ``dict.pop``. Instead try the strategies below: - - .. code-block:: - - { - k: v - for k, v in d.items() - if k != key - } - - # Better for removing multiple items - { - k: d[k] - for k in set(d).difference([key]) - } - - ----- - - -.. _updating-dictionary-items: - -Updating Dictionary Items -......................... - -.. grid:: 1 1 1 2 - :gutter: 1 - - .. grid-item-card:: :bdg-danger:`Avoid` - - .. code-block:: - - d[key] = value - - d.update({key: value}) - - d.setdefault(key, value) - - .. grid-item-card:: :bdg-info:`Prefer` - - .. code-block:: - - {**d, key: value} - - # Python >= 3.9 - d | {key: value} - - # Equivalent to setdefault() - {key: value, **d} - -As we saw in an :ref:`earlier example <why avoid mutation>`, instead of mutating -dictionaries to update their items you should instead create a copy that contains the -desired changes. - -However, sometimes you may only want to update some of the information in a dictionary -which is held by a state variable. Consider the case below where we have a form for -updating user information with a preview of the currently entered data. We can -accomplish this using `"unpacking" <https://www.python.org/dev/peps/pep-0448/>`__ with -the ``**`` syntax: - -.. reactpy:: _examples/dict_update - - -.. _removing-dictionary-items: - -Removing Dictionary Items -......................... - -.. grid:: 1 1 1 2 - :gutter: 1 - - .. grid-item-card:: :bdg-danger:`Avoid` - - .. code-block:: - - del d[key] - - d.pop(key) - - .. grid-item-card:: :bdg-info:`Prefer` - - .. code-block:: - - { - k: v - for k, v in d.items() - if k != key - } - - # Better for removing multiple items - { - k: d[k] - for k in set(d).difference([key]) - } - -This scenario doesn't come up very frequently. When it does though, the best way to -remove items from dictionaries is to create a copy of the original, but with a filtered -set of keys. One way to do this is with a dictionary comprehension. The example below -shows an interface where you're able to enter a new term and definition. Once added, -you can click a delete button to remove the term and definition: - -.. reactpy:: _examples/dict_remove - - -Working with Lists ------------------- - -Below are some ways to update lists without mutating them: - -.. card:: Inserting Items - :link: inserting-list-items - :link-type: ref - - Avoid using ``list.append``, ``list.extend``, and ``list.insert``. Instead try the - strategies below: - - .. code-block:: - - [*l, value] - - l + [value] - - l + values - - l[:index] + [value] + l[index:] - -.. card:: Removing Items - :link: removing-list-items - :link-type: ref - - Avoid using item deletion or ``list.pop``. Instead try the strategy below: - - .. code-block:: - - l[:index - 1] + l[index:] - -.. card:: Replacing Items - :link: replacing-list-items - :link-type: ref - - Avoid using item or slice assignment. Instead try the strategies below: - - .. code-block:: - - l[:index] + [value] + l[index + 1:] - - l[:start] + values + l[end + 1:] - -.. card:: Re-ordering Items - :link: re-ordering-list-items - :link-type: ref - - Avoid using ``list.sort`` or ``list.reverse``. Instead try the strategies below: - - .. code-block:: - - list(sorted(l)) - - list(reversed(l)) - - ----- - - -.. _inserting-list-items: - -Inserting List Items -.................... - -.. grid:: 1 1 1 2 - - .. grid-item-card:: :bdg-danger:`Avoid` - - .. code-block:: - - l.append(value) - - l.extend(values) - - l.insert(index, value) - - # Adding a list "in-place" mutates! - l += [value] - - .. grid-item-card:: :bdg-info:`Prefer` - - .. code-block:: - - [*l, value] - - l + [value] - - l + values - - l[:index] + [value] + l[index:] - -Instead of mutating a list to add items to it, we need to create a new list which has -the items we want to append instead. There are several ways to do this for one or more -values however it's often simplest to use `"unpacking" -<https://www.python.org/dev/peps/pep-0448/>`__ with the ``*`` syntax. - -.. reactpy:: _examples/list_insert - - -.. _removing-list-items: - -Removing List Items -................... - -.. grid:: 1 1 1 2 - - .. grid-item-card:: :bdg-danger:`Avoid` - - .. code-block:: - - del l[index] - - l.pop(index) - - .. grid-item-card:: :bdg-info:`Prefer` - - .. code-block:: - - l[:index] + l[index + 1:] - -Unfortunately, the syntax for creating a copy of a list with one of its items removed is -not quite as clean. You must select the portion the list prior to the item which should -be removed (``l[:index]``) and the portion after the item (``l[index + 1:]``) and add -them together: - -.. reactpy:: _examples/list_remove - - -.. _replacing-list-items: - -Replacing List Items -.................... - -.. grid:: 1 1 1 2 - - .. grid-item-card:: :bdg-danger:`Avoid` - - .. code-block:: - - l[index] = value - - l[start:end] = values - - .. grid-item-card:: :bdg-info:`Prefer` - - .. code-block:: - - l[:index] + [value] + l[index + 1:] - - l[:start] + values + l[end + 1:] - -In a similar manner to :ref:`removing list items`, to replace an item in a list, you -must select the portion before and after the item in question. But this time, instead -of adding those two selections together, you must insert that values you want to replace -between them: - -.. reactpy:: _examples/list_replace - - -.. _re-ordering-list-items: - -Re-ordering List Items -...................... - -.. grid:: 1 1 1 2 - - .. grid-item-card:: :bdg-danger:`Avoid` - - .. code-block:: - - l.sort() - - l.reverse() - - .. grid-item-card:: :bdg-info:`Prefer` - - .. code-block:: - - list(sorted(l)) - - list(reversed(l)) - -There are many different ways that list items could be re-ordered, but two of the most -common are reversing or sorting items. Instead of calling the associated methods on a -list object, you should use the builtin functions :func:`sorted` and :func:`reversed` -and pass the resulting iterator into the :class:`list` constructor to create a sorted -or reversed copy of the given list: - -.. reactpy:: _examples/list_re_order - - -Working with Sets ------------------ - -Below are ways to update sets without mutating them: - -.. card:: Adding Items - :link: adding-set-items - :link-type: ref - - Avoid using item assignment, ``set.add`` or ``set.update``. Instead try the - strategies below: - - .. code-block:: - - s.union({value}) - - s.union(values) - -.. card:: Removing Items - :link: removing-set-items - :link-type: ref - - Avoid using item deletion or ``dict.pop``. Instead try the strategies below: - - .. code-block:: - - s.difference({value}) - - s.difference(values) - - s.intersection(values) - - ----- - - -.. _adding-set-items: - -Adding Set Items -................ - -.. grid:: 1 1 1 2 - - .. grid-item-card:: :bdg-danger:`Avoid` - - .. code-block:: - - s.add(value) - s |= {value} # "in-place" operators mutate! - - s.update(values) - s |= values # "in-place" operators mutate! - - .. grid-item-card:: :bdg-info:`Prefer` - - .. code-block:: - - s.union({value}) - s | {value} - - s.union(values) - s | values - -Sets have some nice ways for evolving them without requiring mutation. The binary -or operator ``|`` serves as a succinct way to compute the union of two sets. However, -you should be careful to not use an in-place assignment with this operator as that will -(counterintuitively) mutate the original set rather than creating a new one. - -.. reactpy:: _examples/set_update - - -.. _removing-set-items: - -Removing Set Items -.................. - -.. grid:: 1 1 1 2 - - .. grid-item-card:: :bdg-danger:`Avoid` - - .. code-block:: - - s.remove(value) - - s.difference_update(values) - s -= values # "in-place" operators mutate! - - s.symmetric_difference_update(values) - s ^= values # "in-place" operators mutate! - - s.intersection_update(values) - s &= values # "in-place" operators mutate! - - - .. grid-item-card:: :bdg-info:`Prefer` - - .. code-block:: - - s.difference({value}) - - s.difference(values) - s - values - - s.symmetric_difference(values) - s ^ values - - s.intersection(values) - s & values - -To remove items from sets you can use the various binary operators or their associated -methods to return new sets without mutating them. As before when :ref:`adding set items` -you need to avoid using the inline assignment operators since that will -(counterintuitively) mutate the original set rather than given you a new one: - -.. reactpy:: _examples/set_remove - - -Useful Packages ---------------- - -Under construction 🚧 - -https://pypi.org/project/pyrsistent/ diff --git a/docs/source/guides/adding-interactivity/index.rst b/docs/source/guides/adding-interactivity/index.rst deleted file mode 100644 index b2beb3a81..000000000 --- a/docs/source/guides/adding-interactivity/index.rst +++ /dev/null @@ -1,210 +0,0 @@ -Adding Interactivity -==================== - -.. toctree:: - :hidden: - - responding-to-events/index - components-with-state/index - state-as-a-snapshot/index - multiple-state-updates/index - dangers-of-mutability/index - - -.. dropdown:: :octicon:`bookmark-fill;2em` What You'll Learn - :color: info - :animate: fade-in - :open: - - .. grid:: 1 2 2 2 - - .. grid-item-card:: :octicon:`bell` Responding to Events - :link: responding-to-events/index - :link-type: doc - - Define event handlers and learn about the available event types they can be - bound to. - - .. grid-item-card:: :octicon:`package-dependencies` Components With State - :link: components-with-state/index - :link-type: doc - - Allow components to change what they display by saving and updating their - state. - - .. grid-item-card:: :octicon:`device-camera-video` State as a Snapshot - :link: state-as-a-snapshot/index - :link-type: doc - - Learn why state updates schedules a re-render, instead of being applied - immediately. - - .. grid-item-card:: :octicon:`versions` Multiple State Updates - :link: multiple-state-updates/index - :link-type: doc - - Learn how updates to a components state can be batched, or applied - incrementally. - - .. grid-item-card:: :octicon:`issue-opened` Dangers of Mutability - :link: dangers-of-mutability/index - :link-type: doc - - See the pitfalls of working with mutable data types and how to avoid them. - - -Section 1: Responding to Events -------------------------------- - -ReactPy lets you add event handlers to your parts of the interface. This means that you can -define synchronous or asynchronous functions that are triggered when a particular user -interaction occurs like clicking, hovering, of focusing on form inputs, and more. - -.. reactpy:: responding-to-events/_examples/button_prints_message - -It may feel weird to define a function within a function like this, but doing so allows -the ``handle_event`` function to access information from within the scope of the -component. That's important if you want to use any arguments that may have beend passed -your component in the handler. - -.. card:: - :link: responding-to-events/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Define event handlers and learn about the available event types they can be bound - to. - - -Section 2: Components with State --------------------------------- - -Components often need to change what’s on the screen as a result of an interaction. For -example, typing into the form should update the input field, clicking a “Comment” button -should bring up a text input field, clicking “Buy” should put a product in the shopping -cart. Components need to “remember” things like the current input value, the current -image, the shopping cart. In ReactPy, this kind of component-specific memory is created and -updated with a "hook" called ``use_state()`` that creates a **state variable** and -**state setter** respectively: - -.. reactpy:: components-with-state/_examples/adding_state_variable - -In ReactPy, ``use_state``, as well as any other function whose name starts with ``use``, is -called a "hook". These are special functions that should only be called while ReactPy is -:ref:`rendering <the rendering process>`. They let you "hook into" the different -capabilities of ReactPy's components of which ``use_state`` is just one (well get into the -other :ref:`later <managing state>`). - -.. card:: - :link: components-with-state/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Allow components to change what they display by saving and updating their state. - - -Section 3: State as a Snapshot ------------------------------- - -As we :ref:`learned earlier <Components with State>`, state setters behave a little -differently than you might expect at first glance. Instead of updating your current -handle on the setter's corresponding variable, it schedules a re-render of the component -which owns the state. - -.. code-block:: - - count, set_count = use_state(0) - print(count) # prints: 0 - set_count(count + 1) # schedule a re-render where count is 1 - print(count) # still prints: 0 - -This behavior of ReactPy means that each render of a component is like taking a snapshot of -the UI based on the component's state at that time. Treating state in this way can help -reduce subtle bugs. For instance, in the code below there's a simple chat app with a -message input and recipient selector. The catch is that the message actually gets sent 5 -seconds after the "Send" button is clicked. So what would happen if we changed the -recipient between the time the "Send" button was clicked and the moment the message is -actually sent? - -.. reactpy:: state-as-a-snapshot/_examples/print_chat_message - -As it turns out, changing the message recipient after pressing send does not change -where the message ultimately goes. However, one could imagine a bug where the recipient -of a message is determined at the time the message is sent rather than at the time the -"Send" button it clicked. Thus changing the recipient after pressing send would change -where the message got sent. - -In many cases, ReactPy avoids this class of bug entirely because it treats state as a -snapshot. - -.. card:: - :link: state-as-a-snapshot/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Learn why state updates schedules a re-render, instead of being applied immediately. - - -Section 4: Multiple State Updates ---------------------------------- - -As we saw in an earlier example, :ref:`setting state triggers renders`. In other words, -changes to state only take effect in the next render, not in the current one. Further, -changes to state are batched, calling a particular state setter 3 times won't trigger 3 -renders, it will only trigger 1. This means that multiple state assignments are batched -- so long as the event handler is synchronous (i.e. the event handler is not an -``async`` function), ReactPy waits until all the code in an event handler has run before -processing state and starting the next render: - -.. reactpy:: multiple-state-updates/_examples/set_color_3_times - -Sometimes though, you need to update a state variable more than once before the next -render. In these cases, instead of having updates batched, you instead want them to be -applied incrementally. That is, the next update can be made to depend on the prior one. -To accomplish this, instead of passing the next state value directly (e.g. -``set_state(new_state)``), we may pass an **"updater function"** of the form -``compute_new_state(old_state)`` to the state setter (e.g. -``set_state(compute_new_state)``): - -.. reactpy:: multiple-state-updates/_examples/set_state_function - -.. card:: - :link: multiple-state-updates/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Learn how updates to a components state can be batched, or applied incrementally. - - -Section 5: Dangers of Mutability --------------------------------- - -While state can hold any type of value, you should be careful to avoid directly -modifying objects that you declare as state with ReactPy. In other words, you must not -:ref:`"mutate" <What is a Mutation>` values which are held as state. Rather, to change -these values you should use new ones or create copies. - -This is because ReactPy does not understand that when a value is mutated, it may have -changed. As a result, mutating values will not trigger re-renders. Thus, you must be -careful to avoid mutation whenever you want ReactPy to re-render a component. For example, -instead of mutating dictionaries to update their items you should instead create a -copy that contains the desired changes: - -.. reactpy:: dangers-of-mutability/_examples/dict_update - -.. card:: - :link: dangers-of-mutability/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - See the pitfalls of working with mutable data types and how to avoid them. diff --git a/docs/source/guides/adding-interactivity/multiple-state-updates/_examples/delay_before_count_updater.py b/docs/source/guides/adding-interactivity/multiple-state-updates/_examples/delay_before_count_updater.py deleted file mode 100644 index e53c5b1ad..000000000 --- a/docs/source/guides/adding-interactivity/multiple-state-updates/_examples/delay_before_count_updater.py +++ /dev/null @@ -1,20 +0,0 @@ -import asyncio - -from reactpy import component, html, run, use_state - - -@component -def Counter(): - number, set_number = use_state(0) - - async def handle_click(event): - await asyncio.sleep(3) - set_number(lambda old_number: old_number + 1) - - return html.div( - html.h1(number), - html.button({"on_click": handle_click}, "Increment"), - ) - - -run(Counter) diff --git a/docs/source/guides/adding-interactivity/multiple-state-updates/_examples/delay_before_set_count.py b/docs/source/guides/adding-interactivity/multiple-state-updates/_examples/delay_before_set_count.py deleted file mode 100644 index bb64724f1..000000000 --- a/docs/source/guides/adding-interactivity/multiple-state-updates/_examples/delay_before_set_count.py +++ /dev/null @@ -1,20 +0,0 @@ -import asyncio - -from reactpy import component, html, run, use_state - - -@component -def Counter(): - number, set_number = use_state(0) - - async def handle_click(event): - await asyncio.sleep(3) - set_number(number + 1) - - return html.div( - html.h1(number), - html.button({"on_click": handle_click}, "Increment"), - ) - - -run(Counter) diff --git a/docs/source/guides/adding-interactivity/multiple-state-updates/_examples/set_color_3_times.py b/docs/source/guides/adding-interactivity/multiple-state-updates/_examples/set_color_3_times.py deleted file mode 100644 index 59d7d0f20..000000000 --- a/docs/source/guides/adding-interactivity/multiple-state-updates/_examples/set_color_3_times.py +++ /dev/null @@ -1,27 +0,0 @@ -from reactpy import component, html, run, use_state - - -@component -def ColorButton(): - color, set_color = use_state("gray") - - def handle_click(event): - set_color("orange") - set_color("pink") - set_color("blue") - - def handle_reset(event): - set_color("gray") - - return html.div( - html.button( - {"on_click": handle_click, "style": {"background_color": color}}, - "Set Color", - ), - html.button( - {"on_click": handle_reset, "style": {"background_color": color}}, "Reset" - ), - ) - - -run(ColorButton) diff --git a/docs/source/guides/adding-interactivity/multiple-state-updates/_examples/set_state_function.py b/docs/source/guides/adding-interactivity/multiple-state-updates/_examples/set_state_function.py deleted file mode 100644 index 56bbe80e3..000000000 --- a/docs/source/guides/adding-interactivity/multiple-state-updates/_examples/set_state_function.py +++ /dev/null @@ -1,24 +0,0 @@ -from reactpy import component, html, run, use_state - - -def increment(old_number): - new_number = old_number + 1 - return new_number - - -@component -def Counter(): - number, set_number = use_state(0) - - def handle_click(event): - set_number(increment) - set_number(increment) - set_number(increment) - - return html.div( - html.h1(number), - html.button({"on_click": handle_click}, "Increment"), - ) - - -run(Counter) diff --git a/docs/source/guides/adding-interactivity/multiple-state-updates/index.rst b/docs/source/guides/adding-interactivity/multiple-state-updates/index.rst deleted file mode 100644 index bc3245d7e..000000000 --- a/docs/source/guides/adding-interactivity/multiple-state-updates/index.rst +++ /dev/null @@ -1,109 +0,0 @@ -Multiple State Updates -====================== - -Setting a state variable will queue another render. But sometimes you might want to -perform multiple operations on the value before queueing the next render. To do this, it -helps to understand how React batches state updates. - - -Batched Updates ---------------- - -As we learned :ref:`previously <state as a snapshot>`, state variables remain fixed -inside each render as if state were a snapshot taken at the beginning of each render. -This is why, in the example below, even though it might seem like clicking the -"Increment" button would cause the ``number`` to increase by ``3``, it only does by -``1``: - -.. reactpy:: ../state-as-a-snapshot/_examples/set_counter_3_times - -The reason this happens is because, so long as the event handler is synchronous (i.e. -the event handler is not an ``async`` function), ReactPy waits until all the code in an -event handler has run before processing state and starting the next render. Thus, it's -the last call to a given state setter that matters. In the example below, even though we -set the color of the button to ``"orange"`` and then ``"pink"`` before ``"blue"``, -the color does not quickly flash orange and pink before blue - it always remains blue: - -.. reactpy:: _examples/set_color_3_times - -This behavior let's you make multiple state changes without triggering unnecessary -renders or renders with inconsistent state where only some of the variables have been -updated. With that said, it also means that the UI won't change until after synchronous -handlers have finished running. - -.. note:: - - For asynchronous event handlers, ReactPy will not render until you ``await`` something. - As we saw in :ref:`prior examples <State And Delayed Reactions>`, if you introduce - an asynchronous delay to an event handler after changing state, renders may take - place before the remainder of the event handler completes. However, state variables - within handlers, even async ones, always remains static. - -This behavior of ReactPy to "batch" state changes that take place inside a single event -handler, do not extend across event handlers. In other words, distinct events will -always produce distinct renders. To give an example, if clicking a button increments a -counter by one, no matter how fast the user clicks, the view will never jump from 1 to 3 -- it will always display 1, then 2, and then 3. - - -Incremental Updates -------------------- - -While it's uncommon, you need to update a state variable more than once before the next -render. In these cases, instead of having updates batched, you instead want them to be -applied incrementally. That is, the next update can be made to depend on the prior one. -For example, what it we wanted to make it so that, in our ``Counter`` example :ref:`from -before <Batched Updates>`, each call to ``set_number`` did in fact increment -``number`` by one causing the view to display ``0``, then ``3``, then ``6``, and so on? - -To accomplish this, instead of passing the next state value as in ``set_number(number + -1)``, we may pass an **"updater function"** to ``set_number`` that computes the next -state based on the previous state. This would look like ``set_number(lambda number: -number + 1)``. In other words we need a function of the form: - -.. code-block:: - - def compute_new_state(old_state): - ... - return new_state - -In our case, ``new_state = old_state + 1``. So we might define: - -.. code-block:: - - def increment(old_number): - new_number = old_number + 1 - return new_number - -Which we can use to replace ``set_number(number + 1)`` with ``set_number(increment)``: - -.. reactpy:: _examples/set_state_function - -The way to think about how ReactPy runs though this series of ``set_state(increment)`` -calls is to imagine that each one updates the internally managed state with its return -value, then that return value is being passed to the next updater function. Ultimately, -this is functionally equivalent to the following: - -.. code-block:: - - set_number(increment(increment(increment(number)))) - -So why might you want to do this? Why not just compute ``set_number(number + 3)`` from -the start? The easiest way to explain the use case is with an example. Imagine that we -introduced a delay before ``set_number(number + 1)``. What would happen if we clicked -the "Increment" button more than once before the delay in the first triggered event -completed? - -.. reactpy:: _examples/delay_before_set_count - -From an :ref:`earlier lesson <State And Delayed Reactions>`, we learned that introducing -delays do not change the fact that state variables do not change until the next render. -As a result, despite clicking many times before the delay completes, the ``number`` only -increments by one. To solve this we can use updater functions: - -.. reactpy:: _examples/delay_before_count_updater - -Now when you click the "Increment" button, each click, though delayed, corresponds to -``number`` being increased. This is because the ``old_number`` in the updater function -uses the value which was assigned by the last call to ``set_number`` rather than relying -in the static ``number`` state variable. diff --git a/docs/source/guides/adding-interactivity/responding-to-events/_examples/audio_player.py b/docs/source/guides/adding-interactivity/responding-to-events/_examples/audio_player.py deleted file mode 100644 index 82826c50d..000000000 --- a/docs/source/guides/adding-interactivity/responding-to-events/_examples/audio_player.py +++ /dev/null @@ -1,21 +0,0 @@ -import json - -import reactpy - - -@reactpy.component -def PlayDinosaurSound(): - event, set_event = reactpy.hooks.use_state(None) - return reactpy.html.div( - reactpy.html.audio( - { - "controls": True, - "on_time_update": lambda e: set_event(e), - "src": "https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3", - } - ), - reactpy.html.pre(json.dumps(event, indent=2)), - ) - - -reactpy.run(PlayDinosaurSound) diff --git a/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_async_handlers.py b/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_async_handlers.py deleted file mode 100644 index 992641e00..000000000 --- a/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_async_handlers.py +++ /dev/null @@ -1,23 +0,0 @@ -import asyncio - -from reactpy import component, html, run - - -@component -def ButtonWithDelay(message, delay): - async def handle_event(event): - await asyncio.sleep(delay) - print(message) - - return html.button({"on_click": handle_event}, message) - - -@component -def App(): - return html.div( - ButtonWithDelay("print 3 seconds later", delay=3), - ButtonWithDelay("print immediately", delay=0), - ) - - -run(App) diff --git a/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_does_nothing.py b/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_does_nothing.py deleted file mode 100644 index ea8313263..000000000 --- a/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_does_nothing.py +++ /dev/null @@ -1,9 +0,0 @@ -from reactpy import component, html, run - - -@component -def Button(): - return html.button("I don't do anything yet") - - -run(Button) diff --git a/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_handler_as_arg.py b/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_handler_as_arg.py deleted file mode 100644 index e5276bef3..000000000 --- a/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_handler_as_arg.py +++ /dev/null @@ -1,33 +0,0 @@ -from reactpy import component, html, run - - -@component -def Button(display_text, on_click): - return html.button({"on_click": on_click}, display_text) - - -@component -def PlayButton(movie_name): - def handle_click(event): - print(f"Playing {movie_name}") - - return Button(f"Play {movie_name}", on_click=handle_click) - - -@component -def FastForwardButton(): - def handle_click(event): - print("Skipping ahead") - - return Button("Fast forward", on_click=handle_click) - - -@component -def App(): - return html.div( - PlayButton("Buena Vista Social Club"), - FastForwardButton(), - ) - - -run(App) diff --git a/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_prints_event.py b/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_prints_event.py deleted file mode 100644 index 38638db4b..000000000 --- a/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_prints_event.py +++ /dev/null @@ -1,12 +0,0 @@ -from reactpy import component, html, run - - -@component -def Button(): - def handle_event(event): - print(event) - - return html.button({"on_click": handle_event}, "Click me!") - - -run(Button) diff --git a/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_prints_message.py b/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_prints_message.py deleted file mode 100644 index 56118a57f..000000000 --- a/docs/source/guides/adding-interactivity/responding-to-events/_examples/button_prints_message.py +++ /dev/null @@ -1,20 +0,0 @@ -from reactpy import component, html, run - - -@component -def PrintButton(display_text, message_text): - def handle_event(event): - print(message_text) - - return html.button({"on_click": handle_event}, display_text) - - -@component -def App(): - return html.div( - PrintButton("Play", "Playing"), - PrintButton("Pause", "Paused"), - ) - - -run(App) diff --git a/docs/source/guides/adding-interactivity/responding-to-events/_examples/prevent_default_event_actions.py b/docs/source/guides/adding-interactivity/responding-to-events/_examples/prevent_default_event_actions.py deleted file mode 100644 index d3f0941bd..000000000 --- a/docs/source/guides/adding-interactivity/responding-to-events/_examples/prevent_default_event_actions.py +++ /dev/null @@ -1,18 +0,0 @@ -from reactpy import component, event, html, run - - -@component -def DoNotChangePages(): - return html.div( - html.p("Normally clicking this link would take you to a new page"), - html.a( - { - "on_click": event(lambda event: None, prevent_default=True), - "href": "https://google.com", - }, - "https://google.com", - ), - ) - - -run(DoNotChangePages) diff --git a/docs/source/guides/adding-interactivity/responding-to-events/_examples/stop_event_propagation.py b/docs/source/guides/adding-interactivity/responding-to-events/_examples/stop_event_propagation.py deleted file mode 100644 index 41c575042..000000000 --- a/docs/source/guides/adding-interactivity/responding-to-events/_examples/stop_event_propagation.py +++ /dev/null @@ -1,42 +0,0 @@ -from reactpy import component, event, hooks, html, run - - -@component -def DivInDiv(): - stop_propagatation, set_stop_propagatation = hooks.use_state(True) - inner_count, set_inner_count = hooks.use_state(0) - outer_count, set_outer_count = hooks.use_state(0) - - div_in_div = html.div( - { - "on_click": lambda event: set_outer_count(outer_count + 1), - "style": {"height": "100px", "width": "100px", "background_color": "red"}, - }, - html.div( - { - "on_click": event( - lambda event: set_inner_count(inner_count + 1), - stop_propagation=stop_propagatation, - ), - "style": { - "height": "50px", - "width": "50px", - "background_color": "blue", - }, - } - ), - ) - - return html.div( - html.button( - {"on_click": lambda event: set_stop_propagatation(not stop_propagatation)}, - "Toggle Propagation", - ), - html.pre(f"Will propagate: {not stop_propagatation}"), - html.pre(f"Inner click count: {inner_count}"), - html.pre(f"Outer click count: {outer_count}"), - div_in_div, - ) - - -run(DivInDiv) diff --git a/docs/source/guides/adding-interactivity/responding-to-events/index.rst b/docs/source/guides/adding-interactivity/responding-to-events/index.rst deleted file mode 100644 index 583a4a4b7..000000000 --- a/docs/source/guides/adding-interactivity/responding-to-events/index.rst +++ /dev/null @@ -1,144 +0,0 @@ -Responding to Events -==================== - -ReactPy lets you add event handlers to your parts of the interface. These events handlers -are functions which can be assigned to a part of a UI such that, when a user iteracts -with the interface, those functions get triggered. Examples of interaction include -clicking, hovering, of focusing on form inputs, and more. - - -Adding Event Handlers ---------------------- - -To start out we'll just display a button that, for the moment, doesn't do anything: - -.. reactpy:: _examples/button_does_nothing - -To add an event handler to this button we'll do three things: - -1. Declare a function called ``handle_event(event)`` inside the body of our ``Button`` component -2. Add logic to ``handle_event`` that will print the ``event`` it receives to the console. -3. Add an ``"onClick": handle_event`` attribute to the ``<button>`` element. - -.. reactpy:: _examples/button_prints_event - -.. note:: - - Normally print statements will only be displayed in the terminal where you launched - ReactPy. - -It may feel weird to define a function within a function like this, but doing so allows -the ``handle_event`` function to access information from within the scope of the -component. That's important if you want to use any arguments that may have beend passed -your component in the handler: - -.. reactpy:: _examples/button_prints_message - -With all that said, since our ``handle_event`` function isn't doing that much work, if -we wanted to streamline our component definition, we could pass in our event handler as a -lambda: - -.. code-block:: - - html.button({"onClick": lambda event: print(message_text)}, "Click me!") - - -Supported Event Types ---------------------- - -Since ReactPy's event information comes from React, most the the information (:ref:`with -some exceptions <event data Serialization>`) about how React handles events translates -directly to ReactPy. Follow the links below to learn about each category of event: - -- :ref:`Clipboard Events` -- :ref:`Composition Events` -- :ref:`Keyboard Events` -- :ref:`Focus Events` -- :ref:`Form Events` -- :ref:`Generic Events` -- :ref:`Mouse Events` -- :ref:`Pointer Events` -- :ref:`Selection Events` -- :ref:`Touch Events` -- :ref:`UI Events` -- :ref:`Wheel Events` -- :ref:`Media Events` -- :ref:`Image Events` -- :ref:`Animation Events` -- :ref:`Transition Events` -- :ref:`Other Events` - - -Passing Handlers to Components ------------------------------- - -A common pattern when factoring out common logic is to pass event handlers into a more -generic component definition. This allows the component to focus on the things which are -common while still giving its usages customizablity. Consider the case below where we -want to create a generic ``Button`` component that can be used for a variety of purpose: - -.. reactpy:: _examples/button_handler_as_arg - - -.. _Async Event Handler: - -Async Event Handlers --------------------- - -Sometimes event handlers need to execute asynchronous tasks when they are triggered. -Behind the scenes, ReactPy is running an :mod:`asyncio` event loop for just this purpose. -By defining your event handler as an asynchronous function instead of a normal -synchronous one. In the layout below we sleep for several seconds before printing out a -message in the first button. However, because the event handler is asynchronous, the -handler for the second button is still able to respond: - -.. reactpy:: _examples/button_async_handlers - - -Event Data Serialization ------------------------- - -Not all event data is serialized. The most notable example of this is the lack of a -``target`` key in the dictionary sent back to the handler. Instead, data which is not -inherently JSON serializable must be treated on a case-by-case basis. A simple case -to demonstrate this is the ``currentTime`` attribute of ``audio`` and ``video`` -elements. Normally this would be accessible via ``event.target.currentTime``, but here -it's simply passed in under the key ``currentTime``: - -.. reactpy:: _examples/audio_player - - -Client-side Event Behavior --------------------------- - -Because ReactPy operates server-side, there are inevitable limitations that prevent it from -achieving perfect parity with all the behaviors of React. With that said, any feature -that cannot be achieved in Python with ReactPy, can be done by creating -:ref:`Custom Javascript Components`. - - -Preventing Default Event Actions -................................ - -Instead of calling an ``event.preventDefault()`` method as you would do in React, you -must declare whether to prevent default behavior ahead of time. This can be accomplished -using the :func:`~reactpy.core.events.event` decorator and setting ``prevent_default``. For -example, we can stop a link from going to the specified URL: - -.. reactpy:: _examples/prevent_default_event_actions - -Unfortunately this means you cannot conditionally prevent default behavior in response -to event data without writing :ref:`Custom Javascript Components`. - - -Stop Event Propagation -...................... - -Similarly to :ref:`preventing default behavior <Preventing Default Event Actions>`, you -can use the :func:`~reactpy.core.events.event` decorator to prevent events originating in a -child element from propagating to parent elements by setting ``stop_propagation``. In -the example below we place a red ``div`` inside a parent blue ``div``. When propagation -is turned on, clicking the red element will cause the handler for the outer blue one to -trigger. Conversely, when it's off, only the handler for the red element will trigger. - -.. reactpy:: _examples/stop_event_propagation diff --git a/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/delayed_print_after_set.py b/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/delayed_print_after_set.py deleted file mode 100644 index b6295b09f..000000000 --- a/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/delayed_print_after_set.py +++ /dev/null @@ -1,22 +0,0 @@ -import asyncio - -from reactpy import component, html, run, use_state - - -@component -def Counter(): - number, set_number = use_state(0) - - async def handle_click(event): - set_number(number + 5) - print("about to print...") - await asyncio.sleep(3) - print(number) - - return html.div( - html.h1(number), - html.button({"on_click": handle_click}, "Increment"), - ) - - -run(Counter) diff --git a/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/print_chat_message.py b/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/print_chat_message.py deleted file mode 100644 index ecbad9381..000000000 --- a/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/print_chat_message.py +++ /dev/null @@ -1,44 +0,0 @@ -import asyncio - -from reactpy import component, event, html, run, use_state - - -@component -def App(): - recipient, set_recipient = use_state("Alice") - message, set_message = use_state("") - - @event(prevent_default=True) - async def handle_submit(event): - set_message("") - print("About to send message...") - await asyncio.sleep(5) - print(f"Sent '{message}' to {recipient}") - - return html.form( - {"on_submit": handle_submit, "style": {"display": "inline-grid"}}, - html.label( - {}, - "To: ", - html.select( - { - "value": recipient, - "on_change": lambda event: set_recipient(event["target"]["value"]), - }, - html.option({"value": "Alice"}, "Alice"), - html.option({"value": "Bob"}, "Bob"), - ), - ), - html.input( - { - "type": "text", - "placeholder": "Your message...", - "value": message, - "on_change": lambda event: set_message(event["target"]["value"]), - } - ), - html.button({"type": "submit"}, "Send"), - ) - - -run(App) diff --git a/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/print_count_after_set.py b/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/print_count_after_set.py deleted file mode 100644 index 40ee78259..000000000 --- a/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/print_count_after_set.py +++ /dev/null @@ -1,18 +0,0 @@ -from reactpy import component, html, run, use_state - - -@component -def Counter(): - number, set_number = use_state(0) - - def handle_click(event): - set_number(number + 5) - print(number) - - return html.div( - html.h1(number), - html.button({"on_click": handle_click}, "Increment"), - ) - - -run(Counter) diff --git a/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/send_message.py b/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/send_message.py deleted file mode 100644 index 4702a7464..000000000 --- a/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/send_message.py +++ /dev/null @@ -1,35 +0,0 @@ -from reactpy import component, event, html, run, use_state - - -@component -def App(): - is_sent, set_is_sent = use_state(False) - message, set_message = use_state("") - - if is_sent: - return html.div( - html.h1("Message sent!"), - html.button( - {"on_click": lambda event: set_is_sent(False)}, "Send new message?" - ), - ) - - @event(prevent_default=True) - def handle_submit(event): - set_message("") - set_is_sent(True) - - return html.form( - {"on_submit": handle_submit, "style": {"display": "inline-grid"}}, - html.textarea( - { - "placeholder": "Your message here...", - "value": message, - "on_change": lambda event: set_message(event["target"]["value"]), - } - ), - html.button({"type": "submit"}, "Send"), - ) - - -run(App) diff --git a/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/set_counter_3_times.py b/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/set_counter_3_times.py deleted file mode 100644 index fe97351af..000000000 --- a/docs/source/guides/adding-interactivity/state-as-a-snapshot/_examples/set_counter_3_times.py +++ /dev/null @@ -1,19 +0,0 @@ -from reactpy import component, html, run, use_state - - -@component -def Counter(): - number, set_number = use_state(0) - - def handle_click(event): - set_number(number + 1) - set_number(number + 1) - set_number(number + 1) - - return html.div( - html.h1(number), - html.button({"on_click": handle_click}, "Increment"), - ) - - -run(Counter) diff --git a/docs/source/guides/adding-interactivity/state-as-a-snapshot/_static/direct-state-change.png b/docs/source/guides/adding-interactivity/state-as-a-snapshot/_static/direct-state-change.png deleted file mode 100644 index cfcd9c87f8f4d85dfa04dcc77d3272d13da0c260..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181824 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%0DI9MPu%`-T-Yco1Q~9{JhxjaZJa40!1E7f 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 diff --git a/docs/source/guides/adding-interactivity/state-as-a-snapshot/_static/reactpy-state-change.png b/docs/source/guides/adding-interactivity/state-as-a-snapshot/_static/reactpy-state-change.png deleted file mode 100644 index b36b0514ac1c6a73688dad78d2bd8ae996d328ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569027 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%0DIatoWB#&n16WNqobGCwfh` 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 GVgDaP$Qtzk diff --git a/docs/source/guides/adding-interactivity/state-as-a-snapshot/index.rst b/docs/source/guides/adding-interactivity/state-as-a-snapshot/index.rst deleted file mode 100644 index a677a3e68..000000000 --- a/docs/source/guides/adding-interactivity/state-as-a-snapshot/index.rst +++ /dev/null @@ -1,158 +0,0 @@ -State as a Snapshot -=================== - -When you watch the user interfaces you build change as you interact with them, it's easy -to imagining that they do so because there's some bit of code that modifies the relevant -parts of the view directly. As an illustration, you may think that when a user clicks a -"Send" button, there's code which reaches into the view and adds some text saying -"Message sent!": - -.. image:: _static/direct-state-change.png - -ReactPy works a bit differently though - user interactions cause event handlers to -:ref:`"set state" <Introduction to use_state>` triggering ReactPy to re-render a new -version of the view rather then mutating the existing one. - -.. image:: _static/reactpy-state-change.png - -Given this, when ReactPy "renders" something, it's as if ReactPy has taken a snapshot of the -UI where all the event handlers, local variables and the view itself were calculated -using what state was present at the time of that render. Then, when user interactions -trigger state setters, ReactPy is made away of the newly set state and schedules a -re-render. When this subsequent renders occurs it performs all the same calculations as -before, but with this new state. - -As we've :ref:`already seen <When Variables Aren't Enough>`, state variables are not -like normal variables. Instead, they live outside your components and are managed by -ReactPy. When a component is rendered, ReactPy provides the component a snapshot of the state -in that exact moment. As a result, the view returned by that component is itself a -snapshot of the UI at that time. - - -Setting State Triggers Renders ------------------------------- - -Setting state does not impact the current render, instead it schedules a re-render. It's -only in this subsequent render that changes to state take effect. As a result, setting -state more than once in the context of the same render will not cause those changes to -compound. This makes it easier to reason about how your UI will react to user -interactions because state does not change until the next render. - -Let's experiment with this behaviors of state to see why we should think about it with -respect to these "snapshots" in time. Take a look at the example below and try to guess -how it will behave. **What will the count be after you click the "Increment" button?** - -.. reactpy:: _examples/set_counter_3_times - -Despite the fact that we called ``set_count(count + 1)`` three times, the count only -increments by ``1``! This is perhaps a surprising result, but let's break what's -happening inside the event handler to see why this is happening: - -.. code-block:: - - set_count(count + 1) - set_count(count + 1) - set_count(count + 1) - -On the initial render of your ``Counter`` the ``number`` variable is ``0``. Because we -know that state variables do not change until the next render we ought to be able to -substitute ``number`` with ``0`` everywhere it's referenced within the component until -then. That includes the event handler too we should be able to rewrite the three lines -above as: - -.. code-block:: - - set_count(0 + 1) - set_count(0 + 1) - set_count(0 + 1) - -Even though, we called ``set_count`` three times with what might have seemed like -different values, every time we were actually just doing ``set_count(1)`` on each call. -Only after the event handler returns will ReactPy actually perform the next render where -count is ``1``. When it does, ``number`` will be ``1`` and we'll be able to perform the -same substitution as before to see what the next number will be after we click -"Increment": - -.. code-block:: - - set_count(1 + 1) - set_count(1 + 1) - set_count(1 + 1) - - -State And Delayed Reactions ---------------------------- - -Given what we :ref:`learned above <setting state triggers renders>`, we ought to be able -to reason about what should happen in the example below. What will be printed when the -"Increment" button is clicked? - -.. reactpy:: _examples/print_count_after_set - -If we use the same substitution trick we saw before, we can rewrite these lines: - -.. code-block:: - - set_number(number + 5) - print(number) - -Using the value of ``number`` in the initial render which is ``0``: - -.. code-block:: - - set_number(0 + 5) - print(0) - -Thus when we click the button we should expect that the next render will show ``5``, but -we will ``print`` the number ``0`` instead. The next time we click the view will show -``10`` and the printout will be ``5``. In this sense the print statement, because it -lives within the prior snapshot, trails what is displayed in the next render. - -What if we slightly modify this example, by introducing a delay between when we call -``set_number`` and when we print? Will this behavior remain the same? To add this delay -we'll use an :ref:`async event handler` and :func:`~asyncio.sleep` for some time: - -.. reactpy:: _examples/delayed_print_after_set - -Even though the render completed before the print statement took place, the behavior -remained the same! Despite the fact that the next render took place before the print -statement did, the print statement still relies on the state snapshot from the initial -render. Thus we can continue to use our substitution trick to analyze what's happening: - -.. code-block:: - - set_number(0 + 5) - print("about to print...") - await asyncio.sleep(3) - print(0) - -This property of state, that it remains static within the context of particular render, -while unintuitive at first, is actually an important tool for preventing subtle bugs. -Let's consider the example below where there's a form that sends a message with a 5 -second delay. Imagine a scenario where the user: - -1. Presses the "Send" button with the message "Hello" where "Alice" is the recipient. -2. Then, before the five-second delay ends, the user changes the "To" field to "Bob". - -The first question to ask is "What should happen?" In this case, the user's expectation -is that after they press "Send", changing the recipient, even if the message has not -been sent yet, should not impact where the message is ultimately sent. We then need to -ask what actually happens. Will it print “You said Hello to Alice” or “You said Hello to -Bob”? - -.. reactpy:: _examples/print_chat_message - -As it turns out, the code above matches the user's expectation. This is because ReactPy -keeps the state values fixed within the event handlers defined during a particular -render. As a result, you don't need to worry about whether state has changed while -code in an event handler is running. - -.. card:: - :link: ../multiple-state-updates/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - What if you wanted to read the latest state values before the next render? You’ll - want to use a state updater function, covered on the next page! diff --git a/docs/source/guides/creating-interfaces/html-with-reactpy/index.rst b/docs/source/guides/creating-interfaces/html-with-reactpy/index.rst deleted file mode 100644 index 4a8ba4957..000000000 --- a/docs/source/guides/creating-interfaces/html-with-reactpy/index.rst +++ /dev/null @@ -1,131 +0,0 @@ -HTML With ReactPy -================= - -In a typical Python-based web application the responsibility of defining the view along -with its backing data and logic are distributed between a client and server -respectively. With ReactPy, both these tasks are centralized in a single place. This is -done by allowing HTML interfaces to be constructed in Python. Take a look at the two -code examples below. The first one shows how to make a basic title and todo list using -standard HTML, the second uses ReactPy in Python, and below is a view of what the HTML -would look like if displayed: - -.. grid:: 1 1 2 2 - :margin: 0 - :padding: 0 - - .. grid-item:: - - .. code-block:: html - - <h1>My Todo List</h1> - <ul> - <li>Build a cool new app</li> - <li>Share it with the world!</li> - </ul> - - .. grid-item:: - - .. testcode:: - - from reactpy import html - - html.h1("My Todo List") - html.ul( - html.li("Build a cool new app"), - html.li("Share it with the world!"), - ) - - .. grid-item-card:: - :columns: 12 - - .. raw:: html - - <div style="width: 50%; margin: auto;"> - <h2 style="margin-top: 0px !important;">My Todo List</h2> - <ul> - <li>Build a cool new app</li> - <li>Share it with the world!</li> - </ul> - </div> - -What this shows is that you can recreate the same HTML layouts with ReactPy using functions -from the :mod:`reactpy.html` module. These function share the same names as their -corresponding HTML tags. For instance, the ``<h1/>`` element above has a similarly named -:func:`~reactpy.html.h1` function. With that said, while the code above looks similar, it's -not very useful because we haven't captured the results from these function calls in a -variable. To do this we need to wrap up the layout above into a single -:func:`~reactpy.html.div` and assign it to a variable: - -.. testcode:: - - layout = html.div( - html.h1("My Todo List"), - html.ul( - html.li("Build a cool new app"), - html.li("Share it with the world!"), - ), - ) - - -Adding HTML Attributes ----------------------- - -That's all well and good, but there's more to HTML than just text. What if we wanted to -display an image? In HTMl we'd use the ``<img>`` element and add attributes to it order -to specify a URL to its ``src`` and use some ``style`` to modify and position it: - -.. code-block:: html - - <img - src="https://picsum.photos/id/237/500/300" - class="img-fluid" - style="width: 50%; margin-left: 25%;" - alt="Billie Holiday" - tabindex="0" - /> - -In ReactPy we add these attributes to elements using a dictionary: - -.. testcode:: - - html.img( - { - "src": "https://picsum.photos/id/237/500/300", - "class_name": "img-fluid", - "style": {"width": "50%", "margin_left": "25%"}, - "alt": "Billie Holiday", - } - ) - -.. raw:: html - - <!-- no tabindex since that would ruin accessibility of the page --> - <img - src="https://picsum.photos/id/237/500/300" - class="img-fluid" - style="width: 50%; margin-left: 25%;" - alt="Billie Holiday" - /> - -There are some notable differences. First, all names in ReactPy use ``snake_case`` instead -of dash-separated words. For example, ``tabindex`` and ``margin-left`` become -``tab_index`` and ``margin_left`` respectively. Second, instead of using a string to -specify the ``style`` attribute, we use a dictionary to describe the CSS properties we -want to apply to an element. This is done to avoid having to escape quotes and other -characters in the string. Finally, the ``class`` attribute is renamed to ``class_name`` -to avoid conflicting with the ``class`` keyword in Python. - -For full list of supported attributes and differences from HTML, see the -:ref:`HTML Attributes` reference. - ----------- - - -.. card:: - :link: /guides/understanding-reactpy/representing-html - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Dive into the data structures ReactPy uses to represent HTML diff --git a/docs/source/guides/creating-interfaces/index.rst b/docs/source/guides/creating-interfaces/index.rst deleted file mode 100644 index 78466eaef..000000000 --- a/docs/source/guides/creating-interfaces/index.rst +++ /dev/null @@ -1,128 +0,0 @@ -Creating Interfaces -=================== - -.. toctree:: - :hidden: - - html-with-reactpy/index - your-first-components/index - rendering-data/index - -.. dropdown:: :octicon:`bookmark-fill;2em` What You'll Learn - :color: info - :animate: fade-in - :open: - - .. grid:: 1 2 2 2 - - .. grid-item-card:: :octicon:`code-square` HTML with ReactPy - :link: html-with-reactpy/index - :link-type: doc - - Construct HTML layouts from the basic units of user interface functionality. - - .. grid-item-card:: :octicon:`package` Your First Components - :link: your-first-components/index - :link-type: doc - - Define reusable building blocks that it easier to construct complex - interfaces. - - .. grid-item-card:: :octicon:`database` Rendering Data - :link: rendering-data/index - :link-type: doc - - Use data to organize and render HTML elements and components. - -ReactPy is a Python package for making user interfaces (UI). These interfaces are built -from small elements of functionality like buttons text and images. ReactPy allows you to -combine these elements into reusable, nestable :ref:`"components" <your first -components>`. In the sections that follow you'll learn how these UI elements are created -and organized into components. Then, you'll use components to customize and -conditionally display more complex UIs. - - -Section 1: HTML with ReactPy ----------------------------- - -In a typical Python-base web application the responsibility of defining the view along -with its backing data and logic are distributed between a client and server -respectively. With ReactPy, both these tasks are centralized in a single place. The most -foundational pilar of this capability is formed by allowing HTML interfaces to be -constructed in Python. Let's consider the HTML sample below: - -.. code-block:: html - - <h1>My Todo List</h1> - <ul> - <li>Build a cool new app</li> - <li>Share it with the world!</li> - </ul> - -To recreate the same thing in ReactPy you would write: - -.. code-block:: - - from reactpy import html - - html.div( - html.h1("My Todo List"), - html.ul( - html.li("Design a cool new app"), - html.li("Build it"), - html.li("Share it with the world!"), - ) - ) - -.. card:: - :link: html-with-reactpy/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Construct HTML layouts from the basic units of user interface functionality. - - -Section 2: Your First Components --------------------------------- - -The next building block in our journey with ReactPy are components. At their core, -components are just a normal Python functions that return :ref:`HTML <HTML with ReactPy>`. -The one special thing about them that we'll concern ourselves with now, is that to -create them we need to add an ``@component`` `decorator -<https://realpython.com/primer-on-python-decorators/>`__. To see what this looks like in -practice we'll quickly make a ``Photo`` component: - -.. reactpy:: your-first-components/_examples/simple_photo - -.. card:: - :link: your-first-components/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Define reusable building blocks that it easier to construct complex interfaces. - - -Section 3: Rendering Data -------------------------- - -The last pillar of knowledge you need before you can start making :ref:`interactive -interfaces <adding interactivity>` is the ability to render sections of the UI given a -collection of data. This will require you to understand how elements which are derived -from data in this way must be organized with :ref:`"keys" <Organizing Items With Keys>`. -One case where we might want to do this is if items in a todo list come from a list of -data that we want to sort and filter: - -.. reactpy:: rendering-data/_examples/todo_list_with_keys - -.. card:: - :link: rendering-data/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Use data to organize and render HTML elements and components. diff --git a/docs/source/guides/creating-interfaces/rendering-data/_examples/sorted_and_filtered_todo_list.py b/docs/source/guides/creating-interfaces/rendering-data/_examples/sorted_and_filtered_todo_list.py deleted file mode 100644 index 8be2b5f30..000000000 --- a/docs/source/guides/creating-interfaces/rendering-data/_examples/sorted_and_filtered_todo_list.py +++ /dev/null @@ -1,32 +0,0 @@ -from reactpy import component, html, run - - -@component -def DataList(items, filter_by_priority=None, sort_by_priority=False): - if filter_by_priority is not None: - items = [i for i in items if i["priority"] <= filter_by_priority] - if sort_by_priority: - items = sorted(items, key=lambda i: i["priority"]) - list_item_elements = [html.li(i["text"]) for i in items] - return html.ul(list_item_elements) - - -@component -def TodoList(): - tasks = [ - {"text": "Make breakfast", "priority": 0}, - {"text": "Feed the dog", "priority": 0}, - {"text": "Do laundry", "priority": 2}, - {"text": "Go on a run", "priority": 1}, - {"text": "Clean the house", "priority": 2}, - {"text": "Go to the grocery store", "priority": 2}, - {"text": "Do some coding", "priority": 1}, - {"text": "Read a book", "priority": 1}, - ] - return html.section( - html.h1("My Todo List"), - DataList(tasks, filter_by_priority=1, sort_by_priority=True), - ) - - -run(TodoList) diff --git a/docs/source/guides/creating-interfaces/rendering-data/_examples/todo_from_list.py b/docs/source/guides/creating-interfaces/rendering-data/_examples/todo_from_list.py deleted file mode 100644 index 85ba1d79d..000000000 --- a/docs/source/guides/creating-interfaces/rendering-data/_examples/todo_from_list.py +++ /dev/null @@ -1,28 +0,0 @@ -from reactpy import component, html, run - - -@component -def DataList(items): - list_item_elements = [html.li(text) for text in items] - return html.ul(list_item_elements) - - -@component -def TodoList(): - tasks = [ - "Make breakfast (important)", - "Feed the dog (important)", - "Do laundry", - "Go on a run (important)", - "Clean the house", - "Go to the grocery store", - "Do some coding", - "Read a book (important)", - ] - return html.section( - html.h1("My Todo List"), - DataList(tasks), - ) - - -run(TodoList) diff --git a/docs/source/guides/creating-interfaces/rendering-data/_examples/todo_list_with_keys.py b/docs/source/guides/creating-interfaces/rendering-data/_examples/todo_list_with_keys.py deleted file mode 100644 index 8afd2ae55..000000000 --- a/docs/source/guides/creating-interfaces/rendering-data/_examples/todo_list_with_keys.py +++ /dev/null @@ -1,32 +0,0 @@ -from reactpy import component, html, run - - -@component -def DataList(items, filter_by_priority=None, sort_by_priority=False): - if filter_by_priority is not None: - items = [i for i in items if i["priority"] <= filter_by_priority] - if sort_by_priority: - items = sorted(items, key=lambda i: i["priority"]) - list_item_elements = [html.li({"key": i["id"]}, i["text"]) for i in items] - return html.ul(list_item_elements) - - -@component -def TodoList(): - tasks = [ - {"id": 0, "text": "Make breakfast", "priority": 0}, - {"id": 1, "text": "Feed the dog", "priority": 0}, - {"id": 2, "text": "Do laundry", "priority": 2}, - {"id": 3, "text": "Go on a run", "priority": 1}, - {"id": 4, "text": "Clean the house", "priority": 2}, - {"id": 5, "text": "Go to the grocery store", "priority": 2}, - {"id": 6, "text": "Do some coding", "priority": 1}, - {"id": 7, "text": "Read a book", "priority": 1}, - ] - return html.section( - html.h1("My Todo List"), - DataList(tasks, filter_by_priority=1, sort_by_priority=True), - ) - - -run(TodoList) diff --git a/docs/source/guides/creating-interfaces/rendering-data/index.rst b/docs/source/guides/creating-interfaces/rendering-data/index.rst deleted file mode 100644 index 8b11ac439..000000000 --- a/docs/source/guides/creating-interfaces/rendering-data/index.rst +++ /dev/null @@ -1,297 +0,0 @@ -Rendering Data -============== - -Frequently you need to construct a number of similar components from a collection of -data. Let's imagine that we want to create a todo list that can be ordered and filtered -on the priority of each item in the list. To start, we'll take a look at the kind of -view we'd like to display: - -.. code-block:: html - - <ul> - <li>Make breakfast (important)</li> - <li>Feed the dog (important)</li> - <li>Do laundry</li> - <li>Go on a run (important)</li> - <li>Clean the house</li> - <li>Go to the grocery store</li> - <li>Do some coding</li> - <li>Read a book (important)</li> - </ul> - -Based on this, our next step in achieving our goal is to break this view down into the -underlying data that we'd want to use to represent it. The most straightforward way to -do this would be to just put the text of each ``<li>`` into a list: - -.. testcode:: - - tasks = [ - "Make breakfast (important)", - "Feed the dog (important)", - "Do laundry", - "Go on a run (important)", - "Clean the house", - "Go to the grocery store", - "Do some coding", - "Read a book (important)", - ] - -We could then take this list and "render" it into a series of ``<li>`` elements: - -.. testcode:: - - from reactpy import html - - list_item_elements = [html.li(text) for text in tasks] - -This list of elements can then be passed into a parent ``<ul>`` element: - -.. testcode:: - - list_element = html.ul(list_item_elements) - -The last thing we have to do is return this from a component: - -.. reactpy:: _examples/todo_from_list - - -Filtering and Sorting Elements ------------------------------- - -Our representation of ``tasks`` worked fine to just get them on the screen, but it -doesn't extend well to the case where we want to filter and order them based on -priority. Thus, we need to change the data structure we're using to represent our tasks: - -.. testcode:: - - tasks = [ - {"text": "Make breakfast", "priority": 0}, - {"text": "Feed the dog", "priority": 0}, - {"text": "Do laundry", "priority": 2}, - {"text": "Go on a run", "priority": 1}, - {"text": "Clean the house", "priority": 2}, - {"text": "Go to the grocery store", "priority": 2}, - {"text": "Do some coding", "priority": 1}, - {"text": "Read a book", "priority": 1}, - ] - -With this we can now imaging writing some filtering and sorting logic using Python's -:func:`filter` and :func:`sorted` functions respectively. We'll do this by only -displaying items whose ``priority`` is less than or equal to some ``filter_by_priority`` -and then ordering the elements based on the ``priority``: - -.. testcode:: - - filter_by_priority = 1 - sort_by_priority = True - - filtered_tasks = tasks - if filter_by_priority is not None: - filtered_tasks = [t for t in filtered_tasks if t["priority"] <= filter_by_priority] - if sort_by_priority: - filtered_tasks = list(sorted(filtered_tasks, key=lambda t: t["priority"])) - - assert filtered_tasks == [ - {'text': 'Make breakfast', 'priority': 0}, - {'text': 'Feed the dog', 'priority': 0}, - {'text': 'Go on a run', 'priority': 1}, - {'text': 'Do some coding', 'priority': 1}, - {'text': 'Read a book', 'priority': 1}, - ] - -We could then add this code to our ``DataList`` component: - -.. warning:: - - The code below produces a bunch of warnings! Be sure to tead the - :ref:`next section <Organizing Items With Keys>` to find out why. - -.. reactpy:: _examples/sorted_and_filtered_todo_list - - -Organizing Items With Keys --------------------------- - -If you run the examples above :ref:`in debug mode <Running ReactPy in Debug Mode>` you'll -see the server log a bunch of errors that look something like: - -.. code-block:: text - - Key not specified for child in list {'tagName': 'li', 'children': ...} - -What this is telling us is that we haven't specified a unique ``key`` for each of the -items in our todo list. In order to silence this warning we need to expand our data -structure even further to include a unique ID for each item in our todo list: - -.. testcode:: - - tasks = [ - {"id": 0, "text": "Make breakfast", "priority": 0}, - {"id": 1, "text": "Feed the dog", "priority": 0}, - {"id": 2, "text": "Do laundry", "priority": 2}, - {"id": 3, "text": "Go on a run", "priority": 1}, - {"id": 4, "text": "Clean the house", "priority": 2}, - {"id": 5, "text": "Go to the grocery store", "priority": 2}, - {"id": 6, "text": "Do some coding", "priority": 1}, - {"id": 7, "text": "Read a book", "priority": 1}, - ] - -Then, as we're constructing our ``<li>`` elements we'll declare a ``key`` attribute: - -.. code-block:: - - list_item_elements = [html.li({"key": t["id"]}, t["text"]) for t in tasks] - -This ``key`` tells ReactPy which ``<li>`` element corresponds to which item of data in our -``tasks`` list. This becomes important if the order or number of items in your list can -change. In our case, if we decided to change whether we want to ``filter_by_priority`` -or ``sort_by_priority`` the items in our ``<ul>`` element would change. Given this, -here's how we'd change our component: - -.. reactpy:: _examples/todo_list_with_keys - - -Keys for Components -................... - -Thus far we've been talking about passing keys to standard HTML elements. However, this -principle also applies to components too. Every function decorated with the -``@component`` decorator automatically gets a ``key`` parameter that operates in the -exact same way that it does for standard HTML elements: - -.. testcode:: - - from reactpy import component - - - @component - def ListItem(text): - return html.li(text) - - tasks = [ - {"id": 0, "text": "Make breakfast"}, - {"id": 1, "text": "Feed the dog"}, - {"id": 2, "text": "Do laundry"}, - {"id": 3, "text": "Go on a run"}, - {"id": 4, "text": "Clean the house"}, - {"id": 5, "text": "Go to the grocery store"}, - {"id": 6, "text": "Do some coding"}, - {"id": 7, "text": "Read a book"}, - ] - - list_element = [ListItem(t["text"], key=t["id"]) for t in tasks] - - -.. warning:: - - The ``key`` argument is reserved for this purpose. Defining a component with a - function that has a ``key`` parameter will cause an error: - - .. testcode:: - - from reactpy import component - - @component - def FunctionWithKeyParam(key): - ... - - .. testoutput:: - - Traceback (most recent call last): - ... - TypeError: Component render function ... uses reserved parameter 'key' - - -Rules of Keys -............. - -In order to avoid unexpected behaviors when rendering data with keys, there are a few -rules that need to be followed. These will ensure that each item of data is associated -with the correct UI element. - -.. dropdown:: Keys may be the same if their elements are not siblings - :color: info - - If two elements have different parents in the UI, they can use the same keys. - - .. testcode:: - - data_1 = [ - {"id": 1, "text": "Something"}, - {"id": 2, "text": "Something else"}, - ] - - data_2 = [ - {"id": 1, "text": "Another thing"}, - {"id": 2, "text": "Yet another thing"}, - ] - - html.section( - html.ul([html.li(data["text"], key=data["id"]) for data in data_1]), - html.ul([html.li(data["text"], key=data["id"]) for data in data_2]), - ) - -.. dropdown:: Keys must be unique amongst siblings - :color: danger - - Keys must be unique among siblings. - - .. testcode:: - - data = [ - {"id": 1, "text": "Something"}, - {"id": 2, "text": "Something else"}, - {"id": 1, "text": "Another thing"}, # BAD: has a duplicated id - {"id": 2, "text": "Yet another thing"}, # BAD: has a duplicated id - ] - - html.section( - html.ul([html.li(data["text"], key=data["id"]) for data in data]), - ) - -.. dropdown:: Keys must be fixed to their data. - :color: danger - - Don't generate random values for keys to avoid the warning. - - .. testcode:: - - from random import random - - data = [ - {"id": random(), "text": "Something"}, - {"id": random(), "text": "Something else"}, - {"id": random(), "text": "Another thing"}, - {"id": random(), "text": "Yet another thing"}, - ] - - html.section( - html.ul([html.li(data["text"], key=data["id"]) for data in data]), - ) - - Doing so will result in unexpected behavior. - -Since we've just been working with a small amount of sample data thus far, it was easy -enough for us to manually add an ``id`` key to each item of data. Often though, we have -to work with data that already exists. In those cases, how should we pick what value to -use for each ``key``? - -- If your data comes from your database you should use the keys and IDs generated by - that database since these are inherently unique. For example, you might use the - primary key of records in a relational database. - -- If your data is generated and persisted locally (e.g. notes in a note-taking app), use - an incrementing counter or :mod:`uuid` from the standard library when creating items. - - ----------- - - -.. card:: - :link: /guides/understanding-reactpy/why-reactpy-needs-keys - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Learn about why ReactPy needs keys in the first place. diff --git a/docs/source/guides/creating-interfaces/your-first-components/_examples/bad_conditional_todo_list.py b/docs/source/guides/creating-interfaces/your-first-components/_examples/bad_conditional_todo_list.py deleted file mode 100644 index 1ed3268b6..000000000 --- a/docs/source/guides/creating-interfaces/your-first-components/_examples/bad_conditional_todo_list.py +++ /dev/null @@ -1,24 +0,0 @@ -from reactpy import component, html, run - - -@component -def Item(name, done): - if done: - return html.li(name, " ✔") - else: - return html.li(name) - - -@component -def TodoList(): - return html.section( - html.h1("My Todo List"), - html.ul( - Item("Find a cool problem to solve", done=True), - Item("Build an app to solve it", done=True), - Item("Share that app with the world!", done=False), - ), - ) - - -run(TodoList) diff --git a/docs/source/guides/creating-interfaces/your-first-components/_examples/good_conditional_todo_list.py b/docs/source/guides/creating-interfaces/your-first-components/_examples/good_conditional_todo_list.py deleted file mode 100644 index cd9ab6fc0..000000000 --- a/docs/source/guides/creating-interfaces/your-first-components/_examples/good_conditional_todo_list.py +++ /dev/null @@ -1,21 +0,0 @@ -from reactpy import component, html, run - - -@component -def Item(name, done): - return html.li(name, " ✔" if done else "") - - -@component -def TodoList(): - return html.section( - html.h1("My Todo List"), - html.ul( - Item("Find a cool problem to solve", done=True), - Item("Build an app to solve it", done=True), - Item("Share that app with the world!", done=False), - ), - ) - - -run(TodoList) diff --git a/docs/source/guides/creating-interfaces/your-first-components/_examples/nested_photos.py b/docs/source/guides/creating-interfaces/your-first-components/_examples/nested_photos.py deleted file mode 100644 index 96f8531d3..000000000 --- a/docs/source/guides/creating-interfaces/your-first-components/_examples/nested_photos.py +++ /dev/null @@ -1,25 +0,0 @@ -from reactpy import component, html, run - - -@component -def Photo(): - return html.img( - { - "src": "https://picsum.photos/id/274/500/300", - "style": {"width": "30%"}, - "alt": "Ray Charles", - } - ) - - -@component -def Gallery(): - return html.section( - html.h1("Famous Musicians"), - Photo(), - Photo(), - Photo(), - ) - - -run(Gallery) diff --git a/docs/source/guides/creating-interfaces/your-first-components/_examples/parametrized_photos.py b/docs/source/guides/creating-interfaces/your-first-components/_examples/parametrized_photos.py deleted file mode 100644 index 665dd8c86..000000000 --- a/docs/source/guides/creating-interfaces/your-first-components/_examples/parametrized_photos.py +++ /dev/null @@ -1,25 +0,0 @@ -from reactpy import component, html, run - - -@component -def Photo(alt_text, image_id): - return html.img( - { - "src": f"https://picsum.photos/id/{image_id}/500/200", - "style": {"width": "50%"}, - "alt": alt_text, - } - ) - - -@component -def Gallery(): - return html.section( - html.h1("Photo Gallery"), - Photo("Landscape", image_id=830), - Photo("City", image_id=274), - Photo("Puppy", image_id=237), - ) - - -run(Gallery) diff --git a/docs/source/guides/creating-interfaces/your-first-components/_examples/simple_photo.py b/docs/source/guides/creating-interfaces/your-first-components/_examples/simple_photo.py deleted file mode 100644 index 94fa6633f..000000000 --- a/docs/source/guides/creating-interfaces/your-first-components/_examples/simple_photo.py +++ /dev/null @@ -1,15 +0,0 @@ -from reactpy import component, html, run - - -@component -def Photo(): - return html.img( - { - "src": "https://picsum.photos/id/237/500/300", - "style": {"width": "50%"}, - "alt": "Puppy", - } - ) - - -run(Photo) diff --git a/docs/source/guides/creating-interfaces/your-first-components/_examples/todo_list.py b/docs/source/guides/creating-interfaces/your-first-components/_examples/todo_list.py deleted file mode 100644 index 2ffd09261..000000000 --- a/docs/source/guides/creating-interfaces/your-first-components/_examples/todo_list.py +++ /dev/null @@ -1,21 +0,0 @@ -from reactpy import component, html, run - - -@component -def Item(name, done): - return html.li(name) - - -@component -def TodoList(): - return html.section( - html.h1("My Todo List"), - html.ul( - Item("Find a cool problem to solve", done=True), - Item("Build an app to solve it", done=True), - Item("Share that app with the world!", done=False), - ), - ) - - -run(TodoList) diff --git a/docs/source/guides/creating-interfaces/your-first-components/_examples/wrap_in_div.py b/docs/source/guides/creating-interfaces/your-first-components/_examples/wrap_in_div.py deleted file mode 100644 index 58ed79dd8..000000000 --- a/docs/source/guides/creating-interfaces/your-first-components/_examples/wrap_in_div.py +++ /dev/null @@ -1,13 +0,0 @@ -from reactpy import component, html, run - - -@component -def MyTodoList(): - return html.div( - html.h1("My Todo List"), - html.img({"src": "https://picsum.photos/id/0/500/300"}), - html.ul(html.li("The first thing I need to do is...")), - ) - - -run(MyTodoList) diff --git a/docs/source/guides/creating-interfaces/your-first-components/_examples/wrap_in_fragment.py b/docs/source/guides/creating-interfaces/your-first-components/_examples/wrap_in_fragment.py deleted file mode 100644 index cc54d8b71..000000000 --- a/docs/source/guides/creating-interfaces/your-first-components/_examples/wrap_in_fragment.py +++ /dev/null @@ -1,13 +0,0 @@ -from reactpy import component, html, run - - -@component -def MyTodoList(): - return html._( - html.h1("My Todo List"), - html.img({"src": "https://picsum.photos/id/0/500/200"}), - html.ul(html.li("The first thing I need to do is...")), - ) - - -run(MyTodoList) diff --git a/docs/source/guides/creating-interfaces/your-first-components/index.rst b/docs/source/guides/creating-interfaces/your-first-components/index.rst deleted file mode 100644 index 00b53d1b7..000000000 --- a/docs/source/guides/creating-interfaces/your-first-components/index.rst +++ /dev/null @@ -1,134 +0,0 @@ -Your First Components -===================== - -As we learned :ref:`earlier <HTML with ReactPy>` we can use ReactPy to make rich structured -documents out of standard HTML elements. As these documents become larger and more -complex though, working with these tiny UI elements can become difficult. When this -happens, ReactPy allows you to group these elements together info "components". These -components can then be reused throughout your application. - - -Defining a Component --------------------- - -At their core, components are just normal Python functions that return HTML. To define a -component you just need to add a ``@component`` `decorator -<https://realpython.com/primer-on-python-decorators/>`__ to a function. Functions -decorator in this way are known as **render function** and, by convention, we name them -like classes - with ``CamelCase``. So consider what we would do if we wanted to write, -and then :ref:`display <Running ReactPy>` a ``Photo`` component: - -.. reactpy:: _examples/simple_photo - -.. warning:: - - If we had not decorated our ``Photo``'s render function with the ``@component`` - decorator, the server would start, but as soon as we tried to view the page it would - be blank. The servers logs would then indicate: - - .. code-block:: text - - TypeError: Expected a ComponentType, not dict. - - -Using a Component ------------------ - -Having defined our ``Photo`` component we can now nest it inside of other components. We -can define a "parent" ``Gallery`` component that returns one or more ``Profile`` -components. This is part of what makes components so powerful - you can define a -component once and use it wherever and however you need to: - -.. reactpy:: _examples/nested_photos - - -Return a Single Root Element ----------------------------- - -Components must return a "single root element". That one root element may have children, -but you cannot for example, return a list of element from a component and expect it to -be rendered correctly. If you want to return multiple elements you must wrap them in -something like a :func:`html.div <reactpy.html.div>`: - -.. reactpy:: _examples/wrap_in_div - -If don't want to add an extra ``div`` you can use a "fragment" instead with the -:func:`html._ <reactpy.html._>` function: - -.. reactpy:: _examples/wrap_in_fragment - -Fragments allow you to group elements together without leaving any trace in the UI. For -example, the first code sample written with ReactPy will produce the second HTML code -block: - -.. grid:: 1 2 2 2 - :margin: 0 - :padding: 0 - - .. grid-item:: - - .. testcode:: - - from reactpy import html - - html.ul( - html._( - html.li("Group 1 Item 1"), - html.li("Group 1 Item 2"), - html.li("Group 1 Item 3"), - ), - html._( - html.li("Group 2 Item 1"), - html.li("Group 2 Item 2"), - html.li("Group 2 Item 3"), - ) - ) - - .. grid-item:: - - .. code-block:: html - - <ul> - <li>Group 1 Item 1</li> - <li>Group 1 Item 2</li> - <li>Group 1 Item 3</li> - <li>Group 2 Item 1</li> - <li>Group 2 Item 2</li> - <li>Group 2 Item 3</li> - </ul> - - - -Parametrizing Components ------------------------- - -Since components are just regular functions, you can add parameters to them. This allows -parent components to pass information to child components. Where standard HTML elements -are parametrized by dictionaries, since components behave like typical functions you can -give them positional and keyword arguments as you would normally: - -.. reactpy:: _examples/parametrized_photos - - -Conditional Rendering ---------------------- - -Your components will often need to display different things depending on different -conditions. Let's imagine that we had a basic todo list where only some of the items -have been completed. Below we have a basic implementation for such a list except that -the ``Item`` component doesn't change based on whether it's ``done``: - -.. reactpy:: _examples/todo_list - -Let's imagine that we want to add a ✔ to the items which have been marked ``done=True``. -One way to do this might be to write an ``if`` statement where we return one ``li`` -element if the item is ``done`` and a different one if it's not: - -.. reactpy:: _examples/bad_conditional_todo_list - -As you can see this accomplishes our goal! However, notice how similar ``html.li(name, " -✔")`` and ``html.li(name)`` are. While in this case it isn't especially harmful, we -could make our code a little easier to read and maintain by using an "inline" ``if`` -statement. - -.. reactpy:: _examples/good_conditional_todo_list diff --git a/docs/source/guides/escape-hatches/_examples/material_ui_button_no_action.py b/docs/source/guides/escape-hatches/_examples/material_ui_button_no_action.py deleted file mode 100644 index 3ad4dac5b..000000000 --- a/docs/source/guides/escape-hatches/_examples/material_ui_button_no_action.py +++ /dev/null @@ -1,16 +0,0 @@ -from reactpy import component, run, web - -mui = web.module_from_template( - "react@^17.0.0", - "@material-ui/core@4.12.4", - fallback="⌛", -) -Button = web.export(mui, "Button") - - -@component -def HelloWorld(): - return Button({"color": "primary", "variant": "contained"}, "Hello World!") - - -run(HelloWorld) diff --git a/docs/source/guides/escape-hatches/_examples/material_ui_button_on_click.py b/docs/source/guides/escape-hatches/_examples/material_ui_button_on_click.py deleted file mode 100644 index 3fc684005..000000000 --- a/docs/source/guides/escape-hatches/_examples/material_ui_button_on_click.py +++ /dev/null @@ -1,30 +0,0 @@ -import json - -import reactpy - -mui = reactpy.web.module_from_template( - "react@^17.0.0", - "@material-ui/core@4.12.4", - fallback="⌛", -) -Button = reactpy.web.export(mui, "Button") - - -@reactpy.component -def ViewButtonEvents(): - event, set_event = reactpy.hooks.use_state(None) - - return reactpy.html.div( - Button( - { - "color": "primary", - "variant": "contained", - "onClick": lambda event: set_event(event), - }, - "Click Me!", - ), - reactpy.html.pre(json.dumps(event, indent=2)), - ) - - -reactpy.run(ViewButtonEvents) diff --git a/docs/source/guides/escape-hatches/_examples/super_simple_chart/main.py b/docs/source/guides/escape-hatches/_examples/super_simple_chart/main.py deleted file mode 100644 index 4640785f8..000000000 --- a/docs/source/guides/escape-hatches/_examples/super_simple_chart/main.py +++ /dev/null @@ -1,32 +0,0 @@ -from pathlib import Path - -from reactpy import component, run, web - -file = Path(__file__).parent / "super-simple-chart.js" -ssc = web.module_from_file("super-simple-chart", file, fallback="⌛") -SuperSimpleChart = web.export(ssc, "SuperSimpleChart") - - -@component -def App(): - return SuperSimpleChart( - { - "data": [ - {"x": 1, "y": 2}, - {"x": 2, "y": 4}, - {"x": 3, "y": 7}, - {"x": 4, "y": 3}, - {"x": 5, "y": 5}, - {"x": 6, "y": 9}, - {"x": 7, "y": 6}, - ], - "height": 300, - "width": 500, - "color": "royalblue", - "lineWidth": 4, - "axisColor": "silver", - } - ) - - -run(App) diff --git a/docs/source/guides/escape-hatches/_examples/super_simple_chart/super-simple-chart.js b/docs/source/guides/escape-hatches/_examples/super_simple_chart/super-simple-chart.js deleted file mode 100644 index 486e5c363..000000000 --- a/docs/source/guides/escape-hatches/_examples/super_simple_chart/super-simple-chart.js +++ /dev/null @@ -1,82 +0,0 @@ -import { h, render } from "https://unpkg.com/preact?module"; -import htm from "https://unpkg.com/htm?module"; - -const html = htm.bind(h); - -export function bind(node, config) { - return { - create: (component, props, children) => h(component, props, ...children), - render: (element) => render(element, node), - unmount: () => render(null, node), - }; -} - -export function SuperSimpleChart(props) { - const data = props.data; - const lastDataIndex = data.length - 1; - - const options = { - height: props.height || 100, - width: props.width || 100, - color: props.color || "blue", - lineWidth: props.lineWidth || 2, - axisColor: props.axisColor || "black", - }; - - const xData = data.map((point) => point.x); - const yData = data.map((point) => point.y); - - const domain = { - xMin: Math.min(...xData), - xMax: Math.max(...xData), - yMin: Math.min(...yData), - yMax: Math.max(...yData), - }; - - return html`<svg - width="${options.width}px" - height="${options.height}px" - viewBox="0 0 ${options.width} ${options.height}" - > - ${makePath(props, domain, data, options)} ${makeAxis(props, options)} - </svg>`; -} - -function makePath(props, domain, data, options) { - const { xMin, xMax, yMin, yMax } = domain; - const { width, height } = options; - const getSvgX = (x) => ((x - xMin) / (xMax - xMin)) * width; - const getSvgY = (y) => height - ((y - yMin) / (yMax - yMin)) * height; - - let pathD = - `M ${getSvgX(data[0].x)} ${getSvgY(data[0].y)} ` + - data.map(({ x, y }, i) => `L ${getSvgX(x)} ${getSvgY(y)}`).join(" "); - - return html`<path - d="${pathD}" - style=${{ - stroke: options.color, - strokeWidth: options.lineWidth, - fill: "none", - }} - />`; -} - -function makeAxis(props, options) { - return html`<g> - <line - x1="0" - y1=${options.height} - x2=${options.width} - y2=${options.height} - style=${{ stroke: options.axisColor, strokeWidth: options.lineWidth * 2 }} - /> - <line - x1="0" - y1="0" - x2="0" - y2=${options.height} - style=${{ stroke: options.axisColor, strokeWidth: options.lineWidth * 2 }} - /> - </g>`; -} diff --git a/docs/source/guides/escape-hatches/distributing-javascript.rst b/docs/source/guides/escape-hatches/distributing-javascript.rst deleted file mode 100644 index 9eb478965..000000000 --- a/docs/source/guides/escape-hatches/distributing-javascript.rst +++ /dev/null @@ -1,307 +0,0 @@ -Distributing Javascript -======================= - -There are two ways that you can distribute your :ref:`Custom Javascript Components`: - -- Using a CDN_ -- In a Python package via PyPI_ - -These options are not mutually exclusive though, and it may be beneficial to support -both options. For example, if you upload your Javascript components to NPM_ and also -bundle your Javascript inside a Python package, in principle your users can determine -which work best for them. Regardless though, either you or, if you give then the choice, -your users, will have to consider the tradeoffs of either approach. - -- :ref:`Distributing Javascript via CDN_` - Most useful in production-grade applications - where its assumed the user has a network connection. In this scenario a CDN's `edge - network <https://en.wikipedia.org/wiki/Edge_computing>`__ can be used to bring the - Javascript source closer to the user in order to reduce page load times. - -- :ref:`Distributing Javascript via PyPI_` - This method is ideal for local usage since - the user can server all the Javascript components they depend on from their computer - without requiring a network connection. - - -Distributing Javascript via CDN_ --------------------------------- - -Under this approach, to simplify these instructions, we're going to ignore the problem -of distributing the Javascript since that must be handled by your CDN. For open source -or personal projects, a CDN like https://unpkg.com/ makes things easy by automatically -preparing any package that's been uploaded to NPM_. If you need to roll with your own -private CDN, this will likely be more complicated. - -In either case though, on the Python side, things are quite simple. You need only pass -the URL where your package can be found to :func:`~reactpy.web.module.module_from_url` -where you can then load any of its exports: - -.. code-block:: - - import reactpy - - your_module = ido.web.module_from_url("https://some.cdn/your-module") - YourComponent = reactpy.web.export(your_module, "YourComponent") - - -Distributing Javascript via PyPI_ ---------------------------------- - -This can be most easily accomplished by using the `template repository`_ that's been -purpose-built for this. However, to get a better sense for its inner workings, we'll -briefly look at what's required. At a high level, we must consider how to... - -1. bundle your Javascript into an `ECMAScript Module`) -2. include that Javascript bundle in a Python package -3. use it as a component in your application using ReactPy - -In the descriptions to follow we'll be assuming that: - -- NPM_ is the Javascript package manager -- The components are implemented with React_ -- Rollup_ bundles the Javascript module -- Setuptools_ builds the Python package - -To start, let's take a look at the file structure we'll be building: - -.. code-block:: text - - your-project - |-- js - | |-- src - | | \-- index.js - | |-- package.json - | \-- rollup.config.js - |-- your_python_package - | |-- __init__.py - | \-- widget.py - |-- Manifest.in - |-- pyproject.toml - \-- setup.py - -``index.js`` should contain the relevant exports (see -:ref:`Custom JavaScript Components` for more info): - -.. code-block:: javascript - - import * as React from "react"; - import * as ReactDOM from "react-dom"; - - export function bind(node, config) { - return { - create: (component, props, children) => - React.createElement(component, props, ...children), - render: (element) => ReactDOM.render(element, node), - unmount: () => ReactDOM.unmountComponentAtNode(node), - }; - } - - // exports for your components - export YourFirstComponent(props) {...}; - export YourSecondComponent(props) {...}; - export YourThirdComponent(props) {...}; - - -Your ``package.json`` should include the following: - -.. code-block:: python - - { - "name": "YOUR-PACKAGE-NAME", - "scripts": { - "build": "rollup --config", - ... - }, - "devDependencies": { - "rollup": "^2.35.1", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-node-resolve": "^5.2.0", - "rollup-plugin-replace": "^2.2.0", - ... - }, - "dependencies": { - "react": "^17.0.1", - "react-dom": "^17.0.1", - "@reactpy/client": "^0.8.5", - ... - }, - ... - } - -Getting a bit more in the weeds now, your ``rollup.config.js`` file should be designed -such that it drops an ES Module at ``your-project/your_python_package/bundle.js`` since -we'll be writing ``widget.py`` under that assumption. - -.. note:: - - Don't forget to ignore this ``bundle.js`` file when committing code (with a - ``.gitignore`` if you're using Git) since it can always rebuild from the raw - Javascript source in ``your-project/js``. - -.. code-block:: javascript - - import resolve from "rollup-plugin-node-resolve"; - import commonjs from "rollup-plugin-commonjs"; - import replace from "rollup-plugin-replace"; - - export default { - input: "src/index.js", - output: { - file: "../your_python_package/bundle.js", - format: "esm", - }, - plugins: [ - resolve(), - commonjs(), - replace({ - "process.env.NODE_ENV": JSON.stringify("production"), - }), - ] - }; - -Your ``widget.py`` file should then load the neighboring bundle file using -:func:`~reactpy.web.module.module_from_file`. Then components from that bundle can be -loaded with :func:`~reactpy.web.module.export`. - -.. code-block:: - - from pathlib import Path - - import reactpy - - _BUNDLE_PATH = Path(__file__).parent / "bundle.js" - _WEB_MODULE = reactpy.web.module_from_file( - # Note that this is the same name from package.json - this must be globally - # unique since it must share a namespace with all other javascript packages. - name="YOUR-PACKAGE-NAME", - file=_BUNDLE_PATH, - # What to temporarily display while the module is being loaded - fallback="Loading...", - ) - - # Your module must provide a named export for YourFirstComponent - YourFirstComponent = reactpy.web.export(_WEB_MODULE, "YourFirstComponent") - - # It's possible to export multiple components at once - YourSecondComponent, YourThirdComponent = reactpy.web.export( - _WEB_MODULE, ["YourSecondComponent", "YourThirdComponent"] - ) - -.. note:: - - When :data:`reactpy.config.REACTPY_DEBUG_MODE` is active, named exports will be validated. - -The remaining files that we need to create are concerned with creating a Python package. -We won't cover all the details here, so refer to the Setuptools_ documentation for -more information. With that said, the first file to fill out is `pyproject.toml` since -we need to declare what our build tool is (in this case Setuptools): - -.. code-block:: toml - - [build-system] - requires = ["setuptools>=40.8.0", "wheel"] - build-backend = "setuptools.build_meta" - -Then, we can create the ``setup.py`` file which uses Setuptools. This will differ -substantially from a normal ``setup.py`` file since, as part of the build process we'll -need to use NPM to bundle our Javascript. This requires customizing some of the build -commands in Setuptools like ``build``, ``sdist``, and ``develop``: - -.. code-block:: python - - import subprocess - from pathlib import Path - - from setuptools import setup, find_packages - from distutils.command.build import build - from distutils.command.sdist import sdist - from setuptools.command.develop import develop - - PACKAGE_SPEC = {} # gets passed to setup() at the end - - - # ----------------------------------------------------------------------------- - # General Package Info - # ----------------------------------------------------------------------------- - - - PACKAGE_NAME = "your_python_package" - - PACKAGE_SPEC.update( - name=PACKAGE_NAME, - version="0.0.1", - packages=find_packages(exclude=["tests*"]), - classifiers=["Framework :: ReactPy", ...], - keywords=["ReactPy", "components", ...], - # install ReactPy with this package - install_requires=["reactpy"], - # required in order to include static files like bundle.js using MANIFEST.in - include_package_data=True, - # we need access to the file system, so cannot be run from a zip file - zip_safe=False, - ) - - - # ---------------------------------------------------------------------------- - # Build Javascript - # ---------------------------------------------------------------------------- - - - # basic paths used to gather files - PROJECT_ROOT = Path(__file__).parent - PACKAGE_DIR = PROJECT_ROOT / PACKAGE_NAME - JS_DIR = PROJECT_ROOT / "js" - - - def build_javascript_first(cls): - class Command(cls): - def run(self): - for cmd_str in ["npm install", "npm run build"]: - subprocess.run(cmd_str.split(), cwd=str(JS_DIR), check=True) - super().run() - - return Command - - - package["cmdclass"] = { - "sdist": build_javascript_first(sdist), - "build": build_javascript_first(build), - "develop": build_javascript_first(develop), - } - - - # ----------------------------------------------------------------------------- - # Run It - # ----------------------------------------------------------------------------- - - - if __name__ == "__main__": - setup(**package) - - -Finally, since we're using ``include_package_data`` you'll need a MANIFEST.in_ file that -includes ``bundle.js``: - -.. code-block:: text - - include your_python_package/bundle.js - -And that's it! While this might seem like a lot of work, you're always free to start -creating your custom components using the provided `template repository`_ so you can get -up and running as quickly as possible. - - -.. Links -.. ===== - -.. _NPM: https://www.npmjs.com -.. _install NPM: https://www.npmjs.com/get-npm -.. _CDN: https://en.wikipedia.org/wiki/Content_delivery_network -.. _PyPI: https://pypi.org/ -.. _template repository: https://github.com/reactive-python/reactpy-js-component-template -.. _web module: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules -.. _Rollup: https://rollupjs.org/guide/en/ -.. _Webpack: https://webpack.js.org/ -.. _Setuptools: https://setuptools.readthedocs.io/en/latest/userguide/index.html -.. _ECMAScript Module: https://tc39.es/ecma262/#sec-modules -.. _React: https://reactjs.org -.. _MANIFEST.in: https://packaging.python.org/guides/using-manifest-in/ diff --git a/docs/source/guides/escape-hatches/index.rst b/docs/source/guides/escape-hatches/index.rst deleted file mode 100644 index 3ef1b7122..000000000 --- a/docs/source/guides/escape-hatches/index.rst +++ /dev/null @@ -1,14 +0,0 @@ -Escape Hatches -============== - -.. toctree:: - :hidden: - - javascript-components - distributing-javascript - using-a-custom-backend - using-a-custom-client - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/escape-hatches/javascript-components.rst b/docs/source/guides/escape-hatches/javascript-components.rst deleted file mode 100644 index f0a71b6b7..000000000 --- a/docs/source/guides/escape-hatches/javascript-components.rst +++ /dev/null @@ -1,146 +0,0 @@ -.. _Javascript Component: - -Javascript Components -===================== - -While ReactPy is a great tool for displaying HTML and responding to browser events with -pure Python, there are other projects which already allow you to do this inside -`Jupyter Notebooks <https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20Basics.html>`__ -or in standard -`web apps <https://blog.jupyter.org/and-voil%C3%A0-f6a2c08a4a93?gi=54b835a2fcce>`__. -The real power of ReactPy comes from its ability to seamlessly leverage the existing -Javascript ecosystem. This can be accomplished in different ways for different reasons: - -.. list-table:: - :header-rows: 1 - - * - Integration Method - - Use Case - - * - :ref:`Dynamically Loaded Components` - - You want to **quickly experiment** with ReactPy and the Javascript ecosystem. - - * - :ref:`Custom Javascript Components` - - You want to create polished software that can be **easily shared** with others. - - -.. _Dynamically Loaded Component: - -Dynamically Loaded Components ------------------------------ - -.. note:: - - This method is not recommended in production systems - see :ref:`Distributing - Javascript` for more info. Instead, it's best used during exploratory phases of - development. - -ReactPy makes it easy to draft your code when you're in the early stages of development by -using a CDN_ to dynamically load Javascript packages on the fly. In this example we'll -be using the ubiquitous React-based UI framework `Material UI`_. - -.. reactpy:: _examples/material_ui_button_no_action - -So now that we can display a Material UI Button we probably want to make it do -something. Thankfully there's nothing new to learn here, you can pass event handlers to -the button just as you did when :ref:`getting started <responding to events>`. Thus, all -we need to do is add an ``onClick`` handler to the component: - -.. reactpy:: _examples/material_ui_button_on_click - - -.. _Custom Javascript Component: - -Custom Javascript Components ----------------------------- - -For projects that will be shared with others, we recommend bundling your Javascript with -Rollup_ or Webpack_ into a `web module`_. ReactPy also provides a `template repository`_ -that can be used as a blueprint to build a library of React components. - -To work as intended, the Javascript bundle must export a function ``bind()`` that -adheres to the following interface: - -.. code-block:: typescript - - type EventData = { - target: string; - data: Array<any>; - } - - type LayoutContext = { - sendEvent(data: EventData) => void; - loadImportSource(source: string, sourceType: "NAME" | "URL") => Module; - } - - type bind = (node: HTMLElement, context: LayoutContext) => ({ - create(type: any, props: Object, children: Array<any>): any; - render(element): void; - unmount(): void; - }); - -.. note:: - - - ``node`` is the ``HTMLElement`` that ``render()`` should mount to. - - - ``context`` can send events back to the server and load "import sources" - (like a custom component module). - - - ``type`` is a named export of the current module, or a string (e.g. ``"div"``, - ``"button"``, etc.) - - - ``props`` is an object containing attributes and callbacks for the given - ``component``. - - - ``children`` is an array of elements which were constructed by recursively calling - ``create``. - -The interface returned by ``bind()`` can be thought of as being similar to that of -React. - -- ``create`` ➜ |React.createElement|_ -- ``render`` ➜ |ReactDOM.render|_ -- ``unmount`` ➜ |ReactDOM.unmountComponentAtNode|_ - -.. |React.createElement| replace:: ``React.createElement`` -.. _React.createElement: https://reactjs.org/docs/react-api.html#createelement - -.. |ReactDOM.render| replace:: ``ReactDOM.render`` -.. _ReactDOM.render: https://reactjs.org/docs/react-dom.html#render - -.. |ReactDOM.unmountComponentAtNode| replace:: ``ReactDOM.unmountComponentAtNode`` -.. _ReactDOM.unmountComponentAtNode: https://reactjs.org/docs/react-api.html#createelement - -It will be used in the following manner: - -.. code-block:: javascript - - // once on mount - const binding = bind(node, context); - - // on every render - let element = binding.create(type, props, children) - binding.render(element); - - // once on unmount - binding.unmount(); - -The simplest way to try this out yourself though, is to hook in a simple hand-crafted -Javascript module that has the requisite interface. In the example to follow we'll -create a very basic SVG line chart. The catch though is that we are limited to using -Javascript that can run directly in the browser. This means we can't use fancy syntax -like `JSX <https://reactjs.org/docs/introducing-jsx.html>`__ and instead will use -`htm <https://github.com/developit/htm>`__ to simulate JSX in plain Javascript. - -.. reactpy:: _examples/super_simple_chart - - -.. Links -.. ===== - -.. _Material UI: https://material-ui.com/ -.. _CDN: https://en.wikipedia.org/wiki/Content_delivery_network -.. _template repository: https://github.com/reactive-python/reactpy-js-component-template -.. _web module: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules -.. _Rollup: https://rollupjs.org/guide/en/ -.. _Webpack: https://webpack.js.org/ diff --git a/docs/source/guides/escape-hatches/using-a-custom-backend.rst b/docs/source/guides/escape-hatches/using-a-custom-backend.rst deleted file mode 100644 index f9d21208a..000000000 --- a/docs/source/guides/escape-hatches/using-a-custom-backend.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. _Writing Your Own Backend: -.. _Using a Custom Backend: - -Using a Custom Backend 🚧 -========================= - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/escape-hatches/using-a-custom-client.rst b/docs/source/guides/escape-hatches/using-a-custom-client.rst deleted file mode 100644 index 95de23e59..000000000 --- a/docs/source/guides/escape-hatches/using-a-custom-client.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. _Writing Your Own Client: -.. _Using a Custom Client: - -Using a Custom Client 🚧 -======================== - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/getting-started/_examples/debug_error_example.py b/docs/source/guides/getting-started/_examples/debug_error_example.py deleted file mode 100644 index dd0b212ab..000000000 --- a/docs/source/guides/getting-started/_examples/debug_error_example.py +++ /dev/null @@ -1,20 +0,0 @@ -from reactpy import component, html, run - - -@component -def App(): - return html.div(GoodComponent(), BadComponent()) - - -@component -def GoodComponent(): - return html.p("This component rendered successfully") - - -@component -def BadComponent(): - msg = "This component raised an error" - raise RuntimeError(msg) - - -run(App) diff --git a/docs/source/guides/getting-started/_examples/hello_world.py b/docs/source/guides/getting-started/_examples/hello_world.py deleted file mode 100644 index f38d9e38f..000000000 --- a/docs/source/guides/getting-started/_examples/hello_world.py +++ /dev/null @@ -1,9 +0,0 @@ -from reactpy import component, html, run - - -@component -def App(): - return html.h1("Hello, world!") - - -run(App) diff --git a/docs/source/guides/getting-started/_examples/run_fastapi.py b/docs/source/guides/getting-started/_examples/run_fastapi.py deleted file mode 100644 index bb02e9d6a..000000000 --- a/docs/source/guides/getting-started/_examples/run_fastapi.py +++ /dev/null @@ -1,22 +0,0 @@ -# :lines: 11- - -from reactpy import run -from reactpy.backend import fastapi as fastapi_server - -# the run() function is the entry point for examples -fastapi_server.configure = lambda _, cmpt: run(cmpt) - - -from fastapi import FastAPI - -from reactpy import component, html -from reactpy.backend.fastapi import configure - - -@component -def HelloWorld(): - return html.h1("Hello, world!") - - -app = FastAPI() -configure(app, HelloWorld) diff --git a/docs/source/guides/getting-started/_examples/run_flask.py b/docs/source/guides/getting-started/_examples/run_flask.py deleted file mode 100644 index f98753784..000000000 --- a/docs/source/guides/getting-started/_examples/run_flask.py +++ /dev/null @@ -1,22 +0,0 @@ -# :lines: 11- - -from reactpy import run -from reactpy.backend import flask as flask_server - -# the run() function is the entry point for examples -flask_server.configure = lambda _, cmpt: run(cmpt) - - -from flask import Flask - -from reactpy import component, html -from reactpy.backend.flask import configure - - -@component -def HelloWorld(): - return html.h1("Hello, world!") - - -app = Flask(__name__) -configure(app, HelloWorld) diff --git a/docs/source/guides/getting-started/_examples/run_sanic.py b/docs/source/guides/getting-started/_examples/run_sanic.py deleted file mode 100644 index 1dae9f6e0..000000000 --- a/docs/source/guides/getting-started/_examples/run_sanic.py +++ /dev/null @@ -1,26 +0,0 @@ -# :lines: 11- - -from reactpy import run -from reactpy.backend import sanic as sanic_server - -# the run() function is the entry point for examples -sanic_server.configure = lambda _, cmpt: run(cmpt) - - -from sanic import Sanic - -from reactpy import component, html -from reactpy.backend.sanic import configure - - -@component -def HelloWorld(): - return html.h1("Hello, world!") - - -app = Sanic("MyApp") -configure(app, HelloWorld) - - -if __name__ == "__main__": - app.run(port=8000) diff --git a/docs/source/guides/getting-started/_examples/run_starlette.py b/docs/source/guides/getting-started/_examples/run_starlette.py deleted file mode 100644 index 966b9ef77..000000000 --- a/docs/source/guides/getting-started/_examples/run_starlette.py +++ /dev/null @@ -1,22 +0,0 @@ -# :lines: 11- - -from reactpy import run -from reactpy.backend import starlette as starlette_server - -# the run() function is the entry point for examples -starlette_server.configure = lambda _, cmpt: run(cmpt) - - -from starlette.applications import Starlette - -from reactpy import component, html -from reactpy.backend.starlette import configure - - -@component -def HelloWorld(): - return html.h1("Hello, world!") - - -app = Starlette() -configure(app, HelloWorld) diff --git a/docs/source/guides/getting-started/_examples/run_tornado.py b/docs/source/guides/getting-started/_examples/run_tornado.py deleted file mode 100644 index b86126e63..000000000 --- a/docs/source/guides/getting-started/_examples/run_tornado.py +++ /dev/null @@ -1,31 +0,0 @@ -# :lines: 11- - -from reactpy import run -from reactpy.backend import tornado as tornado_server - -# the run() function is the entry point for examples -tornado_server.configure = lambda _, cmpt: run(cmpt) - - -import tornado.ioloop -import tornado.web - -from reactpy import component, html -from reactpy.backend.tornado import configure - - -@component -def HelloWorld(): - return html.h1("Hello, world!") - - -def make_app(): - app = tornado.web.Application() - configure(app, HelloWorld) - return app - - -if __name__ == "__main__": - app = make_app() - app.listen(8000) - tornado.ioloop.IOLoop.current().start() diff --git a/docs/source/guides/getting-started/_examples/sample_app.py b/docs/source/guides/getting-started/_examples/sample_app.py deleted file mode 100644 index a1cc34e6d..000000000 --- a/docs/source/guides/getting-started/_examples/sample_app.py +++ /dev/null @@ -1,3 +0,0 @@ -import reactpy - -reactpy.run(reactpy.sample.SampleApp) diff --git a/docs/source/guides/getting-started/_static/embed-doc-ex.html b/docs/source/guides/getting-started/_static/embed-doc-ex.html deleted file mode 100644 index 589cb5d80..000000000 --- a/docs/source/guides/getting-started/_static/embed-doc-ex.html +++ /dev/null @@ -1,8 +0,0 @@ -<div id="reactpy-app" /> -<script type="module"> - import { mountLayoutWithWebSocket } from "https://esm.sh/@reactpy/client"; - mountLayoutWithWebSocket( - document.getElementById("reactpy-app"), - "wss://reactpy.dev/_reactpy/stream?view_id=todo" - ); -</script> diff --git a/docs/source/guides/getting-started/_static/embed-reactpy-view/index.html b/docs/source/guides/getting-started/_static/embed-reactpy-view/index.html deleted file mode 100644 index 146d715e4..000000000 --- a/docs/source/guides/getting-started/_static/embed-reactpy-view/index.html +++ /dev/null @@ -1,31 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <meta charset="UTF-8" /> - <title>Example App</title> - </head> - <body> - <h1>This is an Example App</h1> - <p>Just below is an embedded ReactPy view...</p> - <div id="reactpy-app" /> - <script type="module"> - import { - mountWithLayoutServer, - LayoutServerInfo, - } from "https://esm.sh/@reactpy/client@0.38.0"; - - const serverInfo = new LayoutServerInfo({ - host: document.location.hostname, - port: document.location.port, - path: "_reactpy", - query: queryParams.user.toString(), - secure: document.location.protocol == "https:", - }); - - mountLayoutWithWebSocket( - document.getElementById("reactpy-app"), - serverInfo - ); - </script> - </body> -</html> diff --git a/docs/source/guides/getting-started/_static/embed-reactpy-view/main.py b/docs/source/guides/getting-started/_static/embed-reactpy-view/main.py deleted file mode 100644 index 6e3687f27..000000000 --- a/docs/source/guides/getting-started/_static/embed-reactpy-view/main.py +++ /dev/null @@ -1,22 +0,0 @@ -from sanic import Sanic -from sanic.response import file - -from reactpy import component, html -from reactpy.backend.sanic import Options, configure - -app = Sanic("MyApp") - - -@app.route("/") -async def index(request): - return await file("index.html") - - -@component -def ReactPyView(): - return html.code("This text came from an ReactPy App") - - -configure(app, ReactPyView, Options(url_prefix="/_reactpy")) - -app.run(host="127.0.0.1", port=5000) diff --git a/docs/source/guides/getting-started/_static/embed-reactpy-view/screenshot.png b/docs/source/guides/getting-started/_static/embed-reactpy-view/screenshot.png deleted file mode 100644 index 7439c83cff03c27cbaf3727d190a5e67a4bb90b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13161 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 HMnV4vwf$3` diff --git a/docs/source/guides/getting-started/_static/logo-django.svg b/docs/source/guides/getting-started/_static/logo-django.svg deleted file mode 100644 index 1538f0817..000000000 --- a/docs/source/guides/getting-started/_static/logo-django.svg +++ /dev/null @@ -1,38 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [ - <!ENTITY ns_svg "http://www.w3.org/2000/svg"> - <!ENTITY ns_xlink "http://www.w3.org/1999/xlink"> -]> -<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="436.505" height="152.503" - viewBox="0 0 436.505 152.503" overflow="visible" enable-background="new 0 0 436.505 152.503" xml:space="preserve"> -<g> - <g> - <path fill="#092E20" d="M51.464,0h23.872v110.496c-12.246,2.325-21.237,3.255-31.002,3.255C15.191,113.75,0,100.576,0,75.308 - c0-24.337,16.122-40.147,41.078-40.147c3.875,0,6.82,0.309,10.386,1.239V0z M51.464,55.62c-2.79-0.929-5.115-1.239-8.06-1.239 - c-12.091,0-19.067,7.441-19.067,20.461c0,12.712,6.666,19.687,18.912,19.687c2.634,0,4.805-0.155,8.215-0.619V55.62z"/> - <path fill="#092E20" d="M113.312,36.865v55.338c0,19.067-1.395,28.212-5.58,36.118c-3.876,7.597-8.992,12.401-19.532,17.672 - l-22.167-10.541c10.541-4.96,15.656-9.299,18.911-15.967c3.411-6.82,4.497-14.726,4.497-35.497V36.865H113.312z M89.441,0.127 - h23.871v24.492H89.441V0.127z"/> - <path fill="#092E20" d="M127.731,42.29c10.542-4.959,20.617-7.129,31.623-7.129c12.246,0,20.306,3.254,23.872,9.61 - c2.014,3.565,2.634,8.215,2.634,18.137v48.517c-10.697,1.55-24.182,2.636-34.102,2.636c-19.996,0-28.988-6.978-28.988-22.478 - c0-16.742,11.936-24.492,41.234-26.973v-5.27c0-4.34-2.17-5.889-8.216-5.889c-8.835,0-18.756,2.48-28.058,7.286V42.29z - M165.089,80.268c-15.812,1.55-20.927,4.031-20.927,10.231c0,4.65,2.946,6.82,9.456,6.82c3.566,0,6.82-0.309,11.471-1.084V80.268z - "/> - <path fill="#092E20" d="M197.487,40.585c14.105-3.72,25.731-5.424,37.512-5.424c12.246,0,21.082,2.789,26.354,8.215 - c4.96,5.114,6.509,10.694,6.509,22.632v46.812H243.99V66.938c0-9.145-3.1-12.557-11.625-12.557c-3.255,0-6.2,0.31-11.007,1.705 - v56.734h-23.871V40.585z"/> - <path fill="#092E20" d="M277.142,125.842c8.372,4.34,16.742,6.354,25.577,6.354c15.655,0,22.321-6.354,22.321-21.546 - c0-0.155,0-0.31,0-0.465c-4.65,2.324-9.301,3.255-15.5,3.255c-20.927,0-34.26-13.796-34.26-35.652 - c0-27.129,19.688-42.473,54.564-42.473c10.232,0,19.688,1.084,31.159,3.409l-8.174,17.219c-6.356-1.24-0.509-0.166-5.312-0.631 - v2.481l0.309,10.074l0.154,13.022c0.155,3.254,0.155,6.51,0.311,9.765c0,2.945,0,4.341,0,6.511c0,20.462-1.705,30.072-6.82,37.977 - c-7.441,11.627-20.307,17.362-38.598,17.362c-9.301,0-17.36-1.395-25.732-4.651V125.842z M324.576,54.536c-0.31,0-0.619,0-0.774,0 - h-1.706c-4.649-0.155-10.074,1.084-13.796,3.409c-5.734,3.256-8.681,9.147-8.681,17.517c0,11.937,5.892,18.757,16.432,18.757 - c3.255,0,5.891-0.621,8.99-1.55v-1.706v-6.509c0-2.79-0.154-5.892-0.154-9.146l-0.154-11.005l-0.156-7.906V54.536z"/> - <path fill="#092E20" d="M398.062,34.85c23.871,0,38.443,15.037,38.443,39.373c0,24.958-15.19,40.614-39.373,40.614 - c-23.873,0-38.599-15.037-38.599-39.218C358.534,50.505,373.726,34.85,398.062,34.85z M397.595,95.614 - c9.147,0,14.573-7.596,14.573-20.772c0-13.02-5.271-20.771-14.415-20.771c-9.457,0-14.884,7.597-14.884,20.771 - C382.87,88.019,388.296,95.614,397.595,95.614z"/> - </g> -</g> -</svg> diff --git a/docs/source/guides/getting-started/_static/logo-jupyter.svg b/docs/source/guides/getting-started/_static/logo-jupyter.svg deleted file mode 100644 index fb2921a41..000000000 --- a/docs/source/guides/getting-started/_static/logo-jupyter.svg +++ /dev/null @@ -1,88 +0,0 @@ -<svg width="189" height="51" viewBox="0 0 189 51" version="2.0" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:figma="http://www.figma.com/figma/ns"> -<title>logo.svg</title> -<desc>Created using Figma 0.90</desc> -<g id="Canvas" transform="translate(-1638 -2093)" figma:type="canvas"> -<g id="logo" style="mix-blend-mode:normal;" figma:type="group"> -<g id="Group" style="mix-blend-mode:normal;" figma:type="group"> -<g id="g" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path0 fill" style="mix-blend-mode:normal;" figma:type="vector"> -<use xlink:href="#path0_fill" transform="translate(1688.87 2106.23)" fill="#4E4E4E" style="mix-blend-mode:normal;"/> -</g> -</g> -<g id="path" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path1 fill" style="mix-blend-mode:normal;" figma:type="vector"> -<use xlink:href="#path1_fill" transform="translate(1705.38 2106.19)" fill="#4E4E4E" style="mix-blend-mode:normal;"/> -</g> -</g> -<g id="path" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path2 fill" style="mix-blend-mode:normal;" figma:type="vector"> -<use xlink:href="#path2_fill" transform="translate(1730.18 2105.67)" fill="#4E4E4E" style="mix-blend-mode:normal;"/> -</g> -</g> -<g id="path" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path3 fill" style="mix-blend-mode:normal;" figma:type="vector"> -<use xlink:href="#path3_fill" transform="translate(1752.94 2106.21)" fill="#4E4E4E" style="mix-blend-mode:normal;"/> -</g> -</g> -<g id="path" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path4 fill" style="mix-blend-mode:normal;" figma:type="vector"> -<use xlink:href="#path4_fill" transform="translate(1775.8 2100.04)" fill="#4E4E4E" style="mix-blend-mode:normal;"/> -</g> -</g> -<g id="path" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path5 fill" style="mix-blend-mode:normal;" figma:type="vector"> -<use xlink:href="#path5_fill" transform="translate(1791.75 2105.71)" fill="#4E4E4E" style="mix-blend-mode:normal;"/> -</g> -</g> -<g id="path" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path6 fill" style="mix-blend-mode:normal;" figma:type="vector"> -<use xlink:href="#path6_fill" transform="translate(1815.77 2105.72)" fill="#4E4E4E" style="mix-blend-mode:normal;"/> -</g> -</g> -</g> -</g> -<g id="g" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path7 fill" style="mix-blend-mode:normal;" figma:type="vector"> -<use xlink:href="#path7_fill" transform="translate(1669.3 2093.31)" fill="#767677" style="mix-blend-mode:normal;"/> -</g> -</g> -<g id="path" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path8 fill" style="mix-blend-mode:normal;" figma:type="vector"> -<use xlink:href="#path8_fill" transform="translate(1639.74 2123.98)" fill="#F37726" style="mix-blend-mode:normal;"/> -</g> -</g> -<g id="path" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path9 fill" style="mix-blend-mode:normal;" figma:type="vector"> -<use xlink:href="#path9_fill" transform="translate(1639.73 2097.48)" fill="#F37726" style="mix-blend-mode:normal;"/> -</g> -</g> -<g id="path" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path10 fill" style="mix-blend-mode:normal;" figma:type="vector"> -<use xlink:href="#path10_fill" transform="translate(1639.8 2135.81)" fill="#989798" style="mix-blend-mode:normal;"/> -</g> -</g> -<g id="path" style="mix-blend-mode:normal;" figma:type="group"> -<g id="path11 fill" style="mix-blend-mode:normal;" figma:type="vector"> -<use xlink:href="#path11_fill" transform="translate(1638.36 2098.06)" fill="#6F7070" style="mix-blend-mode:normal;"/> -</g> -</g> -</g> -</g> -</g> -<defs> -<path id="path0_fill" d="M 5.62592 17.9276C 5.62592 23.0737 5.23342 24.7539 4.18673 25.9942C 3.04416 27.0501 1.54971 27.6341 0 27.6304L 0.392506 30.6916C 2.79452 30.7249 5.12302 29.8564 6.92556 28.255C 8.80086 26.3021 9.45504 23.6015 9.45504 19.4583L 9.45504 0L 5.6172 0L 5.6172 17.954L 5.62592 17.9276Z"/> -<path id="path1_fill" d="M 17.7413 15.6229C 17.7413 17.8397 17.7413 19.7925 17.9157 21.4727L 14.5576 21.4727L 14.3396 17.954L 14.2523 17.954C 13.5454 19.1838 12.5262 20.2013 11.2997 20.9017C 10.0732 21.6022 8.68377 21.9602 7.27445 21.9389C 3.95995 21.9389 0 20.074 0 12.5441L 0 0L 3.83784 0L 3.83784 11.9019C 3.83784 15.9836 5.05897 18.7281 8.53919 18.7281C 9.63092 18.708 10.6925 18.3634 11.5908 17.7374C 12.4892 17.1115 13.1844 16.2321 13.5894 15.2095C 13.8222 14.57 13.9404 13.8938 13.9383 13.2126L 13.9383 0.0175934L 17.7762 0.0175934L 17.7762 15.6229L 17.7413 15.6229Z"/> -<path id="path2_fill" d="M 0.174447 7.53632C 0.174447 4.79175 0.0872236 2.57499 0 0.498968L 3.44533 0.498968L 3.61978 4.17598L 3.707 4.17598C 4.46074 2.85853 5.55705 1.77379 6.87754 1.03893C 8.19802 0.304077 9.69248 -0.0529711 11.1995 0.0063534C 16.2934 0.0063534 20.1312 4.4047 20.1312 10.9142C 20.1312 18.6289 15.5171 22.4379 10.5366 22.4379C 9.25812 22.492 7.98766 22.2098 6.84994 21.6192C 5.71222 21.0285 4.74636 20.1496 4.04718 19.0688L 3.95995 19.0688L 3.95995 30.7244L 0.165725 30.7244L 0.165725 7.50113L 0.174447 7.53632ZM 3.96868 13.2542C 3.97869 13.7891 4.03708 14.3221 4.14312 14.8464C 4.45574 16.1467 5.19222 17.3035 6.23449 18.1313C 7.27677 18.9592 8.56446 19.4101 9.89116 19.4118C 13.9471 19.4118 16.2934 16.0427 16.2934 11.1254C 16.2934 6.82378 14.0692 3.14677 10.022 3.14677C 8.66089 3.18518 7.35158 3.68134 6.30219 4.55638C 5.25279 5.43143 4.52354 6.63513 4.23035 7.97615C 4.07662 8.49357 3.98869 9.02858 3.96868 9.56835L 3.96868 13.2454L 3.96868 13.2542Z"/> -<path id="path3_fill" d="M 4.16057 0L 8.7747 12.676C 9.25443 14.0923 9.77777 15.7813 10.1267 17.0744L 10.2139 17.0744C 10.6064 15.7901 11.0425 14.1451 11.5659 12.5969L 15.7526 0.00879669L 19.8085 0.00879669L 14.0604 15.3062C 11.3129 22.6603 9.44632 26.434 6.82961 28.7388C 5.50738 29.9791 3.88672 30.8494 2.12826 31.2634L 1.1688 27.9823C 2.39912 27.5689 3.53918 26.9208 4.52691 26.0734C 5.92259 24.8972 7.02752 23.4094 7.75418 21.7278C 7.90932 21.4374 8.01266 21.1218 8.05946 20.7954C 8.02501 20.4436 7.93674 20.0994 7.79779 19.7749L 0 0.00879669L 4.18673 0.00879669L 4.16057 0Z"/> -<path id="path4_fill" d="M 7.0215 0L 7.0215 6.15768L 12.5079 6.15768L 12.5079 9.13096L 7.0215 9.13096L 7.0215 20.6898C 7.0215 23.3288 7.7629 24.8594 9.89988 24.8594C 10.6496 24.8712 11.3975 24.7824 12.1241 24.5955L 12.2985 27.5248C 11.207 27.9125 10.0534 28.0915 8.89681 28.0526C 8.1298 28.1 7.36177 27.9782 6.64622 27.6956C 5.93068 27.413 5.28484 26.9765 4.75369 26.4164C 3.66339 25.2641 3.27089 23.3552 3.27089 20.8306L 3.27089 9.13096L 0 9.13096L 0 6.15768L 3.27089 6.15768L 3.27089 1.01162L 7.0215 0Z"/> -<path id="path5_fill" d="M 3.6285 11.9283C 3.71573 17.2063 7.03022 19.3791 10.8593 19.3791C 12.8612 19.4425 14.8527 19.0642 16.6946 18.2707L 17.3488 21.0593C 15.1419 21.994 12.7638 22.4467 10.3709 22.3876C 3.88145 22.3876 0 18.042 0 11.5676C 0 5.09328 3.75062 0 9.89116 0C 16.7731 0 18.6135 6.15768 18.6135 10.1074C 18.607 10.7165 18.5634 11.3246 18.4827 11.9283L 3.65467 11.9283L 3.6285 11.9283ZM 14.8716 9.13976C 14.9152 6.65909 13.8686 2.79735 9.55971 2.79735C 5.67826 2.79735 3.98612 6.43038 3.68084 9.13976L 14.8803 9.13976L 14.8716 9.13976Z"/> -<path id="path6_fill" d="M 0.174447 7.17854C 0.174447 4.65389 0.130835 2.48111 0 0.484261L 3.35811 0.484261L 3.48894 4.69787L 3.66339 4.69787C 4.62285 1.81256 6.93428 0.00044283 9.49865 0.00044283C 9.8663 -0.0049786 10.233 0.0394012 10.5889 0.132393L 10.5889 3.80941C 10.1593 3.71494 9.72029 3.67067 9.28059 3.67746C 6.57666 3.67746 4.66646 5.76227 4.14312 8.68277C 4.03516 9.28384 3.97681 9.89289 3.96867 10.5037L 3.96867 21.9394L 0.174447 21.9394L 0.174447 7.17854Z"/> -<path id="path7_fill" d="M 5.89353 2.844C 5.91889 3.43165 5.77085 4.01367 5.46815 4.51645C 5.16545 5.01922 4.72168 5.42015 4.19299 5.66851C 3.6643 5.91688 3.07444 6.00151 2.49805 5.91171C 1.92166 5.8219 1.38463 5.5617 0.954898 5.16401C 0.52517 4.76633 0.222056 4.24903 0.0839037 3.67757C -0.0542483 3.10611 -0.02123 2.50617 0.178781 1.95364C 0.378793 1.4011 0.736809 0.920817 1.20754 0.573538C 1.67826 0.226259 2.24055 0.0275919 2.82326 0.00267229C 3.60389 -0.0307115 4.36573 0.249789 4.94142 0.782551C 5.51711 1.31531 5.85956 2.05676 5.89353 2.844Z"/> -<path id="path8_fill" d="M 18.2646 7.13411C 10.4145 7.13411 3.55872 4.2576 0 0C 1.32539 3.8204 3.79556 7.13081 7.0686 9.47303C 10.3417 11.8152 14.2557 13.0734 18.269 13.0734C 22.2823 13.0734 26.1963 11.8152 29.4694 9.47303C 32.7424 7.13081 35.2126 3.8204 36.538 0C 32.9705 4.2576 26.1148 7.13411 18.2646 7.13411Z"/> -<path id="path9_fill" d="M 18.2733 5.93931C 26.1235 5.93931 32.9793 8.81583 36.538 13.0734C 35.2126 9.25303 32.7424 5.94262 29.4694 3.6004C 26.1963 1.25818 22.2823 0 18.269 0C 14.2557 0 10.3417 1.25818 7.0686 3.6004C 3.79556 5.94262 1.32539 9.25303 0 13.0734C 3.56745 8.82463 10.4232 5.93931 18.2733 5.93931Z"/> -<path id="path10_fill" d="M 7.42789 3.58338C 7.46008 4.3243 7.27355 5.05819 6.89193 5.69213C 6.51031 6.32607 5.95075 6.83156 5.28411 7.1446C 4.61747 7.45763 3.87371 7.56414 3.14702 7.45063C 2.42032 7.33712 1.74336 7.0087 1.20184 6.50695C 0.660328 6.0052 0.27861 5.35268 0.105017 4.63202C -0.0685757 3.91135 -0.0262361 3.15494 0.226675 2.45856C 0.479587 1.76217 0.931697 1.15713 1.52576 0.720033C 2.11983 0.282935 2.82914 0.0334395 3.56389 0.00313344C 4.54667 -0.0374033 5.50529 0.316706 6.22961 0.987835C 6.95393 1.65896 7.38484 2.59235 7.42789 3.58338L 7.42789 3.58338Z"/> -<path id="path11_fill" d="M 2.27471 4.39629C 1.84363 4.41508 1.41671 4.30445 1.04799 4.07843C 0.679268 3.8524 0.385328 3.52114 0.203371 3.12656C 0.0214136 2.73198 -0.0403798 2.29183 0.0258116 1.86181C 0.0920031 1.4318 0.283204 1.03126 0.575213 0.710883C 0.867222 0.39051 1.24691 0.164708 1.66622 0.0620592C 2.08553 -0.0405897 2.52561 -0.0154714 2.93076 0.134235C 3.33591 0.283941 3.68792 0.551505 3.94222 0.90306C 4.19652 1.25462 4.34169 1.67436 4.35935 2.10916C 4.38299 2.69107 4.17678 3.25869 3.78597 3.68746C 3.39516 4.11624 2.85166 4.37116 2.27471 4.39629L 2.27471 4.39629Z"/> -</defs> -</svg> diff --git a/docs/source/guides/getting-started/_static/logo-plotly.svg b/docs/source/guides/getting-started/_static/logo-plotly.svg deleted file mode 100644 index 3dd95459a..000000000 --- a/docs/source/guides/getting-started/_static/logo-plotly.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="147" height="46" viewBox="0 0 147 46"> - <g fill="none" fill-rule="evenodd"> - <path fill="#3F4F75" d="M41.909 46H3.66C1.64 46 0 44.307 0 42.22V3.78C0 1.692 1.64 0 3.661 0H41.91c2.022 0 3.661 1.692 3.661 3.78v38.44c0 2.087-1.64 3.78-3.661 3.78"/> - <path fill="#80CFBE" d="M11.383 17.956a1.263 1.263 0 0 1 .153.26 1.148 1.148 0 0 0-.433-.243c-.033-.072-.095-.133-.169-.147l-.022-.004a1.087 1.087 0 0 0-.065-.081c.191.052.377.124.536.215m-1.368 1.867c.117-.007.233-.03.344-.071.021.025.044.051.068.075a1.051 1.051 0 0 1-.436.027l.024-.03m.448-1.395a.62.62 0 0 0 .143.047.838.838 0 0 1 .007.107c-.081-.107-.228-.114-.337-.052l-.02-.08.164-.05c.013.01.027.02.043.028m-.717.143a1.102 1.102 0 0 0 .063.247c-.05-.055-.073-.137-.063-.247m1.412.65a35.186 35.186 0 0 0-.068-.133.803.803 0 0 0 .055-.122c.03.088.032.173.013.255m.718-1.553a3.586 3.586 0 0 0-.112-.074 2.06 2.06 0 0 0-.44-.431c-.718-.517-1.816-.567-2.338.252-.026.04-.05.082-.072.126a1.997 1.997 0 0 0-.652 1.15.251.251 0 0 0-.176.242c-.015.52.252.927.636 1.199.4.36.993.505 1.573.52.858.023 1.45-.447 1.716-1.07l.01-.013c.457-.6.51-1.433-.145-1.901M11.383 10.386a1.263 1.263 0 0 1 .153.26 1.142 1.142 0 0 0-.433-.243c-.033-.073-.095-.133-.169-.147l-.022-.005a1.08 1.08 0 0 0-.065-.08c.191.051.377.123.536.215m-1.368 1.867c.117-.007.233-.03.344-.072.021.026.044.051.068.075a1.02 1.02 0 0 1-.436.028l.024-.031m.448-1.394a.643.643 0 0 0 .143.046.833.833 0 0 1 .007.108c-.081-.107-.228-.115-.337-.052l-.02-.08.164-.05c.013.01.027.02.043.028M9.746 11c.005.033.01.066.019.099.012.05.027.099.044.149-.05-.055-.073-.137-.063-.248m1.412.65l-.068-.132c.022-.04.04-.08.055-.122.03.088.032.173.013.254m.718-1.552a2.91 2.91 0 0 0-.112-.075 2.048 2.048 0 0 0-.44-.43c-.718-.518-1.816-.567-2.338.252-.026.04-.05.082-.072.125a1.997 1.997 0 0 0-.652 1.15.251.251 0 0 0-.176.242c-.015.52.252.927.636 1.2.4.359.993.504 1.573.52.858.023 1.45-.447 1.716-1.07l.01-.013c.457-.6.51-1.433-.145-1.901M28.02 17.956a1.263 1.263 0 0 1 .153.26 1.148 1.148 0 0 0-.433-.243c-.033-.072-.095-.133-.169-.147l-.022-.004a1.087 1.087 0 0 0-.065-.081c.192.052.377.124.536.215m-1.368 1.867c.117-.007.233-.03.344-.071.022.025.044.051.068.075a1.051 1.051 0 0 1-.436.027l.024-.03m.448-1.395a.62.62 0 0 0 .144.047.838.838 0 0 1 .006.107c-.08-.107-.228-.114-.337-.052l-.02-.08.164-.05c.013.01.027.02.043.028m-.717.143a1.102 1.102 0 0 0 .063.247c-.05-.055-.073-.137-.063-.247m1.412.65a35.186 35.186 0 0 0-.068-.133.803.803 0 0 0 .056-.122c.029.088.031.173.012.255m.718-1.553a3.586 3.586 0 0 0-.111-.074 2.06 2.06 0 0 0-.441-.431c-.717-.517-1.816-.567-2.338.252-.025.04-.05.082-.072.126a1.994 1.994 0 0 0-.652 1.15.251.251 0 0 0-.176.242c-.015.52.252.927.636 1.199.4.36.994.505 1.573.52.858.023 1.45-.447 1.716-1.07l.01-.013c.457-.6.51-1.433-.145-1.901M28.02 10.386a1.263 1.263 0 0 1 .153.26 1.142 1.142 0 0 0-.433-.243c-.033-.073-.095-.133-.169-.147l-.022-.005a1.08 1.08 0 0 0-.065-.08c.192.051.377.123.536.215m-1.368 1.867c.117-.007.233-.03.344-.072.022.026.044.051.068.075a1.02 1.02 0 0 1-.436.028l.024-.031m.448-1.394a.643.643 0 0 0 .144.046.833.833 0 0 1 .006.108c-.08-.107-.228-.115-.337-.052l-.02-.08.164-.05c.013.01.027.02.043.028m-.717.142a1.66 1.66 0 0 0 .063.247c-.05-.054-.073-.136-.063-.247m1.412.65l-.068-.132c.022-.04.04-.08.056-.122.029.088.031.173.012.254m.718-1.552a2.91 2.91 0 0 0-.111-.075 2.048 2.048 0 0 0-.441-.43c-.717-.518-1.816-.567-2.338.252-.025.04-.05.082-.072.125a1.994 1.994 0 0 0-.652 1.15.251.251 0 0 0-.176.242c-.015.52.252.927.636 1.2.4.359.994.504 1.573.52.858.023 1.45-.447 1.716-1.07l.01-.013c.457-.6.51-1.433-.145-1.901"/> - <path fill="#FFF" d="M10.656 24.81c-1.116 0-2.02.92-2.02 2.056v8.221c0 1.135.904 2.055 2.02 2.055s2.02-.92 2.02-2.055v-8.221c0-1.135-.904-2.055-2.02-2.055M26.818 24.81c-1.116 0-2.02.92-2.02 2.056v8.221c0 1.135.904 2.055 2.02 2.055 1.115 0 2.02-.92 2.02-2.055v-8.221c0-1.135-.905-2.055-2.02-2.055M18.737 16.59c-1.116 0-2.02.92-2.02 2.054v16.443c0 1.135.904 2.055 2.02 2.055s2.02-.92 2.02-2.055V18.644c0-1.135-.904-2.055-2.02-2.055M34.899 16.59c-1.116 0-2.02.92-2.02 2.054v16.443c0 1.135.904 2.055 2.02 2.055 1.115 0 2.02-.92 2.02-2.055V18.644c0-1.135-.905-2.055-2.02-2.055"/> - <path fill="#80CFBE" d="M36.174 12.043c-.12.187-.263.316-.416.394.1-.156.198-.342.283-.546a2.23 2.23 0 0 0 .056-.126c.064-.058.1-.144.075-.227.002-.003.002-.007.003-.01.126-.094.215-.268.248-.455l.021-.033c.01.351-.078.703-.27 1.003m-2.656-.673a2.518 2.518 0 0 1-.009-.257c.079.295.198.584.32.837.07.188.16.386.274.53a1.13 1.13 0 0 1-.165-.127c-.269-.25-.386-.627-.42-.983m1.384-.405a3.724 3.724 0 0 1 .01-.564c.024.01.048.021.073.036l.039.027c.034.178.023.421-.122.5m1.823-.785a.407.407 0 0 0-.16-.31 2.293 2.293 0 0 0-.682-.717c-.383-.255-.815-.38-1.085-.047a3.714 3.714 0 0 0-.304-.015c-.062-.001-.119.004-.173.012-.322-.127-.666-.13-.815.282a1.743 1.743 0 0 0-.093.507.704.704 0 0 0-.158.164c-.313.449-.268 1.24-.144 1.74.21.852 1.117 1.522 1.903 1.27a.462.462 0 0 0 .184-.074c.42.079.878-.062 1.243-.507.545-.663.601-1.56.284-2.305M20.018 12.043c-.12.187-.264.316-.417.394.101-.156.198-.342.284-.546.02-.041.038-.083.055-.126.064-.058.1-.144.076-.227a.35.35 0 0 1 .003-.01c.126-.094.214-.268.248-.455l.02-.033c.01.351-.077.703-.27 1.003m-2.655-.673a2.518 2.518 0 0 1-.01-.257c.08.295.198.584.32.837.07.188.16.386.275.53a1.13 1.13 0 0 1-.165-.127c-.269-.25-.387-.627-.42-.983m1.384-.405a3.665 3.665 0 0 1 .01-.564c.023.01.047.021.072.036.014.008.026.017.04.027.033.178.022.421-.122.5m1.822-.785a.407.407 0 0 0-.159-.31 2.293 2.293 0 0 0-.683-.717c-.382-.255-.815-.38-1.084-.047a3.714 3.714 0 0 0-.304-.015c-.062-.001-.12.004-.173.012-.323-.127-.667-.13-.816.282a1.758 1.758 0 0 0-.093.507.704.704 0 0 0-.158.164c-.312.449-.268 1.24-.144 1.74.21.852 1.118 1.522 1.904 1.27a.462.462 0 0 0 .184-.074c.42.079.877-.062 1.243-.507.544-.663.6-1.56.283-2.305"/> - <g fill="#3F4F75"> - <path d="M74.759 32.856a1.862 1.862 0 0 1-1.852-1.873V12.26c0-1.035.829-1.873 1.852-1.873 1.022 0 1.851.838 1.851 1.873v18.723a1.862 1.862 0 0 1-1.851 1.873M113.644 32.856a1.862 1.862 0 0 1-1.851-1.873V12.26c0-1.035.829-1.873 1.851-1.873 1.023 0 1.852.838 1.852 1.873v18.723a1.862 1.862 0 0 1-1.852 1.873M65.5 25.026c0 2.256-1.658 4.085-3.704 4.085-2.045 0-3.703-1.83-3.703-4.085v-3.064c0-2.256 1.658-4.085 3.703-4.085 2.046 0 3.704 1.829 3.704 4.085v3.064zm-3.704-10.894a6.953 6.953 0 0 0-3.842 1.163 1.852 1.852 0 0 0-1.713-1.163 1.862 1.862 0 0 0-1.851 1.872v18.724c0 1.034.829 1.873 1.851 1.873a1.862 1.862 0 0 0 1.852-1.873V31.78a6.937 6.937 0 0 0 3.703 1.076c4.091 0 7.407-3.593 7.407-8.025v-2.675c0-4.431-3.316-8.024-7.407-8.024zM91.424 25.026c0 2.256-1.658 4.085-3.704 4.085-2.045 0-3.703-1.83-3.703-4.085v-3.064c0-2.256 1.658-4.085 3.703-4.085 2.046 0 3.704 1.829 3.704 4.085v3.064zM87.72 14.132c-4.09 0-7.406 3.593-7.406 8.024v2.675c0 4.432 3.316 8.025 7.406 8.025 4.091 0 7.407-3.593 7.407-8.025v-2.675c0-4.431-3.316-8.024-7.407-8.024zM106.238 29.111c-2.042 0-3.704-1.68-3.704-3.745v-7.49h3.704a1.862 1.862 0 0 0 1.851-1.872 1.862 1.862 0 0 0-1.851-1.872h-3.704v-1.873a1.862 1.862 0 0 0-1.851-1.872 1.862 1.862 0 0 0-1.852 1.872v13.107c0 4.13 3.323 7.49 7.407 7.49a1.862 1.862 0 0 0 1.851-1.873 1.862 1.862 0 0 0-1.851-1.872M132.247 14.284a1.844 1.844 0 0 0-2.432.983l-3.84 9.056-3.839-9.056a1.844 1.844 0 0 0-2.432-.983 1.88 1.88 0 0 0-.972 2.458l5.229 12.333-.622 1.467a3.71 3.71 0 0 1-3.335 2.308 1.864 1.864 0 0 0-1.809 1.917 1.862 1.862 0 0 0 1.85 1.828h.045a7.41 7.41 0 0 0 6.661-4.597l6.468-15.256a1.88 1.88 0 0 0-.972-2.458"/> - </g> - </g> -</svg> diff --git a/docs/source/guides/getting-started/_static/reactpy-in-jupyterlab.gif b/docs/source/guides/getting-started/_static/reactpy-in-jupyterlab.gif deleted file mode 100644 index b420ecd8c5a082a39f5904ba157735fa4327a02e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551674 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¼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	-qU;;B#K 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%0D|MDvhCuIb{ddy7f71S>E_)}9luvV<^{PB07m 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 diff --git a/docs/source/guides/getting-started/_static/shared-client-state-server-slider.gif b/docs/source/guides/getting-started/_static/shared-client-state-server-slider.gif deleted file mode 100644 index 61bb8295f94aa635e32041c0b89f5a29537aa22e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98006 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%0A!U^x*`g)M zG$I#nlo7>{W`7KQEnARz47JA*u%pn*%>>L7Njz|%&~ECV!2%=<EzXpR94ZiE194z; zgmi!$6G?leh2ro8R1<;JFpwHkbV~`S6H=s|opWoVVCX6Ec|KU24b6-I#^r;no1tFz zMHu&NeZ=bs_jf)B=o4IaG@3vW3p1N2!n(gk2NOP4B5j-?{gqFCl~3^tMe&@8tWk;7 z_ZSpVmP195PjBR+k5|*{;4*}FK^TYmX<J^}Hj95o!|ib-o7Kdd6Zw?M`6R?;Njs&R z@V9Tp-=@n^(r3SAW};-(L9+=Ia9I`bW*5XX6$lRlMVShfhk=p;?`5pA@6Qz|>=rTu zid5v#Y68W2yG6Q8?+oXP?lGb7TUDam-&vHsv)O&e3n+GsMLT;Ihog%<hl``Oi~T}M z>Sf<VyT1=Edmp;{9#uvWu2T}-l1^nrGFwYb|Ha|+T1n5@n^c{*A_U-wYDl^mwCEQ+ z0uI(t%6BykrF0<tj8X<{5;ND8Q93*Yt<;c-726xaxU69ghG1@MnCWpr%nSifCwRaQ zqF@gc=mdA-tI22Ch!yM!3<2aj_UwN;Da<=Tnx3H7ex%oI#46Yv!D^TT2eEc_9z!R1 z83Boeg1qx#nSM}}>R8@Ra4G^8*jdhXT<;*?@TG(>zLThEhd{{?YIzKDkp(WcynBWM z-(@V1hQ3ZjHHL3DL`@JrGc4J+Leu$yUSWx%1mB>Whytp~7U2{v`6Md{3OpNG>IlW6 zAGupKVGNS;T8I3`lky?LBpD#JX-M*3o-)F)8f{;C3=Ja}gKi#^y4r&`?ZLESP!~f& zD%~2mLk)u<TqD0`wz~#SP>alOBVn)Qe^$%iTH9oW79pt<*R7L|tCJh4QzZGQqWh5x zUrnG9_fco$qX7xIp<um<SA7J!-fE=Yj-<g+x4~8ZlSgZV&+i6*`Nqfcz$dR8;|3dF zFr!g|O_8tBF|V8Ao~0dHp%Y1(Q*@g%;+k9Xn{)P>f6c+|5yUxEPZ+F73iETxjapQr zTFT0w)>&5%&QmHMgQFN98X%zCDwJ)4a2ISf<QJT&JhyzqisEhCXgM5X0ZPKwB45=e z8G=G|fyz%ouTf+>Scqmdfnq0VdMEgGCq)X1fY-0qA)jcZnp8!pfgB56$%mp0$=)1; zG+PMb4av|5=rR_@gGlymf$elsgiRD_c>;N=A!s;bTs1@h4s<<+Ism}g_<V3w=pd$T zkjoJGp!JoF(npzD0-p)UAB(g{tx)%B0s%IVc;|qW6;Nn`fF1D;RZ;}pPbI{pz8Wnk zP<ZF8js1{Qxchh8*Lok*M3j+FdIhKWj3rKilXtVhYL3Zn>?wNfA=cHMT*q+cg|4?h zy4bHNd*-R0@=<DZ-mCJv-BjKxNva2Jg=qLmQq}Yjed(bg=v7>3tF!3ke%8zVx>t9h z_Z~~%eVab>oIdM?K9}P@2ZjEZ7X5BH{ay?G4_O8RZ3a-m15euqR`zONvJ4s^1{2~3 zV@C(0E52ZbhP;)AGDt_VLx*qSQgg3|-YN`JFBTQY50{ZvRxT8B<CVVFDhx9ljx@xl z-p?LsUFeM59_bVs?e!iVtQZ~LADy^{Z}#~w(J7m6QX5p~C+-l2wY9pi(cHfS<q#TM zuU0Os?IvFt$6?T}*xGaen*SNhwYrnt9{3VK5^6{mSxv}*A`oQ*GE@Uc;3T5hid*&s zcKH<UxB{+xf(k6LE)EcarSL$d`u-wK$_EPM!<ONMVmpABY^0AS$iuJ&hzUsGF)(q0 zs2B!LGz4+tpsw&VFC0|%7>Kq9Oa7j_V+gdGfY=^GZ94l`M&7xy0R`;A@%gYgIN>4_ z(53}EI}A=lz@D)Y&IlG{S3|T>1PC0|svM>dsOZGE6POQ!?lZ$O4HxhD4L`8%eSQpU zVZpR{qpgpVuk4$DqexER<W1ESbOq#fxY0LzaQ!i>dzE%ZWK@}+9IxcyuK7mgOyd@J z;MR+i<Xu|!&)W|6dz5qFnBXb?@+t0-DPOYb0R8Epgz1p6=@(=(;rcVt2{W-{Gl^ug zifprKKC@Y5=<KoCJhHh0{kh^wU`gd%#lc*)@chS0U_-)u%h-HJ`@1;!LXYjjK<>iG z;=<=!i{EUQrV<wCY?l@f)?EQho@`6rN=uswOWyfQ`+vSA2ri%bEMHYF<2#pca=S=t ztmMwe8Is5Jm9sYW;9?8ab+0Ey*Sf=HDPQ8F;K}(d$f%W&s+AabAR0BrYFCTKO|kn; zD<Mc9R|1)FspNj30~Cyd?Y$s?SlTs>6+t)%hu+TzL>z$c?f_J)Da@FGR!U@1*#%F= z>W<;iawsTi0xX2h7o8votcLL7K-rx{$Wp>29O3BUJ`do)j145z0@S;iKzkA0mxsAm zvptG~y|HOzo&a-j5iwK(VS+>@?GR2sU}8R4!=6w%mS8cF;JG10JpbrfCy@gV8l$v{ zBPa4chS|X1kS;U@D3J~ylU-ve-cC@Qz=?l%QjEZJa+#|Rky8yB!bw$dz}|gi=a$e) z&VwO1;~L564o*^Uo8N7l2A{kQso5ra0e2>&MDy*W835g%@7&JbVW{58z1iV_?-tta zqJnoz$<gIYyB}Eh>g@I!^Y&T|fbHZ&pIG;M?Dn7e?GJVAkKOElQ9KawI+*Dom|L1( zAb-EidT5I{+*o=i6niLHdw6hjc%pc8{^ICo$I+i92%hyAguehM9TOjADBVFP?j6HL zPiP*VFnl=C?L7Iif5Jll119$4J`bGd6HVv@IM|#>Jbp6Qzh?>quL6{^B%e|wquq0- z6qiq9_<)j~I}F#U#1qg16w%Z!5p{GI*93tUiZr;IkQhby3l43$I}?OUtq_5B-vbgW zfj%u2F;tgNC_+Q=SU)-d;r^c(87wrN@`eL()4o`A+Yst~4@j3!lywY(M}Re}V{`Z4 zJ$}7dd<$rdg90ek`U<3&r62jzIIHnUa;Rb19F$3lZ`1wyUK(r^9mSqi9eTC435jNY zQ>&!*%6Ma#yvVFrL1n|{j`lGwiYi@zwk<S#cXI8dr&pH>8PBSo{V_u}KtETmGTmg? zgykWJZC}WFf>B^{$qV)2_fr<NP7wXdu)_YhdQq)5cR<i?ovB7jwwRlS$c(bfR}Nu` z!9%;!st`(z3dyq7UJXn^1&yV++ED84RJgJe!&`3nZ2|Z1<Rru7cG%e+(i#wzb8rTq zQi14%o9Hk6K9VI|&(IT1?A}T8J&Z7#Ovr-osU-R{2Rj`qizS59h?aLkU2E%y>Q#)& zEW1uoQ#VC6C#zOGLygv0^x2*Ra`!8HWLhMMgjMe!sV$mX!trBCVuIW+zM^Cuxt-bp zs}`Z+SDr2W?{h<b@t3@{(;+35Fmu=~Ev_ncN$M{f7AUXu+xG0O9v0XWqJ_;nC2^z# zIAR5EjB7+${GkO2%HhHO={<G}UP7hu-g;fb93<V*+=50}!ZBn76htcUN`s41ZU#qa ztf##ilV+i+AI9$dn-ufhmzuqC(Kx^!ii?yOB!m|!^~T?kRPK>YWorqe<Ss)DwJFuj zSK;NwI14zFZWq-#8lBN87wW2iXVa$E7im`e#xb{-58`M2Nt60V3(&=(DeV4{Lk<us z0@I@C?TzKbI3A0!1|zpvRDNJ$Zrfz9@a8=;oCPy6S_BLAkjbCH)hIDV0_q$Phh!nO zBAs&Z!}$Qgs{Xtk_1M-Q1!kH>A=hGq?4^H*wTsr(^@g}#hl&sL->;+66>dJG8dYcK zIIWj(<0NR1^8c0~L$#Wd8Yy=)8u(f9jV@wBnS^`A@IVVUF0XMbm$pD#@XpFtJ(&ZO z)O(X8kG~t=)2~l5wRWMMy63FVWt`&Ke*Vq|Ggm+TAmUcTj8m#@!)$*%0%AomL;%9u zl@6Zl&Up{aO?j5(;6U)eq_QuVM}Ih;B`LSC1yBWaTB(1a-;s(vY^PCk);7pgQ)?Qz z_#=|+HQ^r8#N1&Sc{goAK_zT%CQ`qFTn#ZswxoAVmZw0o+zGyth7yo!hVo%Z&?v25 z43DB%F5!31TLSCq5Ba#hPT$RY)K2|9&>&SL9KnHRvkPAN`WE%Kqo>p}&AHG5T^~Up zj!|h465l~Cl1~vlW86e<Wg+RI*U3CIE@eNr@+=!XqKHn>Oq8CbcPi%g?&LN1TYcEr zy|7-z(3?kBB_~ib5{U*pOKyo@C9JPGQ1^{s25LIXv<?wH3~41?ZqTIZR9D0MMLK1y zz~3X$h;jc0f35X!Ras{Xa_+3(W1EIwn?FbSK6)o_yK6SxGT&!lgeqI4@a4@}c#L_X zbbRYLQd42AS>)-67gQ&Q{?4}kL$}FRy9?>T_P2Myp{ty4eonksylDRHfk|Heo@0Es zd{OkJ<@^JdF5?J}HV3#5fQmc^1+B9s@j*gIS#zoj`%wg5CXA7?Gsv#K(emW;mUzaD zb+o3?5UI7zP=`uiw8N-_<*0ZVsI8hpT%ngu2p$HuNRFM}R+a>JbrN?ZV+_TB43@Ys zsNqk9EK#=tGcJWf(w~STxD%G-*M0ciKAb#jg_5(HKv@qCbR$*<E8<7VCB`NoUa=4| z71?{wW(xBx<W$JGC*DC#CRj)L!YGxu!$R1ofSv(?oXBUU>Uj}FC-#wCv+^!56@=^! zppMX0Pn-V1D#1PPHM-#mZN=EP)GqJ{1}tBf%PPH;l(b9ovlAlO{CZ**Tpzz*8mDPX zAKhv@HwshQZEPS`m{Ks3^b)qthH=(P<KRxdtxrmHTbqGMyH-5yBNvZp!4SFM*VKM? zWj;+y9SkjRdb#(8pbUJ(a_UD$^8$BoD1VJTd0p0kUUA6BpQG+o4%w4!JcBgv^q+-L z=cs$%ll}Z^{PFO8!o$e-3ffAaeXLSVWxg@q{e!!=@4}uBdJM&@k;YCO@}u99N4X1d z=@`X1niQhHz+=7#Czu{PsI_C6wDsrG@`}ILqZlLEybKEkaw@^f)oaY*N`sXC&=Pw9 zWqtfvv>U=nkd|=7Mb9r>M`x2zv}Bai`?zCZzg)Ki5yd<)5hX&ZP7pFUKvPx}`Otl} z^%s`#7B)GSe*wo(z!%0@CI(fC<fLZy>y}Zg;g%p6P(W<=Fc&<9@}d%63n6;AI^ogU zCCWqs2vx3bKr}d$tuSEB;K7(-xMA%I^<zI3dT#_!eP5Y<m$3`HG=UQ|Ss`9C0m0-@ zZ9K<HKE_vzO48oI?Q^6V-EntJSUypzJ%IRCbvM`qUky>p>LgSQCS+2{GCZ;cQ#Edz z^5Is<pR9AzoFNB<Rt<sh9DmWbxyvy+@*L&P>Y~XgGp`3;X*XeUgrYw2^La+~pgFq6 zhza3`%xl)AfF~shjK2O!&)i8AU7N=eMgt4wZHX)|31=onp0tzLosh@0ZBBwhCP(Zp zyUjb!>P26ik1X5W$aI245Vy&5a6~d!U6gr#QKCZfWPyJ}8gLC-+k5q*D7eql{UmNy zc5Qt&7>=YH<Oo_=i`x!#Q=$`3uCsUM5_~me5M7&QX}mFDBRgV!_#?ANVN<+^LQHpu zPnMxQQ`%``%s(%%BN^DBjC$+sRt{tXtSI5j8N29z^>ndT`IF^?C+Q2Zje5_;jy~{} zfb2{37={fQ`S~7~4h;5CYT!Wj_Jy~3GovXjZ~y}uCt_<3%!|L>yiso<(`#fmr7wWg z=om-%nhk<fV~-@`>tZN?CxY^i6BLvPJALfKC;?&^T|hU~!0d#RM=Yi!nr+XTzAH+* z8mQqH24Of>=4oPM5v=c`%=S~G-aJK%XQ9}@J4(zP{usTqx1a;DFlbRHnzbY!ik?v8 zD#BjWYZg&>G7PP0QV9xHc2TAW|IIH^VF+Y5@hyv5j)mHAzI)BJnI}ptd|%2f`BV#f zJAcUX)esF=ag}&P$Fhtar$uw(HH54Kjf~BRMVbspNI$a;u>IN}Kv9Ig1Zy^RGm0$4 zXfCk4&$>bjCHfD!=d7{bgOMqT1f;xX*${AR9&vbqG#YK&l==K~{MpTEK1KVs=DlBE zUmJwK*L=Qf`bm!ZO0Md4F#)N38k>Bbs(ihZJgJ|2Q);VGX=^Kpr+rQS6G)+pQ=vyy zq0dQSr5ZZe0~qQ74EF#=dKAXi6h4F6@4(w@1l#@VgeINtObdc%_R?p|@1!@i7qjuR zz=fZFyW_rdr~9hi8>aYtjZ%INq&8Sck4c^>DBTJqO5P<3o|gy?Ypn2RX4gv@*#=NU zBR1!lM^k~cfV-cosTdhx_|+Kz8XI=cs^>PUnGCIJ(TzfW=O!8Kk)|P+wozq-6Hs>o zNUjJNu@wqw1go9#$chx1eH4;~SR-DIafWpjL4G{Q&3K<6!VkJOQ+AJ-eHEIHRO_)_ zO<A=k5cG$V9w)s;ppjhUmZPe4h%kc%0Ix)%5@Guwm6CcJ_S-X3ikWc95(t9ijpcTF z2ofUX$3XhDk^E;DTM?44_YK!*a%E{$m2#|{7fEI~J*OX0pi)OyFr}g)Gh;HR|3?)e zA(ieKmBQ_A&m7`7YE|)3HVHLVBFZq?k5myTRoVR>xwf84<K8>_s)9dzq`#}GNUEu& zF{nGMQTp|+pw#f%AGH|cdUQ?H^+TZ(r)sv2VTO{4Muf#W3Vlfm?@W79W}$s$DeCez zy;f~~a$;e&CcSo{=m))80(BLR3jKD<L@qfP*HDdl)p(<Ac(Y}tkruy9cRyuUM&*hI zw`8n9Fev;PWyN)28Zbi3BFYLK2`r#Pln}whBdmf4LfYcPc2P`-h_>cP1zCch&@evB zAp=s{6(w#uzA(#=y=4JtVT`&mP1t=aHG8TdEQ?w%4Y>$GpJ7)#9H>QgtUDB<Izl7Q zIFE{OOqWH5C$W@}`9Vn}_#O$Akn!<+V&QwlK|p~^i6_=JrA#$Z;}-eCz2F>%Sf@fa zjjh7@@ZrW}xU|1Vuwk4iLThA<Pj!h85@L#qynV$WkxGL0A}-#CzyGMieb$d}miX{A z0v<-s8yr!UR``K*q~?sNPEEJ|dq)E)ZBv?V%SYWd6ZQ7A(T;1~S4GrcAE8aY_w)!Q z_U5n{o_+3TnHVtXOU=<6JsTq_A06RJ7<Uf)OsdbwJoZ&6>|1<AnbjEXk^aoSUKb6) z+`3-**D)HG;?ZmUDH?<EG{ZNN2J0pUn_S?nNP``{9#Y1rnv&af6;Vcrfdj6u98zC7 z6AG=Ljv6``inP$qETp7uPYj(f3v5t)GGd`x%@gJ(-p^MRNub)*fr%1*6E}rLg<#&! zgyV&;qF$9iE@s2Ivv`PBjBZO2v(XxJJ+EB({bu#sx4T5&*JD$-H>idleMP)8=5PPX zmtG^>Z2VaXCM<Oyac-=gYl4Q~=hq=jZZ<)ve@i#KFa7vFGW}cYb%m1pq>1UIX=PLX z4qzs9Qt#lq<-19%`oX-9rf<8{(4&*e>81t9aU>dK?M~#7K5k!RVD{&moEQIH(<!%l z9g*-!$K6TK`l);ZJ?Hi*@|j65qMirOG4{8n91|j(5~$qOryrS4r~Q};dOU4FWd1N= z`pJedxjg~nOgIve7$iUa_>Qrn55L0cbeJh+h}29(y-?(H{is}%XMN_+T?k&hyC42; z1|M5#5#2WvKRJ`2-X38U&WZl=qTb@U(-fX^CRu&92se}NGMn+-oZ{F5yEux`pUtkH zz594JXL2^zW#+Yh>ER<1xAWQTjoAXJxx&iHx2ALNo(ub^&%KYDD|yade9nX-qc2mp ze4jp7xiOa`MNmOBU#%a{v^`fVWt~AQS+jAw{`hvPsdYH_d|mo{^PQQG&*xkF=9ng| zS~li8r0!E!Teoe{HJoR--m&a*F>ODe?{l$15ZUxbEexhF482=;OEgzrxiC7pFt)KU ze!lRTXmKL9ZiLqAi`3#b^~LX|i<2&kQ^LmiM4Hp-i?i<*=js>d`xdL)7mh|3m(CaQ z%iL68_|gjZ(yG+bn)=eZ>C%S&64-ueD{5&weQD?2(k{2%)?>T%F}uBurNi^3BckPF z+T|1O2S4-yU@g?C@bY>3(t*qJWz_O<-`@yk`B(k&@4n^h$>r@oF*oPScp@Bt4oAR) z14`pwW<l`JW1eKifE96&XdE;H2P?)AUo3-z><Py0N&ZF}7dQ&=3Y>0*lE;DE&i;vg z%wr`;AROY0i}tDpd$5I36+4ib*@KsGOj9ejzz(Da_GC8>taPjFJgXeitDG9ETxP4> zuB$vjtGv;xd{Zmb1}n655Whh%LxuzY=BmiWswj93LANHxvnDRRCZVy0mo!^rDt4rm zhWK?l3g@jz6|c!PtjYJUDNL>1*<4e+Si38|@<ho&CVEXMaYYuqu4cBb?z*lKw5}Pw zu9e};?z=`S;w+oDt~a%=zqxL3v3?J{VOWLJd9j96bT-o1FfrROb=@!v+AtS!Fz#5t zAH8AKuwmW5VKcR1YvyDry&=50VNbW|z_aNnz3J4kqTI0lK*QNNXwxlv(>-I;qrvHc zw6lHjruWpQ&xNCRC)ff(sEQ(bxVaescJb<WHoS24qjL+8-g*+fB`F<Ar-Xu{0fg>h z8o@Ean{HYfZdNzzPph_`jc+|a+=|d}=XH(Z`+I<iM1c?}kP-k7Ljx_ew&M=hUiP~h z*lkC@*hc4V$M$b0^LX6SAb`OE1Z=2u9zc2`iUF~mlHnmawe7mJo@(Hc;p+hm-pR__ zd1L16eH_JS59FB$D^T<-)YyGzwp(nl``*>FBxtv!c(=5{v$TJg4z-<bwo}D}LKjD9 zutgcM?bS-})hX_o!=oQV9rJ_sEa=t+L^iw{b^vsq1s%I({hsZcdu<nc?KfUUQ=TB) zZmyX}HJ#T-Gw(h#uZ9<U0~wBn_CS~t0MoEP+`m6EwLiMKKX$P{4nFuycQ7%&590Iw zV78Ot8)oCTG8J?%9qr?bjkaTpdW_ni2d`vH+Yc4*<G)<^e7!lqfe%+MyuV5BubKHw zB_3?NIGC;SS%~)KcHKrxqjsa+_xca_iw_T$4)-<>_bz;os}7H*d{0D<PFauEG!D{z z2~+`)&FG`4B_db%z3ql0(9{7i@9>!Q;VI7%e)DLb{1|X_c%yLyoc8Uud-#C|b@Afp zD*EVW)zR-_KdL+k4Z=6W;2?MNnEc)W8QzbK-k(BrpK8kwF5^$bdy--2cb*79mVlu# z4?TjTh#UQZ<3|J?$E5d8SVjG5%}=OrpRiG!+`jG4jz6K(JfKhVXMEtx^y!3;e&q=k zux1u;-v2{z`iIcg58>$mQB44H5X}4X2UF$`yu@dJg5m(dqaV_j0WvYCGUfpY`atm{ zAHKV%3R^e^EDCuUD2qQ;dT^XG^#h8C<Y^3?J|uFOIOV$+NU#~GocT!U{TY(?Oho39 z+Pz2gc4r!wk6_Y-w-_ECvYs2uoZr_xH!(jqb$fjO$tlD>3bK4Qt4K6|^N9H68G!uU z=<?9)^85kh!v5Yv;h4vk_a0d_o?Dw=5EO$Aai;<UelY9>2zw#$A;|O1h1c|j_g0YC zQIPlLg&*Y7e>uoM^8&r}Lktml-(o*V)XUr+{K(?s_xNLg?}gi4lso<+fcNtG<&!}C z<qJqKO7l|M{7KN0%b=JiPv2Zd;~#iyLGaGlE6n?=*v6~4fvfoGtAwrK_<IE1{Q)2? z0?$tHo1m+wA1-5(t`gmTW<2?sIenFM_aK+<X^PCx)PbKSc`*iP0wG=$!*=AO!Jn!3 zerhfK%zJS3hT_*-w-D185KK(OaI`xn8ie`uv-sgz!KGVCW(c+_#JMS?g8rHQixB5+ zLL@4}02}=F_A{61Us@u+>+b!ofB3uQ()nR=a7yEE>zBW^`hR1lf49?Lcky1|IsDzN zdEILs+NgNl_vCsY=K6{6_2B#K;l^vnyz7za>#?m+v+?V3$e#)N=S@joDz2MfH2-`z zfBw~cv)N#4GUm@r<{$Z+>)FOX^8<f4tN!2@w*D+#{-Id<vrK=p!uvu>^p8vN-m3Y{ zhT9F0{AM%eW?S>mR_4ua<BO5^H+$1J2b$OWTQ^6Lmo=9+$GrF-nm^Z`JV#06&)x71 zxA7M-_^X)1%S`;Q#+R>(@xQ0>f3~)+A?TMt2$higF<W;eF}=9=_Az@enu^!B!u^D! zKb}b@V1N6Ba}dj+nIh!zgKIcVz+52oa{N~7<L%KfQ076lln0l^kNurf-idsb7%E}U zGrq4yI+@~kcBqQ=vZeiZy*<wbrYfu&0}gi21!t-qB@`26>o&)7<Ogbf_AZ3~=Hpvm zE4>=+XG`2mtJ?Q2MRA?s5NZ)`29G6t-Tg^c-~B7G^}!V0`{UUbo^xgCGJ%KtKP9#& z5=4(&gnmixelIhx^SzUD<~Ua6_N~h2x3up-wZ!Gv!Ec#kTz3p)aV!)0V|_SN;-SGr zlgHNA_xC^e-VuK^JKY#~boi%rBhyvvHss-r!mqPkW!Izjn>*K6KfX1-d5BlMxgOfv zJ37MOMdhE+vxN~c1?Ss>IGWfZ$m9mo!YOo+>`}BGJb89C&2H>5w?eKQR4Bud92jnC zz5)z?SyRDtzS=8}cro9tf_SO9U?)Gx)h5oQI|apm2S<rzi+mXb`k9lp1)A6GmBfE? zr5Sl{6s4J3J$3QdNTI)#VH@&uLkDjXF3a=EMT4vOl}A}KPqtUfPuEPJZdu-3-C;}K zyr+l3@AIDjYUX(Jl330?CX6bCuYi;(o3Ak8S7S+GvJUa>qExGp(kJPTe*@lekGa1A z?`DaM#~da^pzPc8?7!J=Y(rUj&9EF}McrJ8phNv?i{OVxJ9C27U9soo)qPBHv^4_) ztrbQ?;=hGHD#$Vm*H79(CzCfUTZJ37_2-3~R#eU^n>Mn&;LTfQ*1j!!Eh9dyN5jlM zZKreP-tCvW%-$Wpf5mxy!V|N2b%L1VJ-Z-+3m)Ah^4=aj6uJxUz0}rv?tS!L3vT_) z&-B~|ZpV%ClrklTihp1)Y^%-03)Ec)q>J<@NTiB?3q8e3ueC`e$(>#YCMbgLNXDs9 zKYxVL;B5aGqa*Q0GRi>p&N+sgQ(J1vLnl{i8sNJqRVdP)x;t%uTYy#G>5WyxY(z)I zxZHZh+W4HA*L*|kQ8j2>UaGQCy2N{J>_l$*+KC$ZGDhGE_q0QJ?5+k|2f2LM{Fuwy zX2+k=yD+Uh{Z*9HaPTHu;pwOXj0;C7lP}o8zw@rA`RQ(%yjb&gYQIS9>!i;;fMZe< zv8NlEhvTi;9rq?We~@V@x1D6Zj#X&e);b+0ob|$AOTASU`V;-#dha*U#_N~L^i6x@ z9ak&A#tE)Zdfq6?Y!(UcoZt_Vnt$Hq3dV)Ov^tx^+74bM55KwT=)FswWls@`=wi$A z#~9_TGOqf;Ze}t&eNH}rUDzNJo`!_}P*tXBwip76k}fi{xR<7bVE!hfXr`QkXZ)jV z4Gofa=*0K@@%9?RL0{rb3Ez@#;`;ZdGJA}pl47o`AnRFQ;=InnSqz{+nJRx(T9Gf# z21WGpO1z|g*dC^Cc)v)6e*)L4pMu^sNBt6*+`l^F7MD$*fM-|Zmr8izoluOtO?RTW z4v58iy@2^|?m%8l77@C?I!VVrRHppHH?_?<42~Ys*U?DLxn6hw1sygTA4n}y*m$6a z88-c;lU5PxQfvbo!CP8srhjbPF!#oc*cxbOv|VrbJ%Wuogp6eNDir%fVn$tn>aRva zd31ANV;*vSS>M}S-HI?{J|Swa7p{3MD`4aPO#QFd6}FmsG2@Sy`f~O|x0DxPpPv$| z<();ozjHJ+9=c1Nd%e#qi-#Hd5kJab5Gqlw!AwLN2fihZDptKcJc`z#c|}vnCng$e zWbgT?ux-CY(;xN~`!%45E9#y0z2V`sGMaQDAAbG^#P<z{9~I|Rl<JFNzU3GMyjQR- zy7!WJAfI>=qb4jsk`()$P~dUtfmhl6QpjY<58pBq;at-Xb4?YVv=40#%4R!=r>ZcI zD=Y=eElZ=PKC0k-D!pB@t(RjzHVvn{KdKa*IE*#V+j;x}xmW(c13c5&?Oh$|^2&iC zuC`Yo$T{9;e}I)_HbFb6mcG2gg*SS3RMERG$2QCD?z8HN*dY5N;e$^GadXd0gX%9m zE4{Xe=4U#*8a~=)`aFDAwXmCEySsm&`jo`R5B8+#_*bPr#A;!^0p2`1xfSq+q;gy5 zGAX^+<}str;y$Za>w<8`lTRa}Td~t`)(^^NzLqbY*EY5vJ{JvL6I}lJKMypYPTxW} z#K;aRlly&46yRV(L~;tP!0tD7({&)CB`Q|P0-JhRZxCozp;gM%re5YtDZg9PZ8)&5 zDiejYSiF<a8soR7e(453rGMjvHb9011c1K?5tI-BAtd}ykmgK|JSKor3L_Z@fu zgfv*w@Lx<u({ZkR(EgIxUnXN!{?XoGWuW<ACL?UWvmFHS&FxL%qwTPM;sa>%=Dt^) zBMZ;{NT6Yt;j9_B+2;nLT95Ro<sE)=O2y^Zolv4zNRupJTUN*Sy+nFTY-TuL$28BJ z(JoE;p$e#utSFRheqyr~=C@YXPM7M_U2`h3z4+{{?&SNRlK=+2;OYmyn;dgeSAhT+ z1*;wwFwBs<+9ws3ji`x9!YGf5B*>lX*(i@Dc%`uqRA^B8cNf`mK4FxS%Qvk}UNtN3 z=WnT(zhPeT-v_wX2c28d7RAf@nnh9YvOZqacWtja=h)(cHhOjO8$`ZgO~0k*fE%== z=JC#~_xjS8#C!LI1L+TU_+VwKyRP};baD$TPgql!Cy9%cp+ph9I5SXt|FqXWB8yvc zISOy$&K^zUi3G&Zhw#DC>>*l?7}`Aas-r;F;8f&U0z;uKA|;E%U)a;4FivRIy%3`q z&gU5So#1H!TAUSAq;iWK4*yS$lK|NO5rF*vN0^fT5GMKGgn9BWVbqfN=>JU^{^Npw z36uIC!npmLFmzw;=$3uQj2HZ+W?m2E3q}Z-KXr9+4_t}_yD@9Q<juI{JdSt<b6YR0 zMjK!wb~7WFDw*Z?PBJ!>nh-0W7Dm;3y^gm4RICbFYy=<0TKeK4I=Ae*ds!8Ez+$a` zTNnv{A_@5_qiB{oCiPxeYES};>*VWlXU@J#y@dNg58b9hQ!OiP+s%mhof4U+RzTCV zM~^G%WqFmGY^kfV|0zf6KlS+h_5mR;dBMJExhE#_1vX#)3E?az6PzgjJd%x)X67X! zo%`P-D4r5rIH~kDE&?uc^*NH<z}+E&&aT8hn$cH_JqBhsxN;X7i(C!k%(JkM6}TC2 zjGJhOI=PCEqs<ef6Qi6G4PVW?RlX~}>6Fkz_R}%`_VBi2isn~0t|Ylbt<@AYswU0| zHddN{)9D$&7r+Bh`|moLT#et74?3dL$;mpt)$(|Ks=08`e?>kBw-g3y6mc9#1uj>% zN&{@9Q+SL5KJxjXC^NZchjK87vnWED2N?^pUsmg$!l;ldJd!*{ks8T7kHZ7E@0V;B zjX8CuE2o#qePAk*{ilIYw6DeY{%Ig^s_-mH@TuLl@#Ky{Eenu@d^Gd5?B8!AXItrt zfKe$96sTUC)WE2pU1c%!?td-0|GAg8Vj)l|L3}-Hl8?h6>!a5?U+RS=H#5Jli)T)O zpuGPS!KmlKZoPmOW8gwXtf^(H<p;0!L0MS$fz{FQz8x`0b37a2&{|=ealeD*7Sf-> z`mbFCx#nxg7Ac*lZJC<(jwoJmZOeT6JIoB`!=e7WP8xjdk$96}`zQt`v_mw=x5*)f zE`-lMn)Qa74Z{tzaE!gF99(@S(!pmIFRrNWlpw!|=G2ipoS}@p%|ydxq_h-lnk+WX zz>$CudBtU|^=r^6iAUPQ`NbVNzE$PF1@u4o%ZC6v04sp+ze&Xtx|MjV^$9Vj4h!1% zR`cUS9#5L9#9K{IaGjMAO-8G&kEg+?5uOz1p{VU5GDNL0S8FEX4Vjiw>V{ShWclqg zX;Eb$??PxxFMnFemqMwRKw1GG)`)V_GPU+0$;~zxS*J9%w!Zx16Y8&J+|MdEbjwaf z26O+GxbN?H+5=`ro_w(N-DLIkmP18CD0sBCCHYLMHM)89_E(%7;dQ!&26w2<k54B4 z&Zc6W%nH#+hp$!1YjRhC>E1<6>81W<2R$#FtVf*9yv#qCDi3F^NmD&J#PB}3Y?+G7 zNo89w?vQw);Ha6=-I-j+qc<bs^%Y|1jF0(;ROI*mO0~!N^JKkJ;*lnHF~|ew8yEBW zj9u+&jer}Dx+YM!4->tG#%U0XAdMo(H3%IdVT_HpA442UlB1~mFYSG)GkV{KBNKw{ zF>EPW_Ay`;K6^CKtmN%~S$G)07!U^F`sc#`7w~Td^(Y@H74R?ckIq}oK{<?wgiqnS zR&CKxD&Z@XQ0I>|AP?VP@DF1+5dM$NkT0LQGaQO{E|%zv1V<HWB(uK5rtN$!HhiOF zsx#>^Sz`X)YEdW5<?{!5lIow-rT-iJvzy}<DN!O5Tnow3y(}DQeZ01s+d5rk^XcjD z&5gZe7lY~t>N?im2{le03GDI>Jfo9b{-CA$zkzApU+_;gj#a<q%)M8RB;TIDw#IAd zgOhH?UzDU1LelX=ul@d$qviG|r%S>)?~ie9F~511zFh_2O6aSt+HrCFd)0OKJGiP5 zp49`NWbpJ!NQI}Tt6yH?k@2Q!yK`$!4~4wHw?3itO<Df@=^q|BRO>>>kQVj;KI`!; zhgW?Uhr1Q4^Q}bE#9l0-U<-bvLZe*B<?wV5j&TK$y@V1;6HGcQR_JD9HCD8NVMa6N zj~O5uhD;vgPDG|mCAlXU$03iPY2?!1p=s*?UFp*GR6Ug)=QI-ok9TPnX0P6*>gwQ3 z9ecRgim7qVpm8~MxknFFPO&qafQS7%n>l`8`Q37ZmrCE~hHlQfy*_P|xMwJbBjf?0 z#SMvMTnn_n6=IFgD5SLME|S56k_cr`j*ijhD-R8U-4deYrgcE{diWS&MT0;eU>b$j z*{%3!oXv&UvB@v5VzHU%d!P7KprYio;&c?i!u5KeXy|4*LG~4yps@Z?exMMHHCPD< z1O8d_so&QV^wpbW^$LeQJ9g-18@2g6xbhkPGtqi&D$b}G^xY6FJNn%)64|X4NG7{K zx>wl_HIIBqJB#hsXOzmJ^6FYL(|g#>z-dw`2}0Z-5oxcWQe)ioizx1+b*rdVKC0*u zlW4d3Mj~rK*fl0aQy6+YtnjHP@l`iUmE5I!-*HTecdt$2vw%5CB67bPbSzN*9hlgq zBRck|`?7g${P{kqFd0(zf%nOjJAUo-xrN(vu{nYF`xmo*62g}YkKaE(UU<00n0vD5 z``brmnV)1_V&yq=9%422cS5b|zn7{1-|i0Z_nP|4kN=}r6a6nX`k(mOBp}2l*kLtl zh+fKY%0f23AN4=*vq}-fw{$-KEnENKXNjqc{*#|Ax2U69M}++y=n^n*c{KF#U;OMy zL*;y<PW^DMZsR}s*;|8QVdj5Bj94F7<Nuz-60{qgIW|j6;MC0{JtK-~&yw)EnL+hF zsCKkWd8gO%$cd%+e!1D$llr~sSkZ@h`md|vZ|nMr4jntGM4@x>FUSO$8cx;*Qw1N~ zIqv(hH4)QMqTe23D&)*(RO_rso{s6d6M^S8K(_om-S|@eU|Evu_vN;i#hZICouWxS z_}&&2mEna=%4U-LpEDxAqo5p*42>Z?Ff*1=xW-=_#gM73L{(3|Ux}vrW8Wv-K)9wS z&UK^0fp$K-U{-~M;AkVlqB2;cC8yli5~M8AYl(6G+iOXX#Z0h3+p&rxf{Vwph}&b( zkS&g*$>OWIV5uZ$l7(w2_aiyqop)AB(J*JQCC#h#SMGGLdQ(aME|1%TWE?Ky!IZ~V zu9x<gK7HHO9XBIKaLWo+5TTQ^c-u@sv2YukN69T~lWIp5-y5Q}9H(}!aru`)yF2ft zO~p_pAT2Q^dQ&asUESxKYU2PL8V@2bc|lD4l?1&H{Kodp$DLfZ6Rex4;h!I{d1p>3 z!dZN-B#=kIUu%vB@{q?pCFiY68Gq$M&@;EPvTo;Hy~-t%UVuh$+?LwMHb*a&hc>F? zA2zd2zcP0)IVWo5F}yC4K5%y$5&p7XsGstwWOWEEWW4t(IR6V{FJP<8>!eRI@plU6 z;rcdfKixga&W<Cdvwq!+?z3HhtGkxCvZ!@0K_O3y7DoEmJ)%xJBj;7g!*3lwGofN% zVL!fTX}XuuFs1(X|N1eOC2)wdUGkxR`?$<Gk+m+@j%Z9?iH^kbe#D4yS-cj9=qIgm zL(unFfZLZoqAoHS!>!83fYJi|@Yc6ycv+)%6Y6!S!8)7q@|5kfTcfpZtKCVn*xNsK zRsG~`s9=xWvd5&v-Z5Wo7ingAmWd91^Vi$RxY@uZK&+HS5wgly>hq44rVggCcE0g3 zTy0XPA|7})|DE{OmX0!E@{W6zrsyAswV*CB{mOeu?^Hil#0RvWe>DzhKY*$I26P6T zl~?b)><!kS4W^Q=leG>X9>>nF!d|EG;4^c`YX28wZ~Yea_Js`(Gc-dE(%sFF4kd#E z0@4_WbeA3kl@N63M!LIOK<OGnx};mWC6!QM-oZF}zSr|y&&wac5BszCJ!{>umY*o@ zGMODh{Uxp{lb+^tnH>yuPpPHU6HAsR=TI<5P(6S}vxDbb@f#27MF88~r+km|fsd<( zI%Jsg@Rf`QUZ=HCNK||ztBCiezvi7z<V;2GaPb)^z4CDZC9e%T>Tbu&R(U8G#1+A> zxukj_r~7&|7OZ0L`5L!-Hc1sq7mZk^fv|?a+L@#1un$74`NlTuG-VRZ1w%<`SRi6u za!wnzUew81x2h1noh52oD!}ZF;WFRluNqECx4H?Ma3OK&X7mmr<}?caJUS7!_vA4% z*#y~cb4cQFaNn7_Q<2;0dl&7~-<R(nissOOFWiXg$wbxQ(l{anbSBalIh+e_v1O`< z77kC+x(24U5ZZ<P!^EhjcVESS)`}p!=EJ#rN3dwSC%jxbfWm(~UBRmqCrfBq%@`_V zOLCM<S%g7$d-ZyA3~>sH=>x2Y?v{AyyM%#fWNdm`s9LruAepR-1$IS&8r7>D5U+{3 zYAf!bUu>!ABF()5$$Vx1LjUwrd)!j%+hK-GUeVMRT_V*aI2vE_WWxj6D5?OSj5Yk$ zkK8eC(qb0ZKV_u@F=fH{dqx@_Is#1SEH&OhhBNQ4-hgz$pWLq-X6Iur5PTfpW*V>Q z&~8S*qvS6Q6B{kvC3L&_wa_j^WxPO%2SnnqMW*+yCtu}xut7BGopzN8q;F+uE_ab( zme(jYn;3}BVf#^Iq>`!uo`5*A$h6;S;)A;7+i(wjMNg658ov+NL%d*Hy55H?qE+ug z0*kFrD*7WyLSc%a5?ibj<e0YQ`?AJfaar#ndz8g^WsQe{ozqPG<hK_BIWaaWnlE+d zX((?KD(ybyj+$MQoTvp^!=L5x&TVO<E5Uw&7u7{`yN)OI^MryfoxJmhktYpnYJzSP zMe~R1$hV+)xI1+?02>N_(%Va68Q1&i^4m$XtQ;W`wyH5uB)!6udGIkt-vYK2tQsib z;7J_PMd>h5MewT3?|R>2siJNxC>N^FDjpAZK5gex7ow2`o02-|L}X084YE>Qrg^&> zrE6O5W1#wIhGL=vPE-;8(kq>Bvj*9c!fmT2y}}`N*8NEG5Mh;MRD1KRM|Z$6G@H&8 z(^;fLb-V&?w6mOapvKAJx37Aozb0N!jY`#V=_ZebVv!<(dTlrkjOY8-Z)8Q036r*_ z-~g7m2M@9G#O&iQ`Zg5X6y!c`0=UC&ddV(MrE?VU$J6(3s#kv)5Ndh)5MC11o{0r# zs(-)cGsDFD^4nNhY#^>KH0t3*;<yCqSHLvfHl+dnOzdGho%xVw`+^Ce9T6<-zZ4wd zN$f5}%C2{}q`}SvHa<D<LS6Ma7Bw<^_)}Fko#8Ns15VB)$f30x+j#fGh6;mS#IYua z5WsEbCC8Uk@eG1c5aq~WFZ*~^(seF}#PmlTYzR5khPfxnA%KaBSAlq@!rP?s(i|Vw zT8PDwyF^U5>UMG`eAq+8mJ2sYASnGF?o7g{7~b{1%lk*UCKW+mGx~jyPP}$2M__ya z4K{52tE$fpMC#EwJ112;O@l#HyRa!g>-rYp+%wkdQ6t}4m$P0Cos*2+HsU(*%h()b z00#_%gPw|#fQX1Zt8ImpjGkSMJPaasjs(KAfQ-TszR79q3<vjv8jA(?DmA}<h<8-J z{bAsgmokY|MYHve67ogb=^O_`euL`96LJD~IRCo!oy9=My_cQx+p<%))NlnLrDl3H zc9z&5Xf(caa%SRNS)JU$XFf>$lEH^0s#e`fhcpl)2pTPe*r$a6NJc+m73DK6Y@sL- zPS=`mF&>|*Wmob>*a)PRnoxRfh~pHhG<@h;%N?i*)`5rx0|>4ln#&wTChE@ZEsOuf z$jj{=^8D*03#%Z;i`jL{qz_iih-czYUt3~e3T6OT(7m@Pr2T}<6$&8QCsQVYbl^bV zVcU>)A|&O&-Qs}E1wzm3kSu?Q_XELFV=>Bh3jdRTpd5$|5&V`12+4eth%)S;2=@Ru zk31)YDjZ_s00RrFEaYMfJGjc06AF?N-?gGB-RI#wh2-XW3D^9?6l+CUWob@|_n^kx ze8XrLhnC(Nq8W~-xZtdgOU^_BsYX(m#gjjeCl{f5Aavi4GuI7^%S)sjL!s+g)B`F7 zssKK?y=co*;(S*{loqj|5JA2JMXx0Ts@gVCQQy5Lkl4}=R*v!EK9FkSrSgGamM(-{ z6UdS7N_X8Zmy7(Z3(<@*f#63U#YM+$6OXrfHW;0OO_Sz`0A@T~$QLFE6G@1kuy?Va zUhZ-5fVCMPB1Dln)Os=ChEPashcB6;#rT@p;A!ZB3l+lxMp~pl-kR-VeAt#XMWzz( z+Ntl$ny^FI8~kU1tm6{Fif_KvycsqzpN5(E#|Cb6y}^7KE+-czar_1#aSzAhQNMLK z33bG3emM3EYn8Q7vV;hlhn&Z->lABdXEhNl5|R5KBSZtZiIpRHY9mQZBZaNJ`KY6W zZ34-s(Ef4>dz5$-Isp5&1pqQOf<^#tN<`n30N@!%OD9CD6wsiCqSeo$HM%iM;RN+V z1g%K$urYiVK!ns5)Qch7BZ<8u5o?Y|sp%T4-i`5Ali(gVcrZL>qAW(=hUn1YmI-&P zMM9jL4TW`JtZjE}lS7OHcid4ck)Lavc6D4(ZTzi|aaLz>^(67S1u+ZAm~F(podqK2 z?)c=X1ewKnO}qrpGw>ih!O12*p*A74HnCU&l1?3CN1fnhleprL;8&2~GL=|YoA@>% zwp=1HhdM6iVSIH#V!dl}$W)RVcj7zl<k-N3nuPc+i4=>1WE3(vTRG|a-Q-&3l=<4| z@$Td()Mj!eUP{MVN_hu<Ism^Gks3vs+PoRtq8vYykT|!Qnv9KaN`j>^lx7OR-$A4W zW27Obl6`EFj=58S(^j?VI2X#8Br2F1Bv@`ksRV9Rm^?{S%Bf$eQz)mcjrK7G!hvjw zK-NT{#y%FKEfqCSg11C6?p6kGA-pUd$J8MUmY5}3mnA)&b>mwWoF-cuKZC;-9ZLn0 zB;w}o<G)?NSN)c)iH@Jv5ex&AMZP8U1g0DXf^(U$K|?^*{T!1*keOaC2%c+Yn`>Q{ zYdf85^DWmNKko@m-ZPrq2Zc0caGZ<UJoo9mSKsmwH2GeV`99zBNZc}SZvk)fV7H;5 ziecaK!)XeZ90>d11lxeu&WR9y+jI~D6Bi0d!)F9S0hmmH9JfLcv@pSq>L?vYs|+Mh z0+I(5Rj3rbqbaJ^E2^<AYN#t}Dl9@K7PU?nwWt)g(SQQ=vgP-&gh)VILwL(f1;acA zx@W{iL6D@njHz@GzXL#Uu>^aeM2NIhP_A^Dr*y@(bPXS}g<rbCQ@Zo56f{&SEcbRo zk7ko8L!s_1YfwJh^jj27*`;1Kh@kA;tqha44DV$bR&W_$=B)-4(Dx0~4^A}VRvzX? zSdS<;QGp~$rp_{9WZ*+`cp&U|3JX;#3iT>DUsmvZC*!NH;6`UjgDXT)b``=>@91Z! zP(x{W+i&5#WniiI1mDYU(!N(ndXH^ab~_0;5CkTp#qvYOP`xat=`EL{g-q!sP9d)2 z8UwO}D)MX#&84a=A5~eutg=n2vahdtGE*g)R2g(Y%$)e1z3#orqs;F-?`3<d@q4Qk z>&x(a-+T6AYQ6*;4dG3Z@ZRGs(dDi#O~^TrNS#6eNlB_O0kx$gcxHg2)R#qRv~}rH zb(xRqvR~HaCe`H!*GcWaW3{aTEr3Ab1mk5fp#%j}ng#a@YX!?I_0Do|7D{jcRSi;- zWh9vzOc^~%4Sn?u12YXn-y4Q$8%L!Y#~(Fzzs&be0+ta#-ox=rQ6x>;l1&;aIorl1 zAEW?`Qt@q202dU1!-PQ=-sBlY1cDQ;`81y-HJ{fvUluh3W}7k2n}PaBOm`$G8F|86 zUb6jmZYF-?PV*LTEmmE|EEKHC+mh8*t|rmKFx$dpU&4Ie!lK{G=HAMh+{#hh%C-{? zLgE`al=<-*2rgp2%WRP=Z_4E+S_>zVNhUHbNQWhx>RaGW5oD+$2%*eI!ldc9iXlzC z8QbAR{;p{n$)@|a2{r9-Q-<&!*po}Drf!#|1e|?<TQ-BjTUJavq)9*E*rwj^>)`3& z2C+ftm^w98TPpA>+Rl__x!Yar&E8UV2`_edfIAVYT|p>!3lr7&SIOzYbls+wUHWHT z!aUva=jNgAU9Xe7Q)kViRf%HVQ`7W&M5?-DLb`Grdh&`pk;+L~be+Z0y@Y-}nZ-Tt zlY5CNddic#>dt!`EP5NkeeJVG4I#ZBlKX1euX3mZV7<=S?m_AP<PUwrs{NDt4?cps zr)K*NE&6A7`j_mrX571%-3Qh&2i8IccKDQ6ReL_u4O(Rn?DGvCgXQ-4dQTb#hi?sj z>l*~fNS^KVVi*i*E)QZp9>Nb50yPd1m0ZWY7$OT5C6xI{@mPq|<0DN!|Fy=C40GJn z7av(XIO%1EIU3oSJ%)MuS=k$h1q@iZFNTHHnE6pMBjSXNLLMWMB@AMXBR2@?B`!v8 zrqIdAj4EEx$a##aq|hidj;ddzmfEK$(+y}Cj75JOy`M5hMKk7}+%r);W}HH$OFwR2 zLZNIhZXHTtmNIUiLT)uT?%+XgM?dk5ko+Hm375|hr<4hI4~X;J1i}FFl77-hrlpZP zRd8$UuEAu;=W?ybEjo<@p)ymAy<>qMy+&$N(K3^X1{1I6rd<1{(g`QhWTv0-Pv@qL z=cG(O4xKJm8!x(;w*EX_Q8HF;Fk_-NQ)4hz-8l2G1RXXVZKR*oAe?P~Jlf_ltMYiZ z=VGLLZuVCH>`=+bpv>G2{<(3Pk+GDy>!EYAsL#VQ7jwd&=axK%7Y*il)#f+&hu0hD zIZEbt8$W)g|HMd$&Z2%i^7usa_|vzGp|iP9kp54A(jk=00ulcLHp38B>H>D?0=Q|A z;Bo=*d4Wt|kkoMTM0JsBV1Tk|@t}B-;l=<x!_o$LiEX~0_0`gn{SuFQKll97RNoSG zw@>iK@(ACuxM81I>T*xWvh-!I)a7#f&hkz5UOB^+I@J}Wrk>kPEANU|)Gxc$7*=z^ zt9Qe?bzZHe+OO(0bv>M4jqF=BX6Q1yu@=O)W;xJdk-Fv*vS$D4gWctt<<6R8Sld&> zbq&>Z7xiZ6rgfU)^;ZM+9t<0s1RFjA)!wLA8;N!sLG$H-^BWI)H^Q3=-`v<d;n|FR zl@pV?nGm#@e3_ASxhb->nJJK-VYo%9vXvi}n%A^-TCi2Bo>IcF{RwaT{j216ueL{Q zw(I5-Yv;G?ySI_M3Fz5t#oRj`smZZ~z5U5M+Lx0@)Kgz~c1)UfR?z&SVNX};XV-^2 zv!(Gfm!HixKQGN+dHxa%c70TLw{GmNzxv!izx(*f=P<gx!_u`q!@bQ{drs<m!<U2S zPu9;a_weZV-FNqb_@}Vb)<J3eBTf6S!}jAFCrM=67Yz^Cx_7CXBPp8?XbTP)WFzSr z56SQj+1^I5zCOgZIpkrC;Qn-Y-gO8?8HEeV9)00D5^sJZmUgrqa3n4JMhbPbxN&sz zZJ3<VmqDd3O2lEeo4+*We^K8HQDgk-j{EiQV4%+HuTs`u^^E);e)>Aw`PKNXw~_4e zd(LCaW)F+BV^jZQ`%f-*sAKW<V@JjpPmNBd6;E7@9Gsg^%5zU%r9JjwJWa(u^&z(N zetjBdc^dS|Ch*hgtB%v~Pu6c_&;H>!i~VF3lXhm|cb2?onS?rv;yaiW__i>=4|%(v zySM8vQyXXSt>~ZK5~G%nyZZpf?~<EmHE9+Z&EM5?zc&$EG%}vw#6E8)?#U<q-q{@0 z(R?l^em<aK*3Wn$hJ7)r(H@X+5x^aDm&+!mk0jZEmiH?#Ww%UnLNIDN?Q#!!ac`60 z(?5jcB$o!tmungm|G!vOWwba!2c-KYPLRh7&{yfF!&h7HJEXVyqgYfzPRst9O8AE9 zRuG-?l{mqrb2XK46>dLiOf8H_VA&H05y=&~#@-XfDWjG%6Cje;`-4^eHI>j$bQCD( zgNv&t>gHdOFCV-awt1%P(?!GrZ`QwaeK7Muvi9<CR@I;)=#Z(^6NF8~6i$M5zq?wI z-gE?FrWiynpf5dNzD!&d4EtoGo?QJ)oOn#?i-`fm&F2W0ya_I4C3Rwet|^1NYnX3` z0j*;A9=!D;VB9S{-CqD2MHmh=)E=!5@mB$gB`co;JvT*J#0u+A_7>WLQN*%PMR3=K zQ#}`fdh+*^{SThY*aEa3r)=*Oeu@*c^qTZ`n7JK#1ho!Xzl2sIqW5j!t(=odun4ZV z+RKAl93t36gHylQNh8ieAXjca3j!PW?m{qjm2sCl$+)$d4=DS3xEm-zyB|jH))gv> zLYRe$u?OiyzTy?%T#3?5ZBGP%9$rVp0ObL<#jd|_&4P1-H8Ti^bBufZ<a#;@MUJR2 z!bI5|^H-Eq716A!%aZb{A}-P-Ee;_`Wf>+dDZd6NyQ`y~c!VdS0er&n&@?srzU^kt zJx6j+W_|3f0xzH%%+gI{2TGJEC;m+xhzDy46?<BT^4~0eKOV#q0=<F64^6}78G;Dx z>`&%PxyuDV?Zm6@;VP=w!i2pot_b1<F<EU_PFikL<6|$lr2x#R9D7_=VtMD`UGC*= z@ev-LeNq*TW&<K9sIegEo<r6r$^FZ$&&_C$#XbDFC0jWDsPWN&bcNW?KH#XqyI;r% zd}oW2z=YzX)P|CX1_*+fMUa0bL<%YZ^NJ69SQ~XTIfcM32H+Ghdt@6Iu{nvbU-YU7 zsUMS$<|7j2_VP{$n@kG;67C+_eNn;pb@c9oFGRv!NKd4Z=hr|nd*;QRy<11*KB}C4 z&xQks;!Mn+bsp(6RnMX&7=>=mHwItl-3d_cU#A?9<yAwR-F{kfcskx-vC(W$)y(a| zww9GBV(8i2Y<!#gsE6}zZ3)yQ^m*%bS6}kZFOdtLIBenYy_uxfU(a^lPh663q2i5O z8QkNcxFT^Ojy)nv4(#=xyExxADA!E<E7KsA)pt4t-(DQgJ_;pjyk~w3|2k;Yp+{`N zIL+f^r~1wLN7P?3O;q*#?#W*B`kpRM#NQ^aj3$)CzUSSSI8qfDL?#Gtx^WUe=nIUZ z3%Px7CNNd!bQ{qNO%1(D!0l#7idKrceeJ}j{!*fCL|_$G4_@~SB4^!#Wcw!~+shdw zV1Hcp8j^zmrDrOC+i<vk00ixC^)mcF071fhnWR*1+Wzm@(*Fer3&mdmvDO(xA@m0z zqyi!T1&CLF0AjtI>qEeQ0YW2tqWTX&===vD#yhGd{udx30zw&5<9`7}Rq#!;bc(4B zfzvZ%PlO~iOVS;&`2|x8G2IHI!y4duSZavJsNPU>u-qX+#Mu7>ATp`}$u$23h?giv zD%R>?DkFwFe)<&2H7EPay=d8`N%8x~qir-m$o7E7N;sHoiz>qjuK#pma45}#BWm|C zd5yp%Q)VK4OknZdvGqm&Q@Oioui0X)mjcfS^I1IksetO<&<-js@-9u?c|bU!v5MF- zVuLk+(luaMjEll%B|^#eS>kgL-q4CIDN;)<<gNghCO$<j2?)|<jp(D~f(PVq(_LC~ zc*x<~kVPn0ZLTF<O4O199n5uBQ)a=@Sp@nV#y+88gn&C@tI0N8?ly&ZX#c9XZFVw^ zf^k>0i#GQVk?CQeDiCkTLDhFPRA(*2kE4)F$zHN>tFTzHaw&+o40ULlBTTgKLm(wR z&Y7pKsnkwcis?UF*3RHh>Ifp4*sACg=cUBQZup4^K`xV)QbTd^j#B{8f}1Ta??D4( zrZ%Ca<6+%E)%I>Ze-6p#BJ6B9q4-{(_Y?ao9LVE#kdOmmUe{C*>qNW@lQQ`H{f#0~ z8}C6ox!o6axs-O2h37)ggzw4|$?k;9by2lqibJxCE66AHv!HE+Sw*`|*Cy;mKI}1h zgXwV3uTiB)HoqY4C+=_46xh70*@C6YJBJ0E;^Gs%U9Lrc*sp6fXFt&O42VOQvT=T3 z>0l5|B#F#!Ynirxdm(y#txQC0%J88_<+#gwBbTb=_L2LZ+H<onM3RGGxEBsXJpAS& zh)|$f$LQLsrm5S5CughPlu!Pn&juU~%qlAg9IX~tr#@f%ACdOWt)|`DQXIka_Ob^N zgxs^yT5a3{CzsJ%0fd4VUmj(#_5=DxEA9vuVQTqF%oclp(;kXbyExluI~$Ok5E<ze zYYbnOCz;h>ZrCG!kaBr>PI*Qor3Jx;b(s*F;F?j6*Z7@gl9gYg0pgrG`Q>B_(QJw7 zwMszeX?%qwuG_wMpG1n(>{H1XB$_k}HJ^?UIB0-y5JgGNVJ~MUP)_grso~-Nv5&B# zalisV_8SLafJc(|)8W_JkKZoJdi@z+jORrLSq;1`ls+lZ_rt|N=CpaBl)Z}J)cUgG zI7yO&9$$?0%5{mwSA!Dde&g(>NZ!XRsz<pS5=<S)*g(}rw^du7;i3nRj`eAxje{^u z{Q_x&EBSitNS*C3@P!nExKcVo+3l)Il}q(G2V6`8X7!)G0GXM8yT+x^^lBa7kWYwq z#?z0PqFW3g0CNbUwu`MX<DTgReJxw^OW3t+nPMWNE*n!Y_i9ru(Gy!3+nfPKcx>)S zWRlrWAWNM5>tRKLvaISPxB_1RFFt5AXDRj%LE=W)yl77azOA_)<ulW4n+NC|6MzKM zPZ;LXPrY`QZzW$hPC4KByWrwLAD1rh4{SaGROy4@%&HHr>Z(7-^=sPmU$A*cI2+pz z!K^z<m782JJc{4~X2}bUh35{Y{ZXrxb7#mGJ$*3LuID7hjat{4xnWC_)_8YCaT%4W zm8ewxQmem<(3f!%(=ovI7x19=_BvNpR0o_=-}$^H>9<-f9YF&DVPb+qR1pAr^ANc( zS28nX2o*Pg*kO?cKlxsTaFJnu9a^m>O^^>@3a<e4U~aWmo%%SfV+b{6<MIz-k+Lkj zknPL;0h_m3pil%{z8gFLwm;1KeK2Qn6A6krrS%AGG8y@g(O^^K_qlO)d_=>x?ia(> zOG0pp7hc7_5TYZEdo1K={>s2+tbOp1{2^;+{zNLl1v97}YLpH)#LvyfnG+-M<5~)^ zk_jMm`h2i%1iS%&wK<?G9iqS=YBjY2wu;#9nZjZa8pA?dFv6BioS2sKS0Ys<M~&sD z?zOQ#%f=l|vO-`;ARvpR2fn<e4Z|z(=CQT$m}Gs<Gl^BC#&G<5H%@|}+nQnkF?1>8 zO>ilO1b{%eHdp9%^yZZ%N8v`M`RYyi$M*AzNC+---JJBEvB(PGQf&wh0^ZXK_1La) z;>ya;Ei6>_ziiWXeLRnf1@ewIoM=c+GMV8*CRL%Hx3rBxrUiMWwmaorde64y9B`i@ zFq~Q<2*hP7^B5~@vvuUKC~@CErd)tlhh@Za*zMMK3IwZif{-7(-<z?=|3E1W91_po zP>G%J;N50`2+s(-tNre0&%N}czMsx=Hog$+)(Z;S{SQ=cY}Nzt1nvI^n!=i?t9K52 z1D~I35L$${sS+v#u!e|EgzG%5h2rpk8M@uAuOOc7prc5brw<w!l)ugYbySp{uV3~r zR0^>Z8Z(c3EUvg$>?9`Ah)@cH$T>I>j#^DTKAGDqiz0-zg5}_0Vy(FEg2g5R2*1n) zaNc;<x)9JtBqjN_LWO^!toU>_zP_PCY8TD8d>WR1?7Eg67xr`>)F6VK%&p#aOZfX$ zU4f9mpH~H2NJGz1$3xFh4>zuRHtFaIj3Jn5^ZPwR{jXQ`qg!ED@`0jq+?5DpnQxWl z8;nwkFr$s#newiO^7#eN1pc0({;fPuBWhDz!G#H<Wn67@&E)-blsWpH1&}dUcq@Gr zoM_el*8`%aOkvsm44Enob3g(XLBy$mw(+vPd*OTYCcoPj{j0WRx$&o!>b;F`7;$WN zM>_xm1JkrQObzGZEuk8x?fL%t>;Fia`k0P~xYh)7Io$7dd|r3etz_LX>XOGnCmu@7 zK9x4UJl>m4kVgeD(N>*J1}Y1&^`KuBx)^yqMSAPq#ZuygSJJ=_D;39c01!l>wBU)& z5wPHeUq><Hx`t<rzyOyk$b%_5pzudjj`55B3~p2)d@ZJ<55A{4ur_e3@jD{~w1aCo z1a-}F(&zd-3?3#iJ;@q&BlbG2Pw8jJK6oPGLMwoqBG3G(<~-$UG<(IN0$3=UD+m3C zZ!O0e`*Cv^5R*Z}6M+5VNPCNlZVr13e86J(GyI`0q3<TS*>G-YW&KFt+=*3`R|gVP z7!E$d!cVYqP2d&?<KE1UzAs6ZNH<onne6CTXTv&a{*LWd9O>4&g?6SM&ntfpO`n(; z2~;AGZ!Fquv!rHCk2{z4@s^!Wsw2LN82-b_@$!x*);kql;xCy=RW+mFKv6m;)7X># zvNl-6*4F3h1z^B(%?iH!ZtX@GFIyhu{w+SaCm+81G<+Gb`={}g>;tCw2*(0uaqLue z8|C|&R{a`W&f<M*GCHOf^oZ+ohc?J<)$(>KBR&)KoVjo>Hv%oz!!EWs`@?Q_R*<SB z_<bL|a)RgtOL&jZ{-__O<J&hNeX?^j2**hwAl<GwlNS(!MC(1IZ+sUfx+%)^90XCq zu=6mw8+|mc@7y>%EF5uH2mk576>NxNSJ~1vdJl+zRGCg@Z|Q#bVeZmhL3b-Bs7BJs z*9w@OCVupQ+X_krjV~r?YWe%6Ddh!Ru?)ab1Y(ml%O`8ePP>yDlT0IcbPmtFYILdj zpA0F6p&Od*vS!2Uu*qU?xAmI!S58JEIm_?V1M`~PR8`)kM9erup}QK6aKH(CH@!`L zxbDF}GOZz;&tKjy#F#&w0sT*ZBmd&!`+lda_DMk{;j6!~gsJn(%55Z&hD5Aw*<b|u zz}G(9i`F8)g}W3Z41;0ci^`qxqHBq?lMq2&IjJCcpVUV<-kWwi-4OdhS8LPbAs%}7 zX`Gi&Lk+{*@Z=Uc#P}v#8NQKN*=;jPY5v{tn1tG8@B3?pupDolkXC!%qT4a{N8K+E z(nH+x)dpu#aaM|UHMG(127sl)xkB;1o`yJtWW}F5MmnnwdN}rFF{DBM@-!=<K}P%! z$eg}KhXO!2#&<gL$@BFm%h><BsNsJ=MtG$q4n?NuW6?!Y9Ke6QRUSqX9nYoV6@>9Y z0A1<)S=6AjyCQ+qB)}wPVY2?Xkup*Mb=t&J$>xi=DwKkHu8d|5XiDTe`OcmDS`6}N zY(ZjRl4T<GY$?~`I0dx1)FWUYq6D9zjb^H~6|22$1hn$ZatHu09nU?Cq|HuS2-Kc$ z*q`|P;Rhj8=zV?h2=2b0AXBZ(AsG*#WN@zuqwtV>ZK#eEOi|2^#7<F9sY7-Mn7Til z)$J>bnQ#wAF={k5oQ1z0Vbx5#L^yujmkoYWKE6T3A{4MglF#@WbuQH&u4}4Mc8K*V zsFp;5b2)h(?LAlI%24z;vq1V@I~GG=96aYTBJe}B4GZ-3u@2c!=0Hi!Ky2|qNEa0q zt(gXu>3|PxEq^&Iw(&X%hAci55spSA47xEY-^^fsju$CG`~%oo*j?_PUIYT8N<??2 z_BU41Aak~?C@*Z4YmJNixT+;UgliFuSBq-~R9HcSk%;t1JlLb4&Gj?{wjOCXP0Yg; zM^dUtbM^0Y>-n!h(p%Qif&B>p!cJZ44^a0*?v1>3zr<zV>{yjTxPQk9fS0B8Sr6Rm z1L~Vk@%z}-+#EcZNghLb@lsGe5}UX9pDQRR?_hbk1HegkU8C}ANQ~s|ONWdAM$L;p zSIugRAStEp2C0I;(ZQQSo#<Rz*$%qn(eG;K-D^0?MVdtXXnS%iv#C|Fg|U}03CYoX z$4~cZ<Mw_V3FFs2>6CU&HVmO>kwn_qg!_9^Q#6N|kWp3R!){!ocMi>@S3lkK9(00q z+h4y@(j8Rn>^0L5ifA;X8#}cO$r}wRwDPtUe;HPVn8(5Q+GnobKiOV~@<E@D{8fuH zVf@<Ts>R828nMok*%<*Ti0(D{Tw6J~gLfcG{JX<hfZv=4HF}3l*-}0^osN9oCo<|n zZ2UiU#K4rl^X}O?19$1eh0s3)$CVG&$6Mh0&U+m;NnHqDs`GC%YNq2(CFMU2>(v@D zQj)`9q$+>?mkJdUi}<#F$z(<}B_hDtth2i<I;bi*@#W^visE3ldatQXZ+#%FwRPVn z6#B!FI@!F3LfO&MD`4XM$f^}TLTA-5!getBJxR`on|UfEoNLUSc9{IdvN4E`6|N`| z$Q<mD=-p!hA1+m9A0Y5gd-H#_o&I!h|J(QcS=+MD#HAi;EcOcxD8)0&(ve<R<TN?G zKl&crheBt%={cQPs%)88Yg=y8696#*fOLQcfPiIE)j9}|5MSvHhk}ZnjZUt5*3Fc< z_ggwe+U42`(~;=aE;4`I+l8UeY~pG>(?!dYXUa<r-UuGerxaB`F=}{*v3Iduy*iM} zg*?m-zmsTY_lEV3xAa5d)!yOw+C;Y9PxTb!`ax*-_WMor+LodhcrRK2<OE1<C}!;o zi<z2#wyXI2$4Xs~7}_t-D)XK$bq0UudvacMxNI23YSkp|_H0d-8#hGTy(P}BzHJ@F z@cPjt`yhQeZ&g!M<G16TMQ;y5qbj6+nX4O)MpN_YVOGPDI;O-JdTq-U|KT=GXpG6L zwQ+mq_2s=96@DN!*|aU)i;YEp16PF>C}{D7lsDp@l8I|l1n2=lD{0k4i10YoWT@y; zeB5n+jG+a1@dna|A*|RUJ3^uA>o|N8i~tL(-#q){-d>H-d(pib_lSt8#c`S)P7(+# z2hAqhS8Z}6;a!N3IDm$1)}@~>xmu;V?{4O$B95sy(!9pch*DEF%A#Hnsxl2>-XmEV z(2TzC7Lg1>mLq_%FScxy<B5>nfNSoyTLnJ~`EBsNIu7tT_JU_oD)#@MAllD6^KbL_ z=gtf<iR=1-f8QBu8e31Mo0ypV*bP7L3|^LWfWrd96NJkqFNeM}YJOa7xFqm&PK;Di z)3SP3lBBm>s_`32b$7W(^3=1$Q}AO7M+<e|+U88RT4<yi<Gs%w$sf)CvFfMyIHv6R z5w>sy0+2gb=d!oekB(Y=YC@p!2VNr92iuGZvvFNRla@Qf(Z3*kC6oovL6-&YHtFx~ zpdJ5C3^LzDHV1RHoNw^!J>MP+FoVF6D&TyZP|odn!rHj9*C0*0{j;$=lQ#cgPK~gJ zTF14HEJ0a;i}iuB$(J|a9X&(Uc2h3FsJwHPbf3lYcSRb5uNuD}?|<6!(J;oSpzTa0 z1jsfuo7ucQKhgk`wOggT<8TC|yB(E0U=+q9#~1(%@2{u1G!bUE*=9dQ-x;Q>=8r8* zDb3?YM0a?Ha^5%kt7DHOQcDEjxsJ!#5{9$mlKMvG5O*c~CdFA+gd9VGd88`YS)?~H znufn#q~AIoqg&SsmIRqZ5eWl5B@prEel~0IR<VI=iMCY<Yf1L430@c<n5`H=E@*c@ zY!>m3ND7F}vytv4&Sq?hq%XA23}M;Y$b2J?znL9*pJr3`=?5eOhAPtt5;IMlNdY!> zDnX`|pIbL1)rEK%cLzrv9V_IWR5ji%(MC9h78D+D@yg}BxFVcZy!u3*8l>-37$9`E zB=atLN(xJ=R0zce0oMUIvoB`&(BKUD{C*{qZ9^K>;H_TuBQDHlUQ|-I6l=Gq?8#F2 zq>3ZH42O{e+!_*-C(Sw_wLD+spm2s?vnMMSEk`6GM$Q}ty%wpn*GebSu+jE|W41tZ z%%!x>#T6NhXoBhQRt{c&I6xqlyelb)=9U1zxTPrJK~;$ShSW|p4;Z$h%Nhc$*L4aV zP;-_U8reXw5=rgoH}vpSBBIJBRAn#1q;{G5)W?Pq??h)@2t@OhmRK<Lb^a!kjRE%n zIvDqUlSrpe{;xZ*a6cm9+H`-^rXV&ZI0F8J=l2dQ2o?#`P%8;6p2b-x$^YFC55M6k zHxn?~b{4_&V+U3dNdgNZioft~F?t6UJ#CZ?<}J;}NP{a6e=#3p8SpxCd!ib>1FK|9 zd!6c5o+2JY<rOO;Za||XM>tdeI-C`C>#DR06_U(}>T^9@ML!Hic_@IoqBDg(*sz~Q zr~)HN$N7m`ebpoTD2u_W{`!;A*>Id4iu~#7gJl>i!Gr-Fx_{$}5qUt=Sobx2IKk-C zz=i3HxjD4j<a}yye0sEjqyA57lgG)|)VbbIM6a7J4wCn-$mIWfTnrtBxo^GbOJ#}P zf%OASe?E*WG8wHlEd}vaZ7c=<=-+;@B0owi>0`8qACAqv5-$IPOy(#+vm#4h2BOp? zPs5~k%5*fN34TTBiDL1Z+K6C#2y_(Yf!D(Yscn4`0BkBbAvY0d%iRx9M7nZFJtN9r z6#=n@TP0f`Q!k_)v4tZbvm}yv8Q+=F{D>O`KKJVv18vA$@LetLw79LfO-#b@X#{zi zpIchWp6bF@QNCd<YhK}zg<DHWjp2|&&YNLL!(2K{Ui-3oN3*b)rreWtz|RX0P$7}* z;&?e<@%yg#v1cV8hQKuSzVk{V#{bn*uF8$EMBe#|-`6~-`0MmbK}l!fKVcWM0^~`l zj>ErIg&LB?iPJI}9dY^1P)N@{bw<ylQjgg$MUxZerRUqxyVBhQUBigB^8N|Ehr95< z*@z5`NB{yL`|~z~PjCND5C7iiCa+Ys^ivu^i>L}=SK8_3M|8G>OGo^@t~Pq38yi9F zISzWGTOgm+{A{<#qH2na_xw5D-F&SW`CtYE8sP%%TumWK51LBb&I0}t+vfo>TjOs* z7M9nn$%-FVn3ku?Bsp#ARoMhK8O+?@)qnT=_56pKm^H&P1JvPj-qYR5)&K}Pky2Cs z6Xt(33g|@2d|&NP?UdrQ^ow=;-fX$q$?p4J=Z*1*N9zM(J-_m_26i(nKXaN@^Ua=4 zKK$sM=5pf{w^7(tPIK_h_ta9-;~zQAwZ&W+3FpB17Jp};$9LB+S3ym9nq18B@TXhm zH_$;%6rqx5+ACtAlL1Uz4z2~UF49So*Oc;Hi&zHltx~;l4mw->=$_~@qfyV#<mNo# zPlDa+Id%)jQULY+>j*rKofdyQZ>Uo@7aHrrY@k(KW`DPu;YX(7+1<Lo87t^1dh~{P z=bzFt^re1eRao4gh|?p-z?r9iefsnSv~23hI$*1E_37&f6HRP)qdNvthY>n?S-6Y$ zr+xqa^u)kgfGU9H|Mcl^`C_u(_)!&lk`frsc14(WgwWp#lIOaL_0Zo*l<yukYk5QS zs7D_cveuWxW>?zos*|UdD&ld8IlZ6qF%Ug&MeS#PmVx75-RQ#40Q$NE&sfghq~}W< zqS?B9@I5clnyNyi^L8mAAg-TJFF>%dt};k{8o>IjzalH)`leyiAT}F7|AcS;HI)a$ z4VSM|4VZYz4tDNwk4;jdNR2vn*vgi@ZRPwK9PUj^W0z6i6_S~JH$PUgu4Y|U?@2zL zpI7>7=48%ix$CvjJG)044&xr{2Jz|_Hz`L_oK)OXle|y%=HEIcir{>e_|OAVa@jZb zk~eKy?U$AR=RX<f+uiFVZhwA}hV^f$y8|hF)lGjt)gH&ImeJ@hUNL#iL~9!{`LD(? zvKWN#doK>U5N`IX_UBou8M?O+a5U;wRIJ^rt4K5%Eu~n#oF%$2OSS5*iDj+%_wSA} zFcm-zkoo<)1KUrL^TLJvn|)<*_y3W7Wm9qQB$}0SSQwWZt#O#E#8{~CMcW;iByB(; z+2HQdoL+Rizw0jd@ERa!aE)DQ!G~5Omc|pGe#_iaBa%D^ed%N5uH}hEH6>rqkek5P zF0+j}e&RLt&g5;$Y|U4%nQF>9n1Tv)OPa{#Xep+*fA*Fy94CB#p#}YE1W*F<{v$qt zGVZEi(-$_Q1y)N$0v!*tz!H{XK>-ks&omMrl5p;JD+WDEpvfD}#6EWfywj_9E5X<9 zpsUU!{Z!)JT|7}~xRQ*y_~P;L%@;hro~%}C@nr_%r5MCvM9DD!tOq5Yg{$Q`a?ZQp ziYx)bWT!Mb!r`yV%}p2IPk)G*KYn*6hh;IhZZCMA(Fde^;PZ4DdlHWO8+)UMt~2}I z&<a>Y&?qWt`_rmmng-y9DzV(;NQG$z@eny=c=HMbu=w!BDrE(dHcn<JO4@cUhe`!? znfl5uotgxly5?*B{Z-U}2*5Rf_^(IwYx)9VlT&BdT)hv;waiDipQO|W;C(6woe<I0 zJSP_7(f=`Yf$>(5yZ_Zy=aj90NRZ6E!@x7n#H<}&`*Fi(3WT#X(&fw!eY&*K7h9A1 zu9oCT{s<mnnRxikv8{SM<2J{}STd6lSIXhS#vuipkMHP~dO~MnlO+7f{)xQ$7=cM- z2l(c$|NR*FL{$>$iqwvMw&bLos?%bQUYwtbBSXong~ik(2>Cy<|M?g>IG;+K=C<_& z9o4-Y>O0(^QqlkBk0%_~6>-$jk+Y)vV@p&KKZ5-HwsF{{rz-xDHibVl5;U7jaDE#l zbMbw5Z`tUrku2)lMS;K3Yt)b^lP3#lfU!KjK)j|m5d%7re56K|?n7ayYvOnL7zX#D ze}&8Bk4=vr#(<R?5FSW)1IFSb5J|P{1Gbz@^#fx4)xIbLp8+U-=aPR9zaakK<0tt) z9Y0;buj7BzeTe=kfNFW^pApUdjO^#?SSX^kD#^fF5mODDBPt~eP2bJFEKN?)p=o%~ zz2ZHN0Q&8(dObcG>jt{L$2Tc+6(8PQg;xvARnPWGL|aGw$bn0Lw<=qoZ@qyN|KCv; z?c)C#bwPE6;F(f-%B!;+J>{v311+j7nkZzl=zH3B`XuGfuL&1j2s<J?*3kfMDwyNA z58jN$XPU0pJ?vhP36d{`_bOqgDxFR48B$(5>32YJ?(WClyJBSS>#y8fznvbi_6>e& zlKcMcVm%EGI9_LPU!jIEdE(LFYI$DBOd9)~aMv(-;hUN-z7!qv{~ye;MBi?XUzkIF zTDpMr#wGoIyf{s_s>5a_ok<~0W;na_Fo$gh%jlZjX@J8NJcv$03w^t}<SJ+-jF+x% zcP_Y_?AP&DIpzF3-foC#uPZoHIKTDTnwHHG$JOzwj1~Pn-b5AOjWWYu$D8IDf5&<E z(UUbg{PXL`Ujr+i>aa*QqAsWC{yVS&8!~hL;BU-n5Bz@P`-5K-5rm7J->$t!#g9#o z+1(2lUaJwK57#}Aw5fe*u&pqlO!8#H7BbN%Fat0F{T?LJ7R>wb>cY2uL|^zV7fp9G z_~2KJpuy+M=F-tWeAeWzFH!Eym<tFDBKZZxXL{Up&w`6MW812O9OI{871*NpB|n$3 zHx7q<h8Kf6?xG*lO*R%a;;?}Koc1|}Hoyyj`i<~^TJC*gNzG)M-z_)oZ<+=>`)A9I zpWx1i9R3xupZage-kK%51MiBa;igllyKD0!WN#rk#ywVa|DEE8o{GGQ6s*bfK>43~ zt0H<7t-hvbvZ%ZMR75E{WPjw={wQwGu+9SmHFgIE9ef*b>)(*QY?$gp8j%N4?S%Gn z89Bd0_U|`i10clKeR_`D6QyR=v1_&y2>XfqyR#ng>n15po+scN?$uA{4Fgde0u9aw zqeGPL<=FLgJKH6`p>EEP;hm*JY5pjU8<*RAhn*j@;?(KuUv5YH8j$IJZUL@rT_ODI zb1#fNEL_IN^?f3mR(b4K14F#l84(~wmlSBc4abmB@}yOqF&)L)1Aj(0T$TWaRZ#|r zoBUFM9$#VQ5?4LqmZsPwScgOmxCldpNv~}zhshrQXt}9ZBINPeT3ox8p~H{3`j5gq zu_L?(BzL;9a^QPl=o?QXH@vlY(^%@Y1oKQA%S8Lq&DChRP2;5plHj2nO}q>dq$JDY zCg)9*ruVWlpRzxpnC7MOPz<m(Ya<JjI)51+aMLzCHP%ukJl)GQiYO-0k7o;>9`=)_ zLEBWSwzi7OI?j2v(LOfYZL~5}xLw+CytVxnP1^31wNu!k^;V9e9kfkld*|JdBJbz- zqxbDTqkU{wr0t7sv@+z!yIZpoi`H8=a*KBBu1MSZ{SGu~`(@m2ukm!PXs_w~czX}+ zW8>RLVp7`gw_GVht>EiBXwvpJAKIq!!2aL^l~wUU2c7fIK_`<x-!El|>&nN*cSYJl zJNb_KL?^D4q4i?43GSydgw|W-DIb6NsKi-<CT*{O{xYI@rMKRF@c8SPu2sobv@-Ph z>x8jC|M4VRZ#|x}&MP^dwy*wtJmb)b&euPiXnYS_o2C6r#rVGxnyNrOfY5K)N9X7@ znSy|zoQFDH4jFBJB#Z)d(DL*T7+8)9%3MO3ond5x6nvTpJpm3-sxqWoJG<3$K`+w$ z!HRB{9KRF(Gd3vMpx)A2puEzs0g!Q_!t>F(dftdD>e+y5I1;bM?#?HPxx%Av*}{8K zma8h`OJ(|dRQVQ~3OkZ7ESB*xk4sxH>j|@Ke0e7}o1M{ZLlV5E%&>U-{qY#y=@fz> zoYiP!>HdLfECS1Evd>k-;>p_NL&Nj8qAeXiD^8zfPlSRIgJzw${j)H&_{p};b|%X> z#S}M=-8t*p%E!cTgTK*iDlUrCDC{Nt$MlfGf~WYr$5U06Rt(7E@lwMguV|r8{sVi@ z&8X%_)sa_|UVd6^oD5&&7IcPb|J5!`I;XwZ$^cyrLlBv}8ip|NG}}Zs>FI8b8J!fd z3TVI+H!+{yK9kz{6I?jah4qfaR!x?I%(qk4Fga5gTZ9&Mp!wa~!?DH@stgH6;c81K z=3)0(HrZkyKB>(KF?gkH5wGcIvl?#+tWEik1P(y|t^FE<@c&*T9{6jGcsHe>YP^e( zG1B+{H3p&Q%WCJpYsArG5NxkeRq!fD8!N}h5B+Bhf`bM67xvc}g#PWXyt*+QN}>xS zzl|k*H9~z}%#T!ls#AYAoeXMvhx2GY+G^*~A)89MmqiejL->nL^cwLW68I)13lEF| z?Z?yhYC?}eKpS?QdJD7eq&+DsQflVD7fHf*o)h3xmG(oOaz9+?7%7tFyVViNE*oop zDp$3Rq*=QHI$6=LD8Q3@J`i;!Ero09<Sj8u6A75(1Z7WgMhF%bhd!Yxl$u$Bxe~M= z&-y6>i#l4@G?4Cvv0S_d(B_IlIi^?$5xpsv?g_hZVth>wsuXEQV#|3GM9)KR7^1|H zU{1&+zR9Ld-4%|_o}X`;!&9xPtV}~~UN!<(@#9{L=O43POQ4X*$O<zktIZ`>bQsgq zC5aqr30I)8VNP&AKAVj~V1FASzCW9(BHY53m7m!>Yf3=*<+(K^{?&b38&_+~Lhf6N z3zKU}=^bZgx;NdBa8)-$v>z`U4-Isp&r#es>@E8h8ztTQt-<J-3=8b)(G@&9WjT-0 z#uDJQh^)NyC93v(t`d1KTm}dDidg{}8t4RCwmugLvt{s>uB`RkA#0u|N5fK;9Zki4 zCY~*&lyH3(#3+WX1kYJ7$;y{MLF7$6X4Ki|7R3EBANoq3o?!m!>DD`$mDA-4Sdjzo zcP*E|OhhnxO1{J3gBup;CF@EQ%E{J>ONYGzc6Zy8w7-xA=7oK6Tu2-QDgzxZ47cxA zO@-J$3&Fkq703b#A0cBA#I+q5y{qAImoA^Ja05NRA*)h+Yc@!Qj?SF#L2wF|5S;XO zb?Bme<*2sf&6nn8L=w(YG5|(?S`>MpB32zWo>Uao2Ch`ZPH`55Bjw9G+!sL$f>nUH zac@FsIJP&5jDA(#%uZqog#SI;;}P14jk(B?e=uzaRNqp5@Z`*&EmV`5o^-q;dS>lZ z#FHA$|7|GE`$<D2L`>#H?q%_f1PT7er)!_EwBCG7#G!$mvUz_hhI!qXp#IW~>-)fG zI<mZkTHIL)+ruizCl5<DKI3&m6}-}1Qtcm1{mPLwC@9^O5&|Uh1(ALKkja-p=whAa zIb9~-ZZG7yNV@lmDn#qBtGvOBirKg@3*2jM-sl-U#3C8#MLwM^^P-`RRO;Kj(#CuG zZnZF%)pwetNQ^Mzs&@bMDTNUf+dCj5?o&XeHQt5ZAx5{c7Y;B31KJZU$A0axa2_%Q z>#;BZw7Uo7J7D}WKM|QP(H%?)U)F#g6FlPY(W;s3yy0NNWyKdn*^G>@8@m7D#<3O4 z%7QTtjxb(-{IU-KU1xDSGEtP;I0%L;4(zWcrYVGh#&3?@v~LULt&;bsQ#K{za`Hh0 zX3^jMVisR9nZQ5ZZfoQd$XYk~K}g+?F2IG1W~`>e*g90J8;K>mc6vtvYnf7FDxN2f zn*omR7!KR_HAlippqONCmfG2h@SH5AF7KBCQQ72N%5ASKA|0`~y}ayo8s;1_ggLwP ztwIh4=%6DCd#qU&2q3Cg_db&a|I?eQ$xyMpO|loaZI(-(d_-Ed3prP}X7R?j4hC^_ zGFJ{+F<s}WuEjbu07h8yO8`aUWfYRAwIBntS~WbdR{B64x@8_bW+!oY6gG3G*rWs^ z1t=u?95xJCLHOvem<fNT%d{x|NcK{X{Fcs0pSrbHZ=qJnv)tgqOJks>H_L~@yLLSS zq1qT4HCkFE?=g9pPVYQ&VKETP*w9%Iq7B)K5~k-*(8hr`D#6}}i}7ssn)@{-w(Lhp z>gW&l*t8{OMlqor^nyc}h@H;KMSapkZgfErCPVjho#*n@^YO>?O~q{9yHDSVSG;4G zoA<u-Gae4pQ!X=<quRA9WQq9h!JT_>mIU|nVuxUM((aogiP0D!s>`k5WfiuU*qING zXGN8Fbcd7k+;-se7(`zmZe*bmWL>j>nhy*h{|0Nb*oV$S4@9ay0rSmA$;)EDu*AZr zfb6gG@TFLKRH`%EDHc>9wN)p`L<~0LjLiw=NLGt)`q@s`GK+a&j=r;_T7%YZ%0%Xr z{^5iPk0&E&X}MY`yNol<Yldoj%9ipIT8O=lAbQ;ml+8sYZzX)FTJ@J|I3FRs1nFM{ z2dIIy8kE{7cxpPc2Tr?(xOcs9&U6}m9ef~9l!zr`vMfKV-W73IQ+s^6NWiqhNdGR} zw<aUW1aS)`j8BDd&)_SjU515xReMbRx-SY}zPos}^_t-PG&_0|_dozPxBR}i$qhuc z@NloA{9U(2jm-dyae5JsUiY=#%+KyQi~a$DxFAMjMNnsWh%_YheH#4D;6FpQ7MNXD zsn2Y#26a5dN?C!4rr&ua3N0c9S2r+JyS@xf&E|Au-6{;f?T9bpBl_7SnPP?UA8Zz` z=OYs5=q2DFSPQ@hPVK<hlG@5p<%+mjr+1<;$e;1N<ne_!7@m3UgMKtW(*Xz<Ff*in z|9W{`|BkZK2wjsdbqlvJQw$mI$V9~P^KSdcT}`*>Jl)@o2;8Azo&<=<FgYW!N|_%F z%y8U6-I?;vcyX9|Dgk;ld6Q21Df_1m<~5R2PX-KiM|r{X^_M1u{^gGjJkOUmj^aB% zqO_K0^B?Bp?Ml4XQ-5A<Zj82I0NhO(j!t0XE0odSqCC})>v2=clLXx40K6|O?_Yd= zd?123|IVitMY9ua_dTR{;G{O$ppSm-3&-sn46WN9(heF8dUc|n*yi+RE`#3}XJ$@% z%vSeCh#IEtM9z44E|07?2L?PMcL$1w5A*Zz*EmyOe5S$N%Eh7Iu#!z4?raJw7?int zU*mDhKZnOBS&jRYW-k{$X`FQJ;qHm;eXFFMKmAP8^o7{_D<1q)=Gb7<amnBX#xvCS zd16`AX{X@jVHE0oO+)tE#M{f`cc_cqH?rsJf~apJsPAF_AOT<AzQ%?!VO++&hAfaw ztc#ylzs7Yz;Kw7tH3*_f1j#9ajLMT7=1HOJN#){66Yoh^<H<1T$#m+8ql-YV5jXW> zlx2C!0q0M`CM~n_f>L=4!@NatCAk9V6Z{QGwSKP=cku#+dl9n$k)Fy7YhHttKB|*G z>Zd-M`PA1pC?U5k$w+^#5jQafo{0F8O}td;@-<gtaJlbijq5w}RN5GqP0{+6@`jhp zZJ<pJKZ^tB^LT%^F8=EqOcGqc`==y=HU2->i0=;j5g)?nm?Xd`2j74nYs8~r96?-` z&Qt-IH9j#v)`<7L$K)@^)G5Pchd%Jw@N?GYf65h*uH>gPM3w`?dUp_11v86<Q)hj- zYpkoTbQ<8*6<FQn9Sx^m5fAC=qDC*}ZePO4NvF;0QZ3N+L1qM&TD#K^k<o{TYK~(V z!uaUn_;qsr-MV3XaB7|*y7fuwrExm+PHc_w;P`y+7A5MLShi9m?O8ly@t9#H7qyiO zL+ZiPel2#<@n@?pE_@`RQRU$=i{VK^!02-9Pm}0>f|($M>x=}hbTP_3CpbH>&dzY8 zt<<U>rM)W_Y8(+*j2kkc#Bp|NjKQkixTu`^F(MYV7@Cj~72gsS*%BJ<iGk{(hDiW! z)>899qobLD+c0X?htwLi(P|0Q7*p6P1=NDbr%~m&PD~(pE#r;?STvW`%>3S9R5)%f zCJ2e8wuuq77#rtl&jyIg!iZBt*c$~h*FgcGBRb~0G_S73yWgWGtfKX1dh>eH>nn^y z9SM$J#4Lh~z0$@u(WJf>NS&%c&E`jau&*AcO!yrN;J2hMcL<3x!2ppYK2WB1oubx; z0v<4dB0ZxNB&eOzLo3gyXE!kSVw299<qwf`#nDzEXmW;@QkMk4SDv~zF!oh@NQ@Tn z^CX!x6!5H;nujUr;}qG@6d6G+Ms!O!KMEuDb3`b590hxLD*I4kk6c&}6mYN)E?~l2 zMABtBME-x=-DN<OTi-wWfuTDT7;*?H0qK?o0g;lH4yC0_)S<h(yBnnuhHfMj>Fy3i zLE>ECc5nCnJoo>c^YR?u`i?bgT`PXy&yUqU<8^j4<B@->o8R`kh-MX(47$*G{G<eG ztCHvx5hl`yaPX8l!rKvo*O3s|2tiE{b{c-9s0D<s(h>|!X|aINvd2ZMge3IE5^Tkm z3V?(U!HW=qNLr%hwy?uV+(8(o_hCW{!ZS2?GSTf+nentl>h##EY;a_FG(M7SaBf0Y zZY)A}bX7Ll2&$!WS^~9g1eCH6o)C?XJERhATui>IoY?G@7$F&vGD*Peo^Lvp8k?0l z+n$~!o||@rrNIsfTEx8T0WmaWh!2WQ<Vbsg26pStiuEcS7l7<tyCM2iqD)&rsCv+r z5h4ztkgE}L@oh3Y=G>l~o5rvC69n{`@zfaUxl6e|XUVJxd7+IEXDFB?6QT^X8Gs{~ zOp!faB^UM}Q>4xRFim!W&do9zj1*``TtgOvSK7D5c2NyEgrZMv`aSW5WEVo7k7Thf zfl`lbW2uotN01Z`V@mrGo%+LLtMb%Ak@3`d@mVOMu;ipHB+p26ZM&p?g#3?HMVTt` z>MKRXQUO6QXl`<eR0D*<uprh*wB8GW?~weP7-gG0sW($%j8T4O8*02bW`KZi5|JC* z4=iwITs=o}jD18}6$ZC}<}8198ba(N<&X_QP<}Ue;<YklsuxY(uoxyt`oj`J$^LF% zo|H(rY{(vmG`lJ@Ds_k%l6DU1)qq^0RT^i%+p$bz6)ysd6*y&*Gh!mfMWLp0lz<J9 z*;2@S?bMozsZ<`v_j8n96(!<QR~yr0PPbP!P-myA$jcs98{JRW|AB^d{+^Yiazzld zs)d&80eQVmMy{D6UIRG}E*UaHFU+kl>8r@dYRKe3Q+rGwWCzhW1dHyF%X-vCx0Qh_ zL)fMXP6gjJMHOXbVtp2au-K*b9hEfV*N~Kunah_t%-}_j<~JH;CgY=vTGo9BXMv#= ztVX#xg%B)eh?ia3@%ymEteUteWMRX~0gmL#>-&&ndF1FLFsm23#^Q%24)#Jk>~XyG z!kLQrwua=a_it!SGD65^3yWh^8vBikS!DtSNNS_;)s8Loqs42Zt0JjKk_!Tx(yOqc z0-z$0NwXz{Fa**{3ZQES5Kl6@rr@^w%?OSdj3w0TV)bw1#NXk!re@U(ok2z#3S*br z8xWAnio?K}1abHcU}$aeK;zK;IP7TxR$<akXgnB-F+W0H4iamyw^Mr;0g`GxD`Abv zL?MYz@PQYXdq9RmAOL^^u0)XU?*PM4$hApjg+Tj@ID=l9RJ#zOXAnnW(pJpskfc)9 zQ52s|8mAJfr2(?^8syY0^i^4~=rz`do+cEM?ASoNnn2Rn6nvC-pAd|Ys9Cd6I2T*f zs<2t{ag&OR`ioQ1J-T{KI^?q9iAH@IpxBrT$QSg8W&556qk)X5Xv&>{OLt$|LA*Gl zuB5i&CTc8U`Q~h+R2oN&Cd-y0q9V#*vTY%HBTtBlHPYR!zI24zXpXjI=D}Qq;b^1Q zLIrvs>)1tsxbaf*Lef}HIAUH2oZ_&nQ5=`m3*)^)etjq%1t#lwd{FDftF0V5>l~$J z^1(+j2|J<nPQCqnQxG!tl9AH>=B1I9K16*B$X+Sp1{Nv45a``VUY|Y2Pu*c9lqjL3 zVHQCU#w#+mnPFv%a?zA9tm{FtmImyNObpf|Fhv^VT!4jIx0H>kxjTe<ps1ZAdx+$C z7#~|8QM^{a9)ZFxn4%JamNYJj`ZE}sK3n)HD{E*YIsKzNWU((+{}OWb>P84+9qpqJ z3&ecL$$vH)ZG_0GC+%LEkK`6&W!^~}+`T3~iX@qPDhz=_CtqUw+0KzaOe4p;_)LUc z*J52tmpZvx)ji}j**rQKZ~rC!aw^VYvU#)02yG<xp<Ct?pN*vHQX3|E9ToApXrakz z`rclk@zgW7pdj~Y#ITu`%bCpA6T381cKn~<x}V^$Usa{f4%$#A4>32U<xgl$4L$UU z(3_i_b8mc7TFn|Tb$vOvNHKqjKWALuv;2B~Gi|<IetHarJjP}gUOIpLaN+AEWYuQ+ zaBk+?hlLBhg_)sf1U-Svhl@xe3+U`1^vFewmPPEvw>bNYU^ob$jsAjR$%bKx$QA<8 zUnHMj$~?k>?&Ivjadu!ht5BR-IQADi?6E_v_7Th`G0bu(qI{hbFVJ%7jnl;u?&~Bc z)+1b-7b^)_E0p@HGU*WL6%LK!GW`|DlpXfOA=cpGa+5M<1sp*jeNEuas_y)nMDprm z{pD4-q>?T682eg_@>+%1iq8DH)c%?s<whpjIxX9}DbCspHY^L<HLd-18@3G?<z}?( zhJwiYqVl@?b<2j8{>qz{HSep<Nc{j`+l_$m4fFDK;7<`wxs^J<rNX~O|7PR)n=Osu z_2lrC^z`jw9N$da%|OL%%{SXAE!*$)ckWGYXQyvk+HP03IMrV5z;Qh5^|x}$HxlP} z_$YV#TXv24b}MXm^M*HjMOaEf7@3ingXw$Iij>2)TO*V^z56>Qh_~2~-M%phBc)+) zcYeQdbg!#?vsq*>AsW-eZeJ?$K<W@lB@=aWe;-73NJY8qOu5}zzT-)`zii9&%NxSW zK*Y_s@rDrJ9+5;q4#N*a=GV7Cm>y6R8qs4qgJb%)$BY@r%&o`wGY$wI91&(9o?WNk zXhXbjPxv!V1Y1ukDlx|@aUfJ*VJ%0M>08=3m`-;4@~vML7QQN8e^sXXruyL9naB~x z^&#N{lnyA4?!q_y>u-isr++CzBMA~2r!tCP7eo&DL~uRukcGsMIK+?~4Zgd+{O(lo z-L3VzJJ8dI>c?x*AD#w3U`jvUQh_zEk8!EMTzJT7>^R1vXR!<42BFwu<)_IDOV$;e zG7&3Vl?M+*&$V!mG?dQsBhEuJ&PyWB3l`1`uFvxh&O;9n*$$D}4w3xrmg5$F8omV> zpwkr5i;KClCbm8PH~S@2KZ`zI3@==av|fySyr{(e$?@Q_mI~Z(h^%rAw3&wgY@xb> z0~tz#t7DrB^o4b7gG+qTpLt4`rBs&(RF_8vm-`D>Kd!F;(`eET3v`tCl-F(<i&834 zc}c>4F!z!SPi0vu_%5q{XQIlAOgP2EH%JiGRoUo!PttGNh|9;b>b3Yno~|n-^VrNI zohcRoeE}x2Xi;%=Ypo`7ISALSG|Mz;)-QcX)h!D+gaWm?Jk+f;%Ab93LH?<3tyTTZ zHP_Bd!zP%7u~I-Fet@*j8*7iVxjS^C(VhSD3YlE%(6HSPn@T2C>&Un}jA7feXPiMf zODc>;y+77RZCJUg?fiHZJ!&*hE`v9X^qb}9GVN9uij>~n_m<b=jpiwA;`p`|8f6Y^ z+n?>0yTYg#S{_de28O4J22kpqJ8ge1Gw4ZAqcQCh^}%8F;0B;*C80-862hlFPQepR z1t<nrug;HlKGtPWU0?mY{MK{5Tsos_i0S8qA`3^iMbp`!h{+sdlR#(4t(3rg(8(@| zT{lz2aKMa-%XQ2v^nm$9-WN^c?o(5H*j+vABWZ|9F1`$zrf*=}18d3qb%6xr7^x_H zbk(x75mKCT_YzE_g>ad`2h~T34j9t+soxK`Az(plc*hpC0uVSLg*3g+lSZ6Rc)pmv zd&0NiOGwMW@N<~+i1U?S=Y5sV@&}fYQ`IqnT4x1b=vX#l*BD%*q3={4QTcJJ$}xml z4CCfB$22p4XW?iEql%%7Agm`D!c-X&#YU}sKSir*8u;;OXur5OrpmZ?M}<rAtkf>; z#Z?1T%jm&o`=Ew}G_ST<f?4fUf^`{JC)2>pw`R<|qyVr@-RD{@+d-oZtrtD_>U14H zI^Wg7%j<ml(K4^`P?JCycnBhR6Shs^G_qC)ywD?)NIG*2#Z9{|b&Vhqo-TIyiYGRh z#y(BQe>4kw(9LfW#+Pqls9WIteQ}+wGz-fiu_z18-ZyHU)M11?$t3ATe#7$=+G8yp zVZOTp>lh`y{&#Hq3zuTmJGzda=OsLE+%j`~?%J82)97*ydTu$Dm!R&=*g<YPVJ~Q1 z)k9CFSjd%kEEUCyB$TaR4uO#~crUJ#$_#W1z5MV!{BYM>Qe;xX1&siO+@Ta-CQ+{x zl4;XI6(H=;hkEi#C;dzQA=PVCyaEP$lpke8cJoK>4&zFX9)62te(AcM%M?0Dkv1uy zOKP{T@z8b7^<$dzlg~KK?I-i-ngwI-k3`(pI!^U8zl5w>yKfZ~q_3}I?>Bht)orxA ziZ4gK&^zd1X!Sgy+KC)?9_^+)Iavr0y_#!ty>vS}=n;KeRnaQ!c6p6z2znvYx`93d zLzP-=_<<^XbZ^89*B4rf#$SV`G2%^ZJ&uSOD30SYa_vK$Y<McdFF_EmEJ&K0iLPER zL8Qv|I^kSvhj&tfbYjGR;nh-^(`gfAek4E?X<0^Mvjs{t8YnK6g%(jSMPF+dcx7dL zCvUQij=(-xv(p$cV-n5+w9dIMp}Et_FT)xCGUPL}3F+tF59|*1VK04GE*wb83I!hc z*>{>yGJKKY-X4v3J2(SzMV6Hys<!YX&!xWGARCSz{WR3ql<wNE_mTWqbb?bn?RQ@} zMHdH+*x6hLX#sgzi(~m*DKlm+{+@4lOW)e6nX#B@-`60(GX0if#^#LPuG1YE;5uu@ z?x#)hRL3H*M{3<s%)Q@~cRUHm)>WhnJh7ZNP3pcbea>5RR;s^05-vacoWDyh+DhIr zbwjEEuSvT{c!@LZz?UI_=7dhL`XKIg=nIi?$dKaJc*Y9L3(;$V5$oe|9VF>ZZm`FQ zFYlcsl)X^NdxC?0GEUjVL-(X|0#w3_tFy`W%w?sERD6Rz<tAR3%PBRg%0|apviNP$ zJUt&voVXLo_B!o}GiguKx>JGZ6I#VRRJH8qRRxl)mZ~|7YI(e$3wPc#fRDD+iaDc- z)VsFvBa+q2Y4D5RI=;~C(&;D*|6Iz_ysiCNzP-BqbD7%3HtVY&8jTW_WzJnC;PGV5 z7ShA=*T|(;r=(i#{Rb6((xqo8DO%kg2bE!d*4N*N$h7;}4yxk1O362hM4t8IB_<)4 z?X!{TjLF+p=SlCa$fW2@#P7W?^V_>xZsaPW=d7)}H)CbrG?QEwU)MU9XzL|38*&z3 z-?Nus7uBTe2uW!8XcO;{B{XL$kkI%gEY7K_Nl#uop=sfDtV^4a{=1>mghjfS9<=xL zzty_R%{#yJjOf%qo6wXzta<r{Rm$M<wC?5llNsGhAww^O`ZPp(J8uSG17tp}Bov$l zH40&)UG~IwViByj9L+|=wnYB())^!M!p7a^iJc7PL4GRD%ktv<r7ZqchHB&{q&c0P zJlz}u*q%x=>ytgKr<FKUkR{6N$zFaehlhIC+B5Q$Q+>=0M=^P!Ep&Bb4hlGHu{A8w zj4#jnxK57~^g<We6SULk@Ez3pte^9`CJhOooTMxXuYc@68?vwE3Y$xPL9&wck!AiQ zLuL1ccn1H7A0<Z?{?L--1JaIQm#=<g6kF($$zwR_U-Rx-TRdUlA5WuXFA(2bP>RrL z&E|D}^Ehq$JUjXGvEH|mxgAUGI=+b-#Rp~fPv)N;kTy4-esg_AvAc(uGC4_cT2*9a zZKlLGHS~t<UDnX-3nj9KvD#DnlC-@g<CGcr+-aTrj*a~R@9bI&Yr`nTjAKPp&9)1l z)eObUPwgr5d1>E2NLsyo?Zdlp+0D|5pg(o}7FW0$k&oXLGu^J6CUq%D??(sbj$IHT z@A6$#mM)I@FCj05D@ecd>kCmjG<v75zN9$o`(o)3SHiQ#%6EUjNMs`6V{-{-oq(oQ zx?|~b>W2E<*~heP$1FacO=%_O(J1{-IS(ib<z3H}QYf9%B+|Bd)6PGeSUQ(=aPR0D zFnwuzGgc9ymut-TN_HUKB|JNAk3{e148yid!(;A!=a-CgN9iL?2Wgoe-+zkzq;z|W zn0|OpezCM-;nvl`briO+5neT@(93sv6o*>4`X%%%VjS`z6_;g2oN9O=q9rrA;@#HC zHqOMWUh-8uRDL2SY>U7G;-*Z$`}`ot{CA4^@6DPIjkFiizVy5~op3`@wN(lczMMa6 z{pk2-nVs5Ap7B<0_z6NqBL@T*9w3B*ovCrS(CYPzA~0@zf=?+c7HR*q(H-Z0Fu4W( zWDF`Q4hcW>u#M1gQX)E4F8bC9z?&2R%J2ny$whMIoQ!?Zgd9%?<qTnuRdce#ndQ}? zis_G?&$$g@DVnzGCG_6}@Hfg$3_8Mh@9k!Q(!j~V)=pTdnl;=t{biGA&uW|89z}-< z5vbL?_mT_G>#dnKf(Ow?d&|N>v(-$Q@?ls<HyIXa_GFQ>;W$IXJUT_cdv=>Hlk6jf zw&3KE3EFX^0c3_ec`rK$qsOjfuC~^_f^A-0Vm}@wbvqVF%1}(T`<Ld7W0j>n7yBpb zB>?<ABoQfo7iI-wld(wp8{Q?qDcgPv{5_oh>c?R@+Y2;(`ggt)!l@@{-5}=G?>Dq2 z6GW)3^9NglU!aoqPrfrp9yw`PEtXL!U6&_rKVK#AiMF&m-Vz)EjEW~4h&ZsLnfml^ z@+u}@D4*dzK8;YI`K1HvoN&lXM`r2UG-o8ba5$cid3UGXiRE8q+dO}3SgE%f7Q%tC zXy?UCi;#DbR6F#rctu*(9Dux1Z00{2xoIQ-yrB1RC>a-~hYLF2;V;p(aQ${mUbQk@ zKRnc`K06M7wz}MX8zNs2%22u~230lb6dTHD3~607C4}-V2AbR?y4*75r_fAcVjI$0 z`aqzQ5O_ha4fw=1NbbLIlg`Q3%{%+DV8PY7IKXkD>xk`z(VYl=9KFR03**JX0|K3< zn<k#Lw;=?2zBI{v&<QU8gcdj_l(YQPVi<vZAc%bGqA<^2+GPvKcUH%?gRXeEDH!1O zCP@5a&05e{4o<fm8GMqlm3UGAqK$OVQww}c)8r{CmX_QYc=8hwbOvu(^@bD>Zly7G zx(JPPa7N<u;w@dFLBs5~Op0JEq1)ilM18|%DE$)w5C#hWwZ}Y(f2#3pSv^WY43OY_ zI+K5s@03@nuk5hM$gk`mF3~+!D$4gh>1Up@Cr)=;E{c^XRVR%^<e6;d!nIlT=Gg^G zg{+7<4R#MLEDfM0;oN_bSG0?Q2eD-M@(1;w<ggl~NhBHcj8+dSwt0b4A;F;&9Nr#J zFYC8lp5o&`*b?X(Ld6G_hAkd8v3Jma@WJA=gBlX)XqH<iwXaFslnT}PVsrXm+>%!( zV}fJNTy3MW5uQ)_F4;<>`+pHOrK#+X-mjGcr9wj75sy{K#^gRfz-Gr492<0Oo3?Va z6DOuixp+Cjboc#n|Kb~8?Jq!xJnY@$Mb%sAO7fGCIgkrq4l$_YpS^*u#;-j5s}~Yq zwD2rb+@!(jB1ewI0+mGg8j=gj&$m_VMgF5EU(uQ&W#Ie(j;a*B^G~(6O*GdTsNg=z zWox_U%gb+f8}xsd=(Aili;a$l0iq2!qW)h^NjeV1))?Xe(Z=cuXLN6;i^oG8hXKip z><h`lS4)$Y8_`ApAg_?<{_b0->MVNfmFI<rm4!C$SC3fbLotw}!3yVi2b?WgX+yKH zeD0FD*3<It)@O3Vv*5(ucK%{m#u+4ZBq>B5hXE1_*#sQw@9qg61*P;W$o-iM<pdTB z`G3OTe=VME*&2r#9RXlk`TtWGT%a2I7pBL)+>wH(U9M2a)DA{R^R$)c!`%@5*J2@^ z{P$upoIjfSlrJBAy4nUHc*B$=he#y6IYxgk7HNMj7GaxTD%??3O^jhc^gEJ5GT#Tw zetF<mxy^~RwTJPbY*f1+=9rMnh5IX#4N#>EtyJJeeJwCdvSHIhuj)1y;6A`&k-Cz| zz@bne`)1k+SR+guJfwld(oV%8DZBEsYB2<Gt>ZPB(i_jClg;rGg9kh^p=0^2%`dNr zQ|oUk$3MPJs5LzV^VAM-tVPvnKWHcKn!jyCCMz^Jl8VW(dW?*JGQ{q~J~>&p5O6UH z^e10@D5FB#1A7YP!@W%`IcVrufa?Q>IF6b4V1Oh6UXJ+Q=Zqb6?arriV?Y>(D%|*Z zkMr2!7ChOoA#9>-=u$WZBD$&WmrxRXggaiUL%}Q(Me9KPQ#&daJSa<zu|;PG4)41~ zuiVb^bg!m}G7&zfHsn6ftuNZl4o$wZWHB(BB!(zfNuYzZ=(M#Fp@J<C37Wk-m4?8y zIYIU^=>yH6;0gClU7^PHS3tgsCGyFQLF5=DHYi>0cbY_gH3ypTi^IhC5~Lp?Y-k?W zDFx~ZZS;FRsh7&O*fVXwjq8ZRg2S~aQT0X?v52N~UI_r}pvAif)D;eV5<ZyyA)UL$ zoq2$SEsLPYyHHJAE?E(EUtRD)Tb727)lh7B)3FRtSIBDQ6G|;5yZ8|as4G0+S@0J+ zgd0(ZDlpi=M}s<~8)S}vy28*=VS1nFVdT53x^2kBPDd|$?ZS2))R3u7-j8BE6n;Ob zz=!Q9{%MsH7gbI3NzF%KmWTHuVSae8RwfA46)Ls@U>`X07Jh)8iXCLW`zE!*_L^|Y zZKKRp)jp@+=0AhqLQbx%U*{tqv7J47jjJpPS!I7JiNB0SJH)d(IQK&(Ldo`gs}NJo z{de#iv3m2)=S%DD`i*ke*?$GUvFnMZ-X!i1@_qa&wDWcNkKp%S4zXv`$zlNRfzU39 z<)08D_VHc!vdkY}zg%0+o>p}zZU8Y5O#aX&*{xkboT#?2-?!^oo{SQ)fcd<tAxlDF zkZl9o+So(SlAr!Ly_taN{q*nYedqUH;GzfE3;eY=`fvOtQV=V}edSCCRwr4<yeDD) zI?zBo1o04=1M`Vyx!+BN0RHl6L}sUyyM#Ixql*NYh<YD$zYp5Y)(R#jaYswL#`ZRl zcw;?0OnQu~PU99N9K;FL)Twdg%Z`MKfxJ49upR~CbK5N5CUt=b7yN;eZti5Ngkvy+ z!PV6}g(|<v4*#cwB##U5i&QF2I_QBw;vP^<hYN2KkO>`5IilzMRt)HN6}D7jY4r_D zovaS_DT=Qf_je}WSuLa!RJ<VOXtBF?;eh%j8Z86%meS8@F)%n)hzbgQgDJUKyi@TZ zWJ-AdwtpS|US`ts8}I?Y75xqXK9n+K@z;G$AbpJ_bqDyyZ`M(H-3Ah^EHo(H6`(np zFVh|x1qu+BYi4=+OZx)fcsDJIpxZzqO&&Bd5;3n3fzu#!5x^ay329&Dnn^B5K_mdF zl483TJ5twW>t4btz5whw6TPw&n?Wag2Voj)Wi_ULG;uN(EDV=_qch>spWu1A^+HC- zT85qzoldNSLr#VxG{v^toD2h{w<!6Brwq2P9$m-a+6+D2D9AjP>r8~lX%`ZjZzJ?G zmqT62ZJDI5nF|n@lzoPTPE7A^17*X^#L+1Ek;Y)GJFhlx4F`jo4>5{@X`S#?%Nv&A zUCT|`upHB*b}%6~)E2A?1GJ+Z!!@mUy-+YJA^=31G=**T?*V1Q_s4`jDVy{XDkyWc z!I2VPVK;umaGnv`yA1-r7lN6eYXD`#cZax?nr`@p9;m^HA7EKLdnUeDYjwYiq;9vm z3mG8>2bKGa!b$JV$GKh7eq(Du4E6Pa@TM>q2<Q`Lh=~4?o%={=bNAw;6NY|MHvAE} zX7oQ&lLv<v$`dzb!>Z5zW5UWte%POZp|ZKj+5fH4q5iZvSiG6u(#nsyKwLGuV*||M zu|_z2JB51RR&x_XehBSo{V`d?Rxna*f9~0|b__SP*Z)=;vQk2S9`!b1@$fHKb|}u@ z#I-=#LTNyAik*~Nq5a$;9Dxa0FwWk?7cZ~QX1CK%h4A8DYX5nFxtXL!w+EPSzyapQ zsO8ZDV*%gbKP)xrkXx<E2;L27O?tORZO|6%q5I+?+zV9+W+Vi}>4yS7C6Yj)hEOF$ zq)lj(-1|*wdVCtR3#LT|ghZJfdFMbl9E6DfinLO&#!9VJAxWR7awqZ2JK9(1KV6+I z#_NpSc?D5$%JhmHs?3@O5*U?~Kc8cy2RbiLSbCv;zsIBOjf8-*C{J$)MK<YjH9&vH z;9$r`W4j{K#{*-1-gd1@rC{&ufT8h8G2<!$=NTJ6A})y?Is<X7Q?=Q6w}0t4h(FCU z0E@DDNz4?>iz`DUlgqj5&)6X|@Rv~id$}S%yrpRf0spF!y2EL!u#M9cjff`@=YOhl zxBgXLw-1`$bKgK#Vn*eLN~2ggJbHz6%yFCGLor0e?3A$~FtA+x?tx}0lYx@=7uc!y zBrhiDuGRQ&<Z9*?xq4pns|VWLt2*n!cRgP{?@5@V;#V4!Gns9DXLxF<fQ1Lx1wfN_ zr^utZUy0KaUN)e$u0{Oh*UrQ!8b3_pGS}T7k_q<+DHLosy33mQ4i=hxeiGr#y85EU zGu^KsPf**u@vkx{bwa-Z%auVv&Ids21;F_0AcUsooi8ejrO|8hYY0dOD;*gRT175@ zo}R2cGK9mAfmT+J=6<!?q<@`vqxJsiB-R%IdZ1x;<M~*TByS)ZEvCkXiJ@YR7(Anm zH>U}*{g$vCd_Q}0IVf8FbioXP0C;9byP;`>Wi(0fIW9;#K>o<ubdiiwURb{3yy&Yj ziZbZ;Vuc1Xjr_}QcQ;OM1ZL>?>?39-`t&9aFY@KIlb@F}!9(p7Cwe*bPt5_XcO5;} z3JjlkVYP-0TXJV&?CU2cLJVGu3&m;N%&EL#ftg0lEm9Npi!JhB+Ij%~m1p5bVJ^_X zOOg#OwpdInA6n?o!G7%(it;$yFfZGuJ^p_Ay7+W4lU}-0SR#dce^C{;i$^IaQ_XQ3 zNI4ATl$5kIT2+wrCyU`XK+mUhn)GLqv%|JA01C7)ce!yFqw_Z9@G`XfR5R?|*iFh| z<kEby_3Hc?9pNXsNWjVQ^g=YMM&CVb1r4}ZH2`$5VkMKD9Sn*5<t#@Jsn4!`FI9rV zaUX4g0_<%%X{5K~MK_RgaDK=ECk$8%JsB1}7)0VlVOW%6^C0g&F_fh$dygp;8M20B zFtRNFiiz6f@03Fs55@~N%_(3nC3ym*99Ri?Zc`36w2oN3*zAUU*d43JJhM0c)hbSC z%PBJF^9pVq4KeB1#~4NiH)K{J>)C2-fRmf}$>7Ni)j0y+$Z&0Y!n>H5qqbg{Bci-s z((3c1T@g5G5ew8for%8qjMVeY7ErVlP1M;g4m%fYN7ly%x!R5gT@i+P7J)TOcFPdh ze)*ay0s5BM``EoOarK9sX>f!`4Dh!~7w5YLHW#A3A068+PBfLhPI4=r{&;jECe=cn zwkh@9Qj(}us_U&*lkDMi4;-a?*X3vhhQz=qzG2@%zB`%m2r7YXtqg`(KMp|g@@{G> z{OHA~koCTLImS<Tg^KPFhN>XuJ&bMY2vGyH-d;)Js*wjNud>jG6)I6h5)JVN>w$(- zM_Bf$`G9|weJAInqZ-K`#KQ;{NL2Bm36vxmt49%V;P2v0J_>zJ{p1HfAB@@5=gusn zB(@^LL(c4@aJNBPrDAg;Cs`BFU||=VM^!L1wvBvtB!iN;uU976H-c5Shbrlh&hbW% z9(f$cWH!%%CdCE+Mu!1|i;*C<GIWjR0UvA#Fu2BkE;DPWVA_Q$$HTGc?^sxny4H7a z?~3JdXMcZeBzTe}<b)+TAJxVn!T<&Rb35~2b1VP#KXidb5&Gw%xF~8pi9!OX<V*1X zBenT7p4*N6b`K|@);IQ##nt}@wHd=4)=LnZh@g}W2wph%ZY?f6^F<IMx{4ty#pA!I zP4xlJg!DpiVDD=JX{GWQ78O}Ms38c!3lU8!aLKW3spBSwUpkqo?qiUSB}>ij7jlOw z-BX~?Hz=G473&A~ET5gGV3;h&FKV-rLF5Tjel1Buj7eu^sJ1Q5(|aEP#FLoD3*Pf= zHtd&B?A87dqP}nD#ldURk}5IC9{Hu-|C(3q&9Xfrk`4(Xu><it_t6`nxOMl&>zXC5 zH!*yBb%l%uefwjJxWg>rVOu}(4;x}&4;QF5YfnT$3~b*%0gWNaU9{rOW^DN2&T-VT z+Cfkp)2ToPMP59@UY5cXvm38VcH^7+s684yDlFg@m7w-A&yI>|z{B^J!;zv1Ve>}& z$Lms*ow~yZ3%{dnF6%E9Z?T>vNeQ8OE>qjP8q6$`YicH!5BfLSC8h69u=WFVf7i<i zBRQ0JdsF*d+G8R29G#8{A5SlNEB8|F7gG$>#$kaOGpXgE;+lj}GH?=qmh0^(;1=iP zW6n+VOG!$2bf=;PC1gvo6$fdzvim%ECM3gq+c(_<1`y_S)Fw6<C~n%M2)7uQ-ySm% z{i2i}0`7BOvB_>~G<2A;^TOfH*_4ihg8PA;V}Qs7!gm0+eu@o1^ow1NWiA<rei3s= zb|A7gXNs{aj=;NaPjQQ-Pt|2nKA5nQqXmA+sac}DiGC@4vg@Gm^DL)UVizAm0-|3> zJQM{ND!mgpAV7oB60#eRWf%g|VUDIF!Y5jo7`()4Hs6r-tY_b~pa__<axO3fN3=E0 zxvw%T)JO_~<nQ-fX0#nmaD+sBobCfhG}dwxOwsL5RoN3j0R79(z!Dh|+8inSz7n}H zR5yk9w)4m0f9?lAQJifR5(+m=(ddbY{mWBWaocYGF0#M<B4E|y_W`c`WWR;)z%vKV zr9iOquLInWV7};ss~==C3*TiAN}oRbqnGSp%**S`W0if9^Iba@tjt@X99S%1xNp%E zG9ACZAn5)D_U+w*eYBn!gPADU9q{PbVTyf53L!u<wt(flAydf0z>i_iYWA_sBb57d zcX$aTKfV5eiT_D{R%VF-$<Mam?Uf0Bw^!ztFQ~fdV1Qa}j93jDh`>x#P`JUCd<2P* z&_EzDuXGTRRK3N21-d@;$9WH=i+Y{2z}J;>Z?UCUzksgysXJBWa}n%+0$ojCDjp>W zzs|;+iIHHlh%A#%XL;hV);Hn%7tp0|@DI=>!+HyJb*i${HJk!K*8>BW8mswc)G9Ck zZ*sbBM@ymsgt#Hi{F5u)aSU&-bk7~SL5ygjoHsyM-3`$7U^jZBW3uYL(gT-=ueJ|n zdS2{OHk~3g7=HhX^QQU7byC>zun_(x_rfjE<-I%i0sy*pACbZCEZ6=CbQPdK0)VbH zRD%17>Wt~nV<G{d3y!am7|M<Ed?l1`f`9T+keMdleL?oD09vcN+NRH5V*3t(dZ8V; zF;7I8%wp9fEY@N*HG<aSbzG9n;uUb9;=h5el^NiMrf*&R8f$e1<TxRKo8~$lw2|&{ znzWJOiMahD)3^L=I4x}x{s++Y1OU2J{vQEd+<zwA|LZ5?zyD^IK-QI5kl()<qTkp1 zSZ=?5Gw3q^+~G%8=MSZz-7NJmm=fYc+D@o8;eP|VYWi!s1~Nonwdalp{sOwxf67lb zx`UHs#qi#-%{954EYFqHJy>Xc0|s}$f)`BQ@y8BX?Y@;;^1jj3*uq=m*s;yuGyrnT zV5Ybu&XBv4#ZazjhQ<&nk8%bYN-pDt4jq4Qy`$qymjV=H+Q_F>QK9*T{ZdC5!y{W= zcgOY4nD5+IVo-drKP|i{zv&fVZz0KFXFj}iK08?-&oQWIdHD1D{#*h>r6I@<fz6y2 z7Bkf3dU$<7=!10B_QKE$jj}M)^W-z17(Q5d=_wM}ZX?6?0~%K(PNCn#Z=eg<M+bJW z!a~Kq4{6NV5X(#qFzsA$fq1}J{PQmfzPgD;tRS4_L`V?HtwxE{2mnAA+g5JWlT)-9 z2OJzYOiU@%sP|q$>Dro(jXFIZ?^Y>4EXf=rc0I`w_|2qPb#LXT+6`O0NPC_Sqj;@B z5c`-7+<T%3^Chx0&%#7DPYMg>?cdA^k=ZWHja0O>$V*g}XUekcT8#0*#-c+Oms&F2 zF1q`{XD}EIYD8aL*-dL1P5nuiT@1OtA4m&hECpf%Y2jzUx~V1OEk;jnWg`FQ`D+J3 z0~7^1|DP%I$}CAAL=-8{zn+dn?uZ#?ci%i6HTPEKN+Hq$=dZIW)1Gjan^x{4d2$il zj@wukg!IE{Vm`K>7Eb}c3Z3?JmGSUXVMuvmmZZG8i4vHp(CF3oiek;ohv=P~vHKZQ z<p$%!!nY8pT_p922T|E{6ZHc6E)uFDLxb5)de>tTI^G6{8Vn-c`l_zB5cCOWg(>RQ zuEhIR8g7u2)uBvmms9dar?%0gCnYiz+BFs*i}VuwFSSptr=Q#G5cRs%9sIftzG;T= z*VEChKb)a>a~phfT{L`i{<`UwLZ$S^wc?oT<G4g?bwZ`idtLj=0g;t=2u<_fbk;24 z&F55ej|PMnvBWS?JrK+@*efnfkoex~!f}K!jK7AmmtVxdeGCKN4GUeX%Z~b$4+2iF zqAqZSLKVzU<4>QyiNt@ucGFmr?y3VGj-@6}8**p9UOAkQTiFz>dQq<!DM2H(EKDfH zWETCUGSM&wWzDTEURQs_FIv-BKslT|RzNJt>`fm4WcxBb5C3IJ&GG@``kskiTp;=1 z4LX`v=;H-$EvaT@B!Sx&>K^+7^#0dsQA2cti7Jvz>cC4<J~pSMJe_B$w<ORw{m5jy z2t4~`5#$#wrg&Ez(A~n`PY8;!PK8$YGZO+|0G^3KkL}kVb|nVxBc3haAZhOaR|gA^ z3KekFu=$5kgy8P3iiL#@|6fR%r=0)k9x@~NgT_Jq|JyA1W!syN5O@965`<PJq(=C* zXOLW2yXRi<H~G%y81|c4pfU}My>Ed1<I%et?$TzNeB}7v2ms_hkL|`{c#L!HcB{CF z=PQQD#97vqXl7`si_G<ZE17yn*Rk#-M+5-5q@Tm@JtG2cAu!e~^Frz>fUc)mV`1lY zhk75ZQNQpE)|bqu1*7w&Ti-ouuC`&a(jeup24=xqopAC-?#X;(1N3#P#&3h8rFsLr zOm}iEyWTk#d`J?sU-vrj-k}t!I+geG!MqhagqBBWr%x{d56x+(x6G0FgOFqh*yP#u zi(hs}`YVICM{|w9!QM==BK^Z<z!w|RsEG8r%WEvX?}H%pT|NU35WQO@>=%_ru9e}9 z!MVBUb3rX@<Oj68!39G(m8Ai}1<mlyiNXjh7+Y36JLq~1;Ig<UHkWz6wwY4}6Mx-Y zLDn<n&k7&O>TQdXrG(J&t@A%Jbw$Ma#bvd_;90=ksB|`0=6`TmcDe+_X8+pWy)#Sc zkk<bF7PnZ>kn!4u|Ia%<Qkv-vL0*o3`b;<$=DqvSG3@zA2wv^Gyru0IFIq)Mmm4%| zZD@PlVIQeyxOfc4Ra_x0*hBySJ8Pk?hFAQ~AIw4vC=B%GxAO8E(Yd{m%etKl+`l9* z`d`Ha{s$vvv~|OCJ%9n1|J#}}Q@h!H`W;N@k%8Er4JPsVU|f=@0szcIlWMa5_ZFRz zfaE2%{WO2PL<?6UEdlC9Xshn^oZ`Ndm1c!pS+t(jyG>yfJBXTGQ*4=DtStcT%!pyk zHNk|4Uh`#D8nu3TgQCwey64vu`M^o;etgxMudRUje5pGppCieG5E(RQ5IQcULS&#k zzTW1j)^(r1*7Uy^DvWj)=B6JVV?6zlCK@?`{6=HtQLi30TiCBaN2SaDB9QLA&(}}e z`nEF_#`!nG^Yq#L#qJ4~WATA=8L<GvO=|%6Z^&k|?$<1x(Mo^(kVZ5!y}nZyLIoEC z9Y-C3E8>vH#M1##k3{uV9PwRYMr?khc&+guQp$iRJ5FO++F${cT9dGc^WSJA#mjl< zqNJZY(?!b>Bv40y#inv&(Akm}W2+vX(Z<VLy3-_>P}JW`)YcH7Pg0`{dY<&6+#)U6 zw%Tt&{LfE&5-^N>AckLy+Mffdyd>nhJNd!t=F{%;*Z6fsK(T+jJ@o#%a=+((QFI=V z6w1S9ry;!8lp==w+>;lI@G*(WXP#W}fjA<=Y~+L*Ml^88`Y=Yd4A9zyQ4Aq!edmrl zU8w-zqYMn2_B$fSmK3qN@);}crP^J=1Mh`a;zrZ7VqyjZoIpZaqQRlm&UTzp{Ci7n zKIjBe(%G-Drr1>o=}!+iI0C2gR0`6A?wg-v?9@l2eqxji*AAmu_LXar3FmtJ1%4lg zLisPrr+uf1=kN=*BaWd4@GDXm?@wIG|9s}SiK(|8ZaVRsuA1;PJ3PR8G<*joJe9|& z-9@`;;_~~>!F6W<4*#-L><j>3sH!R-Adt*U?&EcazaE2)r@sQV6DLTOBE)6+q;Y(u z4y2~%rU|-7>O>RFRNiYG$ku|U?emdB%_JB+Qcn{uaJ4}b@erjR7)X>e>L_U(bkop9 z)-&2@nQ*i<2~yHO=bAmp0wf4x{hvcr`OgqZ`~5RSf74395V`*`L_>c63=#g{L&Qw+ z_Yn2}FGFP2`_B+T|6dIe_H)nwIYg6?oK=KBC)CQU&g#xzmen2o`46vmO#c}fo`zoM zfxnHV$Y;@C25s}%?N&?C32O(YYqnQ#pCd7_E$^w9SjPGOtav*R01Sts#~6&3Qu*?p z`M4|+K9QO?Mz<!uFP^+?l=mH-UOaz@Wg=bxg@-wwAKex0a^OAxO`~AC^j_nT`z?jW zo}BHBMq#|+sK&mC>TWr2`ICR-1o2zen*`BNCapw*dlO9~*(ThKV^kH-vLaCaJaxSU znSt(r{%R@sdnO_OhOd6JZfO6DD`tGdx{2PhZh$M+dh3b>?f-%c$BQ^kfF3w$SWt|p zy!W^8Rkhl4iGttol`|KvAh6t(YFB(w4Ym<DxW)E7)q~=EfWy_A1J{Of_7eh1;Y6s> zNrq88`0|R&$QYN3&?ixk)OkCJzwzPq=Rc;)aMqGnQi&;TSD8ZCQ;R2LBD2R-|M+fc z@2)>Q+qeZ{dIiwi_mX#~NL4VvkA{=kjhagJzz|&;etT@m3ML)(kQHlyq;8<?EpOzu z`-q<oG_ErI?$dU%qg2=`+IjUe$W-|a+Mj<tYmh#`hEe^sxyq$~nGUdFgfzN6`)Ta~ zXhU+k8+h3gE{pSC;76l0?XEl3L*Rrk6X}S95jiqLU%E#wl&HDDsv|xSO~E>xdi$~9 zS7M%>8ZQ_~l~f-#fyau+<*>)drvO6XXB5>;c?$Ndk}suS6zCNMz5!GraU=O%c^Arn zI=hA9wddtaZAsU+v}5PHx3Ft$u@{<9{eLYsuUrXUhH<VYerBXmOnh&(ia{pxy-uE2 zb+-Q#|J_=n#U|!!j=w($IV4(@gU(~7-y0`FQe&XA<qi9+F?w=Fi@&w7=2w`C=!)b* zE@_%&0>yDhP{;oLS(WDudZhJh(?ej&!vj6Z{^^YY;#AQ$?O!fAzAtzpwD1~wAyNiH zrO-%8V#KZ}{#-JCN!)b*%T{#>=9J0L^Y=mj_vMiAr(3-pDG9~`KmLma3;H(;W}45{ z<%{B%BNIiL7a0pgDwH$i)#X21d@j^1(3z9>GW%E|^pD=IKYfp_Pz?M2ibv|>?>PVq zwz8bo^rc+4)&1xC+D??2Vx@uf-z=C=E&bqUI(zVZ&E|CVFQOID+rOH321@hlvnJJ8 z^+oIL5&ST0(@Yn1UmpGt!*?+E!Tw<4byMBZVwc}{x)yQ)%TCM|tyfPz)HoaE%wscN zG`qQ0!dt1XiAD82-A*3nDAnnIXsmpkL_14&TkH1&KL`H75cKnUPmXp*7}5Uu^v&f^ zrg`Dr$j5hBzM(Gqma4lX0r>iegpD^gaL|A2x0w|PML8Wc8n_D^;`qq{+yPm1k*wVN z0OL{?oK&Wb3<n<qEST6S$?C6zz9hXxZnWqzBZ3`E-U|4>3DhS{$hM0c*XtS1$XbG~ z|5je2VYtQfB=hK^^&~4>fsaBbNO|C3mWCKOc8?t(5$}(zZe);LN`{5|x%&bgD;a^8 z8D7Ng%^WQJ-W8C4rH?tHBJlp6o9f~b8Q!tFj04UE0B`YKw_@hp+Y3=_g=;)3uxhF0 z{oI30+96@WuiI8-UuKzi6&m(E+Nyd1ggB>z_nB(di5+zB{g?{}h;Kc2d$;!P+Bx%I zuj>~k`=SliCyMd2wIPvp|Jehj`5jx+J_-w7^FO6;0CXDOxPi!G*L0}yyTMzi1bI~h zA*Sx`zk0i!9P|(b2=5B*$Vxi=trLeeB1yAwb?ush!vXhHGU=Ay9$@zo=B{h-zM;2S zZt3ll<DREaFT#ahw{(P$jlou`MvRm^%crj1ytbXO^&#h(acX+y`pF#=x0!GLb=}YJ zvtCNrF4BMQd_cgz-=fq500gW2uPFCzJuD(BmYdPCUmr1#@`P4U4odj{ohXHIC-?WG za`9(Clp<JV_mb+1Vb*MP>if4SWnlTYC^aV(2?kftDdpdp;Vl34ell2Zzf#61{a-{W zOdQXrCHj|D2<Y$!GX8o1)%mw5WzhqaxV@bD0-)SCmm0PZo}G=6o&FzHzUR?cqV#Hk zo1}+drfO}tZu_0MuXF$<ZlX?xyC*jt9&yj5zyADDVoWU=6n#&~L779vwZe<%na$T5 zI<GgXYu*R1@gHUCXj}~Iro+L9&yfp(bhfeLC>F}z825_byJ0dHPeyeILHIwx&}f{L zRZ;1&Wm4RrC``GL_(T@D+TyzAOVR3Dh15#qI81A?YB<Wvaa!_UeeTvx5`=Q~`JO#a z)QgUqbHSS1^wJc@px1Cy?`GO?do*FOp{&R~WlH=?-z|#}XZg-rsxOg_etaOk$4HPx zW;^BsBNW2*+z6d$pz%OHQ+x8g*EP}dXr#>Bg*kH;+eHEpYUCKAZ6@RlRg&wf@yy%_ z%lj6=>&50M+QNcc6>yPcseH`2-Zm?PsKu3tI^La9*+PKMdo0a@ZWTkM-&9;GFnYdQ zw-}teQ?JEl^oTu@z9WRSb-Fzyck>2`GN(6XF|=XB+yE^%6YjUFE8edx@-TkpS399! z7*m%V1?b|-Fz{g~RW#-pW*`uMg`OH&;0Qni6vAcfGmm!w5Q^4<bGq>4KC}JEGZxgI zb@S-zm;0}<yM%rC?X-a=Ffaic>Gra;D7rGIu}61}?1(=|wVTp?I4s(T;o}I^#s`y( zo_xVjlp45C#PGG7XVudhXB6DLR3*M{z8cgQV>uqqTRTheL}Xgw`aFa=-8zzfsNybK zyjE5;JrWi}q>BWugf0r*<VQsH$E>0=?;r76he&Z#xyo?HY|5x_7Srx47#q<Y6zW$J z&iPB7?LJlHcA7%{uykgMgKO9wXHR_RLYll@=y_tSIXHs1-wMdc?^yDkRKbE4>ED5o z+G<S2tu=<oqvKYlsKJv^0<tB;c<^4_HImIb*B*6ruLZ8yFqv$`o7j>`nf772D@Tf$ zV!S5I$^#g*dhXDUA@cjDkDL@_qln0yZ9yYD#9K5m%*jV#uNRkzia}2k-HtGmm~s)g z2@$HxdrF~pK4ddwVpyV2Ll8nGIoa#Qu~9QIqXH#4aUw%$t}6|}WFTr{nk@vxfcNkE zLJ_&ds;DkZmut?v2H(U8=tRj96S5I>scXb|U(YWEYM4DX@{XP(_#>R2t@mWG~f$ zr;?2Uq_o<!rYh{(aB;UeR9nr_Fwiv#2rBUur_8fuiwnuZq-{Cn@Z^NyQMgfw5n-wx z#xG!q)lA){1X|6;2f`a&XmJFn1z7TJ`SiH1QW8pEXbefQ1N(H+d%|4lG?6{1Aq;q( z=vIze6ifN|ShbJchu~czhbSKmWDk6~bM&h<2z;S%3x}pY2{S`GxnZ{z3^3e_Rp?Wb zijIHG>LHziCpCn<6A24StCOafB%gVBpkA0FC8F(ooh3FZWwnA;_>x=#)3JOn^F4fS znobf=fBK~<*%`?tbQ@pjc`jmlFLWUO1-cryQbg?`Qq}I=Cve7+M-!1K-qt4AkZ6Cr zATk(*KYOT)!t>X$av5g%2&`Ugo54v_a@Y){oP%aKg-f~{`_a|!^Wyx{A92i;6jy#^ zMq)RDCFd#CS(1Av$8e&v&WzAW_FzJdT{UQ;q_z_9al|C<GK~8(i<x8E%t}TS!+fES zG00M*Xvu1-p5PC*g+sjaabmp!$WdTY<<Z+E8=v}=g9Jf2S6Cs^uYyJ-1U}|-4l#aK zjlScdB6Cm0rufO2@e|PY<b-#3n1$a8GWqlX^L1toadliT5#vz_(OH=^jRMNOT6R@m ztYa<uA2{-G`>=g#S#nWNi{<93Bqpp(!ac20v)x4<rmUxF4~#ZU;UNFBpibh&OZ4l; z$V#81mqwPm<({J8nb~A#*Y%M^fdNZ{0BZzHcXH|`Mjk__JR{7HbWGHkLD9tQnw+)b zk8Bm8$XaTWbfl4kcPZr{T9e#`Ct<jz_fGT<Z6}OY7tJ<Mls|r*?nHZS`T60u-09EV ze4YH=3a=f1Qob+e_rBDVMdpNpmB?|m+K!Qs6xANA#B(<U(Dn>3=Jw8zOBR5Cz(L&c zE6?Jz(n32+1*~?BQ&;=cFH$WvFele|pLJh{-HF>HBeG0dK%Syzm`0?t%~IJsqQSP$ zREfcLnBD%?+cvc4<@R1P*={zH6F`HE7#sm`3O*!t9@L>bh?=X4^44r$4*S@tyC^$; zkT?HcJ_l=U<+P@&Nm^*yLFfww@$9>AQ*Y!apL;J1M|{_JGzBZ8QF}%jn(zzwH9<bd z*kVC3Rd7%xUOJ_d<7bTORI|4GqJ#1%pR!K-d^PfN9ZaxWio0DByq@g%8-^w@$sk3} z3`GjRq{c}%R|$dQ2e4WrAd0dteU1EyX#5?`^uemk`5XSN(XV2u3HaUwRYm)_enO1W ziAX|2OPD!&<STb9;|RSgv&b|(TfSZ^x~nU4dts^dEL`cg6X>uVw&9mobfG*Fo@fhq z>Rq9r9UkI&=(rb?v9Thn87i7(>X6f<v8J4X@qrVBkn{jy@o{;>P*lk*AM(UjtwQ5u zSf@_qPws8=2#f);kz*`7v7Kk%F?_z=9shA>Zubb%G*6}G(j39H2YZXr)Nry|9?*qy z=ljpy)8QXqzv>+&Vl}UxscuGV;R^rs7XC^4(S1=^|KxFM^X8GN`6Qmuiy+k39|b?2 zcX{f6+a>$3yQO;OU4SI)9Psd?&c~k}+>75Ei8l`dlsuPlGZA`}M2-_GF4noO&xRvJ zz7{;V+<tm}KJiiHw65ZE-|;U|Dnk^Z7S|AQLsWETY8Zg6VF=8r&xi4-JS(%VueN$x zuTDN*U;b>p2K{)8NCHFRhoNY}{zH`dq51ZXme<p4YvDGK9|H+$v<J}-FDQvO4ZpX6 zkC#xE7v?FVzpn?StT)?_TT!YPN?%CG*y|jy;>^nbTa@aB@FWuQnVVyu(tjoPm9M`M zr6k8pV!3?zRebXUJQ_B9wGzqcBmH#iefcGXRNV+`Uf3nRaH1UX8&>5vulKjs5|GOy z%wu>fIO*@C72x6)aPNmdZ@pK5zpqeW0E{Hin?I1dFhD@X-7$enQ#LSkGBEtQSABv9 z1h7$0p@`4!`tx`N3T!$@1o}OO62#Uc-5UwY4Kx9eC~_j@L|MWbS9hoH0eNUX03;Q4 zC#1F)BIt1c7KTDxc^}M$A3$&K@rK0n1wV+=E|i}Lk=pJ)r7}h%M{pf~SUf*O*_`}y zFT{0&jNRJ=&PZtD_9{5=i4i?r37l*Ljmn4J;D(mUB;T8agyr1OQin?x<Av@tco8vG z5phcqDfVGDkzuJvh-<Qt5O!3~5d?H^RInJ<q4<luDtlCC<(Mkt1{KK#62kUEZx()r zjb8f`$!E<fW@%ZW@ok|=O9(@O5M}`gs~m(39+^%Z7F~tVa$N}Ftn^E0L*!+Gh-gE^ z<sgzp5Lz*a6+9*_3-L)L#K#VmB{Js3ORLT<qS4FvYlqMozrkOu6LlOI8Xt=w0v<sy zMJMInLaL09|C+^d%uY!nN1CaY00zm&dL=Y@p^>2zN~4**4&<*agvuOZ#Tp@%<8e9? zpqME`ID#NO%8;E%$OTBz*d6PF9aJO>$yN@D@j?I}Vw)5}7`Gtu>>you1fzCx%%}|= zJUPQY^vQ?~cOUd2H*Q~+-1<F&MhL0INeYVwB&8<KS}i3;9C3&qVz?Ebz=3!%89|d3 z3$BcKgq{}D772JxWbE-2Fxp;DN^XmY%WF7RJrqs6fULkSDmp6NVJzXnQ9_VbsCsO8 zvx>f+&(oZ!#00Mhf5emr0;Cdf#AlnJASeNBF?LiNvQ-(IaFiIWf_TD6APfsl&q6fR zhK&746lq9{If?;Srg2tA_HH8FQ_j9;nA#T=^S4!{<w7pim7yt@`j{^5VGsl#!;gK$ z<ck(WR1kzO2syb$o`@|W>m6t-MiEyu1Xr2lcLnl#jBq^q$o7N4hYdlKCeeK^aUF6H zZjbvof~5TYkOi1E_z<;S3^j2Snc^@!RwbV#81h*F<iJcIZdc&y0dW_E^vOX!Hz2&u zL?QHmgq@(RcwvCAVJXqM<QwkfMwU76X>W-qD1>4p4h%<R#2}Rv1O;0@qruPh3Wiu7 zg2&<^@^I9oNaPpWWJl1158~WU1ru7L^2$gO17nQ4ITBOx(d$W5W42kYgCKh_^!Uw? z1b;|WB18uY;b<sMHj0nUx>2e`pb&byWH1y=E=c;CG&ME2ARfOsUImpCl$?ZsY<-BX zD;C)kl{AQ7l<gHqBUzN#85x?1G%t^su??w`hfv~G^1mk|$}}6W$64bjb#hO@dzFVL zL^>w}sevc>yAi7KTWj=Uv8|B>xkjcgVbE<o6|ksGj|zJn88gU4P|y$_q6}$CL?a<c zJH9@Lu$B}#^*?L^Xev1QH#qd}4g`*#8lzI0-iDe`6@IRBk2|F(2LQ?<Gvh~5d+Z}E zg0xbqijRuP;|-s_6Qq(KAUi!LgIEzRP14G4Ry~!-7^)7-I|9GxgJkd{rA5Vi8Ky$n zL4k%S;7s&{(TZG;PzAxd_@(@A4vSZhA?|R<t|hVn08%N-eYK1;!z4{0BYpAty_#zM zjr(NxZUDi?zo~{s966f04h%!rfHt;xr2y=c@aL?k5VG20G83Vy4^eq!uedZA3G|tr znmEv-wrh6@fgvoXS&Dy@3CS*rbr*|Fc#j|?1VXmFA*#SB<gPkRH26~B>&2vi^J2yU zG8IycemkR>HpEJ8Qrh^26pr`yi1w)=WUN8uMsk#5Py&bk$Ub$5ju0pevn5>s^og0^ zXJSZfRcVem7M=hoTTE}zs{|(mQrpP;e-Zaq0a5pB*zUm4UD6;WrF4hV-7QFWO9_Z5 z-62SKNjD-LLnz%1(jncc0{cH0ukYI5THij~$8$C_zx(OyE;H1>=SkAg8zj{oa?XK5 z^<7OmOcQB5at@U^{T0#PD<V$5vY6=h=H=4ijj%38oQQ`w!5@pB9wv!v!%`j==1jLI zSE6eGd@5y`o=OyPaBC9GbIO=Vh274xxku3z2q;wL!NNr%vP8XML`D=+f~rM)g$M%L z#B&rfDxsv`>f6$d65^LX=Q`CS)%iT+jYL1T3!A32CAlxYOVUjdl1hm(VOi^Q*cHcy zY<-(aLC=qr`Yk`f5t0A{pLCez^sN;@Q+3M`qursY`b0h@8CAzo_G;KZEPF`z&Xy?F z7EYF-Bek-Q%CQqyzPLFn+ND2~9F5$~qBlXLsBsz9nW!miBn6im#Yg}&fQkloC}0jJ zS$O!sz>~<x7XIVRr%FDebHd&h&+=T#)_lPSBTX=wN$*u&k&ivXA%VbB=@2a!!LG{@ zivT<*NI^Gcbf9k~(WNQNQfOU*gxCt##`u8oEXOh<&QKB&RYgE?cvzYb%-mIKVF@WB z6A>W=7}lDomn8qQ2qu*e%G@qV4n^1U7jsY&5eFYgNG7HNjhG?4>VY+EMnl^7+v!o* zS43Yc&}%4gEW$~4tsatjI+KQVIag^vK%<&yq}W9pnGYc%?TsR<7`#6VL;ox`5ql!d zI!%U&nD5!h^=6?(Z`70eiOjatIR}g)3LGJ<p$BOJBl2u-w?<-MV4tT22}aj6k%lQW zH_?A5K4cp)q>ex7FEyQ?RIKY^kiBo)Occ=UUQZg{zR}ofGrc}C)>Ap%<I|mDG!{EQ zqxLTR$-Qyj?&74cGZfNOd1<o&D_KRC(@U0JiHNmDr5?zS=V~GXw2N{Z1!rpK=UVn= zrqNiN`i5=<gIdx3QeS`RZ6-~=W~!fWtl{zM+w*<#cz&|ferRCGw0mx9etrQUN*zbf zi!#l8Mqhwpl+udJm~fxT&Q_%@9Fi>_zb0CV@N+8(K1o~r*1UMe<ff}L`<-kFHhlq& z6?EXXgmm);xnc>eWeFSw!hG@oeh}1+=-Tf_bnnR$am#Yn5hnS~G6nex)eR=;5=wOi zYBL2IKnt35K>q^5I5Nd}l7Mlbyn4chc}s!Ay-;AtgZX5?AZ~e;^vRld84>lHHR?f_ za%EI{X0##53Nr=<t3AfC@KdgqRf+U<ot8N1h4uSoYx4W3j2P=IPu6!GHneWuKWo{r zy$ROeUpH()HEvm9(%)FCz!2=h*mqdBTlo5hJox#-x+C+(&>`9j=5?!E=M9g+uU-H@ zDl*U~a?S6_Mi9oT`<sndk?U_;wo)<tqu;E>=x@fQZzc|IroGuN!0^jRUz2108cV(& zpZ+zeY@<+rr$*nWn0Y13ezQVxJFIN0mVCFp%)Op`B}VaU^P8<!#hs3Y-MTiEOb|-M z`tGjUE=9{uj^fi?jNS2ty>ys6mJ}<LCAGV>XK1o#u(0i{xDi~o`yq1wxP_=b6LD1$ z?ots>2@BqXb?@YcWqW^ldSPd_W%u^YVcZeC(h@Ag@F4@_kl_%{!21y3O?B<>SGMf+ zD;_;VhT^0s?jQe)C}nVbd2@(~dBos-5OQmXQm%aRlPJ|lfgaOyM22%nGq|rfxbwvu zEsp{LJPa!zbt+d5R=7O{FP*Ajo~as~se7HNWt?f2pFM3o({DX}^46|G7;#nq+}!Kj zGUMF3_1t#x+&<&{65|Ms<pK*}Pl5E@GcG(@FMffiKx;-q_l3QVUOWLwdxOB4mmq2o zSQrEgx_T!BiWIuk<@$$4m9lu1ad4H&@-0*7Tb9?iyo_(Tt>4}+ek&OIR(|k}4RnI8 z1ZS`W%XWCEGK{<mxo8=>c$mH#uXKsea+>`HeI^sk<N%^-`+)%Y5p(o|it>5{^LkY2 zdYpx5`ryapE#~#?;x)M9I+pUL<G_3?^ME<y#(DA3sr+X5;D&ke=IHk3<lyGG_2yjZ z_Hyxt8FC214wy(FWY8646Ic8q8i-Ez1kcTGstM+Q5Tz(@o1sLhelJq}iP?2ILJq6R zGRGKi5H$>pSQrL{b+z&6d+E12w!Np8Y6WUxlCK-attaF4n%}^aXzo6(G8;(0{&vuV z>u0C;-U0Ojxb$=RS`(3SQKr}IelQs~mtenCqY{Nqg9FYI4UV{Po)WBiY}y;gWbnBp zdc!=K+i~0TykCdg9*jjOydAq~4O6058+fhbYCHSk)^6(aHUEh{Fnzp5AlF@MWwE`* zz~3ccS%!GNWeK{`<=1WZx^6J^-TlnwtHkdE?wYPNNx${akjl`%_88nV@)!ix6F=J0 zQ@y9H(7%0ibA5fQRUX6UO5rOEMioC4hQ~E^5J4pIKNLZxmUlp0uaa9r&^!$`1|5C& z+axx()DEHoDT%X5;LST@J{cDOZsm=S!E5LZR#sz^B6C}-lsYwJ*hi-Fr*V>|4ii6? zeh_2oBtw_te=I|lN4m>|h6^%IloaM$zo(@S!y(Vsh2~6PHF?Aa5T($<KAr2v4$;{M z5`o}J9z=O7Jib`_F!Xqg$eY+2mP}n)6qAedc0`mwB34C$B;Zs<hU^9BFicCuFvV_^ z3<V5=H}3|a<D_GklA4ml3mP6iKMqd5AQ4&(ZHwHGn!WO*OS!rOV;{Bjz2>=|8U(<* zJ~auGh<|EqL~NJ|sj~5gu_`8{AaR&9>e95UJ#(BGSXz@&JnUqnOLH2N`I_cdXI87{ zwy5Vk4}*sN4w%1KQ7n4q762X}%kaF0i%omGd6&A^$bwG&+H_>D(<)l}K6H6?#$hAb z!O2h2m;IBGpCBYH+LXmz8pkMUhAbsP(%zB;OtF1k4wjPyh*Hm6h=yUj+csb`yjn8D z-b`f?S>!}$YUgPhx$rf;s4(kF3x1o|aBE#$oAx#B#rwh#aCz&7u%*2*^Ec}cU`2k~ z_)qAVWCgjJ7q<0Z^Imni4ZqyD{}X<79Jpm4yhEEhU%kk2DN)no_}!?kj~O6J(UtG+ zHz}|hVLp*3^iPtL<Xb0lq{weN<-+u`+Vh`#^U8Y6An5UV+@st4K=y8<yg;f>Y{_Js zZl9-GGeJ|>XURAO2+Mgy&mY^bWCT6&nEk`TiuSYM_BgoW&_7!zc{_V{FeH_6*jR6l zkgu<aoQ>vON6DXedVtC7xfZ9D_@nCx(GcXA$8~<TLflLdgzF25uyGg?g!RufJH1Ha zEscB`$zcG;RoCX)>~~8xi6iM=LWyRy+fEEFxR0n|8IMdJZgp)#zNN`4M!bzoy5dfF zfKUNA%de8P7aL(|jf$rE_xaxRWn#tEiQjAPAagK5<SU^>cW`(cqNRRsJHCdOh95J` z0FK(ja-}W!1xvU^6B71A-WI~_k%;F_;VDa-l3d4cUl5+Ike=0bRaXSRHB`^Ro(YyB zx*3TIq6v}5dijaJ<uG!+Z<Xo+pN#B2TNINYCFR3<fGG7YTIWj!H49RYsK;n*zW9Sv z=AKX7d82XV{ttGEdt?<pkH*(_u1{#b?9|*CO=yMN=rr%?(?J*mh*Ehau6)v}v|~v_ z{^qs9G9m(z$6h11od8j)C*A6^R8*4f2KOgEMJL&clu&AO-oAQ8*P0Ix`ry8D&GRXF zOn#v5FwGO(t5<r{fSdky+(HPRf7o_~BVC5ZQuH2izn2bf7HWW{xPg_j_Y?JOf=`wY zNM=8&nvdt)e@!hxMl2H*KmOkGizN#{l!|9pc~5F*C2uC%5sUAf$McEdM!#q@^?W?P zv$&Aoi(frk)jppaAWFq~)MO&K6e<N24MZ}I7idlt;n@^Pls9OU%~}^J?pXuqy`qwL zE+rNc#mOy26V){nr65KdsYQORhK+;N9^41=I}KVbp+{wlB?a2w`Jc9{nwR=A*&5%Q z%WE}euW-_{y)}K1@~Oj)EzK~^)|_kS-RIGFMJe!hmR!zL*4rA@`4W3&jA4S1NW7}T z044*>@3YgB=cSGx?d%Bzp3R@fSJa)^IqdX4TgIO%g>czBb;;_kb0-vczp!`7>DArR z)G8eQXz%JJtGDM$kUxE9@BXY;?<jui{Sw!64-Q#?D8-Y#2@s`_djX<ULI#v5^;HHS zO1Y(7o;~-j?J<BM;7tZ`JNQP+7{c=qCL*~y_&@J4MAmZ8PHTSjjH$^;T{W@e{sN7^ zh@i2I2SAj%$q5FCQhdpYpIDycgc=E&JZeb%%!8jD?%1?SG@IBZG?^LcBe(|ome?&N znGqFz+qAYxl+>dXpY|?G&}@t^saGp9HMX+JtU)`e&tURF;7OqoYeIeB`+<i_15M`b zR!IZTxswu>1ucw1uQG#kozrb-EgoMaJ+nV|&TI}fA2QY)4niQz#BR0}I!YROYaWwL z`Pj;;EI!#vk};R7R9-;Hbu1%2E=T0?_KkG%c>YFSuHI8i_MF)XI`*?-v&XEW7KB3| zKA*iYPP5S`shKosc~KsKo~nmAH*Ji4RvCvLZ_F|`!|?qq&FZ_YHAmxES*dHyK%un@ z?5o*X1RmLBGJ7WrnwfP;9?8#X`%W1t^IQ5Cjct4OFJlB2&dRu(k4pDm9n8&qJLmcM zo$T<|1f06mM}FBBVCN7(BCw1;#MME$uoI-DJBd@vTlO&BQQahUwS3{SOKQ(CI)i`h z!6Ijm3dVL!x#uXOTYcU$a%aho)Qzb0s{u?q=QI}nua7S{hJfCG2Ik`-Q67(suyhw* z>a;Bv{cmGayDo*TeA^m`921rH8^zCG_vu`GOK2o_W%NtieM<g)Cd1bCqY~eqofP}r z^59zS(Ccoe+V9aj>2Bn!X$Qg!-xr_ny0sku4jMsh%h*b*9V~A?g}VI+Bf0+)M=brA zKK;kKknPKXx4b85wX9!7hL(rkK55V9c^x2^;Q^nMeuklcy@R^zF+<0D{_%ok&yi(m z?%?1_Ys1BBuUGdyuV6DS&&h6%=4?FIyLhe!cvw!d$``&W2{nz@zIj=k@p{iV<NLz= z%|-Ff>mv)EAM0++S0gO*C*?x*+iqUYbN9WL+cR!Hr`=w^vhlh`<hi}BWx4?i&wp!$ z@n?eJgv>HR-~^fAOd;bs5JWg8#8}~xPzXx@Ba}|aKm!Cl{1N&oq-Ps~CI1MErft4~ zdyHSCCyZO^SzD)^2-mB&UK<hH6cK!qHWJb@Vs#NR(#j;5b_zUE3<r3f=>Yv{WJ1aa z5_ZHu$5gsw5j@;>2GVvaK~V!kgb_mY1j?X*mn8K5b>4qn9qIu$gp{y2zxPCVmlj)H zwkps;@Qei9{&4>j^CEABMfnjX5V%K2a5QW4%gYvjc`Tk^=)&!XLMHp017Tggo(F?T zLlJyv2q3l?pOKGsID?|e#68~ByT%pH{B&%uVVaAFqzm%0LLfeknCT$3;86<h$86?k z(#!1<p?CnoWqGIOmz8ho*?lfr1Oy~PVebzh=sCL_gJeH|a6xDwG^}&DL%3wi|Kvc- znP&UR_#>qudy-@DvoOR6zWglBH0<EqE*|WClBiI7x7aTg3fwe;+k#MU@t7gP8!_U> zyNQ(^FFHFo%#k{{UpL+vgd)C#2!0Le@Tu)%yMIR2FNA{~?<=fSke6wcr_M3>=FXV9 z!6$D<q8)jvo9!&3de*m?O)3h2n~P>hO&Q)9Q$JO;NYNh80!0|Akx8Sbch4H(+;b&- zG!aX^8Z8YNQ%i9=@siR{B%V%q>^-Raf-x-*II`)w*1z{kQ=mzGIU&9^;t0pp9fK-> zMLR;!_xdPQ_`^#p;IMj@t__5<`!ZcTgD46%nG{NHd5SGQklhX8!+vP68I7v^Qqy`X zw}#SBo>|=AjoMOa?HEJ$q{(l9%|ITmldT?&!&@NnvlCz+XGvsA^oYT~P&<gB;&@c1 zhSoov63oio1}AK2LR(S|wU2xB(O-etVR&Lu&w*E*p#ovxWcd9s)IRPDx&MGA6w6W* zq8X3D4}P!K2D&#cw-0b21XSc=twYfi=F0pjn)bGB4%-k3JXQa`WitZ)hNQ5+R_BoL zF7NL95%c7NexB?z$^W`9`9Gn_da81}{8(@GIs?(;Da9%*UBg47jQQ16vISq_jH~k} z{Ea3v>-|6{A;yFS`~xy2a@>fEk4dBU6VtQAgLf%JPy0T)oaFWXUd0%_hsr@&Opi%L z%4_)Z?$vB<4mTy8kVEyo!?NgcB$-#m*01}1v3yfoR!S6PSU9Yw3c@e^2@P37lK>ov z9h*sdXF>lf_H}v(%^s%*4L|QolzPMwV>X7;#4^fq;Fl+gKH$>J=VLR3i9zp6gg7O` zdp2J+N~7A>e+L{<`=)H_p1^*;Jh%^8XlUJ@WLjfaW&jsTh@&A;)#3ZHWgZ6D$L7*4 zqj4blDZDx{yYolyRxv{GCZsZ=4z$enqQ9B)r6i;sp996oY{G`udse1+u;&@da;>`m z^hcky2A}bGM_(J|&%e8o07-Fyu@P5649YWers~O3!2g6a(d2oaF8x}fDR9cF3g<qq zW6h8U1((&)V?Ae;#W#tkf3F7jkURat45dO{Z7>PAOWMpL%AFZWmggq+p`7p+i}tb6 zkY&K8&pcFwB}N;|&Db8O=-?&z9I{zhkVpJJq@;!stJseD_6qcHZ_f!u0JbuB2e)yb zSb`slFU#POt?MADuA|B=g1Q(w;gC|aRgbC)*j10=Ptu1%Nhc5c6RBf_$72B(!*!~T zUZFO2VQ>PyxO5V#0R`^d2dImodG{&Q#qfKIFU$`s3t^OTLuVF|_sszR=a!X%4Xikh zG-Jx)i9ON+(1zI5-{0dL2995cX<^u0oW>=>oBbj=PdF)@!MIJ|DNvLMefvdGy>?HA zgv0QT>%dK8ETrG=otw8lR_jdYV^yL!8&~BWM`q`Thq@RBebSPUq#i>ib<l0*kTMo| zJOpoB`??LQqw}%K6yRcbHibWO`n+90<2;ue(HjxNonXm93`0O+uJm%{8%~6}6>I&E z-{-CJPonyQIrgu<X1-!lTiX=2{SQ8o;!4((y}*3beVQwwzqhiSdG~7R%71j#lT^R@ zec9@S&YQ+ketq5_Cf@)c-2U;5|A2A)rS{+^Yk=T%kbjBepL2+q>+c{m!>rNIk+$Aq zgi91bT>g~ddQVr0cW^V|=y>z0vrIrMhKK@zwV@j0u%x>=nMhJ~sntM*u%AdKfJcwM z8xZBs8cyl-t%|R6KrxWFpVH!QGSPp%UHq>f*a6~!^+!BNc>%m55X07C|3Abq-H<5a z5|}_k6~DR>!=IY*ZcM!)PWbN_ro%R$hlELk=H0+B-xSXMc56n)6oNq|*sA-X_n$p3 zJAOkYax6iIr8WQ@$x7UrNB21#k3qK%)MV0?(Pa1Aj$WjYjZIh>0_lZA8Wssu2~PwF zg=mD2JcJDi0H%j;f5XR}sR|QZGaO1^;eJ?F+=?(qi||oq1WyLCL?mp7DbqWy;Yk+~ z8X5)bNEOT$tPJ)KV!v*TRzJV4+wQXf>2L@%bRq2j6c5aoOHL9nv2J8xiR~^+H@EeN zB-~wSJj8~16+DY~s4}N`Gj(n1uIh_W;pJ<@X+v<QH!L?#R8TvbAC$^5BUrE!`lx1e z+JE}Jd#0E71YxQ-Jpdj=hyTn94PUD(QR4VkYszsxsuAJ_T=n3P>z4&409tG`!BURA za6MkvNk&g%N&_s<^1eh2>#5=6<#r5}jYLR_Fxtr{0`U0gIsgaZ%TR|il!}I7h;^dm zhf^`x%<A?O$&N+ioE1*3_Xe)zJfJbGoYD_gBI$8-pE$xb2Sn(kNo<MWdVLyF1dxc} zd1s_=dol8$7O2`=$}w^%1{kr=P)d}+)&*J6Kz4@_>*xNy&Gk;zV+XK6O&JwIX`>v5 zK^TS)5)+aUe^hxwC?L#Fpq^<DPoO&tUoxU|XMt*JO9zIGAlGT33zR9;ZvYrEI0E^@ zMkq$C`iy(mp_voezh8d&+xG*ZgT#}5p`S;0f?~kY-J>6eJ@kEZ<@yK_{LDR6DgSYP z*Wu7BjHvg#fEgF{<X=x!EV4&b%Z}@#`0Xo~-%k~mX+kT(t|nKzH5^J?{O751Yyo%h z17@?5<>npSe;uHk?f~M!cuck}u-nP_4?%2TKHP1;-jjeN0=Q+U=olQkBZvuk?SI?p z4X}?I+OJ#X5QvilE3Q;r?0+|@!WB4fe{yU8<ES(u?8k9G9sXZeKqSD^GyVrb!AtRn z5=znb8$luAd&_S9#r^+<6z!=plkgiiBw~jPOBPGu6|?_xRc`VpZa1V#(;crR{=?-d zg1Dqm2}XGf@8r3hlyK|yx)?W@cm(25R{0@~uuMThC1hN;zBIa@Y|r;4SVJEp5Vs8v z?;uD!ud4PHL;t{c;sE&0hv}8Zp>RZAW|D^LEx?phD))0I2nGhuxHVD%F=_j44wowF z2@S%=VmynK&j;D~Vl7~W((RLO{ja;wv~PQNccJ8zzP8g#Ce*jITt!V+ca*@PJEW+T zLO6Cu)$1kZNnhNq)>bdaB?qt~H|&iC6e$XI9}bNfaK(}YxIAjuhQjWID2CoJUtE9{ z$~%l0O}ynw2)z@>2nNTJn}HceKLr~1cQPal-l-<%0WNrMXxwI&UWPus_fln_0+(%J z(S#w)UGM3E6-v#QD`N5JQSG2hbhuOiDd=bDJ^BM2$u)UOxRz|oeYq6v0IX2@E1<wF zfZR}qyV+oLw!UU~zmvu?*SW#R&dM9+rRC}Ghw?`cpPHn^YR)dE0!UE?lNb8qNZfD; zzzU@%iuh){Hb$>m5j5OqxA))1KyoaLthP!;?4j<%q7#J@nd)NO6`je1*kQ~oJRKOT z^w!io?M={oR|k`b_jTqw=H-C<u$}B8ThDvp38ZHLQdAaq1ebYNS-Xm1_Yj_GK%%yn zepGP>j<>v|O160d9&jHX+B@C@+=u0(1LOjM2)_1-4(dL<y8vo0!NnKp_N)}EN_g$l zFA(`Ns%Nr;H5{OTvZ&NKz<pRZp`G`uCo76<D9IddeYfoi)P2}R{AV)U^lA~!fK`1& z060uk0^=Iad*gxIe<*55?L0c4cFq%1U}iWa)dv*C#B>0U3{VuC2?c<RLs(rYuKw)y zaoeJ|^XrHy&3g*x%fXm0m6;s~HK$=5SY5{FIJ7w5igddeOVg#T&CiT$0L+}t94MJo zuS=JAB&2rV!_~<R7T{q>w_HT$=)vJ~k5h<6C>XrL=SS?s^@2GnfD$j-)XXk-hNXrG zH@ejizAHHLZ{SS~p+Qd|ql85-z$ybxPaBT>qwPm)58mk4?##xhf59~TS8jlXXsJ1c zo7{Zh4In72wzd4&qx^`t=zV$pu^F6FF<%p5E7;?8w_$ihF`gBRa!a>Gu#Yd{`86)- zj^;OGHXH`9>dGu4K*Du)vk8ikM2Y&_&?n{t0(io*u$~7=iw~8E>Gf~^gDq92L_nQx zr_wnJ74t+C(5L-_EiGH`xJQf?W+|V8SXgu4wZg>rrU;%l`Jw~82;lO#ELwb7jvT63 z4I2do;SD4<3KAbjjgGBYY<4GhQ5;7{jVu0LJN(zY02>e|3|R7CwXHl9JO*G3ji~9B zms$aF;{IO<Q$U=ge1C~kM=%!4FCf@sh1`^2-26V^T$fSr7c`9fQ_UUSv;?4=mT!uM zZbfcg$@q6;Pzkr{u5M2hk3$)UcSS}0GyrCE$Sn710g7C?i$OcFKb+FfK#|)vSwr8I z>c(O7lXpyfmnjHa!4@E+W%`xubpn}!VEX*D<4;cMr^edni$t&dppL=7e)nU^;HcSZ zXCEJ#h-Agr9vy^i#5VbR*^hV~p-1Zk<&I5tYfyyg&>Jf_FhXhu_hVs@r~T#0YU>lf z@2;Qk1ZFYGVo3raed-Qjn&~$%pp_x~e$OfV%{Oh%XJT*Bp%nv-CAlwhp4)&QeO^Jf zV=fmBL?VI|j1hPR@JR!iJw^Oc@sdO{gIA-U8avUIS*}G(f96`W0zb0S0br(Lt8XIa zFP{QDLkg_7V2G*$pYS^il|&gRAIH*o?Y*^)uj)YT7qkj7uLvWl0ak;|;YBoX_=!p4 z5;8-!qePw+aDicux9rS<0W#ovuE;Q)8ve;!lwZQI@F^OA)atcw4d^A2%x+-^IfUc^ zj=`DH8>X*wiEg8OT_#kfumD`~l5g%7O(sk_y(b_NdK!T<fG1twHgK+ss>Lk+Xm$mp zw5FP9bYke-Prz`P3~1FFEF$Z8g$ZDxo*q{A0eZA9!<Orv?3tGfLE$RnQpaKs#G>>O zTBHT|i&0gpkqx(|{)Y_*P~P!9BNHsr*JOuNFb?#wiY@2^A6V$OSSi@ypf?-5JGwTB zlBgVL0K$|<U<ib|J_=L^F4>Ni@fvVy%qN@x99dM$h`o2Cti++u;M4BuSg}Vc23NOw zM7RRjL3c!8Ly!Xk2Uw%S^G;>{7?kcIo`@1xuHAF}fb4vVafd&icQ+XRG{O*e6<gEr z9Fe)M!+C0;Z8`XU3lGmmg)_Ib*F%BJwOAH`+Nqy8i~IcWm&hQz`q8)qd;a8v|4@(M zlfl*d5ep|<O&9j2+kaOUVv3vDUN6cHhNTt_w>3<~P<YJ79b{+vzc*K$E(K-iE`$F{ zSH^f`kiuAQe`GX&h~!+qa8h7d<Hd&Knc7UhNSA7bC5~b~Fzo8_hrw`qDn{5o9l%v~ z^dzoe&zrEHLVe?$%(Y_Gz4)mF6U0XVJ^9eTyFN|ei=%)muQKrx76pohbjJ$Kq3eSZ z02)Rg_jjiY9#$3f5`_Ir4LmO}Nw}dfMRt0Cc=|h40gm^naqiG3Fi1L_9tn5295rsw zi%5-F#QT_pAO=d55-&#Q?JwHLX##jS2uKve$`EfPHtA#C-dKhhe0D@ELfIGIK42H( zXzSjOHZpLC7)YtIuAAyGOinNL`dqVpl5j(6SmDY_^~xI)2XJ+2STta<m(&~O>UI`8 z-e5x*`V$#ey40u%iNDl24c6l2KQYvps<H^rC(ibM=(tTNmL*gizZpuzp9+qmlw%t! zpTHZhXr60qxaf4*;{OyC$}5@g(h{TOnV`r`3J1<+j4xHMKZ^rL_3d+l6zOKV%fnC& zWTLW!P3ybfVj}&+AA_o;-5<65Ayq+9<5B_zzN4r7Uua@QG}?y-4K6>`a<(sy*ICn6 z1}ip^Udb0=hbiWd{H2y0HNRNUP_<+!no1LN-g?RI9jr~Il)c$=_7Q*^+^J>4YNIa{ zW9hKu?bCutE(o(xQKpuD+al-)&{|ChA~QVM03z%<0DK;M?Uq0Rv;@g<2$>8y$xM^q zhH4MYmO${p6aw5S-Rj$S{_3SEAsDnR)Z!GZ-ojg}Iq)$n5$u-A066}M>+aKj)(xt1 zqdUY$FcOCUEtI3^=<_)OmHzfIO*EmnYtth3V|bJ9OFi)|&a&p)TM$Cx91Qr!CvrzD z%35-mMpEibiDsk|O!4zJTI@IHQ1B}z^cseOJucmsI-Xt_06ycc1Vr?3>uDR*VTlDW zTS^axVww2?h{bd1Xwbc+X(Vp`Z^4wd_b?9O9vXCdFXN_NLQ^?kBpL}?U)6}%qZjoZ z823J7!L!S^SS%(oYC?g}+nNhLI1x|vxt{IUr3x!$zKFMFX7%Yu@8aC@MfLCoppJI5 zMVr|UGE18<k!4a;P6+QEzJ`_~eNfZ_E3X#jcYDH^qr9PY0LQ#jQ6tPLsoAzx?e4q{ z1sa7|7Aw$3;b3g=bq9@UE-k2&&B3KgQKg)=c(;nmQBzsIVm=wb4yyNz38WJr!`%TB z!5tXj!OH%4pap}&CkNcb0pe-sMFv6?+bZZ86FlieLE%O_?eoT6GUZ^d+Qhf5C{9~m zSEh5olViz0KOV<o-QqMn0+`U)hY&=!UB_&-Txy#V?uj{b5%3S-&UMs<tF4d4#&e*q z@eM$Sw-IgH{P@V(qismYt@4PUYt{C2MEc;fb04PTQuUZ9G-r~agA!r80*-|a06y5S z(#%s~7^J6`b~bBU+dMw0=k*_e=l2~+P$Dd^oQ3n=*?*K}vwm9kSL=9fuibx_W$Ya5 zi3#@KmXhU8F#kfuie~^sSeuUK$nE~qKN1%e2@qkuJedSwF+l+R6^Xi^c~V#H)$z2& zTjrsq;0_Fdx8(p&VoALepu>OY#hu-+JK;GU^)~VRb~@GSEO(%MU3>lG;=b|U`41lO zaIOD5TvBN7)OUKc@~-`1`+p;~A7}P?!QO8N_^Fd(@x0C`p4$KA;W8Zy@<RTg0`<nr z1zv89;>P}ZxbQW<A1=@8xL--OU@-LIf{|#%eKZKR#-ZTmr>UZj0Js@NF8%J|Ivx;< z-x)n*B6~(+bv!hWHC8QFw5xG6>0;=oWq;9dhjN}WZx=^=zS#V#_7L^k2S-@1El#T3 zIg{b9Ljw(1NF=T(Y#k7;pKP87Fk!b+tS!$SM>d7R?A!1KB>`87PHz^kAjqfClh(*l z<W#SVJCt+cwHd_c4UxN{2U-!(7@b9~L*+O@%S;SlKwHxhFWdUsj*Dg9q2Lc|F18dx zpVy5C1FocxvIHXyuQ+l_0^LzY#jY$90oQ55;4NL}fnY|U{Shtgx|S`$-Xd+{fdnyH z2_e$yrZjotG5r)T@UHU0N`m%ILss71<Kh$c+mbLuiewxmSWFe*bj^ro5O3=hko2Y= zh@$b}$%Xb#*L;EjYvUBoClJ}p{WP2rT(F?eWbP;vw{U#K)`$kIgo79=Ls_gfw0Fvw z1cxZSWL;dIeQOBH*@`d<eh+GBN8@Kj7au5x+=TWMys+Ma#Wqj|_y2T)pe{2>E*jUg zVN&Zh1yIg2d8`jp?pS~a>IEz6C7x|oC<Yb20~}z^okzSg-qd>^p}kWXx1ShjhXqG~ z1vnV3)_hV-8J`YM#Xg=09G0S~_Y2=UoqaYA?VUPGBwwE>);L6cB`|a_6|jp|8{oj? z`dI)8{}>e5lou2M3jod!pLcA391V-_kQ{fjb-+jsbd$<&s3Ri_FpKlboeaV~wYWav zIxo{boiZdS(w3jL6(~!hY~&Q4IMH1?pCfRAsh%>Lvg3Kzypd8PXX|{sbg}rRZvbE) z4Zprv4yMzeTTssev;4ecJ;d;LUJkV=yV`g`#0inZez|`M`VT4~k2CZ4-D-~Ys|9el z{vWLS2_0YJ6wv<YPH}lP%iHnnH#^2b&l7mK<<}B@iw~41{?2fm56*XMGhSb)y>5-< zT>dA+(LK1i1$`m?;ePzsbzJUWy;D@6cWTM=c^%zi2@6qR8oNoOBpZK;l@wk|y8ZR? zpwodvkbwPX40u^E>CM9|G>fODxH@ZO0byk5ZrvR=g{48lXjDb8fA>+Ltr>h+yniNp z8Et+D$S9rhk@xN>$ZG#<q{99{)E~7HidBvmk6<yvfqOvP8<SxyTxs(+;e9Nh4-<oR z99G0137Rgsv2Dxw)Sv#K5smMTq4xlsn)-grg1~UGh^7j;IPV?A3nv>=WvR98{g*6k z{=RNi!I%6;7W^Jcuob8kYbxByLN_gYT>YIa>_|cfC=0ExFYHGMPQR|g{TQ_pw_X|o zkjXJG(C%cx^(V5c9_c3Z789^a1dVJ)huLSvQvkz9<EFPl25-X2*o^Bm`&%7j6<0m! zmY~SwOsUsIO9{Sc7~Ws}GCvw3@xn52dk4VnCA6b4duADUQ9J=6JFu*DCkuL(8EI45 zmf&2v91u1{B|<ntZ!=l6Y%8IU;K-^wBY3R<TK&*o;lU6fV^RBeQG%qn`5H2*-(If+ zBNcMr%~{+udWH=^7Km_S@c9^q!vR_7jsOoJE~YwtrW4`k0ci6mZ0<zx>`PI&1+KKo z(CR0!b156Wp*s(7dlAhNRzf@U*9MTuh1&F&91!#g7vya6%(@lX>;j<ral@(h5H7}P z>S6RTQ10aoq|C<>9{>pNy${(-`l+$7JP@F=@TD4B{iG1FLk%2I5D4jVpg8yls~7jq zfhiu6z@voMd57>1w|I;98+OYy5=Bm2aKI^Wox?H>D9zu8YEigAoo`hLebKnS)Buw` zq(;*OD~H&x39-ZYUrP1x6+oZZ>M2YxT9Dm#kGjZSqS`^d8<49>aq;g--V<i)XInvI z#p~vrvi+dNCR5BLd+&7j!+<a%lZ)CtG&>-k=Z^#9O}f3)F+@bTf3ns8TJ-<d4}KC6 ze!Cz2y7or(T^UExZ2z7AOZY|5KccTNgb9$`Vur%I)+99L`SG9jIKtot(E{+UmnvPp zAQ%vcJ`)$>i^S<S%K0Begap;6Gat4GVQp{3XL~;uPn8>Xgp$eO@8;^QAoz}ER_%SR zb>OQ>CDD4IRP4^M_U`kP&SLB64+Mlqb*#%Bez+u>;qH}OMrE`i-!IBOsmK2`G}+cG z#zVUzdz@IkHCmultT^EDac8{D8a?sC(C2HqpwPh=z|h3LNkHXrqkgIH<7BtNL#08_ zD@&sU`sY8;Q~4dzCSO;H8Z}xRtq!Jy-C`;|`B<THupm+Qvbp)y1zuETsOk%!tfR}m z9fJGMGPC+p;pq*{H9qBwFn`$+hk59=_to&tl?d&O5UkIrsGZA1u2G;%<+z$BG9jA* z3=C_Qls3=}SP9ili<<;^3EpVz?4y9;Bkw{%PK02uG&(!Znq(U*GEHV1s|tu~PVmmq zL|GDg?X7vWCW433x%N)iersJ&&-dy<%&kkdm?8xcsH1qVZ5AL+r@RGMoOI<9d@ zr8n$2>k=Js?i2;o&lO@{vw}rU^V3fHyOFuj#rZ|R8r~e1Ss?(k4iq*Ug3b+j&(T)! zUKW5R__uu6Dsp!HHYB(sIL|QzUp?s|LJ*(VyIsan{|zXXy&13&J8{Au0(Ef?V|jmM zHGO{TlM~FJp<{HG4^rOCy;CYNq#77m{U1?d>-EEO@ny;HO8?@FjqNqT(WxKQ0Vq9m zhA*)y9Sj8+x`&+zWRC`f`p2u}Sc>6P0{Om_e0cPU237rlpWv?%8?|E(-uK?YOt81u zph^3#@c<XqnEZ$GO>b&|esI|cW$JNM4Rg6QlnU&3Hh$n->PO=m=gz-4oy7Z_sPbQ* z0xRe#NC!mqGc=%qDE<N;hy{U=a7dpHCv#a5a2S6nsHE<COD^V1%24&b8YX7}8E~A* zl6c3e&>Jq}yzvPp;ilB|ssiBH3FGc3*T$@O!o%84>K0XRN%<rrV3AqI<_k-Se6Zf* zE1CqwsTbo%MFBj|UrQg*jB%<3Y*WDqA~P7WpYOXc@@a*~_iQuAw_EH8hF9Hz@*Pdb zr)krh5|YiVr$?J(<m;V>ybh*A-tZihejP&-$$2JapC(XOU_x#B6G+Fs^C(fX=DE*K z89FEdz1DuP)hvTkl$1wct>-nJp}wHo!Deg5fLs&=xpup&^82Y|e%h;xjY+pKsR$^Q z>X1lX<ks`?w%guU1<Q(7AG{TCNk`=C{AIcU0bH7bOgylz38_yS5$_N@o~FA9!R843 zvJsBc(sB^FaW{~6Sk^7;Uq1eAOu>lnZxBM~B)#yTiH7sUv{op1Tp59{e_Yw0_YS<s zN!&y5?sxAb)K5d_rP-^$lZu#>M5!`ooWJHfM(u?fmY<Npe=3QSybStma3pWGNImc$ z8UMT)cTl%FsJn~Bh|c?3zt<>4BD6^3@6rLPiGu*x6NGdN7)<=qL}X(>vu@=-ns^5^ z<g_e+_eH|SswO<N&jAp^0M@gR?JqwUpmf;&(lbVJw*f&YD{Sdc_}~@LAw8w!Hc&}q z9ifcd9xr-YZvC<Mg*9rDSU~6l))=T=+i20B9Kr663#)K~VMql7GXTZGl0T|DTm&11 zG2-jE(A55RfdOiM2Du#x>$HX3TiroUVI6Z|d?Qt?X*Ua5nF^Qk?YrCliFRY__+C$k z(kXtA4qq{q&16}`uRV|qMv?0aV5^XDzHM-jj^q7yz9qHsB73ox`qn!}q2cNzvC!b_ z6-%K1{$WRlCbNOCKg`g`&f-vM0_)Ds-g~fBA+{xSe6y+Z8WW9`#0yKbc7|aGL`b1H zj<%%l+A6cO3`1^CKoxvH(lQ&4V?qjmbEmRTg|U97H_<6$^@|K3sPb3f??xJ51qmT+ ztwsssFqpn&sH;hZVK7Zpk0ieKqmC7j;q#7rs*|uDr{mg_8|(h5f)s`gEea#fGH+&F zp!;+)L7ua1WFy9U(uz**!8I=yyTt-9zG3`0L(4TSj|}7pvNY@2fwTZ62A<9O!TVTE z#;xo)^KJUPch=im8L6&-IgwQ$BV%C!g8No(Va@DZQAxus<3r1ebpD-E-U;G|WleeS zcgmU(Qbx)lC^oy|o%pYItB{gHw}ivlAKHlyZu9Sbj5fb|Sn~x%y|ijx_IqjRvZ8=} z^}2D&?)xqM6x+rxEvU~M*9L74fbAc^R^i7vbnOBW7~cQ{aUe&aD**`NJV1vOOA0V~ z!qWm=U<fTrjy?mW!%-JS(4*sSngrY99{PMJLA-Vsz=L-IwhBOw064;ZEjbw!ynwD< zATpgo$2UNZKv#M?D$fJt2+C4SXXENx(3;-@x_05VcQyrdNRI?eZLT8)b}PgzCIEjY z48EN@=QDv_?-LB(rIHV>;|C?T&JlhyYt0v9c5)ov*h_FN7y|0G*8stiqU>@>Uf_um zEHZD~z?$l_$d?--sDnH}d$j|yg{F@EZAF>j$q*bmWWgJ+m}B2%`9MDN`+l_nwZ~YQ z0mY9)0+&kub&1A7z*d3fxggI*fgT_KTd1!bZPekVu$^3M_3D2jbz-j{pZ$k8EVSMN z4F?K%o?c}?waYTEF%D7=>&h_w5-KD!Rz#jt$+{Qx6$De8@O-IQaQ3=jpG6a?rN3LK zA|mZsVA2(7k{c*(d^+N}g)`#Jw2`QlH`re-hhzpk`S)1&6Q~cQ21EZVKwL^G|93LZ z2xZ$_GO;_*DO49Ce;}#m_WdN|s8Pwqb3t|CL%xy^#q%4|yRASpKNN|($q8K?bAaqe zfQ*Cu-1<5Qnk$LdTEhd*0@`uLUFm=>*nO(Do(Co;1opZO?kBz<Uul&uwklqo!^_t> zC>1jK&~o?J9m#h(kjbTo*JK*@CUOY5T<nvHcl&XLP3}gfSq+ghNs$leaQ<YMCL|Zn zPu4LsKKmIdlv(g}S!*3X?+-)qlOztyC@l9g6nX2bVI-5m774K|X9sWQqi<hvvxvBU zZL?c}8%i&`v^c<_acD<>e0qLKMi<25)pCA%1s_Zb*lhr-i)iXc_uXK*FQ?vs0hFmf zx^!ixAK}W!ML}Gb&8&ba!Gz^tI}!J`5PJRLPhJ<%o5osLP86$v4J0&jR9~({D%(i| z!@NXcQ6Ge6KgCEvTJ4EfCyD>w8F0y4i&tdR{!^VoO~)vD){~{!{y<Ir3usdSKbCpH zzw!)F;@7Ol+B~4Y!iO7`wUt7yp4vvluSS%~X72mmQ(|7LDzyy&a5(y`u%Z`#ZLlP@ zx#P~NNHMqaoH(X5ZJyw-4FCk#T#yM!@!uijjsv>X7=-?FffVAlKVA9C0=fZ!wwQGn zvZLtLTz_*w9RUugIY4xShHRz{`4nNh&{%E=(oo{AFQW#-@r*Z|<f~p?*$I=em&iE0 z%d}?}6XodT<`W(+jME=bf&jEzyhvP?%t-HxV8z)cWb{MsC|I|$MHsO~1w#461Fj6O z^`d4--BAFuSu<^3QM})JUp%EVN3G-WR37+_@#a6~LnZJkFMO~N8TZv?B4Ow5Xo1>L zr-*Jdp3C2iH}w-ul!jl7w--;ZoHkw{vi@PbEpxm|yW-F8_t4vs7?i=XpDIZp=q=0t zLo4JuK7o0F!@FXs{ss7US5&>5jn)RmcGu|8d5_toXCxc7?>6`Ty#WACtAXX46=(=q z4d<M+T#ewpbLKe*HUI=#PKJbpVQJT*gr9KIynFn_W$m4UXf;g?KR+KNR()lYCSG}? z?m>d~<mH1z@de8VNk+Zyw8>_pytFCCvOVU>%w>EQDXc9sxx#9L1$3#_j4$cZU!tHC zqy%PL<)oQ1CtK!34i>J*M4bmei2NI!r3UK>!Uu``5(xL70)hFTs6(v(1L`o86!?)q zP}Jcw0CfnECRBWNuQ296-2Jq9YG#sv2MK>jJ%_Q9)d``rnR38Ze~vOhcAXUt)hIcj z4JO+;)9LkB`l|P|?_881Pf}ZSUAUHczV=H$U#w+}KO!cr^fc$RGmB9MSUz#OqpOp` zJV7$egSKqRDCKYLB!}lq;W*p(b#aA`y^pLyn3E=ECu}sL*f;99BrfgscJ-$`qMdR4 z=RQvP&t(0B0j){l;dfXeexv`f2wy53Zob}wx_hvm)1mt%f3^IF=DU5(pH{MfJLKX} zYwHg$&<&!Y_aQp((klew%>^Iinl3}XhmVmcC6P5R-%8_aN*e{@QgvnpBELpj5uu8t zR}P_-b<Y$*sUoBZC1`M`3?*;5q!ee=3C@Wi-IvaJ%OiQZ>dW*mKqwEaD~K8NYtsFj zJPAC)g2OZc*WCrSRO#rIpCYIQJVLi!NHZAGK27{BJweMeH#<<B?E|H}REEQBK>PIL zO{HQsK3RZq*8HuizP9F&c@09-Wu9#I$K+``Dhy+J{9)OtvM;g+UZS<L7rcwJkSfz{ z&W_=JE()$ie;@le439}H<$!i`{^5mAf2jJ%jat3yLO@3_i%So&hLK?#I;wM`{L5ow z`wc2ZJT#)^As8A#cUBSDg0`?^BBy;%Vlw4_ffgSYczm3n6t;<_>?)DOc5HvIN1f16 zdr-}#hgtB8!Fy%ba&`4Q1)MnH^7~h`%H1S8?oIjUHP#6{7rI9yZ?qI;62W>`RPDUr zA+!O%e}T=rBJ2-+lT`22UmWp7-637QN4;}0oY8CCw8Wc6J}x;whKbL5&Qx`=V$H^A zX&mvrEg0~;-LJdn@-GA^6RaHo0Hyr*yTB#){2EEt=!QZq=^12CR{vt3#v1Q3lB~{c z2~z4;=eTmm&&HLhq7e-pMIcmRc$e0fu$hi7&FZ|~or1vdB;}4~`Q%vx9uPrslZBqQ zr*>sB`Y|fcTt5R~x`5<C0Lgm+nT%jvRCwAKzsnVG@j$UzxOP8)8C-=<NTju_j^Pak z@54r>)CawG+@`r>=nmb;kOyNpu4M8dCbCury$uoRXO7@MlP4AFNnqG1Q3)jdKrGRT z9OD|1YBr7>fbsj=Zf=h7IBqWkzU|*%_7Ri5=W;{hKVNpRn$Fuf$J{^K_i=00(ODc( zF;#4)SaaeVp_iak;BQi^zE>f-shY?Qk$ReV9i?=dB(|(2seg?2rfL9^ePWhBxsLm? zBo%Fea)@x+W#+%w#gwo{z`y<%<+4eRC-Y~X;u#c4%pQP6jq<Z7+!`H->HdYm1zYTs zNrj*Rq+-~8VqVu>MN!jBTVdFE>ZzpIkf@C&IONn|xcr!}B7h8GFj=cp@ZZT01?N}A zbOvZm_(C);S4%0+6G~iVU<wJ8xN=ztsC8g*fqBUBFsRY}U~t_$a(*^o)B4@vQX5=I zGW;!DC$YQtzXA);bSXDkB{u73D^?LtWwn~>zPj#8wj20`!Htz`1wY-1OmqVMgI>*U zaAVQU{|CKFyua4_s)~dGjg-%(-G5J~%2k2xe9gNp#LvoOqDbf7kcm>=Oj_f>Zj0Qj z9_=UJBHtvfExwdQr@ya+K<=*Uiy~W1;)8Jg)zAj5=JSXjTCe}IH@vE)VNluwB;!D8 zr)l*71rg4FqoOHb4M4acqM!fnCKBN&ZxGN@X4Flz2S(^{i=|*5iYbs77MX0*ImS#y zIPsLscP�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%0D5tOoiL(*(xkheb51S>Jyq( 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 V6@AeeeGSqe4I9nTz7Y@r06QZgj+g)d diff --git a/docs/source/guides/getting-started/index.rst b/docs/source/guides/getting-started/index.rst deleted file mode 100644 index dd210be60..000000000 --- a/docs/source/guides/getting-started/index.rst +++ /dev/null @@ -1,123 +0,0 @@ -Getting Started -=============== - -.. toctree:: - :hidden: - - installing-reactpy - running-reactpy - -.. dropdown:: :octicon:`bookmark-fill;2em` What You'll Learn - :color: info - :animate: fade-in - :open: - - .. grid:: 1 2 2 2 - - .. grid-item-card:: :octicon:`tools` Installing ReactPy - :link: installing-reactpy - :link-type: doc - - Learn how ReactPy can be installed in a variety of different ways - with - different web servers and even in different frameworks. - - .. grid-item-card:: :octicon:`play` Running ReactPy - :link: running-reactpy - :link-type: doc - - See how ReactPy can be run with a variety of different production servers or be - added to existing applications. - -The fastest way to get started with ReactPy is to try it out in a `Juptyer Notebook -<https://mybinder.org/v2/gh/reactive-python/reactpy-jupyter/main?urlpath=lab/tree/notebooks/introduction.ipynb>`__. -If you want to use a Notebook to work through the examples shown in this documentation, -you'll need to replace calls to ``reactpy.run(App)`` with a line at the end of each cell -that constructs the ``App()`` in question. If that doesn't make sense, the introductory -notebook linked below will demonstrate how to do this: - -.. card:: - :link: https://mybinder.org/v2/gh/reactive-python/reactpy-jupyter/main?urlpath=lab/tree/notebooks/introduction.ipynb - - .. image:: _static/reactpy-in-jupyterlab.gif - :scale: 72% - :align: center - - -Section 1: Installing ReactPy ------------------------------ - -The next fastest option is to install ReactPy along with a supported server (like -``starlette``) with ``pip``: - -.. code-block:: bash - - pip install "reactpy[starlette]" - -To check that everything is working you can run the sample application: - -.. code-block:: bash - - python -c "import reactpy; reactpy.run(reactpy.sample.SampleApp)" - -.. note:: - - This launches a simple development server which is good enough for testing, but - probably not what you want to use in production. When deploying in production, - there's a number of different ways of :ref:`running ReactPy <Section 2: Running ReactPy>`. - -You should then see a few log messages: - -.. code-block:: text - - 2022-03-27T11:58:59-0700 | WARNING | You are running a development server. Change this before deploying in production! - 2022-03-27T11:58:59-0700 | INFO | Running with 'Starlette' at http://127.0.0.1:8000 - -The second log message includes a URL indicating where you should go to view the app. -That will usually be http://127.0.0.1:8000. Once you go to that URL you should see -something like this: - -.. card:: - - .. reactpy-view:: _examples/sample_app - -If you get a ``RuntimeError`` similar to the following: - -.. code-block:: text - - Found none of the following builtin server implementations... - -Then be sure you run ``pip install "reactpy[starlette]"`` instead of just ``reactpy``. For -anything else, report your issue in ReactPy's :discussion-type:`discussion forum -<problem>`. - -.. card:: - :link: installing-reactpy - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Learn how ReactPy can be installed in a variety of different ways - with different web - servers and even in different frameworks. - - -Section 2: Running ReactPy --------------------------- - -Once you've :ref:`installed ReactPy <Installing ReactPy>`, you'll want to learn how to run an -application. Throughout most of the examples in this documentation, you'll see the -:func:`~reactpy.backend.utils.run` function used. While it's convenient tool for -development it shouldn't be used in production settings - it's slow, and could leak -secrets through debug log messages. - -.. reactpy:: _examples/hello_world - -.. card:: - :link: running-reactpy - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - See how ReactPy can be run with a variety of different production servers or be - added to existing applications. diff --git a/docs/source/guides/getting-started/installing-reactpy.rst b/docs/source/guides/getting-started/installing-reactpy.rst deleted file mode 100644 index 0b2ffc28a..000000000 --- a/docs/source/guides/getting-started/installing-reactpy.rst +++ /dev/null @@ -1,121 +0,0 @@ -Installing ReactPy -================== - -You will typically ``pip`` install ReactPy to alongside one of it's natively supported -backends. For example, if we want to run ReactPy using the `Starlette -<https://www.starlette.io/>`__ backend you would run - -.. code-block:: bash - - pip install "reactpy[starlette]" - -If you want to install a "pure" version of ReactPy **without a backend implementation** -you can do so without any installation extras. You might do this if you wanted to -:ref:`use a custom backend <using a custom backend>` or if you wanted to manually pin -the dependencies for your chosen backend: - -.. code-block:: bash - - pip install reactpy - - -Native Backends ---------------- - -ReactPy includes built-in support for a variety backend implementations. To install the -required dependencies for each you should substitute ``starlette`` from the ``pip -install`` command above with one of the options below: - -- ``fastapi`` - https://fastapi.tiangolo.com -- ``flask`` - https://palletsprojects.com/p/flask/ -- ``sanic`` - https://sanicframework.org -- ``starlette`` - https://www.starlette.io/ -- ``tornado`` - https://www.tornadoweb.org/en/stable/ - -If you need to, you can install more than one option by separating them with commas: - -.. code-block:: bash - - pip install "reactpy[fastapi,flask,sanic,starlette,tornado]" - -Once this is complete you should be able to :ref:`run ReactPy <Running ReactPy>` with your -chosen implementation. - - -Other Backends --------------- - -While ReactPy can run in a variety of contexts, sometimes frameworks require extra work in -order to integrate with them. In these cases, the ReactPy team distributes bindings for -those frameworks as separate Python packages. For documentation on how to install and -run ReactPy in these supported frameworks, follow the links below: - -.. raw:: html - - <style> - .card-logo-image { - display: flex; - justify-content: center; - align-content: center; - padding: 10px; - background-color: var(--color-background-primary); - border: 2px solid var(--color-background-border); - } - - .transparent-text-color { - color: transparent; - } - </style> - -.. role:: transparent-text-color - -.. We add transparent-text-color to the text so it's not visible, but it's still -.. searchable. - -.. grid:: 3 - - .. grid-item-card:: - :link: https://github.com/reactive-python/reactpy-django - :img-background: _static/logo-django.svg - :class-card: card-logo-image - - :transparent-text-color:`Django` - - .. grid-item-card:: - :link: https://github.com/reactive-python/reactpy-jupyter - :img-background: _static/logo-jupyter.svg - :class-card: card-logo-image - - :transparent-text-color:`Jupyter` - - .. grid-item-card:: - :link: https://github.com/reactive-python/reactpy-dash - :img-background: _static/logo-plotly.svg - :class-card: card-logo-image - - :transparent-text-color:`Plotly Dash` - - -For Development ---------------- - -If you want to contribute to the development of ReactPy or modify it, you'll want to -install a development version of ReactPy. This involves cloning the repository where ReactPy's -source is maintained, and setting up a :ref:`development environment`. From there you'll -be able to modifying ReactPy's source code and :ref:`run its tests <Running The Tests>` to -ensure the modifications you've made are backwards compatible. If you want to add a new -feature to ReactPy you should write your own test that validates its behavior. - -If you have questions about how to modify ReactPy or help with its development, be sure to -:discussion:`start a discussion <new?category=question>`. The ReactPy team are always -excited to :ref:`welcome <everyone can contribute>` new contributions and contributors -of all kinds - -.. card:: - :link: /about/contributor-guide - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Learn more about how to contribute to the development of ReactPy. diff --git a/docs/source/guides/getting-started/running-reactpy.rst b/docs/source/guides/getting-started/running-reactpy.rst deleted file mode 100644 index 8abbd574f..000000000 --- a/docs/source/guides/getting-started/running-reactpy.rst +++ /dev/null @@ -1,221 +0,0 @@ -Running ReactPy -=============== - -The simplest way to run ReactPy is with the :func:`~reactpy.backend.utils.run` function. This -is the method you'll see used throughout this documentation. However, this executes your -application using a development server which is great for testing, but probably not what -if you're :ref:`deploying in production <Running ReactPy in Production>`. Below are some -more robust and performant ways of running ReactPy with various supported servers. - - -Running ReactPy in Production ------------------------------ - -The first thing you'll need to do if you want to run ReactPy in production is choose a -backend implementation and follow its documentation on how to create and run an -application. This is the backend :ref:`you probably chose <Native Backends>` when -installing ReactPy. Then you'll need to configure that application with an ReactPy view. We -show the basics of how to set up, and then run, each supported backend below, but all -implementations will follow a pattern similar to the following: - -.. code-block:: - - from my_chosen_backend import Application - - from reactpy import component, html - from reactpy.backend.my_chosen_backend import configure - - - @component - def HelloWorld(): - return html.h1("Hello, world!") - - - app = Application() - configure(app, HelloWorld) - -You'll then run this ``app`` using an `ASGI <https://asgi.readthedocs.io/en/latest/>`__ -or `WSGI <https://wsgi.readthedocs.io/>`__ server from the command line. - - -Running with `FastAPI <https://fastapi.tiangolo.com>`__ -....................................................... - -.. reactpy:: _examples/run_fastapi - -Then assuming you put this in ``main.py``, you can run the ``app`` using the `Uvicorn -<https://www.uvicorn.org/>`__ ASGI server: - -.. code-block:: bash - - uvicorn main:app - - -Running with `Flask <https://palletsprojects.com/p/flask/>`__ -............................................................. - -.. reactpy:: _examples/run_flask - -Then assuming you put this in ``main.py``, you can run the ``app`` using the `Gunicorn -<https://gunicorn.org/>`__ WSGI server: - -.. code-block:: bash - - gunicorn main:app - - -Running with `Sanic <https://sanicframework.org>`__ -................................................... - -.. reactpy:: _examples/run_sanic - -Then assuming you put this in ``main.py``, you can run the ``app`` using Sanic's builtin -server: - -.. code-block:: bash - - sanic main.app - - -Running with `Starlette <https://www.starlette.io/>`__ -...................................................... - -.. reactpy:: _examples/run_starlette - -Then assuming you put this in ``main.py``, you can run the application using the -`Uvicorn <https://www.uvicorn.org/>`__ ASGI server: - -.. code-block:: bash - - uvicorn main:app - - -Running with `Tornado <https://www.tornadoweb.org/en/stable/>`__ -................................................................ - -.. reactpy:: _examples/run_tornado - -Tornado is run using it's own builtin server rather than an external WSGI or ASGI -server. - - -Running ReactPy in Debug Mode ------------------------------ - -ReactPy provides a debug mode that is turned off by default. This can be enabled when you -run your application by setting the ``REACTPY_DEBUG_MODE`` environment variable. - -.. tab-set:: - - .. tab-item:: Unix Shell - - .. code-block:: - - export REACTPY_DEBUG_MODE=1 - python my_reactpy_app.py - - .. tab-item:: Command Prompt - - .. code-block:: text - - set REACTPY_DEBUG_MODE=1 - python my_reactpy_app.py - - .. tab-item:: PowerShell - - .. code-block:: powershell - - $env:REACTPY_DEBUG_MODE = "1" - python my_reactpy_app.py - -.. danger:: - - Leave debug mode off in production! - -Among other things, running in this mode: - -- Turns on debug log messages -- Adds checks to ensure the :ref:`VDOM` spec is adhered to -- Displays error messages that occur within your app - -Errors will be displayed where the uppermost component is located in the view: - -.. reactpy:: _examples/debug_error_example - - -Backend Configuration Options ------------------------------ - -ReactPy's various backend implementations come with ``Options`` that can be passed to their -respective ``configure()`` functions in the following way: - -.. code-block:: - - from reactpy.backend.<implementation> import configure, Options - - configure(app, MyComponent, Options(...)) - -To learn more read about the options for your chosen backend ``<implementation>``: - -- :class:`reactpy.backend.fastapi.Options` -- :class:`reactpy.backend.flask.Options` -- :class:`reactpy.backend.sanic.Options` -- :class:`reactpy.backend.starlette.Options` -- :class:`reactpy.backend.tornado.Options` - - -Embed in an Existing Webpage ----------------------------- - -ReactPy provides a Javascript client called ``@reactpy/client`` that can be used to embed -ReactPy views within an existing applications. This is actually how the interactive -examples throughout this documentation have been created. You can try this out by -embedding one the examples from this documentation into your own webpage: - -.. tab-set:: - - .. tab-item:: HTML - - .. literalinclude:: _static/embed-doc-ex.html - :language: html - - .. tab-item:: ▶️ Result - - .. raw:: html - :file: _static/embed-doc-ex.html - -.. note:: - - For more information on how to use the client see the :ref:`Javascript API` - reference. Or if you need to, your can :ref:`write your own backend implementation - <writing your own backend>`. - -As mentioned though, this is connecting to the server that is hosting this -documentation. If you want to connect to a view from your own server, you'll need to -change the URL above to one you provide. One way to do this might be to add to an -existing application. Another would be to run ReactPy in an adjacent web server instance -that you coordinate with something like `NGINX <https://www.nginx.com/>`__. For the sake -of simplicity, we'll assume you do something similar to the following in an existing -Python app: - -.. tab-set:: - - .. tab-item:: main.py - - .. literalinclude:: _static/embed-reactpy-view/main.py - :language: python - - .. tab-item:: index.html - - .. literalinclude:: _static/embed-reactpy-view/index.html - :language: html - -After running ``python main.py``, you should be able to navigate to -``http://127.0.0.1:8000/index.html`` and see: - -.. card:: - :text-align: center - - .. image:: _static/embed-reactpy-view/screenshot.png - :width: 500px - diff --git a/docs/source/guides/managing-state/combining-contexts-and-reducers/index.rst b/docs/source/guides/managing-state/combining-contexts-and-reducers/index.rst deleted file mode 100644 index b9f274f0a..000000000 --- a/docs/source/guides/managing-state/combining-contexts-and-reducers/index.rst +++ /dev/null @@ -1,6 +0,0 @@ -Combining Contexts and Reducers 🚧 -================================== - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/managing-state/deeply-sharing-state-with-contexts/index.rst b/docs/source/guides/managing-state/deeply-sharing-state-with-contexts/index.rst deleted file mode 100644 index 4a00caa48..000000000 --- a/docs/source/guides/managing-state/deeply-sharing-state-with-contexts/index.rst +++ /dev/null @@ -1,6 +0,0 @@ -Deeply Sharing State with Contexts 🚧 -===================================== - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/managing-state/how-to-structure-state/index.rst b/docs/source/guides/managing-state/how-to-structure-state/index.rst deleted file mode 100644 index 5092370a5..000000000 --- a/docs/source/guides/managing-state/how-to-structure-state/index.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _Structuring Your State: - -How to Structure State 🚧 -========================= - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/managing-state/index.rst b/docs/source/guides/managing-state/index.rst deleted file mode 100644 index 0578bafdd..000000000 --- a/docs/source/guides/managing-state/index.rst +++ /dev/null @@ -1,127 +0,0 @@ -Managing State -============== - -.. toctree:: - :hidden: - - how-to-structure-state/index - sharing-component-state/index - when-and-how-to-reset-state/index - simplifying-updates-with-reducers/index - deeply-sharing-state-with-contexts/index - combining-contexts-and-reducers/index - -.. dropdown:: :octicon:`bookmark-fill;2em` What You'll Learn - :color: info - :animate: fade-in - :open: - - .. grid:: 1 2 2 2 - - .. grid-item-card:: :octicon:`organization` How to Structure State - :link: how-to-structure-state/index - :link-type: doc - - Make it easy to reason about your application with strategies for organizing - state. - - .. grid-item-card:: :octicon:`link` Sharing Component State - :link: sharing-component-state/index - :link-type: doc - - Allow components to vary vary together, by lifting state into common - parents. - - .. grid-item-card:: :octicon:`light-bulb` When and How to Reset State - :link: when-and-how-to-reset-state/index - :link-type: doc - - Control if and how state is preserved by understanding it's relationship to - the "UI tree". - - .. grid-item-card:: :octicon:`plug` Simplifying Updates with Reducers - :link: simplifying-updates-with-reducers/index - :link-type: doc - - Consolidate state update logic outside your component in a single function, - called a “reducer". - - .. grid-item-card:: :octicon:`broadcast` Deeply Sharing State with Contexts - :link: deeply-sharing-state-with-contexts/index - :link-type: doc - - Instead of passing shared state down deep component trees, bring state into - "contexts" instead. - - .. grid-item-card:: :octicon:`rocket` Combining Contexts and Reducers - :link: combining-contexts-and-reducers/index - :link-type: doc - - You can combine reducers and context together to manage state of a complex - screen. - - -Section 1: How to Structure State ---------------------------------- - -.. note:: - - Under construction 🚧 - - -Section 2: Shared Component State ---------------------------------- - -Sometimes, you want the state of two components to always change together. To do it, -remove state from both of them, move it to their closest common parent, and then pass it -down to them via props. This is known as “lifting state up”, and it’s one of the most -common things you will do writing code with ReactPy. - -In the example below the search input and the list of elements below share the same -state, the state represents the food name. Note how the component ``Table`` gets called -at each change of state. The component is observing the state and reacting to state -changes automatically, just like it would do in React. - -.. reactpy:: sharing-component-state/_examples/synced_inputs - -.. card:: - :link: sharing-component-state/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Allow components to vary vary together, by lifting state into common parents. - - -Section 3: When and How to Reset State --------------------------------------- - -.. note:: - - Under construction 🚧 - - -Section 4: Simplifying Updates with Reducers --------------------------------------------- - -.. note:: - - Under construction 🚧 - - -Section 5: Deeply Sharing State with Contexts ---------------------------------------------- - -.. note:: - - Under construction 🚧 - - - -Section 6: Combining Contexts and Reducers ------------------------------------------- - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/managing-state/sharing-component-state/_examples/filterable_list/data.json b/docs/source/guides/managing-state/sharing-component-state/_examples/filterable_list/data.json deleted file mode 100644 index f977fe9a7..000000000 --- a/docs/source/guides/managing-state/sharing-component-state/_examples/filterable_list/data.json +++ /dev/null @@ -1,22 +0,0 @@ -[ - { - "name": "Sushi", - "description": "Sushi is a traditional Japanese dish of prepared vinegared rice" - }, - { - "name": "Dal", - "description": "The most common way of preparing dal is in the form of a soup to which onions, tomatoes and various spices may be added" - }, - { - "name": "Pierogi", - "description": "Pierogi are filled dumplings made by wrapping unleavened dough around a savoury or sweet filling and cooking in boiling water" - }, - { - "name": "Shish Kebab", - "description": "Shish kebab is a popular meal of skewered and grilled cubes of meat" - }, - { - "name": "Dim sum", - "description": "Dim sum is a large range of small dishes that Cantonese people traditionally enjoy in restaurants for breakfast and lunch" - } -] diff --git a/docs/source/guides/managing-state/sharing-component-state/_examples/filterable_list/main.py b/docs/source/guides/managing-state/sharing-component-state/_examples/filterable_list/main.py deleted file mode 100644 index ca68aedcb..000000000 --- a/docs/source/guides/managing-state/sharing-component-state/_examples/filterable_list/main.py +++ /dev/null @@ -1,44 +0,0 @@ -import json -from pathlib import Path - -from reactpy import component, hooks, html, run - -HERE = Path(__file__) -DATA_PATH = HERE.parent / "data.json" -food_data = json.loads(DATA_PATH.read_text()) - - -@component -def FilterableList(): - value, set_value = hooks.use_state("") - return html.p(Search(value, set_value), html.hr(), Table(value, set_value)) - - -@component -def Search(value, set_value): - def handle_change(event): - set_value(event["target"]["value"]) - - return html.label( - "Search by Food Name: ", - html.input({"value": value, "on_change": handle_change}), - ) - - -@component -def Table(value, set_value): - rows = [] - for row in food_data: - name = html.td(row["name"]) - descr = html.td(row["description"]) - tr = html.tr(name, descr, value) - if not value: - rows.append(tr) - elif value.lower() in row["name"].lower(): - rows.append(tr) - headers = html.tr(html.td(html.b("name")), html.td(html.b("description"))) - table = html.table(html.thead(headers), html.tbody(rows)) - return table - - -run(FilterableList) diff --git a/docs/source/guides/managing-state/sharing-component-state/_examples/synced_inputs/main.py b/docs/source/guides/managing-state/sharing-component-state/_examples/synced_inputs/main.py deleted file mode 100644 index e8bcdf333..000000000 --- a/docs/source/guides/managing-state/sharing-component-state/_examples/synced_inputs/main.py +++ /dev/null @@ -1,23 +0,0 @@ -from reactpy import component, hooks, html, run - - -@component -def SyncedInputs(): - value, set_value = hooks.use_state("") - return html.p( - Input("First input", value, set_value), - Input("Second input", value, set_value), - ) - - -@component -def Input(label, value, set_value): - def handle_change(event): - set_value(event["target"]["value"]) - - return html.label( - label + " ", html.input({"value": value, "on_change": handle_change}) - ) - - -run(SyncedInputs) diff --git a/docs/source/guides/managing-state/sharing-component-state/index.rst b/docs/source/guides/managing-state/sharing-component-state/index.rst deleted file mode 100644 index 54b61335a..000000000 --- a/docs/source/guides/managing-state/sharing-component-state/index.rst +++ /dev/null @@ -1,38 +0,0 @@ -Sharing Component State -======================= - -.. note:: - - Parts of this document are still under construction 🚧 - -Sometimes, you want the state of two components to always change together. To do it, -remove state from both of them, move it to their closest common parent, and then pass it -down to them via props. This is known as “lifting state up”, and it’s one of the most -common things you will do writing code with ReactPy. - - -Synced Inputs -------------- - -In the code below the two input boxes are synchronized, this happens because they share -state. The state is shared via the parent component ``SyncedInputs``. Check the ``value`` -and ``set_value`` variables. - -.. reactpy:: _examples/synced_inputs - - -Filterable List ----------------- - -In the example below the search input and the list of elements below share the -same state, the state represents the food name. - -Note how the component ``Table`` gets called at each change of state. The -component is observing the state and reacting to state changes automatically, -just like it would do in React. - -.. reactpy:: _examples/filterable_list - -.. note:: - - Try typing a food name in the search bar. diff --git a/docs/source/guides/managing-state/simplifying-updates-with-reducers/index.rst b/docs/source/guides/managing-state/simplifying-updates-with-reducers/index.rst deleted file mode 100644 index 08fce5a69..000000000 --- a/docs/source/guides/managing-state/simplifying-updates-with-reducers/index.rst +++ /dev/null @@ -1,6 +0,0 @@ -Simplifying Updates with Reducers 🚧 -==================================== - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/managing-state/when-and-how-to-reset-state/index.rst b/docs/source/guides/managing-state/when-and-how-to-reset-state/index.rst deleted file mode 100644 index 6a96f4b30..000000000 --- a/docs/source/guides/managing-state/when-and-how-to-reset-state/index.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _When to Reset State: - -When and How to Reset State 🚧 -============================== - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/understanding-reactpy/_static/idom-flow-diagram.svg b/docs/source/guides/understanding-reactpy/_static/idom-flow-diagram.svg deleted file mode 100644 index 9077913ca..000000000 --- a/docs/source/guides/understanding-reactpy/_static/idom-flow-diagram.svg +++ /dev/null @@ -1,383 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="680" - height="580" - viewBox="-0.5 -0.5 680 580" - content="<mxfile host="app.diagrams.net" modified="2020-09-07T18:34:20.858Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36" etag="IvUE9xI9CxZQnD7O0sJm" version="13.6.6" type="device"><diagram id="3GUrj3vU2Wc3lj3yRkW7" name="Page-1">7Zpdb9owFIZ/DZetkrgEuCy027R1XSWkddqdiU8Sqw5mjvnar5+d2CEhFEpbPkZBlUqO7WP7+D0PdpIG6iWzzwKP4u+cAGt4Dpk10E3D89wrz2voP4fMc0sLdXJDJCgxlRaGPv0Lxtg01jElkFYqSs6ZpKOqMeDDIQSyYsNC8Gm1WshZtdcRjqBm6AeY1a2PlMg4t7abzsL+BWgU255dx5Qk2FY2hjTGhE9LJnTbQD3Bucy/JbMeMB08G5e83adnSouBCRjKlzTAv+WFQ760viXebfT49/4J/cIXfu5lgtnYTLjh+Uz564ZcuVUBw0Fe4P8Z65F2e3wsKAhVdA/ThVlPUM5Zta72cZFma3qtKqjRzsot/Mj8zzocWMMdnvOxtGY1ocFyVWXLh2fNXqV7T/DxkICet6uKpzGV0B/lE5kqmSpbLBNmikPKWI8zLrK2iGBoh4Gyp1LwJyiV+EEbBmFRYuWAihFMQEiYPbs8brHoKluAJyDFXFUxDTzX6MQkim8upwvVFckUlxRn62Ej9KjwvNCC+mLksIU0WkcojRuajrAMYt3Jx5ZHcX0wfbSPUB+PoL46fRCTs0LQwQnSOUKF9BiF4dofl4H4iGppHpwn7iqgLEUahuRab+rUVcBwmtKgGtxqqJr1cINLmtBaFe6O30LYL4ILpLYv3BjaUujs/rAcOWsTwLCkk6r7VeE0PTxwmmXLbGml5naVllYkVUkUgGlV3hBucFRcW0cSiwhkzVG2usW037DgG/mwddJvQZQ8l7/2f9yrsge9qXhpumtp3OGBOuhUtIcZjYZamEomqkPU1flJ1Uni2hQklBDtoytAzQAPMn+Ouh7pCGcxb3YbzRtlYdp9FwdPUcaWkkw/ZZ91DDAnIeN/cf4oC3hNAj5LDOfSayNUUYz7NkEbLxduq9qEh2EKO5GcHdyZMdsxxmu9E2PQ8s/Hjhlj1/fMmNcwRg/R3JLxnJ0wZ8MuZYfMQXtjDjoz5zXMcd9rX+PteV/jXR2eOT9vfnw/s2ZVIp42a1Ztqd+bNWEIfrDyyEpanYHj/AesQWgDIl7KmmVHNWjtmDW2+8Pub1TJ7aR6W+VMnCId90+c/QEH7eNAdYLAqZ2DXguc2sls18A5igPVGTjr0vGkgbOP09QJAqd2c/e1wKndbt41cI7gNHUGzvp0PGXgXG3cYW+rpkcYpDx4gkJM2z9xzNb+gadUUq5lI3J+FPpiEMqVoEtjPNI+klmk39e6TNRAxqPLBAv9LxgLNu+KbD4VYNpXl7SICE7j7GGns/J2U/bR1ahQisqHp1ijR/Cukn35o07fvku2TLANJO5s/6RTXS5e6MoVuHgtDt3+Aw==</diagram></mxfile>" - id="svg4818" - sodipodi:docname="reactpy-flow-diagram.svg" - inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> - <metadata - id="metadata4822"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1016" - id="namedview4820" - showgrid="true" - inkscape:zoom="1.1798897" - inkscape:cx="295.35891" - inkscape:cy="286.00243" - inkscape:window-x="0" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="svg4818" - showguides="false" - inkscape:snap-object-midpoints="false" - inkscape:snap-bbox="true" - inkscape:snap-center="false" - inkscape:snap-text-baseline="true"> - <inkscape:grid - type="xygrid" - id="grid4962" - spacingx="10" - spacingy="10" /> - </sodipodi:namedview> - <defs - id="defs4706"> - <marker - inkscape:stockid="Arrow2Mend" - orient="auto" - refY="0" - refX="0" - id="marker5531" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5529" - style="fill:#000000;fill-opacity:0.96568627;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:0.96568627" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="scale(-0.6)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow2Mend" - orient="auto" - refY="0" - refX="0" - id="marker5527" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5525" - style="fill:#000000;fill-opacity:0.96568627;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:0.96568627" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="scale(-0.6)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow2Mend" - orient="auto" - refY="0" - refX="0" - id="marker5523" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5521" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="scale(-0.6)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow2Mend" - orient="auto" - refY="0" - refX="0" - id="Arrow2Mend" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5224" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="scale(-0.6)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow1Mend" - orient="auto" - refY="0" - refX="0" - id="Arrow1Mend" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5206" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" - transform="matrix(-0.4,0,0,-0.4,-4,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0" - refX="0" - id="marker5513" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5511" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" - transform="matrix(-0.8,0,0,-0.8,-10,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0" - refX="0" - id="marker5509" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5507" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" - transform="matrix(-0.8,0,0,-0.8,-10,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0" - refX="0" - id="Arrow1Lend" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5200" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:0.96568627;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:0.96568627" - transform="matrix(-0.8,0,0,-0.8,-10,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow1Lstart" - orient="auto" - refY="0" - refX="0" - id="Arrow1Lstart" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5197" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:0.96568627;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:0.96568627" - transform="matrix(0.8,0,0,0.8,10,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0" - refX="0" - id="Arrow1Lend-9" - style="overflow:visible" - inkscape:isstock="true"> - <path - inkscape:connector-curvature="0" - id="path5200-3" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:0.96568627;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:0.96568627" - transform="matrix(-0.8,0,0,-0.8,-10,0)" /> - </marker> - </defs> - <rect - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:5.73294544;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect1077" - width="680" - height="580" - x="-0.5" - y="-0.5" /> - <rect - style="opacity:1;fill:#9fa8da;fill-opacity:0.99607843;stroke:none;stroke-width:13;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4966" - width="600" - height="200" - x="39.5" - y="39.5" - ry="20" /> - <g - id="g5077" - transform="translate(30,40)"> - <g - id="g5106" - style="opacity:1"> - <rect - style="opacity:1;fill:#4052b5;fill-opacity:1;stroke:none;stroke-width:13;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect5002-9" - width="200" - height="100" - x="59.5" - y="49.5" - ry="20" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - x="109.5" - y="109.5" - id="text5072"><tspan - sodipodi:role="line" - id="tspan5070" - x="109.5" - y="109.5" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace;fill:#ffffff;fill-opacity:1">layout</tspan></text> - </g> - </g> - <g - transform="translate(330,40)" - id="g5077-0"> - <rect - ry="20" - y="49.5" - x="59.5" - height="100" - width="200" - id="rect5002-9-9" - style="opacity:1;fill:#4052b5;fill-opacity:1;stroke:none;stroke-width:13;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <text - id="text5072-2" - y="109.5" - x="89.5" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - xml:space="preserve"><tspan - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace;fill:#ffffff;fill-opacity:1" - y="109.5" - x="89.5" - id="tspan5070-5" - sodipodi:role="line">component</tspan></text> - </g> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none" - x="49.5" - y="69.5" - id="text5110"><tspan - sodipodi:role="line" - id="tspan5108" - x="49.5" - y="69.5" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;font-family:monospace;-inkscape-font-specification:monospace;fill:#ffffff;fill-opacity:1">server</tspan></text> - <rect - style="opacity:1;fill:#9fa8da;fill-opacity:0.99607843;stroke:none;stroke-width:13;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4966-5" - width="600" - height="200" - x="39.5" - y="339.5" - ry="20" /> - <g - transform="translate(180,350)" - id="g5077-0-2"> - <rect - ry="20" - y="49.5" - x="59.5" - height="100" - width="200" - id="rect5002-9-9-4" - style="opacity:1;fill:#4052b5;fill-opacity:1;stroke:none;stroke-width:13;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <text - id="text5072-2-7" - y="109.5" - x="129.5" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - xml:space="preserve"><tspan - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace;fill:#ffffff;fill-opacity:1" - y="109.5" - x="129.5" - id="tspan5070-5-7" - sodipodi:role="line">view</tspan></text> - </g> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none" - x="49.817509" - y="370.17709" - id="text5110-5"><tspan - sodipodi:role="line" - id="tspan5108-4" - x="49.817509" - y="370.17709" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;font-family:monospace;-inkscape-font-specification:monospace;fill:#ffffff;fill-opacity:1">client</tspan></text> - <path - style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5523)" - d="m 359.5,399.5 130,-210" - id="path5179" - inkscape:connector-type="polyline" - inkscape:connector-curvature="0" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)" - d="m 389.5,139.5 h -100" - id="path5181" - inkscape:connector-type="polyline" - inkscape:connector-curvature="0" /> - <path - style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.29999995;stroke-dasharray:none;stroke-opacity:0.96568627;marker-end:url(#marker5527)" - d="m 189.5,189.5 130,210" - id="path5183" - inkscape:connector-type="polyline" - inkscape:connector-curvature="0" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.99516913;stroke:none" - x="439.5" - y="299.5" - id="text5535"><tspan - sodipodi:role="line" - id="tspan5533" - x="439.5" - y="299.5" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace;fill:#000000;fill-opacity:0.99516913">event</tspan></text> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - x="89.5" - y="299.5" - id="text5535-8"><tspan - sodipodi:role="line" - id="tspan5533-0" - x="89.5" - y="299.5" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace;fill:#000000;fill-opacity:1">VDOM diff</tspan></text> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.98067633;stroke:none" - x="309.5" - y="189.5" - id="text5535-8-2"><tspan - sodipodi:role="line" - id="tspan5533-0-1" - x="309.5" - y="189.5" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace;fill:#000000;fill-opacity:0.98067633">VDOM</tspan></text> -</svg> diff --git a/docs/source/guides/understanding-reactpy/_static/live-examples-in-docs.gif b/docs/source/guides/understanding-reactpy/_static/live-examples-in-docs.gif deleted file mode 100644 index 96a04d68ba0480c5614acece7994c744b21382c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182779 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�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 F4FKDfr|$p& diff --git a/docs/source/guides/understanding-reactpy/_static/mvc-flow-diagram.svg b/docs/source/guides/understanding-reactpy/_static/mvc-flow-diagram.svg deleted file mode 100644 index a1acbc2cb..000000000 --- a/docs/source/guides/understanding-reactpy/_static/mvc-flow-diagram.svg +++ /dev/null @@ -1,425 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - width="680" - height="580" - viewBox="-0.5 -0.5 680 580" - content="<mxfile host="app.diagrams.net" modified="2020-09-07T18:34:20.858Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36" etag="IvUE9xI9CxZQnD7O0sJm" version="13.6.6" type="device"><diagram id="3GUrj3vU2Wc3lj3yRkW7" name="Page-1">7Zpdb9owFIZ/DZetkrgEuCy027R1XSWkddqdiU8Sqw5mjvnar5+d2CEhFEpbPkZBlUqO7WP7+D0PdpIG6iWzzwKP4u+cAGt4Dpk10E3D89wrz2voP4fMc0sLdXJDJCgxlRaGPv0Lxtg01jElkFYqSs6ZpKOqMeDDIQSyYsNC8Gm1WshZtdcRjqBm6AeY1a2PlMg4t7abzsL+BWgU255dx5Qk2FY2hjTGhE9LJnTbQD3Bucy/JbMeMB08G5e83adnSouBCRjKlzTAv+WFQ760viXebfT49/4J/cIXfu5lgtnYTLjh+Uz564ZcuVUBw0Fe4P8Z65F2e3wsKAhVdA/ThVlPUM5Zta72cZFma3qtKqjRzsot/Mj8zzocWMMdnvOxtGY1ocFyVWXLh2fNXqV7T/DxkICet6uKpzGV0B/lE5kqmSpbLBNmikPKWI8zLrK2iGBoh4Gyp1LwJyiV+EEbBmFRYuWAihFMQEiYPbs8brHoKluAJyDFXFUxDTzX6MQkim8upwvVFckUlxRn62Ej9KjwvNCC+mLksIU0WkcojRuajrAMYt3Jx5ZHcX0wfbSPUB+PoL46fRCTs0LQwQnSOUKF9BiF4dofl4H4iGppHpwn7iqgLEUahuRab+rUVcBwmtKgGtxqqJr1cINLmtBaFe6O30LYL4ILpLYv3BjaUujs/rAcOWsTwLCkk6r7VeE0PTxwmmXLbGml5naVllYkVUkUgGlV3hBucFRcW0cSiwhkzVG2usW037DgG/mwddJvQZQ8l7/2f9yrsge9qXhpumtp3OGBOuhUtIcZjYZamEomqkPU1flJ1Uni2hQklBDtoytAzQAPMn+Ouh7pCGcxb3YbzRtlYdp9FwdPUcaWkkw/ZZ91DDAnIeN/cf4oC3hNAj5LDOfSayNUUYz7NkEbLxduq9qEh2EKO5GcHdyZMdsxxmu9E2PQ8s/Hjhlj1/fMmNcwRg/R3JLxnJ0wZ8MuZYfMQXtjDjoz5zXMcd9rX+PteV/jXR2eOT9vfnw/s2ZVIp42a1Ztqd+bNWEIfrDyyEpanYHj/AesQWgDIl7KmmVHNWjtmDW2+8Pub1TJ7aR6W+VMnCId90+c/QEH7eNAdYLAqZ2DXguc2sls18A5igPVGTjr0vGkgbOP09QJAqd2c/e1wKndbt41cI7gNHUGzvp0PGXgXG3cYW+rpkcYpDx4gkJM2z9xzNb+gadUUq5lI3J+FPpiEMqVoEtjPNI+klmk39e6TNRAxqPLBAv9LxgLNu+KbD4VYNpXl7SICE7j7GGns/J2U/bR1ahQisqHp1ijR/Cukn35o07fvku2TLANJO5s/6RTXS5e6MoVuHgtDt3+Aw==</diagram></mxfile>" - id="svg4818" - sodipodi:docname="mvc-flow-diagram.svg" - inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> - <metadata - id="metadata4822"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1016" - id="namedview4820" - showgrid="true" - inkscape:zoom="1.1798897" - inkscape:cx="230.94611" - inkscape:cy="244.6615" - inkscape:window-x="0" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="svg4818" - showguides="false" - inkscape:snap-object-midpoints="false" - inkscape:snap-bbox="true" - inkscape:snap-center="false" - inkscape:snap-text-baseline="true"> - <inkscape:grid - type="xygrid" - id="grid4962" - spacingx="10" - spacingy="10" /> - </sodipodi:namedview> - <defs - id="defs4706"> - <marker - inkscape:stockid="Arrow2Mend" - orient="auto" - refY="0" - refX="0" - id="marker5531" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5529" - style="fill:#000000;fill-opacity:0.96568627;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:0.96568627" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="scale(-0.6)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow2Mend" - orient="auto" - refY="0" - refX="0" - id="marker5527" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5525" - style="fill:#000000;fill-opacity:0.96568627;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:0.96568627" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="scale(-0.6)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow2Mend" - orient="auto" - refY="0" - refX="0" - id="marker5523" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5521" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="scale(-0.6)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow2Mend" - orient="auto" - refY="0" - refX="0" - id="Arrow2Mend" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5224" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1" - d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" - transform="scale(-0.6)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow1Mend" - orient="auto" - refY="0" - refX="0" - id="Arrow1Mend" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5206" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" - transform="matrix(-0.4,0,0,-0.4,-4,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0" - refX="0" - id="marker5513" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5511" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" - transform="matrix(-0.8,0,0,-0.8,-10,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0" - refX="0" - id="marker5509" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5507" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1" - transform="matrix(-0.8,0,0,-0.8,-10,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0" - refX="0" - id="Arrow1Lend" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5200" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:0.96568627;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:0.96568627" - transform="matrix(-0.8,0,0,-0.8,-10,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow1Lstart" - orient="auto" - refY="0" - refX="0" - id="Arrow1Lstart" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path5197" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:0.96568627;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:0.96568627" - transform="matrix(0.8,0,0,0.8,10,0)" - inkscape:connector-curvature="0" /> - </marker> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0" - refX="0" - id="Arrow1Lend-9" - style="overflow:visible" - inkscape:isstock="true"> - <path - inkscape:connector-curvature="0" - id="path5200-3" - d="M 0,0 5,-5 -12.5,0 5,5 Z" - style="fill:#000000;fill-opacity:0.96568627;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:0.96568627" - transform="matrix(-0.8,0,0,-0.8,-10,0)" /> - </marker> - </defs> - <rect - style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect1940" - width="680" - height="580" - x="-0.5" - y="-0.5" /> - <rect - style="opacity:1;fill:#9fa8da;fill-opacity:0.99607843;stroke:none;stroke-width:13;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4966" - width="600" - height="200" - x="39.5" - y="39.5" - ry="20" /> - <g - id="g5077" - transform="translate(30,40)"> - <g - id="g5106"> - <rect - style="opacity:1;fill:#4052b5;fill-opacity:1;stroke:none;stroke-width:13;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect5002-9" - width="200" - height="100" - x="59.5" - y="49.5" - ry="20" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - x="123.48081" - y="109.51302" - id="text5072"><tspan - sodipodi:role="line" - id="tspan5070" - x="123.48081" - y="109.51302" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace;fill:#ffffff;fill-opacity:1">model</tspan></text> - </g> - </g> - <g - transform="translate(330,40)" - id="g5077-0"> - <rect - ry="20" - y="49.5" - x="59.5" - height="100" - width="200" - id="rect5002-9-9" - style="opacity:1;fill:#4052b5;fill-opacity:1;stroke:none;stroke-width:13;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <text - id="text5072-2" - y="109.51302" - x="78.464844" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - xml:space="preserve"><tspan - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace;fill:#ffffff;fill-opacity:1" - y="109.51302" - x="78.464844" - id="tspan5070-5" - sodipodi:role="line">controller</tspan></text> - </g> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none" - x="49.5" - y="69.5" - id="text5110"><tspan - sodipodi:role="line" - id="tspan5108" - x="49.5" - y="69.5" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;font-family:monospace;-inkscape-font-specification:monospace;fill:#ffffff;fill-opacity:1">server</tspan></text> - <rect - style="opacity:1;fill:#9fa8da;fill-opacity:0.99607843;stroke:none;stroke-width:13;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect4966-5" - width="600" - height="200" - x="39.5" - y="339.5" - ry="20" /> - <g - id="g5077-9" - transform="translate(30,340)"> - <g - id="g5106-4"> - <rect - style="opacity:1;fill:#4052b5;fill-opacity:1;stroke:none;stroke-width:13;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect5002-9-6" - width="200" - height="100" - x="59.5" - y="49.5" - ry="20" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - x="123.48081" - y="109.51302" - id="text5072-9"><tspan - sodipodi:role="line" - id="tspan5070-2" - x="123.48081" - y="109.51302" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace;fill:#ffffff;fill-opacity:1">model</tspan></text> - </g> - </g> - <g - transform="translate(330,340)" - id="g5077-0-2"> - <rect - ry="20" - y="49.5" - x="59.5" - height="100" - width="200" - id="rect5002-9-9-4" - style="opacity:1;fill:#4052b5;fill-opacity:1;stroke:none;stroke-width:13;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <text - id="text5072-2-7" - y="109.5" - x="129.5" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - xml:space="preserve"><tspan - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace;fill:#ffffff;fill-opacity:1" - y="109.5" - x="129.5" - id="tspan5070-5-7" - sodipodi:role="line">view</tspan></text> - </g> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none" - x="49.817509" - y="370.17709" - id="text5110-5"><tspan - sodipodi:role="line" - id="tspan5108-4" - x="49.817509" - y="370.17709" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;font-family:monospace;-inkscape-font-specification:monospace;fill:#ffffff;fill-opacity:1">client</tspan></text> - <path - style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5523)" - d="m 489.5,389.5 v -200" - id="path5179" - inkscape:connector-type="polyline" - inkscape:connector-curvature="0" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend)" - d="m 389.5,139.5 h -100" - id="path5181" - inkscape:connector-type="polyline" - inkscape:connector-curvature="0" /> - <path - style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.29999995;stroke-dasharray:none;stroke-opacity:0.96568627;marker-end:url(#marker5527)" - d="m 189.5,189.5 v 200" - id="path5183" - inkscape:connector-type="polyline" - inkscape:connector-curvature="0" /> - <path - style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.29999995;stroke-dasharray:none;stroke-opacity:0.96568627;marker-end:url(#marker5531)" - d="m 289.5,439.5 h 100" - id="path5183-6" - inkscape:connector-type="polyline" - inkscape:connector-curvature="0" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - x="499.5" - y="299.5" - id="text5535"><tspan - sodipodi:role="line" - id="tspan5533" - x="499.5" - y="299.5" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace">event</tspan></text> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - x="199.5" - y="299.5" - id="text5535-8"><tspan - sodipodi:role="line" - id="tspan5533-0" - x="199.5" - y="299.5" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace">sync</tspan></text> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - x="289.5" - y="189.5" - id="text5535-8-2"><tspan - sodipodi:role="line" - id="tspan5533-0-1" - x="289.5" - y="189.5" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace">change</tspan></text> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none" - x="289.5" - y="489.5" - id="text5535-8-2-0"><tspan - sodipodi:role="line" - id="tspan5533-0-1-5" - x="289.5" - y="489.5" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:26.66666603px;font-family:monospace;-inkscape-font-specification:monospace">render</tspan></text> -</svg> diff --git a/docs/source/guides/understanding-reactpy/_static/npm-download-trends.png b/docs/source/guides/understanding-reactpy/_static/npm-download-trends.png deleted file mode 100644 index cf5140b0dbd3f46735f02a2fad8aa6338b1f40b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64372 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%0Dk(^(f=Hv3bW2M}jaCF<<V0W~Eg>N(2!bF25~GH| z=vG3ddmsa8=@7nW@6X@A|9|_7-3Pn7_uO;N>)gB7>-jWwlczPrY3h~hg@QRVxoonV z(6sCV&C5Z$rk`w-;8HQPa1^GhE~o!yuXSIz35ES@IK?e?EkfQUhD8TVHhmeN)2PlL zJ(l9QE97AIXT3h+`!AnTr{Ql8yR*<%=cmZ^tJ@Tvky!Jr>*a+N?WMmK+KelfzB-)k z=sG0s!Q3d>vXVmXoBbo#@hL<XtO&cEIfvXn#w9=?%qT5YB@-nhH%cje(|mco$ahmt zy|phU0;@K-q!h8lJ-4aOX3)B^h~TT~N!hiE$GTma_sXkTKVbr%v{|Wh4kQ<=Lh})G zLyG77g{^T>Um~2GtuW<YR^qQ<zkO0;LkCR{FK1GBo_s#?<)9-8S*&4miRZgFKTd8@ zY(c?A5sg;lOBPe$5*bAmiDY(P;IvQE2fj?+k`w+F6i%6n4)h)|-jEx#)_rZy%@9J+ zT>P46SiH8;(8DjkJi-Z6MtxV;eJhVQvCHCi+524L9PP-G4%TE{8zhy+pKp35!9i?~ zs1Ad}YIzE8mf}AB&8&f)_4;NKg}e@=(j8;Vn3^fRKN*45a$PkM!wB-GGE-+Ghu?pE z>#%q3ZGL>$sQ_)}sC$*fEE~2i!CK;Mw&?C`m+)58OkY-LEpx|_$uQ%_Ie{_~SGHA` zvJ<#3aNTl{^3+|kvperGd(;(iqe{C!D&~upkMo{xmsSR!T`77jEBcvxzpGIG^q!TZ zAibF%x^gM;Au~^R-*ARNM;rxPpLYP3K6*Xvy(N2AVb=$p6}vs0ZFu0r>MGI_M?#}N z7$U1ATSXRnD-jpED|R0UC|vj{4zpY%uFJyHdQ4c%|1xT6rB~A;Uc_8gea&(`x>`cZ zVnabWQhSEkHjtCcr1T~DJNwH}4#oZfSr4bQ$6alK;aINf$vA$@VSYYG=ur14n3qn< zDT<{0dtdkxipuIlWZ5o9QB{JdV=#_g9^j+81uquR%yVXUP=)`lKToD%c|H)@W)lU9 zVMk^^?}iAn*PNm_!k#KzOF)nM7k7DeJe40LsH^60_e1V|6Y40}sc0Lo@|)S2g<I`9 zEq@nMxFwe7Hev}a40o=+u~lQ<H1_vC_WOZ=i4#|wA2r2MFx5V#@U$PFVM1*r;ym5v z@d}gc;8Zt-t^MX_n#w=RhGlY_*f8|-TFQqODe%?ghG9mOmtKxl81`7sC%B4%Y@SF8 zw(wAxAnjD<uBkj#ws_UFgTv02BX4kUzrTWMaVX0eX<>jBA)#>b;;Vd3?GttKaU!02 zRdb!&x1KFmt6DV_BkNlYPM?ViZ)xIe)iruyF(flsp<RL6ul%&($fJi<0#f!+(2^z1 z8t>p;#M6m&hVOfb?f<31(r`}=YUR>VPnJSH&&Ip>n;$PU78OMjG+%gzJ}Qpzalf;1 zdkgcWjgYT7DQJ;Jo4_(>$fkEo_GPyGd<&7G$9`>%6mcCA_c+jnfxQ0rApPN}$w1vn z(3fH6Y4btXQ|_nQoD3{s?wN3?cQ4oOA$^y*-)t^#y*%Rh&GE>^k;?N5QOUH+%S)}8 zj<8dNVrgfpJGC7AD+Mt>MgO1c4seZf27?|bEOhoyoEoHcXoOta<@<77>oO{@JD7=n zDpMd~h~gysFvXT*Wp7?_Tv*1oh$TdDE7>_WJEwKJ1tP>xD9uGJgI27VXDv(hn;(!s zp_;az6|x?oH$7u1W5?l3D|PVSSr<7g=kG#SDKsjSI$_b`x2%i_c41bT5IJ)-Cm%;d zG)@P;w-0tHC`~a>Xz1pv&v$jVi%1UzMJ)U)-XaF!v?jQo?8uEmew$P4mIl0zoc;<k zlM$WBDmKq}fROpMIjfDE-0)z9hYPrG;j$HXeb$nc#F(n6e{-R@W`lec)KqS5I7)6E zOe^~z(~_9Z5VTpD)oV`W(3q9(B_$_Ds}~NZ%?)pE`U|s|4WetlhnC8IY<mo%*?8Rx zkv?qWF&#@-7Rj7qL>(z#{gtC}g_xF$=1>oF>`;NB-F7~*E8*D2<ne{<@~Ou~f33LT zqn(KzNp7;JcRKVXRm$sd)0N-z!RHu%fmJ5G3-5xh^8%5pBm#}fk@I_Iq?awu{O_iF ztj+UK55<f+8E*v2d8cvtDbeBB!ob8g^|IzhuB2d)_x8jLjf(co*VUt#6F0h#Nf%VN zhxhIp6NNAIu#cmrA29u3v1o|>qBfCGYW(B_E2UXElWPw5a~6=rQoCr%2l?u@MsHfa zKJDpyRk#1Tn2gJtYM~iemVUS=UsCN1jdZ<G_8%?sro@7__o_}UtgLqaiyIGQ^Xd<F zq%Be;Gmr<AA4`18vJG>h$TxK{HA(ebQHqQMh<~4bWLB*INjyL8;XV!?y3xuVD8FCm z+|Jfx)8gGvlW2WN$_}x3*=XQ2OOm2vE?zwdCzm`VR)Bna^szwMGMxVNIOR|>lw0ZM zMvSax@*@3)wlu_%0eXbFfso}?;e7uoUDj-BH$9DlgIg<b1Nx+Sk9CzQg7dw|IT&{N z#li}@>XGPc-HJGy7)JiO94a^DVCrS6Fx6xAc9MWVmR(w9Pi&1&wSkq0bOysABlqs9 z5hsDv%P}6e+uypQGW(LJLE=cU+(dLkk?Dn$#v$F!20MC*!@Uf@RhEV0d1wTAl$TLe zo?`6hKI7xOwW&SUj43Z>>OCcsQrVq_k3<;NYYA-UQ&>f98j52hxgde99nyFud#B>D z9(yIb>*YR(V=s+MBMs#5sZ8^vfIE~J2suRX$gRYwO{-GPGt6`A1!2kM3knE@9**8c zE3D}rZ{>1B4DF7m_ZG3(b{u6K@?{`IvtM~Vzt)hQD2a??VwX5h`vz+!EIVhTee9^V zHUAS#FPHY<9te~ISyw~Z7{5V6gvC*z*Xt9Xp}p=mCpiV1WQ9sIJ&_Ukt_kmKGivqb zB27jIVWSDlKf2A!<tQJX5|VxO!l9_`@<UG-OX@{_+Q|NGvsCA-^ttnlcJRxYn5h8W zu`wK~Afl^YB}4Pod|oE*kocEx?klCt&^R`#i`lU#3n}RzgSD;kZ0F+TEG@qptN7Je z1I`lItk!m5`q`Ajx1(xGV|@#YhZ#Pg4q8T*6?*22Ql3?=wWmYh=qL9$sQsxm&lmjd z;XvW?&H#6>>u$dFhdb?m;vzcI>An33E^8s4jT1vvqWK*9RAq?xDNM>DKjz1#CCT@h zcOn-p+<mKvf5K}72R9;~G+#XZTB(@tDuIQN?-S#-^b?hKgm?yUR@Q4!mCX6z!2>Lg z<os2a(lrhu^*ROyCUdpS_cPb+hUa|@m^Y3+NUowDTBVR%#tw6SzZAt9VPI`nIUMs| z8S+)aZkd?1esml22@(9hG^dfF_llGEL}9?-cObSa@UE2BWUKpSA3>k~d-lMPbVE`r z>_GRu%^wb}>miLpWa;BnmLB|dD@FG4<?rrZ%MR6T3i$D=$xm>w*Q)p-9kWMMdj2cD zqVA?+Ii^Q$))i@Nf?pf&pnt7&(nYYH0J@;@VrwYI6x|d`B|oQQSe4xQ-Uc-Af{T0E zPdlwB65~@W6vEnUUD@3Yb1At#q^rH!5(uY!A>hDyo4;b?=pvpG)A?tm{utFg=}K5q zq`+q}AzM;capmyLx7fsW_+kl{Xyr4yx<PwmK0BxEX;Nv5Es49b6(w&$#~6W|ZBK%% z3Ymf5T~-gCKLW!nOTlN;^Y$y>GSQ2XES^9)<u>~jufHHz_IjZ@^uYg|<3~<#EO|<- zjyfkrQ?}pQXj`aUt{~Y@mWV^#pdLdn>+~I=5;D?B<x3c1jKD`XC!*y@qGQX6>c!g^ zzs<`8uVm+V*8f_1TY80^7b4ui$d`TvJTnM>&X5kRK1|p>Xo;Ns`|DY|pMO~uJMqH$ z&Z@Kbpx-17w-(zQunG_wu}*j$o>_V5*S4%ck`gOFI5pih6c)=f?d(;(m6ZHrU<A8C zG>5UhS9GgGSshB%q$M%3tDf&Jk<c))L&FJy)lZMi%)~{p2Qz`>9`BWJO1{35z`H_L zAc{g2g{P@6l%{JS^ffY#YM!Tj;r;7d*tywt)=|sP-s^W?%R;%)J7GMY_BIXmZHvCg zrfy<l*l<ZA>5|3|M#V6Lk4NvGYRS)s-!qf`+N2k_Zhy9Kfno+B=DsOQd5s^(r|D4Q z9EMyTUZuhqlHtLN1{SC^3`Gi6>*7^2Pd-tRGue|AEZn2mNnl{|JmS6YSyEQKKF2eg znKDnbm1ld?%xRY8qMF>UZmKn1XY213Rl*lr*K;aG>V-|iUK5RR<vv?6bnsA&Zw|fd zyUf$KWccBZGKg_qu7nUy4#E&Dg7EdyUZ4^q1;$l|Wn#ToGLSY=^Q)Y?;HsE_SS6S5 zTQS6i30W)Z0TgN3bD`&a*Reix&7KZ0L%gcMJ&`iVECm@JiGATHQ2-Df8ykxzY#uDT zL7KrSp++|o&7#FL5T2*nBt_ebQf{_xy)w@sB+PIqAzvdV6@4J{CD9rds#5=$*tm(( z8eUadq#t>^C7Z_ihaS6%HqBLs6Sf^0*pc6&<;2br(FYw^xe*OyH9EFS$(joS`zl89 zxS?`J<*^G%i4)^aBgWZwDY_agX;jqO9~Q4UW^zwhqftEr=_|LK$kF@iou8OTvfFJ6 zy60MlRIV?L^_S?>oS}?PhWn5Z7e>LC#!s<!UKTI|@-XLetw_{Qa<f-go8T5gee0gH zOS2ecb{k)#@bQHpiPR?o&4bz1W=QyFqc7mrTAjK~_+jgs3L6Hn^Ie6u-j#H{r;}dz zM;+ai5~SJi+J~+O_rW|T3N$u5UCdDwtq`PST_GZCu%j|yBC0TUG|${!F{dLOJTVh# zxPuAd^ZBF(R=6N+?!-EIuNOjB{lC<}rc;QQbyQkja25Xb&Ex?<qF%IOs7?6Hb7?I0 z<LovTiv>xrTyx#e)kskL@QKWlPU*=L&mu={;vX5Aq#Pqh9rYL_#F-%DmfnHawdmtI z1&Eb#l6lLS>X5e?MH}Tf!XVj1^Q}SzvXVvF2X0E50O5Fl#=f}sd0l~*YNAGa1A3li zmkrH!2@%mEylfr1bP+~iQT8_#UXET1ICDrgjma+E51H*+`FQa21-z=9uFEy;S}ACs zIXeOf=G$;yZ^(boZHZ+X)am4I9G|I>rO)0@7)q)8^JeG8qURZa&4SY+jv{C#y+ub3 z5>xx!siO!%`m(jP^+XF2IpJQzTerl|yN1afBs|>XuKeU+tmdL1VRJ?A*3@t@Djcc& z_M4}3UT>e+>rZr>tI1@y<hT5E+!%$bK8&0HM9}woSNGnZEl`T&|9d4((&h@~mZMMK zjL5Aixb{fo^UO*%<^bq%Ie+KNr9_+_6!L9<lRYK;1Wm4pj2E|pSRIFM>th%{!6BbS zl^AR}z_F4x2spa9H~?T#2kH*_KG(<b^^v)`1mNUSz;jjLv%cd%wyj#1SlbLGt$wBW z(Ycfg#74WAauf5iiS!XL#sYsMh!v{sy)2LK8(@iVV)<B!)$mVBPF|R_^$S4PW&{$D zk<s64W#X`iI+}|@f8W_p1~?Hd26JjtnO^y{X^k8!+M1YXrA*FA25Ei4iD0iYu|HHI z#KlEL#Pko!m^NoQXh|gnIYv}_SYr5O<}_;z$G?k~gTfBuPkLQ%kmn9~w(+A!kMJIP z-n~OEr?o05L=2l8`BJ(MMCc4X&9}pf(W<l{9AvE`xJT5jrF+mIz}f-l-~=W}7SNw| zV{Omv4Zu&WP*4B|nuXJG89eHT0JFS#we$BU+r<Cd8Xhiz_QB5`;6K6>MPvWt!r|ZD zaQPo`8owDH`TyQ5e0_I!x1gEA@l{NGVfQzl0Q~Xb&#P|a-pZ3UAN+p*+uf=cF{j~* zk4zO1Nl8daDGR3;08bSKgV4gZ$CD?mAP>>5dJ=EYN)<HY5*1BqnSWmI&=E-m7{xsR zY|1@(2oPK`!2WRIQZXL;_pjGX@YyE!Wp{5zt^2gp##Ai@+Zz&b=Wngn{<BvKjmRK) zU6<^3Q`qTgfIzA?K7kYfWYgu4fPaFAWC37wC@?Yf1+fS1UjyYe5Ii@wmDPU+8likG zM_Rr6V_F&m9wCi~t7>bvgJj9qlhrPJN65oTmt%lN9R|3b0pUi<`uSj4N3jpB#Q-`} z(R|44JeVDm`)|V~**zCHAOO)dbka>7qz`Xl&YtULN!)VXj*pXH#263d$VO4INacZ# z0ba3ro!bqN4|{U94s;TWQS3lg$H~u6;y>%lC?+lrRrL$zq18uwTcP1r#oLY?`~F*s zhM<Vd(Dc!x2mp_5+W(=0*r@6;Fg6YYIi3&*kV{kr{|h)j$35uz>bstpk`i__kIY4u z|6J?b4nC4yUS1}eJ=`05@W#wGDD~3Jz(8a<g{T2NIyPpHC!vj21V;e7!nK^7oQWz2 z5+o8tVEjJ)HXqBK?{wfD<1ndrCuja!Gcm~XCHCI_e)6xIAk|dv-~La;Rs(LqudyoV z?6A1$u9#o*#p!y6xC=E9dEq%pO$TF^o{h7RkOGZ2*wPA2J6<S(|1$7E0w7*ia$o*k z)^eMw(Gt6g1E8D5+Ho5dV7LLF#xu>N=Mdbk+p%#EKVXcZu%+&Jf!nv00RbFX663~g zk*vV{0fCf`z6NcJPjv+ro$!$-osHX=fd|qvCrP@x9|qxz-S9<Bib@cU8r<oIt4;!{ zE_~olJ%_L`HMkbN0|Q}Q_D~4urhp^^JKbMP9QbWs34>Cz$`HNjA%p<Db{oLriU43* zWra5Y;{h@=Q+)Tepa+g_OXaY29~sc&=;-NpdsrZNg9iSP-)i&j2gqyd=ongB4$MDr zpOTnCUj74EHt4hz_=Rd{C<?H)b@{@;v4U<^@E6lNv3w8!->e<SW<4uc($%E|9g8ee zm-yXx;t(pY{{H^NtSoY1z5!O9_d}$FA*Q8xCUv`uN$1qm6exAVE7|d`$<)*jrKPdN zbF`r2m^98NfP7qhG0!V2;U17`oj2+V2d#Z^GLU{(0~AF8gf@UEi{<TcXCm5jmfGW& z+JpF`P6t^j@!3@<aA@2>wFVg&mXws-HLJM8Kp`e3cHC1k>RLSNT2osKg}l`+T)w!# zUpH`By8&BVV}Ug>Rtwaqk&}}j=e_~#9zZp}aEa|AXto);ECUnt)Kvea+>5`Cot>Sa zQ`S8F>A5i>3K-*UOS=m@iyi3YWF7Sd>%`ayUA_)bd39o>o6<)FP93C%LfYO)?{e^S zbE_D&FSocO$s?5i28!*5pXoi+(Mh=}i}eP8wGMEi$7jG1O5%ebMm#vQ!4leYzV8FZ zo20g-qmEa(Hw2INj+dTm#qXc4d3sab$|`#q4ql!OR)kZ2K|%8S0YSs1SV!zBki0DJ zB0LX9%?KgDBsnrYEqH&0*sF=2fx-UIug{465e>WwrDM$p56<I8Z7*ZJfw8pAwuKF} zGLA&}0*9WMFu#{G7+v@2=UQTRc3f5#GoslBFW56Jr3bgh+^EZCU>4r~)e%MG05Xx$ zV8}oz|D9`gw`dN+6)$_@Fa7^&;<FeHhi7Nw`}?(*S61u+67YOeyHE@^yySWBw7GpY z7myGg06V(_Rk4g62b^y(2e8iv9kH5zdEABM?ECH2``fEeR623#3y4jO!d9(#k~JPT zpTe)7_RWKnb{yck3@t2Ta?h9fGZcbkkd2_5b}TL+{qEhomM+lM*|~r@+v>RZceab? z#{;2lhL{ui9eI`0e|iTG=0X;5pm^mF@0vlZeu&EZxd!>~Eb1=?;Yo2zr)PR>WT1HW zx)V5O#P3uy5&tc#8K0jIlh5`8njI5TzB`BYEGcPg_lMM7Zr0Ch%P1zrY*rxu32ykw zvLO~iLzG@$ijD&|{VvZAn0(&8eXID{M42yT@rTacE}#;O^queP!hvgg3@Y{Fz$73G zQ-C`=JGbsiCH9A9XWx`NT`l-e%WC<&;R+CK{qpsGMRAlfH8&^RcbfIxx$k~C2E&$% zytoe#-n1f;_5wH!vET@q9yPH9ih~@v84xCU`s+OA6SPwJ7D3%6722aa?#7d+Px0)s zg<XUJ5Z2rWCaNb%-vNzL@zYPGFQzoO=P9wjc9(kK%e~iTfOiMXFVG`fzey*2^ae@w zfX*KVMsaj?+vMaV;AJkzPDn~f4ClRr0eOKr$}z@~jU0zRMSuwR1mzKcnC1Xn2%wN6 z9x;8ldH*`7@?1Cw*qwCAZG(yI++Y$DjX1?SmlTzhp!kEGo3p_?3E195<#vpN4s<m4 zk_ISrl51LUl)phQt1!TU-)Hb+q$8d|m!GGf4OqPZc1^1U)6{gce%6l#G8P;-kankX z(oH}}sIwm+BuAb=Dyd-}m=ivT6jD(*om*U-R$u;ruH_4mV&duOV7iRKHgY+PMpCih z3o*6CUjc_Q-tGl~yy*!8Vza!uI)>Y+<kItj;^k;8`9&4}rWO?MfKkSo(sz}XHVmu| z>_LYHgA%dbeB_DkBm<KM(2Ok&%5JNAd3pVs=fA-+nET)j|9b@20`^z)(cFM^^F)I; zzry9Y_x|A_en=j#=_C7dX&xLe5aJgOHWiE^!^a_(6#GEsfOnn&n*lVeEd+EI7A-9; z!@wxVGBVI7#>OInEwteCXR@`mHFHeheLy{hLS7zjv`u@ou!=0$H2U3<V177(pF6qk z_e3!FM4ahSALPg~{Ri;HFNAvUsT98Z-)ifs*x-M3;Q!t&QT~S-#xIusf7*P`Zp6;} U`You4fPj~lnx1O8GVIm=0bn6BhyVZp diff --git a/docs/source/guides/understanding-reactpy/index.rst b/docs/source/guides/understanding-reactpy/index.rst deleted file mode 100644 index 3e0b2ab72..000000000 --- a/docs/source/guides/understanding-reactpy/index.rst +++ /dev/null @@ -1,17 +0,0 @@ -Understanding ReactPy -===================== - -.. toctree:: - :hidden: - - representing-html - what-are-components - the-rendering-pipeline - why-reactpy-needs-keys - the-rendering-process - layout-render-servers - writing-tests - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/understanding-reactpy/layout-render-servers.rst b/docs/source/guides/understanding-reactpy/layout-render-servers.rst deleted file mode 100644 index 9a7cceb54..000000000 --- a/docs/source/guides/understanding-reactpy/layout-render-servers.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _Layout Render Servers: - -Layout Render Servers 🚧 -======================== - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/understanding-reactpy/representing-html.rst b/docs/source/guides/understanding-reactpy/representing-html.rst deleted file mode 100644 index c2f32ebd9..000000000 --- a/docs/source/guides/understanding-reactpy/representing-html.rst +++ /dev/null @@ -1,76 +0,0 @@ -.. _Representing HTML: - -Representing HTML 🚧 -==================== - -.. note:: - - Under construction 🚧 - -We've already discussed how to construct HTML with ReactPy in a :ref:`previous section <HTML -with ReactPy>`, but we skimmed over the question of the data structure we use to represent -it. Let's reconsider the examples from before - on the top is some HTML and on the -bottom is the corresponding code to create it in ReactPy: - -.. code-block:: html - - <div> - <h1>My Todo List</h1> - <ul> - <li>Build a cool new app</li> - <li>Share it with the world!</li> - </ul> - </div> - -.. testcode:: - - from reactpy import html - - layout = html.div( - html.h1("My Todo List"), - html.ul( - html.li("Build a cool new app"), - html.li("Share it with the world!"), - ) - ) - -Since we've captured our HTML into out the ``layout`` variable, we can inspect what it -contains. And, as it turns out, it holds a dictionary. Printing it produces the -following output: - -.. testsetup:: - - from pprint import pprint - print = lambda *args, **kwargs: pprint(*args, **kwargs, sort_dicts=False) - -.. testcode:: - - assert layout == { - 'tagName': 'div', - 'children': [ - { - 'tagName': 'h1', - 'children': ['My Todo List'] - }, - { - 'tagName': 'ul', - 'children': [ - {'tagName': 'li', 'children': ['Build a cool new app']}, - {'tagName': 'li', 'children': ['Share it with the world!']} - ] - } - ] - } - -This may look complicated, but let's take a moment to consider what's going on here. We -have a series of nested dictionaries that, in some way, represents the HTML structure -given above. If we look at their contents we should see a common form. Each has a -``tagName`` key which contains, as the name would suggest, the tag name of an HTML -element. Then within the ``children`` key is a list that either contains strings or -other dictionaries that represent HTML elements. - -What we're seeing here is called a "virtual document object model" or :ref:`VDOM`. This -is just a fancy way of saying we have a representation of the document object model or -`DOM -<https://en.wikipedia.org/wiki/Document_Object_Model#:~:text=The%20Document%20Object%20Model%20(DOM,document%20with%20a%20logical%20tree.&text=Nodes%20can%20have%20event%20handlers%20attached%20to%20them.>`__ -that is not the actual DOM. diff --git a/docs/source/guides/understanding-reactpy/the-rendering-pipeline.rst b/docs/source/guides/understanding-reactpy/the-rendering-pipeline.rst deleted file mode 100644 index cdde27f08..000000000 --- a/docs/source/guides/understanding-reactpy/the-rendering-pipeline.rst +++ /dev/null @@ -1,10 +0,0 @@ -.. _The Rendering Pipeline: - -The Rendering Pipeline 🚧 -========================= - -.. talk about layouts and dispatchers - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/understanding-reactpy/the-rendering-process.rst b/docs/source/guides/understanding-reactpy/the-rendering-process.rst deleted file mode 100644 index 00215a887..000000000 --- a/docs/source/guides/understanding-reactpy/the-rendering-process.rst +++ /dev/null @@ -1,10 +0,0 @@ -.. _The Rendering Process: - -The Rendering Process 🚧 -======================== - -.. refer to https://beta.reactjs.org/learn/render-and-commit - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/understanding-reactpy/what-are-components.rst b/docs/source/guides/understanding-reactpy/what-are-components.rst deleted file mode 100644 index 4c22dda13..000000000 --- a/docs/source/guides/understanding-reactpy/what-are-components.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _What Are Components: - -What Are Components? 🚧 -======================= - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/understanding-reactpy/why-reactpy-needs-keys.rst b/docs/source/guides/understanding-reactpy/why-reactpy-needs-keys.rst deleted file mode 100644 index e570b8f41..000000000 --- a/docs/source/guides/understanding-reactpy/why-reactpy-needs-keys.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _Why ReactPy Needs Keys: - -Why ReactPy Needs Keys 🚧 -========================= - -.. note:: - - Under construction 🚧 diff --git a/docs/source/guides/understanding-reactpy/writing-tests.rst b/docs/source/guides/understanding-reactpy/writing-tests.rst deleted file mode 100644 index ffac27df6..000000000 --- a/docs/source/guides/understanding-reactpy/writing-tests.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _Writing Tests: - -Writing Tests 🚧 -================ - -.. note:: - - Under construction 🚧 diff --git a/docs/source/index.rst b/docs/source/index.rst deleted file mode 100644 index 8b21160f6..000000000 --- a/docs/source/index.rst +++ /dev/null @@ -1,206 +0,0 @@ -.. card:: - - This documentation is still under construction 🚧. We welcome your `feedback - <https://github.com/reactive-python/reactpy/discussions>`__! - - -ReactPy -======= - -.. toctree:: - :hidden: - :caption: Guides - - guides/getting-started/index - guides/creating-interfaces/index - guides/adding-interactivity/index - guides/managing-state/index - guides/escape-hatches/index - guides/understanding-reactpy/index - -.. toctree:: - :hidden: - :caption: Reference - - reference/browser-events - reference/html-attributes - reference/hooks-api - _auto/apis - reference/javascript-api - reference/specifications - -.. toctree:: - :hidden: - :caption: About - - about/changelog - about/contributor-guide - about/credits-and-licenses - Source Code <https://github.com/reactive-python/reactpy> - Community <https://github.com/reactive-python/reactpy/discussions> - -ReactPy is a library for building user interfaces in Python without Javascript. ReactPy -interfaces are made from :ref:`components <Your First Components>` which look and behave -similarly to those found in `ReactJS <https://reactjs.org/>`__. Designed with simplicity -in mind, ReactPy can be used by those without web development experience while also -being powerful enough to grow with your ambitions. - - -At a Glance ------------ - -To get a rough idea of how to write apps in ReactPy, take a look at the tiny `"hello world" -<https://en.wikipedia.org/wiki/%22Hello,_World!%22_program>`__ application below: - -.. reactpy:: guides/getting-started/_examples/hello_world - -.. hint:: - - Try clicking the **🚀 result** tab to see what this displays! - -So what exactly does this code do? First, it imports a few tools from ``reactpy`` that will -get used to describe and execute an application. Then, we create an ``App`` function -which will define the content the application displays. Specifically, it displays a kind -of HTML element called an ``h1`` `section heading -<https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements>`__. -Importantly though, a ``@component`` decorator has been applied to the ``App`` function -to turn it into a :ref:`component <Your First Components>`. Finally, we :ref:`run -<Running ReactPy>` a development web server by passing the ``App`` component to the -``run()`` function. - -.. note:: - - See :ref:`Running ReactPy in Production` to learn how to use a production-grade server - to run ReactPy. - - -Learning ReactPy ----------------- - -This documentation is broken up into chapters and sections that introduce you to -concepts step by step with detailed explanations and lots of examples. You should feel -free to dive into any content that seems interesting. While each chapter assumes -knowledge from those that came before, when you encounter a concept you're unfamiliar -with you should look for links that will help direct you to the place where it was -originally taught. - - -Chapter 1 - :ref:`Getting Started` ------------------------------------ - -If you want to follow along with examples in the sections that follow, you'll want to -start here so you can :ref:`install ReactPy <Installing ReactPy>`. This section also contains -more detailed information about how to :ref:`run ReactPy <Running ReactPy>` in different -contexts. For example, if you want to embed ReactPy into an existing application, or run -ReactPy within a Jupyter Notebook, this is where you can learn how to do those things. - -.. grid:: 1 2 2 2 - - .. grid-item:: - - .. image:: _static/install-and-run-reactpy.gif - - .. grid-item:: - - .. image:: guides/getting-started/_static/reactpy-in-jupyterlab.gif - -.. card:: - :link: guides/getting-started/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Install ReactPy and run it in a variety of different ways - with different web servers - and frameworks. You'll even embed ReactPy into an existing app. - - -Chapter 2 - :ref:`Creating Interfaces` --------------------------------------- - -ReactPy is a Python package for making user interfaces (UI). These interfaces are built -from small elements of functionality like buttons text and images. ReactPy allows you to -combine these elements into reusable :ref:`"components" <your first components>`. In the -sections that follow you'll learn how these UI elements are created and organized into -components. Then, you'll use this knowledge to create interfaces from raw data: - -.. reactpy:: guides/creating-interfaces/rendering-data/_examples/todo_list_with_keys - -.. card:: - :link: guides/creating-interfaces/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Learn to construct user interfaces from basic HTML elements and reusable components. - - -Chapter 3 - :ref:`Adding Interactivity` ---------------------------------------- - -Components often need to change what’s on the screen as a result of an interaction. For -example, typing into the form should update the input field, clicking a “Comment” button -should bring up a text input field, clicking “Buy” should put a product in the shopping -cart. Components need to “remember” things like the current input value, the current -image, the shopping cart. In ReactPy, this kind of component-specific memory is created and -updated with a "hook" called ``use_state()`` that creates a **state variable** and -**state setter** respectively: - -.. reactpy:: guides/adding-interactivity/components-with-state/_examples/adding_state_variable - -In ReactPy, ``use_state``, as well as any other function whose name starts with ``use``, is -called a "hook". These are special functions that should only be called while ReactPy is -:ref:`rendering <the rendering process>`. They let you "hook into" the different -capabilities of ReactPy's components of which ``use_state`` is just one (well get into the -other :ref:`later <managing state>`). - -.. card:: - :link: guides/adding-interactivity/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Learn how user interfaces can be made to respond to user interaction in real-time. - - -Chapter 4 - :ref:`Managing State` ---------------------------------- - -.. card:: - :link: guides/managing-state/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Under construction 🚧 - - - -Chapter 5 - :ref:`Escape Hatches` ---------------------------------- - -.. card:: - :link: guides/escape-hatches/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Under construction 🚧 - - -Chapter 6 - :ref:`Understanding ReactPy` ----------------------------------------- - -.. card:: - :link: guides/escape-hatches/index - :link-type: doc - - :octicon:`book` Read More - ^^^^^^^^^^^^^^^^^^^^^^^^^ - - Under construction 🚧 - diff --git a/docs/source/reference/_examples/character_movement/main.py b/docs/source/reference/_examples/character_movement/main.py deleted file mode 100644 index 9545b0c0a..000000000 --- a/docs/source/reference/_examples/character_movement/main.py +++ /dev/null @@ -1,73 +0,0 @@ -from pathlib import Path -from typing import NamedTuple - -from reactpy import component, html, run, use_state -from reactpy.widgets import image - -HERE = Path(__file__) -CHARACTER_IMAGE = (HERE.parent / "static" / "bunny.png").read_bytes() - - -class Position(NamedTuple): - x: int - y: int - angle: int - - -def rotate(degrees): - return lambda old_position: Position( - old_position.x, - old_position.y, - old_position.angle + degrees, - ) - - -def translate(x=0, y=0): - return lambda old_position: Position( - old_position.x + x, - old_position.y + y, - old_position.angle, - ) - - -@component -def Scene(): - position, set_position = use_state(Position(100, 100, 0)) - - return html.div( - {"style": {"width": "225px"}}, - html.div( - { - "style": { - "width": "200px", - "height": "200px", - "background_color": "slategray", - } - }, - image( - "png", - CHARACTER_IMAGE, - { - "style": { - "position": "relative", - "left": f"{position.x}px", - "top": f"{position.y}.px", - "transform": f"rotate({position.angle}deg) scale(2, 2)", - } - }, - ), - ), - html.button( - {"on_click": lambda e: set_position(translate(x=-10))}, "Move Left" - ), - html.button( - {"on_click": lambda e: set_position(translate(x=10))}, "Move Right" - ), - html.button({"on_click": lambda e: set_position(translate(y=-10))}, "Move Up"), - html.button({"on_click": lambda e: set_position(translate(y=10))}, "Move Down"), - html.button({"on_click": lambda e: set_position(rotate(-30))}, "Rotate Left"), - html.button({"on_click": lambda e: set_position(rotate(30))}, "Rotate Right"), - ) - - -run(Scene) diff --git a/docs/source/reference/_examples/character_movement/static/bunny.png b/docs/source/reference/_examples/character_movement/static/bunny.png deleted file mode 100644 index ce1f989c5202ffe9ddabe03fabdc933c4aca1a71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 474 zcmV<00VV#4P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800001b5ch_0Itp) z=>Px$lu1NER9J=WmOo3wKp2Og6Dfg~LaAV(ATF*>;vkL=3gX}>h?|?Zh#x{+T)RmZ zL2xLdjt=$%w6lYj20C0D2pO`)p-D;8w7p!ai}^v|^5^dN+`aF;7s!<9ze}im<au7~ zbJsG17s4o2)eObB<&sjb`SM)L)asZBz_m=zzX14dx3x^Q07A<Rp&6%zPy&dUFI0&_ z5S^`KIe!Kq0O459LgKCi06?Ksn0c?GM0FsX3m>mf0PG$dkBv329z^TFvKr^m{POIE zyZdVZ9v?pG*qtauth%k{s9;6kB?>`c*r?Y=?LgCJ-fcC#T;3p;HvlGflky5o(?CjK z6dn<31F*8Tj_iB|025NqfoLsg)N247ot`U!`VeAuV=EoN^VJ)NxBC;{*!>>Ga%JW? zcE2|PkR${G@N~?B9TO*I06)ouYnj;n9)uD~*E|tG7{n-5nR5J!Fj&MqHr(2~AQ*ge zdq)(@mAJ!d3}%{A{g4c#<o%@q4D-Mb%~*RNB?Bo1z~0G48oNxHGX0Kz01cP3^?LgE Qga7~l07*qoM6N<$f>IRFIsgCw diff --git a/docs/source/reference/_examples/click_count.py b/docs/source/reference/_examples/click_count.py deleted file mode 100644 index 3ee2c89c5..000000000 --- a/docs/source/reference/_examples/click_count.py +++ /dev/null @@ -1,13 +0,0 @@ -import reactpy - - -@reactpy.component -def ClickCount(): - count, set_count = reactpy.hooks.use_state(0) - - return reactpy.html.button( - {"on_click": lambda event: set_count(count + 1)}, [f"Click count: {count}"] - ) - - -reactpy.run(ClickCount) diff --git a/docs/source/reference/_examples/material_ui_switch.py b/docs/source/reference/_examples/material_ui_switch.py deleted file mode 100644 index 704ae3145..000000000 --- a/docs/source/reference/_examples/material_ui_switch.py +++ /dev/null @@ -1,22 +0,0 @@ -import reactpy - -mui = reactpy.web.module_from_template("react", "@material-ui/core@^5.0", fallback="⌛") -Switch = reactpy.web.export(mui, "Switch") - - -@reactpy.component -def DayNightSwitch(): - checked, set_checked = reactpy.hooks.use_state(False) - - return reactpy.html.div( - Switch( - { - "checked": checked, - "onChange": lambda event, checked: set_checked(checked), - } - ), - "🌞" if checked else "🌚", - ) - - -reactpy.run(DayNightSwitch) diff --git a/docs/source/reference/_examples/matplotlib_plot.py b/docs/source/reference/_examples/matplotlib_plot.py deleted file mode 100644 index 5c4d616fe..000000000 --- a/docs/source/reference/_examples/matplotlib_plot.py +++ /dev/null @@ -1,85 +0,0 @@ -from io import BytesIO - -import matplotlib.pyplot as plt - -import reactpy -from reactpy.widgets import image - - -@reactpy.component -def PolynomialPlot(): - coefficients, set_coefficients = reactpy.hooks.use_state([0]) - - x = list(linspace(-1, 1, 50)) - y = [polynomial(value, coefficients) for value in x] - - return reactpy.html.div( - plot(f"{len(coefficients)} Term Polynomial", x, y), - ExpandableNumberInputs(coefficients, set_coefficients), - ) - - -@reactpy.component -def ExpandableNumberInputs(values, set_values): - inputs = [] - for i in range(len(values)): - - def set_value_at_index(event, index=i): - new_value = float(event["target"]["value"] or 0) - set_values(values[:index] + [new_value] + values[index + 1 :]) - - inputs.append(poly_coef_input(i + 1, set_value_at_index)) - - def add_input(): - set_values([*values, 0]) - - def del_input(): - set_values(values[:-1]) - - return reactpy.html.div( - reactpy.html.div( - "add/remove term:", - reactpy.html.button({"on_click": lambda event: add_input()}, "+"), - reactpy.html.button({"on_click": lambda event: del_input()}, "-"), - ), - inputs, - ) - - -def plot(title, x, y): - fig, axes = plt.subplots() - axes.plot(x, y) - axes.set_title(title) - buffer = BytesIO() - fig.savefig(buffer, format="png") - plt.close(fig) - return image("png", buffer.getvalue()) - - -def poly_coef_input(index, callback): - return reactpy.html.div( - {"style": {"margin-top": "5px"}, "key": index}, - reactpy.html.label( - "C", - reactpy.html.sub(index), - " x X", - reactpy.html.sup(index), - ), - reactpy.html.input({"type": "number", "on_change": callback}), - ) - - -def polynomial(x, coefficients): - return sum(c * (x ** (i + 1)) for i, c in enumerate(coefficients)) - - -def linspace(start, stop, n): - if n == 1: - yield stop - return - h = (stop - start) / (n - 1) - for i in range(n): - yield start + h * i - - -reactpy.run(PolynomialPlot) diff --git a/docs/source/reference/_examples/network_graph.py b/docs/source/reference/_examples/network_graph.py deleted file mode 100644 index 79b1092f3..000000000 --- a/docs/source/reference/_examples/network_graph.py +++ /dev/null @@ -1,40 +0,0 @@ -import random - -import reactpy - -react_cytoscapejs = reactpy.web.module_from_template( - "react", - "react-cytoscapejs", - fallback="⌛", -) -Cytoscape = reactpy.web.export(react_cytoscapejs, "default") - - -@reactpy.component -def RandomNetworkGraph(): - return Cytoscape( - { - "style": {"width": "100%", "height": "200px"}, - "elements": random_network(20), - "layout": {"name": "cose"}, - } - ) - - -def random_network(number_of_nodes): - conns = [] - nodes = [{"data": {"id": 0, "label": 0}}] - - for src_node_id in range(1, number_of_nodes + 1): - tgt_node = random.choice(nodes) - src_node = {"data": {"id": src_node_id, "label": src_node_id}} - - new_conn = {"data": {"source": src_node_id, "target": tgt_node["data"]["id"]}} - - nodes.append(src_node) - conns.append(new_conn) - - return nodes + conns - - -reactpy.run(RandomNetworkGraph) diff --git a/docs/source/reference/_examples/pigeon_maps.py b/docs/source/reference/_examples/pigeon_maps.py deleted file mode 100644 index 1ddf04fdc..000000000 --- a/docs/source/reference/_examples/pigeon_maps.py +++ /dev/null @@ -1,46 +0,0 @@ -import reactpy - -pigeon_maps = reactpy.web.module_from_template("react", "pigeon-maps", fallback="⌛") -Map, Marker = reactpy.web.export(pigeon_maps, ["Map", "Marker"]) - - -@reactpy.component -def MapWithMarkers(): - marker_anchor, add_marker_anchor, remove_marker_anchor = use_set() - - markers = [ - Marker( - { - "anchor": anchor, - "onClick": lambda event, a=anchor: remove_marker_anchor(a), - }, - key=str(anchor), - ) - for anchor in marker_anchor - ] - - return Map( - { - "defaultCenter": (37.774, -122.419), - "defaultZoom": 12, - "height": "300px", - "metaWheelZoom": True, - "onClick": lambda event: add_marker_anchor(tuple(event["latLng"])), - }, - markers, - ) - - -def use_set(initial_value=None): - values, set_values = reactpy.hooks.use_state(initial_value or set()) - - def add_value(lat_lon): - set_values(values.union({lat_lon})) - - def remove_value(lat_lon): - set_values(values.difference({lat_lon})) - - return values, add_value, remove_value - - -reactpy.run(MapWithMarkers) diff --git a/docs/source/reference/_examples/simple_dashboard.py b/docs/source/reference/_examples/simple_dashboard.py deleted file mode 100644 index 66913fc84..000000000 --- a/docs/source/reference/_examples/simple_dashboard.py +++ /dev/null @@ -1,102 +0,0 @@ -import asyncio -import random -import time - -import reactpy -from reactpy.widgets import Input - -victory = reactpy.web.module_from_template( - "react", - "victory-line", - fallback="⌛", - # not usually required (see issue #461 for more info) - unmount_before_update=True, -) -VictoryLine = reactpy.web.export(victory, "VictoryLine") - - -@reactpy.component -def RandomWalk(): - mu = reactpy.hooks.use_ref(0) - sigma = reactpy.hooks.use_ref(1) - - return reactpy.html.div( - RandomWalkGraph(mu, sigma), - reactpy.html.style( - """ - .number-input-container {margin-bottom: 20px} - .number-input-container input {width: 48%;float: left} - .number-input-container input + input {margin-left: 4%} - """ - ), - NumberInput( - "Mean", - mu.current, - mu.set_current, - (-1, 1, 0.01), - ), - NumberInput( - "Standard Deviation", - sigma.current, - sigma.set_current, - (0, 1, 0.01), - ), - ) - - -@reactpy.component -def RandomWalkGraph(mu, sigma): - interval = use_interval(0.5) - data, set_data = reactpy.hooks.use_state([{"x": 0, "y": 0}] * 50) - - @reactpy.hooks.use_effect - async def animate(): - await interval - last_data_point = data[-1] - next_data_point = { - "x": last_data_point["x"] + 1, - "y": last_data_point["y"] + random.gauss(mu.current, sigma.current), - } - set_data(data[1:] + [next_data_point]) - - return VictoryLine( - { - "data": data, - "style": { - "parent": {"width": "100%"}, - "data": {"stroke": "royalblue"}, - }, - } - ) - - -@reactpy.component -def NumberInput(label, value, set_value_callback, domain): - minimum, maximum, step = domain - attrs = {"min": minimum, "max": maximum, "step": step} - - value, set_value = reactpy.hooks.use_state(value) - - def update_value(value): - set_value(value) - set_value_callback(value) - - return reactpy.html.fieldset( - {"class_name": "number-input-container"}, - reactpy.html.legend({"style": {"font-size": "medium"}}, label), - Input(update_value, "number", value, attributes=attrs, cast=float), - Input(update_value, "range", value, attributes=attrs, cast=float), - ) - - -def use_interval(rate): - usage_time = reactpy.hooks.use_ref(time.time()) - - async def interval() -> None: - await asyncio.sleep(rate - (time.time() - usage_time.current)) - usage_time.current = time.time() - - return asyncio.ensure_future(interval()) - - -reactpy.run(RandomWalk) diff --git a/docs/source/reference/_examples/slideshow.py b/docs/source/reference/_examples/slideshow.py deleted file mode 100644 index b490b3feb..000000000 --- a/docs/source/reference/_examples/slideshow.py +++ /dev/null @@ -1,20 +0,0 @@ -import reactpy - - -@reactpy.component -def Slideshow(): - index, set_index = reactpy.hooks.use_state(0) - - def next_image(event): - set_index(index + 1) - - return reactpy.html.img( - { - "src": f"https://picsum.photos/id/{index}/800/300", - "style": {"cursor": "pointer"}, - "on_click": next_image, - } - ) - - -reactpy.run(Slideshow) diff --git a/docs/source/reference/_examples/snake_game.py b/docs/source/reference/_examples/snake_game.py deleted file mode 100644 index 36916410e..000000000 --- a/docs/source/reference/_examples/snake_game.py +++ /dev/null @@ -1,188 +0,0 @@ -import asyncio -import enum -import random -import time - -import reactpy - - -class GameState(enum.Enum): - init = 0 - lost = 1 - won = 2 - play = 3 - - -@reactpy.component -def GameView(): - game_state, set_game_state = reactpy.hooks.use_state(GameState.init) - - if game_state == GameState.play: - return GameLoop(grid_size=6, block_scale=50, set_game_state=set_game_state) - - start_button = reactpy.html.button( - {"on_click": lambda event: set_game_state(GameState.play)}, "Start" - ) - - if game_state == GameState.won: - menu = reactpy.html.div(reactpy.html.h3("You won!"), start_button) - elif game_state == GameState.lost: - menu = reactpy.html.div(reactpy.html.h3("You lost"), start_button) - else: - menu = reactpy.html.div(reactpy.html.h3("Click to play"), start_button) - - menu_style = reactpy.html.style( - """ - .snake-game-menu h3 { - margin-top: 0px !important; - } - """ - ) - - return reactpy.html.div({"class_name": "snake-game-menu"}, menu_style, menu) - - -class Direction(enum.Enum): - ArrowUp = (0, -1) - ArrowLeft = (-1, 0) - ArrowDown = (0, 1) - ArrowRight = (1, 0) - - -@reactpy.component -def GameLoop(grid_size, block_scale, set_game_state): - # we `use_ref` here to capture the latest direction press without any delay - direction = reactpy.hooks.use_ref(Direction.ArrowRight.value) - # capture the last direction of travel that was rendered - last_direction = direction.current - - snake, set_snake = reactpy.hooks.use_state( - [(grid_size // 2 - 1, grid_size // 2 - 1)] - ) - food, set_food = use_snake_food(grid_size, snake) - - grid = create_grid(grid_size, block_scale) - - @reactpy.event(prevent_default=True) - def on_direction_change(event): - if hasattr(Direction, event["key"]): - maybe_new_direction = Direction[event["key"]].value - direction_vector_sum = tuple( - map(sum, zip(last_direction, maybe_new_direction)) - ) - if direction_vector_sum != (0, 0): - direction.current = maybe_new_direction - - grid_wrapper = reactpy.html.div({"on_key_down": on_direction_change}, grid) - - assign_grid_block_color(grid, food, "blue") - - for location in snake: - assign_grid_block_color(grid, location, "white") - - new_game_state = None - if snake[-1] in snake[:-1]: - assign_grid_block_color(grid, snake[-1], "red") - new_game_state = GameState.lost - elif len(snake) == grid_size**2: - assign_grid_block_color(grid, snake[-1], "yellow") - new_game_state = GameState.won - - interval = use_interval(0.5) - - @reactpy.hooks.use_effect - async def animate(): - if new_game_state is not None: - await asyncio.sleep(1) - set_game_state(new_game_state) - return - - await interval - - new_snake_head = ( - # grid wraps due to mod op here - (snake[-1][0] + direction.current[0]) % grid_size, - (snake[-1][1] + direction.current[1]) % grid_size, - ) - - if snake[-1] == food: - set_food() - new_snake = [*snake, new_snake_head] - else: - new_snake = snake[1:] + [new_snake_head] - - set_snake(new_snake) - - return grid_wrapper - - -def use_snake_food(grid_size, current_snake): - grid_points = {(x, y) for x in range(grid_size) for y in range(grid_size)} - points_not_in_snake = grid_points.difference(current_snake) - - food, _set_food = reactpy.hooks.use_state(current_snake[-1]) - - def set_food(): - _set_food(random.choice(list(points_not_in_snake))) - - return food, set_food - - -def use_interval(rate): - usage_time = reactpy.hooks.use_ref(time.time()) - - async def interval() -> None: - await asyncio.sleep(rate - (time.time() - usage_time.current)) - usage_time.current = time.time() - - return asyncio.ensure_future(interval()) - - -def create_grid(grid_size, block_scale): - return reactpy.html.div( - { - "style": { - "height": f"{block_scale * grid_size}px", - "width": f"{block_scale * grid_size}px", - "cursor": "pointer", - "display": "grid", - "grid-gap": 0, - "grid-template-columns": f"repeat({grid_size}, {block_scale}px)", - "grid-template-rows": f"repeat({grid_size}, {block_scale}px)", - }, - "tab_index": -1, - }, - [ - reactpy.html.div( - {"style": {"height": f"{block_scale}px"}, "key": i}, - [ - create_grid_block("black", block_scale, key=i) - for i in range(grid_size) - ], - ) - for i in range(grid_size) - ], - ) - - -def create_grid_block(color, block_scale, key): - return reactpy.html.div( - { - "style": { - "height": f"{block_scale}px", - "width": f"{block_scale}px", - "background_color": color, - "outline": "1px solid grey", - }, - "key": key, - } - ) - - -def assign_grid_block_color(grid, point, color): - x, y = point - block = grid["children"][x]["children"][y] - block["attributes"]["style"]["backgroundColor"] = color - - -reactpy.run(GameView) diff --git a/docs/source/reference/_examples/todo.py b/docs/source/reference/_examples/todo.py deleted file mode 100644 index 104ea59a9..000000000 --- a/docs/source/reference/_examples/todo.py +++ /dev/null @@ -1,35 +0,0 @@ -import reactpy - - -@reactpy.component -def Todo(): - items, set_items = reactpy.hooks.use_state([]) - - async def add_new_task(event): - if event["key"] == "Enter": - set_items([*items, event["target"]["value"]]) - - tasks = [] - - for index, text in enumerate(items): - - async def remove_task(event, index=index): - set_items(items[:index] + items[index + 1 :]) - - task_text = reactpy.html.td(reactpy.html.p(text)) - delete_button = reactpy.html.td( - {"on_click": remove_task}, reactpy.html.button(["x"]) - ) - tasks.append(reactpy.html.tr(task_text, delete_button)) - - task_input = reactpy.html.input({"on_key_down": add_new_task}) - task_table = reactpy.html.table(tasks) - - return reactpy.html.div( - reactpy.html.p("press enter to add a task:"), - task_input, - task_table, - ) - - -reactpy.run(Todo) diff --git a/docs/source/reference/_examples/use_reducer_counter.py b/docs/source/reference/_examples/use_reducer_counter.py deleted file mode 100644 index 6f9581dfd..000000000 --- a/docs/source/reference/_examples/use_reducer_counter.py +++ /dev/null @@ -1,27 +0,0 @@ -import reactpy - - -def reducer(count, action): - if action == "increment": - return count + 1 - elif action == "decrement": - return count - 1 - elif action == "reset": - return 0 - else: - msg = f"Unknown action '{action}'" - raise ValueError(msg) - - -@reactpy.component -def Counter(): - count, dispatch = reactpy.hooks.use_reducer(reducer, 0) - return reactpy.html.div( - f"Count: {count}", - reactpy.html.button({"on_click": lambda event: dispatch("reset")}, "Reset"), - reactpy.html.button({"on_click": lambda event: dispatch("increment")}, "+"), - reactpy.html.button({"on_click": lambda event: dispatch("decrement")}, "-"), - ) - - -reactpy.run(Counter) diff --git a/docs/source/reference/_examples/use_state_counter.py b/docs/source/reference/_examples/use_state_counter.py deleted file mode 100644 index b2d8c84a9..000000000 --- a/docs/source/reference/_examples/use_state_counter.py +++ /dev/null @@ -1,26 +0,0 @@ -import reactpy - - -def increment(last_count): - return last_count + 1 - - -def decrement(last_count): - return last_count - 1 - - -@reactpy.component -def Counter(): - initial_count = 0 - count, set_count = reactpy.hooks.use_state(initial_count) - return reactpy.html.div( - f"Count: {count}", - reactpy.html.button( - {"on_click": lambda event: set_count(initial_count)}, "Reset" - ), - reactpy.html.button({"on_click": lambda event: set_count(increment)}, "+"), - reactpy.html.button({"on_click": lambda event: set_count(decrement)}, "-"), - ) - - -reactpy.run(Counter) diff --git a/docs/source/reference/_examples/victory_chart.py b/docs/source/reference/_examples/victory_chart.py deleted file mode 100644 index ce37c522f..000000000 --- a/docs/source/reference/_examples/victory_chart.py +++ /dev/null @@ -1,7 +0,0 @@ -import reactpy - -victory = reactpy.web.module_from_template("react", "victory-bar", fallback="⌛") -VictoryBar = reactpy.web.export(victory, "VictoryBar") - -bar_style = {"parent": {"width": "500px"}, "data": {"fill": "royalblue"}} -reactpy.run(reactpy.component(lambda: VictoryBar({"style": bar_style}))) diff --git a/docs/source/reference/_static/vdom-json-schema.json b/docs/source/reference/_static/vdom-json-schema.json deleted file mode 100644 index b1005d2ed..000000000 --- a/docs/source/reference/_static/vdom-json-schema.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "$ref": "#/definitions/element", - "$schema": "http://json-schema.org/draft-07/schema", - "definitions": { - "element": { - "dependentSchemas": { - "error": { - "properties": { - "tagName": { - "maxLength": 0 - } - } - } - }, - "properties": { - "attributes": { - "type": "object" - }, - "children": { - "$ref": "#/definitions/elementChildren" - }, - "error": { - "type": "string" - }, - "eventHandlers": { - "$ref": "#/definitions/elementEventHandlers" - }, - "importSource": { - "$ref": "#/definitions/importSource" - }, - "key": { - "type": "string" - }, - "tagName": { - "type": "string" - } - }, - "required": ["tagName"], - "type": "object" - }, - "elementChildren": { - "items": { - "$ref": "#/definitions/elementOrString" - }, - "type": "array" - }, - "elementEventHandlers": { - "patternProperties": { - ".*": { - "$ref": "#/definitions/eventHander" - } - }, - "type": "object" - }, - "elementOrString": { - "if": { - "type": "object" - }, - "then": { - "$ref": "#/definitions/element" - }, - "type": ["object", "string"] - }, - "eventHandler": { - "properties": { - "preventDefault": { - "type": "boolean" - }, - "stopPropagation": { - "type": "boolean" - }, - "target": { - "type": "string" - } - }, - "required": ["target"], - "type": "object" - }, - "importSource": { - "properties": { - "fallback": { - "if": { - "not": { - "type": "null" - } - }, - "then": { - "$ref": "#/definitions/elementOrString" - }, - "type": ["object", "string", "null"] - }, - "source": { - "type": "string" - }, - "sourceType": { - "enum": ["URL", "NAME"] - }, - "unmountBeforeUpdate": { - "type": "boolean" - } - }, - "required": ["source"], - "type": "object" - } - } -} diff --git a/docs/source/reference/browser-events.rst b/docs/source/reference/browser-events.rst deleted file mode 100644 index 632be410a..000000000 --- a/docs/source/reference/browser-events.rst +++ /dev/null @@ -1,65 +0,0 @@ -.. _Browser Events: - -Browser Events 🚧 -================= - -The event types below are triggered by an event in the bubbling phase. To register an -event handler for the capture phase, append Capture to the event name; for example, -instead of using ``onClick``, you would use ``onClickCapture`` to handle the click event -in the capture phase. - -.. note:: - - Under construction 🚧 - - -Clipboard Events ----------------- - -Composition Events ------------------- - -Keyboard Events ---------------- - -Focus Events ------------- - -Form Events ------------ - -Generic Events --------------- - -Mouse Events ------------- - -Pointer Events --------------- - -Selection Events ----------------- - -Touch Events ------------- - -UI Events ---------- - -Wheel Events ------------- - -Media Events ------------- - -Image Events ------------- - -Animation Events ----------------- - -Transition Events ------------------ - -Other Events ------------- diff --git a/docs/source/reference/hooks-api.rst b/docs/source/reference/hooks-api.rst deleted file mode 100644 index ca8123e85..000000000 --- a/docs/source/reference/hooks-api.rst +++ /dev/null @@ -1,379 +0,0 @@ -========= -Hooks API -========= - -Hooks are functions that allow you to "hook into" the life cycle events and state of -Components. Their usage should always follow the :ref:`Rules of Hooks`. For most use -cases the :ref:`Basic Hooks` should be enough, however the remaining -:ref:`Supplementary Hooks` should fulfill less common scenarios. - - -Basic Hooks -=========== - - -Use State ---------- - -.. code-block:: - - state, set_state = use_state(initial_state) - -Returns a stateful value and a function to update it. - -During the first render the ``state`` will be identical to the ``initial_state`` passed -as the first argument. However in subsequent renders ``state`` will take on the value -passed to ``set_state``. - -.. code-block:: - - set_state(new_state) - -The ``set_state`` function accepts a ``new_state`` as its only argument and schedules a -re-render of the component where ``use_state`` was initially called. During these -subsequent re-renders the ``state`` returned by ``use_state`` will take on the value -of ``new_state``. - -.. note:: - - The identity of ``set_state`` is guaranteed to be preserved across renders. This - means it can safely be omitted from dependency lists in :ref:`Use Effect` or - :ref:`Use Callback`. - - -Functional Updates -.................. - -If the new state is computed from the previous state, you can pass a function which -accepts a single argument (the previous state) and returns the next state. Consider this -simply use case of a counter where we've pulled out logic for increment and -decremented the count: - -.. reactpy:: _examples/use_state_counter - -We use the functional form for the "+" and "-" buttons since the next ``count`` depends -on the previous value, while for the "Reset" button we simple assign the -``initial_count`` since it is independent of the prior ``count``. This is a trivial -example, but it demonstrates how complex state logic can be factored out into well -defined and potentially reusable functions. - - -Lazy Initial State -.................. - -In cases where it is costly to create the initial value for ``use_state``, you can pass -a constructor function that accepts no arguments instead - it will be called on the -first render of a component, but will be disregarded in all following renders: - -.. code-block:: - - state, set_state = use_state(lambda: some_expensive_computation(a, b, c)) - - -Skipping Updates -................ - -If you update a State Hook to the same value as the current state then the component which -owns that state will not be rendered again. We check ``if new_state is current_state`` -in order to determine whether there has been a change. Thus the following would not -result in a re-render: - -.. code-block:: - - state, set_state = use_state([]) - set_state(state) - - -Use Effect ----------- - -.. code-block:: - - use_effect(did_render) - -The ``use_effect`` hook accepts a function which may be imperative, or mutate state. The -function will be called immediately after the layout has fully updated. - -Asynchronous actions, mutations, subscriptions, and other `side effects`_ can cause -unexpected bugs if placed in the main body of a component's render function. Thus the -``use_effect`` hook provides a way to safely escape the purely functional world of -component render functions. - -.. note:: - - Normally in React the ``did_render`` function is called once an update has been - committed to the screen. Since no such action is performed by ReactPy, and the time - at which the update is displayed cannot be known we are unable to achieve parity - with this behavior. - - -Cleaning Up Effects -................... - -If the effect you wish to enact creates resources, you'll probably need to clean them -up. In such cases you may simply return a function that addresses this from the -``did_render`` function which created the resource. Consider the case of opening and -then closing a connection: - -.. code-block:: - - def establish_connection(): - connection = open_connection() - return lambda: close_connection(connection) - - use_effect(establish_connection) - -The clean-up function will be run before the component is unmounted or, before the next -effect is triggered when the component re-renders. You can -:ref:`conditionally fire events <Conditional Effects>` to avoid triggering them each -time a component renders. - - -Conditional Effects -................... - -By default, effects are triggered after every successful render to ensure that all state -referenced by the effect is up to date. However, when an effect function references -non-global variables, the effect will only if the value of that variable changes. For -example, imagine that we had an effect that connected to a ``url`` state variable: - -.. code-block:: - - url, set_url = use_state("https://example.com") - - def establish_connection(): - connection = open_connection(url) - return lambda: close_connection(connection) - - use_effect(establish_connection) - -Here, a new connection will be established whenever a new ``url`` is set. - - -Async Effects -............. - -A behavior unique to ReactPy's implementation of ``use_effect`` is that it natively -supports ``async`` functions: - -.. code-block:: - - async def non_blocking_effect(): - resource = await do_something_asynchronously() - return lambda: blocking_close(resource) - - use_effect(non_blocking_effect) - - -There are **three important subtleties** to note about using asynchronous effects: - -1. The cleanup function must be a normal synchronous function. - -2. Asynchronous effects which do not complete before the next effect is created - following a re-render will be cancelled. This means an - :class:`~asyncio.CancelledError` will be raised somewhere in the body of the effect. - -3. An asynchronous effect may occur any time after the update which added this effect - and before the next effect following a subsequent update. - - -Manual Effect Conditions -........................ - -In some cases, you may want to explicitly declare when an effect should be triggered. -You can do this by passing ``dependencies`` to ``use_effect``. Each of the following -values produce different effect behaviors: - -- ``use_effect(..., dependencies=None)`` - triggers and cleans up on every render. -- ``use_effect(..., dependencies=[])`` - only triggers on the first and cleans up after - the last render. -- ``use_effect(..., dependencies=[x, y])`` - triggers on the first render and on subsequent renders if - ``x`` or ``y`` have changed. - - -Use Context ------------ - -.. code-block:: - - value = use_context(MyContext) - -Accepts a context object (the value returned from -:func:`reactpy.core.hooks.create_context`) and returns the current context value for that -context. The current context value is determined by the ``value`` argument passed to the -nearest ``MyContext`` in the tree. - -When the nearest <MyContext.Provider> above the component updates, this Hook will -trigger a rerender with the latest context value passed to that MyContext provider. Even -if an ancestor uses React.memo or shouldComponentUpdate, a rerender will still happen -starting at the component itself using useContext. - - -Supplementary Hooks -=================== - - -Use Reducer ------------ - -.. code-block:: - - state, dispatch_action = use_reducer(reducer, initial_state) - -An alternative and derivative of :ref:`Use State` the ``use_reducer`` hook, instead of -directly assigning a new state, allows you to specify an action which will transition -the previous state into the next state. This transition is defined by a reducer function -of the form ``(current_state, action) -> new_state``. The ``use_reducer`` hook then -returns the current state and a ``dispatch_action`` function that accepts an ``action`` -and causes a transition to the next state via the ``reducer``. - -``use_reducer`` is generally preferred to ``use_state`` if logic for transitioning from -one state to the next is especially complex or involves nested data structures. -``use_reducer`` can also be used to collect several ``use_state`` calls together - this -may be slightly more performant as well as being preferable since there is only one -``dispatch_action`` callback versus the many ``set_state`` callbacks. - -We can rework the :ref:`Functional Updates` counter example to use ``use_reducer``: - -.. reactpy:: _examples/use_reducer_counter - -.. note:: - - The identity of the ``dispatch_action`` function is guaranteed to be preserved - across re-renders throughout the lifetime of the component. This means it can safely - be omitted from dependency lists in :ref:`Use Effect` or :ref:`Use Callback`. - - -Use Callback ------------- - -.. code-block:: - - memoized_callback = use_callback(lambda: do_something(a, b)) - -A derivative of :ref:`Use Memo`, the ``use_callback`` hook returns a -`memoized <memoization>`_ callback. This is useful when passing callbacks to child -components which check reference equality to prevent unnecessary renders. The -``memoized_callback`` will only change when any local variables is references do. - -.. note:: - - You may manually specify what values the callback depends on in the :ref:`same way - as effects <Manual Effect Conditions>` using the ``dependencies`` parameter. - - -Use Memo --------- - -.. code-block:: - - memoized_value = use_memo(lambda: compute_something_expensive(a, b)) - -Returns a `memoized <memoization>`_ value. By passing a constructor function accepting -no arguments and an array of dependencies for that constructor, the ``use_callback`` -hook will return the value computed by the constructor. The ``memoized_value`` will only -be recomputed if a local variable referenced by the constructor changes (e.g. ``a`` or -``b`` here). This optimizes performance because you don't need to -``compute_something_expensive`` on every render. - -Unlike ``use_effect`` the constructor function is called during each render (instead of -after) and should not incur side effects. - -.. warning:: - - Remember that you shouldn't optimize something unless you know it's a performance - bottleneck. Write your code without ``use_memo`` first and then add it to targeted - sections that need a speed-up. - -.. note:: - - You may manually specify what values the callback depends on in the :ref:`same way - as effects <Manual Effect Conditions>` using the ``dependencies`` parameter. - - -Use Ref -------- - -.. code-block:: - - ref_container = use_ref(initial_value) - -Returns a mutable :class:`~reactpy.utils.Ref` object that has a single -:attr:`~reactpy.utils.Ref.current` attribute that at first contains the ``initial_state``. -The identity of the ``Ref`` object will be preserved for the lifetime of the component. - -A ``Ref`` is most useful if you need to incur side effects since updating its -``.current`` attribute doesn't trigger a re-render of the component. You'll often use this -hook alongside :ref:`Use Effect` or in response to component event handlers. - - -.. links -.. ===== - -.. _React Hooks: https://reactjs.org/docs/hooks-reference.html -.. _side effects: https://en.wikipedia.org/wiki/Side_effect_(computer_science) -.. _memoization: https://en.wikipedia.org/wiki/Memoization - - -Rules of Hooks -============== - -Hooks are just normal Python functions, but there's a bit of magic to them, and in order -for that magic to work you've got to follow two rules. Thankfully we supply a -:ref:`Flake8 Plugin` to help enforce them. - - -Only call outside flow controls -------------------------------- - -**Don't call hooks inside loops, conditions, or nested functions.** Instead you must -always call hooks at the top level of your functions. By adhering to this rule you -ensure that hooks are always called in the exact same order. This fact is what allows -ReactPy to preserve the state of hooks between multiple calls to ``useState`` and -``useEffect`` calls. - - -Only call in render functions ------------------------------ - -**Don't call hooks from regular Python functions.** Instead you should: - -- ✅ Call Hooks from a component's render function. - -- ✅ Call Hooks from another custom hook - -Following this rule ensures stateful logic for ReactPy component is always clearly -separated from the rest of your codebase. - - -Flake8 Plugin -------------- - -We provide a Flake8 plugin called `flake8-reactpy-hooks <Flake8 Linter Plugin>`_ that helps -to enforce the two rules described above. You can ``pip`` install it directly, or with -the ``lint`` extra for ReactPy: - -.. code-block:: bash - - pip install flake8-reactpy-hooks - -Once installed running, ``flake8`` on your code will start catching errors. For example: - -.. code-block:: bash - - flake8 my_reactpy_components.py - -Might produce something like the following output: - -.. code-block:: text - - ./my_reactpy_components:10:8 ROH102 hook 'use_effect' used inside if statement - ./my_reactpy_components:23:4 ROH102 hook 'use_state' used outside component or hook definition - -See the Flake8 docs for -`more info <https://flake8.pycqa.org/en/latest/user/configuration.html>`__. - -.. links -.. ===== - -.. _Flake8 Linter Plugin: https://github.com/reactive-python/flake8-reactpy-hooks diff --git a/docs/source/reference/html-attributes.rst b/docs/source/reference/html-attributes.rst deleted file mode 100644 index 91813c355..000000000 --- a/docs/source/reference/html-attributes.rst +++ /dev/null @@ -1,197 +0,0 @@ -.. testcode:: - - from reactpy import html - - -HTML Attributes -=============== - -In ReactPy, HTML attributes are specified using snake_case instead of dash-separated -words. For example, ``tabindex`` and ``margin-left`` become ``tab_index`` and -``margin_left`` respectively. - - -Notable Attributes -------------------- - -Some attributes in ReactPy are renamed, have special meaning, or are used differently -than in HTML. - -``style`` -......... - -As mentioned above, instead of using a string to specify the ``style`` attribute, we use -a dictionary to describe the CSS properties we want to apply to an element. For example, -the following HTML: - -.. code-block:: html - - <div style="width: 50%; margin-left: 25%;"> - <h1 style="margin-top: 0px;">My Todo List</h1> - <ul> - <li>Build a cool new app</li> - <li>Share it with the world!</li> - </ul> - </div> - -Would be written in ReactPy as: - -.. testcode:: - - html.div( - { - "style": { - "width": "50%", - "margin_left": "25%", - }, - }, - html.h1( - { - "style": { - "margin_top": "0px", - }, - }, - "My Todo List", - ), - html.ul( - html.li("Build a cool new app"), - html.li("Share it with the world!"), - ), - ) - -``class`` vs ``class_name`` -........................... - -In HTML, the ``class`` attribute is used to specify a CSS class for an element. In -ReactPy, this attribute is renamed to ``class_name`` to avoid conflicting with the -``class`` keyword in Python. For example, the following HTML: - -.. code-block:: html - - <div class="container"> - <h1 class="title">My Todo List</h1> - <ul class="list"> - <li class="item">Build a cool new app</li> - <li class="item">Share it with the world!</li> - </ul> - </div> - -Would be written in ReactPy as: - -.. testcode:: - - html.div( - {"class_name": "container"}, - html.h1({"class_name": "title"}, "My Todo List"), - html.ul( - {"class_name": "list"}, - html.li({"class_name": "item"}, "Build a cool new app"), - html.li({"class_name": "item"}, "Share it with the world!"), - ), - ) - -``for`` vs ``html_for`` -....................... - -In HTML, the ``for`` attribute is used to specify the ``id`` of the element it's -associated with. In ReactPy, this attribute is renamed to ``html_for`` to avoid -conflicting with the ``for`` keyword in Python. For example, the following HTML: - -.. code-block:: html - - <div> - <label for="todo">Todo:</label> - <input id="todo" type="text" /> - </div> - -Would be written in ReactPy as: - -.. testcode:: - - html.div( - html.label({"html_for": "todo"}, "Todo:"), - html.input({"id": "todo", "type": "text"}), - ) - -``dangerously_set_inner_HTML`` -.............................. - -This is used to set the ``innerHTML`` property of an element and should be provided a -dictionary with a single key ``__html`` whose value is the HTML to be set. It should be -used with **extreme caution** as it can lead to XSS attacks if the HTML inside isn't -trusted (for example if it comes from user input). - - -All Attributes --------------- - -`access_key <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/accesskey>`__ - A string. Specifies a keyboard shortcut for the element. Not generally recommended. - -`aria_* <https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes>`__ - ARIA attributes let you specify the accessibility tree information for this element. - See ARIA attributes for a complete reference. In ReactPy, all ARIA attribute names are - exactly the same as in HTML. - -`auto_capitalize <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/autocapitalize>`__ - A string. Specifies whether and how the user input should be capitalized. - -`content_editable <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/contenteditable>`__ - A boolean. If true, the browser lets the user edit the rendered element directly. This - is used to implement rich text input libraries like Lexical. ReactPy warns if you try - to pass children to an element with ``content_editable = True`` because ReactPy will - not be able to update its content after user edits. - -`data_* <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*>`__ - Data attributes let you attach some string data to the element, for example - data-fruit="banana". In ReactPy, they are not commonly used because you would usually - read data from props or state instead. - -`dir <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir>`__ - Either ``"ltr"`` or ``"rtl"``. Specifies the text direction of the element. - -`draggable <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/draggable>`__ - A boolean. Specifies whether the element is draggable. Part of HTML Drag and Drop API. - -`enter_key_hint <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/enterkeyhint>`__ - A string. Specifies which action to present for the enter key on virtual keyboards. - -`hidden <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/hidden>`__ - A boolean or a string. Specifies whether the element should be hidden. - -- `id <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id>`__: - A string. Specifies a unique identifier for this element, which can be used to find it - later or connect it with other elements. Generate it with useId to avoid clashes - between multiple instances of the same component. - -`is <https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#attr-is>`__ - A string. If specified, the component will behave like a custom element. - -`input_mode <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inputmode>`__ - A string. Specifies what kind of keyboard to display (for example, text, number, or telephone). - -`item_prop <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/itemprop>`__ - A string. Specifies which property the element represents for structured data crawlers. - -`lang <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang>`__ - A string. Specifies the language of the element. - -`role <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/role>`__ - A string. Specifies the element role explicitly for assistive technologies. - -`slot <https://developer.mozilla.org/en-US/docs/Web/HTML/Element/slot>`__ - A string. Specifies the slot name when using shadow DOM. In ReactPy, an equivalent - pattern is typically achieved by passing JSX as props, for example - ``<Layout left={<Sidebar />} right={<Content />} />``. - -`spell_check <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/spellcheck>`__ - A boolean or null. If explicitly set to true or false, enables or disables spellchecking. - -`tab_index <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex>`__ - A number. Overrides the default Tab button behavior. Avoid using values other than -1 and 0. - -`title <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/title>`__ - A string. Specifies the tooltip text for the element. - -`translate <https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/translate>`__ - Either 'yes' or 'no'. Passing 'no' excludes the element content from being translated. diff --git a/docs/source/reference/javascript-api.rst b/docs/source/reference/javascript-api.rst deleted file mode 100644 index 2587be82d..000000000 --- a/docs/source/reference/javascript-api.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. _Javascript API: - -Javascript API 🚧 -================= - -.. note:: - - Under construction 🚧 diff --git a/docs/source/reference/specifications.rst b/docs/source/reference/specifications.rst deleted file mode 100644 index 3a5c94893..000000000 --- a/docs/source/reference/specifications.rst +++ /dev/null @@ -1,170 +0,0 @@ -Specifications -============== - -Describes various data structures and protocols used to define and communicate virtual -document object models (:ref:`VDOM`). The definitions below follow in the footsteps of -`a specification <https://github.com/nteract/vdom/blob/master/docs/mimetype-spec.md>`_ -created by `Nteract <https://nteract.io>`_ and which was built into -`JupyterLab <https://jupyterlab.readthedocs.io/en/stable/>`_. While ReactPy's specification -for VDOM is fairly well established, it should not be relied until it's been fully -adopted by the aforementioned organizations. - - -VDOM ----- - -A set of definitions that explain how ReactPy creates a virtual representation of -the document object model. We'll begin by looking at a bit of HTML that we'll convert -into its VDOM representation: - -.. code-block:: html - - <div> - Put your name here: - <input - type="text" - minlength="4" - maxlength="8" - onchange="a_python_callback(event)" - /> - </div> - -.. note:: - - For context, the following Python code would generate the HTML above: - - .. code-block:: python - - import reactpy - - async def a_python_callback(new): - ... - - name_input_view = reactpy.html.div( - reactpy.html.input( - { - "type": "text", - "minLength": 4, - "maxLength": 8, - "onChange": a_python_callback, - } - ), - ["Put your name here: "], - ) - -We'll take this step by step in order to show exactly where each piece of the VDOM -model comes from. To get started we'll convert the outer ``<div/>``: - -.. code-block:: python - - { - "tagName": "div", - "children": [ - "To perform an action", - ... - ], - "attributes": {}, - "eventHandlers": {} - } - -.. note:: - - As we move though our conversation we'll be using ``...`` to fill in places that we - haven't converted yet. - -In this simple case, all we've done is take the name of the HTML element (``div`` in -this case) and inserted it into the ``tagName`` field of a dictionary. Then we've taken -the inner HTML and added to a list of children where the text ``"to perform an action"`` -has been made into a string, and the inner ``input`` (yet to be converted) will be -expanded out into its own VDOM representation. Since the outer ``div`` is pretty simple -there aren't any ``attributes`` or ``eventHandlers``. - -No we come to the inner ``input``. If we expand this out now we'll get the following: - -.. code-block:: python - - { - "tagName": "div", - "children": [ - "To perform an action", - { - "tagName": "input", - "children": [], - "attributes": { - "type": "text", - "minLength": 4, - "maxLength": 8 - }, - "eventHandlers": ... - } - ], - "attributes": {}, - "eventHandlers": {} - } - -Here we've had to add some attributes to our VDOM. Take note of the differing -capitalization - instead of using all lowercase (an HTML convention) we've used -`camelCase <https://en.wikipedia.org/wiki/Camel_case>`_ which is very common -in JavaScript. - -Last, but not least we come to the ``eventHandlers`` for the ``input``: - -.. code-block:: python - - { - "tagName": "div", - "children": [ - "To perform an action", - { - "tagName": "input", - "children": [], - "attributes": { - "type": "text", - "minLength": 4, - "maxLength": 8 - }, - "eventHandlers": { - "onChange": { - "target": "unique-id-of-a_python_callback", - "preventDefault": False, - "stopPropagation": False - } - } - } - ], - "attributes": {}, - "eventHandlers": {} - } - -Again we've changed the all lowercase ``onchange`` into a cameCase ``onChange`` event -type name. The various properties for the ``onChange`` handler are: - -- ``target``: the unique ID for a Python callback that exists in the backend. - -- ``preventDefault``: Stop the event's default action. More info - `here <https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault>`__. - -- ``stopPropagation``: prevent the event from bubbling up through the DOM. More info - `here <https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation>`__. - - -VDOM JSON Schema -................ - -To clearly describe the VDOM spec we've created a `JSON Schema <https://json-schema.org/>`_: - -.. literalinclude:: _static/vdom-json-schema.json - :language: json - - -JSON Patch ----------- - -Updates to VDOM modules are sent using the `JSON Patch`_ specification. - -... this section is still Under construction 🚧 - - -.. Links -.. ===== -.. _JSON Patch: http://jsonpatch.com/ diff --git a/docs/src/about/changelog.md b/docs/src/about/changelog.md new file mode 100644 index 000000000..40c649d3e --- /dev/null +++ b/docs/src/about/changelog.md @@ -0,0 +1,11 @@ +--- +title: Changelog +hide: + - toc +--- + +!!! note "Attribution" + + {% include-markdown "../../../CHANGELOG.md" start="<!--attr-start-->" end="<!--attr-end-->" %} + +{% include-markdown "../../../CHANGELOG.md" start="<!--changelog-start-->" %} diff --git a/docs/src/about/code.md b/docs/src/about/code.md new file mode 100644 index 000000000..b62ac3725 --- /dev/null +++ b/docs/src/about/code.md @@ -0,0 +1,3 @@ +--- +title: Contributing Code 🚧 +--- diff --git a/docs/src/about/community.md b/docs/src/about/community.md new file mode 100644 index 000000000..a2aaf44d8 --- /dev/null +++ b/docs/src/about/community.md @@ -0,0 +1,3 @@ +--- +title: Community 🚧 +--- diff --git a/docs/src/about/docs.md b/docs/src/about/docs.md new file mode 100644 index 000000000..cf935525e --- /dev/null +++ b/docs/src/about/docs.md @@ -0,0 +1,3 @@ +--- +title: Contributing Documentation 🚧 +--- diff --git a/docs/src/about/running-tests.md b/docs/src/about/running-tests.md new file mode 100644 index 000000000..714a7456c --- /dev/null +++ b/docs/src/about/running-tests.md @@ -0,0 +1,3 @@ +--- +title: Running Tests 🚧 +--- diff --git a/docs/src/dictionary.txt b/docs/src/dictionary.txt new file mode 100644 index 000000000..af891a7e5 --- /dev/null +++ b/docs/src/dictionary.txt @@ -0,0 +1,28 @@ +django +nox +websocket +websockets +changelog +async +pre +prefetch +prefetching +preloader +whitespace +refetch +refetched +refetching +html +jupyter +webserver +iframe +keyworded +stylesheet +stylesheets +unstyled +py +idom +reactpy +asgi +postfixed +postprocessing diff --git a/docs/src/index.md b/docs/src/index.md new file mode 100644 index 000000000..ae43c6a82 --- /dev/null +++ b/docs/src/index.md @@ -0,0 +1,57 @@ +--- +hide: + - navigation + - toc +--- + +[ReactPy](https://reactpy.dev/) is a library for building user interfaces in Python without Javascript. ReactPy interfaces are made from components that look and behave similar to those found in [ReactJS](https://reactjs.org/). Designed with simplicity in mind, ReactPy can be used by those without web development experience while also being powerful enough to grow with your ambitions. + +<table align="center"> + <thead> + <tr> + <th colspan="2" style="text-align: center">Supported Backends</th> + <tr> + <th style="text-align: center">Built-in</th> + <th style="text-align: center">External</th> + </tr> + </thead> + <tbody> + <tr> + <td> + <a href="https://reactpy.dev/docs/guides/getting-started/installing-reactpy.html#officially-supported-servers"> + Flask, FastAPI, Sanic, Tornado + </a> + </td> + <td> + <a href="https://github.com/reactive-python/reactpy-django">Django</a>, + <a href="https://github.com/reactive-python/reactpy-jupyter">Jupyter</a>, + <a href="https://github.com/idom-team/idom-dash">Plotly-Dash</a> + </td> + </tr> + </tbody> +</table> + +# At a Glance + +To get a rough idea of how to write apps in ReactPy, take a look at this tiny _Hello World_ application. + +```python +from reactpy import component, html, run + +@component +def hello_world(): + return html.h1("Hello, World!") + +run(hello_world) +``` + +# Resources + +Follow the links below to find out more about this project. + +- [Try ReactPy (Jupyter Notebook)](https://mybinder.org/v2/gh/reactive-python/reactpy-jupyter/main?urlpath=lab/tree/notebooks/introduction.ipynb) +- [Documentation](https://reactpy.dev/) +- [GitHub Discussions](https://github.com/reactive-python/reactpy/discussions) +- [Discord](https://discord.gg/uNb5P4hA9X) +- [Contributor Guide](https://reactpy.dev/docs/about/contributor-guide.html) +- [Code of Conduct](https://github.com/reactive-python/reactpy/blob/main/CODE_OF_CONDUCT.md) diff --git a/docs/src/learn/add-react-to-an-existing-project.md b/docs/src/learn/add-react-to-an-existing-project.md new file mode 100644 index 000000000..73a3b0bc1 --- /dev/null +++ b/docs/src/learn/add-react-to-an-existing-project.md @@ -0,0 +1,153 @@ +--- +title: Add React to an Existing Project 🚧 +--- + +## Overview + +<p class="intro" markdown> + +If you want to add some interactivity to your existing project, you don't have to rewrite it in React. Add React to your existing stack, and render interactive React components anywhere. + +</p> + +<Note> + +**You need to install [Node.js](https://nodejs.org/en/) for local development.** Although you can [try React](/learn/installation#try-react) online or with a simple HTML page, realistically most JavaScript tooling you'll want to use for development requires Node.js. + +</Note> + +## Using React for an entire subroute of your existing website + +Let's say you have an existing web app at `example.com` built with another server technology (like Rails), and you want to implement all routes starting with `example.com/some-app/` fully with React. + +Here's how we recommend to set it up: + +1. **Build the React part of your app** using one of the [React-based frameworks](/learn/start-a-new-react-project). +2. **Specify `/some-app` as the _base path_** in your framework's configuration (here's how: [Next.js](https://nextjs.org/docs/api-reference/next.config.js/basepath), [Gatsby](https://www.gatsbyjs.com/docs/how-to/previews-deploys-hosting/path-prefix/)). +3. **Configure your server or a proxy** so that all requests under `/some-app/` are handled by your React app. + +This ensures the React part of your app can [benefit from the best practices](/learn/start-a-new-react-project#can-i-use-react-without-a-framework) baked into those frameworks. + +Many React-based frameworks are full-stack and let your React app take advantage of the server. However, you can use the same approach even if you can't or don't want to run JavaScript on the server. In that case, serve the HTML/CSS/JS export ([`next export` output](https://nextjs.org/docs/advanced-features/static-html-export) for Next.js, default for Gatsby) at `/some-app/` instead. + +## Using React for a part of your existing page + +Let's say you have an existing page built with another technology (either a server one like Rails, or a client one like Backbone), and you want to render interactive React components somewhere on that page. That's a common way to integrate React--in fact, it's how most React usage looked at Meta for many years! + +You can do this in two steps: + +1. **Set up a JavaScript environment** that lets you use the [JSX syntax](/learn/writing-markup-with-jsx), split your code into modules with the [`import`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) / [`export`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export) syntax, and use packages (for example, React) from the [npm](https://www.npmjs.com/) package registry. +2. **Render your React components** where you want to see them on the page. + +The exact approach depends on your existing page setup, so let's walk through some details. + +### Step 1: Set up a modular JavaScript environment + +A modular JavaScript environment lets you write your React components in individual files, as opposed to writing all of your code in a single file. It also lets you use all the wonderful packages published by other developers on the [npm](https://www.npmjs.com/) registry--including React itself! How you do this depends on your existing setup: + +- **If your app is already split into files that use `import` statements,** try to use the setup you already have. Check whether writing `<div />` in your JS code causes a syntax error. If it causes a syntax error, you might need to [transform your JavaScript code with Babel](https://babeljs.io/setup), and enable the [Babel React preset](https://babeljs.io/docs/babel-preset-react) to use JSX. + +- **If your app doesn't have an existing setup for compiling JavaScript modules,** set it up with [Vite](https://vitejs.dev/). The Vite community maintains [many integrations with backend frameworks](https://github.com/vitejs/awesome-vite#integrations-with-backends), including Rails, Django, and Laravel. If your backend framework is not listed, [follow this guide](https://vitejs.dev/guide/backend-integration.html) to manually integrate Vite builds with your backend. + +To check whether your setup works, run this command in your project folder: + +<TerminalBlock> +npm install react react-dom +</TerminalBlock> + +Then add these lines of code at the top of your main JavaScript file (it might be called `index.js` or `main.js`): + +```html +<!DOCTYPE html> +<html> + <head> + <title>My app</title> + </head> + <body> + <!-- Your existing page content (in this example, it gets replaced) --> + </body> +</html> +``` + +```js +import { createRoot } from "react-dom/client"; + +// Clear the existing HTML content +document.body.innerHTML = '<div id="app"></div>'; + +// Render your React component instead +const root = createRoot(document.getElementById("app")); +root.render(<h1>Hello, world</h1>); +``` + +If the entire content of your page was replaced by a "Hello, world!", everything worked! Keep reading. + +<Note> + +Integrating a modular JavaScript environment into an existing project for the first time can feel intimidating, but it's worth it! If you get stuck, try our [community resources](/community) or the [Vite Chat](https://chat.vitejs.dev/). + +</Note> + +### Step 2: Render React components anywhere on the page + +In the previous step, you put this code at the top of your main file: + +```js +import { createRoot } from "react-dom/client"; + +// Clear the existing HTML content +document.body.innerHTML = '<div id="app"></div>'; + +// Render your React component instead +const root = createRoot(document.getElementById("app")); +root.render(<h1>Hello, world</h1>); +``` + +Of course, you don't actually want to clear the existing HTML content! + +Delete this code. + +Instead, you probably want to render your React components in specific places in your HTML. Open your HTML page (or the server templates that generate it) and add a unique [`id`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id) attribute to any tag, for example: + +```html +<!-- ... somewhere in your html ... --> +<nav id="navigation"></nav> +<!-- ... more html ... --> +``` + +This lets you find that HTML element with [`document.getElementById`](https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById) and pass it to [`createRoot`](/reference/react-dom/client/createRoot) so that you can render your own React component inside: + +```html +<!DOCTYPE html> +<html> + <head> + <title>My app</title> + </head> + <body> + <p>This paragraph is a part of HTML.</p> + <nav id="navigation"></nav> + <p>This paragraph is also a part of HTML.</p> + </body> +</html> +``` + +```js +import { createRoot } from "react-dom/client"; + +function NavigationBar() { + // TODO: Actually implement a navigation bar + return <h1>Hello from React!</h1>; +} + +const domNode = document.getElementById("navigation"); +const root = createRoot(domNode); +root.render(<NavigationBar />); +``` + +Notice how the original HTML content from `index.html` is preserved, but your own `NavigationBar` React component now appears inside the `<nav id="navigation">` from your HTML. Read the [`createRoot` usage documentation](/reference/react-dom/client/createRoot#rendering-a-page-partially-built-with-react) to learn more about rendering React components inside an existing HTML page. + +When you adopt React in an existing project, it's common to start with small interactive components (like buttons), and then gradually keep "moving upwards" until eventually your entire page is built with React. If you ever reach that point, we recommend migrating to [a React framework](/learn/start-a-new-react-project) right after to get the most out of React. + +## Using React Native in an existing native mobile app + +[React Native](https://reactnative.dev/) can also be integrated into existing native apps incrementally. If you have an existing native app for Android (Java or Kotlin) or iOS (Objective-C or Swift), [follow this guide](https://reactnative.dev/docs/integration-with-existing-apps) to add a React Native screen to it. diff --git a/docs/src/learn/choosing-the-state-structure.md b/docs/src/learn/choosing-the-state-structure.md new file mode 100644 index 000000000..2a40ef2d5 --- /dev/null +++ b/docs/src/learn/choosing-the-state-structure.md @@ -0,0 +1,2866 @@ +--- +title: Choosing the State Structure 🚧 +--- + +## Overview + +<p class="intro" markdown> + +Structuring state well can make a difference between a component that is pleasant to modify and debug, and one that is a constant source of bugs. Here are some tips you should consider when structuring state. + +</p> + +!!! summary "You Will Learn" + + - When to use a single vs multiple state variables + - What to avoid when organizing state + - How to fix common issues with the state structure + +## Principles for structuring state + +When you write a component that holds some state, you'll have to make choices about how many state variables to use and what the shape of their data should be. While it's possible to write correct programs even with a suboptimal state structure, there are a few principles that can guide you to make better choices: + +1. **Group related state.** If you always update two or more state variables at the same time, consider merging them into a single state variable. +2. **Avoid contradictions in state.** When the state is structured in a way that several pieces of state may contradict and "disagree" with each other, you leave room for mistakes. Try to avoid this. +3. **Avoid redundant state.** If you can calculate some information from the component's props or its existing state variables during rendering, you should not put that information into that component's state. +4. **Avoid duplication in state.** When the same data is duplicated between multiple state variables, or within nested objects, it is difficult to keep them in sync. Reduce duplication when you can. +5. **Avoid deeply nested state.** Deeply hierarchical state is not very convenient to update. When possible, prefer to structure state in a flat way. + +The goal behind these principles is to _make state easy to update without introducing mistakes_. Removing redundant and duplicate data from state helps ensure that all its pieces stay in sync. This is similar to how a database engineer might want to ["normalize" the database structure](https://docs.microsoft.com/en-us/office/troubleshoot/access/database-normalization-description) to reduce the chance of bugs. To paraphrase Albert Einstein, **"Make your state as simple as it can be--but no simpler."** + +Now let's see how these principles apply in action. + +## Group related state + +You might sometimes be unsure between using a single or multiple state variables. + +Should you do this? + +```js +const [x, setX] = useState(0); +const [y, setY] = useState(0); +``` + +Or this? + +```js +const [position, setPosition] = useState({ x: 0, y: 0 }); +``` + +Technically, you can use either of these approaches. But **if some two state variables always change together, it might be a good idea to unify them into a single state variable.** Then you won't forget to always keep them in sync, like in this example where moving the cursor updates both coordinates of the red dot: + +```js +import { useState } from "react"; + +export default function MovingDot() { + const [position, setPosition] = useState({ + x: 0, + y: 0, + }); + return ( + <div + onPointerMove={(e) => { + setPosition({ + x: e.clientX, + y: e.clientY, + }); + }} + style={{ + position: "relative", + width: "100vw", + height: "100vh", + }} + > + <div + style={{ + position: "absolute", + backgroundColor: "red", + borderRadius: "50%", + transform: `translate(${position.x}px, ${position.y}px)`, + left: -10, + top: -10, + width: 20, + height: 20, + }} + /> + </div> + ); +} +``` + +```css +body { + margin: 0; + padding: 0; + height: 250px; +} +``` + +Another case where you'll group data into an object or an array is when you don't know how many pieces of state you'll need. For example, it's helpful when you have a form where the user can add custom fields. + +<Pitfall> + +If your state variable is an object, remember that [you can't update only one field in it](/learn/updating-objects-in-state) without explicitly copying the other fields. For example, you can't do `setPosition({ x: 100 })` in the above example because it would not have the `y` property at all! Instead, if you wanted to set `x` alone, you would either do `setPosition({ ...position, x: 100 })`, or split them into two state variables and do `setX(100)`. + +</Pitfall> + +## Avoid contradictions in state + +Here is a hotel feedback form with `isSending` and `isSent` state variables: + +```js +import { useState } from "react"; + +export default function FeedbackForm() { + const [text, setText] = useState(""); + const [isSending, setIsSending] = useState(false); + const [isSent, setIsSent] = useState(false); + + async function handleSubmit(e) { + e.preventDefault(); + setIsSending(true); + await sendMessage(text); + setIsSending(false); + setIsSent(true); + } + + if (isSent) { + return <h1>Thanks for feedback!</h1>; + } + + return ( + <form onSubmit={handleSubmit}> + <p>How was your stay at The Prancing Pony?</p> + <textarea + disabled={isSending} + value={text} + onChange={(e) => setText(e.target.value)} + /> + <br /> + <button disabled={isSending} type="submit"> + Send + </button> + {isSending && <p>Sending...</p>} + </form> + ); +} + +// Pretend to send a message. +function sendMessage(text) { + return new Promise((resolve) => { + setTimeout(resolve, 2000); + }); +} +``` + +While this code works, it leaves the door open for "impossible" states. For example, if you forget to call `setIsSent` and `setIsSending` together, you may end up in a situation where both `isSending` and `isSent` are `true` at the same time. The more complex your component is, the harder it is to understand what happened. + +**Since `isSending` and `isSent` should never be `true` at the same time, it is better to replace them with one `status` state variable that may take one of _three_ valid states:** `'typing'` (initial), `'sending'`, and `'sent'`: + +```js +import { useState } from "react"; + +export default function FeedbackForm() { + const [text, setText] = useState(""); + const [status, setStatus] = useState("typing"); + + async function handleSubmit(e) { + e.preventDefault(); + setStatus("sending"); + await sendMessage(text); + setStatus("sent"); + } + + const isSending = status === "sending"; + const isSent = status === "sent"; + + if (isSent) { + return <h1>Thanks for feedback!</h1>; + } + + return ( + <form onSubmit={handleSubmit}> + <p>How was your stay at The Prancing Pony?</p> + <textarea + disabled={isSending} + value={text} + onChange={(e) => setText(e.target.value)} + /> + <br /> + <button disabled={isSending} type="submit"> + Send + </button> + {isSending && <p>Sending...</p>} + </form> + ); +} + +// Pretend to send a message. +function sendMessage(text) { + return new Promise((resolve) => { + setTimeout(resolve, 2000); + }); +} +``` + +You can still declare some constants for readability: + +```js +const isSending = status === "sending"; +const isSent = status === "sent"; +``` + +But they're not state variables, so you don't need to worry about them getting out of sync with each other. + +## Avoid redundant state + +If you can calculate some information from the component's props or its existing state variables during rendering, you **should not** put that information into that component's state. + +For example, take this form. It works, but can you find any redundant state in it? + +```js +import { useState } from "react"; + +export default function Form() { + const [firstName, setFirstName] = useState(""); + const [lastName, setLastName] = useState(""); + const [fullName, setFullName] = useState(""); + + function handleFirstNameChange(e) { + setFirstName(e.target.value); + setFullName(e.target.value + " " + lastName); + } + + function handleLastNameChange(e) { + setLastName(e.target.value); + setFullName(firstName + " " + e.target.value); + } + + return ( + <> + <h2>Let’s check you in</h2> + <label> + First name:{" "} + <input value={firstName} onChange={handleFirstNameChange} /> + </label> + <label> + Last name:{" "} + <input value={lastName} onChange={handleLastNameChange} /> + </label> + <p> + Your ticket will be issued to: <b>{fullName}</b> + </p> + </> + ); +} +``` + +```css +label { + display: block; + margin-bottom: 5px; +} +``` + +This form has three state variables: `firstName`, `lastName`, and `fullName`. However, `fullName` is redundant. **You can always calculate `fullName` from `firstName` and `lastName` during render, so remove it from state.** + +This is how you can do it: + +```js +import { useState } from "react"; + +export default function Form() { + const [firstName, setFirstName] = useState(""); + const [lastName, setLastName] = useState(""); + + const fullName = firstName + " " + lastName; + + function handleFirstNameChange(e) { + setFirstName(e.target.value); + } + + function handleLastNameChange(e) { + setLastName(e.target.value); + } + + return ( + <> + <h2>Let’s check you in</h2> + <label> + First name:{" "} + <input value={firstName} onChange={handleFirstNameChange} /> + </label> + <label> + Last name:{" "} + <input value={lastName} onChange={handleLastNameChange} /> + </label> + <p> + Your ticket will be issued to: <b>{fullName}</b> + </p> + </> + ); +} +``` + +```css +label { + display: block; + margin-bottom: 5px; +} +``` + +Here, `fullName` is _not_ a state variable. Instead, it's calculated during render: + +```js +const fullName = firstName + " " + lastName; +``` + +As a result, the change handlers don't need to do anything special to update it. When you call `setFirstName` or `setLastName`, you trigger a re-render, and then the next `fullName` will be calculated from the fresh data. + +<DeepDive> + +#### Don't mirror props in state + +A common example of redundant state is code like this: + +```js +function Message({ messageColor }) { + const [color, setColor] = useState(messageColor); +``` + +Here, a `color` state variable is initialized to the `messageColor` prop. The problem is that **if the parent component passes a different value of `messageColor` later (for example, `'red'` instead of `'blue'`), the `color` _state variable_ would not be updated!** The state is only initialized during the first render. + +This is why "mirroring" some prop in a state variable can lead to confusion. Instead, use the `messageColor` prop directly in your code. If you want to give it a shorter name, use a constant: + +```js +function Message({ messageColor }) { + const color = messageColor; +``` + +This way it won't get out of sync with the prop passed from the parent component. + +"Mirroring" props into state only makes sense when you _want_ to ignore all updates for a specific prop. By convention, start the prop name with `initial` or `default` to clarify that its new values are ignored: + +```js +function Message({ initialColor }) { + // The `color` state variable holds the *first* value of `initialColor`. + // Further changes to the `initialColor` prop are ignored. + const [color, setColor] = useState(initialColor); +``` + +</DeepDive> + +## Avoid duplication in state + +This menu list component lets you choose a single travel snack out of several: + +```js +import { useState } from "react"; + +const initialItems = [ + { title: "pretzels", id: 0 }, + { title: "crispy seaweed", id: 1 }, + { title: "granola bar", id: 2 }, +]; + +export default function Menu() { + const [items, setItems] = useState(initialItems); + const [selectedItem, setSelectedItem] = useState(items[0]); + + return ( + <> + <h2>What's your travel snack?</h2> + <ul> + {items.map((item) => ( + <li key={item.id}> + {item.title}{" "} + <button + on_click={() => { + setSelectedItem(item); + }} + > + Choose + </button> + </li> + ))} + </ul> + <p>You picked {selectedItem.title}.</p> + </> + ); +} +``` + +```css +button { + margin-top: 10px; +} +``` + +Currently, it stores the selected item as an object in the `selectedItem` state variable. However, this is not great: **the contents of the `selectedItem` is the same object as one of the items inside the `items` list.** This means that the information about the item itself is duplicated in two places. + +Why is this a problem? Let's make each item editable: + +```js +import { useState } from "react"; + +const initialItems = [ + { title: "pretzels", id: 0 }, + { title: "crispy seaweed", id: 1 }, + { title: "granola bar", id: 2 }, +]; + +export default function Menu() { + const [items, setItems] = useState(initialItems); + const [selectedItem, setSelectedItem] = useState(items[0]); + + function handleItemChange(id, e) { + setItems( + items.map((item) => { + if (item.id === id) { + return { + ...item, + title: e.target.value, + }; + } else { + return item; + } + }) + ); + } + + return ( + <> + <h2>What's your travel snack?</h2> + <ul> + {items.map((item, index) => ( + <li key={item.id}> + <input + value={item.title} + onChange={(e) => { + handleItemChange(item.id, e); + }} + />{" "} + <button + on_click={() => { + setSelectedItem(item); + }} + > + Choose + </button> + </li> + ))} + </ul> + <p>You picked {selectedItem.title}.</p> + </> + ); +} +``` + +```css +button { + margin-top: 10px; +} +``` + +Notice how if you first click "Choose" on an item and _then_ edit it, **the input updates but the label at the bottom does not reflect the edits.** This is because you have duplicated state, and you forgot to update `selectedItem`. + +Although you could update `selectedItem` too, an easier fix is to remove duplication. In this example, instead of a `selectedItem` object (which creates a duplication with objects inside `items`), you hold the `selectedId` in state, and _then_ get the `selectedItem` by searching the `items` array for an item with that ID: + +```js +import { useState } from "react"; + +const initialItems = [ + { title: "pretzels", id: 0 }, + { title: "crispy seaweed", id: 1 }, + { title: "granola bar", id: 2 }, +]; + +export default function Menu() { + const [items, setItems] = useState(initialItems); + const [selectedId, setSelectedId] = useState(0); + + const selectedItem = items.find((item) => item.id === selectedId); + + function handleItemChange(id, e) { + setItems( + items.map((item) => { + if (item.id === id) { + return { + ...item, + title: e.target.value, + }; + } else { + return item; + } + }) + ); + } + + return ( + <> + <h2>What's your travel snack?</h2> + <ul> + {items.map((item, index) => ( + <li key={item.id}> + <input + value={item.title} + onChange={(e) => { + handleItemChange(item.id, e); + }} + />{" "} + <button + on_click={() => { + setSelectedId(item.id); + }} + > + Choose + </button> + </li> + ))} + </ul> + <p>You picked {selectedItem.title}.</p> + </> + ); +} +``` + +```css +button { + margin-top: 10px; +} +``` + +(Alternatively, you may hold the selected index in state.) + +The state used to be duplicated like this: + +- `items = [{ id: 0, title: 'pretzels'}, ...]` +- `selectedItem = {id: 0, title: 'pretzels'}` + +But after the change it's like this: + +- `items = [{ id: 0, title: 'pretzels'}, ...]` +- `selectedId = 0` + +The duplication is gone, and you only keep the essential state! + +Now if you edit the _selected_ item, the message below will update immediately. This is because `setItems` triggers a re-render, and `items.find(...)` would find the item with the updated title. You didn't need to hold _the selected item_ in state, because only the _selected ID_ is essential. The rest could be calculated during render. + +## Avoid deeply nested state + +Imagine a travel plan consisting of planets, continents, and countries. You might be tempted to structure its state using nested objects and arrays, like in this example: + +```js +import { useState } from "react"; +import { initialTravelPlan } from "./places.js"; + +function PlaceTree({ place }) { + const childPlaces = place.childPlaces; + return ( + <li> + {place.title} + {childPlaces.length > 0 && ( + <ol> + {childPlaces.map((place) => ( + <PlaceTree key={place.id} place={place} /> + ))} + </ol> + )} + </li> + ); +} + +export default function TravelPlan() { + const [plan, setPlan] = useState(initialTravelPlan); + const planets = plan.childPlaces; + return ( + <> + <h2>Places to visit</h2> + <ol> + {planets.map((place) => ( + <PlaceTree key={place.id} place={place} /> + ))} + </ol> + </> + ); +} +``` + +```js +export const initialTravelPlan = { + id: 0, + title: "(Root)", + childPlaces: [ + { + id: 1, + title: "Earth", + childPlaces: [ + { + id: 2, + title: "Africa", + childPlaces: [ + { + id: 3, + title: "Botswana", + childPlaces: [], + }, + { + id: 4, + title: "Egypt", + childPlaces: [], + }, + { + id: 5, + title: "Kenya", + childPlaces: [], + }, + { + id: 6, + title: "Madagascar", + childPlaces: [], + }, + { + id: 7, + title: "Morocco", + childPlaces: [], + }, + { + id: 8, + title: "Nigeria", + childPlaces: [], + }, + { + id: 9, + title: "South Africa", + childPlaces: [], + }, + ], + }, + { + id: 10, + title: "Americas", + childPlaces: [ + { + id: 11, + title: "Argentina", + childPlaces: [], + }, + { + id: 12, + title: "Brazil", + childPlaces: [], + }, + { + id: 13, + title: "Barbados", + childPlaces: [], + }, + { + id: 14, + title: "Canada", + childPlaces: [], + }, + { + id: 15, + title: "Jamaica", + childPlaces: [], + }, + { + id: 16, + title: "Mexico", + childPlaces: [], + }, + { + id: 17, + title: "Trinidad and Tobago", + childPlaces: [], + }, + { + id: 18, + title: "Venezuela", + childPlaces: [], + }, + ], + }, + { + id: 19, + title: "Asia", + childPlaces: [ + { + id: 20, + title: "China", + childPlaces: [], + }, + { + id: 21, + title: "Hong Kong", + childPlaces: [], + }, + { + id: 22, + title: "India", + childPlaces: [], + }, + { + id: 23, + title: "Singapore", + childPlaces: [], + }, + { + id: 24, + title: "South Korea", + childPlaces: [], + }, + { + id: 25, + title: "Thailand", + childPlaces: [], + }, + { + id: 26, + title: "Vietnam", + childPlaces: [], + }, + ], + }, + { + id: 27, + title: "Europe", + childPlaces: [ + { + id: 28, + title: "Croatia", + childPlaces: [], + }, + { + id: 29, + title: "France", + childPlaces: [], + }, + { + id: 30, + title: "Germany", + childPlaces: [], + }, + { + id: 31, + title: "Italy", + childPlaces: [], + }, + { + id: 32, + title: "Portugal", + childPlaces: [], + }, + { + id: 33, + title: "Spain", + childPlaces: [], + }, + { + id: 34, + title: "Turkey", + childPlaces: [], + }, + ], + }, + { + id: 35, + title: "Oceania", + childPlaces: [ + { + id: 36, + title: "Australia", + childPlaces: [], + }, + { + id: 37, + title: "Bora Bora (French Polynesia)", + childPlaces: [], + }, + { + id: 38, + title: "Easter Island (Chile)", + childPlaces: [], + }, + { + id: 39, + title: "Fiji", + childPlaces: [], + }, + { + id: 40, + title: "Hawaii (the USA)", + childPlaces: [], + }, + { + id: 41, + title: "New Zealand", + childPlaces: [], + }, + { + id: 42, + title: "Vanuatu", + childPlaces: [], + }, + ], + }, + ], + }, + { + id: 43, + title: "Moon", + childPlaces: [ + { + id: 44, + title: "Rheita", + childPlaces: [], + }, + { + id: 45, + title: "Piccolomini", + childPlaces: [], + }, + { + id: 46, + title: "Tycho", + childPlaces: [], + }, + ], + }, + { + id: 47, + title: "Mars", + childPlaces: [ + { + id: 48, + title: "Corn Town", + childPlaces: [], + }, + { + id: 49, + title: "Green Hill", + childPlaces: [], + }, + ], + }, + ], +}; +``` + +Now let's say you want to add a button to delete a place you've already visited. How would you go about it? [Updating nested state](/learn/updating-objects-in-state#updating-a-nested-object) involves making copies of objects all the way up from the part that changed. Deleting a deeply nested place would involve copying its entire parent place chain. Such code can be very verbose. + +**If the state is too nested to update easily, consider making it "flat".** Here is one way you can restructure this data. Instead of a tree-like structure where each `place` has an array of _its child places_, you can have each place hold an array of _its child place IDs_. Then store a mapping from each place ID to the corresponding place. + +This data restructuring might remind you of seeing a database table: + +```js +import { useState } from "react"; +import { initialTravelPlan } from "./places.js"; + +function PlaceTree({ id, placesById }) { + const place = placesById[id]; + const childIds = place.childIds; + return ( + <li> + {place.title} + {childIds.length > 0 && ( + <ol> + {childIds.map((childId) => ( + <PlaceTree + key={childId} + id={childId} + placesById={placesById} + /> + ))} + </ol> + )} + </li> + ); +} + +export default function TravelPlan() { + const [plan, setPlan] = useState(initialTravelPlan); + const root = plan[0]; + const planetIds = root.childIds; + return ( + <> + <h2>Places to visit</h2> + <ol> + {planetIds.map((id) => ( + <PlaceTree key={id} id={id} placesById={plan} /> + ))} + </ol> + </> + ); +} +``` + +```js +export const initialTravelPlan = { + 0: { + id: 0, + title: "(Root)", + childIds: [1, 43, 47], + }, + 1: { + id: 1, + title: "Earth", + childIds: [2, 10, 19, 27, 35], + }, + 2: { + id: 2, + title: "Africa", + childIds: [3, 4, 5, 6, 7, 8, 9], + }, + 3: { + id: 3, + title: "Botswana", + childIds: [], + }, + 4: { + id: 4, + title: "Egypt", + childIds: [], + }, + 5: { + id: 5, + title: "Kenya", + childIds: [], + }, + 6: { + id: 6, + title: "Madagascar", + childIds: [], + }, + 7: { + id: 7, + title: "Morocco", + childIds: [], + }, + 8: { + id: 8, + title: "Nigeria", + childIds: [], + }, + 9: { + id: 9, + title: "South Africa", + childIds: [], + }, + 10: { + id: 10, + title: "Americas", + childIds: [11, 12, 13, 14, 15, 16, 17, 18], + }, + 11: { + id: 11, + title: "Argentina", + childIds: [], + }, + 12: { + id: 12, + title: "Brazil", + childIds: [], + }, + 13: { + id: 13, + title: "Barbados", + childIds: [], + }, + 14: { + id: 14, + title: "Canada", + childIds: [], + }, + 15: { + id: 15, + title: "Jamaica", + childIds: [], + }, + 16: { + id: 16, + title: "Mexico", + childIds: [], + }, + 17: { + id: 17, + title: "Trinidad and Tobago", + childIds: [], + }, + 18: { + id: 18, + title: "Venezuela", + childIds: [], + }, + 19: { + id: 19, + title: "Asia", + childIds: [20, 21, 22, 23, 24, 25, 26], + }, + 20: { + id: 20, + title: "China", + childIds: [], + }, + 21: { + id: 21, + title: "Hong Kong", + childIds: [], + }, + 22: { + id: 22, + title: "India", + childIds: [], + }, + 23: { + id: 23, + title: "Singapore", + childIds: [], + }, + 24: { + id: 24, + title: "South Korea", + childIds: [], + }, + 25: { + id: 25, + title: "Thailand", + childIds: [], + }, + 26: { + id: 26, + title: "Vietnam", + childIds: [], + }, + 27: { + id: 27, + title: "Europe", + childIds: [28, 29, 30, 31, 32, 33, 34], + }, + 28: { + id: 28, + title: "Croatia", + childIds: [], + }, + 29: { + id: 29, + title: "France", + childIds: [], + }, + 30: { + id: 30, + title: "Germany", + childIds: [], + }, + 31: { + id: 31, + title: "Italy", + childIds: [], + }, + 32: { + id: 32, + title: "Portugal", + childIds: [], + }, + 33: { + id: 33, + title: "Spain", + childIds: [], + }, + 34: { + id: 34, + title: "Turkey", + childIds: [], + }, + 35: { + id: 35, + title: "Oceania", + childIds: [36, 37, 38, 39, 40, 41, 42], + }, + 36: { + id: 36, + title: "Australia", + childIds: [], + }, + 37: { + id: 37, + title: "Bora Bora (French Polynesia)", + childIds: [], + }, + 38: { + id: 38, + title: "Easter Island (Chile)", + childIds: [], + }, + 39: { + id: 39, + title: "Fiji", + childIds: [], + }, + 40: { + id: 40, + title: "Hawaii (the USA)", + childIds: [], + }, + 41: { + id: 41, + title: "New Zealand", + childIds: [], + }, + 42: { + id: 42, + title: "Vanuatu", + childIds: [], + }, + 43: { + id: 43, + title: "Moon", + childIds: [44, 45, 46], + }, + 44: { + id: 44, + title: "Rheita", + childIds: [], + }, + 45: { + id: 45, + title: "Piccolomini", + childIds: [], + }, + 46: { + id: 46, + title: "Tycho", + childIds: [], + }, + 47: { + id: 47, + title: "Mars", + childIds: [48, 49], + }, + 48: { + id: 48, + title: "Corn Town", + childIds: [], + }, + 49: { + id: 49, + title: "Green Hill", + childIds: [], + }, +}; +``` + +**Now that the state is "flat" (also known as "normalized"), updating nested items becomes easier.** + +In order to remove a place now, you only need to update two levels of state: + +- The updated version of its _parent_ place should exclude the removed ID from its `childIds` array. +- The updated version of the root "table" object should include the updated version of the parent place. + +Here is an example of how you could go about it: + +```js +import { useState } from "react"; +import { initialTravelPlan } from "./places.js"; + +export default function TravelPlan() { + const [plan, setPlan] = useState(initialTravelPlan); + + function handleComplete(parentId, childId) { + const parent = plan[parentId]; + // Create a new version of the parent place + // that doesn't include this child ID. + const nextParent = { + ...parent, + childIds: parent.childIds.filter((id) => id !== childId), + }; + // Update the root state object... + setPlan({ + ...plan, + // ...so that it has the updated parent. + [parentId]: nextParent, + }); + } + + const root = plan[0]; + const planetIds = root.childIds; + return ( + <> + <h2>Places to visit</h2> + <ol> + {planetIds.map((id) => ( + <PlaceTree + key={id} + id={id} + parentId={0} + placesById={plan} + onComplete={handleComplete} + /> + ))} + </ol> + </> + ); +} + +function PlaceTree({ id, parentId, placesById, onComplete }) { + const place = placesById[id]; + const childIds = place.childIds; + return ( + <li> + {place.title} + <button + on_click={() => { + onComplete(parentId, id); + }} + > + Complete + </button> + {childIds.length > 0 && ( + <ol> + {childIds.map((childId) => ( + <PlaceTree + key={childId} + id={childId} + parentId={id} + placesById={placesById} + onComplete={onComplete} + /> + ))} + </ol> + )} + </li> + ); +} +``` + +```js +export const initialTravelPlan = { + 0: { + id: 0, + title: "(Root)", + childIds: [1, 43, 47], + }, + 1: { + id: 1, + title: "Earth", + childIds: [2, 10, 19, 27, 35], + }, + 2: { + id: 2, + title: "Africa", + childIds: [3, 4, 5, 6, 7, 8, 9], + }, + 3: { + id: 3, + title: "Botswana", + childIds: [], + }, + 4: { + id: 4, + title: "Egypt", + childIds: [], + }, + 5: { + id: 5, + title: "Kenya", + childIds: [], + }, + 6: { + id: 6, + title: "Madagascar", + childIds: [], + }, + 7: { + id: 7, + title: "Morocco", + childIds: [], + }, + 8: { + id: 8, + title: "Nigeria", + childIds: [], + }, + 9: { + id: 9, + title: "South Africa", + childIds: [], + }, + 10: { + id: 10, + title: "Americas", + childIds: [11, 12, 13, 14, 15, 16, 17, 18], + }, + 11: { + id: 11, + title: "Argentina", + childIds: [], + }, + 12: { + id: 12, + title: "Brazil", + childIds: [], + }, + 13: { + id: 13, + title: "Barbados", + childIds: [], + }, + 14: { + id: 14, + title: "Canada", + childIds: [], + }, + 15: { + id: 15, + title: "Jamaica", + childIds: [], + }, + 16: { + id: 16, + title: "Mexico", + childIds: [], + }, + 17: { + id: 17, + title: "Trinidad and Tobago", + childIds: [], + }, + 18: { + id: 18, + title: "Venezuela", + childIds: [], + }, + 19: { + id: 19, + title: "Asia", + childIds: [20, 21, 22, 23, 24, 25, 26], + }, + 20: { + id: 20, + title: "China", + childIds: [], + }, + 21: { + id: 21, + title: "Hong Kong", + childIds: [], + }, + 22: { + id: 22, + title: "India", + childIds: [], + }, + 23: { + id: 23, + title: "Singapore", + childIds: [], + }, + 24: { + id: 24, + title: "South Korea", + childIds: [], + }, + 25: { + id: 25, + title: "Thailand", + childIds: [], + }, + 26: { + id: 26, + title: "Vietnam", + childIds: [], + }, + 27: { + id: 27, + title: "Europe", + childIds: [28, 29, 30, 31, 32, 33, 34], + }, + 28: { + id: 28, + title: "Croatia", + childIds: [], + }, + 29: { + id: 29, + title: "France", + childIds: [], + }, + 30: { + id: 30, + title: "Germany", + childIds: [], + }, + 31: { + id: 31, + title: "Italy", + childIds: [], + }, + 32: { + id: 32, + title: "Portugal", + childIds: [], + }, + 33: { + id: 33, + title: "Spain", + childIds: [], + }, + 34: { + id: 34, + title: "Turkey", + childIds: [], + }, + 35: { + id: 35, + title: "Oceania", + childIds: [36, 37, 38, 39, 40, 41, , 42], + }, + 36: { + id: 36, + title: "Australia", + childIds: [], + }, + 37: { + id: 37, + title: "Bora Bora (French Polynesia)", + childIds: [], + }, + 38: { + id: 38, + title: "Easter Island (Chile)", + childIds: [], + }, + 39: { + id: 39, + title: "Fiji", + childIds: [], + }, + 40: { + id: 40, + title: "Hawaii (the USA)", + childIds: [], + }, + 41: { + id: 41, + title: "New Zealand", + childIds: [], + }, + 42: { + id: 42, + title: "Vanuatu", + childIds: [], + }, + 43: { + id: 43, + title: "Moon", + childIds: [44, 45, 46], + }, + 44: { + id: 44, + title: "Rheita", + childIds: [], + }, + 45: { + id: 45, + title: "Piccolomini", + childIds: [], + }, + 46: { + id: 46, + title: "Tycho", + childIds: [], + }, + 47: { + id: 47, + title: "Mars", + childIds: [48, 49], + }, + 48: { + id: 48, + title: "Corn Town", + childIds: [], + }, + 49: { + id: 49, + title: "Green Hill", + childIds: [], + }, +}; +``` + +```css +button { + margin: 10px; +} +``` + +You can nest state as much as you like, but making it "flat" can solve numerous problems. It makes state easier to update, and it helps ensure you don't have duplication in different parts of a nested object. + +<DeepDive> + +#### Improving memory usage + +Ideally, you would also remove the deleted items (and their children!) from the "table" object to improve memory usage. This version does that. It also [uses Immer](/learn/updating-objects-in-state#write-concise-update-logic-with-immer) to make the update logic more concise. + +```js +import { useImmer } from "use-immer"; +import { initialTravelPlan } from "./places.js"; + +export default function TravelPlan() { + const [plan, updatePlan] = useImmer(initialTravelPlan); + + function handleComplete(parentId, childId) { + updatePlan((draft) => { + // Remove from the parent place's child IDs. + const parent = draft[parentId]; + parent.childIds = parent.childIds.filter((id) => id !== childId); + + // Forget this place and all its subtree. + deleteAllChildren(childId); + function deleteAllChildren(id) { + const place = draft[id]; + place.childIds.forEach(deleteAllChildren); + delete draft[id]; + } + }); + } + + const root = plan[0]; + const planetIds = root.childIds; + return ( + <> + <h2>Places to visit</h2> + <ol> + {planetIds.map((id) => ( + <PlaceTree + key={id} + id={id} + parentId={0} + placesById={plan} + onComplete={handleComplete} + /> + ))} + </ol> + </> + ); +} + +function PlaceTree({ id, parentId, placesById, onComplete }) { + const place = placesById[id]; + const childIds = place.childIds; + return ( + <li> + {place.title} + <button + on_click={() => { + onComplete(parentId, id); + }} + > + Complete + </button> + {childIds.length > 0 && ( + <ol> + {childIds.map((childId) => ( + <PlaceTree + key={childId} + id={childId} + parentId={id} + placesById={placesById} + onComplete={onComplete} + /> + ))} + </ol> + )} + </li> + ); +} +``` + +```js +export const initialTravelPlan = { + 0: { + id: 0, + title: "(Root)", + childIds: [1, 43, 47], + }, + 1: { + id: 1, + title: "Earth", + childIds: [2, 10, 19, 27, 35], + }, + 2: { + id: 2, + title: "Africa", + childIds: [3, 4, 5, 6, 7, 8, 9], + }, + 3: { + id: 3, + title: "Botswana", + childIds: [], + }, + 4: { + id: 4, + title: "Egypt", + childIds: [], + }, + 5: { + id: 5, + title: "Kenya", + childIds: [], + }, + 6: { + id: 6, + title: "Madagascar", + childIds: [], + }, + 7: { + id: 7, + title: "Morocco", + childIds: [], + }, + 8: { + id: 8, + title: "Nigeria", + childIds: [], + }, + 9: { + id: 9, + title: "South Africa", + childIds: [], + }, + 10: { + id: 10, + title: "Americas", + childIds: [11, 12, 13, 14, 15, 16, 17, 18], + }, + 11: { + id: 11, + title: "Argentina", + childIds: [], + }, + 12: { + id: 12, + title: "Brazil", + childIds: [], + }, + 13: { + id: 13, + title: "Barbados", + childIds: [], + }, + 14: { + id: 14, + title: "Canada", + childIds: [], + }, + 15: { + id: 15, + title: "Jamaica", + childIds: [], + }, + 16: { + id: 16, + title: "Mexico", + childIds: [], + }, + 17: { + id: 17, + title: "Trinidad and Tobago", + childIds: [], + }, + 18: { + id: 18, + title: "Venezuela", + childIds: [], + }, + 19: { + id: 19, + title: "Asia", + childIds: [20, 21, 22, 23, 24, 25, 26], + }, + 20: { + id: 20, + title: "China", + childIds: [], + }, + 21: { + id: 21, + title: "Hong Kong", + childIds: [], + }, + 22: { + id: 22, + title: "India", + childIds: [], + }, + 23: { + id: 23, + title: "Singapore", + childIds: [], + }, + 24: { + id: 24, + title: "South Korea", + childIds: [], + }, + 25: { + id: 25, + title: "Thailand", + childIds: [], + }, + 26: { + id: 26, + title: "Vietnam", + childIds: [], + }, + 27: { + id: 27, + title: "Europe", + childIds: [28, 29, 30, 31, 32, 33, 34], + }, + 28: { + id: 28, + title: "Croatia", + childIds: [], + }, + 29: { + id: 29, + title: "France", + childIds: [], + }, + 30: { + id: 30, + title: "Germany", + childIds: [], + }, + 31: { + id: 31, + title: "Italy", + childIds: [], + }, + 32: { + id: 32, + title: "Portugal", + childIds: [], + }, + 33: { + id: 33, + title: "Spain", + childIds: [], + }, + 34: { + id: 34, + title: "Turkey", + childIds: [], + }, + 35: { + id: 35, + title: "Oceania", + childIds: [36, 37, 38, 39, 40, 41, , 42], + }, + 36: { + id: 36, + title: "Australia", + childIds: [], + }, + 37: { + id: 37, + title: "Bora Bora (French Polynesia)", + childIds: [], + }, + 38: { + id: 38, + title: "Easter Island (Chile)", + childIds: [], + }, + 39: { + id: 39, + title: "Fiji", + childIds: [], + }, + 40: { + id: 40, + title: "Hawaii (the USA)", + childIds: [], + }, + 41: { + id: 41, + title: "New Zealand", + childIds: [], + }, + 42: { + id: 42, + title: "Vanuatu", + childIds: [], + }, + 43: { + id: 43, + title: "Moon", + childIds: [44, 45, 46], + }, + 44: { + id: 44, + title: "Rheita", + childIds: [], + }, + 45: { + id: 45, + title: "Piccolomini", + childIds: [], + }, + 46: { + id: 46, + title: "Tycho", + childIds: [], + }, + 47: { + id: 47, + title: "Mars", + childIds: [48, 49], + }, + 48: { + id: 48, + title: "Corn Town", + childIds: [], + }, + 49: { + id: 49, + title: "Green Hill", + childIds: [], + }, +}; +``` + +```css +button { + margin: 10px; +} +``` + +```json +{ + "dependencies": { + "immer": "1.7.3", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "use-immer": "0.5.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +</DeepDive> + +Sometimes, you can also reduce state nesting by moving some of the nested state into the child components. This works well for ephemeral UI state that doesn't need to be stored, like whether an item is hovered. + +<Recap> + +- If two state variables always update together, consider merging them into one. +- Choose your state variables carefully to avoid creating "impossible" states. +- Structure your state in a way that reduces the chances that you'll make a mistake updating it. +- Avoid redundant and duplicate state so that you don't need to keep it in sync. +- Don't put props _into_ state unless you specifically want to prevent updates. +- For UI patterns like selection, keep ID or index in state instead of the object itself. +- If updating deeply nested state is complicated, try flattening it. + +</Recap> + +<Challenges> + +#### Fix a component that's not updating + +This `Clock` component receives two props: `color` and `time`. When you select a different color in the select box, the `Clock` component receives a different `color` prop from its parent component. However, for some reason, the displayed color doesn't update. Why? Fix the problem. + +```js +import { useState } from "react"; + +export default function Clock(props) { + const [color, setColor] = useState(props.color); + return <h1 style={{ color: color }}>{props.time}</h1>; +} +``` + +```js +import { useState, useEffect } from "react"; +import Clock from "./Clock.js"; + +function useTime() { + const [time, setTime] = useState(() => new Date()); + useEffect(() => { + const id = setInterval(() => { + setTime(new Date()); + }, 1000); + return () => clearInterval(id); + }, []); + return time; +} + +export default function App() { + const time = useTime(); + const [color, setColor] = useState("lightcoral"); + return ( + <div> + <p> + Pick a color:{" "} + <select + value={color} + onChange={(e) => setColor(e.target.value)} + > + <option value="lightcoral">lightcoral</option> + <option value="midnightblue">midnightblue</option> + <option value="rebeccapurple">rebeccapurple</option> + </select> + </p> + <Clock color={color} time={time.toLocaleTimeString()} /> + </div> + ); +} +``` + +<Solution> + +The issue is that this component has `color` state initialized with the initial value of the `color` prop. But when the `color` prop changes, this does not affect the state variable! So they get out of sync. To fix this issue, remove the state variable altogether, and use the `color` prop directly. + +```js +import { useState } from "react"; + +export default function Clock(props) { + return <h1 style={{ color: props.color }}>{props.time}</h1>; +} +``` + +```js +import { useState, useEffect } from "react"; +import Clock from "./Clock.js"; + +function useTime() { + const [time, setTime] = useState(() => new Date()); + useEffect(() => { + const id = setInterval(() => { + setTime(new Date()); + }, 1000); + return () => clearInterval(id); + }, []); + return time; +} + +export default function App() { + const time = useTime(); + const [color, setColor] = useState("lightcoral"); + return ( + <div> + <p> + Pick a color:{" "} + <select + value={color} + onChange={(e) => setColor(e.target.value)} + > + <option value="lightcoral">lightcoral</option> + <option value="midnightblue">midnightblue</option> + <option value="rebeccapurple">rebeccapurple</option> + </select> + </p> + <Clock color={color} time={time.toLocaleTimeString()} /> + </div> + ); +} +``` + +Or, using the destructuring syntax: + +```js +import { useState } from "react"; + +export default function Clock({ color, time }) { + return <h1 style={{ color: color }}>{time}</h1>; +} +``` + +```js +import { useState, useEffect } from "react"; +import Clock from "./Clock.js"; + +function useTime() { + const [time, setTime] = useState(() => new Date()); + useEffect(() => { + const id = setInterval(() => { + setTime(new Date()); + }, 1000); + return () => clearInterval(id); + }, []); + return time; +} + +export default function App() { + const time = useTime(); + const [color, setColor] = useState("lightcoral"); + return ( + <div> + <p> + Pick a color:{" "} + <select + value={color} + onChange={(e) => setColor(e.target.value)} + > + <option value="lightcoral">lightcoral</option> + <option value="midnightblue">midnightblue</option> + <option value="rebeccapurple">rebeccapurple</option> + </select> + </p> + <Clock color={color} time={time.toLocaleTimeString()} /> + </div> + ); +} +``` + +</Solution> + +#### Fix a broken packing list + +This packing list has a footer that shows how many items are packed, and how many items there are overall. It seems to work at first, but it is buggy. For example, if you mark an item as packed and then delete it, the counter will not be updated correctly. Fix the counter so that it's always correct. + +<Hint> + +Is any state in this example redundant? + +</Hint> + +```js +import { useState } from "react"; +import AddItem from "./AddItem.js"; +import PackingList from "./PackingList.js"; + +let nextId = 3; +const initialItems = [ + { id: 0, title: "Warm socks", packed: true }, + { id: 1, title: "Travel journal", packed: false }, + { id: 2, title: "Watercolors", packed: false }, +]; + +export default function TravelPlan() { + const [items, setItems] = useState(initialItems); + const [total, setTotal] = useState(3); + const [packed, setPacked] = useState(1); + + function handleAddItem(title) { + setTotal(total + 1); + setItems([ + ...items, + { + id: nextId++, + title: title, + packed: false, + }, + ]); + } + + function handleChangeItem(nextItem) { + if (nextItem.packed) { + setPacked(packed + 1); + } else { + setPacked(packed - 1); + } + setItems( + items.map((item) => { + if (item.id === nextItem.id) { + return nextItem; + } else { + return item; + } + }) + ); + } + + function handleDeleteItem(itemId) { + setTotal(total - 1); + setItems(items.filter((item) => item.id !== itemId)); + } + + return ( + <> + <AddItem onAddItem={handleAddItem} /> + <PackingList + items={items} + onChangeItem={handleChangeItem} + onDeleteItem={handleDeleteItem} + /> + <hr /> + <b> + {packed} out of {total} packed! + </b> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function AddItem({ onAddItem }) { + const [title, setTitle] = useState(""); + return ( + <> + <input + placeholder="Add item" + value={title} + onChange={(e) => setTitle(e.target.value)} + /> + <button + on_click={() => { + setTitle(""); + onAddItem(title); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function PackingList({ items, onChangeItem, onDeleteItem }) { + return ( + <ul> + {items.map((item) => ( + <li key={item.id}> + <label> + <input + type="checkbox" + checked={item.packed} + onChange={(e) => { + onChangeItem({ + ...item, + packed: e.target.checked, + }); + }} + />{" "} + {item.title} + </label> + <button on_click={() => onDeleteItem(item.id)}> + Delete + </button> + </li> + ))} + </ul> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +<Solution> + +Although you could carefully change each event handler to update the `total` and `packed` counters correctly, the root problem is that these state variables exist at all. They are redundant because you can always calculate the number of items (packed or total) from the `items` array itself. Remove the redundant state to fix the bug: + +```js +import { useState } from "react"; +import AddItem from "./AddItem.js"; +import PackingList from "./PackingList.js"; + +let nextId = 3; +const initialItems = [ + { id: 0, title: "Warm socks", packed: true }, + { id: 1, title: "Travel journal", packed: false }, + { id: 2, title: "Watercolors", packed: false }, +]; + +export default function TravelPlan() { + const [items, setItems] = useState(initialItems); + + const total = items.length; + const packed = items.filter((item) => item.packed).length; + + function handleAddItem(title) { + setItems([ + ...items, + { + id: nextId++, + title: title, + packed: false, + }, + ]); + } + + function handleChangeItem(nextItem) { + setItems( + items.map((item) => { + if (item.id === nextItem.id) { + return nextItem; + } else { + return item; + } + }) + ); + } + + function handleDeleteItem(itemId) { + setItems(items.filter((item) => item.id !== itemId)); + } + + return ( + <> + <AddItem onAddItem={handleAddItem} /> + <PackingList + items={items} + onChangeItem={handleChangeItem} + onDeleteItem={handleDeleteItem} + /> + <hr /> + <b> + {packed} out of {total} packed! + </b> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function AddItem({ onAddItem }) { + const [title, setTitle] = useState(""); + return ( + <> + <input + placeholder="Add item" + value={title} + onChange={(e) => setTitle(e.target.value)} + /> + <button + on_click={() => { + setTitle(""); + onAddItem(title); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function PackingList({ items, onChangeItem, onDeleteItem }) { + return ( + <ul> + {items.map((item) => ( + <li key={item.id}> + <label> + <input + type="checkbox" + checked={item.packed} + onChange={(e) => { + onChangeItem({ + ...item, + packed: e.target.checked, + }); + }} + />{" "} + {item.title} + </label> + <button on_click={() => onDeleteItem(item.id)}> + Delete + </button> + </li> + ))} + </ul> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +Notice how the event handlers are only concerned with calling `setItems` after this change. The item counts are now calculated during the next render from `items`, so they are always up-to-date. + +</Solution> + +#### Fix the disappearing selection + +There is a list of `letters` in state. When you hover or focus a particular letter, it gets highlighted. The currently highlighted letter is stored in the `highlightedLetter` state variable. You can "star" and "unstar" individual letters, which updates the `letters` array in state. + +This code works, but there is a minor UI glitch. When you press "Star" or "Unstar", the highlighting disappears for a moment. However, it reappears as soon as you move your pointer or switch to another letter with keyboard. Why is this happening? Fix it so that the highlighting doesn't disappear after the button click. + +```js +import { useState } from "react"; +import { initialLetters } from "./data.js"; +import Letter from "./Letter.js"; + +export default function MailClient() { + const [letters, setLetters] = useState(initialLetters); + const [highlightedLetter, setHighlightedLetter] = useState(null); + + function handleHover(letter) { + setHighlightedLetter(letter); + } + + function handleStar(starred) { + setLetters( + letters.map((letter) => { + if (letter.id === starred.id) { + return { + ...letter, + isStarred: !letter.isStarred, + }; + } else { + return letter; + } + }) + ); + } + + return ( + <> + <h2>Inbox</h2> + <ul> + {letters.map((letter) => ( + <Letter + key={letter.id} + letter={letter} + isHighlighted={letter === highlightedLetter} + onHover={handleHover} + onToggleStar={handleStar} + /> + ))} + </ul> + </> + ); +} +``` + +```js +export default function Letter({ + letter, + isHighlighted, + onHover, + onToggleStar, +}) { + return ( + <li + className={isHighlighted ? "highlighted" : ""} + onFocus={() => { + onHover(letter); + }} + onPointerMove={() => { + onHover(letter); + }} + > + <button + on_click={() => { + onToggleStar(letter); + }} + > + {letter.isStarred ? "Unstar" : "Star"} + </button> + {letter.subject} + </li> + ); +} +``` + +```js +export const initialLetters = [ + { + id: 0, + subject: "Ready for adventure?", + isStarred: true, + }, + { + id: 1, + subject: "Time to check in!", + isStarred: false, + }, + { + id: 2, + subject: "Festival Begins in Just SEVEN Days!", + isStarred: false, + }, +]; +``` + +```css +button { + margin: 5px; +} +li { + border-radius: 5px; +} +.highlighted { + background: #d2eaff; +} +``` + +<Solution> + +The problem is that you're holding the letter object in `highlightedLetter`. But you're also holding the same information in the `letters` array. So your state has duplication! When you update the `letters` array after the button click, you create a new letter object which is different from `highlightedLetter`. This is why `highlightedLetter === letter` check becomes `false`, and the highlight disappears. It reappears the next time you call `setHighlightedLetter` when the pointer moves. + +To fix the issue, remove the duplication from state. Instead of storing _the letter itself_ in two places, store the `highlightedId` instead. Then you can check `isHighlighted` for each letter with `letter.id === highlightedId`, which will work even if the `letter` object has changed since the last render. + +```js +import { useState } from "react"; +import { initialLetters } from "./data.js"; +import Letter from "./Letter.js"; + +export default function MailClient() { + const [letters, setLetters] = useState(initialLetters); + const [highlightedId, setHighlightedId] = useState(null); + + function handleHover(letterId) { + setHighlightedId(letterId); + } + + function handleStar(starredId) { + setLetters( + letters.map((letter) => { + if (letter.id === starredId) { + return { + ...letter, + isStarred: !letter.isStarred, + }; + } else { + return letter; + } + }) + ); + } + + return ( + <> + <h2>Inbox</h2> + <ul> + {letters.map((letter) => ( + <Letter + key={letter.id} + letter={letter} + isHighlighted={letter.id === highlightedId} + onHover={handleHover} + onToggleStar={handleStar} + /> + ))} + </ul> + </> + ); +} +``` + +```js +export default function Letter({ + letter, + isHighlighted, + onHover, + onToggleStar, +}) { + return ( + <li + className={isHighlighted ? "highlighted" : ""} + onFocus={() => { + onHover(letter.id); + }} + onPointerMove={() => { + onHover(letter.id); + }} + > + <button + on_click={() => { + onToggleStar(letter.id); + }} + > + {letter.isStarred ? "Unstar" : "Star"} + </button> + {letter.subject} + </li> + ); +} +``` + +```js +export const initialLetters = [ + { + id: 0, + subject: "Ready for adventure?", + isStarred: true, + }, + { + id: 1, + subject: "Time to check in!", + isStarred: false, + }, + { + id: 2, + subject: "Festival Begins in Just SEVEN Days!", + isStarred: false, + }, +]; +``` + +```css +button { + margin: 5px; +} +li { + border-radius: 5px; +} +.highlighted { + background: #d2eaff; +} +``` + +</Solution> + +#### Implement multiple selection + +In this example, each `Letter` has an `isSelected` prop and an `onToggle` handler that marks it as selected. This works, but the state is stored as a `selectedId` (either `null` or an ID), so only one letter can get selected at any given time. + +Change the state structure to support multiple selection. (How would you structure it? Think about this before writing the code.) Each checkbox should become independent from the others. Clicking a selected letter should uncheck it. Finally, the footer should show the correct number of the selected items. + +<Hint> + +Instead of a single selected ID, you might want to hold an array or a [Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) of selected IDs in state. + +</Hint> + +```js +import { useState } from "react"; +import { letters } from "./data.js"; +import Letter from "./Letter.js"; + +export default function MailClient() { + const [selectedId, setSelectedId] = useState(null); + + // TODO: allow multiple selection + const selectedCount = 1; + + function handleToggle(toggledId) { + // TODO: allow multiple selection + setSelectedId(toggledId); + } + + return ( + <> + <h2>Inbox</h2> + <ul> + {letters.map((letter) => ( + <Letter + key={letter.id} + letter={letter} + isSelected={ + // TODO: allow multiple selection + letter.id === selectedId + } + onToggle={handleToggle} + /> + ))} + <hr /> + <p> + <b>You selected {selectedCount} letters</b> + </p> + </ul> + </> + ); +} +``` + +```js +export default function Letter({ letter, onToggle, isSelected }) { + return ( + <li className={isSelected ? "selected" : ""}> + <label> + <input + type="checkbox" + checked={isSelected} + onChange={() => { + onToggle(letter.id); + }} + /> + {letter.subject} + </label> + </li> + ); +} +``` + +```js +export const letters = [ + { + id: 0, + subject: "Ready for adventure?", + isStarred: true, + }, + { + id: 1, + subject: "Time to check in!", + isStarred: false, + }, + { + id: 2, + subject: "Festival Begins in Just SEVEN Days!", + isStarred: false, + }, +]; +``` + +```css +input { + margin: 5px; +} +li { + border-radius: 5px; +} +label { + width: 100%; + padding: 5px; + display: inline-block; +} +.selected { + background: #d2eaff; +} +``` + +<Solution> + +Instead of a single `selectedId`, keep a `selectedIds` _array_ in state. For example, if you select the first and the last letter, it would contain `[0, 2]`. When nothing is selected, it would be an empty `[]` array: + +```js +import { useState } from "react"; +import { letters } from "./data.js"; +import Letter from "./Letter.js"; + +export default function MailClient() { + const [selectedIds, setSelectedIds] = useState([]); + + const selectedCount = selectedIds.length; + + function handleToggle(toggledId) { + // Was it previously selected? + if (selectedIds.includes(toggledId)) { + // Then remove this ID from the array. + setSelectedIds(selectedIds.filter((id) => id !== toggledId)); + } else { + // Otherwise, add this ID to the array. + setSelectedIds([...selectedIds, toggledId]); + } + } + + return ( + <> + <h2>Inbox</h2> + <ul> + {letters.map((letter) => ( + <Letter + key={letter.id} + letter={letter} + isSelected={selectedIds.includes(letter.id)} + onToggle={handleToggle} + /> + ))} + <hr /> + <p> + <b>You selected {selectedCount} letters</b> + </p> + </ul> + </> + ); +} +``` + +```js +export default function Letter({ letter, onToggle, isSelected }) { + return ( + <li className={isSelected ? "selected" : ""}> + <label> + <input + type="checkbox" + checked={isSelected} + onChange={() => { + onToggle(letter.id); + }} + /> + {letter.subject} + </label> + </li> + ); +} +``` + +```js +export const letters = [ + { + id: 0, + subject: "Ready for adventure?", + isStarred: true, + }, + { + id: 1, + subject: "Time to check in!", + isStarred: false, + }, + { + id: 2, + subject: "Festival Begins in Just SEVEN Days!", + isStarred: false, + }, +]; +``` + +```css +input { + margin: 5px; +} +li { + border-radius: 5px; +} +label { + width: 100%; + padding: 5px; + display: inline-block; +} +.selected { + background: #d2eaff; +} +``` + +One minor downside of using an array is that for each item, you're calling `selectedIds.includes(letter.id)` to check whether it's selected. If the array is very large, this can become a performance problem because array search with [`includes()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) takes linear time, and you're doing this search for each individual item. + +To fix this, you can hold a [Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) in state instead, which provides a fast [`has()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/has) operation: + +```js +import { useState } from "react"; +import { letters } from "./data.js"; +import Letter from "./Letter.js"; + +export default function MailClient() { + const [selectedIds, setSelectedIds] = useState(new Set()); + + const selectedCount = selectedIds.size; + + function handleToggle(toggledId) { + // Create a copy (to avoid mutation). + const nextIds = new Set(selectedIds); + if (nextIds.has(toggledId)) { + nextIds.delete(toggledId); + } else { + nextIds.add(toggledId); + } + setSelectedIds(nextIds); + } + + return ( + <> + <h2>Inbox</h2> + <ul> + {letters.map((letter) => ( + <Letter + key={letter.id} + letter={letter} + isSelected={selectedIds.has(letter.id)} + onToggle={handleToggle} + /> + ))} + <hr /> + <p> + <b>You selected {selectedCount} letters</b> + </p> + </ul> + </> + ); +} +``` + +```js +export default function Letter({ letter, onToggle, isSelected }) { + return ( + <li className={isSelected ? "selected" : ""}> + <label> + <input + type="checkbox" + checked={isSelected} + onChange={() => { + onToggle(letter.id); + }} + /> + {letter.subject} + </label> + </li> + ); +} +``` + +```js +export const letters = [ + { + id: 0, + subject: "Ready for adventure?", + isStarred: true, + }, + { + id: 1, + subject: "Time to check in!", + isStarred: false, + }, + { + id: 2, + subject: "Festival Begins in Just SEVEN Days!", + isStarred: false, + }, +]; +``` + +```css +input { + margin: 5px; +} +li { + border-radius: 5px; +} +label { + width: 100%; + padding: 5px; + display: inline-block; +} +.selected { + background: #d2eaff; +} +``` + +Now each item does a `selectedIds.has(letter.id)` check, which is very fast. + +Keep in mind that you [should not mutate objects in state](/learn/updating-objects-in-state), and that includes Sets, too. This is why the `handleToggle` function creates a _copy_ of the Set first, and then updates that copy. + +</Solution> + +</Challenges> diff --git a/docs/src/learn/communicate-data-between-server-and-client.md b/docs/src/learn/communicate-data-between-server-and-client.md new file mode 100644 index 000000000..01736cacd --- /dev/null +++ b/docs/src/learn/communicate-data-between-server-and-client.md @@ -0,0 +1,3 @@ +--- +title: Communicating Data Between Server and Client 🚧 +--- diff --git a/docs/src/learn/conditional-rendering.md b/docs/src/learn/conditional-rendering.md new file mode 100644 index 000000000..87d031613 --- /dev/null +++ b/docs/src/learn/conditional-rendering.md @@ -0,0 +1,576 @@ +--- +title: Conditional Rendering 🚧 +--- + +## Overview + +<p class="intro" markdown> + +Your components will often need to display different things depending on different conditions. In React, you can conditionally render JSX using JavaScript syntax like `if` statements, `&&`, and `? :` operators. + +</p> + +!!! summary "You Will Learn" + + - How to return different JSX depending on a condition + - How to conditionally include or exclude a piece of JSX + - Common conditional syntax shortcuts you’ll encounter in React codebases + +## Conditionally returning JSX + +Let’s say you have a `PackingList` component rendering several `Item`s, which can be marked as packed or not: + +```js +function Item({ name, isPacked }) { + return <li className="item">{name}</li>; +} + +export default function PackingList() { + return ( + <section> + <h1>Sally Ride's Packing List</h1> + <ul> + <Item isPacked={true} name="Space suit" /> + <Item isPacked={true} name="Helmet with a golden leaf" /> + <Item isPacked={false} name="Photo of Tam" /> + </ul> + </section> + ); +} +``` + +Notice that some of the `Item` components have their `isPacked` prop set to `true` instead of `false`. You want to add a checkmark (✔) to packed items if `isPacked={true}`. + +You can write this as an [`if`/`else` statement](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/if...else) like so: + +```js +if (isPacked) { + return <li className="item">{name} ✔</li>; +} +return <li className="item">{name}</li>; +``` + +If the `isPacked` prop is `true`, this code **returns a different JSX tree.** With this change, some of the items get a checkmark at the end: + +```js +function Item({ name, isPacked }) { + if (isPacked) { + return <li className="item">{name} ✔</li>; + } + return <li className="item">{name}</li>; +} + +export default function PackingList() { + return ( + <section> + <h1>Sally Ride's Packing List</h1> + <ul> + <Item isPacked={true} name="Space suit" /> + <Item isPacked={true} name="Helmet with a golden leaf" /> + <Item isPacked={false} name="Photo of Tam" /> + </ul> + </section> + ); +} +``` + +Try editing what gets returned in either case, and see how the result changes! + +Notice how you're creating branching logic with JavaScript's `if` and `return` statements. In React, control flow (like conditions) is handled by JavaScript. + +### Conditionally returning nothing with `null` + +In some situations, you won't want to render anything at all. For example, say you don't want to show packed items at all. A component must return something. In this case, you can return `null`: + +```js +if (isPacked) { + return null; +} +return <li className="item">{name}</li>; +``` + +If `isPacked` is true, the component will return nothing, `null`. Otherwise, it will return JSX to render. + +```js +function Item({ name, isPacked }) { + if (isPacked) { + return null; + } + return <li className="item">{name}</li>; +} + +export default function PackingList() { + return ( + <section> + <h1>Sally Ride's Packing List</h1> + <ul> + <Item isPacked={true} name="Space suit" /> + <Item isPacked={true} name="Helmet with a golden leaf" /> + <Item isPacked={false} name="Photo of Tam" /> + </ul> + </section> + ); +} +``` + +In practice, returning `null` from a component isn't common because it might surprise a developer trying to render it. More often, you would conditionally include or exclude the component in the parent component's JSX. Here's how to do that! + +## Conditionally including JSX + +In the previous example, you controlled which (if any!) JSX tree would be returned by the component. You may already have noticed some duplication in the render output: + +```js +<li className="item">{name} ✔</li> +``` + +is very similar to + +```js +<li className="item">{name}</li> +``` + +Both of the conditional branches return `<li className="item">...</li>`: + +```js +if (isPacked) { + return <li className="item">{name} ✔</li>; +} +return <li className="item">{name}</li>; +``` + +While this duplication isn't harmful, it could make your code harder to maintain. What if you want to change the `className`? You'd have to do it in two places in your code! In such a situation, you could conditionally include a little JSX to make your code more [DRY.](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) + +### Conditional (ternary) operator (`? :`) + +JavaScript has a compact syntax for writing a conditional expression -- the [conditional operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator) or "ternary operator". + +Instead of this: + +```js +if (isPacked) { + return <li className="item">{name} ✔</li>; +} +return <li className="item">{name}</li>; +``` + +You can write this: + +```js +return <li className="item">{isPacked ? name + " ✔" : name}</li>; +``` + +You can read it as _"if `isPacked` is true, then (`?`) render `name + ' ✔'`, otherwise (`:`) render `name`"_. + +<DeepDive> + +#### Are these two examples fully equivalent? + +If you're coming from an object-oriented programming background, you might assume that the two examples above are subtly different because one of them may create two different "instances" of `<li>`. But JSX elements aren't "instances" because they don't hold any internal state and aren't real DOM nodes. They're lightweight descriptions, like blueprints. So these two examples, in fact, _are_ completely equivalent. [Preserving and Resetting State](/learn/preserving-and-resetting-state) goes into detail about how this works. + +</DeepDive> + +Now let's say you want to wrap the completed item's text into another HTML tag, like `<del>` to strike it out. You can add even more newlines and parentheses so that it's easier to nest more JSX in each of the cases: + +```js +function Item({ name, isPacked }) { + return ( + <li className="item">{isPacked ? <del>{name + " ✔"}</del> : name}</li> + ); +} + +export default function PackingList() { + return ( + <section> + <h1>Sally Ride's Packing List</h1> + <ul> + <Item isPacked={true} name="Space suit" /> + <Item isPacked={true} name="Helmet with a golden leaf" /> + <Item isPacked={false} name="Photo of Tam" /> + </ul> + </section> + ); +} +``` + +This style works well for simple conditions, but use it in moderation. If your components get messy with too much nested conditional markup, consider extracting child components to clean things up. In React, markup is a part of your code, so you can use tools like variables and functions to tidy up complex expressions. + +### Logical AND operator (`&&`) + +Another common shortcut you'll encounter is the [JavaScript logical AND (`&&`) operator.](<https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_AND#:~:text=The%20logical%20AND%20(%20%26%26%20)%20operator,it%20returns%20a%20Boolean%20value.>) Inside React components, it often comes up when you want to render some JSX when the condition is true, **or render nothing otherwise.** With `&&`, you could conditionally render the checkmark only if `isPacked` is `true`: + +```js +return ( + <li className="item"> + {name} {isPacked && "✔"} + </li> +); +``` + +You can read this as _"if `isPacked`, then (`&&`) render the checkmark, otherwise, render nothing"_. + +Here it is in action: + +```js +function Item({ name, isPacked }) { + return ( + <li className="item"> + {name} {isPacked && "✔"} + </li> + ); +} + +export default function PackingList() { + return ( + <section> + <h1>Sally Ride's Packing List</h1> + <ul> + <Item isPacked={true} name="Space suit" /> + <Item isPacked={true} name="Helmet with a golden leaf" /> + <Item isPacked={false} name="Photo of Tam" /> + </ul> + </section> + ); +} +``` + +A [JavaScript && expression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_AND) returns the value of its right side (in our case, the checkmark) if the left side (our condition) is `true`. But if the condition is `false`, the whole expression becomes `false`. React considers `false` as a "hole" in the JSX tree, just like `null` or `undefined`, and doesn't render anything in its place. + +<Pitfall> + +**Don't put numbers on the left side of `&&`.** + +To test the condition, JavaScript converts the left side to a boolean automatically. However, if the left side is `0`, then the whole expression gets that value (`0`), and React will happily render `0` rather than nothing. + +For example, a common mistake is to write code like `messageCount && <p>New messages</p>`. It's easy to assume that it renders nothing when `messageCount` is `0`, but it really renders the `0` itself! + +To fix it, make the left side a boolean: `messageCount > 0 && <p>New messages</p>`. + +</Pitfall> + +### Conditionally assigning JSX to a variable + +When the shortcuts get in the way of writing plain code, try using an `if` statement and a variable. You can reassign variables defined with [`let`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let), so start by providing the default content you want to display, the name: + +```js +let itemContent = name; +``` + +Use an `if` statement to reassign a JSX expression to `itemContent` if `isPacked` is `true`: + +```js +if (isPacked) { + itemContent = name + " ✔"; +} +``` + +[Curly braces open the "window into JavaScript".](/learn/javascript-in-jsx-with-curly-braces#using-curly-braces-a-window-into-the-javascript-world) Embed the variable with curly braces in the returned JSX tree, nesting the previously calculated expression inside of JSX: + +```js +<li className="item">{itemContent}</li> +``` + +This style is the most verbose, but it's also the most flexible. Here it is in action: + +```js +function Item({ name, isPacked }) { + let itemContent = name; + if (isPacked) { + itemContent = name + " ✔"; + } + return <li className="item">{itemContent}</li>; +} + +export default function PackingList() { + return ( + <section> + <h1>Sally Ride's Packing List</h1> + <ul> + <Item isPacked={true} name="Space suit" /> + <Item isPacked={true} name="Helmet with a golden leaf" /> + <Item isPacked={false} name="Photo of Tam" /> + </ul> + </section> + ); +} +``` + +Like before, this works not only for text, but for arbitrary JSX too: + +```js +function Item({ name, isPacked }) { + let itemContent = name; + if (isPacked) { + itemContent = <del>{name + " ✔"}</del>; + } + return <li className="item">{itemContent}</li>; +} + +export default function PackingList() { + return ( + <section> + <h1>Sally Ride's Packing List</h1> + <ul> + <Item isPacked={true} name="Space suit" /> + <Item isPacked={true} name="Helmet with a golden leaf" /> + <Item isPacked={false} name="Photo of Tam" /> + </ul> + </section> + ); +} +``` + +If you're not familiar with JavaScript, this variety of styles might seem overwhelming at first. However, learning them will help you read and write any JavaScript code -- and not just React components! Pick the one you prefer for a start, and then consult this reference again if you forget how the other ones work. + +<Recap> + +- In React, you control branching logic with JavaScript. +- You can return a JSX expression conditionally with an `if` statement. +- You can conditionally save some JSX to a variable and then include it inside other JSX by using the curly braces. +- In JSX, `{cond ? <A /> : <B />}` means _"if `cond`, render `<A />`, otherwise `<B />`"_. +- In JSX, `{cond && <A />}` means _"if `cond`, render `<A />`, otherwise nothing"_. +- The shortcuts are common, but you don't have to use them if you prefer plain `if`. + +</Recap> + +<Challenges> + +#### Show an icon for incomplete items with `? :` + +Use the conditional operator (`cond ? a : b`) to render a ❌ if `isPacked` isn’t `true`. + +```js +function Item({ name, isPacked }) { + return ( + <li className="item"> + {name} {isPacked && "✔"} + </li> + ); +} + +export default function PackingList() { + return ( + <section> + <h1>Sally Ride's Packing List</h1> + <ul> + <Item isPacked={true} name="Space suit" /> + <Item isPacked={true} name="Helmet with a golden leaf" /> + <Item isPacked={false} name="Photo of Tam" /> + </ul> + </section> + ); +} +``` + +<Solution> + +```js +function Item({ name, isPacked }) { + return ( + <li className="item"> + {name} {isPacked ? "✔" : "❌"} + </li> + ); +} + +export default function PackingList() { + return ( + <section> + <h1>Sally Ride's Packing List</h1> + <ul> + <Item isPacked={true} name="Space suit" /> + <Item isPacked={true} name="Helmet with a golden leaf" /> + <Item isPacked={false} name="Photo of Tam" /> + </ul> + </section> + ); +} +``` + +</Solution> + +#### Show the item importance with `&&` + +In this example, each `Item` receives a numerical `importance` prop. Use the `&&` operator to render "_(Importance: X)_" in italics, but only for items that have non-zero importance. Your item list should end up looking like this: + +- Space suit _(Importance: 9)_ +- Helmet with a golden leaf +- Photo of Tam _(Importance: 6)_ + +Don't forget to add a space between the two labels! + +```js +function Item({ name, importance }) { + return <li className="item">{name}</li>; +} + +export default function PackingList() { + return ( + <section> + <h1>Sally Ride's Packing List</h1> + <ul> + <Item importance={9} name="Space suit" /> + <Item importance={0} name="Helmet with a golden leaf" /> + <Item importance={6} name="Photo of Tam" /> + </ul> + </section> + ); +} +``` + +<Solution> + +This should do the trick: + +```js +function Item({ name, importance }) { + return ( + <li className="item"> + {name} + {importance > 0 && " "} + {importance > 0 && <i>(Importance: {importance})</i>} + </li> + ); +} + +export default function PackingList() { + return ( + <section> + <h1>Sally Ride's Packing List</h1> + <ul> + <Item importance={9} name="Space suit" /> + <Item importance={0} name="Helmet with a golden leaf" /> + <Item importance={6} name="Photo of Tam" /> + </ul> + </section> + ); +} +``` + +Note that you must write `importance > 0 && ...` rather than `importance && ...` so that if the `importance` is `0`, `0` isn't rendered as the result! + +In this solution, two separate conditions are used to insert a space between the name and the importance label. Alternatively, you could use a fragment with a leading space: `importance > 0 && <> <i>...</i></>` or add a space immediately inside the `<i>`: `importance > 0 && <i> ...</i>`. + +</Solution> + +#### Refactor a series of `? :` to `if` and variables + +This `Drink` component uses a series of `? :` conditions to show different information depending on whether the `name` prop is `"tea"` or `"coffee"`. The problem is that the information about each drink is spread across multiple conditions. Refactor this code to use a single `if` statement instead of three `? :` conditions. + +```js +function Drink({ name }) { + return ( + <section> + <h1>{name}</h1> + <dl> + <dt>Part of plant</dt> + <dd>{name === "tea" ? "leaf" : "bean"}</dd> + <dt>Caffeine content</dt> + <dd>{name === "tea" ? "15–70 mg/cup" : "80–185 mg/cup"}</dd> + <dt>Age</dt> + <dd>{name === "tea" ? "4,000+ years" : "1,000+ years"}</dd> + </dl> + </section> + ); +} + +export default function DrinkList() { + return ( + <div> + <Drink name="tea" /> + <Drink name="coffee" /> + </div> + ); +} +``` + +Once you've refactored the code to use `if`, do you have further ideas on how to simplify it? + +<Solution> + +There are multiple ways you could go about this, but here is one starting point: + +```js +function Drink({ name }) { + let part, caffeine, age; + if (name === "tea") { + part = "leaf"; + caffeine = "15–70 mg/cup"; + age = "4,000+ years"; + } else if (name === "coffee") { + part = "bean"; + caffeine = "80–185 mg/cup"; + age = "1,000+ years"; + } + return ( + <section> + <h1>{name}</h1> + <dl> + <dt>Part of plant</dt> + <dd>{part}</dd> + <dt>Caffeine content</dt> + <dd>{caffeine}</dd> + <dt>Age</dt> + <dd>{age}</dd> + </dl> + </section> + ); +} + +export default function DrinkList() { + return ( + <div> + <Drink name="tea" /> + <Drink name="coffee" /> + </div> + ); +} +``` + +Here the information about each drink is grouped together instead of being spread across multiple conditions. This makes it easier to add more drinks in the future. + +Another solution would be to remove the condition altogether by moving the information into objects: + +```js +const drinks = { + tea: { + part: "leaf", + caffeine: "15–70 mg/cup", + age: "4,000+ years", + }, + coffee: { + part: "bean", + caffeine: "80–185 mg/cup", + age: "1,000+ years", + }, +}; + +function Drink({ name }) { + const info = drinks[name]; + return ( + <section> + <h1>{name}</h1> + <dl> + <dt>Part of plant</dt> + <dd>{info.part}</dd> + <dt>Caffeine content</dt> + <dd>{info.caffeine}</dd> + <dt>Age</dt> + <dd>{info.age}</dd> + </dl> + </section> + ); +} + +export default function DrinkList() { + return ( + <div> + <Drink name="tea" /> + <Drink name="coffee" /> + </div> + ); +} +``` + +</Solution> + +</Challenges> diff --git a/docs/src/learn/convert-between-vdom-and-html.md b/docs/src/learn/convert-between-vdom-and-html.md new file mode 100644 index 000000000..6f3c2dba3 --- /dev/null +++ b/docs/src/learn/convert-between-vdom-and-html.md @@ -0,0 +1,3 @@ +--- +title: Convert Between VDOM and HTML 🚧 +--- diff --git a/docs/src/learn/creating-backends.md b/docs/src/learn/creating-backends.md new file mode 100644 index 000000000..75bf0be65 --- /dev/null +++ b/docs/src/learn/creating-backends.md @@ -0,0 +1,3 @@ +--- +title: Creating Backends 🚧 +--- diff --git a/docs/src/learn/creating-html-tags.md b/docs/src/learn/creating-html-tags.md new file mode 100644 index 000000000..4742655e1 --- /dev/null +++ b/docs/src/learn/creating-html-tags.md @@ -0,0 +1,3 @@ +--- +title: Creating HTML Tags 🚧 +--- diff --git a/docs/src/learn/creating-vdom-event-handlers.md b/docs/src/learn/creating-vdom-event-handlers.md new file mode 100644 index 000000000..f82b1f16d --- /dev/null +++ b/docs/src/learn/creating-vdom-event-handlers.md @@ -0,0 +1,3 @@ +--- +title: Creating VDOM Event Handlers 🚧 +--- diff --git a/docs/src/learn/editor-setup.md b/docs/src/learn/editor-setup.md new file mode 100644 index 000000000..25ebbed3e --- /dev/null +++ b/docs/src/learn/editor-setup.md @@ -0,0 +1,62 @@ +--- +title: Editor Setup 🚧 +--- + +## Overview + +<p class="intro" markdown> + +A properly configured editor can make code clearer to read and faster to write. It can even help you catch bugs as you write them! If this is your first time setting up an editor or you're looking to tune up your current editor, we have a few recommendations. + +</p> + +!!! summary "You Will Learn" + + - What the most popular editors are + - How to format your code automatically + +## Your editor + +[VS Code](https://code.visualstudio.com/) is one of the most popular editors in use today. It has a large marketplace of extensions and integrates well with popular services like GitHub. Most of the features listed below can be added to VS Code as extensions as well, making it highly configurable! + +Other popular text editors used in the React community include: + +- [WebStorm](https://www.jetbrains.com/webstorm/) is an integrated development environment designed specifically for JavaScript. +- [Sublime Text](https://www.sublimetext.com/) has support for JSX and TypeScript, [syntax highlighting](https://stackoverflow.com/a/70960574/458193) and autocomplete built in. +- [Vim](https://www.vim.org/) is a highly configurable text editor built to make creating and changing any kind of text very efficient. It is included as "vi" with most UNIX systems and with Apple OS X. + +## Recommended text editor features + +Some editors come with these features built in, but others might require adding an extension. Check to see what support your editor of choice provides to be sure! + +### Linting + +Code linters find problems in your code as you write, helping you fix them early. [ESLint](https://eslint.org/) is a popular, open source linter for JavaScript. + +- [Install ESLint with the recommended configuration for React](https://www.npmjs.com/package/eslint-config-react-app) (be sure you have [Node installed!](https://nodejs.org/en/download/current/)) +- [Integrate ESLint in VSCode with the official extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) + +**Make sure that you've enabled all the [`eslint-plugin-react-hooks`](https://www.npmjs.com/package/eslint-plugin-react-hooks) rules for your project.** They are essential and catch the most severe bugs early. The recommended [`eslint-config-react-app`](https://www.npmjs.com/package/eslint-config-react-app) preset already includes them. + +### Formatting + +The last thing you want to do when sharing your code with another contributor is get into an discussion about [tabs vs spaces](https://www.google.com/search?q=tabs+vs+spaces)! Fortunately, [Prettier](https://prettier.io/) will clean up your code by reformatting it to conform to preset, configurable rules. Run Prettier, and all your tabs will be converted to spaces—and your indentation, quotes, etc will also all be changed to conform to the configuration. In the ideal setup, Prettier will run when you save your file, quickly making these edits for you. + +You can install the [Prettier extension in VSCode](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) by following these steps: + +1. Launch VS Code +2. Use Quick Open (press Ctrl/Cmd+P) +3. Paste in `ext install esbenp.prettier-vscode` +4. Press Enter + +#### Formatting on save + +Ideally, you should format your code on every save. VS Code has settings for this! + +1. In VS Code, press `CTRL/CMD + SHIFT + P`. +2. Type "settings" +3. Hit Enter +4. In the search bar, type "format on save" +5. Be sure the "format on save" option is ticked! + +> If your ESLint preset has formatting rules, they may conflict with Prettier. We recommend disabling all formatting rules in your ESLint preset using [`eslint-config-prettier`](https://github.com/prettier/eslint-config-prettier) so that ESLint is _only_ used for catching logical mistakes. If you want to enforce that files are formatted before a pull request is merged, use [`prettier --check`](https://prettier.io/docs/en/cli.html#--check) for your continuous integration. diff --git a/docs/src/learn/extracting-state-logic-into-a-reducer.md b/docs/src/learn/extracting-state-logic-into-a-reducer.md new file mode 100644 index 000000000..d3368f238 --- /dev/null +++ b/docs/src/learn/extracting-state-logic-into-a-reducer.md @@ -0,0 +1,2644 @@ +--- +title: Extracting State Logic into a Reducer 🚧 +--- + +## Overview + +<p class="intro" markdown> + +Components with many state updates spread across many event handlers can get overwhelming. For these cases, you can consolidate all the state update logic outside your component in a single function, called a _reducer._ + +</p> + +!!! summary "You Will Learn" + + - What a reducer function is + - How to refactor `useState` to `useReducer` + - When to use a reducer + - How to write one well + +## Consolidate state logic with a reducer + +As your components grow in complexity, it can get harder to see at a glance all the different ways in which a component's state gets updated. For example, the `TaskApp` component below holds an array of `tasks` in state and uses three different event handlers to add, remove, and edit tasks: + +```js +import { useState } from "react"; +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; + +export default function TaskApp() { + const [tasks, setTasks] = useState(initialTasks); + + function handleAddTask(text) { + setTasks([ + ...tasks, + { + id: nextId++, + text: text, + done: false, + }, + ]); + } + + function handleChangeTask(task) { + setTasks( + tasks.map((t) => { + if (t.id === task.id) { + return task; + } else { + return t; + } + }) + ); + } + + function handleDeleteTask(taskId) { + setTasks(tasks.filter((t) => t.id !== taskId)); + } + + return ( + <> + <h1>Prague itinerary</h1> + <AddTask onAddTask={handleAddTask} /> + <TaskList + tasks={tasks} + onChangeTask={handleChangeTask} + onDeleteTask={handleDeleteTask} + /> + </> + ); +} + +let nextId = 3; +const initialTasks = [ + { id: 0, text: "Visit Kafka Museum", done: true }, + { id: 1, text: "Watch a puppet show", done: false }, + { id: 2, text: "Lennon Wall pic", done: false }, +]; +``` + +```js +import { useState } from "react"; + +export default function AddTask({ onAddTask }) { + const [text, setText] = useState(""); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + on_click={() => { + setText(""); + onAddTask(text); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ tasks, onChangeTask, onDeleteTask }) { + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task + task={task} + onChange={onChangeTask} + onDelete={onDeleteTask} + /> + </li> + ))} + </ul> + ); +} + +function Task({ task, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + onChange({ + ...task, + text: e.target.value, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + onChange({ + ...task, + done: e.target.checked, + }); + }} + /> + {taskContent} + <button on_click={() => onDelete(task.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +Each of its event handlers calls `setTasks` in order to update the state. As this component grows, so does the amount of state logic sprinkled throughout it. To reduce this complexity and keep all your logic in one easy-to-access place, you can move that state logic into a single function outside your component, **called a "reducer".** + +Reducers are a different way to handle state. You can migrate from `useState` to `useReducer` in three steps: + +1. **Move** from setting state to dispatching actions. +2. **Write** a reducer function. +3. **Use** the reducer from your component. + +### Step 1: Move from setting state to dispatching actions + +Your event handlers currently specify _what to do_ by setting state: + +```js +function handleAddTask(text) { + setTasks([ + ...tasks, + { + id: nextId++, + text: text, + done: false, + }, + ]); +} + +function handleChangeTask(task) { + setTasks( + tasks.map((t) => { + if (t.id === task.id) { + return task; + } else { + return t; + } + }) + ); +} + +function handleDeleteTask(taskId) { + setTasks(tasks.filter((t) => t.id !== taskId)); +} +``` + +Remove all the state setting logic. What you are left with are three event handlers: + +- `handleAddTask(text)` is called when the user presses "Add". +- `handleChangeTask(task)` is called when the user toggles a task or presses "Save". +- `handleDeleteTask(taskId)` is called when the user presses "Delete". + +Managing state with reducers is slightly different from directly setting state. Instead of telling React "what to do" by setting state, you specify "what the user just did" by dispatching "actions" from your event handlers. (The state update logic will live elsewhere!) So instead of "setting `tasks`" via an event handler, you're dispatching an "added/changed/deleted a task" action. This is more descriptive of the user's intent. + +```js +function handleAddTask(text) { + dispatch({ + type: "added", + id: nextId++, + text: text, + }); +} + +function handleChangeTask(task) { + dispatch({ + type: "changed", + task: task, + }); +} + +function handleDeleteTask(taskId) { + dispatch({ + type: "deleted", + id: taskId, + }); +} +``` + +The object you pass to `dispatch` is called an "action": + +```js +function handleDeleteTask(taskId) { + dispatch( + // "action" object: + { + type: "deleted", + id: taskId, + } + ); +} +``` + +It is a regular JavaScript object. You decide what to put in it, but generally it should contain the minimal information about _what happened_. (You will add the `dispatch` function itself in a later step.) + +<Note> + +An action object can have any shape. + +By convention, it is common to give it a string `type` that describes what happened, and pass any additional information in other fields. The `type` is specific to a component, so in this example either `'added'` or `'added_task'` would be fine. Choose a name that says what happened! + +```js +dispatch({ + // specific to component + type: "what_happened", + // other fields go here +}); +``` + +</Note> + +### Step 2: Write a reducer function + +A reducer function is where you will put your state logic. It takes two arguments, the current state and the action object, and it returns the next state: + +```js +function yourReducer(state, action) { + // return next state for React to set +} +``` + +React will set the state to what you return from the reducer. + +To move your state setting logic from your event handlers to a reducer function in this example, you will: + +1. Declare the current state (`tasks`) as the first argument. +2. Declare the `action` object as the second argument. +3. Return the _next_ state from the reducer (which React will set the state to). + +Here is all the state setting logic migrated to a reducer function: + +```js +function tasksReducer(tasks, action) { + if (action.type === "added") { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } else if (action.type === "changed") { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } else if (action.type === "deleted") { + return tasks.filter((t) => t.id !== action.id); + } else { + throw Error("Unknown action: " + action.type); + } +} +``` + +Because the reducer function takes state (`tasks`) as an argument, you can **declare it outside of your component.** This decreases the indentation level and can make your code easier to read. + +<Note> + +The code above uses if/else statements, but it's a convention to use [switch statements](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/switch) inside reducers. The result is the same, but it can be easier to read switch statements at a glance. + +We'll be using them throughout the rest of this documentation like so: + +```js +function tasksReducer(tasks, action) { + switch (action.type) { + case "added": { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } + case "changed": { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } + case "deleted": { + return tasks.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} +``` + +We recommend wrapping each `case` block into the `{` and `}` curly braces so that variables declared inside of different `case`s don't clash with each other. Also, a `case` should usually end with a `return`. If you forget to `return`, the code will "fall through" to the next `case`, which can lead to mistakes! + +If you're not yet comfortable with switch statements, using if/else is completely fine. + +</Note> + +<DeepDive> + +#### Why are reducers called this way? + +Although reducers can "reduce" the amount of code inside your component, they are actually named after the [`reduce()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) operation that you can perform on arrays. + +The `reduce()` operation lets you take an array and "accumulate" a single value out of many: + +``` +const arr = [1, 2, 3, 4, 5]; +const sum = arr.reduce( + (result, number) => result + number +); // 1 + 2 + 3 + 4 + 5 +``` + +The function you pass to `reduce` is known as a "reducer". It takes the _result so far_ and the _current item,_ then it returns the _next result._ React reducers are an example of the same idea: they take the _state so far_ and the _action_, and return the _next state._ In this way, they accumulate actions over time into state. + +You could even use the `reduce()` method with an `initialState` and an array of `actions` to calculate the final state by passing your reducer function to it: + +```js +import tasksReducer from "./tasksReducer.js"; + +let initialState = []; +let actions = [ + { type: "added", id: 1, text: "Visit Kafka Museum" }, + { type: "added", id: 2, text: "Watch a puppet show" }, + { type: "deleted", id: 1 }, + { type: "added", id: 3, text: "Lennon Wall pic" }, +]; + +let finalState = actions.reduce(tasksReducer, initialState); + +const output = document.getElementById("output"); +output.textContent = JSON.stringify(finalState, null, 2); +``` + +```js +export default function tasksReducer(tasks, action) { + switch (action.type) { + case "added": { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } + case "changed": { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } + case "deleted": { + return tasks.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} +``` + +```html +<pre id="output"></pre> +``` + +You probably won't need to do this yourself, but this is similar to what React does! + +</DeepDive> + +### Step 3: Use the reducer from your component + +Finally, you need to hook up the `tasksReducer` to your component. Import the `useReducer` Hook from React: + +```js +import { useReducer } from "react"; +``` + +Then you can replace `useState`: + +```js +const [tasks, setTasks] = useState(initialTasks); +``` + +with `useReducer` like so: + +```js +const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); +``` + +The `useReducer` Hook is similar to `useState`—you must pass it an initial state and it returns a stateful value and a way to set state (in this case, the dispatch function). But it's a little different. + +The `useReducer` Hook takes two arguments: + +1. A reducer function +2. An initial state + +And it returns: + +1. A stateful value +2. A dispatch function (to "dispatch" user actions to the reducer) + +Now it's fully wired up! Here, the reducer is declared at the bottom of the component file: + +```js +import { useReducer } from "react"; +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; + +export default function TaskApp() { + const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); + + function handleAddTask(text) { + dispatch({ + type: "added", + id: nextId++, + text: text, + }); + } + + function handleChangeTask(task) { + dispatch({ + type: "changed", + task: task, + }); + } + + function handleDeleteTask(taskId) { + dispatch({ + type: "deleted", + id: taskId, + }); + } + + return ( + <> + <h1>Prague itinerary</h1> + <AddTask onAddTask={handleAddTask} /> + <TaskList + tasks={tasks} + onChangeTask={handleChangeTask} + onDeleteTask={handleDeleteTask} + /> + </> + ); +} + +function tasksReducer(tasks, action) { + switch (action.type) { + case "added": { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } + case "changed": { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } + case "deleted": { + return tasks.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} + +let nextId = 3; +const initialTasks = [ + { id: 0, text: "Visit Kafka Museum", done: true }, + { id: 1, text: "Watch a puppet show", done: false }, + { id: 2, text: "Lennon Wall pic", done: false }, +]; +``` + +```js +import { useState } from "react"; + +export default function AddTask({ onAddTask }) { + const [text, setText] = useState(""); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + on_click={() => { + setText(""); + onAddTask(text); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ tasks, onChangeTask, onDeleteTask }) { + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task + task={task} + onChange={onChangeTask} + onDelete={onDeleteTask} + /> + </li> + ))} + </ul> + ); +} + +function Task({ task, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + onChange({ + ...task, + text: e.target.value, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + onChange({ + ...task, + done: e.target.checked, + }); + }} + /> + {taskContent} + <button on_click={() => onDelete(task.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +If you want, you can even move the reducer to a different file: + +```js +import { useReducer } from "react"; +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; +import tasksReducer from "./tasksReducer.js"; + +export default function TaskApp() { + const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); + + function handleAddTask(text) { + dispatch({ + type: "added", + id: nextId++, + text: text, + }); + } + + function handleChangeTask(task) { + dispatch({ + type: "changed", + task: task, + }); + } + + function handleDeleteTask(taskId) { + dispatch({ + type: "deleted", + id: taskId, + }); + } + + return ( + <> + <h1>Prague itinerary</h1> + <AddTask onAddTask={handleAddTask} /> + <TaskList + tasks={tasks} + onChangeTask={handleChangeTask} + onDeleteTask={handleDeleteTask} + /> + </> + ); +} + +let nextId = 3; +const initialTasks = [ + { id: 0, text: "Visit Kafka Museum", done: true }, + { id: 1, text: "Watch a puppet show", done: false }, + { id: 2, text: "Lennon Wall pic", done: false }, +]; +``` + +```js +export default function tasksReducer(tasks, action) { + switch (action.type) { + case "added": { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } + case "changed": { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } + case "deleted": { + return tasks.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} +``` + +```js +import { useState } from "react"; + +export default function AddTask({ onAddTask }) { + const [text, setText] = useState(""); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + on_click={() => { + setText(""); + onAddTask(text); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ tasks, onChangeTask, onDeleteTask }) { + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task + task={task} + onChange={onChangeTask} + onDelete={onDeleteTask} + /> + </li> + ))} + </ul> + ); +} + +function Task({ task, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + onChange({ + ...task, + text: e.target.value, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + onChange({ + ...task, + done: e.target.checked, + }); + }} + /> + {taskContent} + <button on_click={() => onDelete(task.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +Component logic can be easier to read when you separate concerns like this. Now the event handlers only specify _what happened_ by dispatching actions, and the reducer function determines _how the state updates_ in response to them. + +## Comparing `useState` and `useReducer` + +Reducers are not without downsides! Here's a few ways you can compare them: + +- **Code size:** Generally, with `useState` you have to write less code upfront. With `useReducer`, you have to write both a reducer function _and_ dispatch actions. However, `useReducer` can help cut down on the code if many event handlers modify state in a similar way. +- **Readability:** `useState` is very easy to read when the state updates are simple. When they get more complex, they can bloat your component's code and make it difficult to scan. In this case, `useReducer` lets you cleanly separate the _how_ of update logic from the _what happened_ of event handlers. +- **Debugging:** When you have a bug with `useState`, it can be difficult to tell _where_ the state was set incorrectly, and _why_. With `useReducer`, you can add a console log into your reducer to see every state update, and _why_ it happened (due to which `action`). If each `action` is correct, you'll know that the mistake is in the reducer logic itself. However, you have to step through more code than with `useState`. +- **Testing:** A reducer is a pure function that doesn't depend on your component. This means that you can export and test it separately in isolation. While generally it's best to test components in a more realistic environment, for complex state update logic it can be useful to assert that your reducer returns a particular state for a particular initial state and action. +- **Personal preference:** Some people like reducers, others don't. That's okay. It's a matter of preference. You can always convert between `useState` and `useReducer` back and forth: they are equivalent! + +We recommend using a reducer if you often encounter bugs due to incorrect state updates in some component, and want to introduce more structure to its code. You don't have to use reducers for everything: feel free to mix and match! You can even `useState` and `useReducer` in the same component. + +## Writing reducers well + +Keep these two tips in mind when writing reducers: + +- **Reducers must be pure.** Similar to [state updater functions](/learn/queueing-a-series-of-state-updates), reducers run during rendering! (Actions are queued until the next render.) This means that reducers [must be pure](/learn/keeping-components-pure)—same inputs always result in the same output. They should not send requests, schedule timeouts, or perform any side effects (operations that impact things outside the component). They should update [objects](/learn/updating-objects-in-state) and [arrays](/learn/updating-arrays-in-state) without mutations. +- **Each action describes a single user interaction, even if that leads to multiple changes in the data.** For example, if a user presses "Reset" on a form with five fields managed by a reducer, it makes more sense to dispatch one `reset_form` action rather than five separate `set_field` actions. If you log every action in a reducer, that log should be clear enough for you to reconstruct what interactions or responses happened in what order. This helps with debugging! + +## Writing concise reducers with Immer + +Just like with [updating objects](/learn/updating-objects-in-state#write-concise-update-logic-with-immer) and [arrays](/learn/updating-arrays-in-state#write-concise-update-logic-with-immer) in regular state, you can use the Immer library to make reducers more concise. Here, [`useImmerReducer`](https://github.com/immerjs/use-immer#useimmerreducer) lets you mutate the state with `push` or `arr[i] =` assignment: + +```js +import { useImmerReducer } from "use-immer"; +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; + +function tasksReducer(draft, action) { + switch (action.type) { + case "added": { + draft.push({ + id: action.id, + text: action.text, + done: false, + }); + break; + } + case "changed": { + const index = draft.findIndex((t) => t.id === action.task.id); + draft[index] = action.task; + break; + } + case "deleted": { + return draft.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} + +export default function TaskApp() { + const [tasks, dispatch] = useImmerReducer(tasksReducer, initialTasks); + + function handleAddTask(text) { + dispatch({ + type: "added", + id: nextId++, + text: text, + }); + } + + function handleChangeTask(task) { + dispatch({ + type: "changed", + task: task, + }); + } + + function handleDeleteTask(taskId) { + dispatch({ + type: "deleted", + id: taskId, + }); + } + + return ( + <> + <h1>Prague itinerary</h1> + <AddTask onAddTask={handleAddTask} /> + <TaskList + tasks={tasks} + onChangeTask={handleChangeTask} + onDeleteTask={handleDeleteTask} + /> + </> + ); +} + +let nextId = 3; +const initialTasks = [ + { id: 0, text: "Visit Kafka Museum", done: true }, + { id: 1, text: "Watch a puppet show", done: false }, + { id: 2, text: "Lennon Wall pic", done: false }, +]; +``` + +```js +import { useState } from "react"; + +export default function AddTask({ onAddTask }) { + const [text, setText] = useState(""); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + on_click={() => { + setText(""); + onAddTask(text); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ tasks, onChangeTask, onDeleteTask }) { + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task + task={task} + onChange={onChangeTask} + onDelete={onDeleteTask} + /> + </li> + ))} + </ul> + ); +} + +function Task({ task, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + onChange({ + ...task, + text: e.target.value, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + onChange({ + ...task, + done: e.target.checked, + }); + }} + /> + {taskContent} + <button on_click={() => onDelete(task.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +```json +{ + "dependencies": { + "immer": "1.7.3", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "use-immer": "0.5.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +Reducers must be pure, so they shouldn't mutate state. But Immer provides you with a special `draft` object which is safe to mutate. Under the hood, Immer will create a copy of your state with the changes you made to the `draft`. This is why reducers managed by `useImmerReducer` can mutate their first argument and don't need to return state. + +<Recap> + +- To convert from `useState` to `useReducer`: + 1. Dispatch actions from event handlers. + 2. Write a reducer function that returns the next state for a given state and action. + 3. Replace `useState` with `useReducer`. +- Reducers require you to write a bit more code, but they help with debugging and testing. +- Reducers must be pure. +- Each action describes a single user interaction. +- Use Immer if you want to write reducers in a mutating style. + +</Recap> + +<Challenges> + +#### Dispatch actions from event handlers + +Currently, the event handlers in `ContactList.js` and `Chat.js` have `// TODO` comments. This is why typing into the input doesn't work, and clicking on the buttons doesn't change the selected recipient. + +Replace these two `// TODO`s with the code to `dispatch` the corresponding actions. To see the expected shape and the type of the actions, check the reducer in `messengerReducer.js`. The reducer is already written so you won't need to change it. You only need to dispatch the actions in `ContactList.js` and `Chat.js`. + +<Hint> + +The `dispatch` function is already available in both of these components because it was passed as a prop. So you need to call `dispatch` with the corresponding action object. + +To check the action object shape, you can look at the reducer and see which `action` fields it expects to see. For example, the `changed_selection` case in the reducer looks like this: + +```js +case 'changed_selection': { + return { + ...state, + selectedId: action.contactId + }; +} +``` + +This means that your action object should have a `type: 'changed_selection'`. You also see the `action.contactId` being used, so you need to include a `contactId` property into your action. + +</Hint> + +```js +import { useReducer } from "react"; +import Chat from "./Chat.js"; +import ContactList from "./ContactList.js"; +import { initialState, messengerReducer } from "./messengerReducer"; + +export default function Messenger() { + const [state, dispatch] = useReducer(messengerReducer, initialState); + const message = state.message; + const contact = contacts.find((c) => c.id === state.selectedId); + return ( + <div> + <ContactList + contacts={contacts} + selectedId={state.selectedId} + dispatch={dispatch} + /> + <Chat + key={contact.id} + message={message} + contact={contact} + dispatch={dispatch} + /> + </div> + ); +} + +const contacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export const initialState = { + selectedId: 0, + message: "Hello", +}; + +export function messengerReducer(state, action) { + switch (action.type) { + case "changed_selection": { + return { + ...state, + selectedId: action.contactId, + message: "", + }; + } + case "edited_message": { + return { + ...state, + message: action.message, + }; + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} +``` + +```js +export default function ContactList({ contacts, selectedId, dispatch }) { + return ( + <section className="contact-list"> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + // TODO: dispatch changed_selection + }} + > + {selectedId === contact.id ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Chat({ contact, message, dispatch }) { + return ( + <section className="chat"> + <textarea + value={message} + placeholder={"Chat to " + contact.name} + onChange={(e) => { + // TODO: dispatch edited_message + // (Read the input value from e.target.value) + }} + /> + <br /> + <button>Send to {contact.email}</button> + </section> + ); +} +``` + +```css +.chat, +.contact-list { + float: left; + margin-bottom: 20px; +} +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li button { + width: 100px; + padding: 10px; + margin-right: 10px; +} +textarea { + height: 150px; +} +``` + +<Solution> + +From the reducer code, you can infer that actions need to look like this: + +```js +// When the user presses "Alice" +dispatch({ + type: "changed_selection", + contactId: 1, +}); + +// When user types "Hello!" +dispatch({ + type: "edited_message", + message: "Hello!", +}); +``` + +Here is the example updated to dispatch the corresponding messages: + +```js +import { useReducer } from "react"; +import Chat from "./Chat.js"; +import ContactList from "./ContactList.js"; +import { initialState, messengerReducer } from "./messengerReducer"; + +export default function Messenger() { + const [state, dispatch] = useReducer(messengerReducer, initialState); + const message = state.message; + const contact = contacts.find((c) => c.id === state.selectedId); + return ( + <div> + <ContactList + contacts={contacts} + selectedId={state.selectedId} + dispatch={dispatch} + /> + <Chat + key={contact.id} + message={message} + contact={contact} + dispatch={dispatch} + /> + </div> + ); +} + +const contacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export const initialState = { + selectedId: 0, + message: "Hello", +}; + +export function messengerReducer(state, action) { + switch (action.type) { + case "changed_selection": { + return { + ...state, + selectedId: action.contactId, + message: "", + }; + } + case "edited_message": { + return { + ...state, + message: action.message, + }; + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} +``` + +```js +export default function ContactList({ contacts, selectedId, dispatch }) { + return ( + <section className="contact-list"> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + dispatch({ + type: "changed_selection", + contactId: contact.id, + }); + }} + > + {selectedId === contact.id ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Chat({ contact, message, dispatch }) { + return ( + <section className="chat"> + <textarea + value={message} + placeholder={"Chat to " + contact.name} + onChange={(e) => { + dispatch({ + type: "edited_message", + message: e.target.value, + }); + }} + /> + <br /> + <button>Send to {contact.email}</button> + </section> + ); +} +``` + +```css +.chat, +.contact-list { + float: left; + margin-bottom: 20px; +} +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li button { + width: 100px; + padding: 10px; + margin-right: 10px; +} +textarea { + height: 150px; +} +``` + +</Solution> + +#### Clear the input on sending a message + +Currently, pressing "Send" doesn't do anything. Add an event handler to the "Send" button that will: + +1. Show an `alert` with the recipient's email and the message. +2. Clear the message input. + +```js +import { useReducer } from "react"; +import Chat from "./Chat.js"; +import ContactList from "./ContactList.js"; +import { initialState, messengerReducer } from "./messengerReducer"; + +export default function Messenger() { + const [state, dispatch] = useReducer(messengerReducer, initialState); + const message = state.message; + const contact = contacts.find((c) => c.id === state.selectedId); + return ( + <div> + <ContactList + contacts={contacts} + selectedId={state.selectedId} + dispatch={dispatch} + /> + <Chat + key={contact.id} + message={message} + contact={contact} + dispatch={dispatch} + /> + </div> + ); +} + +const contacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export const initialState = { + selectedId: 0, + message: "Hello", +}; + +export function messengerReducer(state, action) { + switch (action.type) { + case "changed_selection": { + return { + ...state, + selectedId: action.contactId, + message: "", + }; + } + case "edited_message": { + return { + ...state, + message: action.message, + }; + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} +``` + +```js +export default function ContactList({ contacts, selectedId, dispatch }) { + return ( + <section className="contact-list"> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + dispatch({ + type: "changed_selection", + contactId: contact.id, + }); + }} + > + {selectedId === contact.id ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Chat({ contact, message, dispatch }) { + return ( + <section className="chat"> + <textarea + value={message} + placeholder={"Chat to " + contact.name} + onChange={(e) => { + dispatch({ + type: "edited_message", + message: e.target.value, + }); + }} + /> + <br /> + <button>Send to {contact.email}</button> + </section> + ); +} +``` + +```css +.chat, +.contact-list { + float: left; + margin-bottom: 20px; +} +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li button { + width: 100px; + padding: 10px; + margin-right: 10px; +} +textarea { + height: 150px; +} +``` + +<Solution> + +There are a couple of ways you could do it in the "Send" button event handler. One approach is to show an alert and then dispatch an `edited_message` action with an empty `message`: + +```js +import { useReducer } from "react"; +import Chat from "./Chat.js"; +import ContactList from "./ContactList.js"; +import { initialState, messengerReducer } from "./messengerReducer"; + +export default function Messenger() { + const [state, dispatch] = useReducer(messengerReducer, initialState); + const message = state.message; + const contact = contacts.find((c) => c.id === state.selectedId); + return ( + <div> + <ContactList + contacts={contacts} + selectedId={state.selectedId} + dispatch={dispatch} + /> + <Chat + key={contact.id} + message={message} + contact={contact} + dispatch={dispatch} + /> + </div> + ); +} + +const contacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export const initialState = { + selectedId: 0, + message: "Hello", +}; + +export function messengerReducer(state, action) { + switch (action.type) { + case "changed_selection": { + return { + ...state, + selectedId: action.contactId, + message: "", + }; + } + case "edited_message": { + return { + ...state, + message: action.message, + }; + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} +``` + +```js +export default function ContactList({ contacts, selectedId, dispatch }) { + return ( + <section className="contact-list"> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + dispatch({ + type: "changed_selection", + contactId: contact.id, + }); + }} + > + {selectedId === contact.id ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Chat({ contact, message, dispatch }) { + return ( + <section className="chat"> + <textarea + value={message} + placeholder={"Chat to " + contact.name} + onChange={(e) => { + dispatch({ + type: "edited_message", + message: e.target.value, + }); + }} + /> + <br /> + <button + on_click={() => { + alert(`Sending "${message}" to ${contact.email}`); + dispatch({ + type: "edited_message", + message: "", + }); + }} + > + Send to {contact.email} + </button> + </section> + ); +} +``` + +```css +.chat, +.contact-list { + float: left; + margin-bottom: 20px; +} +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li button { + width: 100px; + padding: 10px; + margin-right: 10px; +} +textarea { + height: 150px; +} +``` + +This works and clears the input when you hit "Send". + +However, _from the user's perspective_, sending a message is a different action than editing the field. To reflect that, you could instead create a _new_ action called `sent_message`, and handle it separately in the reducer: + +```js +import { useReducer } from "react"; +import Chat from "./Chat.js"; +import ContactList from "./ContactList.js"; +import { initialState, messengerReducer } from "./messengerReducer"; + +export default function Messenger() { + const [state, dispatch] = useReducer(messengerReducer, initialState); + const message = state.message; + const contact = contacts.find((c) => c.id === state.selectedId); + return ( + <div> + <ContactList + contacts={contacts} + selectedId={state.selectedId} + dispatch={dispatch} + /> + <Chat + key={contact.id} + message={message} + contact={contact} + dispatch={dispatch} + /> + </div> + ); +} + +const contacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export const initialState = { + selectedId: 0, + message: "Hello", +}; + +export function messengerReducer(state, action) { + switch (action.type) { + case "changed_selection": { + return { + ...state, + selectedId: action.contactId, + message: "", + }; + } + case "edited_message": { + return { + ...state, + message: action.message, + }; + } + case "sent_message": { + return { + ...state, + message: "", + }; + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} +``` + +```js +export default function ContactList({ contacts, selectedId, dispatch }) { + return ( + <section className="contact-list"> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + dispatch({ + type: "changed_selection", + contactId: contact.id, + }); + }} + > + {selectedId === contact.id ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Chat({ contact, message, dispatch }) { + return ( + <section className="chat"> + <textarea + value={message} + placeholder={"Chat to " + contact.name} + onChange={(e) => { + dispatch({ + type: "edited_message", + message: e.target.value, + }); + }} + /> + <br /> + <button + on_click={() => { + alert(`Sending "${message}" to ${contact.email}`); + dispatch({ + type: "sent_message", + }); + }} + > + Send to {contact.email} + </button> + </section> + ); +} +``` + +```css +.chat, +.contact-list { + float: left; + margin-bottom: 20px; +} +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li button { + width: 100px; + padding: 10px; + margin-right: 10px; +} +textarea { + height: 150px; +} +``` + +The resulting behavior is the same. But keep in mind that action types should ideally describe "what the user did" rather than "how you want the state to change". This makes it easier to later add more features. + +With either solution, it's important that you **don't** place the `alert` inside a reducer. The reducer should be a pure function--it should only calculate the next state. It should not "do" anything, including displaying messages to the user. That should happen in the event handler. (To help catch mistakes like this, React will call your reducers multiple times in Strict Mode. This is why, if you put an alert in a reducer, it fires twice.) + +</Solution> + +#### Restore input values when switching between tabs + +In this example, switching between different recipients always clears the text input: + +```js +case 'changed_selection': { + return { + ...state, + selectedId: action.contactId, + message: '' // Clears the input + }; +``` + +This is because you don't want to share a single message draft between several recipients. But it would be better if your app "remembered" a draft for each contact separately, restoring them when you switch contacts. + +Your task is to change the way the state is structured so that you remember a separate message draft _per contact_. You would need to make a few changes to the reducer, the initial state, and the components. + +<Hint> + +You can structure your state like this: + +```js +export const initialState = { + selectedId: 0, + messages: { + 0: "Hello, Taylor", // Draft for contactId = 0 + 1: "Hello, Alice", // Draft for contactId = 1 + }, +}; +``` + +The `[key]: value` [computed property](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#computed_property_names) syntax can help you update the `messages` object: + +```js +{ + ...state.messages, + [id]: message +} +``` + +</Hint> + +```js +import { useReducer } from "react"; +import Chat from "./Chat.js"; +import ContactList from "./ContactList.js"; +import { initialState, messengerReducer } from "./messengerReducer"; + +export default function Messenger() { + const [state, dispatch] = useReducer(messengerReducer, initialState); + const message = state.message; + const contact = contacts.find((c) => c.id === state.selectedId); + return ( + <div> + <ContactList + contacts={contacts} + selectedId={state.selectedId} + dispatch={dispatch} + /> + <Chat + key={contact.id} + message={message} + contact={contact} + dispatch={dispatch} + /> + </div> + ); +} + +const contacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export const initialState = { + selectedId: 0, + message: "Hello", +}; + +export function messengerReducer(state, action) { + switch (action.type) { + case "changed_selection": { + return { + ...state, + selectedId: action.contactId, + message: "", + }; + } + case "edited_message": { + return { + ...state, + message: action.message, + }; + } + case "sent_message": { + return { + ...state, + message: "", + }; + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} +``` + +```js +export default function ContactList({ contacts, selectedId, dispatch }) { + return ( + <section className="contact-list"> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + dispatch({ + type: "changed_selection", + contactId: contact.id, + }); + }} + > + {selectedId === contact.id ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Chat({ contact, message, dispatch }) { + return ( + <section className="chat"> + <textarea + value={message} + placeholder={"Chat to " + contact.name} + onChange={(e) => { + dispatch({ + type: "edited_message", + message: e.target.value, + }); + }} + /> + <br /> + <button + on_click={() => { + alert(`Sending "${message}" to ${contact.email}`); + dispatch({ + type: "sent_message", + }); + }} + > + Send to {contact.email} + </button> + </section> + ); +} +``` + +```css +.chat, +.contact-list { + float: left; + margin-bottom: 20px; +} +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li button { + width: 100px; + padding: 10px; + margin-right: 10px; +} +textarea { + height: 150px; +} +``` + +<Solution> + +You'll need to update the reducer to store and update a separate message draft per contact: + +```js +// When the input is edited +case 'edited_message': { + return { + // Keep other state like selection + ...state, + messages: { + // Keep messages for other contacts + ...state.messages, + // But change the selected contact's message + [state.selectedId]: action.message + } + }; +} +``` + +You would also update the `Messenger` component to read the message for the currently selected contact: + +```js +const message = state.messages[state.selectedId]; +``` + +Here is the complete solution: + +```js +import { useReducer } from "react"; +import Chat from "./Chat.js"; +import ContactList from "./ContactList.js"; +import { initialState, messengerReducer } from "./messengerReducer"; + +export default function Messenger() { + const [state, dispatch] = useReducer(messengerReducer, initialState); + const message = state.messages[state.selectedId]; + const contact = contacts.find((c) => c.id === state.selectedId); + return ( + <div> + <ContactList + contacts={contacts} + selectedId={state.selectedId} + dispatch={dispatch} + /> + <Chat + key={contact.id} + message={message} + contact={contact} + dispatch={dispatch} + /> + </div> + ); +} + +const contacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export const initialState = { + selectedId: 0, + messages: { + 0: "Hello, Taylor", + 1: "Hello, Alice", + 2: "Hello, Bob", + }, +}; + +export function messengerReducer(state, action) { + switch (action.type) { + case "changed_selection": { + return { + ...state, + selectedId: action.contactId, + }; + } + case "edited_message": { + return { + ...state, + messages: { + ...state.messages, + [state.selectedId]: action.message, + }, + }; + } + case "sent_message": { + return { + ...state, + messages: { + ...state.messages, + [state.selectedId]: "", + }, + }; + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} +``` + +```js +export default function ContactList({ contacts, selectedId, dispatch }) { + return ( + <section className="contact-list"> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + dispatch({ + type: "changed_selection", + contactId: contact.id, + }); + }} + > + {selectedId === contact.id ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Chat({ contact, message, dispatch }) { + return ( + <section className="chat"> + <textarea + value={message} + placeholder={"Chat to " + contact.name} + onChange={(e) => { + dispatch({ + type: "edited_message", + message: e.target.value, + }); + }} + /> + <br /> + <button + on_click={() => { + alert(`Sending "${message}" to ${contact.email}`); + dispatch({ + type: "sent_message", + }); + }} + > + Send to {contact.email} + </button> + </section> + ); +} +``` + +```css +.chat, +.contact-list { + float: left; + margin-bottom: 20px; +} +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li button { + width: 100px; + padding: 10px; + margin-right: 10px; +} +textarea { + height: 150px; +} +``` + +Notably, you didn't need to change any of the event handlers to implement this different behavior. Without a reducer, you would have to change every event handler that updates the state. + +</Solution> + +#### Implement `useReducer` from scratch + +In the earlier examples, you imported the `useReducer` Hook from React. This time, you will implement _the `useReducer` Hook itself!_ Here is a stub to get you started. It shouldn't take more than 10 lines of code. + +To test your changes, try typing into the input or select a contact. + +<Hint> + +Here is a more detailed sketch of the implementation: + +```js +export function useReducer(reducer, initialState) { + const [state, setState] = useState(initialState); + + function dispatch(action) { + // ??? + } + + return [state, dispatch]; +} +``` + +Recall that a reducer function takes two arguments--the current state and the action object--and it returns the next state. What should your `dispatch` implementation do with it? + +</Hint> + +```js +import { useReducer } from "./MyReact.js"; +import Chat from "./Chat.js"; +import ContactList from "./ContactList.js"; +import { initialState, messengerReducer } from "./messengerReducer"; + +export default function Messenger() { + const [state, dispatch] = useReducer(messengerReducer, initialState); + const message = state.messages[state.selectedId]; + const contact = contacts.find((c) => c.id === state.selectedId); + return ( + <div> + <ContactList + contacts={contacts} + selectedId={state.selectedId} + dispatch={dispatch} + /> + <Chat + key={contact.id} + message={message} + contact={contact} + dispatch={dispatch} + /> + </div> + ); +} + +const contacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export const initialState = { + selectedId: 0, + messages: { + 0: "Hello, Taylor", + 1: "Hello, Alice", + 2: "Hello, Bob", + }, +}; + +export function messengerReducer(state, action) { + switch (action.type) { + case "changed_selection": { + return { + ...state, + selectedId: action.contactId, + }; + } + case "edited_message": { + return { + ...state, + messages: { + ...state.messages, + [state.selectedId]: action.message, + }, + }; + } + case "sent_message": { + return { + ...state, + messages: { + ...state.messages, + [state.selectedId]: "", + }, + }; + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} +``` + +```js +import { useState } from "react"; + +export function useReducer(reducer, initialState) { + const [state, setState] = useState(initialState); + + // ??? + + return [state, dispatch]; +} +``` + +```js +export default function ContactList({ contacts, selectedId, dispatch }) { + return ( + <section className="contact-list"> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + dispatch({ + type: "changed_selection", + contactId: contact.id, + }); + }} + > + {selectedId === contact.id ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Chat({ contact, message, dispatch }) { + return ( + <section className="chat"> + <textarea + value={message} + placeholder={"Chat to " + contact.name} + onChange={(e) => { + dispatch({ + type: "edited_message", + message: e.target.value, + }); + }} + /> + <br /> + <button + on_click={() => { + alert(`Sending "${message}" to ${contact.email}`); + dispatch({ + type: "sent_message", + }); + }} + > + Send to {contact.email} + </button> + </section> + ); +} +``` + +```css +.chat, +.contact-list { + float: left; + margin-bottom: 20px; +} +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li button { + width: 100px; + padding: 10px; + margin-right: 10px; +} +textarea { + height: 150px; +} +``` + +<Solution> + +Dispatching an action calls a reducer with the current state and the action, and stores the result as the next state. This is what it looks like in code: + +```js +import { useReducer } from "./MyReact.js"; +import Chat from "./Chat.js"; +import ContactList from "./ContactList.js"; +import { initialState, messengerReducer } from "./messengerReducer"; + +export default function Messenger() { + const [state, dispatch] = useReducer(messengerReducer, initialState); + const message = state.messages[state.selectedId]; + const contact = contacts.find((c) => c.id === state.selectedId); + return ( + <div> + <ContactList + contacts={contacts} + selectedId={state.selectedId} + dispatch={dispatch} + /> + <Chat + key={contact.id} + message={message} + contact={contact} + dispatch={dispatch} + /> + </div> + ); +} + +const contacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export const initialState = { + selectedId: 0, + messages: { + 0: "Hello, Taylor", + 1: "Hello, Alice", + 2: "Hello, Bob", + }, +}; + +export function messengerReducer(state, action) { + switch (action.type) { + case "changed_selection": { + return { + ...state, + selectedId: action.contactId, + }; + } + case "edited_message": { + return { + ...state, + messages: { + ...state.messages, + [state.selectedId]: action.message, + }, + }; + } + case "sent_message": { + return { + ...state, + messages: { + ...state.messages, + [state.selectedId]: "", + }, + }; + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} +``` + +```js +import { useState } from "react"; + +export function useReducer(reducer, initialState) { + const [state, setState] = useState(initialState); + + function dispatch(action) { + const nextState = reducer(state, action); + setState(nextState); + } + + return [state, dispatch]; +} +``` + +```js +export default function ContactList({ contacts, selectedId, dispatch }) { + return ( + <section className="contact-list"> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + dispatch({ + type: "changed_selection", + contactId: contact.id, + }); + }} + > + {selectedId === contact.id ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Chat({ contact, message, dispatch }) { + return ( + <section className="chat"> + <textarea + value={message} + placeholder={"Chat to " + contact.name} + onChange={(e) => { + dispatch({ + type: "edited_message", + message: e.target.value, + }); + }} + /> + <br /> + <button + on_click={() => { + alert(`Sending "${message}" to ${contact.email}`); + dispatch({ + type: "sent_message", + }); + }} + > + Send to {contact.email} + </button> + </section> + ); +} +``` + +```css +.chat, +.contact-list { + float: left; + margin-bottom: 20px; +} +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li button { + width: 100px; + padding: 10px; + margin-right: 10px; +} +textarea { + height: 150px; +} +``` + +Though it doesn't matter in most cases, a slightly more accurate implementation looks like this: + +```js +function dispatch(action) { + setState((s) => reducer(s, action)); +} +``` + +This is because the dispatched actions are queued until the next render, [similar to the updater functions.](/learn/queueing-a-series-of-state-updates) + +</Solution> + +</Challenges> diff --git a/docs/src/learn/get-started.md b/docs/src/learn/get-started.md new file mode 100644 index 000000000..20e52dd3b --- /dev/null +++ b/docs/src/learn/get-started.md @@ -0,0 +1,303 @@ +--- +title: "Get Started" +--- + +## Overview + +<p class="intro" markdown> + +Welcome to the ReactPy documentation! This page will give you an introduction to the 80% of React concepts that you will use on a daily basis. + +</p> + +!!! summary "You Will Learn" + + - How to create and nest components + - How to add markup and styles + - How to display data + - How to render conditions and lists + - How to respond to events and update the screen + - How to share data between components + +## Creating and nesting components + +React apps are made out of _components_. A component is a piece of the UI (user interface) that has its own logic and appearance. A component can be as small as a button, or as large as an entire page. + +React components are Python functions that return markup: + +```python linenums="0" +{% include "../../examples/python/quick_start/my_button.py" start="# start" %} +``` + +Now that you've declared `my_button`, you can nest it into another component: + +```python linenums="0" hl_lines="5" +{% include "../../examples/python/quick_start/my_app.py" start="# start" %} +``` + +Have a look at the result: + +=== "app.py" + + ```python + {% include "../../examples/python/quick_start/creating_and_nesting_components.py" end="# end" %} + ``` + +=== ":material-play: Run" + + ```python + # TODO + ``` + +<!-- ## Writing markup with JSX + +The markup syntax you've seen above is called _JSX_. It is optional, but most React projects use JSX for its convenience. All of the [tools we recommend for local development](/learn/installation) support JSX out of the box. + +JSX is stricter than HTML. You have to close tags like `<br />`. Your component also can't return multiple JSX tags. You have to wrap them into a shared parent, like a `<div>...</div>` or an empty `<>...</>` wrapper: + +```js +function AboutPage() { + return ( + <> + <h1>About</h1> + <p> + Hello there. + <br /> + How do you do? + </p> + </> + ); +} +``` + +If you have a lot of HTML to port to JSX, you can use an [online converter.](https://transform.tools/html-to-jsx) --> + +## Adding styles + +In React, you specify a CSS class with `class_name`. It works the same way as the HTML [`class`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/class) attribute: + +```python linenums="0" +{% include "../../examples/python/quick_start/adding_styles.py" start="# start" %} +``` + +Then you write the CSS rules for it in a separate CSS file: + +```css linenums="0" +{% include "../../examples/css/quick_start/adding_styles.css" %} +``` + +React does not prescribe how you add CSS files. In the simplest case, you'll add a [`<link>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link) tag to your HTML. If you use a build tool or web framework, consult its documentation to learn how to add a CSS file to your project. + +## Displaying data + +<!-- JSX lets you put markup into JavaScript. Curly braces let you "escape back" into JavaScript so that you can embed some variable from your code and display it to the user. For example, this will display `user.name`: + +```js +return <h1>{user.name}</h1>; +``` + +You can also "escape into JavaScript" from JSX attributes, but you have to use curly braces _instead of_ quotes. For example, `className="avatar"` passes the `"avatar"` string as the CSS class, but `src={user.imageUrl}` reads the JavaScript `user.imageUrl` variable value, and then passes that value as the `src` attribute: + +```js +return <img className="avatar" src={user.imageUrl} />; +``` + +You can put more complex expressions inside the JSX curly braces too, for example, [string concatenation](https://javascript.info/operators#string-concatenation-with-binary): --> + +You can fetch data from a variety of sources and directly embed it into your components. You can also use the `style` attribute when your styles depend on JavaScript variables. + +=== "app.py" + + ```python + {% include "../../examples/python/quick_start/displaying_data.py" end="# end" %} + ``` + +=== "stylesheet.css" + + ```css + {% include "../../examples/css/quick_start/displaying_data.css" %} + ``` + +=== ":material-play: Run" + + ```python + # TODO + ``` + +## Conditional rendering + +In React, there is no special syntax for writing conditions. Instead, you'll use the same techniques as you use when writing regular Python code. For example, you can use an `if` statement to conditionally include components: + +```python linenums="0" +{% include "../../examples/python/quick_start/conditional_rendering.py" start="# start"%} +``` + +If you prefer more compact code, you can use the [ternary operator.](https://www.geeksforgeeks.org/ternary-operator-in-python/): + +```python linenums="0" +{% include "../../examples/python/quick_start/conditional_rendering_ternary.py" start="# start"%} +``` + +When you don't need the `else` branch, you can also use a shorter [logical `and` syntax](https://www.geeksforgeeks.org/short-circuiting-techniques-python/): + +```python linenums="0" +{% include "../../examples/python/quick_start/conditional_rendering_logical_and.py" start="# start" %} +``` + +All of these approaches also work for conditionally specifying attributes. If you're unfamiliar with some of this Python syntax, you can start by always using `if...else`. + +## Rendering lists + +You will rely on Python features like [`for` loop](https://www.w3schools.com/python/quick_start/python_for_loops.asp) and [list comprehension](https://www.w3schools.com/python/quick_start/python_lists_comprehension.asp) to render lists of components. + +For example, let's say you have an array of products: + +```python linenums="0" +{% include "../../examples/python/quick_start/rendering_lists_products.py" %} +``` + +Inside your component, use the `map()` function to transform an array of products into an array of `<li>` items: + +```python linenums="0" +{% include "../../examples/python/quick_start/rendering_lists_list_items.py" start="# start" %} +``` + +Notice how `<li>` has a `key` attribute. For each item in a list, you should pass a string or a number that uniquely identifies that item among its siblings. Usually, a key should be coming from your data, such as a database ID. React uses your keys to know what happened if you later insert, delete, or reorder the items. + +=== "app.py" + + ```python + {% include "../../examples/python/quick_start/rendering_lists.py" end="# end" %} + ``` + +=== ":material-play: Run" + + ```python + # TODO + ``` + +## Responding to events + +You can respond to events by declaring _event handler_ functions inside your components: + +```python linenums="0" hl_lines="3-4 7" +{% include "../../examples/python/quick_start/responding_to_events.py" start="# start" %} +``` + +Notice how `"on_click": handle_click` has no parentheses at the end! Do not _call_ the event handler function: you only need to _pass it down_. React will call your event handler when the user clicks the button. + +## Updating the screen + +Often, you'll want your component to "remember" some information and display it. For example, maybe you want to count the number of times a button is clicked. To do this, add _state_ to your component. + +First, import [`use_state`](../reference/use-state.md) from React: + +```python linenums="0" +{% include "../../examples/python/quick_start/updating_the_screen_use_state.py" end="# end" %} +``` + +Now you can declare a _state variable_ inside your component: + +```python linenums="0" +{% include "../../examples/python/quick_start/updating_the_screen_use_state_button.py" start="# start" %} +``` + +You’ll get two things from `use_state`: the current state (`count`), and the function that lets you update it (`set_sount`). You can give them any names, but the convention is to write `something, set_something = ...`. + +The first time the button is displayed, `count` will be `0` because you passed `0` to `use_state()`. When you want to change state, call `set_count()` and pass the new value to it. Clicking this button will increment the counter: + +```python linenums="0" hl_lines="6" +{% include "../../examples/python/quick_start/updating_the_screen_event.py" start="# start" %} +``` + +React will call your component function again. This time, `count` will be `1`. Then it will be `2`. And so on. + +If you render the same component multiple times, each will get its own state. Click each button separately: + +=== "app.py" + + ```python + {% include "../../examples/python/quick_start/updating_the_screen.py" end="# end" %} + ``` + +=== "stylesheet.css" + + ```css + {% include "../../examples/css/quick_start/updating_the_screen.css" %} + ``` + +=== ":material-play: Run" + + ```python + # TODO + ``` + +Notice how each button "remembers" its own `count` state and doesn't affect other buttons. + +## Using Hooks + +Functions starting with `use` are called _Hooks_. `use_state` is a built-in Hook provided by React. You can find other built-in Hooks in the [API reference.](../reference/use-state.md) You can also write your own Hooks by combining the existing ones. + +Hooks are more restrictive than other functions. You can only call Hooks _at the top_ of your components (or other Hooks). If you want to use `useState` in a condition or a loop, extract a new component and put it there. + +## Sharing data between components + +In the previous example, each `my_button` had its own independent `count`, and when each button was clicked, only the `count` for the button clicked changed: + +<!-- TODO: Diagram --> + +However, often you'll need components to _share data and always update together_. + +To make both `my_button` components display the same `count` and update together, you need to move the state from the individual buttons "upwards" to the closest component containing all of them. + +In this example, it is `my_app`. + +<!-- TODO: Diagram --> + +Now when you click either button, the `count` in `my_app` will change, which will change both of the counts in `my_button`. Here's how you can express this in code. + +First, _move the state up_ from `my_button` into `my_app`: + +```python linenums="0" hl_lines="3-6 17" +{% include "../../examples/python/quick_start/sharing_data_between_components_move_state.py" start="# start" %} +``` + +Then, _pass the state down_ from `my_app` to each `my_button`, together with the shared click handler. You can pass information to `my_button` using props: + +```python linenums="0" hl_lines="10-11" +{% include "../../examples/python/quick_start/sharing_data_between_components_props.py" start="# start" end="# end" %} +``` + +The information you pass down like this is called _props_. Now the `my_app` component contains the `count` state and the `handle_click` event handler, and _passes both of them down as props_ to each of the buttons. + +Finally, change `my_button` to _read_ the props you have passed from its parent component: + +```python linenums="0" +{% include "../../examples/python/quick_start/sharing_data_between_components_button.py" start="# start" %} +``` + +When you click the button, the `on_click` handler fires. Each button's `on_click` prop was set to the `handle_click` function inside `my_app`, so the code inside of it runs. That code calls `set_count(count + 1)`, incrementing the `count` state variable. The new `count` value is passed as a prop to each button, so they all show the new value. This is called "lifting state up". By moving state up, you've shared it between components. + +=== "app.py" + + ```python + {% include "../../examples/python/quick_start/sharing_data_between_components.py" end="# end" %} + ``` + +=== "stylesheet.css" + + ```css + {% include "../../examples/css/quick_start/sharing_data_between_components.css" %} + ``` + +=== ":material-play: Run" + + ```python + # TODO + ``` + +## Next Steps + +By now, you know the basics of how to write React code! + +Check out the [Tutorial](./tutorial-tic-tac-toe.md) to put them into practice and build your first mini-app with React. diff --git a/docs/src/learn/importing-and-exporting-components.md b/docs/src/learn/importing-and-exporting-components.md new file mode 100644 index 000000000..6e677d51d --- /dev/null +++ b/docs/src/learn/importing-and-exporting-components.md @@ -0,0 +1,382 @@ +--- +title: Importing and Exporting Components 🚧 +--- + +## Overview + +<p class="intro" markdown> + +The magic of components lies in their reusability: you can create components that are composed of other components. But as you nest more and more components, it often makes sense to start splitting them into different files. This lets you keep your files easy to scan and reuse components in more places. + +</p> + +!!! summary "You Will Learn" + + - What a root component file is + - How to import and export a component + - When to use default and named imports and exports + - How to import and export multiple components from one file + - How to split components into multiple files + +## The root component file + +In [Your First Component](/learn/your-first-component), you made a `Profile` component and a `Gallery` component that renders it: + +```js +function Profile() { + return ( + <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" /> + ); +} + +export default function Gallery() { + return ( + <section> + <h1>Amazing scientists</h1> + <Profile /> + <Profile /> + <Profile /> + </section> + ); +} +``` + +```css +img { + margin: 0 10px 10px 0; + height: 90px; +} +``` + +These currently live in a **root component file,** named `App.js` in this example. In [Create React App](https://create-react-app.dev/), your app lives in `src/App.js`. Depending on your setup, your root component could be in another file, though. If you use a framework with file-based routing, such as Next.js, your root component will be different for every page. + +## Exporting and importing a component + +What if you want to change the landing screen in the future and put a list of science books there? Or place all the profiles somewhere else? It makes sense to move `Gallery` and `Profile` out of the root component file. This will make them more modular and reusable in other files. You can move a component in three steps: + +1. **Make** a new JS file to put the components in. +2. **Export** your function component from that file (using either [default](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/export#using_the_default_export) or [named](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/export#using_named_exports) exports). +3. **Import** it in the file where you’ll use the component (using the corresponding technique for importing [default](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/import#importing_defaults) or [named](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/import#import_a_single_export_from_a_module) exports). + +Here both `Profile` and `Gallery` have been moved out of `App.js` into a new file called `Gallery.js`. Now you can change `App.js` to import `Gallery` from `Gallery.js`: + +```js +import Gallery from "./Gallery.js"; + +export default function App() { + return <Gallery />; +} +``` + +```js +function Profile() { + return <img src="https://i.imgur.com/QIrZWGIs.jpg" alt="Alan L. Hart" />; +} + +export default function Gallery() { + return ( + <section> + <h1>Amazing scientists</h1> + <Profile /> + <Profile /> + <Profile /> + </section> + ); +} +``` + +```css +img { + margin: 0 10px 10px 0; + height: 90px; +} +``` + +Notice how this example is broken down into two component files now: + +1. `Gallery.js`: + - Defines the `Profile` component which is only used within the same file and is not exported. + - Exports the `Gallery` component as a **default export.** +2. `App.js`: + - Imports `Gallery` as a **default import** from `Gallery.js`. + - Exports the root `App` component as a **default export.** + +<Note> + +You may encounter files that leave off the `.js` file extension like so: + +```js +import Gallery from "./Gallery"; +``` + +Either `'./Gallery.js'` or `'./Gallery'` will work with React, though the former is closer to how [native ES Modules](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Modules) work. + +</Note> + +<DeepDive> + +#### Default vs named exports + +There are two primary ways to export values with JavaScript: default exports and named exports. So far, our examples have only used default exports. But you can use one or both of them in the same file. **A file can have no more than one _default_ export, but it can have as many _named_ exports as you like.** + + + +How you export your component dictates how you must import it. You will get an error if you try to import a default export the same way you would a named export! This chart can help you keep track: + +| Syntax | Export statement | Import statement | +| --- | --- | --- | +| Default | `export default function Button() {}` | `import Button from './Button.js';` | +| Named | `export function Button() {}` | `import { Button } from './Button.js';` | + +When you write a _default_ import, you can put any name you want after `import`. For example, you could write `import Banana from './Button.js'` instead and it would still provide you with the same default export. In contrast, with named imports, the name has to match on both sides. That's why they are called _named_ imports! + +**People often use default exports if the file exports only one component, and use named exports if it exports multiple components and values.** Regardless of which coding style you prefer, always give meaningful names to your component functions and the files that contain them. Components without names, like `export default () => {}`, are discouraged because they make debugging harder. + +</DeepDive> + +## Exporting and importing multiple components from the same file + +What if you want to show just one `Profile` instead of a gallery? You can export the `Profile` component, too. But `Gallery.js` already has a _default_ export, and you can't have _two_ default exports. You could create a new file with a default export, or you could add a _named_ export for `Profile`. **A file can only have one default export, but it can have numerous named exports!** + +<Note> + +To reduce the potential confusion between default and named exports, some teams choose to only stick to one style (default or named), or avoid mixing them in a single file. Do what works best for you! + +</Note> + +First, **export** `Profile` from `Gallery.js` using a named export (no `default` keyword): + +```js +export function Profile() { + // ... +} +``` + +Then, **import** `Profile` from `Gallery.js` to `App.js` using a named import (with the curly braces): + +```js +import { Profile } from "./Gallery.js"; +``` + +Finally, **render** `<Profile />` from the `App` component: + +```js +export default function App() { + return <Profile />; +} +``` + +Now `Gallery.js` contains two exports: a default `Gallery` export, and a named `Profile` export. `App.js` imports both of them. Try editing `<Profile />` to `<Gallery />` and back in this example: + +```js +import Gallery from "./Gallery.js"; +import { Profile } from "./Gallery.js"; + +export default function App() { + return <Profile />; +} +``` + +```js +export function Profile() { + return <img src="https://i.imgur.com/QIrZWGIs.jpg" alt="Alan L. Hart" />; +} + +export default function Gallery() { + return ( + <section> + <h1>Amazing scientists</h1> + <Profile /> + <Profile /> + <Profile /> + </section> + ); +} +``` + +```css +img { + margin: 0 10px 10px 0; + height: 90px; +} +``` + +Now you're using a mix of default and named exports: + +- `Gallery.js`: + - Exports the `Profile` component as a **named export called `Profile`.** + - Exports the `Gallery` component as a **default export.** +- `App.js`: + - Imports `Profile` as a **named import called `Profile`** from `Gallery.js`. + - Imports `Gallery` as a **default import** from `Gallery.js`. + - Exports the root `App` component as a **default export.** + +<Recap> + +On this page you learned: + +- What a root component file is +- How to import and export a component +- When and how to use default and named imports and exports +- How to export multiple components from the same file + +</Recap> + +<Challenges> + +#### Split the components further + +Currently, `Gallery.js` exports both `Profile` and `Gallery`, which is a bit confusing. + +Move the `Profile` component to its own `Profile.js`, and then change the `App` component to render both `<Profile />` and `<Gallery />` one after another. + +You may use either a default or a named export for `Profile`, but make sure that you use the corresponding import syntax in both `App.js` and `Gallery.js`! You can refer to the table from the deep dive above: + +| Syntax | Export statement | Import statement | +| --- | --- | --- | +| Default | `export default function Button() {}` | `import Button from './Button.js';` | +| Named | `export function Button() {}` | `import { Button } from './Button.js';` | + +<Hint> + +Don't forget to import your components where they are called. Doesn't `Gallery` use `Profile`, too? + +</Hint> + +```js +import Gallery from "./Gallery.js"; +import { Profile } from "./Gallery.js"; + +export default function App() { + return ( + <div> + <Profile /> + </div> + ); +} +``` + +```js +// Move me to Profile.js! +export function Profile() { + return <img src="https://i.imgur.com/QIrZWGIs.jpg" alt="Alan L. Hart" />; +} + +export default function Gallery() { + return ( + <section> + <h1>Amazing scientists</h1> + <Profile /> + <Profile /> + <Profile /> + </section> + ); +} +``` + +```js + +``` + +```css +img { + margin: 0 10px 10px 0; + height: 90px; +} +``` + +After you get it working with one kind of exports, make it work with the other kind. + +<Solution> + +This is the solution with named exports: + +```js +import Gallery from "./Gallery.js"; +import { Profile } from "./Profile.js"; + +export default function App() { + return ( + <div> + <Profile /> + <Gallery /> + </div> + ); +} +``` + +```js +import { Profile } from "./Profile.js"; + +export default function Gallery() { + return ( + <section> + <h1>Amazing scientists</h1> + <Profile /> + <Profile /> + <Profile /> + </section> + ); +} +``` + +```js +export function Profile() { + return <img src="https://i.imgur.com/QIrZWGIs.jpg" alt="Alan L. Hart" />; +} +``` + +```css +img { + margin: 0 10px 10px 0; + height: 90px; +} +``` + +This is the solution with default exports: + +```js +import Gallery from "./Gallery.js"; +import Profile from "./Profile.js"; + +export default function App() { + return ( + <div> + <Profile /> + <Gallery /> + </div> + ); +} +``` + +```js +import Profile from "./Profile.js"; + +export default function Gallery() { + return ( + <section> + <h1>Amazing scientists</h1> + <Profile /> + <Profile /> + <Profile /> + </section> + ); +} +``` + +```js +export default function Profile() { + return <img src="https://i.imgur.com/QIrZWGIs.jpg" alt="Alan L. Hart" />; +} +``` + +```css +img { + margin: 0 10px 10px 0; + height: 90px; +} +``` + +</Solution> + +</Challenges> diff --git a/docs/src/learn/keeping-components-pure.md b/docs/src/learn/keeping-components-pure.md new file mode 100644 index 000000000..c1a9bc92d --- /dev/null +++ b/docs/src/learn/keeping-components-pure.md @@ -0,0 +1,815 @@ +--- +title: Keeping Components Pure 🚧 +--- + +## Overview + +<p class="intro" markdown> + +Some JavaScript functions are _pure._ Pure functions only perform a calculation and nothing more. By strictly only writing your components as pure functions, you can avoid an entire class of baffling bugs and unpredictable behavior as your codebase grows. To get these benefits, though, there are a few rules you must follow. + +</p> + +!!! summary "You Will Learn" + + - What purity is and how it helps you avoid bugs + - How to keep components pure by keeping changes out of the render phase + - How to use Strict Mode to find mistakes in your components + +## Purity: Components as formulas + +In computer science (and especially the world of functional programming), [a pure function](https://wikipedia.org/wiki/Pure_function) is a function with the following characteristics: + +- **It minds its own business.** It does not change any objects or variables that existed before it was called. +- **Same inputs, same output.** Given the same inputs, a pure function should always return the same result. + +You might already be familiar with one example of pure functions: formulas in math. + +Consider this math formula: <Math><MathI>y</MathI> = 2<MathI>x</MathI></Math>. + +If <Math><MathI>x</MathI> = 2</Math> then <Math><MathI>y</MathI> = 4</Math>. Always. + +If <Math><MathI>x</MathI> = 3</Math> then <Math><MathI>y</MathI> = 6</Math>. Always. + +If <Math><MathI>x</MathI> = 3</Math>, <MathI>y</MathI> won't sometimes be <Math>9</Math> or <Math>–1</Math> or <Math>2.5</Math> depending on the time of day or the state of the stock market. + +If <Math><MathI>y</MathI> = 2<MathI>x</MathI></Math> and <Math><MathI>x</MathI> = 3</Math>, <MathI>y</MathI> will _always_ be <Math>6</Math>. + +If we made this into a JavaScript function, it would look like this: + +```js +function double(number) { + return 2 * number; +} +``` + +In the above example, `double` is a **pure function.** If you pass it `3`, it will return `6`. Always. + +React is designed around this concept. **React assumes that every component you write is a pure function.** This means that React components you write must always return the same JSX given the same inputs: + +```js +function Recipe({ drinkers }) { + return ( + <ol> + <li>Boil {drinkers} cups of water.</li> + <li> + Add {drinkers} spoons of tea and {0.5 * drinkers} spoons of + spice. + </li> + <li> + Add {0.5 * drinkers} cups of milk to boil and sugar to taste. + </li> + </ol> + ); +} + +export default function App() { + return ( + <section> + <h1>Spiced Chai Recipe</h1> + <h2>For two</h2> + <Recipe drinkers={2} /> + <h2>For a gathering</h2> + <Recipe drinkers={4} /> + </section> + ); +} +``` + +When you pass `drinkers={2}` to `Recipe`, it will return JSX containing `2 cups of water`. Always. + +If you pass `drinkers={4}`, it will return JSX containing `4 cups of water`. Always. + +Just like a math formula. + +You could think of your components as recipes: if you follow them and don't introduce new ingredients during the cooking process, you will get the same dish every time. That "dish" is the JSX that the component serves to React to [render.](/learn/render-and-commit) + +<Illustration src="/images/docs/illustrations/i_puritea-recipe.png" alt="A tea recipe for x people: take x cups of water, add x spoons of tea and 0.5x spoons of spices, and 0.5x cups of milk" /> + +## Side Effects: (un)intended consequences + +React's rendering process must always be pure. Components should only _return_ their JSX, and not _change_ any objects or variables that existed before rendering—that would make them impure! + +Here is a component that breaks this rule: + +```js +let guest = 0; + +function Cup() { + // Bad: changing a preexisting variable! + guest = guest + 1; + return <h2>Tea cup for guest #{guest}</h2>; +} + +export default function TeaSet() { + return ( + <> + <Cup /> + <Cup /> + <Cup /> + </> + ); +} +``` + +This component is reading and writing a `guest` variable declared outside of it. This means that **calling this component multiple times will produce different JSX!** And what's more, if _other_ components read `guest`, they will produce different JSX, too, depending on when they were rendered! That's not predictable. + +Going back to our formula <Math><MathI>y</MathI> = 2<MathI>x</MathI></Math>, now even if <Math><MathI>x</MathI> = 2</Math>, we cannot trust that <Math><MathI>y</MathI> = 4</Math>. Our tests could fail, our users would be baffled, planes would fall out of the sky—you can see how this would lead to confusing bugs! + +You can fix this component by [passing `guest` as a prop instead](/learn/passing-props-to-a-component): + +```js +function Cup({ guest }) { + return <h2>Tea cup for guest #{guest}</h2>; +} + +export default function TeaSet() { + return ( + <> + <Cup guest={1} /> + <Cup guest={2} /> + <Cup guest={3} /> + </> + ); +} +``` + +Now your component is pure, as the JSX it returns only depends on the `guest` prop. + +In general, you should not expect your components to be rendered in any particular order. It doesn't matter if you call <Math><MathI>y</MathI> = 2<MathI>x</MathI></Math> before or after <Math><MathI>y</MathI> = 5<MathI>x</MathI></Math>: both formulas will resolve independently of each other. In the same way, each component should only "think for itself", and not attempt to coordinate with or depend upon others during rendering. Rendering is like a school exam: each component should calculate JSX on their own! + +<DeepDive> + +#### Detecting impure calculations with StrictMode + +Although you might not have used them all yet, in React there are three kinds of inputs that you can read while rendering: [props](/learn/passing-props-to-a-component), [state](/learn/state-a-components-memory), and [context.](/learn/passing-data-deeply-with-context) You should always treat these inputs as read-only. + +When you want to _change_ something in response to user input, you should [set state](/learn/state-a-components-memory) instead of writing to a variable. You should never change preexisting variables or objects while your component is rendering. + +React offers a "Strict Mode" in which it calls each component's function twice during development. **By calling the component functions twice, Strict Mode helps find components that break these rules.** + +Notice how the original example displayed "Guest #2", "Guest #4", and "Guest #6" instead of "Guest #1", "Guest #2", and "Guest #3". The original function was impure, so calling it twice broke it. But the fixed pure version works even if the function is called twice every time. **Pure functions only calculate, so calling them twice won't change anything**--just like calling `double(2)` twice doesn't change what's returned, and solving <Math><MathI>y</MathI> = 2<MathI>x</MathI></Math> twice doesn't change what <MathI>y</MathI> is. Same inputs, same outputs. Always. + +Strict Mode has no effect in production, so it won't slow down the app for your users. To opt into Strict Mode, you can wrap your root component into `<React.StrictMode>`. Some frameworks do this by default. + +</DeepDive> + +### Local mutation: Your component's little secret + +In the above example, the problem was that the component changed a _preexisting_ variable while rendering. This is often called a **"mutation"** to make it sound a bit scarier. Pure functions don't mutate variables outside of the function's scope or objects that were created before the call—that makes them impure! + +However, **it's completely fine to change variables and objects that you've _just_ created while rendering.** In this example, you create an `[]` array, assign it to a `cups` variable, and then `push` a dozen cups into it: + +```js +function Cup({ guest }) { + return <h2>Tea cup for guest #{guest}</h2>; +} + +export default function TeaGathering() { + let cups = []; + for (let i = 1; i <= 12; i++) { + cups.push(<Cup key={i} guest={i} />); + } + return cups; +} +``` + +If the `cups` variable or the `[]` array were created outside the `TeaGathering` function, this would be a huge problem! You would be changing a _preexisting_ object by pushing items into that array. + +However, it's fine because you've created them _during the same render_, inside `TeaGathering`. No code outside of `TeaGathering` will ever know that this happened. This is called **"local mutation"**—it's like your component's little secret. + +## Where you _can_ cause side effects + +While functional programming relies heavily on purity, at some point, somewhere, _something_ has to change. That's kind of the point of programming! These changes—updating the screen, starting an animation, changing the data—are called **side effects.** They're things that happen _"on the side"_, not during rendering. + +In React, **side effects usually belong inside [event handlers.](/learn/responding-to-events)** Event handlers are functions that React runs when you perform some action—for example, when you click a button. Even though event handlers are defined _inside_ your component, they don't run _during_ rendering! **So event handlers don't need to be pure.** + +If you've exhausted all other options and can't find the right event handler for your side effect, you can still attach it to your returned JSX with a [`useEffect`](/reference/react/useEffect) call in your component. This tells React to execute it later, after rendering, when side effects are allowed. **However, this approach should be your last resort.** + +When possible, try to express your logic with rendering alone. You'll be surprised how far this can take you! + +<DeepDive> + +#### Why does React care about purity? + +Writing pure functions takes some habit and discipline. But it also unlocks marvelous opportunities: + +- Your components could run in a different environment—for example, on the server! Since they return the same result for the same inputs, one component can serve many user requests. +- You can improve performance by [skipping rendering](/reference/react/memo) components whose inputs have not changed. This is safe because pure functions always return the same results, so they are safe to cache. +- If some data changes in the middle of rendering a deep component tree, React can restart rendering without wasting time to finish the outdated render. Purity makes it safe to stop calculating at any time. + +Every new React feature we're building takes advantage of purity. From data fetching to animations to performance, keeping components pure unlocks the power of the React paradigm. + +</DeepDive> + +<Recap> + +- A component must be pure, meaning: + - **It minds its own business.** It should not change any objects or variables that existed before rendering. + - **Same inputs, same output.** Given the same inputs, a component should always return the same JSX. +- Rendering can happen at any time, so components should not depend on each others' rendering sequence. +- You should not mutate any of the inputs that your components use for rendering. That includes props, state, and context. To update the screen, ["set" state](/learn/state-a-components-memory) instead of mutating preexisting objects. +- Strive to express your component's logic in the JSX you return. When you need to "change things", you'll usually want to do it in an event handler. As a last resort, you can `useEffect`. +- Writing pure functions takes a bit of practice, but it unlocks the power of React's paradigm. + +</Recap> + +<Challenges> + +#### Fix a broken clock + +This component tries to set the `<h1>`'s CSS class to `"night"` during the time from midnight to six hours in the morning, and `"day"` at all other times. However, it doesn't work. Can you fix this component? + +You can verify whether your solution works by temporarily changing the computer's timezone. When the current time is between midnight and six in the morning, the clock should have inverted colors! + +<Hint> + +Rendering is a _calculation_, it shouldn't try to "do" things. Can you express the same idea differently? + +</Hint> + +```js +export default function Clock({ time }) { + let hours = time.getHours(); + if (hours >= 0 && hours <= 6) { + document.getElementById("time").className = "night"; + } else { + document.getElementById("time").className = "day"; + } + return <h1 id="time">{time.toLocaleTimeString()}</h1>; +} +``` + +```js +import { useState, useEffect } from "react"; +import Clock from "./Clock.js"; + +function useTime() { + const [time, setTime] = useState(() => new Date()); + useEffect(() => { + const id = setInterval(() => { + setTime(new Date()); + }, 1000); + return () => clearInterval(id); + }, []); + return time; +} + +export default function App() { + const time = useTime(); + return <Clock time={time} />; +} +``` + +```css +body > * { + width: 100%; + height: 100%; +} +.day { + background: #fff; + color: #222; +} +.night { + background: #222; + color: #fff; +} +``` + +<Solution> + +You can fix this component by calculating the `className` and including it in the render output: + +```js +export default function Clock({ time }) { + let hours = time.getHours(); + let className; + if (hours >= 0 && hours <= 6) { + className = "night"; + } else { + className = "day"; + } + return <h1 className={className}>{time.toLocaleTimeString()}</h1>; +} +``` + +```js +import { useState, useEffect } from "react"; +import Clock from "./Clock.js"; + +function useTime() { + const [time, setTime] = useState(() => new Date()); + useEffect(() => { + const id = setInterval(() => { + setTime(new Date()); + }, 1000); + return () => clearInterval(id); + }, []); + return time; +} + +export default function App() { + const time = useTime(); + return <Clock time={time} />; +} +``` + +```css +body > * { + width: 100%; + height: 100%; +} +.day { + background: #fff; + color: #222; +} +.night { + background: #222; + color: #fff; +} +``` + +In this example, the side effect (modifying the DOM) was not necessary at all. You only needed to return JSX. + +</Solution> + +#### Fix a broken profile + +Two `Profile` components are rendered side by side with different data. Press "Collapse" on the first profile, and then "Expand" it. You'll notice that both profiles now show the same person. This is a bug. + +Find the cause of the bug and fix it. + +<Hint> + +The buggy code is in `Profile.js`. Make sure you read it all from top to bottom! + +</Hint> + +```js +import Panel from "./Panel.js"; +import { getImageUrl } from "./utils.js"; + +let currentPerson; + +export default function Profile({ person }) { + currentPerson = person; + return ( + <Panel> + <Header /> + <Avatar /> + </Panel> + ); +} + +function Header() { + return <h1>{currentPerson.name}</h1>; +} + +function Avatar() { + return ( + <img + className="avatar" + src={getImageUrl(currentPerson)} + alt={currentPerson.name} + width={50} + height={50} + /> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Panel({ children }) { + const [open, setOpen] = useState(true); + return ( + <section className="panel"> + <button on_click={() => setOpen(!open)}> + {open ? "Collapse" : "Expand"} + </button> + {open && children} + </section> + ); +} +``` + +```js +import Profile from "./Profile.js"; + +export default function App() { + return ( + <> + <Profile + person={{ + imageId: "lrWQx8l", + name: "Subrahmanyan Chandrasekhar", + }} + /> + <Profile + person={{ + imageId: "MK3eW3A", + name: "Creola Katherine Johnson", + }} + /> + </> + ); +} +``` + +```js +export function getImageUrl(person, size = "s") { + return "https://i.imgur.com/" + person.imageId + size + ".jpg"; +} +``` + +```css +.avatar { + margin: 5px; + border-radius: 50%; +} +.panel { + border: 1px solid #aaa; + border-radius: 6px; + margin-top: 20px; + padding: 10px; + width: 200px; +} +h1 { + margin: 5px; + font-size: 18px; +} +``` + +<Solution> + +The problem is that the `Profile` component writes to a preexisting variable called `currentPerson`, and the `Header` and `Avatar` components read from it. This makes _all three of them_ impure and difficult to predict. + +To fix the bug, remove the `currentPerson` variable. Instead, pass all information from `Profile` to `Header` and `Avatar` via props. You'll need to add a `person` prop to both components and pass it all the way down. + +```js +import Panel from "./Panel.js"; +import { getImageUrl } from "./utils.js"; + +export default function Profile({ person }) { + return ( + <Panel> + <Header person={person} /> + <Avatar person={person} /> + </Panel> + ); +} + +function Header({ person }) { + return <h1>{person.name}</h1>; +} + +function Avatar({ person }) { + return ( + <img + className="avatar" + src={getImageUrl(person)} + alt={person.name} + width={50} + height={50} + /> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Panel({ children }) { + const [open, setOpen] = useState(true); + return ( + <section className="panel"> + <button on_click={() => setOpen(!open)}> + {open ? "Collapse" : "Expand"} + </button> + {open && children} + </section> + ); +} +``` + +```js +import Profile from "./Profile.js"; + +export default function App() { + return ( + <> + <Profile + person={{ + imageId: "lrWQx8l", + name: "Subrahmanyan Chandrasekhar", + }} + /> + <Profile + person={{ + imageId: "MK3eW3A", + name: "Creola Katherine Johnson", + }} + /> + </> + ); +} +``` + +```js +export function getImageUrl(person, size = "s") { + return "https://i.imgur.com/" + person.imageId + size + ".jpg"; +} +``` + +```css +.avatar { + margin: 5px; + border-radius: 50%; +} +.panel { + border: 1px solid #aaa; + border-radius: 6px; + margin-top: 20px; + padding: 10px; + width: 200px; +} +h1 { + margin: 5px; + font-size: 18px; +} +``` + +Remember that React does not guarantee that component functions will execute in any particular order, so you can't communicate between them by setting variables. All communication must happen through props. + +</Solution> + +#### Fix a broken story tray + +The CEO of your company is asking you to add "stories" to your online clock app, and you can't say no. You've written a `StoryTray` component that accepts a list of `stories`, followed by a "Create Story" placeholder. + +You implemented the "Create Story" placeholder by pushing one more fake story at the end of the `stories` array that you receive as a prop. But for some reason, "Create Story" appears more than once. Fix the issue. + +```js +export default function StoryTray({ stories }) { + stories.push({ + id: "create", + label: "Create Story", + }); + + return ( + <ul> + {stories.map((story) => ( + <li key={story.id}>{story.label}</li> + ))} + </ul> + ); +} +``` + +```js +import { useState, useEffect } from "react"; +import StoryTray from "./StoryTray.js"; + +let initialStories = [ + { id: 0, label: "Ankit's Story" }, + { id: 1, label: "Taylor's Story" }, +]; + +export default function App() { + let [stories, setStories] = useState([...initialStories]); + let time = useTime(); + + // HACK: Prevent the memory from growing forever while you read docs. + // We're breaking our own rules here. + if (stories.length > 100) { + stories.length = 100; + } + + return ( + <div + style={{ + width: "100%", + height: "100%", + textAlign: "center", + }} + > + <h2>It is {time.toLocaleTimeString()} now.</h2> + <StoryTray stories={stories} /> + </div> + ); +} + +function useTime() { + const [time, setTime] = useState(() => new Date()); + useEffect(() => { + const id = setInterval(() => { + setTime(new Date()); + }, 1000); + return () => clearInterval(id); + }, []); + return time; +} +``` + +```css +ul { + margin: 0; + list-style-type: none; +} + +li { + border: 1px solid #aaa; + border-radius: 6px; + float: left; + margin: 5px; + margin-bottom: 20px; + padding: 5px; + width: 70px; + height: 100px; +} +``` + +```js +{ + "hardReloadOnChange": true +} +``` + +<Solution> + +Notice how whenever the clock updates, "Create Story" is added _twice_. This serves as a hint that we have a mutation during rendering--Strict Mode calls components twice to make these issues more noticeable. + +`StoryTray` function is not pure. By calling `push` on the received `stories` array (a prop!), it is mutating an object that was created _before_ `StoryTray` started rendering. This makes it buggy and very difficult to predict. + +The simplest fix is to not touch the array at all, and render "Create Story" separately: + +```js +export default function StoryTray({ stories }) { + return ( + <ul> + {stories.map((story) => ( + <li key={story.id}>{story.label}</li> + ))} + <li>Create Story</li> + </ul> + ); +} +``` + +```js +import { useState, useEffect } from "react"; +import StoryTray from "./StoryTray.js"; + +let initialStories = [ + { id: 0, label: "Ankit's Story" }, + { id: 1, label: "Taylor's Story" }, +]; + +export default function App() { + let [stories, setStories] = useState([...initialStories]); + let time = useTime(); + + // HACK: Prevent the memory from growing forever while you read docs. + // We're breaking our own rules here. + if (stories.length > 100) { + stories.length = 100; + } + + return ( + <div + style={{ + width: "100%", + height: "100%", + textAlign: "center", + }} + > + <h2>It is {time.toLocaleTimeString()} now.</h2> + <StoryTray stories={stories} /> + </div> + ); +} + +function useTime() { + const [time, setTime] = useState(() => new Date()); + useEffect(() => { + const id = setInterval(() => { + setTime(new Date()); + }, 1000); + return () => clearInterval(id); + }, []); + return time; +} +``` + +```css +ul { + margin: 0; + list-style-type: none; +} + +li { + border: 1px solid #aaa; + border-radius: 6px; + float: left; + margin: 5px; + margin-bottom: 20px; + padding: 5px; + width: 70px; + height: 100px; +} +``` + +Alternatively, you could create a _new_ array (by copying the existing one) before you push an item into it: + +```js +export default function StoryTray({ stories }) { + // Copy the array! + let storiesToDisplay = stories.slice(); + + // Does not affect the original array: + storiesToDisplay.push({ + id: "create", + label: "Create Story", + }); + + return ( + <ul> + {storiesToDisplay.map((story) => ( + <li key={story.id}>{story.label}</li> + ))} + </ul> + ); +} +``` + +```js +import { useState, useEffect } from "react"; +import StoryTray from "./StoryTray.js"; + +let initialStories = [ + { id: 0, label: "Ankit's Story" }, + { id: 1, label: "Taylor's Story" }, +]; + +export default function App() { + let [stories, setStories] = useState([...initialStories]); + let time = useTime(); + + // HACK: Prevent the memory from growing forever while you read docs. + // We're breaking our own rules here. + if (stories.length > 100) { + stories.length = 100; + } + + return ( + <div + style={{ + width: "100%", + height: "100%", + textAlign: "center", + }} + > + <h2>It is {time.toLocaleTimeString()} now.</h2> + <StoryTray stories={stories} /> + </div> + ); +} + +function useTime() { + const [time, setTime] = useState(() => new Date()); + useEffect(() => { + const id = setInterval(() => { + setTime(new Date()); + }, 1000); + return () => clearInterval(id); + }, []); + return time; +} +``` + +```css +ul { + margin: 0; + list-style-type: none; +} + +li { + border: 1px solid #aaa; + border-radius: 6px; + float: left; + margin: 5px; + margin-bottom: 20px; + padding: 5px; + width: 70px; + height: 100px; +} +``` + +This keeps your mutation local and your rendering function pure. However, you still need to be careful: for example, if you tried to change any of the array's existing items, you'd have to clone those items too. + +It is useful to remember which operations on arrays mutate them, and which don't. For example, `push`, `pop`, `reverse`, and `sort` will mutate the original array, but `slice`, `filter`, and `map` will create a new one. + +</Solution> + +</Challenges> diff --git a/docs/src/learn/lifecycle-of-reactive-effects.md b/docs/src/learn/lifecycle-of-reactive-effects.md new file mode 100644 index 000000000..705158615 --- /dev/null +++ b/docs/src/learn/lifecycle-of-reactive-effects.md @@ -0,0 +1,2252 @@ +--- +title: "Lifecycle of Reactive Effects 🚧" +--- + +## Overview + +<p class="intro" markdown> + +Effects have a different lifecycle from components. Components may mount, update, or unmount. An Effect can only do two things: to start synchronizing something, and later to stop synchronizing it. This cycle can happen multiple times if your Effect depends on props and state that change over time. React provides a linter rule to check that you've specified your Effect's dependencies correctly. This keeps your Effect synchronized to the latest props and state. + +</p> + +!!! summary "You Will Learn" + + - How an Effect's lifecycle is different from a component's lifecycle + - How to think about each individual Effect in isolation + - When your Effect needs to re-synchronize, and why + - How your Effect's dependencies are determined + - What it means for a value to be reactive + - What an empty dependency array means + - How React verifies your dependencies are correct with a linter + - What to do when you disagree with the linter + +## The lifecycle of an Effect + +Every React component goes through the same lifecycle: + +- A component _mounts_ when it's added to the screen. +- A component _updates_ when it receives new props or state, usually in response to an interaction. +- A component _unmounts_ when it's removed from the screen. + +**It's a good way to think about components, but _not_ about Effects.** Instead, try to think about each Effect independently from your component's lifecycle. An Effect describes how to [synchronize an external system](/learn/synchronizing-with-effects) to the current props and state. As your code changes, synchronization will need to happen more or less often. + +To illustrate this point, consider this Effect connecting your component to a chat server: + +```js +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [roomId]); + // ... +} +``` + +Your Effect's body specifies how to **start synchronizing:** + +```js +// ... +const connection = createConnection(serverUrl, roomId); +connection.connect(); +return () => { + connection.disconnect(); +}; +// ... +``` + +The cleanup function returned by your Effect specifies how to **stop synchronizing:** + +```js +// ... +const connection = createConnection(serverUrl, roomId); +connection.connect(); +return () => { + connection.disconnect(); +}; +// ... +``` + +Intuitively, you might think that React would **start synchronizing** when your component mounts and **stop synchronizing** when your component unmounts. However, this is not the end of the story! Sometimes, it may also be necessary to **start and stop synchronizing multiple times** while the component remains mounted. + +Let's look at _why_ this is necessary, _when_ it happens, and _how_ you can control this behavior. + +<Note> + +Some Effects don't return a cleanup function at all. [More often than not,](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development) you'll want to return one--but if you don't, React will behave as if you returned an empty cleanup function. + +</Note> + +### Why synchronization may need to happen more than once + +Imagine this `ChatRoom` component receives a `roomId` prop that the user picks in a dropdown. Let's say that initially the user picks the `"general"` room as the `roomId`. Your app displays the `"general"` chat room: + +```js +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId /* "general" */ }) { + // ... + return <h1>Welcome to the {roomId} room!</h1>; +} +``` + +After the UI is displayed, React will run your Effect to **start synchronizing.** It connects to the `"general"` room: + +```js +function ChatRoom({ roomId /* "general" */ }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); // Connects to the "general" room + connection.connect(); + return () => { + connection.disconnect(); // Disconnects from the "general" room + }; + }, [roomId]); + // ... +``` + +So far, so good. + +Later, the user picks a different room in the dropdown (for example, `"travel"`). First, React will update the UI: + +```js +function ChatRoom({ roomId /* "travel" */ }) { + // ... + return <h1>Welcome to the {roomId} room!</h1>; +} +``` + +Think about what should happen next. The user sees that `"travel"` is the selected chat room in the UI. However, the Effect that ran the last time is still connected to the `"general"` room. **The `roomId` prop has changed, so what your Effect did back then (connecting to the `"general"` room) no longer matches the UI.** + +At this point, you want React to do two things: + +1. Stop synchronizing with the old `roomId` (disconnect from the `"general"` room) +2. Start synchronizing with the new `roomId` (connect to the `"travel"` room) + +**Luckily, you've already taught React how to do both of these things!** Your Effect's body specifies how to start synchronizing, and your cleanup function specifies how to stop synchronizing. All that React needs to do now is to call them in the correct order and with the correct props and state. Let's see how exactly that happens. + +### How React re-synchronizes your Effect + +Recall that your `ChatRoom` component has received a new value for its `roomId` prop. It used to be `"general"`, and now it is `"travel"`. React needs to re-synchronize your Effect to re-connect you to a different room. + +To **stop synchronizing,** React will call the cleanup function that your Effect returned after connecting to the `"general"` room. Since `roomId` was `"general"`, the cleanup function disconnects from the `"general"` room: + +```js +function ChatRoom({ roomId /* "general" */ }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); // Connects to the "general" room + connection.connect(); + return () => { + connection.disconnect(); // Disconnects from the "general" room + }; + // ... +``` + +Then React will run the Effect that you've provided during this render. This time, `roomId` is `"travel"` so it will **start synchronizing** to the `"travel"` chat room (until its cleanup function is eventually called too): + +```js +function ChatRoom({ roomId /* "travel" */ }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); // Connects to the "travel" room + connection.connect(); + // ... +``` + +Thanks to this, you're now connected to the same room that the user chose in the UI. Disaster averted! + +Every time after your component re-renders with a different `roomId`, your Effect will re-synchronize. For example, let's say the user changes `roomId` from `"travel"` to `"music"`. React will again **stop synchronizing** your Effect by calling its cleanup function (disconnecting you from the `"travel"` room). Then it will **start synchronizing** again by running its body with the new `roomId` prop (connecting you to the `"music"` room). + +Finally, when the user goes to a different screen, `ChatRoom` unmounts. Now there is no need to stay connected at all. React will **stop synchronizing** your Effect one last time and disconnect you from the `"music"` chat room. + +### Thinking from the Effect's perspective + +Let's recap everything that's happened from the `ChatRoom` component's perspective: + +1. `ChatRoom` mounted with `roomId` set to `"general"` +1. `ChatRoom` updated with `roomId` set to `"travel"` +1. `ChatRoom` updated with `roomId` set to `"music"` +1. `ChatRoom` unmounted + +During each of these points in the component's lifecycle, your Effect did different things: + +1. Your Effect connected to the `"general"` room +1. Your Effect disconnected from the `"general"` room and connected to the `"travel"` room +1. Your Effect disconnected from the `"travel"` room and connected to the `"music"` room +1. Your Effect disconnected from the `"music"` room + +Now let's think about what happened from the perspective of the Effect itself: + +```js +useEffect(() => { + // Your Effect connected to the room specified with roomId... + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + // ...until it disconnected + connection.disconnect(); + }; +}, [roomId]); +``` + +This code's structure might inspire you to see what happened as a sequence of non-overlapping time periods: + +1. Your Effect connected to the `"general"` room (until it disconnected) +1. Your Effect connected to the `"travel"` room (until it disconnected) +1. Your Effect connected to the `"music"` room (until it disconnected) + +Previously, you were thinking from the component's perspective. When you looked from the component's perspective, it was tempting to think of Effects as "callbacks" or "lifecycle events" that fire at a specific time like "after a render" or "before unmount". This way of thinking gets complicated very fast, so it's best to avoid. + +**Instead, always focus on a single start/stop cycle at a time. It shouldn't matter whether a component is mounting, updating, or unmounting. All you need to do is to describe how to start synchronization and how to stop it. If you do it well, your Effect will be resilient to being started and stopped as many times as it's needed.** + +This might remind you how you don't think whether a component is mounting or updating when you write the rendering logic that creates JSX. You describe what should be on the screen, and React [figures out the rest.](/learn/reacting-to-input-with-state) + +### How React verifies that your Effect can re-synchronize + +Here is a live example that you can play with. Press "Open chat" to mount the `ChatRoom` component: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + return <h1>Welcome to the {roomId} room!</h1>; +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [show, setShow] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <button on_click={() => setShow(!show)}> + {show ? "Close chat" : "Open chat"} + </button> + {show && <hr />} + {show && <ChatRoom roomId={roomId} />} + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +Notice that when the component mounts for the first time, you see three logs: + +1. `✅ Connecting to "general" room at https://localhost:1234...` _(development-only)_ +1. `❌ Disconnected from "general" room at https://localhost:1234.` _(development-only)_ +1. `✅ Connecting to "general" room at https://localhost:1234...` + +The first two logs are development-only. In development, React always remounts each component once. + +**React verifies that your Effect can re-synchronize by forcing it to do that immediately in development.** This might remind you of opening a door and closing it an extra time to check if the door lock works. React starts and stops your Effect one extra time in development to check [you've implemented its cleanup well.](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development) + +The main reason your Effect will re-synchronize in practice is if some data it uses has changed. In the sandbox above, change the selected chat room. Notice how, when the `roomId` changes, your Effect re-synchronizes. + +However, there are also more unusual cases in which re-synchronization is necessary. For example, try editing the `serverUrl` in the sandbox above while the chat is open. Notice how the Effect re-synchronizes in response to your edits to the code. In the future, React may add more features that rely on re-synchronization. + +### How React knows that it needs to re-synchronize the Effect + +You might be wondering how React knew that your Effect needed to re-synchronize after `roomId` changes. It's because _you told React_ that its code depends on `roomId` by including it in the [list of dependencies:](/learn/synchronizing-with-effects#step-2-specify-the-effect-dependencies) + +```js +function ChatRoom({ roomId }) { // The roomId prop may change over time + useEffect(() => { + const connection = createConnection(serverUrl, roomId); // This Effect reads roomId + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [roomId]); // So you tell React that this Effect "depends on" roomId + // ... +``` + +Here's how this works: + +1. You knew `roomId` is a prop, which means it can change over time. +2. You knew that your Effect reads `roomId` (so its logic depends on a value that may change later). +3. This is why you specified it as your Effect's dependency (so that it re-synchronizes when `roomId` changes). + +Every time after your component re-renders, React will look at the array of dependencies that you have passed. If any of the values in the array is different from the value at the same spot that you passed during the previous render, React will re-synchronize your Effect. + +For example, if you passed `["general"]` during the initial render, and later you passed `["travel"]` during the next render, React will compare `"general"` and `"travel"`. These are different values (compared with [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is)), so React will re-synchronize your Effect. On the other hand, if your component re-renders but `roomId` has not changed, your Effect will remain connected to the same room. + +### Each Effect represents a separate synchronization process + +Resist adding unrelated logic to your Effect only because this logic needs to run at the same time as an Effect you already wrote. For example, let's say you want to send an analytics event when the user visits the room. You already have an Effect that depends on `roomId`, so you might feel tempted to add the analytics call there: + +```js +function ChatRoom({ roomId }) { + useEffect(() => { + logVisit(roomId); + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [roomId]); + // ... +} +``` + +But imagine you later add another dependency to this Effect that needs to re-establish the connection. If this Effect re-synchronizes, it will also call `logVisit(roomId)` for the same room, which you did not intend. Logging the visit **is a separate process** from connecting. Write them as two separate Effects: + +```js +function ChatRoom({ roomId }) { + useEffect(() => { + logVisit(roomId); + }, [roomId]); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + // ... + }, [roomId]); + // ... +} +``` + +**Each Effect in your code should represent a separate and independent synchronization process.** + +In the above example, deleting one Effect wouldn’t break the other Effect's logic. This is a good indication that they synchronize different things, and so it made sense to split them up. On the other hand, if you split up a cohesive piece of logic into separate Effects, the code may look "cleaner" but will be [more difficult to maintain.](/learn/you-might-not-need-an-effect#chains-of-computations) This is why you should think whether the processes are same or separate, not whether the code looks cleaner. + +## Effects "react" to reactive values + +Your Effect reads two variables (`serverUrl` and `roomId`), but you only specified `roomId` as a dependency: + +```js +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [roomId]); + // ... +} +``` + +Why doesn't `serverUrl` need to be a dependency? + +This is because the `serverUrl` never changes due to a re-render. It's always the same no matter how many times the component re-renders and why. Since `serverUrl` never changes, it wouldn't make sense to specify it as a dependency. After all, dependencies only do something when they change over time! + +On the other hand, `roomId` may be different on a re-render. **Props, state, and other values declared inside the component are _reactive_ because they're calculated during rendering and participate in the React data flow.** + +If `serverUrl` was a state variable, it would be reactive. Reactive values must be included in dependencies: + +```js +function ChatRoom({ roomId }) { + // Props change over time + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); // State may change over time + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); // Your Effect reads props and state + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [roomId, serverUrl]); // So you tell React that this Effect "depends on" on props and state + // ... +} +``` + +By including `serverUrl` as a dependency, you ensure that the Effect re-synchronizes after it changes. + +Try changing the selected chat room or edit the server URL in this sandbox: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, serverUrl]); + + return ( + <> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +Whenever you change a reactive value like `roomId` or `serverUrl`, the Effect re-connects to the chat server. + +### What an Effect with empty dependencies means + +What happens if you move both `serverUrl` and `roomId` outside the component? + +```js +const serverUrl = "https://localhost:1234"; +const roomId = "general"; + +function ChatRoom() { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, []); // ✅ All dependencies declared + // ... +} +``` + +Now your Effect's code does not use _any_ reactive values, so its dependencies can be empty (`[]`). + +Thinking from the component's perspective, the empty `[]` dependency array means this Effect connects to the chat room only when the component mounts, and disconnects only when the component unmounts. (Keep in mind that React would still [re-synchronize it an extra time](#how-react-verifies-that-your-effect-can-re-synchronize) in development to stress-test your logic.) + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; +const roomId = "general"; + +function ChatRoom() { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, []); + return <h1>Welcome to the {roomId} room!</h1>; +} + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button on_click={() => setShow(!show)}> + {show ? "Close chat" : "Open chat"} + </button> + {show && <hr />} + {show && <ChatRoom />} + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +However, if you [think from the Effect's perspective,](#thinking-from-the-effects-perspective) you don't need to think about mounting and unmounting at all. What's important is you've specified what your Effect does to start and stop synchronizing. Today, it has no reactive dependencies. But if you ever want the user to change `roomId` or `serverUrl` over time (and they would become reactive), your Effect's code won't change. You will only need to add them to the dependencies. + +### All variables declared in the component body are reactive + +Props and state aren't the only reactive values. Values that you calculate from them are also reactive. If the props or state change, your component will re-render, and the values calculated from them will also change. This is why all variables from the component body used by the Effect should be in the Effect dependency list. + +Let's say that the user can pick a chat server in the dropdown, but they can also configure a default server in settings. Suppose you've already put the settings state in a [context](/learn/scaling-up-with-reducer-and-context) so you read the `settings` from that context. Now you calculate the `serverUrl` based on the selected server from props and the default server: + +```js +function ChatRoom({ roomId, selectedServerUrl }) { + // roomId is reactive + const settings = useContext(SettingsContext); // settings is reactive + const serverUrl = selectedServerUrl ?? settings.defaultServerUrl; // serverUrl is reactive + useEffect(() => { + const connection = createConnection(serverUrl, roomId); // Your Effect reads roomId and serverUrl + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [roomId, serverUrl]); // So it needs to re-synchronize when either of them changes! + // ... +} +``` + +In this example, `serverUrl` is not a prop or a state variable. It's a regular variable that you calculate during rendering. But it's calculated during rendering, so it can change due to a re-render. This is why it's reactive. + +**All values inside the component (including props, state, and variables in your component's body) are reactive. Any reactive value can change on a re-render, so you need to include reactive values as Effect's dependencies.** + +In other words, Effects "react" to all values from the component body. + +<DeepDive> + +#### Can global or mutable values be dependencies? + +Mutable values (including global variables) aren't reactive. + +**A mutable value like [`location.pathname`](https://developer.mozilla.org/en-US/docs/Web/API/Location/pathname) can't be a dependency.** It's mutable, so it can change at any time completely outside of the React rendering data flow. Changing it wouldn't trigger a re-render of your component. Therefore, even if you specified it in the dependencies, React _wouldn't know_ to re-synchronize the Effect when it changes. This also breaks the rules of React because reading mutable data during rendering (which is when you calculate the dependencies) breaks [purity of rendering.](/learn/keeping-components-pure) Instead, you should read and subscribe to an external mutable value with [`useSyncExternalStore`.](/learn/you-might-not-need-an-effect#subscribing-to-an-external-store) + +**A mutable value like [`ref.current`](/reference/react/useRef#reference) or things you read from it also can't be a dependency.** The ref object returned by `useRef` itself can be a dependency, but its `current` property is intentionally mutable. It lets you [keep track of something without triggering a re-render.](/learn/referencing-values-with-refs) But since changing it doesn't trigger a re-render, it's not a reactive value, and React won't know to re-run your Effect when it changes. + +As you'll learn below on this page, a linter will check for these issues automatically. + +</DeepDive> + +### React verifies that you specified every reactive value as a dependency + +If your linter is [configured for React,](/learn/editor-setup#linting) it will check that every reactive value used by your Effect's code is declared as its dependency. For example, this is a lint error because both `roomId` and `serverUrl` are reactive: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +function ChatRoom({ roomId }) { + // roomId is reactive + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); // serverUrl is reactive + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, []); // <-- Something's wrong here! + + return ( + <> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +This may look like a React error, but really React is pointing out a bug in your code. Both `roomId` and `serverUrl` may change over time, but you're forgetting to re-synchronize your Effect when they change. You will remain connected to the initial `roomId` and `serverUrl` even after the user picks different values in the UI. + +To fix the bug, follow the linter's suggestion to specify `roomId` and `serverUrl` as dependencies of your Effect: + +```js +function ChatRoom({ roomId }) { + // roomId is reactive + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); // serverUrl is reactive + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [serverUrl, roomId]); // ✅ All dependencies declared + // ... +} +``` + +Try this fix in the sandbox above. Verify that the linter error is gone, and the chat re-connects when needed. + +<Note> + +In some cases, React _knows_ that a value never changes even though it's declared inside the component. For example, the [`set` function](/reference/react/useState#setstate) returned from `useState` and the ref object returned by [`useRef`](/reference/react/useRef) are _stable_--they are guaranteed to not change on a re-render. Stable values aren't reactive, so you may omit them from the list. Including them is allowed: they won't change, so it doesn't matter. + +</Note> + +### What to do when you don't want to re-synchronize + +In the previous example, you've fixed the lint error by listing `roomId` and `serverUrl` as dependencies. + +**However, you could instead "prove" to the linter that these values aren't reactive values,** i.e. that they _can't_ change as a result of a re-render. For example, if `serverUrl` and `roomId` don't depend on rendering and always have the same values, you can move them outside the component. Now they don't need to be dependencies: + +```js +const serverUrl = "https://localhost:1234"; // serverUrl is not reactive +const roomId = "general"; // roomId is not reactive + +function ChatRoom() { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, []); // ✅ All dependencies declared + // ... +} +``` + +You can also move them _inside the Effect._ They aren't calculated during rendering, so they're not reactive: + +```js +function ChatRoom() { + useEffect(() => { + const serverUrl = "https://localhost:1234"; // serverUrl is not reactive + const roomId = "general"; // roomId is not reactive + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, []); // ✅ All dependencies declared + // ... +} +``` + +**Effects are reactive blocks of code.** They re-synchronize when the values you read inside of them change. Unlike event handlers, which only run once per interaction, Effects run whenever synchronization is necessary. + +**You can't "choose" your dependencies.** Your dependencies must include every [reactive value](#all-variables-declared-in-the-component-body-are-reactive) you read in the Effect. The linter enforces this. Sometimes this may lead to problems like infinite loops and to your Effect re-synchronizing too often. Don't fix these problems by suppressing the linter! Here's what to try instead: + +- **Check that your Effect represents an independent synchronization process.** If your Effect doesn't synchronize anything, [it might be unnecessary.](/learn/you-might-not-need-an-effect) If it synchronizes several independent things, [split it up.](#each-effect-represents-a-separate-synchronization-process) + +- **If you want to read the latest value of props or state without "reacting" to it and re-synchronizing the Effect,** you can split your Effect into a reactive part (which you'll keep in the Effect) and a non-reactive part (which you'll extract into something called an _Effect Event_). [Read about separating Events from Effects.](/learn/separating-events-from-effects) + +- **Avoid relying on objects and functions as dependencies.** If you create objects and functions during rendering and then read them from an Effect, they will be different on every render. This will cause your Effect to re-synchronize every time. [Read more about removing unnecessary dependencies from Effects.](/learn/removing-effect-dependencies) + +<Pitfall> + +The linter is your friend, but its powers are limited. The linter only knows when the dependencies are _wrong_. It doesn't know _the best_ way to solve each case. If the linter suggests a dependency, but adding it causes a loop, it doesn't mean the linter should be ignored. You need to change the code inside (or outside) the Effect so that that value isn't reactive and doesn't _need_ to be a dependency. + +If you have an existing codebase, you might have some Effects that suppress the linter like this: + +```js +useEffect(() => { + // ... + // 🔴 Avoid suppressing the linter like this: + // eslint-ignore-next-line react-hooks/exhaustive-deps +}, []); +``` + +On the [next](/learn/separating-events-from-effects) [pages](/learn/removing-effect-dependencies), you'll learn how to fix this code without breaking the rules. It's always worth fixing! + +</Pitfall> + +<Recap> + +- Components can mount, update, and unmount. +- Each Effect has a separate lifecycle from the surrounding component. +- Each Effect describes a separate synchronization process that can _start_ and _stop_. +- When you write and read Effects, think from each individual Effect's perspective (how to start and stop synchronization) rather than from the component's perspective (how it mounts, updates, or unmounts). +- Values declared inside the component body are "reactive". +- Reactive values should re-synchronize the Effect because they can change over time. +- The linter verifies that all reactive values used inside the Effect are specified as dependencies. +- All errors flagged by the linter are legitimate. There's always a way to fix the code to not break the rules. + +</Recap> + +<Challenges> + +#### Fix reconnecting on every keystroke + +In this example, the `ChatRoom` component connects to the chat room when the component mounts, disconnects when it unmounts, and reconnects when you select a different chat room. This behavior is correct, so you need to keep it working. + +However, there is a problem. Whenever you type into the message box input at the bottom, `ChatRoom` _also_ reconnects to the chat. (You can notice this by clearing the console and typing into the input.) Fix the issue so that this doesn't happen. + +<Hint> + +You might need to add a dependency array for this Effect. What dependencies should be there? + +</Hint> + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(""); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }); + + return ( + <> + <h1>Welcome to the {roomId} room!</h1> + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +<Solution> + +This Effect didn't have a dependency array at all, so it re-synchronized after every re-render. First, add a dependency array. Then, make sure that every reactive value used by the Effect is specified in the array. For example, `roomId` is reactive (because it's a prop), so it should be included in the array. This ensures that when the user selects a different room, the chat reconnects. On the other hand, `serverUrl` is defined outside the component. This is why it doesn't need to be in the array. + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(""); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + + return ( + <> + <h1>Welcome to the {roomId} room!</h1> + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +</Solution> + +#### Switch synchronization on and off + +In this example, an Effect subscribes to the window [`pointermove`](https://developer.mozilla.org/en-US/docs/Web/API/Element/pointermove_event) event to move a pink dot on the screen. Try hovering over the preview area (or touching the screen if you're on a mobile device), and see how the pink dot follows your movement. + +There is also a checkbox. Ticking the checkbox toggles the `canMove` state variable, but this state variable is not used anywhere in the code. Your task is to change the code so that when `canMove` is `false` (the checkbox is ticked off), the dot should stop moving. After you toggle the checkbox back on (and set `canMove` to `true`), the box should follow the movement again. In other words, whether the dot can move or not should stay synchronized to whether the checkbox is checked. + +<Hint> + +You can't declare an Effect conditionally. However, the code inside the Effect can use conditions! + +</Hint> + +```js +import { useState, useEffect } from "react"; + +export default function App() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + const [canMove, setCanMove] = useState(true); + + useEffect(() => { + function handleMove(e) { + setPosition({ x: e.clientX, y: e.clientY }); + } + window.addEventListener("pointermove", handleMove); + return () => window.removeEventListener("pointermove", handleMove); + }, []); + + return ( + <> + <label> + <input + type="checkbox" + checked={canMove} + onChange={(e) => setCanMove(e.target.checked)} + /> + The dot is allowed to move + </label> + <hr /> + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity: 0.6, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + </> + ); +} +``` + +```css +body { + height: 200px; +} +``` + +<Solution> + +One solution is to wrap the `setPosition` call into an `if (canMove) { ... }` condition: + +```js +import { useState, useEffect } from "react"; + +export default function App() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + const [canMove, setCanMove] = useState(true); + + useEffect(() => { + function handleMove(e) { + if (canMove) { + setPosition({ x: e.clientX, y: e.clientY }); + } + } + window.addEventListener("pointermove", handleMove); + return () => window.removeEventListener("pointermove", handleMove); + }, [canMove]); + + return ( + <> + <label> + <input + type="checkbox" + checked={canMove} + onChange={(e) => setCanMove(e.target.checked)} + /> + The dot is allowed to move + </label> + <hr /> + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity: 0.6, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + </> + ); +} +``` + +```css +body { + height: 200px; +} +``` + +Alternatively, you could wrap the _event subscription_ logic into an `if (canMove) { ... }` condition: + +```js +import { useState, useEffect } from "react"; + +export default function App() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + const [canMove, setCanMove] = useState(true); + + useEffect(() => { + function handleMove(e) { + setPosition({ x: e.clientX, y: e.clientY }); + } + if (canMove) { + window.addEventListener("pointermove", handleMove); + return () => window.removeEventListener("pointermove", handleMove); + } + }, [canMove]); + + return ( + <> + <label> + <input + type="checkbox" + checked={canMove} + onChange={(e) => setCanMove(e.target.checked)} + /> + The dot is allowed to move + </label> + <hr /> + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity: 0.6, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + </> + ); +} +``` + +```css +body { + height: 200px; +} +``` + +In both of these cases, `canMove` is a reactive variable that you read inside the Effect. This is why it must be specified in the list of Effect dependencies. This ensures that the Effect re-synchronizes after every change to its value. + +</Solution> + +#### Investigate a stale value bug + +In this example, the pink dot should move when the checkbox is on, and should stop moving when the checkbox is off. The logic for this has already been implemented: the `handleMove` event handler checks the `canMove` state variable. + +However, for some reason, the `canMove` state variable inside `handleMove` appears to be "stale": it's always `true`, even after you tick off the checkbox. How is this possible? Find the mistake in the code and fix it. + +<Hint> + +If you see a linter rule being suppressed, remove the suppression! That's where the mistakes usually are. + +</Hint> + +```js +import { useState, useEffect } from "react"; + +export default function App() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + const [canMove, setCanMove] = useState(true); + + function handleMove(e) { + if (canMove) { + setPosition({ x: e.clientX, y: e.clientY }); + } + } + + useEffect(() => { + window.addEventListener("pointermove", handleMove); + return () => window.removeEventListener("pointermove", handleMove); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + <> + <label> + <input + type="checkbox" + checked={canMove} + onChange={(e) => setCanMove(e.target.checked)} + /> + The dot is allowed to move + </label> + <hr /> + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity: 0.6, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + </> + ); +} +``` + +```css +body { + height: 200px; +} +``` + +<Solution> + +The problem with the original code was suppressing the dependency linter. If you remove the suppression, you'll see that this Effect depends on the `handleMove` function. This makes sense: `handleMove` is declared inside the component body, which makes it a reactive value. Every reactive value must be specified as a dependency, or it can potentially get stale over time! + +The author of the original code has "lied" to React by saying that the Effect does not depend (`[]`) on any reactive values. This is why React did not re-synchronize the Effect after `canMove` has changed (and `handleMove` with it). Because React did not re-synchronize the Effect, the `handleMove` attached as a listener is the `handleMove` function created during the initial render. During the initial render, `canMove` was `true`, which is why `handleMove` from the initial render will forever see that value. + +**If you never suppress the linter, you will never see problems with stale values.** There are a few different ways to solve this bug, but you should always start by removing the linter suppression. Then change the code to fix the lint error. + +You can change the Effect dependencies to `[handleMove]`, but since it's going to be a newly defined function for every render, you might as well remove dependencies array altogether. Then the Effect _will_ re-synchronize after every re-render: + +```js +import { useState, useEffect } from "react"; + +export default function App() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + const [canMove, setCanMove] = useState(true); + + function handleMove(e) { + if (canMove) { + setPosition({ x: e.clientX, y: e.clientY }); + } + } + + useEffect(() => { + window.addEventListener("pointermove", handleMove); + return () => window.removeEventListener("pointermove", handleMove); + }); + + return ( + <> + <label> + <input + type="checkbox" + checked={canMove} + onChange={(e) => setCanMove(e.target.checked)} + /> + The dot is allowed to move + </label> + <hr /> + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity: 0.6, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + </> + ); +} +``` + +```css +body { + height: 200px; +} +``` + +This solution works, but it's not ideal. If you put `console.log('Resubscribing')` inside the Effect, you'll notice that it resubscribes after every re-render. Resubscribing is fast, but it would still be nice to avoid doing it so often. + +A better fix would be to move the `handleMove` function _inside_ the Effect. Then `handleMove` won't be a reactive value, and so your Effect won't depend on a function. Instead, it will need to depend on `canMove` which your code now reads from inside the Effect. This matches the behavior you wanted, since your Effect will now stay synchronized with the value of `canMove`: + +```js +import { useState, useEffect } from "react"; + +export default function App() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + const [canMove, setCanMove] = useState(true); + + useEffect(() => { + function handleMove(e) { + if (canMove) { + setPosition({ x: e.clientX, y: e.clientY }); + } + } + + window.addEventListener("pointermove", handleMove); + return () => window.removeEventListener("pointermove", handleMove); + }, [canMove]); + + return ( + <> + <label> + <input + type="checkbox" + checked={canMove} + onChange={(e) => setCanMove(e.target.checked)} + /> + The dot is allowed to move + </label> + <hr /> + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity: 0.6, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + </> + ); +} +``` + +```css +body { + height: 200px; +} +``` + +Try adding `console.log('Resubscribing')` inside the Effect body and notice that now it only resubscribes when you toggle the checkbox (`canMove` changes) or edit the code. This makes it better than the previous approach that always resubscribed. + +You'll learn a more general approach to this type of problem in [Separating Events from Effects.](/learn/separating-events-from-effects) + +</Solution> + +#### Fix a connection switch + +In this example, the chat service in `chat.js` exposes two different APIs: `createEncryptedConnection` and `createUnencryptedConnection`. The root `App` component lets the user choose whether to use encryption or not, and then passes down the corresponding API method to the child `ChatRoom` component as the `createConnection` prop. + +Notice that initially, the console logs say the connection is not encrypted. Try toggling the checkbox on: nothing will happen. However, if you change the selected room after that, then the chat will reconnect _and_ enable encryption (as you'll see from the console messages). This is a bug. Fix the bug so that toggling the checkbox _also_ causes the chat to reconnect. + +<Hint> + +Suppressing the linter is always suspicious. Could this be a bug? + +</Hint> + +```js +import { useState } from "react"; +import ChatRoom from "./ChatRoom.js"; +import { + createEncryptedConnection, + createUnencryptedConnection, +} from "./chat.js"; + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [isEncrypted, setIsEncrypted] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <label> + <input + type="checkbox" + checked={isEncrypted} + onChange={(e) => setIsEncrypted(e.target.checked)} + /> + Enable encryption + </label> + <hr /> + <ChatRoom + roomId={roomId} + createConnection={ + isEncrypted + ? createEncryptedConnection + : createUnencryptedConnection + } + /> + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export default function ChatRoom({ roomId, createConnection }) { + useEffect(() => { + const connection = createConnection(roomId); + connection.connect(); + return () => connection.disconnect(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [roomId]); + + return <h1>Welcome to the {roomId} room!</h1>; +} +``` + +```js +export function createEncryptedConnection(roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log('✅ 🔐 Connecting to "' + roomId + "... (encrypted)"); + }, + disconnect() { + console.log( + '❌ 🔐 Disconnected from "' + roomId + '" room (encrypted)' + ); + }, + }; +} + +export function createUnencryptedConnection(roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log('✅ Connecting to "' + roomId + "... (unencrypted)"); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room (unencrypted)' + ); + }, + }; +} +``` + +```css +label { + display: block; + margin-bottom: 10px; +} +``` + +<Solution> + +If you remove the linter suppression, you will see a lint error. The problem is that `createConnection` is a prop, so it's a reactive value. It can change over time! (And indeed, it should--when the user ticks the checkbox, the parent component passes a different value of the `createConnection` prop.) This is why it should be a dependency. Include it in the list to fix the bug: + +```js +import { useState } from "react"; +import ChatRoom from "./ChatRoom.js"; +import { + createEncryptedConnection, + createUnencryptedConnection, +} from "./chat.js"; + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [isEncrypted, setIsEncrypted] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <label> + <input + type="checkbox" + checked={isEncrypted} + onChange={(e) => setIsEncrypted(e.target.checked)} + /> + Enable encryption + </label> + <hr /> + <ChatRoom + roomId={roomId} + createConnection={ + isEncrypted + ? createEncryptedConnection + : createUnencryptedConnection + } + /> + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export default function ChatRoom({ roomId, createConnection }) { + useEffect(() => { + const connection = createConnection(roomId); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, createConnection]); + + return <h1>Welcome to the {roomId} room!</h1>; +} +``` + +```js +export function createEncryptedConnection(roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log('✅ 🔐 Connecting to "' + roomId + "... (encrypted)"); + }, + disconnect() { + console.log( + '❌ 🔐 Disconnected from "' + roomId + '" room (encrypted)' + ); + }, + }; +} + +export function createUnencryptedConnection(roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log('✅ Connecting to "' + roomId + "... (unencrypted)"); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room (unencrypted)' + ); + }, + }; +} +``` + +```css +label { + display: block; + margin-bottom: 10px; +} +``` + +It is correct that `createConnection` is a dependency. However, this code is a bit fragile because someone could edit the `App` component to pass an inline function as the value of this prop. In that case, its value would be different every time the `App` component re-renders, so the Effect might re-synchronize too often. To avoid this, you can pass `isEncrypted` down instead: + +```js +import { useState } from "react"; +import ChatRoom from "./ChatRoom.js"; + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [isEncrypted, setIsEncrypted] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <label> + <input + type="checkbox" + checked={isEncrypted} + onChange={(e) => setIsEncrypted(e.target.checked)} + /> + Enable encryption + </label> + <hr /> + <ChatRoom roomId={roomId} isEncrypted={isEncrypted} /> + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; +import { + createEncryptedConnection, + createUnencryptedConnection, +} from "./chat.js"; + +export default function ChatRoom({ roomId, isEncrypted }) { + useEffect(() => { + const createConnection = isEncrypted + ? createEncryptedConnection + : createUnencryptedConnection; + const connection = createConnection(roomId); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, isEncrypted]); + + return <h1>Welcome to the {roomId} room!</h1>; +} +``` + +```js +export function createEncryptedConnection(roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log('✅ 🔐 Connecting to "' + roomId + "... (encrypted)"); + }, + disconnect() { + console.log( + '❌ 🔐 Disconnected from "' + roomId + '" room (encrypted)' + ); + }, + }; +} + +export function createUnencryptedConnection(roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log('✅ Connecting to "' + roomId + "... (unencrypted)"); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room (unencrypted)' + ); + }, + }; +} +``` + +```css +label { + display: block; + margin-bottom: 10px; +} +``` + +In this version, the `App` component passes a boolean prop instead of a function. Inside the Effect, you decide which function to use. Since both `createEncryptedConnection` and `createUnencryptedConnection` are declared outside the component, they aren't reactive, and don't need to be dependencies. You'll learn more about this in [Removing Effect Dependencies.](/learn/removing-effect-dependencies) + +</Solution> + +#### Populate a chain of select boxes + +In this example, there are two select boxes. One select box lets the user pick a planet. Another select box lets the user pick a place _on that planet._ The second box doesn't work yet. Your task is to make it show the places on the chosen planet. + +Look at how the first select box works. It populates the `planetList` state with the result from the `"/planets"` API call. The currently selected planet's ID is kept in the `planetId` state variable. You need to find where to add some additional code so that the `placeList` state variable is populated with the result of the `"/planets/" + planetId + "/places"` API call. + +If you implement this right, selecting a planet should populate the place list. Changing a planet should change the place list. + +<Hint> + +If you have two independent synchronization processes, you need to write two separate Effects. + +</Hint> + +```js +import { useState, useEffect } from "react"; +import { fetchData } from "./api.js"; + +export default function Page() { + const [planetList, setPlanetList] = useState([]); + const [planetId, setPlanetId] = useState(""); + + const [placeList, setPlaceList] = useState([]); + const [placeId, setPlaceId] = useState(""); + + useEffect(() => { + let ignore = false; + fetchData("/planets").then((result) => { + if (!ignore) { + console.log("Fetched a list of planets."); + setPlanetList(result); + setPlanetId(result[0].id); // Select the first planet + } + }); + return () => { + ignore = true; + }; + }, []); + + return ( + <> + <label> + Pick a planet:{" "} + <select + value={planetId} + onChange={(e) => { + setPlanetId(e.target.value); + }} + > + {planetList.map((planet) => ( + <option key={planet.id} value={planet.id}> + {planet.name} + </option> + ))} + </select> + </label> + <label> + Pick a place:{" "} + <select + value={placeId} + onChange={(e) => { + setPlaceId(e.target.value); + }} + > + {placeList.map((place) => ( + <option key={place.id} value={place.id}> + {place.name} + </option> + ))} + </select> + </label> + <hr /> + <p> + You are going to: {placeId || "???"} on {planetId || "???"}{" "} + </p> + </> + ); +} +``` + +```js +export function fetchData(url) { + if (url === "/planets") { + return fetchPlanets(); + } else if (url.startsWith("/planets/")) { + const match = url.match(/^\/planets\/([\w-]+)\/places(\/)?$/); + if (!match || !match[1] || !match[1].length) { + throw Error( + 'Expected URL like "/planets/earth/places". Received: "' + + url + + '".' + ); + } + return fetchPlaces(match[1]); + } else + throw Error( + 'Expected URL like "/planets" or "/planets/earth/places". Received: "' + + url + + '".' + ); +} + +async function fetchPlanets() { + return new Promise((resolve) => { + setTimeout(() => { + resolve([ + { + id: "earth", + name: "Earth", + }, + { + id: "venus", + name: "Venus", + }, + { + id: "mars", + name: "Mars", + }, + ]); + }, 1000); + }); +} + +async function fetchPlaces(planetId) { + if (typeof planetId !== "string") { + throw Error( + "fetchPlaces(planetId) expects a string argument. " + + "Instead received: " + + planetId + + "." + ); + } + return new Promise((resolve) => { + setTimeout(() => { + if (planetId === "earth") { + resolve([ + { + id: "laos", + name: "Laos", + }, + { + id: "spain", + name: "Spain", + }, + { + id: "vietnam", + name: "Vietnam", + }, + ]); + } else if (planetId === "venus") { + resolve([ + { + id: "aurelia", + name: "Aurelia", + }, + { + id: "diana-chasma", + name: "Diana Chasma", + }, + { + id: "kumsong-vallis", + name: "Kŭmsŏng Vallis", + }, + ]); + } else if (planetId === "mars") { + resolve([ + { + id: "aluminum-city", + name: "Aluminum City", + }, + { + id: "new-new-york", + name: "New New York", + }, + { + id: "vishniac", + name: "Vishniac", + }, + ]); + } else throw Error("Unknown planet ID: " + planetId); + }, 1000); + }); +} +``` + +```css +label { + display: block; + margin-bottom: 10px; +} +``` + +<Solution> + +There are two independent synchronization processes: + +- The first select box is synchronized to the remote list of planets. +- The second select box is synchronized to the remote list of places for the current `planetId`. + +This is why it makes sense to describe them as two separate Effects. Here's an example of how you could do this: + +```js +import { useState, useEffect } from "react"; +import { fetchData } from "./api.js"; + +export default function Page() { + const [planetList, setPlanetList] = useState([]); + const [planetId, setPlanetId] = useState(""); + + const [placeList, setPlaceList] = useState([]); + const [placeId, setPlaceId] = useState(""); + + useEffect(() => { + let ignore = false; + fetchData("/planets").then((result) => { + if (!ignore) { + console.log("Fetched a list of planets."); + setPlanetList(result); + setPlanetId(result[0].id); // Select the first planet + } + }); + return () => { + ignore = true; + }; + }, []); + + useEffect(() => { + if (planetId === "") { + // Nothing is selected in the first box yet + return; + } + + let ignore = false; + fetchData("/planets/" + planetId + "/places").then((result) => { + if (!ignore) { + console.log('Fetched a list of places on "' + planetId + '".'); + setPlaceList(result); + setPlaceId(result[0].id); // Select the first place + } + }); + return () => { + ignore = true; + }; + }, [planetId]); + + return ( + <> + <label> + Pick a planet:{" "} + <select + value={planetId} + onChange={(e) => { + setPlanetId(e.target.value); + }} + > + {planetList.map((planet) => ( + <option key={planet.id} value={planet.id}> + {planet.name} + </option> + ))} + </select> + </label> + <label> + Pick a place:{" "} + <select + value={placeId} + onChange={(e) => { + setPlaceId(e.target.value); + }} + > + {placeList.map((place) => ( + <option key={place.id} value={place.id}> + {place.name} + </option> + ))} + </select> + </label> + <hr /> + <p> + You are going to: {placeId || "???"} on {planetId || "???"}{" "} + </p> + </> + ); +} +``` + +```js +export function fetchData(url) { + if (url === "/planets") { + return fetchPlanets(); + } else if (url.startsWith("/planets/")) { + const match = url.match(/^\/planets\/([\w-]+)\/places(\/)?$/); + if (!match || !match[1] || !match[1].length) { + throw Error( + 'Expected URL like "/planets/earth/places". Received: "' + + url + + '".' + ); + } + return fetchPlaces(match[1]); + } else + throw Error( + 'Expected URL like "/planets" or "/planets/earth/places". Received: "' + + url + + '".' + ); +} + +async function fetchPlanets() { + return new Promise((resolve) => { + setTimeout(() => { + resolve([ + { + id: "earth", + name: "Earth", + }, + { + id: "venus", + name: "Venus", + }, + { + id: "mars", + name: "Mars", + }, + ]); + }, 1000); + }); +} + +async function fetchPlaces(planetId) { + if (typeof planetId !== "string") { + throw Error( + "fetchPlaces(planetId) expects a string argument. " + + "Instead received: " + + planetId + + "." + ); + } + return new Promise((resolve) => { + setTimeout(() => { + if (planetId === "earth") { + resolve([ + { + id: "laos", + name: "Laos", + }, + { + id: "spain", + name: "Spain", + }, + { + id: "vietnam", + name: "Vietnam", + }, + ]); + } else if (planetId === "venus") { + resolve([ + { + id: "aurelia", + name: "Aurelia", + }, + { + id: "diana-chasma", + name: "Diana Chasma", + }, + { + id: "kumsong-vallis", + name: "Kŭmsŏng Vallis", + }, + ]); + } else if (planetId === "mars") { + resolve([ + { + id: "aluminum-city", + name: "Aluminum City", + }, + { + id: "new-new-york", + name: "New New York", + }, + { + id: "vishniac", + name: "Vishniac", + }, + ]); + } else throw Error("Unknown planet ID: " + planetId); + }, 1000); + }); +} +``` + +```css +label { + display: block; + margin-bottom: 10px; +} +``` + +This code is a bit repetitive. However, that's not a good reason to combine it into a single Effect! If you did this, you'd have to combine both Effect's dependencies into one list, and then changing the planet would refetch the list of all planets. Effects are not a tool for code reuse. + +Instead, to reduce repetition, you can extract some logic into a custom Hook like `useSelectOptions` below: + +```js +import { useState } from "react"; +import { useSelectOptions } from "./useSelectOptions.js"; + +export default function Page() { + const [planetList, planetId, setPlanetId] = useSelectOptions("/planets"); + + const [placeList, placeId, setPlaceId] = useSelectOptions( + planetId ? `/planets/${planetId}/places` : null + ); + + return ( + <> + <label> + Pick a planet:{" "} + <select + value={planetId} + onChange={(e) => { + setPlanetId(e.target.value); + }} + > + {planetList?.map((planet) => ( + <option key={planet.id} value={planet.id}> + {planet.name} + </option> + ))} + </select> + </label> + <label> + Pick a place:{" "} + <select + value={placeId} + onChange={(e) => { + setPlaceId(e.target.value); + }} + > + {placeList?.map((place) => ( + <option key={place.id} value={place.id}> + {place.name} + </option> + ))} + </select> + </label> + <hr /> + <p> + You are going to: {placeId || "..."} on {planetId || "..."}{" "} + </p> + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; +import { fetchData } from "./api.js"; + +export function useSelectOptions(url) { + const [list, setList] = useState(null); + const [selectedId, setSelectedId] = useState(""); + useEffect(() => { + if (url === null) { + return; + } + + let ignore = false; + fetchData(url).then((result) => { + if (!ignore) { + setList(result); + setSelectedId(result[0].id); + } + }); + return () => { + ignore = true; + }; + }, [url]); + return [list, selectedId, setSelectedId]; +} +``` + +```js +export function fetchData(url) { + if (url === "/planets") { + return fetchPlanets(); + } else if (url.startsWith("/planets/")) { + const match = url.match(/^\/planets\/([\w-]+)\/places(\/)?$/); + if (!match || !match[1] || !match[1].length) { + throw Error( + 'Expected URL like "/planets/earth/places". Received: "' + + url + + '".' + ); + } + return fetchPlaces(match[1]); + } else + throw Error( + 'Expected URL like "/planets" or "/planets/earth/places". Received: "' + + url + + '".' + ); +} + +async function fetchPlanets() { + return new Promise((resolve) => { + setTimeout(() => { + resolve([ + { + id: "earth", + name: "Earth", + }, + { + id: "venus", + name: "Venus", + }, + { + id: "mars", + name: "Mars", + }, + ]); + }, 1000); + }); +} + +async function fetchPlaces(planetId) { + if (typeof planetId !== "string") { + throw Error( + "fetchPlaces(planetId) expects a string argument. " + + "Instead received: " + + planetId + + "." + ); + } + return new Promise((resolve) => { + setTimeout(() => { + if (planetId === "earth") { + resolve([ + { + id: "laos", + name: "Laos", + }, + { + id: "spain", + name: "Spain", + }, + { + id: "vietnam", + name: "Vietnam", + }, + ]); + } else if (planetId === "venus") { + resolve([ + { + id: "aurelia", + name: "Aurelia", + }, + { + id: "diana-chasma", + name: "Diana Chasma", + }, + { + id: "kumsong-vallis", + name: "Kŭmsŏng Vallis", + }, + ]); + } else if (planetId === "mars") { + resolve([ + { + id: "aluminum-city", + name: "Aluminum City", + }, + { + id: "new-new-york", + name: "New New York", + }, + { + id: "vishniac", + name: "Vishniac", + }, + ]); + } else throw Error("Unknown planet ID: " + planetId); + }, 1000); + }); +} +``` + +```css +label { + display: block; + margin-bottom: 10px; +} +``` + +Check the `useSelectOptions.js` tab in the sandbox to see how it works. Ideally, most Effects in your application should eventually be replaced by custom Hooks, whether written by you or by the community. Custom Hooks hide the synchronization logic, so the calling component doesn't know about the Effect. As you keep working on your app, you'll develop a palette of Hooks to choose from, and eventually you won't need to write Effects in your components very often. + +</Solution> + +</Challenges> diff --git a/docs/src/learn/manipulating-the-dom-with-refs.md b/docs/src/learn/manipulating-the-dom-with-refs.md new file mode 100644 index 000000000..5fcff0f42 --- /dev/null +++ b/docs/src/learn/manipulating-the-dom-with-refs.md @@ -0,0 +1,1078 @@ +--- +title: "Manipulating the DOM with Refs 🚧" +--- + +## Overview + +<p class="intro" markdown> + +React automatically updates the [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model/Introduction) to match your render output, so your components won't often need to manipulate it. However, sometimes you might need access to the DOM elements managed by React--for example, to focus a node, scroll to it, or measure its size and position. There is no built-in way to do those things in React, so you will need a _ref_ to the DOM node. + +</p> + +!!! summary "You Will Learn" + + - How to access a DOM node managed by React with the `ref` attribute + - How the `ref` JSX attribute relates to the `useRef` Hook + - How to access another component's DOM node + - In which cases it's safe to modify the DOM managed by React + +## Getting a ref to the node + +To access a DOM node managed by React, first, import the `useRef` Hook: + +```js +import { useRef } from "react"; +``` + +Then, use it to declare a ref inside your component: + +```js +const myRef = useRef(null); +``` + +Finally, pass your ref as the `ref` attribute to the JSX tag for which you want to get the DOM node: + +```js +<div ref={myRef}> +``` + +The `useRef` Hook returns an object with a single property called `current`. Initially, `myRef.current` will be `null`. When React creates a DOM node for this `<div>`, React will put a reference to this node into `myRef.current`. You can then access this DOM node from your [event handlers](/learn/responding-to-events) and use the built-in [browser APIs](https://developer.mozilla.org/docs/Web/API/Element) defined on it. + +```js +// You can use any browser APIs, for example: +myRef.current.scrollIntoView(); +``` + +### Example: Focusing a text input + +In this example, clicking the button will focus the input: + +```js +import { useRef } from "react"; + +export default function Form() { + const inputRef = useRef(null); + + function handleClick() { + inputRef.current.focus(); + } + + return ( + <> + <input ref={inputRef} /> + <button on_click={handleClick}>Focus the input</button> + </> + ); +} +``` + +To implement this: + +1. Declare `inputRef` with the `useRef` Hook. +2. Pass it as `<input ref={inputRef}>`. This tells React to **put this `<input>`'s DOM node into `inputRef.current`.** +3. In the `handleClick` function, read the input DOM node from `inputRef.current` and call [`focus()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus) on it with `inputRef.current.focus()`. +4. Pass the `handleClick` event handler to `<button>` with `on_click`. + +While DOM manipulation is the most common use case for refs, the `useRef` Hook can be used for storing other things outside React, like timer IDs. Similarly to state, refs remain between renders. Refs are like state variables that don't trigger re-renders when you set them. Read about refs in [Referencing Values with Refs.](/learn/referencing-values-with-refs) + +### Example: Scrolling to an element + +You can have more than a single ref in a component. In this example, there is a carousel of three images. Each button centers an image by calling the browser [`scrollIntoView()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView) method on the corresponding DOM node: + +```js +import { useRef } from "react"; + +export default function CatFriends() { + const firstCatRef = useRef(null); + const secondCatRef = useRef(null); + const thirdCatRef = useRef(null); + + function handleScrollToFirstCat() { + firstCatRef.current.scrollIntoView({ + behavior: "smooth", + block: "nearest", + inline: "center", + }); + } + + function handleScrollToSecondCat() { + secondCatRef.current.scrollIntoView({ + behavior: "smooth", + block: "nearest", + inline: "center", + }); + } + + function handleScrollToThirdCat() { + thirdCatRef.current.scrollIntoView({ + behavior: "smooth", + block: "nearest", + inline: "center", + }); + } + + return ( + <> + <nav> + <button on_click={handleScrollToFirstCat}>Tom</button> + <button on_click={handleScrollToSecondCat}>Maru</button> + <button on_click={handleScrollToThirdCat}>Jellylorum</button> + </nav> + <div> + <ul> + <li> + <img + src="https://placekitten.com/g/200/200" + alt="Tom" + ref={firstCatRef} + /> + </li> + <li> + <img + src="https://placekitten.com/g/300/200" + alt="Maru" + ref={secondCatRef} + /> + </li> + <li> + <img + src="https://placekitten.com/g/250/200" + alt="Jellylorum" + ref={thirdCatRef} + /> + </li> + </ul> + </div> + </> + ); +} +``` + +```css +div { + width: 100%; + overflow: hidden; +} + +nav { + text-align: center; +} + +button { + margin: 0.25rem; +} + +ul, +li { + list-style: none; + white-space: nowrap; +} + +li { + display: inline; + padding: 0.5rem; +} +``` + +<DeepDive> + +#### How to manage a list of refs using a ref callback + +In the above examples, there is a predefined number of refs. However, sometimes you might need a ref to each item in the list, and you don't know how many you will have. Something like this **wouldn't work**: + +```js +<ul> + {items.map((item) => { + // Doesn't work! + const ref = useRef(null); + return <li ref={ref} />; + })} +</ul> +``` + +This is because **Hooks must only be called at the top-level of your component.** You can't call `useRef` in a loop, in a condition, or inside a `map()` call. + +One possible way around this is to get a single ref to their parent element, and then use DOM manipulation methods like [`querySelectorAll`](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll) to "find" the individual child nodes from it. However, this is brittle and can break if your DOM structure changes. + +Another solution is to **pass a function to the `ref` attribute.** This is called a [`ref` callback.](/reference/react-dom/components/common#ref-callback) React will call your ref callback with the DOM node when it's time to set the ref, and with `null` when it's time to clear it. This lets you maintain your own array or a [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map), and access any ref by its index or some kind of ID. + +This example shows how you can use this approach to scroll to an arbitrary node in a long list: + +```js +import { useRef } from "react"; + +export default function CatFriends() { + const itemsRef = useRef(null); + + function scrollToId(itemId) { + const map = getMap(); + const node = map.get(itemId); + node.scrollIntoView({ + behavior: "smooth", + block: "nearest", + inline: "center", + }); + } + + function getMap() { + if (!itemsRef.current) { + // Initialize the Map on first usage. + itemsRef.current = new Map(); + } + return itemsRef.current; + } + + return ( + <> + <nav> + <button on_click={() => scrollToId(0)}>Tom</button> + <button on_click={() => scrollToId(5)}>Maru</button> + <button on_click={() => scrollToId(9)}>Jellylorum</button> + </nav> + <div> + <ul> + {catList.map((cat) => ( + <li + key={cat.id} + ref={(node) => { + const map = getMap(); + if (node) { + map.set(cat.id, node); + } else { + map.delete(cat.id); + } + }} + > + <img src={cat.imageUrl} alt={"Cat #" + cat.id} /> + </li> + ))} + </ul> + </div> + </> + ); +} + +const catList = []; +for (let i = 0; i < 10; i++) { + catList.push({ + id: i, + imageUrl: "https://placekitten.com/250/200?image=" + i, + }); +} +``` + +```css +div { + width: 100%; + overflow: hidden; +} + +nav { + text-align: center; +} + +button { + margin: 0.25rem; +} + +ul, +li { + list-style: none; + white-space: nowrap; +} + +li { + display: inline; + padding: 0.5rem; +} +``` + +In this example, `itemsRef` doesn't hold a single DOM node. Instead, it holds a [Map](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Map) from item ID to a DOM node. ([Refs can hold any values!](/learn/referencing-values-with-refs)) The [`ref` callback](/reference/react-dom/components/common#ref-callback) on every list item takes care to update the Map: + +```js +<li + key={cat.id} + ref={node => { + const map = getMap(); + if (node) { + // Add to the Map + map.set(cat.id, node); + } else { + // Remove from the Map + map.delete(cat.id); + } + }} +> +``` + +This lets you read individual DOM nodes from the Map later. + +</DeepDive> + +## Accessing another component's DOM nodes + +When you put a ref on a built-in component that outputs a browser element like `<input />`, React will set that ref's `current` property to the corresponding DOM node (such as the actual `<input />` in the browser). + +However, if you try to put a ref on **your own** component, like `<MyInput />`, by default you will get `null`. Here is an example demonstrating it. Notice how clicking the button **does not** focus the input: + +```js +import { useRef } from "react"; + +function MyInput(props) { + return <input {...props} />; +} + +export default function MyForm() { + const inputRef = useRef(null); + + function handleClick() { + inputRef.current.focus(); + } + + return ( + <> + <MyInput ref={inputRef} /> + <button on_click={handleClick}>Focus the input</button> + </> + ); +} +``` + +To help you notice the issue, React also prints an error to the console: + +<ConsoleBlock level="error"> + +Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()? + +</ConsoleBlock> + +This happens because by default React does not let a component access the DOM nodes of other components. Not even for its own children! This is intentional. Refs are an escape hatch that should be used sparingly. Manually manipulating _another_ component's DOM nodes makes your code even more fragile. + +Instead, components that _want_ to expose their DOM nodes have to **opt in** to that behavior. A component can specify that it "forwards" its ref to one of its children. Here's how `MyInput` can use the `forwardRef` API: + +```js +const MyInput = forwardRef((props, ref) => { + return <input {...props} ref={ref} />; +}); +``` + +This is how it works: + +1. `<MyInput ref={inputRef} />` tells React to put the corresponding DOM node into `inputRef.current`. However, it's up to the `MyInput` component to opt into that--by default, it doesn't. +2. The `MyInput` component is declared using `forwardRef`. **This opts it into receiving the `inputRef` from above as the second `ref` argument** which is declared after `props`. +3. `MyInput` itself passes the `ref` it received to the `<input>` inside of it. + +Now clicking the button to focus the input works: + +```js +import { forwardRef, useRef } from "react"; + +const MyInput = forwardRef((props, ref) => { + return <input {...props} ref={ref} />; +}); + +export default function Form() { + const inputRef = useRef(null); + + function handleClick() { + inputRef.current.focus(); + } + + return ( + <> + <MyInput ref={inputRef} /> + <button on_click={handleClick}>Focus the input</button> + </> + ); +} +``` + +In design systems, it is a common pattern for low-level components like buttons, inputs, and so on, to forward their refs to their DOM nodes. On the other hand, high-level components like forms, lists, or page sections usually won't expose their DOM nodes to avoid accidental dependencies on the DOM structure. + +<DeepDive> + +#### Exposing a subset of the API with an imperative handle + +In the above example, `MyInput` exposes the original DOM input element. This lets the parent component call `focus()` on it. However, this also lets the parent component do something else--for example, change its CSS styles. In uncommon cases, you may want to restrict the exposed functionality. You can do that with `useImperativeHandle`: + +```js +import { forwardRef, useRef, useImperativeHandle } from "react"; + +const MyInput = forwardRef((props, ref) => { + const realInputRef = useRef(null); + useImperativeHandle(ref, () => ({ + // Only expose focus and nothing else + focus() { + realInputRef.current.focus(); + }, + })); + return <input {...props} ref={realInputRef} />; +}); + +export default function Form() { + const inputRef = useRef(null); + + function handleClick() { + inputRef.current.focus(); + } + + return ( + <> + <MyInput ref={inputRef} /> + <button on_click={handleClick}>Focus the input</button> + </> + ); +} +``` + +Here, `realInputRef` inside `MyInput` holds the actual input DOM node. However, `useImperativeHandle` instructs React to provide your own special object as the value of a ref to the parent component. So `inputRef.current` inside the `Form` component will only have the `focus` method. In this case, the ref "handle" is not the DOM node, but the custom object you create inside `useImperativeHandle` call. + +</DeepDive> + +## When React attaches the refs + +In React, every update is split in [two phases](/learn/render-and-commit#step-3-react-commits-changes-to-the-dom): + +- During **render,** React calls your components to figure out what should be on the screen. +- During **commit,** React applies changes to the DOM. + +In general, you [don't want](/learn/referencing-values-with-refs#best-practices-for-refs) to access refs during rendering. That goes for refs holding DOM nodes as well. During the first render, the DOM nodes have not yet been created, so `ref.current` will be `null`. And during the rendering of updates, the DOM nodes haven't been updated yet. So it's too early to read them. + +React sets `ref.current` during the commit. Before updating the DOM, React sets the affected `ref.current` values to `null`. After updating the DOM, React immediately sets them to the corresponding DOM nodes. + +**Usually, you will access refs from event handlers.** If you want to do something with a ref, but there is no particular event to do it in, you might need an Effect. We will discuss effects on the next pages. + +<DeepDive> + +#### Flushing state updates synchronously with flushSync + +Consider code like this, which adds a new todo and scrolls the screen down to the last child of the list. Notice how, for some reason, it always scrolls to the todo that was _just before_ the last added one: + +```js +import { useState, useRef } from "react"; + +export default function TodoList() { + const listRef = useRef(null); + const [text, setText] = useState(""); + const [todos, setTodos] = useState(initialTodos); + + function handleAdd() { + const newTodo = { id: nextId++, text: text }; + setText(""); + setTodos([...todos, newTodo]); + listRef.current.lastChild.scrollIntoView({ + behavior: "smooth", + block: "nearest", + }); + } + + return ( + <> + <button on_click={handleAdd}>Add</button> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <ul ref={listRef}> + {todos.map((todo) => ( + <li key={todo.id}>{todo.text}</li> + ))} + </ul> + </> + ); +} + +let nextId = 0; +let initialTodos = []; +for (let i = 0; i < 20; i++) { + initialTodos.push({ + id: nextId++, + text: "Todo #" + (i + 1), + }); +} +``` + +The issue is with these two lines: + +```js +setTodos([...todos, newTodo]); +listRef.current.lastChild.scrollIntoView(); +``` + +In React, [state updates are queued.](/learn/queueing-a-series-of-state-updates) Usually, this is what you want. However, here it causes a problem because `setTodos` does not immediately update the DOM. So the time you scroll the list to its last element, the todo has not yet been added. This is why scrolling always "lags behind" by one item. + +To fix this issue, you can force React to update ("flush") the DOM synchronously. To do this, import `flushSync` from `react-dom` and **wrap the state update** into a `flushSync` call: + +```js +flushSync(() => { + setTodos([...todos, newTodo]); +}); +listRef.current.lastChild.scrollIntoView(); +``` + +This will instruct React to update the DOM synchronously right after the code wrapped in `flushSync` executes. As a result, the last todo will already be in the DOM by the time you try to scroll to it: + +```js +import { useState, useRef } from "react"; +import { flushSync } from "react-dom"; + +export default function TodoList() { + const listRef = useRef(null); + const [text, setText] = useState(""); + const [todos, setTodos] = useState(initialTodos); + + function handleAdd() { + const newTodo = { id: nextId++, text: text }; + flushSync(() => { + setText(""); + setTodos([...todos, newTodo]); + }); + listRef.current.lastChild.scrollIntoView({ + behavior: "smooth", + block: "nearest", + }); + } + + return ( + <> + <button on_click={handleAdd}>Add</button> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <ul ref={listRef}> + {todos.map((todo) => ( + <li key={todo.id}>{todo.text}</li> + ))} + </ul> + </> + ); +} + +let nextId = 0; +let initialTodos = []; +for (let i = 0; i < 20; i++) { + initialTodos.push({ + id: nextId++, + text: "Todo #" + (i + 1), + }); +} +``` + +</DeepDive> + +## Best practices for DOM manipulation with refs + +Refs are an escape hatch. You should only use them when you have to "step outside React". Common examples of this include managing focus, scroll position, or calling browser APIs that React does not expose. + +If you stick to non-destructive actions like focusing and scrolling, you shouldn't encounter any problems. However, if you try to **modify** the DOM manually, you can risk conflicting with the changes React is making. + +To illustrate this problem, this example includes a welcome message and two buttons. The first button toggles its presence using [conditional rendering](/learn/conditional-rendering) and [state](/learn/state-a-components-memory), as you would usually do in React. The second button uses the [`remove()` DOM API](https://developer.mozilla.org/en-US/docs/Web/API/Element/remove) to forcefully remove it from the DOM outside of React's control. + +Try pressing "Toggle with setState" a few times. The message should disappear and appear again. Then press "Remove from the DOM". This will forcefully remove it. Finally, press "Toggle with setState": + +```js +import { useState, useRef } from "react"; + +export default function Counter() { + const [show, setShow] = useState(true); + const ref = useRef(null); + + return ( + <div> + <button + on_click={() => { + setShow(!show); + }} + > + Toggle with setState + </button> + <button + on_click={() => { + ref.current.remove(); + }} + > + Remove from the DOM + </button> + {show && <p ref={ref}>Hello world</p>} + </div> + ); +} +``` + +```css +p, +button { + display: block; + margin: 10px; +} +``` + +After you've manually removed the DOM element, trying to use `setState` to show it again will lead to a crash. This is because you've changed the DOM, and React doesn't know how to continue managing it correctly. + +**Avoid changing DOM nodes managed by React.** Modifying, adding children to, or removing children from elements that are managed by React can lead to inconsistent visual results or crashes like above. + +However, this doesn't mean that you can't do it at all. It requires caution. **You can safely modify parts of the DOM that React has _no reason_ to update.** For example, if some `<div>` is always empty in the JSX, React won't have a reason to touch its children list. Therefore, it is safe to manually add or remove elements there. + +<Recap> + +- Refs are a generic concept, but most often you'll use them to hold DOM elements. +- You instruct React to put a DOM node into `myRef.current` by passing `<div ref={myRef}>`. +- Usually, you will use refs for non-destructive actions like focusing, scrolling, or measuring DOM elements. +- A component doesn't expose its DOM nodes by default. You can opt into exposing a DOM node by using `forwardRef` and passing the second `ref` argument down to a specific node. +- Avoid changing DOM nodes managed by React. +- If you do modify DOM nodes managed by React, modify parts that React has no reason to update. + +</Recap> + +<Challenges> + +#### Play and pause the video + +In this example, the button toggles a state variable to switch between a playing and a paused state. However, in order to actually play or pause the video, toggling state is not enough. You also need to call [`play()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play) and [`pause()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause) on the DOM element for the `<video>`. Add a ref to it, and make the button work. + +```js +import { useState, useRef } from "react"; + +export default function VideoPlayer() { + const [isPlaying, setIsPlaying] = useState(false); + + function handleClick() { + const nextIsPlaying = !isPlaying; + setIsPlaying(nextIsPlaying); + } + + return ( + <> + <button on_click={handleClick}> + {isPlaying ? "Pause" : "Play"} + </button> + <video width="250"> + <source + src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4" + type="video/mp4" + /> + </video> + </> + ); +} +``` + +```css +button { + display: block; + margin-bottom: 20px; +} +``` + +For an extra challenge, keep the "Play" button in sync with whether the video is playing even if the user right-clicks the video and plays it using the built-in browser media controls. You might want to listen to `onPlay` and `onPause` on the video to do that. + +<Solution> + +Declare a ref and put it on the `<video>` element. Then call `ref.current.play()` and `ref.current.pause()` in the event handler depending on the next state. + +```js +import { useState, useRef } from "react"; + +export default function VideoPlayer() { + const [isPlaying, setIsPlaying] = useState(false); + const ref = useRef(null); + + function handleClick() { + const nextIsPlaying = !isPlaying; + setIsPlaying(nextIsPlaying); + + if (nextIsPlaying) { + ref.current.play(); + } else { + ref.current.pause(); + } + } + + return ( + <> + <button on_click={handleClick}> + {isPlaying ? "Pause" : "Play"} + </button> + <video + width="250" + ref={ref} + onPlay={() => setIsPlaying(true)} + onPause={() => setIsPlaying(false)} + > + <source + src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4" + type="video/mp4" + /> + </video> + </> + ); +} +``` + +```css +button { + display: block; + margin-bottom: 20px; +} +``` + +In order to handle the built-in browser controls, you can add `onPlay` and `onPause` handlers to the `<video>` element and call `setIsPlaying` from them. This way, if the user plays the video using the browser controls, the state will adjust accordingly. + +</Solution> + +#### Focus the search field + +Make it so that clicking the "Search" button puts focus into the field. + +```js +export default function Page() { + return ( + <> + <nav> + <button>Search</button> + </nav> + <input placeholder="Looking for something?" /> + </> + ); +} +``` + +```css +button { + display: block; + margin-bottom: 10px; +} +``` + +<Solution> + +Add a ref to the input, and call `focus()` on the DOM node to focus it: + +```js +import { useRef } from "react"; + +export default function Page() { + const inputRef = useRef(null); + return ( + <> + <nav> + <button + on_click={() => { + inputRef.current.focus(); + }} + > + Search + </button> + </nav> + <input ref={inputRef} placeholder="Looking for something?" /> + </> + ); +} +``` + +```css +button { + display: block; + margin-bottom: 10px; +} +``` + +</Solution> + +#### Scrolling an image carousel + +This image carousel has a "Next" button that switches the active image. Make the gallery scroll horizontally to the active image on click. You will want to call [`scrollIntoView()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView) on the DOM node of the active image: + +```js +node.scrollIntoView({ + behavior: "smooth", + block: "nearest", + inline: "center", +}); +``` + +<Hint> + +You don't need to have a ref to every image for this exercise. It should be enough to have a ref to the currently active image, or to the list itself. Use `flushSync` to ensure the DOM is updated _before_ you scroll. + +</Hint> + +```js +import { useState } from "react"; + +export default function CatFriends() { + const [index, setIndex] = useState(0); + return ( + <> + <nav> + <button + on_click={() => { + if (index < catList.length - 1) { + setIndex(index + 1); + } else { + setIndex(0); + } + }} + > + Next + </button> + </nav> + <div> + <ul> + {catList.map((cat, i) => ( + <li key={cat.id}> + <img + className={index === i ? "active" : ""} + src={cat.imageUrl} + alt={"Cat #" + cat.id} + /> + </li> + ))} + </ul> + </div> + </> + ); +} + +const catList = []; +for (let i = 0; i < 10; i++) { + catList.push({ + id: i, + imageUrl: "https://placekitten.com/250/200?image=" + i, + }); +} +``` + +```css +div { + width: 100%; + overflow: hidden; +} + +nav { + text-align: center; +} + +button { + margin: 0.25rem; +} + +ul, +li { + list-style: none; + white-space: nowrap; +} + +li { + display: inline; + padding: 0.5rem; +} + +img { + padding: 10px; + margin: -10px; + transition: background 0.2s linear; +} + +.active { + background: rgba(0, 100, 150, 0.4); +} +``` + +<Solution> + +You can declare a `selectedRef`, and then pass it conditionally only to the current image: + +```js +<li ref={index === i ? selectedRef : null}> +``` + +When `index === i`, meaning that the image is the selected one, the `<li>` will receive the `selectedRef`. React will make sure that `selectedRef.current` always points at the correct DOM node. + +Note that the `flushSync` call is necessary to force React to update the DOM before the scroll. Otherwise, `selectedRef.current` would always point at the previously selected item. + +```js +import { useRef, useState } from "react"; +import { flushSync } from "react-dom"; + +export default function CatFriends() { + const selectedRef = useRef(null); + const [index, setIndex] = useState(0); + + return ( + <> + <nav> + <button + on_click={() => { + flushSync(() => { + if (index < catList.length - 1) { + setIndex(index + 1); + } else { + setIndex(0); + } + }); + selectedRef.current.scrollIntoView({ + behavior: "smooth", + block: "nearest", + inline: "center", + }); + }} + > + Next + </button> + </nav> + <div> + <ul> + {catList.map((cat, i) => ( + <li key={cat.id} ref={index === i ? selectedRef : null}> + <img + className={index === i ? "active" : ""} + src={cat.imageUrl} + alt={"Cat #" + cat.id} + /> + </li> + ))} + </ul> + </div> + </> + ); +} + +const catList = []; +for (let i = 0; i < 10; i++) { + catList.push({ + id: i, + imageUrl: "https://placekitten.com/250/200?image=" + i, + }); +} +``` + +```css +div { + width: 100%; + overflow: hidden; +} + +nav { + text-align: center; +} + +button { + margin: 0.25rem; +} + +ul, +li { + list-style: none; + white-space: nowrap; +} + +li { + display: inline; + padding: 0.5rem; +} + +img { + padding: 10px; + margin: -10px; + transition: background 0.2s linear; +} + +.active { + background: rgba(0, 100, 150, 0.4); +} +``` + +</Solution> + +#### Focus the search field with separate components + +Make it so that clicking the "Search" button puts focus into the field. Note that each component is defined in a separate file and shouldn't be moved out of it. How do you connect them together? + +<Hint> + +You'll need `forwardRef` to opt into exposing a DOM node from your own component like `SearchInput`. + +</Hint> + +```js +import SearchButton from "./SearchButton.js"; +import SearchInput from "./SearchInput.js"; + +export default function Page() { + return ( + <> + <nav> + <SearchButton /> + </nav> + <SearchInput /> + </> + ); +} +``` + +```js +export default function SearchButton() { + return <button>Search</button>; +} +``` + +```js +export default function SearchInput() { + return <input placeholder="Looking for something?" />; +} +``` + +```css +button { + display: block; + margin-bottom: 10px; +} +``` + +<Solution> + +You'll need to add an `on_click` prop to the `SearchButton`, and make the `SearchButton` pass it down to the browser `<button>`. You'll also pass a ref down to `<SearchInput>`, which will forward it to the real `<input>` and populate it. Finally, in the click handler, you'll call `focus` on the DOM node stored inside that ref. + +```js +import { useRef } from "react"; +import SearchButton from "./SearchButton.js"; +import SearchInput from "./SearchInput.js"; + +export default function Page() { + const inputRef = useRef(null); + return ( + <> + <nav> + <SearchButton + on_click={() => { + inputRef.current.focus(); + }} + /> + </nav> + <SearchInput ref={inputRef} /> + </> + ); +} +``` + +```js +export default function SearchButton({ on_click }) { + return <button on_click={on_click}>Search</button>; +} +``` + +```js +import { forwardRef } from "react"; + +export default forwardRef(function SearchInput(props, ref) { + return <input ref={ref} placeholder="Looking for something?" />; +}); +``` + +```css +button { + display: block; + margin-bottom: 10px; +} +``` + +</Solution> + +</Challenges> diff --git a/docs/src/learn/manually-register-a-client.md b/docs/src/learn/manually-register-a-client.md new file mode 100644 index 000000000..9ee55b31d --- /dev/null +++ b/docs/src/learn/manually-register-a-client.md @@ -0,0 +1,3 @@ +--- +title: Manually Register a Client 🚧 +--- diff --git a/docs/src/learn/passing-data-deeply-with-context.md b/docs/src/learn/passing-data-deeply-with-context.md new file mode 100644 index 000000000..84d2c0c73 --- /dev/null +++ b/docs/src/learn/passing-data-deeply-with-context.md @@ -0,0 +1,1092 @@ +--- +title: Passing Data Deeply with Context 🚧 +--- + +## Overview + +<p class="intro" markdown> + +Usually, you will pass information from a parent component to a child component via props. But passing props can become verbose and inconvenient if you have to pass them through many components in the middle, or if many components in your app need the same information. _Context_ lets the parent component make some information available to any component in the tree below it—no matter how deep—without passing it explicitly through props. + +</p> + +!!! summary "You Will Learn" + + - What "prop drilling" is + - How to replace repetitive prop passing with context + - Common use cases for context + - Common alternatives to context + +## The problem with passing props + +[Passing props](/learn/passing-props-to-a-component) is a great way to explicitly pipe data through your UI tree to the components that use it. + +But passing props can become verbose and inconvenient when you need to pass some prop deeply through the tree, or if many components need the same prop. The nearest common ancestor could be far removed from the components that need data, and [lifting state up](/learn/sharing-state-between-components) that high can lead to a situation called "prop drilling". + +<!-- TODO: Diagram --> + +Wouldn't it be great if there were a way to "teleport" data to the components in the tree that need it without passing props? With React's context feature, there is! + +## Context: an alternative to passing props + +Context lets a parent component provide data to the entire tree below it. There are many uses for context. Here is one example. Consider this `Heading` component that accepts a `level` for its size: + +```js +import Heading from "./Heading.js"; +import Section from "./Section.js"; + +export default function Page() { + return ( + <Section> + <Heading level={1}>Title</Heading> + <Heading level={2}>Heading</Heading> + <Heading level={3}>Sub-heading</Heading> + <Heading level={4}>Sub-sub-heading</Heading> + <Heading level={5}>Sub-sub-sub-heading</Heading> + <Heading level={6}>Sub-sub-sub-sub-heading</Heading> + </Section> + ); +} +``` + +```js +export default function Section({ children }) { + return <section className="section">{children}</section>; +} +``` + +```js +export default function Heading({ level, children }) { + switch (level) { + case 1: + return <h1>{children}</h1>; + case 2: + return <h2>{children}</h2>; + case 3: + return <h3>{children}</h3>; + case 4: + return <h4>{children}</h4>; + case 5: + return <h5>{children}</h5>; + case 6: + return <h6>{children}</h6>; + default: + throw Error("Unknown level: " + level); + } +} +``` + +```css +.section { + padding: 10px; + margin: 5px; + border-radius: 5px; + border: 1px solid #aaa; +} +``` + +Let's say you want multiple headings within the same `Section` to always have the same size: + +```js +import Heading from "./Heading.js"; +import Section from "./Section.js"; + +export default function Page() { + return ( + <Section> + <Heading level={1}>Title</Heading> + <Section> + <Heading level={2}>Heading</Heading> + <Heading level={2}>Heading</Heading> + <Heading level={2}>Heading</Heading> + <Section> + <Heading level={3}>Sub-heading</Heading> + <Heading level={3}>Sub-heading</Heading> + <Heading level={3}>Sub-heading</Heading> + <Section> + <Heading level={4}>Sub-sub-heading</Heading> + <Heading level={4}>Sub-sub-heading</Heading> + <Heading level={4}>Sub-sub-heading</Heading> + </Section> + </Section> + </Section> + </Section> + ); +} +``` + +```js +export default function Section({ children }) { + return <section className="section">{children}</section>; +} +``` + +```js +export default function Heading({ level, children }) { + switch (level) { + case 1: + return <h1>{children}</h1>; + case 2: + return <h2>{children}</h2>; + case 3: + return <h3>{children}</h3>; + case 4: + return <h4>{children}</h4>; + case 5: + return <h5>{children}</h5>; + case 6: + return <h6>{children}</h6>; + default: + throw Error("Unknown level: " + level); + } +} +``` + +```css +.section { + padding: 10px; + margin: 5px; + border-radius: 5px; + border: 1px solid #aaa; +} +``` + +Currently, you pass the `level` prop to each `<Heading>` separately: + +```js +<Section> + <Heading level={3}>About</Heading> + <Heading level={3}>Photos</Heading> + <Heading level={3}>Videos</Heading> +</Section> +``` + +It would be nice if you could pass the `level` prop to the `<Section>` component instead and remove it from the `<Heading>`. This way you could enforce that all headings in the same section have the same size: + +```js +<Section level={3}> + <Heading>About</Heading> + <Heading>Photos</Heading> + <Heading>Videos</Heading> +</Section> +``` + +But how can the `<Heading>` component know the level of its closest `<Section>`? **That would require some way for a child to "ask" for data from somewhere above in the tree.** + +You can't do it with props alone. This is where context comes into play. You will do it in three steps: + +1. **Create** a context. (You can call it `LevelContext`, since it's for the heading level.) +2. **Use** that context from the component that needs the data. (`Heading` will use `LevelContext`.) +3. **Provide** that context from the component that specifies the data. (`Section` will provide `LevelContext`.) + +Context lets a parent--even a distant one!--provide some data to the entire tree inside of it. + +<!-- TODO: Diagram --> + +### Step 1: Create the context + +First, you need to create the context. You'll need to **export it from a file** so that your components can use it: + +```js +import Heading from "./Heading.js"; +import Section from "./Section.js"; + +export default function Page() { + return ( + <Section> + <Heading level={1}>Title</Heading> + <Section> + <Heading level={2}>Heading</Heading> + <Heading level={2}>Heading</Heading> + <Heading level={2}>Heading</Heading> + <Section> + <Heading level={3}>Sub-heading</Heading> + <Heading level={3}>Sub-heading</Heading> + <Heading level={3}>Sub-heading</Heading> + <Section> + <Heading level={4}>Sub-sub-heading</Heading> + <Heading level={4}>Sub-sub-heading</Heading> + <Heading level={4}>Sub-sub-heading</Heading> + </Section> + </Section> + </Section> + </Section> + ); +} +``` + +```js +export default function Section({ children }) { + return <section className="section">{children}</section>; +} +``` + +```js +export default function Heading({ level, children }) { + switch (level) { + case 1: + return <h1>{children}</h1>; + case 2: + return <h2>{children}</h2>; + case 3: + return <h3>{children}</h3>; + case 4: + return <h4>{children}</h4>; + case 5: + return <h5>{children}</h5>; + case 6: + return <h6>{children}</h6>; + default: + throw Error("Unknown level: " + level); + } +} +``` + +```js +import { createContext } from "react"; + +export const LevelContext = createContext(1); +``` + +```css +.section { + padding: 10px; + margin: 5px; + border-radius: 5px; + border: 1px solid #aaa; +} +``` + +The only argument to `createContext` is the _default_ value. Here, `1` refers to the biggest heading level, but you could pass any kind of value (even an object). You will see the significance of the default value in the next step. + +### Step 2: Use the context + +Import the `useContext` Hook from React and your context: + +```js +import { useContext } from "react"; +import { LevelContext } from "./LevelContext.js"; +``` + +Currently, the `Heading` component reads `level` from props: + +```js +export default function Heading({ level, children }) { + // ... +} +``` + +Instead, remove the `level` prop and read the value from the context you just imported, `LevelContext`: + +```js +export default function Heading({ children }) { + const level = useContext(LevelContext); + // ... +} +``` + +`useContext` is a Hook. Just like `useState` and `useReducer`, you can only call a Hook immediately inside a React component (not inside loops or conditions). **`useContext` tells React that the `Heading` component wants to read the `LevelContext`.** + +Now that the `Heading` component doesn't have a `level` prop, you don't need to pass the level prop to `Heading` in your JSX like this anymore: + +```js +<Section> + <Heading level={4}>Sub-sub-heading</Heading> + <Heading level={4}>Sub-sub-heading</Heading> + <Heading level={4}>Sub-sub-heading</Heading> +</Section> +``` + +Update the JSX so that it's the `Section` that receives it instead: + +```jsx +<Section level={4}> + <Heading>Sub-sub-heading</Heading> + <Heading>Sub-sub-heading</Heading> + <Heading>Sub-sub-heading</Heading> +</Section> +``` + +As a reminder, this is the markup that you were trying to get working: + +```js +import Heading from "./Heading.js"; +import Section from "./Section.js"; + +export default function Page() { + return ( + <Section level={1}> + <Heading>Title</Heading> + <Section level={2}> + <Heading>Heading</Heading> + <Heading>Heading</Heading> + <Heading>Heading</Heading> + <Section level={3}> + <Heading>Sub-heading</Heading> + <Heading>Sub-heading</Heading> + <Heading>Sub-heading</Heading> + <Section level={4}> + <Heading>Sub-sub-heading</Heading> + <Heading>Sub-sub-heading</Heading> + <Heading>Sub-sub-heading</Heading> + </Section> + </Section> + </Section> + </Section> + ); +} +``` + +```js +export default function Section({ children }) { + return <section className="section">{children}</section>; +} +``` + +```js +import { useContext } from "react"; +import { LevelContext } from "./LevelContext.js"; + +export default function Heading({ children }) { + const level = useContext(LevelContext); + switch (level) { + case 1: + return <h1>{children}</h1>; + case 2: + return <h2>{children}</h2>; + case 3: + return <h3>{children}</h3>; + case 4: + return <h4>{children}</h4>; + case 5: + return <h5>{children}</h5>; + case 6: + return <h6>{children}</h6>; + default: + throw Error("Unknown level: " + level); + } +} +``` + +```js +import { createContext } from "react"; + +export const LevelContext = createContext(1); +``` + +```css +.section { + padding: 10px; + margin: 5px; + border-radius: 5px; + border: 1px solid #aaa; +} +``` + +Notice this example doesn't quite work, yet! All the headings have the same size because **even though you're _using_ the context, you have not _provided_ it yet.** React doesn't know where to get it! + +If you don't provide the context, React will use the default value you've specified in the previous step. In this example, you specified `1` as the argument to `createContext`, so `useContext(LevelContext)` returns `1`, setting all those headings to `<h1>`. Let's fix this problem by having each `Section` provide its own context. + +### Step 3: Provide the context + +The `Section` component currently renders its children: + +```js +export default function Section({ children }) { + return <section className="section">{children}</section>; +} +``` + +**Wrap them with a context provider** to provide the `LevelContext` to them: + +```js +import { LevelContext } from "./LevelContext.js"; + +export default function Section({ level, children }) { + return ( + <section className="section"> + <LevelContext.Provider value={level}> + {children} + </LevelContext.Provider> + </section> + ); +} +``` + +This tells React: "if any component inside this `<Section>` asks for `LevelContext`, give them this `level`." The component will use the value of the nearest `<LevelContext.Provider>` in the UI tree above it. + +```js +import Heading from "./Heading.js"; +import Section from "./Section.js"; + +export default function Page() { + return ( + <Section level={1}> + <Heading>Title</Heading> + <Section level={2}> + <Heading>Heading</Heading> + <Heading>Heading</Heading> + <Heading>Heading</Heading> + <Section level={3}> + <Heading>Sub-heading</Heading> + <Heading>Sub-heading</Heading> + <Heading>Sub-heading</Heading> + <Section level={4}> + <Heading>Sub-sub-heading</Heading> + <Heading>Sub-sub-heading</Heading> + <Heading>Sub-sub-heading</Heading> + </Section> + </Section> + </Section> + </Section> + ); +} +``` + +```js +import { LevelContext } from "./LevelContext.js"; + +export default function Section({ level, children }) { + return ( + <section className="section"> + <LevelContext.Provider value={level}> + {children} + </LevelContext.Provider> + </section> + ); +} +``` + +```js +import { useContext } from "react"; +import { LevelContext } from "./LevelContext.js"; + +export default function Heading({ children }) { + const level = useContext(LevelContext); + switch (level) { + case 1: + return <h1>{children}</h1>; + case 2: + return <h2>{children}</h2>; + case 3: + return <h3>{children}</h3>; + case 4: + return <h4>{children}</h4>; + case 5: + return <h5>{children}</h5>; + case 6: + return <h6>{children}</h6>; + default: + throw Error("Unknown level: " + level); + } +} +``` + +```js +import { createContext } from "react"; + +export const LevelContext = createContext(1); +``` + +```css +.section { + padding: 10px; + margin: 5px; + border-radius: 5px; + border: 1px solid #aaa; +} +``` + +It's the same result as the original code, but you did not need to pass the `level` prop to each `Heading` component! Instead, it "figures out" its heading level by asking the closest `Section` above: + +1. You pass a `level` prop to the `<Section>`. +2. `Section` wraps its children into `<LevelContext.Provider value={level}>`. +3. `Heading` asks the closest value of `LevelContext` above with `useContext(LevelContext)`. + +## Using and providing context from the same component + +Currently, you still have to specify each section's `level` manually: + +```js +export default function Page() { + return ( + <Section level={1}> + ... + <Section level={2}> + ... + <Section level={3}> + ... +``` + +Since context lets you read information from a component above, each `Section` could read the `level` from the `Section` above, and pass `level + 1` down automatically. Here is how you could do it: + +```js +import { useContext } from "react"; +import { LevelContext } from "./LevelContext.js"; + +export default function Section({ children }) { + const level = useContext(LevelContext); + return ( + <section className="section"> + <LevelContext.Provider value={level + 1}> + {children} + </LevelContext.Provider> + </section> + ); +} +``` + +With this change, you don't need to pass the `level` prop _either_ to the `<Section>` or to the `<Heading>`: + +```js +import Heading from "./Heading.js"; +import Section from "./Section.js"; + +export default function Page() { + return ( + <Section> + <Heading>Title</Heading> + <Section> + <Heading>Heading</Heading> + <Heading>Heading</Heading> + <Heading>Heading</Heading> + <Section> + <Heading>Sub-heading</Heading> + <Heading>Sub-heading</Heading> + <Heading>Sub-heading</Heading> + <Section> + <Heading>Sub-sub-heading</Heading> + <Heading>Sub-sub-heading</Heading> + <Heading>Sub-sub-heading</Heading> + </Section> + </Section> + </Section> + </Section> + ); +} +``` + +```js +import { useContext } from "react"; +import { LevelContext } from "./LevelContext.js"; + +export default function Section({ children }) { + const level = useContext(LevelContext); + return ( + <section className="section"> + <LevelContext.Provider value={level + 1}> + {children} + </LevelContext.Provider> + </section> + ); +} +``` + +```js +import { useContext } from "react"; +import { LevelContext } from "./LevelContext.js"; + +export default function Heading({ children }) { + const level = useContext(LevelContext); + switch (level) { + case 0: + throw Error("Heading must be inside a Section!"); + case 1: + return <h1>{children}</h1>; + case 2: + return <h2>{children}</h2>; + case 3: + return <h3>{children}</h3>; + case 4: + return <h4>{children}</h4>; + case 5: + return <h5>{children}</h5>; + case 6: + return <h6>{children}</h6>; + default: + throw Error("Unknown level: " + level); + } +} +``` + +```js +import { createContext } from "react"; + +export const LevelContext = createContext(0); +``` + +```css +.section { + padding: 10px; + margin: 5px; + border-radius: 5px; + border: 1px solid #aaa; +} +``` + +Now both `Heading` and `Section` read the `LevelContext` to figure out how "deep" they are. And the `Section` wraps its children into the `LevelContext` to specify that anything inside of it is at a "deeper" level. + +<Note> + +This example uses heading levels because they show visually how nested components can override context. But context is useful for many other use cases too. You can pass down any information needed by the entire subtree: the current color theme, the currently logged in user, and so on. + +</Note> + +## Context passes through intermediate components + +You can insert as many components as you like between the component that provides context and the one that uses it. This includes both built-in components like `<div>` and components you might build yourself. + +In this example, the same `Post` component (with a dashed border) is rendered at two different nesting levels. Notice that the `<Heading>` inside of it gets its level automatically from the closest `<Section>`: + +```js +import Heading from "./Heading.js"; +import Section from "./Section.js"; + +export default function ProfilePage() { + return ( + <Section> + <Heading>My Profile</Heading> + <Post title="Hello traveller!" body="Read about my adventures." /> + <AllPosts /> + </Section> + ); +} + +function AllPosts() { + return ( + <Section> + <Heading>Posts</Heading> + <RecentPosts /> + </Section> + ); +} + +function RecentPosts() { + return ( + <Section> + <Heading>Recent Posts</Heading> + <Post title="Flavors of Lisbon" body="...those pastéis de nata!" /> + <Post + title="Buenos Aires in the rhythm of tango" + body="I loved it!" + /> + </Section> + ); +} + +function Post({ title, body }) { + return ( + <Section isFancy={true}> + <Heading>{title}</Heading> + <p> + <i>{body}</i> + </p> + </Section> + ); +} +``` + +```js +import { useContext } from "react"; +import { LevelContext } from "./LevelContext.js"; + +export default function Section({ children, isFancy }) { + const level = useContext(LevelContext); + return ( + <section className={"section " + (isFancy ? "fancy" : "")}> + <LevelContext.Provider value={level + 1}> + {children} + </LevelContext.Provider> + </section> + ); +} +``` + +```js +import { useContext } from "react"; +import { LevelContext } from "./LevelContext.js"; + +export default function Heading({ children }) { + const level = useContext(LevelContext); + switch (level) { + case 0: + throw Error("Heading must be inside a Section!"); + case 1: + return <h1>{children}</h1>; + case 2: + return <h2>{children}</h2>; + case 3: + return <h3>{children}</h3>; + case 4: + return <h4>{children}</h4>; + case 5: + return <h5>{children}</h5>; + case 6: + return <h6>{children}</h6>; + default: + throw Error("Unknown level: " + level); + } +} +``` + +```js +import { createContext } from "react"; + +export const LevelContext = createContext(0); +``` + +```css +.section { + padding: 10px; + margin: 5px; + border-radius: 5px; + border: 1px solid #aaa; +} + +.fancy { + border: 4px dashed pink; +} +``` + +You didn't do anything special for this to work. A `Section` specifies the context for the tree inside it, so you can insert a `<Heading>` anywhere, and it will have the correct size. Try it in the sandbox above! + +**Context lets you write components that "adapt to their surroundings" and display themselves differently depending on _where_ (or, in other words, _in which context_) they are being rendered.** + +How context works might remind you of [CSS property inheritance.](https://developer.mozilla.org/en-US/docs/Web/CSS/inheritance) In CSS, you can specify `color: blue` for a `<div>`, and any DOM node inside of it, no matter how deep, will inherit that color unless some other DOM node in the middle overrides it with `color: green`. Similarly, in React, the only way to override some context coming from above is to wrap children into a context provider with a different value. + +In CSS, different properties like `color` and `background-color` don't override each other. You can set all `<div>`'s `color` to red without impacting `background-color`. Similarly, **different React contexts don't override each other.** Each context that you make with `createContext()` is completely separate from other ones, and ties together components using and providing _that particular_ context. One component may use or provide many different contexts without a problem. + +## Before you use context + +Context is very tempting to use! However, this also means it's too easy to overuse it. **Just because you need to pass some props several levels deep doesn't mean you should put that information into context.** + +Here's a few alternatives you should consider before using context: + +1. **Start by [passing props.](/learn/passing-props-to-a-component)** If your components are not trivial, it's not unusual to pass a dozen props down through a dozen components. It may feel like a slog, but it makes it very clear which components use which data! The person maintaining your code will be glad you've made the data flow explicit with props. +2. **Extract components and [pass JSX as `children`](/learn/passing-props-to-a-component#passing-jsx-as-children) to them.** If you pass some data through many layers of intermediate components that don't use that data (and only pass it further down), this often means that you forgot to extract some components along the way. For example, maybe you pass data props like `posts` to visual components that don't use them directly, like `<Layout posts={posts} />`. Instead, make `Layout` take `children` as a prop, and render `<Layout><Posts posts={posts} /></Layout>`. This reduces the number of layers between the component specifying the data and the one that needs it. + +If neither of these approaches works well for you, consider context. + +## Use cases for context + +- **Theming:** If your app lets the user change its appearance (e.g. dark mode), you can put a context provider at the top of your app, and use that context in components that need to adjust their visual look. +- **Current account:** Many components might need to know the currently logged in user. Putting it in context makes it convenient to read it anywhere in the tree. Some apps also let you operate multiple accounts at the same time (e.g. to leave a comment as a different user). In those cases, it can be convenient to wrap a part of the UI into a nested provider with a different current account value. +- **Routing:** Most routing solutions use context internally to hold the current route. This is how every link "knows" whether it's active or not. If you build your own router, you might want to do it too. +- **Managing state:** As your app grows, you might end up with a lot of state closer to the top of your app. Many distant components below may want to change it. It is common to [use a reducer together with context](/learn/scaling-up-with-reducer-and-context) to manage complex state and pass it down to distant components without too much hassle. + +Context is not limited to static values. If you pass a different value on the next render, React will update all the components reading it below! This is why context is often used in combination with state. + +In general, if some information is needed by distant components in different parts of the tree, it's a good indication that context will help you. + +<Recap> + +- Context lets a component provide some information to the entire tree below it. +- To pass context: + 1. Create and export it with `export const MyContext = createContext(defaultValue)`. + 2. Pass it to the `useContext(MyContext)` Hook to read it in any child component, no matter how deep. + 3. Wrap children into `<MyContext.Provider value={...}>` to provide it from a parent. +- Context passes through any components in the middle. +- Context lets you write components that "adapt to their surroundings". +- Before you use context, try passing props or passing JSX as `children`. + +</Recap> + +<Challenges> + +#### Replace prop drilling with context + +In this example, toggling the checkbox changes the `imageSize` prop passed to each `<PlaceImage>`. The checkbox state is held in the top-level `App` component, but each `<PlaceImage>` needs to be aware of it. + +Currently, `App` passes `imageSize` to `List`, which passes it to each `Place`, which passes it to the `PlaceImage`. Remove the `imageSize` prop, and instead pass it from the `App` component directly to `PlaceImage`. + +You can declare context in `Context.js`. + +```js +import { useState } from "react"; +import { places } from "./data.js"; +import { getImageUrl } from "./utils.js"; + +export default function App() { + const [isLarge, setIsLarge] = useState(false); + const imageSize = isLarge ? 150 : 100; + return ( + <> + <label> + <input + type="checkbox" + checked={isLarge} + onChange={(e) => { + setIsLarge(e.target.checked); + }} + /> + Use large images + </label> + <hr /> + <List imageSize={imageSize} /> + </> + ); +} + +function List({ imageSize }) { + const listItems = places.map((place) => ( + <li key={place.id}> + <Place place={place} imageSize={imageSize} /> + </li> + )); + return <ul>{listItems}</ul>; +} + +function Place({ place, imageSize }) { + return ( + <> + <PlaceImage place={place} imageSize={imageSize} /> + <p> + <b>{place.name}</b> + {": " + place.description} + </p> + </> + ); +} + +function PlaceImage({ place, imageSize }) { + return ( + <img + src={getImageUrl(place)} + alt={place.name} + width={imageSize} + height={imageSize} + /> + ); +} +``` + +```js + +``` + +```js +export const places = [ + { + id: 0, + name: "Bo-Kaap in Cape Town, South Africa", + description: + "The tradition of choosing bright colors for houses began in the late 20th century.", + imageId: "K9HVAGH", + }, + { + id: 1, + name: "Rainbow Village in Taichung, Taiwan", + description: + "To save the houses from demolition, Huang Yung-Fu, a local resident, painted all 1,200 of them in 1924.", + imageId: "9EAYZrt", + }, + { + id: 2, + name: "Macromural de Pachuca, Mexico", + description: + "One of the largest murals in the world covering homes in a hillside neighborhood.", + imageId: "DgXHVwu", + }, + { + id: 3, + name: "Selarón Staircase in Rio de Janeiro, Brazil", + description: + 'This landmark was created by Jorge Selarón, a Chilean-born artist, as a "tribute to the Brazilian people."', + imageId: "aeO3rpI", + }, + { + id: 4, + name: "Burano, Italy", + description: + "The houses are painted following a specific color system dating back to 16th century.", + imageId: "kxsph5C", + }, + { + id: 5, + name: "Chefchaouen, Marocco", + description: + "There are a few theories on why the houses are painted blue, including that the color repells mosquitos or that it symbolizes sky and heaven.", + imageId: "rTqKo46", + }, + { + id: 6, + name: "Gamcheon Culture Village in Busan, South Korea", + description: + "In 2009, the village was converted into a cultural hub by painting the houses and featuring exhibitions and art installations.", + imageId: "ZfQOOzf", + }, +]; +``` + +```js +export function getImageUrl(place) { + return "https://i.imgur.com/" + place.imageId + "l.jpg"; +} +``` + +```css +ul { + list-style-type: none; + padding: 0px 10px; +} +li { + margin-bottom: 10px; + display: grid; + grid-template-columns: auto 1fr; + gap: 20px; + align-items: center; +} +``` + +<Solution> + +Remove `imageSize` prop from all the components. + +Create and export `ImageSizeContext` from `Context.js`. Then wrap the List into `<ImageSizeContext.Provider value={imageSize}>` to pass the value down, and `useContext(ImageSizeContext)` to read it in the `PlaceImage`: + +```js +import { useState, useContext } from "react"; +import { places } from "./data.js"; +import { getImageUrl } from "./utils.js"; +import { ImageSizeContext } from "./Context.js"; + +export default function App() { + const [isLarge, setIsLarge] = useState(false); + const imageSize = isLarge ? 150 : 100; + return ( + <ImageSizeContext.Provider value={imageSize}> + <label> + <input + type="checkbox" + checked={isLarge} + onChange={(e) => { + setIsLarge(e.target.checked); + }} + /> + Use large images + </label> + <hr /> + <List /> + </ImageSizeContext.Provider> + ); +} + +function List() { + const listItems = places.map((place) => ( + <li key={place.id}> + <Place place={place} /> + </li> + )); + return <ul>{listItems}</ul>; +} + +function Place({ place }) { + return ( + <> + <PlaceImage place={place} /> + <p> + <b>{place.name}</b> + {": " + place.description} + </p> + </> + ); +} + +function PlaceImage({ place }) { + const imageSize = useContext(ImageSizeContext); + return ( + <img + src={getImageUrl(place)} + alt={place.name} + width={imageSize} + height={imageSize} + /> + ); +} +``` + +```js +import { createContext } from "react"; + +export const ImageSizeContext = createContext(500); +``` + +```js +export const places = [ + { + id: 0, + name: "Bo-Kaap in Cape Town, South Africa", + description: + "The tradition of choosing bright colors for houses began in the late 20th century.", + imageId: "K9HVAGH", + }, + { + id: 1, + name: "Rainbow Village in Taichung, Taiwan", + description: + "To save the houses from demolition, Huang Yung-Fu, a local resident, painted all 1,200 of them in 1924.", + imageId: "9EAYZrt", + }, + { + id: 2, + name: "Macromural de Pachuca, Mexico", + description: + "One of the largest murals in the world covering homes in a hillside neighborhood.", + imageId: "DgXHVwu", + }, + { + id: 3, + name: "Selarón Staircase in Rio de Janeiro, Brazil", + description: + 'This landmark was created by Jorge Selarón, a Chilean-born artist, as a "tribute to the Brazilian people".', + imageId: "aeO3rpI", + }, + { + id: 4, + name: "Burano, Italy", + description: + "The houses are painted following a specific color system dating back to 16th century.", + imageId: "kxsph5C", + }, + { + id: 5, + name: "Chefchaouen, Marocco", + description: + "There are a few theories on why the houses are painted blue, including that the color repells mosquitos or that it symbolizes sky and heaven.", + imageId: "rTqKo46", + }, + { + id: 6, + name: "Gamcheon Culture Village in Busan, South Korea", + description: + "In 2009, the village was converted into a cultural hub by painting the houses and featuring exhibitions and art installations.", + imageId: "ZfQOOzf", + }, +]; +``` + +```js +export function getImageUrl(place) { + return "https://i.imgur.com/" + place.imageId + "l.jpg"; +} +``` + +```css +ul { + list-style-type: none; + padding: 0px 10px; +} +li { + margin-bottom: 10px; + display: grid; + grid-template-columns: auto 1fr; + gap: 20px; + align-items: center; +} +``` + +Note how components in the middle don't need to pass `imageSize` anymore. + +</Solution> + +</Challenges> diff --git a/docs/src/learn/passing-props-to-a-component.md b/docs/src/learn/passing-props-to-a-component.md new file mode 100644 index 000000000..a73f09ed2 --- /dev/null +++ b/docs/src/learn/passing-props-to-a-component.md @@ -0,0 +1,1080 @@ +--- +title: Passing Props to a Component 🚧 +--- + +## Overview + +<p class="intro" markdown> + +React components use _props_ to communicate with each other. Every parent component can pass some information to its child components by giving them props. Props might remind you of HTML attributes, but you can pass any JavaScript value through them, including objects, arrays, and functions. + +</p> + +!!! summary "You Will Learn" + + - How to pass props to a component + - How to read props from a component + - How to specify default values for props + - How to pass some JSX to a component + - How props change over time + +## Familiar props + +Props are the information that you pass to a JSX tag. For example, `className`, `src`, `alt`, `width`, and `height` are some of the props you can pass to an `<img>`: + +```js +function Avatar() { + return ( + <img + className="avatar" + src="https://i.imgur.com/1bX5QH6.jpg" + alt="Lin Lanying" + width={100} + height={100} + /> + ); +} + +export default function Profile() { + return <Avatar />; +} +``` + +```css +body { + min-height: 120px; +} +.avatar { + margin: 20px; + border-radius: 50%; +} +``` + +The props you can pass to an `<img>` tag are predefined (ReactDOM conforms to [the HTML standard](https://www.w3.org/TR/html52/semantics-embedded-content.html#the-img-element)). But you can pass any props to _your own_ components, such as `<Avatar>`, to customize them. Here's how! + +## Passing props to a component + +In this code, the `Profile` component isn't passing any props to its child component, `Avatar`: + +```js +export default function Profile() { + return <Avatar />; +} +``` + +You can give `Avatar` some props in two steps. + +### Step 1: Pass props to the child component + +First, pass some props to `Avatar`. For example, let's pass two props: `person` (an object), and `size` (a number): + +```js +export default function Profile() { + return ( + <Avatar + person={{ name: "Lin Lanying", imageId: "1bX5QH6" }} + size={100} + /> + ); +} +``` + +<Note> + +If double curly braces after `person=` confuse you, recall [they're merely an object](/learn/javascript-in-jsx-with-curly-braces#using-double-curlies-css-and-other-objects-in-jsx) inside the JSX curlies. + +</Note> + +Now you can read these props inside the `Avatar` component. + +### Step 2: Read props inside the child component + +You can read these props by listing their names `person, size` separated by the commas inside `({` and `})` directly after `function Avatar`. This lets you use them inside the `Avatar` code, like you would with a variable. + +```js +function Avatar({ person, size }) { + // person and size are available here +} +``` + +Add some logic to `Avatar` that uses the `person` and `size` props for rendering, and you're done. + +Now you can configure `Avatar` to render in many different ways with different props. Try tweaking the values! + +```js +import { getImageUrl } from "./utils.js"; + +function Avatar({ person, size }) { + return ( + <img + className="avatar" + src={getImageUrl(person)} + alt={person.name} + width={size} + height={size} + /> + ); +} + +export default function Profile() { + return ( + <div> + <Avatar + size={100} + person={{ + name: "Katsuko Saruhashi", + imageId: "YfeOqp2", + }} + /> + <Avatar + size={80} + person={{ + name: "Aklilu Lemma", + imageId: "OKS67lh", + }} + /> + <Avatar + size={50} + person={{ + name: "Lin Lanying", + imageId: "1bX5QH6", + }} + /> + </div> + ); +} +``` + +```js +export function getImageUrl(person, size = "s") { + return "https://i.imgur.com/" + person.imageId + size + ".jpg"; +} +``` + +```css +body { + min-height: 120px; +} +.avatar { + margin: 10px; + border-radius: 50%; +} +``` + +Props let you think about parent and child components independently. For example, you can change the `person` or the `size` props inside `Profile` without having to think about how `Avatar` uses them. Similarly, you can change how the `Avatar` uses these props, without looking at the `Profile`. + +You can think of props like "knobs" that you can adjust. They serve the same role as arguments serve for functions—in fact, props _are_ the only argument to your component! React component functions accept a single argument, a `props` object: + +```js +function Avatar(props) { + let person = props.person; + let size = props.size; + // ... +} +``` + +Usually you don't need the whole `props` object itself, so you destructure it into individual props. + +<Pitfall> + +**Don't miss the pair of `{` and `}` curlies** inside of `(` and `)` when declaring props: + +```js +function Avatar({ person, size }) { + // ... +} +``` + +This syntax is called ["destructuring"](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Unpacking_fields_from_objects_passed_as_a_function_parameter) and is equivalent to reading properties from a function parameter: + +```js +function Avatar(props) { + let person = props.person; + let size = props.size; + // ... +} +``` + +</Pitfall> + +## Specifying a default value for a prop + +If you want to give a prop a default value to fall back on when no value is specified, you can do it with the destructuring by putting `=` and the default value right after the parameter: + +```js +function Avatar({ person, size = 100 }) { + // ... +} +``` + +Now, if `<Avatar person={...} />` is rendered with no `size` prop, the `size` will be set to `100`. + +The default value is only used if the `size` prop is missing or if you pass `size={undefined}`. But if you pass `size={null}` or `size={0}`, the default value will **not** be used. + +## Forwarding props with the JSX spread syntax + +Sometimes, passing props gets very repetitive: + +```js +function Profile({ person, size, isSepia, thickBorder }) { + return ( + <div className="card"> + <Avatar + person={person} + size={size} + isSepia={isSepia} + thickBorder={thickBorder} + /> + </div> + ); +} +``` + +There's nothing wrong with repetitive code—it can be more legible. But at times you may value conciseness. Some components forward all of their props to their children, like how this `Profile` does with `Avatar`. Because they don't use any of their props directly, it can make sense to use a more concise "spread" syntax: + +```js +function Profile(props) { + return ( + <div className="card"> + <Avatar {...props} /> + </div> + ); +} +``` + +This forwards all of `Profile`'s props to the `Avatar` without listing each of their names. + +**Use spread syntax with restraint.** If you're using it in every other component, something is wrong. Often, it indicates that you should split your components and pass children as JSX. More on that next! + +## Passing JSX as children + +It is common to nest built-in browser tags: + +```js +<div> + <img /> +</div> +``` + +Sometimes you'll want to nest your own components the same way: + +```js +<Card> + <Avatar /> +</Card> +``` + +When you nest content inside a JSX tag, the parent component will receive that content in a prop called `children`. For example, the `Card` component below will receive a `children` prop set to `<Avatar />` and render it in a wrapper div: + +```js +import Avatar from "./Avatar.js"; + +function Card({ children }) { + return <div className="card">{children}</div>; +} + +export default function Profile() { + return ( + <Card> + <Avatar + size={100} + person={{ + name: "Katsuko Saruhashi", + imageId: "YfeOqp2", + }} + /> + </Card> + ); +} +``` + +```js +import { getImageUrl } from "./utils.js"; + +export default function Avatar({ person, size }) { + return ( + <img + className="avatar" + src={getImageUrl(person)} + alt={person.name} + width={size} + height={size} + /> + ); +} +``` + +```js +export function getImageUrl(person, size = "s") { + return "https://i.imgur.com/" + person.imageId + size + ".jpg"; +} +``` + +```css +.card { + width: fit-content; + margin: 5px; + padding: 5px; + font-size: 20px; + text-align: center; + border: 1px solid #aaa; + border-radius: 20px; + background: #fff; +} +.avatar { + margin: 20px; + border-radius: 50%; +} +``` + +Try replacing the `<Avatar>` inside `<Card>` with some text to see how the `Card` component can wrap any nested content. It doesn't need to "know" what's being rendered inside of it. You will see this flexible pattern in many places. + +You can think of a component with a `children` prop as having a "hole" that can be "filled in" by its parent components with arbitrary JSX. You will often use the `children` prop for visual wrappers: panels, grids, etc. + +<Illustration src="/images/docs/illustrations/i_children-prop.png" alt='A puzzle-like Card tile with a slot for "children" pieces like text and Avatar' /> + +## How props change over time + +The `Clock` component below receives two props from its parent component: `color` and `time`. (The parent component's code is omitted because it uses [state](/learn/state-a-components-memory), which we won't dive into just yet.) + +Try changing the color in the select box below: + +```js +export default function Clock({ color, time }) { + return <h1 style={{ color: color }}>{time}</h1>; +} +``` + +```js +import { useState, useEffect } from "react"; +import Clock from "./Clock.js"; + +function useTime() { + const [time, setTime] = useState(() => new Date()); + useEffect(() => { + const id = setInterval(() => { + setTime(new Date()); + }, 1000); + return () => clearInterval(id); + }, []); + return time; +} + +export default function App() { + const time = useTime(); + const [color, setColor] = useState("lightcoral"); + return ( + <div> + <p> + Pick a color:{" "} + <select + value={color} + onChange={(e) => setColor(e.target.value)} + > + <option value="lightcoral">lightcoral</option> + <option value="midnightblue">midnightblue</option> + <option value="rebeccapurple">rebeccapurple</option> + </select> + </p> + <Clock color={color} time={time.toLocaleTimeString()} /> + </div> + ); +} +``` + +This example illustrates that **a component may receive different props over time.** Props are not always static! Here, the `time` prop changes every second, and the `color` prop changes when you select another color. Props reflect a component's data at any point in time, rather than only in the beginning. + +However, props are [immutable](https://en.wikipedia.org/wiki/Immutable_object)—a term from computer science meaning "unchangeable". When a component needs to change its props (for example, in response to a user interaction or new data), it will have to "ask" its parent component to pass it _different props_—a new object! Its old props will then be cast aside, and eventually the JavaScript engine will reclaim the memory taken by them. + +**Don't try to "change props".** When you need to respond to the user input (like changing the selected color), you will need to "set state", which you can learn about in [State: A Component's Memory.](/learn/state-a-components-memory) + +<Recap> + +- To pass props, add them to the JSX, just like you would with HTML attributes. +- To read props, use the `function Avatar({ person, size })` destructuring syntax. +- You can specify a default value like `size = 100`, which is used for missing and `undefined` props. +- You can forward all props with `<Avatar {...props} />` JSX spread syntax, but don't overuse it! +- Nested JSX like `<Card><Avatar /></Card>` will appear as `Card` component's `children` prop. +- Props are read-only snapshots in time: every render receives a new version of props. +- You can't change props. When you need interactivity, you'll need to set state. + +</Recap> + +<Challenges> + +#### Extract a component + +This `Gallery` component contains some very similar markup for two profiles. Extract a `Profile` component out of it to reduce the duplication. You'll need to choose what props to pass to it. + +```js +import { getImageUrl } from "./utils.js"; + +export default function Gallery() { + return ( + <div> + <h1>Notable Scientists</h1> + <section className="profile"> + <h2>Maria Skłodowska-Curie</h2> + <img + className="avatar" + src={getImageUrl("szV5sdG")} + alt="Maria Skłodowska-Curie" + width={70} + height={70} + /> + <ul> + <li> + <b>Profession: </b> + physicist and chemist + </li> + <li> + <b>Awards: 4 </b> + (Nobel Prize in Physics, Nobel Prize in Chemistry, Davy Medal, + Matteucci Medal) + </li> + <li> + <b>Discovered: </b> + polonium (element) + </li> + </ul> + </section> + <section className="profile"> + <h2>Katsuko Saruhashi</h2> + <img + className="avatar" + src={getImageUrl("YfeOqp2")} + alt="Katsuko Saruhashi" + width={70} + height={70} + /> + <ul> + <li> + <b>Profession: </b> + geochemist + </li> + <li> + <b>Awards: 2 </b> + (Miyake Prize for geochemistry, Tanaka Prize) + </li> + <li> + <b>Discovered: </b>a method for measuring carbon dioxide + in seawater + </li> + </ul> + </section> + </div> + ); +} +``` + +```js +export function getImageUrl(imageId, size = "s") { + return "https://i.imgur.com/" + imageId + size + ".jpg"; +} +``` + +```css +.avatar { + margin: 5px; + border-radius: 50%; + min-height: 70px; +} +.profile { + border: 1px solid #aaa; + border-radius: 6px; + margin-top: 20px; + padding: 10px; +} +h1, +h2 { + margin: 5px; +} +h1 { + margin-bottom: 10px; +} +ul { + padding: 0px 10px 0px 20px; +} +li { + margin: 5px; +} +``` + +<Hint> + +Start by extracting the markup for one of the scientists. Then find the pieces that don't match it in the second example, and make them configurable by props. + +</Hint> + +<Solution> + +In this solution, the `Profile` component accepts multiple props: `imageId` (a string), `name` (a string), `profession` (a string), `awards` (an array of strings), `discovery` (a string), and `imageSize` (a number). + +Note that the `imageSize` prop has a default value, which is why we don't pass it to the component. + +```js +import { getImageUrl } from "./utils.js"; + +function Profile({ + imageId, + name, + profession, + awards, + discovery, + imageSize = 70, +}) { + return ( + <section className="profile"> + <h2>{name}</h2> + <img + className="avatar" + src={getImageUrl(imageId)} + alt={name} + width={imageSize} + height={imageSize} + /> + <ul> + <li> + <b>Profession:</b> {profession} + </li> + <li> + <b>Awards: {awards.length} </b>({awards.join(", ")}) + </li> + <li> + <b>Discovered: </b> + {discovery} + </li> + </ul> + </section> + ); +} + +export default function Gallery() { + return ( + <div> + <h1>Notable Scientists</h1> + <Profile + imageId="szV5sdG" + name="Maria Skłodowska-Curie" + profession="physicist and chemist" + discovery="polonium (chemical element)" + awards={[ + "Nobel Prize in Physics", + "Nobel Prize in Chemistry", + "Davy Medal", + "Matteucci Medal", + ]} + /> + <Profile + imageId="YfeOqp2" + name="Katsuko Saruhashi" + profession="geochemist" + discovery="a method for measuring carbon dioxide in seawater" + awards={["Miyake Prize for geochemistry", "Tanaka Prize"]} + /> + </div> + ); +} +``` + +```js +export function getImageUrl(imageId, size = "s") { + return "https://i.imgur.com/" + imageId + size + ".jpg"; +} +``` + +```css +.avatar { + margin: 5px; + border-radius: 50%; + min-height: 70px; +} +.profile { + border: 1px solid #aaa; + border-radius: 6px; + margin-top: 20px; + padding: 10px; +} +h1, +h2 { + margin: 5px; +} +h1 { + margin-bottom: 10px; +} +ul { + padding: 0px 10px 0px 20px; +} +li { + margin: 5px; +} +``` + +Note how you don't need a separate `awardCount` prop if `awards` is an array. Then you can use `awards.length` to count the number of awards. Remember that props can take any values, and that includes arrays too! + +Another solution, which is more similar to the earlier examples on this page, is to group all information about a person in a single object, and pass that object as one prop: + +```js +import { getImageUrl } from "./utils.js"; + +function Profile({ person, imageSize = 70 }) { + const imageSrc = getImageUrl(person); + + return ( + <section className="profile"> + <h2>{person.name}</h2> + <img + className="avatar" + src={imageSrc} + alt={person.name} + width={imageSize} + height={imageSize} + /> + <ul> + <li> + <b>Profession:</b> {person.profession} + </li> + <li> + <b>Awards: {person.awards.length} </b>( + {person.awards.join(", ")}) + </li> + <li> + <b>Discovered: </b> + {person.discovery} + </li> + </ul> + </section> + ); +} + +export default function Gallery() { + return ( + <div> + <h1>Notable Scientists</h1> + <Profile + person={{ + imageId: "szV5sdG", + name: "Maria Skłodowska-Curie", + profession: "physicist and chemist", + discovery: "polonium (chemical element)", + awards: [ + "Nobel Prize in Physics", + "Nobel Prize in Chemistry", + "Davy Medal", + "Matteucci Medal", + ], + }} + /> + <Profile + person={{ + imageId: "YfeOqp2", + name: "Katsuko Saruhashi", + profession: "geochemist", + discovery: + "a method for measuring carbon dioxide in seawater", + awards: ["Miyake Prize for geochemistry", "Tanaka Prize"], + }} + /> + </div> + ); +} +``` + +```js +export function getImageUrl(person, size = "s") { + return "https://i.imgur.com/" + person.imageId + size + ".jpg"; +} +``` + +```css +.avatar { + margin: 5px; + border-radius: 50%; + min-height: 70px; +} +.profile { + border: 1px solid #aaa; + border-radius: 6px; + margin-top: 20px; + padding: 10px; +} +h1, +h2 { + margin: 5px; +} +h1 { + margin-bottom: 10px; +} +ul { + padding: 0px 10px 0px 20px; +} +li { + margin: 5px; +} +``` + +Although the syntax looks slightly different because you're describing properties of a JavaScript object rather than a collection of JSX attributes, these examples are mostly equivalent, and you can pick either approach. + +</Solution> + +#### Adjust the image size based on a prop + +In this example, `Avatar` receives a numeric `size` prop which determines the `<img>` width and height. The `size` prop is set to `40` in this example. However, if you open the image in a new tab, you'll notice that the image itself is larger (`160` pixels). The real image size is determined by which thumbnail size you're requesting. + +Change the `Avatar` component to request the closest image size based on the `size` prop. Specifically, if the `size` is less than `90`, pass `'s'` ("small") rather than `'b'` ("big") to the `getImageUrl` function. Verify that your changes work by rendering avatars with different values of the `size` prop and opening images in a new tab. + +```js +import { getImageUrl } from "./utils.js"; + +function Avatar({ person, size }) { + return ( + <img + className="avatar" + src={getImageUrl(person, "b")} + alt={person.name} + width={size} + height={size} + /> + ); +} + +export default function Profile() { + return ( + <Avatar + size={40} + person={{ + name: "Gregorio Y. Zara", + imageId: "7vQD0fP", + }} + /> + ); +} +``` + +```js +export function getImageUrl(person, size) { + return "https://i.imgur.com/" + person.imageId + size + ".jpg"; +} +``` + +```css +.avatar { + margin: 20px; + border-radius: 50%; +} +``` + +<Solution> + +Here is how you could go about it: + +```js +import { getImageUrl } from "./utils.js"; + +function Avatar({ person, size }) { + let thumbnailSize = "s"; + if (size > 90) { + thumbnailSize = "b"; + } + return ( + <img + className="avatar" + src={getImageUrl(person, thumbnailSize)} + alt={person.name} + width={size} + height={size} + /> + ); +} + +export default function Profile() { + return ( + <> + <Avatar + size={40} + person={{ + name: "Gregorio Y. Zara", + imageId: "7vQD0fP", + }} + /> + <Avatar + size={120} + person={{ + name: "Gregorio Y. Zara", + imageId: "7vQD0fP", + }} + /> + </> + ); +} +``` + +```js +export function getImageUrl(person, size) { + return "https://i.imgur.com/" + person.imageId + size + ".jpg"; +} +``` + +```css +.avatar { + margin: 20px; + border-radius: 50%; +} +``` + +You could also show a sharper image for high DPI screens by taking [`window.devicePixelRatio`](https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio) into account: + +```js +import { getImageUrl } from "./utils.js"; + +const ratio = window.devicePixelRatio; + +function Avatar({ person, size }) { + let thumbnailSize = "s"; + if (size * ratio > 90) { + thumbnailSize = "b"; + } + return ( + <img + className="avatar" + src={getImageUrl(person, thumbnailSize)} + alt={person.name} + width={size} + height={size} + /> + ); +} + +export default function Profile() { + return ( + <> + <Avatar + size={40} + person={{ + name: "Gregorio Y. Zara", + imageId: "7vQD0fP", + }} + /> + <Avatar + size={70} + person={{ + name: "Gregorio Y. Zara", + imageId: "7vQD0fP", + }} + /> + <Avatar + size={120} + person={{ + name: "Gregorio Y. Zara", + imageId: "7vQD0fP", + }} + /> + </> + ); +} +``` + +```js +export function getImageUrl(person, size) { + return "https://i.imgur.com/" + person.imageId + size + ".jpg"; +} +``` + +```css +.avatar { + margin: 20px; + border-radius: 50%; +} +``` + +Props let you encapsulate logic like this inside the `Avatar` component (and change it later if needed) so that everyone can use the `<Avatar>` component without thinking about how the images are requested and resized. + +</Solution> + +#### Passing JSX in a `children` prop + +Extract a `Card` component from the markup below, and use the `children` prop to pass different JSX to it: + +```js +export default function Profile() { + return ( + <div> + <div className="card"> + <div className="card-content"> + <h1>Photo</h1> + <img + className="avatar" + src="https://i.imgur.com/OKS67lhm.jpg" + alt="Aklilu Lemma" + width={70} + height={70} + /> + </div> + </div> + <div className="card"> + <div className="card-content"> + <h1>About</h1> + <p> + Aklilu Lemma was a distinguished Ethiopian scientist who + discovered a natural treatment to schistosomiasis. + </p> + </div> + </div> + </div> + ); +} +``` + +```css +.card { + width: fit-content; + margin: 20px; + padding: 20px; + border: 1px solid #aaa; + border-radius: 20px; + background: #fff; +} +.card-content { + text-align: center; +} +.avatar { + margin: 10px; + border-radius: 50%; +} +h1 { + margin: 5px; + padding: 0; + font-size: 24px; +} +``` + +<Hint> + +Any JSX you put inside of a component's tag will be passed as the `children` prop to that component. + +</Hint> + +<Solution> + +This is how you can use the `Card` component in both places: + +```js +function Card({ children }) { + return ( + <div className="card"> + <div className="card-content">{children}</div> + </div> + ); +} + +export default function Profile() { + return ( + <div> + <Card> + <h1>Photo</h1> + <img + className="avatar" + src="https://i.imgur.com/OKS67lhm.jpg" + alt="Aklilu Lemma" + width={100} + height={100} + /> + </Card> + <Card> + <h1>About</h1> + <p> + Aklilu Lemma was a distinguished Ethiopian scientist who + discovered a natural treatment to schistosomiasis. + </p> + </Card> + </div> + ); +} +``` + +```css +.card { + width: fit-content; + margin: 20px; + padding: 20px; + border: 1px solid #aaa; + border-radius: 20px; + background: #fff; +} +.card-content { + text-align: center; +} +.avatar { + margin: 10px; + border-radius: 50%; +} +h1 { + margin: 5px; + padding: 0; + font-size: 24px; +} +``` + +You can also make `title` a separate prop if you want every `Card` to always have a title: + +```js +function Card({ children, title }) { + return ( + <div className="card"> + <div className="card-content"> + <h1>{title}</h1> + {children} + </div> + </div> + ); +} + +export default function Profile() { + return ( + <div> + <Card title="Photo"> + <img + className="avatar" + src="https://i.imgur.com/OKS67lhm.jpg" + alt="Aklilu Lemma" + width={100} + height={100} + /> + </Card> + <Card title="About"> + <p> + Aklilu Lemma was a distinguished Ethiopian scientist who + discovered a natural treatment to schistosomiasis. + </p> + </Card> + </div> + ); +} +``` + +```css +.card { + width: fit-content; + margin: 20px; + padding: 20px; + border: 1px solid #aaa; + border-radius: 20px; + background: #fff; +} +.card-content { + text-align: center; +} +.avatar { + margin: 10px; + border-radius: 50%; +} +h1 { + margin: 5px; + padding: 0; + font-size: 24px; +} +``` + +</Solution> + +</Challenges> diff --git a/docs/src/learn/preserving-and-resetting-state.md b/docs/src/learn/preserving-and-resetting-state.md new file mode 100644 index 000000000..23e5f64ca --- /dev/null +++ b/docs/src/learn/preserving-and-resetting-state.md @@ -0,0 +1,2027 @@ +--- +title: Preserving and Resetting State 🚧 +--- + +## Overview + +<p class="intro" markdown> + +State is isolated between components. React keeps track of which state belongs to which component based on their place in the UI tree. You can control when to preserve state and when to reset it between re-renders. + +</p> + +!!! summary "You Will Learn" + + - How React "sees" component structures + - When React chooses to preserve or reset the state + - How to force React to reset component's state + - How keys and types affect whether the state is preserved + +## The UI tree + +Browsers use many tree structures to model UI. The [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model/Introduction) represents HTML elements, the [CSSOM](https://developer.mozilla.org/docs/Web/API/CSS_Object_Model) does the same for CSS. There's even an [Accessibility tree](https://developer.mozilla.org/docs/Glossary/Accessibility_tree)! + +React also uses tree structures to manage and model the UI you make. React makes **UI trees** from your JSX. Then React DOM updates the browser DOM elements to match that UI tree. (React Native translates these trees into elements specific to mobile platforms.) + +<!-- TODO: Diagram --> + +## State is tied to a position in the tree + +When you give a component state, you might think the state "lives" inside the component. But the state is actually held inside React. React associates each piece of state it's holding with the correct component by where that component sits in the UI tree. + +Here, there is only one `<Counter />` JSX tag, but it's rendered at two different positions: + +```js +import { useState } from "react"; + +export default function App() { + const counter = <Counter />; + return ( + <div> + {counter} + {counter} + </div> + ); +} + +function Counter() { + const [score, setScore] = useState(0); + const [hover, setHover] = useState(false); + + let className = "counter"; + if (hover) { + className += " hover"; + } + + return ( + <div + className={className} + onPointerEnter={() => setHover(true)} + onPointerLeave={() => setHover(false)} + > + <h1>{score}</h1> + <button on_click={() => setScore(score + 1)}>Add one</button> + </div> + ); +} +``` + +```css +label { + display: block; + clear: both; +} + +.counter { + width: 100px; + text-align: center; + border: 1px solid gray; + border-radius: 4px; + padding: 20px; + margin: 0 20px 20px 0; + float: left; +} + +.hover { + background: #ffffd8; +} +``` + +Here's how these look as a tree: + +<!-- TODO: Diagram --> + +**These are two separate counters because each is rendered at its own position in the tree.** You don't usually have to think about these positions to use React, but it can be useful to understand how it works. + +In React, each component on the screen has fully isolated state. For example, if you render two `Counter` components side by side, each of them will get its own, independent, `score` and `hover` states. + +Try clicking both counters and notice they don't affect each other: + +```js +import { useState } from "react"; + +export default function App() { + return ( + <div> + <Counter /> + <Counter /> + </div> + ); +} + +function Counter() { + const [score, setScore] = useState(0); + const [hover, setHover] = useState(false); + + let className = "counter"; + if (hover) { + className += " hover"; + } + + return ( + <div + className={className} + onPointerEnter={() => setHover(true)} + onPointerLeave={() => setHover(false)} + > + <h1>{score}</h1> + <button on_click={() => setScore(score + 1)}>Add one</button> + </div> + ); +} +``` + +```css +.counter { + width: 100px; + text-align: center; + border: 1px solid gray; + border-radius: 4px; + padding: 20px; + margin: 0 20px 20px 0; + float: left; +} + +.hover { + background: #ffffd8; +} +``` + +As you can see, when one counter is updated, only the state for that component is updated: + +<!-- TODO: Diagram --> + +React will keep the state around for as long as you render the same component at the same position. To see this, increment both counters, then remove the second component by unchecking "Render the second counter" checkbox, and then add it back by ticking it again: + +```js +import { useState } from "react"; + +export default function App() { + const [showB, setShowB] = useState(true); + return ( + <div> + <Counter /> + {showB && <Counter />} + <label> + <input + type="checkbox" + checked={showB} + onChange={(e) => { + setShowB(e.target.checked); + }} + /> + Render the second counter + </label> + </div> + ); +} + +function Counter() { + const [score, setScore] = useState(0); + const [hover, setHover] = useState(false); + + let className = "counter"; + if (hover) { + className += " hover"; + } + + return ( + <div + className={className} + onPointerEnter={() => setHover(true)} + onPointerLeave={() => setHover(false)} + > + <h1>{score}</h1> + <button on_click={() => setScore(score + 1)}>Add one</button> + </div> + ); +} +``` + +```css +label { + display: block; + clear: both; +} + +.counter { + width: 100px; + text-align: center; + border: 1px solid gray; + border-radius: 4px; + padding: 20px; + margin: 0 20px 20px 0; + float: left; +} + +.hover { + background: #ffffd8; +} +``` + +Notice how the moment you stop rendering the second counter, its state disappears completely. That's because when React removes a component, it destroys its state. + +<!-- TODO: Diagram --> + +When you tick "Render the second counter", a second `Counter` and its state are initialized from scratch (`score = 0`) and added to the DOM. + +<!-- TODO: Diagram --> + +**React preserves a component's state for as long as it's being rendered at its position in the UI tree.** If it gets removed, or a different component gets rendered at the same position, React discards its state. + +## Same component at the same position preserves state + +In this example, there are two different `<Counter />` tags: + +```js +import { useState } from "react"; + +export default function App() { + const [isFancy, setIsFancy] = useState(false); + return ( + <div> + {isFancy ? <Counter isFancy={true} /> : <Counter isFancy={false} />} + <label> + <input + type="checkbox" + checked={isFancy} + onChange={(e) => { + setIsFancy(e.target.checked); + }} + /> + Use fancy styling + </label> + </div> + ); +} + +function Counter({ isFancy }) { + const [score, setScore] = useState(0); + const [hover, setHover] = useState(false); + + let className = "counter"; + if (hover) { + className += " hover"; + } + if (isFancy) { + className += " fancy"; + } + + return ( + <div + className={className} + onPointerEnter={() => setHover(true)} + onPointerLeave={() => setHover(false)} + > + <h1>{score}</h1> + <button on_click={() => setScore(score + 1)}>Add one</button> + </div> + ); +} +``` + +```css +label { + display: block; + clear: both; +} + +.counter { + width: 100px; + text-align: center; + border: 1px solid gray; + border-radius: 4px; + padding: 20px; + margin: 0 20px 20px 0; + float: left; +} + +.fancy { + border: 5px solid gold; + color: #ff6767; +} + +.hover { + background: #ffffd8; +} +``` + +When you tick or clear the checkbox, the counter state does not get reset. Whether `isFancy` is `true` or `false`, you always have a `<Counter />` as the first child of the `div` returned from the root `App` component: + +<!-- TODO: Diagram --> + +It's the same component at the same position, so from React's perspective, it's the same counter. + +<Pitfall> + +Remember that **it's the position in the UI tree--not in the JSX markup--that matters to React!** This component has two `return` clauses with different `<Counter />` JSX tags inside and outside the `if`: + +```js +import { useState } from "react"; + +export default function App() { + const [isFancy, setIsFancy] = useState(false); + if (isFancy) { + return ( + <div> + <Counter isFancy={true} /> + <label> + <input + type="checkbox" + checked={isFancy} + onChange={(e) => { + setIsFancy(e.target.checked); + }} + /> + Use fancy styling + </label> + </div> + ); + } + return ( + <div> + <Counter isFancy={false} /> + <label> + <input + type="checkbox" + checked={isFancy} + onChange={(e) => { + setIsFancy(e.target.checked); + }} + /> + Use fancy styling + </label> + </div> + ); +} + +function Counter({ isFancy }) { + const [score, setScore] = useState(0); + const [hover, setHover] = useState(false); + + let className = "counter"; + if (hover) { + className += " hover"; + } + if (isFancy) { + className += " fancy"; + } + + return ( + <div + className={className} + onPointerEnter={() => setHover(true)} + onPointerLeave={() => setHover(false)} + > + <h1>{score}</h1> + <button on_click={() => setScore(score + 1)}>Add one</button> + </div> + ); +} +``` + +```css +label { + display: block; + clear: both; +} + +.counter { + width: 100px; + text-align: center; + border: 1px solid gray; + border-radius: 4px; + padding: 20px; + margin: 0 20px 20px 0; + float: left; +} + +.fancy { + border: 5px solid gold; + color: #ff6767; +} + +.hover { + background: #ffffd8; +} +``` + +You might expect the state to reset when you tick checkbox, but it doesn't! This is because **both of these `<Counter />` tags are rendered at the same position.** React doesn't know where you place the conditions in your function. All it "sees" is the tree you return. + +In both cases, the `App` component returns a `<div>` with `<Counter />` as a first child. To React, these two counters have the same "address": the first child of the first child of the root. This is how React matches them up between the previous and next renders, regardless of how you structure your logic. + +</Pitfall> + +## Different components at the same position reset state + +In this example, ticking the checkbox will replace `<Counter>` with a `<p>`: + +```js +import { useState } from "react"; + +export default function App() { + const [isPaused, setIsPaused] = useState(false); + return ( + <div> + {isPaused ? <p>See you later!</p> : <Counter />} + <label> + <input + type="checkbox" + checked={isPaused} + onChange={(e) => { + setIsPaused(e.target.checked); + }} + /> + Take a break + </label> + </div> + ); +} + +function Counter() { + const [score, setScore] = useState(0); + const [hover, setHover] = useState(false); + + let className = "counter"; + if (hover) { + className += " hover"; + } + + return ( + <div + className={className} + onPointerEnter={() => setHover(true)} + onPointerLeave={() => setHover(false)} + > + <h1>{score}</h1> + <button on_click={() => setScore(score + 1)}>Add one</button> + </div> + ); +} +``` + +```css +label { + display: block; + clear: both; +} + +.counter { + width: 100px; + text-align: center; + border: 1px solid gray; + border-radius: 4px; + padding: 20px; + margin: 0 20px 20px 0; + float: left; +} + +.hover { + background: #ffffd8; +} +``` + +Here, you switch between _different_ component types at the same position. Initially, the first child of the `<div>` contained a `Counter`. But when you swapped in a `p`, React removed the `Counter` from the UI tree and destroyed its state. + +<!-- TODO: Diagram --> + +<!-- TODO: Diagram --> + +Also, **when you render a different component in the same position, it resets the state of its entire subtree.** To see how this works, increment the counter and then tick the checkbox: + +```js +import { useState } from "react"; + +export default function App() { + const [isFancy, setIsFancy] = useState(false); + return ( + <div> + {isFancy ? ( + <div> + <Counter isFancy={true} /> + </div> + ) : ( + <section> + <Counter isFancy={false} /> + </section> + )} + <label> + <input + type="checkbox" + checked={isFancy} + onChange={(e) => { + setIsFancy(e.target.checked); + }} + /> + Use fancy styling + </label> + </div> + ); +} + +function Counter({ isFancy }) { + const [score, setScore] = useState(0); + const [hover, setHover] = useState(false); + + let className = "counter"; + if (hover) { + className += " hover"; + } + if (isFancy) { + className += " fancy"; + } + + return ( + <div + className={className} + onPointerEnter={() => setHover(true)} + onPointerLeave={() => setHover(false)} + > + <h1>{score}</h1> + <button on_click={() => setScore(score + 1)}>Add one</button> + </div> + ); +} +``` + +```css +label { + display: block; + clear: both; +} + +.counter { + width: 100px; + text-align: center; + border: 1px solid gray; + border-radius: 4px; + padding: 20px; + margin: 0 20px 20px 0; + float: left; +} + +.fancy { + border: 5px solid gold; + color: #ff6767; +} + +.hover { + background: #ffffd8; +} +``` + +The counter state gets reset when you click the checkbox. Although you render a `Counter`, the first child of the `div` changes from a `div` to a `section`. When the child `div` was removed from the DOM, the whole tree below it (including the `Counter` and its state) was destroyed as well. + +<!-- TODO: Diagram --> + +<!-- TODO: Diagram --> + +As a rule of thumb, **if you want to preserve the state between re-renders, the structure of your tree needs to "match up"** from one render to another. If the structure is different, the state gets destroyed because React destroys state when it removes a component from the tree. + +<Pitfall> + +This is why you should not nest component function definitions. + +Here, the `MyTextField` component function is defined _inside_ `MyComponent`: + +```js +import { useState } from "react"; + +export default function MyComponent() { + const [counter, setCounter] = useState(0); + + function MyTextField() { + const [text, setText] = useState(""); + + return <input value={text} onChange={(e) => setText(e.target.value)} />; + } + + return ( + <> + <MyTextField /> + <button + on_click={() => { + setCounter(counter + 1); + }} + > + Clicked {counter} times + </button> + </> + ); +} +``` + +Every time you click the button, the input state disappears! This is because a _different_ `MyTextField` function is created for every render of `MyComponent`. You're rendering a _different_ component in the same position, so React resets all state below. This leads to bugs and performance problems. To avoid this problem, **always declare component functions at the top level, and don't nest their definitions.** + +</Pitfall> + +## Resetting state at the same position + +By default, React preserves state of a component while it stays at the same position. Usually, this is exactly what you want, so it makes sense as the default behavior. But sometimes, you may want to reset a component's state. Consider this app that lets two players keep track of their scores during each turn: + +```js +import { useState } from "react"; + +export default function Scoreboard() { + const [isPlayerA, setIsPlayerA] = useState(true); + return ( + <div> + {isPlayerA ? ( + <Counter person="Taylor" /> + ) : ( + <Counter person="Sarah" /> + )} + <button + on_click={() => { + setIsPlayerA(!isPlayerA); + }} + > + Next player! + </button> + </div> + ); +} + +function Counter({ person }) { + const [score, setScore] = useState(0); + const [hover, setHover] = useState(false); + + let className = "counter"; + if (hover) { + className += " hover"; + } + + return ( + <div + className={className} + onPointerEnter={() => setHover(true)} + onPointerLeave={() => setHover(false)} + > + <h1> + {person}'s score: {score} + </h1> + <button on_click={() => setScore(score + 1)}>Add one</button> + </div> + ); +} +``` + +```css +h1 { + font-size: 18px; +} + +.counter { + width: 100px; + text-align: center; + border: 1px solid gray; + border-radius: 4px; + padding: 20px; + margin: 0 20px 20px 0; +} + +.hover { + background: #ffffd8; +} +``` + +Currently, when you change the player, the score is preserved. The two `Counter`s appear in the same position, so React sees them as _the same_ `Counter` whose `person` prop has changed. + +But conceptually, in this app they should be two separate counters. They might appear in the same place in the UI, but one is a counter for Taylor, and another is a counter for Sarah. + +There are two ways to reset state when switching between them: + +1. Render components in different positions +2. Give each component an explicit identity with `key` + +### Option 1: Rendering a component in different positions + +If you want these two `Counter`s to be independent, you can render them in two different positions: + +```js +import { useState } from "react"; + +export default function Scoreboard() { + const [isPlayerA, setIsPlayerA] = useState(true); + return ( + <div> + {isPlayerA && <Counter person="Taylor" />} + {!isPlayerA && <Counter person="Sarah" />} + <button + on_click={() => { + setIsPlayerA(!isPlayerA); + }} + > + Next player! + </button> + </div> + ); +} + +function Counter({ person }) { + const [score, setScore] = useState(0); + const [hover, setHover] = useState(false); + + let className = "counter"; + if (hover) { + className += " hover"; + } + + return ( + <div + className={className} + onPointerEnter={() => setHover(true)} + onPointerLeave={() => setHover(false)} + > + <h1> + {person}'s score: {score} + </h1> + <button on_click={() => setScore(score + 1)}>Add one</button> + </div> + ); +} +``` + +```css +h1 { + font-size: 18px; +} + +.counter { + width: 100px; + text-align: center; + border: 1px solid gray; + border-radius: 4px; + padding: 20px; + margin: 0 20px 20px 0; +} + +.hover { + background: #ffffd8; +} +``` + +- Initially, `isPlayerA` is `true`. So the first position contains `Counter` state, and the second one is empty. +- When you click the "Next player" button the first position clears but the second one now contains a `Counter`. + +<!-- TODO: Diagram --> + +Each `Counter`'s state gets destroyed each time its removed from the DOM. This is why they reset every time you click the button. + +This solution is convenient when you only have a few independent components rendered in the same place. In this example, you only have two, so it's not a hassle to render both separately in the JSX. + +### Option 2: Resetting state with a key + +There is also another, more generic, way to reset a component's state. + +You might have seen `key`s when [rendering lists.](/learn/rendering-lists#keeping-list-items-in-order-with-key) Keys aren't just for lists! You can use keys to make React distinguish between any components. By default, React uses order within the parent ("first counter", "second counter") to discern between components. But keys let you tell React that this is not just a _first_ counter, or a _second_ counter, but a specific counter--for example, _Taylor's_ counter. This way, React will know _Taylor's_ counter wherever it appears in the tree! + +In this example, the two `<Counter />`s don't share state even though they appear in the same place in JSX: + +```js +import { useState } from "react"; + +export default function Scoreboard() { + const [isPlayerA, setIsPlayerA] = useState(true); + return ( + <div> + {isPlayerA ? ( + <Counter key="Taylor" person="Taylor" /> + ) : ( + <Counter key="Sarah" person="Sarah" /> + )} + <button + on_click={() => { + setIsPlayerA(!isPlayerA); + }} + > + Next player! + </button> + </div> + ); +} + +function Counter({ person }) { + const [score, setScore] = useState(0); + const [hover, setHover] = useState(false); + + let className = "counter"; + if (hover) { + className += " hover"; + } + + return ( + <div + className={className} + onPointerEnter={() => setHover(true)} + onPointerLeave={() => setHover(false)} + > + <h1> + {person}'s score: {score} + </h1> + <button on_click={() => setScore(score + 1)}>Add one</button> + </div> + ); +} +``` + +```css +h1 { + font-size: 18px; +} + +.counter { + width: 100px; + text-align: center; + border: 1px solid gray; + border-radius: 4px; + padding: 20px; + margin: 0 20px 20px 0; +} + +.hover { + background: #ffffd8; +} +``` + +Switching between Taylor and Sarah does not preserve the state. This is because **you gave them different `key`s:** + +```js +{ + isPlayerA ? ( + <Counter key="Taylor" person="Taylor" /> + ) : ( + <Counter key="Sarah" person="Sarah" /> + ); +} +``` + +Specifying a `key` tells React to use the `key` itself as part of the position, instead of their order within the parent. This is why, even though you render them in the same place in JSX, React sees them as two different counters, and so they will never share state. Every time a counter appears on the screen, its state is created. Every time it is removed, its state is destroyed. Toggling between them resets their state over and over. + +<Note> + +Remember that keys are not globally unique. They only specify the position _within the parent_. + +</Note> + +### Resetting a form with a key + +Resetting state with a key is particularly useful when dealing with forms. + +In this chat app, the `<Chat>` component contains the text input state: + +```js +import { useState } from "react"; +import Chat from "./Chat.js"; +import ContactList from "./ContactList.js"; + +export default function Messenger() { + const [to, setTo] = useState(contacts[0]); + return ( + <div> + <ContactList + contacts={contacts} + selectedContact={to} + onSelect={(contact) => setTo(contact)} + /> + <Chat contact={to} /> + </div> + ); +} + +const contacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export default function ContactList({ selectedContact, contacts, onSelect }) { + return ( + <section className="contact-list"> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + onSelect(contact); + }} + > + {contact.name} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Chat({ contact }) { + const [text, setText] = useState(""); + return ( + <section className="chat"> + <textarea + value={text} + placeholder={"Chat to " + contact.name} + onChange={(e) => setText(e.target.value)} + /> + <br /> + <button>Send to {contact.email}</button> + </section> + ); +} +``` + +```css +.chat, +.contact-list { + float: left; + margin-bottom: 20px; +} +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li button { + width: 100px; + padding: 10px; + margin-right: 10px; +} +textarea { + height: 150px; +} +``` + +Try entering something into the input, and then press "Alice" or "Bob" to choose a different recipient. You will notice that the input state is preserved because the `<Chat>` is rendered at the same position in the tree. + +**In many apps, this may be the desired behavior, but not in a chat app!** You don't want to let the user send a message they already typed to a wrong person due to an accidental click. To fix it, add a `key`: + +```js +<Chat key={to.id} contact={to} /> +``` + +This ensures that when you select a different recipient, the `Chat` component will be recreated from scratch, including any state in the tree below it. React will also re-create the DOM elements instead of reusing them. + +Now switching the recipient always clears the text field: + +```js +import { useState } from "react"; +import Chat from "./Chat.js"; +import ContactList from "./ContactList.js"; + +export default function Messenger() { + const [to, setTo] = useState(contacts[0]); + return ( + <div> + <ContactList + contacts={contacts} + selectedContact={to} + onSelect={(contact) => setTo(contact)} + /> + <Chat key={to.id} contact={to} /> + </div> + ); +} + +const contacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export default function ContactList({ selectedContact, contacts, onSelect }) { + return ( + <section className="contact-list"> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + onSelect(contact); + }} + > + {contact.name} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Chat({ contact }) { + const [text, setText] = useState(""); + return ( + <section className="chat"> + <textarea + value={text} + placeholder={"Chat to " + contact.name} + onChange={(e) => setText(e.target.value)} + /> + <br /> + <button>Send to {contact.email}</button> + </section> + ); +} +``` + +```css +.chat, +.contact-list { + float: left; + margin-bottom: 20px; +} +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li button { + width: 100px; + padding: 10px; + margin-right: 10px; +} +textarea { + height: 150px; +} +``` + +<DeepDive> + +#### Preserving state for removed components + +In a real chat app, you'd probably want to recover the input state when the user selects the previous recipient again. There are a few ways to keep the state "alive" for a component that's no longer visible: + +- You could render _all_ chats instead of just the current one, but hide all the others with CSS. The chats would not get removed from the tree, so their local state would be preserved. This solution works great for simple UIs. But it can get very slow if the hidden trees are large and contain a lot of DOM nodes. +- You could [lift the state up](/learn/sharing-state-between-components) and hold the pending message for each recipient in the parent component. This way, when the child components get removed, it doesn't matter, because it's the parent that keeps the important information. This is the most common solution. +- You might also use a different source in addition to React state. For example, you probably want a message draft to persist even if the user accidentally closes the page. To implement this, you could have the `Chat` component initialize its state by reading from the [`localStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage), and save the drafts there too. + +No matter which strategy you pick, a chat _with Alice_ is conceptually distinct from a chat _with Bob_, so it makes sense to give a `key` to the `<Chat>` tree based on the current recipient. + +</DeepDive> + +<Recap> + +- React keeps state for as long as the same component is rendered at the same position. +- State is not kept in JSX tags. It's associated with the tree position in which you put that JSX. +- You can force a subtree to reset its state by giving it a different key. +- Don't nest component definitions, or you'll reset state by accident. + +</Recap> + +<Challenges> + +#### Fix disappearing input text + +This example shows a message when you press the button. However, pressing the button also accidentally resets the input. Why does this happen? Fix it so that pressing the button does not reset the input text. + +```js +import { useState } from "react"; + +export default function App() { + const [showHint, setShowHint] = useState(false); + if (showHint) { + return ( + <div> + <p> + <i>Hint: Your favorite city?</i> + </p> + <Form /> + <button + on_click={() => { + setShowHint(false); + }} + > + Hide hint + </button> + </div> + ); + } + return ( + <div> + <Form /> + <button + on_click={() => { + setShowHint(true); + }} + > + Show hint + </button> + </div> + ); +} + +function Form() { + const [text, setText] = useState(""); + return <textarea value={text} onChange={(e) => setText(e.target.value)} />; +} +``` + +```css +textarea { + display: block; + margin: 10px 0; +} +``` + +<Solution> + +The problem is that `Form` is rendered in different positions. In the `if` branch, it is the second child of the `<div>`, but in the `else` branch, it is the first child. Therefore, the component type in each position changes. The first position changes between holding a `p` and a `Form`, while the second position changes between holding a `Form` and a `button`. React resets the state every time the component type changes. + +The easiest solution is to unify the branches so that `Form` always renders in the same position: + +```js +import { useState } from "react"; + +export default function App() { + const [showHint, setShowHint] = useState(false); + return ( + <div> + {showHint && ( + <p> + <i>Hint: Your favorite city?</i> + </p> + )} + <Form /> + {showHint ? ( + <button + on_click={() => { + setShowHint(false); + }} + > + Hide hint + </button> + ) : ( + <button + on_click={() => { + setShowHint(true); + }} + > + Show hint + </button> + )} + </div> + ); +} + +function Form() { + const [text, setText] = useState(""); + return <textarea value={text} onChange={(e) => setText(e.target.value)} />; +} +``` + +```css +textarea { + display: block; + margin: 10px 0; +} +``` + +Technically, you could also add `null` before `<Form />` in the `else` branch to match the `if` branch structure: + +```js +import { useState } from "react"; + +export default function App() { + const [showHint, setShowHint] = useState(false); + if (showHint) { + return ( + <div> + <p> + <i>Hint: Your favorite city?</i> + </p> + <Form /> + <button + on_click={() => { + setShowHint(false); + }} + > + Hide hint + </button> + </div> + ); + } + return ( + <div> + {null} + <Form /> + <button + on_click={() => { + setShowHint(true); + }} + > + Show hint + </button> + </div> + ); +} + +function Form() { + const [text, setText] = useState(""); + return <textarea value={text} onChange={(e) => setText(e.target.value)} />; +} +``` + +```css +textarea { + display: block; + margin: 10px 0; +} +``` + +This way, `Form` is always the second child, so it stays in the same position and keeps its state. But this approach is much less obvious and introduces a risk that someone else will remove that `null`. + +</Solution> + +#### Swap two form fields + +This form lets you enter first and last name. It also has a checkbox controlling which field goes first. When you tick the checkbox, the "Last name" field will appear before the "First name" field. + +It almost works, but there is a bug. If you fill in the "First name" input and tick the checkbox, the text will stay in the first input (which is now "Last name"). Fix it so that the input text _also_ moves when you reverse the order. + +<Hint> + +It seems like for these fields, their position within the parent is not enough. Is there some way to tell React how to match up the state between re-renders? + +</Hint> + +```js +import { useState } from "react"; + +export default function App() { + const [reverse, setReverse] = useState(false); + let checkbox = ( + <label> + <input + type="checkbox" + checked={reverse} + onChange={(e) => setReverse(e.target.checked)} + /> + Reverse order + </label> + ); + if (reverse) { + return ( + <> + <Field label="Last name" /> + <Field label="First name" /> + {checkbox} + </> + ); + } else { + return ( + <> + <Field label="First name" /> + <Field label="Last name" /> + {checkbox} + </> + ); + } +} + +function Field({ label }) { + const [text, setText] = useState(""); + return ( + <label> + {label}:{" "} + <input + type="text" + value={text} + placeholder={label} + onChange={(e) => setText(e.target.value)} + /> + </label> + ); +} +``` + +```css +label { + display: block; + margin: 10px 0; +} +``` + +<Solution> + +Give a `key` to both `<Field>` components in both `if` and `else` branches. This tells React how to "match up" the correct state for either `<Field>` even if their order within the parent changes: + +```js +import { useState } from "react"; + +export default function App() { + const [reverse, setReverse] = useState(false); + let checkbox = ( + <label> + <input + type="checkbox" + checked={reverse} + onChange={(e) => setReverse(e.target.checked)} + /> + Reverse order + </label> + ); + if (reverse) { + return ( + <> + <Field key="lastName" label="Last name" /> + <Field key="firstName" label="First name" /> + {checkbox} + </> + ); + } else { + return ( + <> + <Field key="firstName" label="First name" /> + <Field key="lastName" label="Last name" /> + {checkbox} + </> + ); + } +} + +function Field({ label }) { + const [text, setText] = useState(""); + return ( + <label> + {label}:{" "} + <input + type="text" + value={text} + placeholder={label} + onChange={(e) => setText(e.target.value)} + /> + </label> + ); +} +``` + +```css +label { + display: block; + margin: 10px 0; +} +``` + +</Solution> + +#### Reset a detail form + +This is an editable contact list. You can edit the selected contact's details and then either press "Save" to update it, or "Reset" to undo your changes. + +When you select a different contact (for example, Alice), the state updates but the form keeps showing the previous contact's details. Fix it so that the form gets reset when the selected contact changes. + +```js +import { useState } from "react"; +import ContactList from "./ContactList.js"; +import EditContact from "./EditContact.js"; + +export default function ContactManager() { + const [contacts, setContacts] = useState(initialContacts); + const [selectedId, setSelectedId] = useState(0); + const selectedContact = contacts.find((c) => c.id === selectedId); + + function handleSave(updatedData) { + const nextContacts = contacts.map((c) => { + if (c.id === updatedData.id) { + return updatedData; + } else { + return c; + } + }); + setContacts(nextContacts); + } + + return ( + <div> + <ContactList + contacts={contacts} + selectedId={selectedId} + onSelect={(id) => setSelectedId(id)} + /> + <hr /> + <EditContact initialData={selectedContact} onSave={handleSave} /> + </div> + ); +} + +const initialContacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export default function ContactList({ contacts, selectedId, onSelect }) { + return ( + <section> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + onSelect(contact.id); + }} + > + {contact.id === selectedId ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function EditContact({ initialData, onSave }) { + const [name, setName] = useState(initialData.name); + const [email, setEmail] = useState(initialData.email); + return ( + <section> + <label> + Name:{" "} + <input + type="text" + value={name} + onChange={(e) => setName(e.target.value)} + /> + </label> + <label> + Email:{" "} + <input + type="email" + value={email} + onChange={(e) => setEmail(e.target.value)} + /> + </label> + <button + on_click={() => { + const updatedData = { + id: initialData.id, + name: name, + email: email, + }; + onSave(updatedData); + }} + > + Save + </button> + <button + on_click={() => { + setName(initialData.name); + setEmail(initialData.email); + }} + > + Reset + </button> + </section> + ); +} +``` + +```css +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li { + display: inline-block; +} +li button { + padding: 10px; +} +label { + display: block; + margin: 10px 0; +} +button { + margin-right: 10px; + margin-bottom: 10px; +} +``` + +<Solution> + +Give `key={selectedId}` to the `EditContact` component. This way, switching between different contacts will reset the form: + +```js +import { useState } from "react"; +import ContactList from "./ContactList.js"; +import EditContact from "./EditContact.js"; + +export default function ContactManager() { + const [contacts, setContacts] = useState(initialContacts); + const [selectedId, setSelectedId] = useState(0); + const selectedContact = contacts.find((c) => c.id === selectedId); + + function handleSave(updatedData) { + const nextContacts = contacts.map((c) => { + if (c.id === updatedData.id) { + return updatedData; + } else { + return c; + } + }); + setContacts(nextContacts); + } + + return ( + <div> + <ContactList + contacts={contacts} + selectedId={selectedId} + onSelect={(id) => setSelectedId(id)} + /> + <hr /> + <EditContact + key={selectedId} + initialData={selectedContact} + onSave={handleSave} + /> + </div> + ); +} + +const initialContacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export default function ContactList({ contacts, selectedId, onSelect }) { + return ( + <section> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + onSelect(contact.id); + }} + > + {contact.id === selectedId ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function EditContact({ initialData, onSave }) { + const [name, setName] = useState(initialData.name); + const [email, setEmail] = useState(initialData.email); + return ( + <section> + <label> + Name:{" "} + <input + type="text" + value={name} + onChange={(e) => setName(e.target.value)} + /> + </label> + <label> + Email:{" "} + <input + type="email" + value={email} + onChange={(e) => setEmail(e.target.value)} + /> + </label> + <button + on_click={() => { + const updatedData = { + id: initialData.id, + name: name, + email: email, + }; + onSave(updatedData); + }} + > + Save + </button> + <button + on_click={() => { + setName(initialData.name); + setEmail(initialData.email); + }} + > + Reset + </button> + </section> + ); +} +``` + +```css +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li { + display: inline-block; +} +li button { + padding: 10px; +} +label { + display: block; + margin: 10px 0; +} +button { + margin-right: 10px; + margin-bottom: 10px; +} +``` + +</Solution> + +#### Clear an image while it's loading + +When you press "Next", the browser starts loading the next image. However, because it's displayed in the same `<img>` tag, by default you would still see the previous image until the next one loads. This may be undesirable if it's important for the text to always match the image. Change it so that the moment you press "Next", the previous image immediately clears. + +<Hint> + +Is there a way to tell React to re-create the DOM instead of reusing it? + +</Hint> + +```js +import { useState } from "react"; + +export default function Gallery() { + const [index, setIndex] = useState(0); + const hasNext = index < images.length - 1; + + function handleClick() { + if (hasNext) { + setIndex(index + 1); + } else { + setIndex(0); + } + } + + let image = images[index]; + return ( + <> + <button on_click={handleClick}>Next</button> + <h3> + Image {index + 1} of {images.length} + </h3> + <img src={image.src} /> + <p>{image.place}</p> + </> + ); +} + +let images = [ + { + place: "Penang, Malaysia", + src: "https://i.imgur.com/FJeJR8M.jpg", + }, + { + place: "Lisbon, Portugal", + src: "https://i.imgur.com/dB2LRbj.jpg", + }, + { + place: "Bilbao, Spain", + src: "https://i.imgur.com/z08o2TS.jpg", + }, + { + place: "Valparaíso, Chile", + src: "https://i.imgur.com/Y3utgTi.jpg", + }, + { + place: "Schwyz, Switzerland", + src: "https://i.imgur.com/JBbMpWY.jpg", + }, + { + place: "Prague, Czechia", + src: "https://i.imgur.com/QwUKKmF.jpg", + }, + { + place: "Ljubljana, Slovenia", + src: "https://i.imgur.com/3aIiwfm.jpg", + }, +]; +``` + +```css +img { + width: 150px; + height: 150px; +} +``` + +<Solution> + +You can provide a `key` to the `<img>` tag. When that `key` changes, React will re-create the `<img>` DOM node from scratch. This causes a brief flash when each image loads, so it's not something you'd want to do for every image in your app. But it makes sense if you want to ensure the image always matches the text. + +```js +import { useState } from "react"; + +export default function Gallery() { + const [index, setIndex] = useState(0); + const hasNext = index < images.length - 1; + + function handleClick() { + if (hasNext) { + setIndex(index + 1); + } else { + setIndex(0); + } + } + + let image = images[index]; + return ( + <> + <button on_click={handleClick}>Next</button> + <h3> + Image {index + 1} of {images.length} + </h3> + <img key={image.src} src={image.src} /> + <p>{image.place}</p> + </> + ); +} + +let images = [ + { + place: "Penang, Malaysia", + src: "https://i.imgur.com/FJeJR8M.jpg", + }, + { + place: "Lisbon, Portugal", + src: "https://i.imgur.com/dB2LRbj.jpg", + }, + { + place: "Bilbao, Spain", + src: "https://i.imgur.com/z08o2TS.jpg", + }, + { + place: "Valparaíso, Chile", + src: "https://i.imgur.com/Y3utgTi.jpg", + }, + { + place: "Schwyz, Switzerland", + src: "https://i.imgur.com/JBbMpWY.jpg", + }, + { + place: "Prague, Czechia", + src: "https://i.imgur.com/QwUKKmF.jpg", + }, + { + place: "Ljubljana, Slovenia", + src: "https://i.imgur.com/3aIiwfm.jpg", + }, +]; +``` + +```css +img { + width: 150px; + height: 150px; +} +``` + +</Solution> + +#### Fix misplaced state in the list + +In this list, each `Contact` has state that determines whether "Show email" has been pressed for it. Press "Show email" for Alice, and then tick the "Show in reverse order" checkbox. You will notice that it's _Taylor's_ email that is expanded now, but Alice's--which has moved to the bottom--appears collapsed. + +Fix it so that the expanded state is associated with each contact, regardless of the chosen ordering. + +```js +import { useState } from "react"; +import Contact from "./Contact.js"; + +export default function ContactList() { + const [reverse, setReverse] = useState(false); + + const displayedContacts = [...contacts]; + if (reverse) { + displayedContacts.reverse(); + } + + return ( + <> + <label> + <input + type="checkbox" + value={reverse} + onChange={(e) => { + setReverse(e.target.checked); + }} + />{" "} + Show in reverse order + </label> + <ul> + {displayedContacts.map((contact, i) => ( + <li key={i}> + <Contact contact={contact} /> + </li> + ))} + </ul> + </> + ); +} + +const contacts = [ + { id: 0, name: "Alice", email: "alice@mail.com" }, + { id: 1, name: "Bob", email: "bob@mail.com" }, + { id: 2, name: "Taylor", email: "taylor@mail.com" }, +]; +``` + +```js +import { useState } from "react"; + +export default function Contact({ contact }) { + const [expanded, setExpanded] = useState(false); + return ( + <> + <p> + <b>{contact.name}</b> + </p> + {expanded && ( + <p> + <i>{contact.email}</i> + </p> + )} + <button + on_click={() => { + setExpanded(!expanded); + }} + > + {expanded ? "Hide" : "Show"} email + </button> + </> + ); +} +``` + +```css +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li { + margin-bottom: 20px; +} +label { + display: block; + margin: 10px 0; +} +button { + margin-right: 10px; + margin-bottom: 10px; +} +``` + +<Solution> + +The problem is that this example was using index as a `key`: + +```js +{displayedContacts.map((contact, i) => + <li key={i}> +``` + +However, you want the state to be associated with _each particular contact_. + +Using the contact ID as a `key` instead fixes the issue: + +```js +import { useState } from "react"; +import Contact from "./Contact.js"; + +export default function ContactList() { + const [reverse, setReverse] = useState(false); + + const displayedContacts = [...contacts]; + if (reverse) { + displayedContacts.reverse(); + } + + return ( + <> + <label> + <input + type="checkbox" + value={reverse} + onChange={(e) => { + setReverse(e.target.checked); + }} + />{" "} + Show in reverse order + </label> + <ul> + {displayedContacts.map((contact) => ( + <li key={contact.id}> + <Contact contact={contact} /> + </li> + ))} + </ul> + </> + ); +} + +const contacts = [ + { id: 0, name: "Alice", email: "alice@mail.com" }, + { id: 1, name: "Bob", email: "bob@mail.com" }, + { id: 2, name: "Taylor", email: "taylor@mail.com" }, +]; +``` + +```js +import { useState } from "react"; + +export default function Contact({ contact }) { + const [expanded, setExpanded] = useState(false); + return ( + <> + <p> + <b>{contact.name}</b> + </p> + {expanded && ( + <p> + <i>{contact.email}</i> + </p> + )} + <button + on_click={() => { + setExpanded(!expanded); + }} + > + {expanded ? "Hide" : "Show"} email + </button> + </> + ); +} +``` + +```css +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li { + margin-bottom: 20px; +} +label { + display: block; + margin: 10px 0; +} +button { + margin-right: 10px; + margin-bottom: 10px; +} +``` + +State is associated with the tree position. A `key` lets you specify a named position instead of relying on order. + +</Solution> + +</Challenges> diff --git a/docs/src/learn/python-in-psx-with-curly-braces.md b/docs/src/learn/python-in-psx-with-curly-braces.md new file mode 100644 index 000000000..fcc8f0923 --- /dev/null +++ b/docs/src/learn/python-in-psx-with-curly-braces.md @@ -0,0 +1,591 @@ +--- +title: Python in PSX with Curly Braces 🚧 +--- + +## Overview + +<p class="intro" markdown> + +JSX lets you write HTML-like markup inside a JavaScript file, keeping rendering logic and content in the same place. Sometimes you will want to add a little JavaScript logic or reference a dynamic property inside that markup. In this situation, you can use curly braces in your JSX to open a window to JavaScript. + +</p> + +!!! summary "You Will Learn" + + - How to pass strings with quotes + - How to reference a JavaScript variable inside JSX with curly braces + - How to call a JavaScript function inside JSX with curly braces + - How to use a JavaScript object inside JSX with curly braces + +## Passing strings with quotes + +When you want to pass a string attribute to JSX, you put it in single or double quotes: + +```js +export default function Avatar() { + return ( + <img + className="avatar" + src="https://i.imgur.com/7vQD0fPs.jpg" + alt="Gregorio Y. Zara" + /> + ); +} +``` + +```css +.avatar { + border-radius: 50%; + height: 90px; +} +``` + +Here, `"https://i.imgur.com/7vQD0fPs.jpg"` and `"Gregorio Y. Zara"` are being passed as strings. + +But what if you want to dynamically specify the `src` or `alt` text? You could **use a value from JavaScript by replacing `"` and `"` with `{` and `}`**: + +```js +export default function Avatar() { + const avatar = "https://i.imgur.com/7vQD0fPs.jpg"; + const description = "Gregorio Y. Zara"; + return <img className="avatar" src={avatar} alt={description} />; +} +``` + +```css +.avatar { + border-radius: 50%; + height: 90px; +} +``` + +Notice the difference between `className="avatar"`, which specifies an `"avatar"` CSS class name that makes the image round, and `src={avatar}` that reads the value of the JavaScript variable called `avatar`. That's because curly braces let you work with JavaScript right there in your markup! + +## Using curly braces: A window into the JavaScript world + +JSX is a special way of writing JavaScript. That means it’s possible to use JavaScript inside it—with curly braces `{ }`. The example below first declares a name for the scientist, `name`, then embeds it with curly braces inside the `<h1>`: + +```js +export default function TodoList() { + const name = "Gregorio Y. Zara"; + return <h1>{name}'s To Do List</h1>; +} +``` + +Try changing the `name`'s value from `'Gregorio Y. Zara'` to `'Hedy Lamarr'`. See how the list title changes? + +Any JavaScript expression will work between curly braces, including function calls like `formatDate()`: + +```js +const today = new Date(); + +function formatDate(date) { + return new Intl.DateTimeFormat("en-US", { weekday: "long" }).format(date); +} + +export default function TodoList() { + return <h1>To Do List for {formatDate(today)}</h1>; +} +``` + +### Where to use curly braces + +You can only use curly braces in two ways inside JSX: + +1. **As text** directly inside a JSX tag: `<h1>{name}'s To Do List</h1>` works, but `<{tag}>Gregorio Y. Zara's To Do List</{tag}>` will not. +2. **As attributes** immediately following the `=` sign: `src={avatar}` will read the `avatar` variable, but `src="{avatar}"` will pass the string `"{avatar}"`. + +## Using "double curlies": CSS and other objects in JSX + +In addition to strings, numbers, and other JavaScript expressions, you can even pass objects in JSX. Objects are also denoted with curly braces, like `{ name: "Hedy Lamarr", inventions: 5 }`. Therefore, to pass a JS object in JSX, you must wrap the object in another pair of curly braces: `person={{ name: "Hedy Lamarr", inventions: 5 }}`. + +You may see this with inline CSS styles in JSX. React does not require you to use inline styles (CSS classes work great for most cases). But when you need an inline style, you pass an object to the `style` attribute: + +```js +export default function TodoList() { + return ( + <ul + style={{ + backgroundColor: "black", + color: "pink", + }} + > + <li>Improve the videophone</li> + <li>Prepare aeronautics lectures</li> + <li>Work on the alcohol-fuelled engine</li> + </ul> + ); +} +``` + +```css +body { + padding: 0; + margin: 0; +} +ul { + padding: 20px 20px 20px 40px; + margin: 0; +} +``` + +Try changing the values of `backgroundColor` and `color`. + +You can really see the JavaScript object inside the curly braces when you write it like this: + +```js +<ul style={ + { + backgroundColor: 'black', + color: 'pink' + } +}> +``` + +The next time you see `{{` and `}}` in JSX, know that it's nothing more than an object inside the JSX curlies! + +<Pitfall> + +Inline `style` properties are written in camelCase. For example, HTML `<ul style="background-color: black">` would be written as `<ul style={{ backgroundColor: 'black' }}>` in your component. + +</Pitfall> + +## More fun with JavaScript objects and curly braces + +You can move several expressions into one object, and reference them in your JSX inside curly braces: + +```js +const person = { + name: "Gregorio Y. Zara", + theme: { + backgroundColor: "black", + color: "pink", + }, +}; + +export default function TodoList() { + return ( + <div style={person.theme}> + <h1>{person.name}'s Todos</h1> + <img + className="avatar" + src="https://i.imgur.com/7vQD0fPs.jpg" + alt="Gregorio Y. Zara" + /> + <ul> + <li>Improve the videophone</li> + <li>Prepare aeronautics lectures</li> + <li>Work on the alcohol-fuelled engine</li> + </ul> + </div> + ); +} +``` + +```css +body { + padding: 0; + margin: 0; +} +body > div > div { + padding: 20px; +} +.avatar { + border-radius: 50%; + height: 90px; +} +``` + +In this example, the `person` JavaScript object contains a `name` string and a `theme` object: + +```js +const person = { + name: "Gregorio Y. Zara", + theme: { + backgroundColor: "black", + color: "pink", + }, +}; +``` + +The component can use these values from `person` like so: + +```js +<div style={person.theme}> + <h1>{person.name}'s Todos</h1> +``` + +JSX is very minimal as a templating language because it lets you organize data and logic using JavaScript. + +<Recap> + +Now you know almost everything about JSX: + +- JSX attributes inside quotes are passed as strings. +- Curly braces let you bring JavaScript logic and variables into your markup. +- They work inside the JSX tag content or immediately after `=` in attributes. +- `{{` and `}}` is not special syntax: it's a JavaScript object tucked inside JSX curly braces. + +</Recap> + +<Challenges> + +#### Fix the mistake + +This code crashes with an error saying `Objects are not valid as a React child`: + +```js +const person = { + name: "Gregorio Y. Zara", + theme: { + backgroundColor: "black", + color: "pink", + }, +}; + +export default function TodoList() { + return ( + <div style={person.theme}> + <h1>{person}'s Todos</h1> + <img + className="avatar" + src="https://i.imgur.com/7vQD0fPs.jpg" + alt="Gregorio Y. Zara" + /> + <ul> + <li>Improve the videophone</li> + <li>Prepare aeronautics lectures</li> + <li>Work on the alcohol-fuelled engine</li> + </ul> + </div> + ); +} +``` + +```css +body { + padding: 0; + margin: 0; +} +body > div > div { + padding: 20px; +} +.avatar { + border-radius: 50%; + height: 90px; +} +``` + +Can you find the problem? + +<Hint>Look for what's inside the curly braces. Are we putting the right thing there?</Hint> + +<Solution> + +This is happening because this example renders _an object itself_ into the markup rather than a string: `<h1>{person}'s Todos</h1>` is trying to render the entire `person` object! Including raw objects as text content throws an error because React doesn't know how you want to display them. + +To fix it, replace `<h1>{person}'s Todos</h1>` with `<h1>{person.name}'s Todos</h1>`: + +```js +const person = { + name: "Gregorio Y. Zara", + theme: { + backgroundColor: "black", + color: "pink", + }, +}; + +export default function TodoList() { + return ( + <div style={person.theme}> + <h1>{person.name}'s Todos</h1> + <img + className="avatar" + src="https://i.imgur.com/7vQD0fPs.jpg" + alt="Gregorio Y. Zara" + /> + <ul> + <li>Improve the videophone</li> + <li>Prepare aeronautics lectures</li> + <li>Work on the alcohol-fuelled engine</li> + </ul> + </div> + ); +} +``` + +```css +body { + padding: 0; + margin: 0; +} +body > div > div { + padding: 20px; +} +.avatar { + border-radius: 50%; + height: 90px; +} +``` + +</Solution> + +#### Extract information into an object + +Extract the image URL into the `person` object. + +```js +const person = { + name: "Gregorio Y. Zara", + theme: { + backgroundColor: "black", + color: "pink", + }, +}; + +export default function TodoList() { + return ( + <div style={person.theme}> + <h1>{person.name}'s Todos</h1> + <img + className="avatar" + src="https://i.imgur.com/7vQD0fPs.jpg" + alt="Gregorio Y. Zara" + /> + <ul> + <li>Improve the videophone</li> + <li>Prepare aeronautics lectures</li> + <li>Work on the alcohol-fuelled engine</li> + </ul> + </div> + ); +} +``` + +```css +body { + padding: 0; + margin: 0; +} +body > div > div { + padding: 20px; +} +.avatar { + border-radius: 50%; + height: 90px; +} +``` + +<Solution> + +Move the image URL into a property called `person.imageUrl` and read it from the `<img>` tag using the curlies: + +```js +const person = { + name: "Gregorio Y. Zara", + imageUrl: "https://i.imgur.com/7vQD0fPs.jpg", + theme: { + backgroundColor: "black", + color: "pink", + }, +}; + +export default function TodoList() { + return ( + <div style={person.theme}> + <h1>{person.name}'s Todos</h1> + <img + className="avatar" + src={person.imageUrl} + alt="Gregorio Y. Zara" + /> + <ul> + <li>Improve the videophone</li> + <li>Prepare aeronautics lectures</li> + <li>Work on the alcohol-fuelled engine</li> + </ul> + </div> + ); +} +``` + +```css +body { + padding: 0; + margin: 0; +} +body > div > div { + padding: 20px; +} +.avatar { + border-radius: 50%; + height: 90px; +} +``` + +</Solution> + +#### Write an expression inside JSX curly braces + +In the object below, the full image URL is split into four parts: base URL, `imageId`, `imageSize`, and file extension. + +We want the image URL to combine these attributes together: base URL (always `'https://i.imgur.com/'`), `imageId` (`'7vQD0fP'`), `imageSize` (`'s'`), and file extension (always `'.jpg'`). However, something is wrong with how the `<img>` tag specifies its `src`. + +Can you fix it? + +```js +const baseUrl = "https://i.imgur.com/"; +const person = { + name: "Gregorio Y. Zara", + imageId: "7vQD0fP", + imageSize: "s", + theme: { + backgroundColor: "black", + color: "pink", + }, +}; + +export default function TodoList() { + return ( + <div style={person.theme}> + <h1>{person.name}'s Todos</h1> + <img + className="avatar" + src="{baseUrl}{person.imageId}{person.imageSize}.jpg" + alt={person.name} + /> + <ul> + <li>Improve the videophone</li> + <li>Prepare aeronautics lectures</li> + <li>Work on the alcohol-fuelled engine</li> + </ul> + </div> + ); +} +``` + +```css +body { + padding: 0; + margin: 0; +} +body > div > div { + padding: 20px; +} +.avatar { + border-radius: 50%; +} +``` + +To check that your fix worked, try changing the value of `imageSize` to `'b'`. The image should resize after your edit. + +<Solution> + +You can write it as `src={baseUrl + person.imageId + person.imageSize + '.jpg'}`. + +1. `{` opens the JavaScript expression +2. `baseUrl + person.imageId + person.imageSize + '.jpg'` produces the correct URL string +3. `}` closes the JavaScript expression + +```js +const baseUrl = "https://i.imgur.com/"; +const person = { + name: "Gregorio Y. Zara", + imageId: "7vQD0fP", + imageSize: "s", + theme: { + backgroundColor: "black", + color: "pink", + }, +}; + +export default function TodoList() { + return ( + <div style={person.theme}> + <h1>{person.name}'s Todos</h1> + <img + className="avatar" + src={baseUrl + person.imageId + person.imageSize + ".jpg"} + alt={person.name} + /> + <ul> + <li>Improve the videophone</li> + <li>Prepare aeronautics lectures</li> + <li>Work on the alcohol-fuelled engine</li> + </ul> + </div> + ); +} +``` + +```css +body { + padding: 0; + margin: 0; +} +body > div > div { + padding: 20px; +} +.avatar { + border-radius: 50%; +} +``` + +You can also move this expression into a separate function like `getImageUrl` below: + +```js +import { getImageUrl } from "./utils.js"; + +const person = { + name: "Gregorio Y. Zara", + imageId: "7vQD0fP", + imageSize: "s", + theme: { + backgroundColor: "black", + color: "pink", + }, +}; + +export default function TodoList() { + return ( + <div style={person.theme}> + <h1>{person.name}'s Todos</h1> + <img + className="avatar" + src={getImageUrl(person)} + alt={person.name} + /> + <ul> + <li>Improve the videophone</li> + <li>Prepare aeronautics lectures</li> + <li>Work on the alcohol-fuelled engine</li> + </ul> + </div> + ); +} +``` + +```js +export function getImageUrl(person) { + return "https://i.imgur.com/" + person.imageId + person.imageSize + ".jpg"; +} +``` + +```css +body { + padding: 0; + margin: 0; +} +body > div > div { + padding: 20px; +} +.avatar { + border-radius: 50%; +} +``` + +Variables and functions can help you keep the markup simple! + +</Solution> + +</Challenges> diff --git a/docs/src/learn/queueing-a-series-of-state-updates.md b/docs/src/learn/queueing-a-series-of-state-updates.md new file mode 100644 index 000000000..c2704d046 --- /dev/null +++ b/docs/src/learn/queueing-a-series-of-state-updates.md @@ -0,0 +1,560 @@ +--- +title: Queueing a Series of State Updates 🚧 +--- + +## Overview + +<p class="intro" markdown> + +Setting a state variable will queue another render. But sometimes you might want to perform multiple operations on the value before queueing the next render. To do this, it helps to understand how React batches state updates. + +</p> + +!!! summary "You Will Learn" + + - What "batching" is and how React uses it to process multiple state updates + - How to apply several updates to the same state variable in a row + +## React batches state updates + +You might expect that clicking the "+3" button will increment the counter three times because it calls `setNumber(number + 1)` three times: + +```js +import { useState } from "react"; + +export default function Counter() { + const [number, setNumber] = useState(0); + + return ( + <> + <h1>{number}</h1> + <button + on_click={() => { + setNumber(number + 1); + setNumber(number + 1); + setNumber(number + 1); + }} + > + +3 + </button> + </> + ); +} +``` + +```css +button { + display: inline-block; + margin: 10px; + font-size: 20px; +} +h1 { + display: inline-block; + margin: 10px; + width: 30px; + text-align: center; +} +``` + +However, as you might recall from the previous section, [each render's state values are fixed](/learn/state-as-a-snapshot#rendering-takes-a-snapshot-in-time), so the value of `number` inside the first render's event handler is always `0`, no matter how many times you call `setNumber(1)`: + +```js +setNumber(0 + 1); +setNumber(0 + 1); +setNumber(0 + 1); +``` + +But there is one other factor at play here. **React waits until _all_ code in the event handlers has run before processing your state updates.** This is why the re-render only happens _after_ all these `setNumber()` calls. + +This might remind you of a waiter taking an order at the restaurant. A waiter doesn't run to the kitchen at the mention of your first dish! Instead, they let you finish your order, let you make changes to it, and even take orders from other people at the table. + +<Illustration src="/images/docs/illustrations/i_react-batching.png" alt="An elegant cursor at a restaurant places and order multiple times with React, playing the part of the waiter. After she calls setState() multiple times, the waiter writes down the last one she requested as her final order." /> + +This lets you update multiple state variables--even from multiple components--without triggering too many [re-renders.](/learn/render-and-commit#re-renders-when-state-updates) But this also means that the UI won't be updated until _after_ your event handler, and any code in it, completes. This behavior, also known as **batching,** makes your React app run much faster. It also avoids dealing with confusing "half-finished" renders where only some of the variables have been updated. + +**React does not batch across _multiple_ intentional events like clicks**--each click is handled separately. Rest assured that React only does batching when it's generally safe to do. This ensures that, for example, if the first button click disables a form, the second click would not submit it again. + +## Updating the same state multiple times before the next render + +It is an uncommon use case, but if you would like to update the same state variable multiple times before the next render, instead of passing the _next state value_ like `setNumber(number + 1)`, you can pass a _function_ that calculates the next state based on the previous one in the queue, like `setNumber(n => n + 1)`. It is a way to tell React to "do something with the state value" instead of just replacing it. + +Try incrementing the counter now: + +```js +import { useState } from "react"; + +export default function Counter() { + const [number, setNumber] = useState(0); + + return ( + <> + <h1>{number}</h1> + <button + on_click={() => { + setNumber((n) => n + 1); + setNumber((n) => n + 1); + setNumber((n) => n + 1); + }} + > + +3 + </button> + </> + ); +} +``` + +```css +button { + display: inline-block; + margin: 10px; + font-size: 20px; +} +h1 { + display: inline-block; + margin: 10px; + width: 30px; + text-align: center; +} +``` + +Here, `n => n + 1` is called an **updater function.** When you pass it to a state setter: + +1. React queues this function to be processed after all the other code in the event handler has run. +2. During the next render, React goes through the queue and gives you the final updated state. + +```js +setNumber((n) => n + 1); +setNumber((n) => n + 1); +setNumber((n) => n + 1); +``` + +Here's how React works through these lines of code while executing the event handler: + +1. `setNumber(n => n + 1)`: `n => n + 1` is a function. React adds it to a queue. +1. `setNumber(n => n + 1)`: `n => n + 1` is a function. React adds it to a queue. +1. `setNumber(n => n + 1)`: `n => n + 1` is a function. React adds it to a queue. + +When you call `useState` during the next render, React goes through the queue. The previous `number` state was `0`, so that's what React passes to the first updater function as the `n` argument. Then React takes the return value of your previous updater function and passes it to the next updater as `n`, and so on: + +| queued update | `n` | returns | +| ------------- | --- | ----------- | +| `n => n + 1` | `0` | `0 + 1 = 1` | +| `n => n + 1` | `1` | `1 + 1 = 2` | +| `n => n + 1` | `2` | `2 + 1 = 3` | + +React stores `3` as the final result and returns it from `useState`. + +This is why clicking "+3" in the above example correctly increments the value by 3. + +### What happens if you update state after replacing it + +What about this event handler? What do you think `number` will be in the next render? + +```js +<button on_click={() => { + setNumber(number + 5); + setNumber(n => n + 1); +}}> +``` + +```js +import { useState } from "react"; + +export default function Counter() { + const [number, setNumber] = useState(0); + + return ( + <> + <h1>{number}</h1> + <button + on_click={() => { + setNumber(number + 5); + setNumber((n) => n + 1); + }} + > + Increase the number + </button> + </> + ); +} +``` + +```css +button { + display: inline-block; + margin: 10px; + font-size: 20px; +} +h1 { + display: inline-block; + margin: 10px; + width: 30px; + text-align: center; +} +``` + +Here's what this event handler tells React to do: + +1. `setNumber(number + 5)`: `number` is `0`, so `setNumber(0 + 5)`. React adds _"replace with `5`"_ to its queue. +2. `setNumber(n => n + 1)`: `n => n + 1` is an updater function. React adds _that function_ to its queue. + +During the next render, React goes through the state queue: + +| queued update | `n` | returns | +| ------------------ | ------------ | ----------- | +| "replace with `5`" | `0` (unused) | `5` | +| `n => n + 1` | `5` | `5 + 1 = 6` | + +React stores `6` as the final result and returns it from `useState`. + +<Note> + +You may have noticed that `setState(5)` actually works like `setState(n => 5)`, but `n` is unused! + +</Note> + +### What happens if you replace state after updating it + +Let's try one more example. What do you think `number` will be in the next render? + +```js +<button on_click={() => { + setNumber(number + 5); + setNumber(n => n + 1); + setNumber(42); +}}> +``` + +```js +import { useState } from "react"; + +export default function Counter() { + const [number, setNumber] = useState(0); + + return ( + <> + <h1>{number}</h1> + <button + on_click={() => { + setNumber(number + 5); + setNumber((n) => n + 1); + setNumber(42); + }} + > + Increase the number + </button> + </> + ); +} +``` + +```css +button { + display: inline-block; + margin: 10px; + font-size: 20px; +} +h1 { + display: inline-block; + margin: 10px; + width: 30px; + text-align: center; +} +``` + +Here's how React works through these lines of code while executing this event handler: + +1. `setNumber(number + 5)`: `number` is `0`, so `setNumber(0 + 5)`. React adds _"replace with `5`"_ to its queue. +2. `setNumber(n => n + 1)`: `n => n + 1` is an updater function. React adds _that function_ to its queue. +3. `setNumber(42)`: React adds _"replace with `42`"_ to its queue. + +During the next render, React goes through the state queue: + +| queued update | `n` | returns | +| ------------------- | ------------ | ----------- | +| "replace with `5`" | `0` (unused) | `5` | +| `n => n + 1` | `5` | `5 + 1 = 6` | +| "replace with `42`" | `6` (unused) | `42` | + +Then React stores `42` as the final result and returns it from `useState`. + +To summarize, here's how you can think of what you're passing to the `setNumber` state setter: + +- **An updater function** (e.g. `n => n + 1`) gets added to the queue. +- **Any other value** (e.g. number `5`) adds "replace with `5`" to the queue, ignoring what's already queued. + +After the event handler completes, React will trigger a re-render. During the re-render, React will process the queue. Updater functions run during rendering, so **updater functions must be [pure](/learn/keeping-components-pure)** and only _return_ the result. Don't try to set state from inside of them or run other side effects. In Strict Mode, React will run each updater function twice (but discard the second result) to help you find mistakes. + +### Naming conventions + +It's common to name the updater function argument by the first letters of the corresponding state variable: + +```js +setEnabled((e) => !e); +setLastName((ln) => ln.reverse()); +setFriendCount((fc) => fc * 2); +``` + +If you prefer more verbose code, another common convention is to repeat the full state variable name, like `setEnabled(enabled => !enabled)`, or to use a prefix like `setEnabled(prevEnabled => !prevEnabled)`. + +<Recap> + +- Setting state does not change the variable in the existing render, but it requests a new render. +- React processes state updates after event handlers have finished running. This is called batching. +- To update some state multiple times in one event, you can use `setNumber(n => n + 1)` updater function. + +</Recap> + +<Challenges> + +#### Fix a request counter + +You're working on an art marketplace app that lets the user submit multiple orders for an art item at the same time. Each time the user presses the "Buy" button, the "Pending" counter should increase by one. After three seconds, the "Pending" counter should decrease, and the "Completed" counter should increase. + +However, the "Pending" counter does not behave as intended. When you press "Buy", it decreases to `-1` (which should not be possible!). And if you click fast twice, both counters seem to behave unpredictably. + +Why does this happen? Fix both counters. + +```js +import { useState } from "react"; + +export default function RequestTracker() { + const [pending, setPending] = useState(0); + const [completed, setCompleted] = useState(0); + + async function handleClick() { + setPending(pending + 1); + await delay(3000); + setPending(pending - 1); + setCompleted(completed + 1); + } + + return ( + <> + <h3>Pending: {pending}</h3> + <h3>Completed: {completed}</h3> + <button on_click={handleClick}>Buy</button> + </> + ); +} + +function delay(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} +``` + +<Solution> + +Inside the `handleClick` event handler, the values of `pending` and `completed` correspond to what they were at the time of the click event. For the first render, `pending` was `0`, so `setPending(pending - 1)` becomes `setPending(-1)`, which is wrong. Since you want to _increment_ or _decrement_ the counters, rather than set them to a concrete value determined during the click, you can instead pass the updater functions: + +```js +import { useState } from "react"; + +export default function RequestTracker() { + const [pending, setPending] = useState(0); + const [completed, setCompleted] = useState(0); + + async function handleClick() { + setPending((p) => p + 1); + await delay(3000); + setPending((p) => p - 1); + setCompleted((c) => c + 1); + } + + return ( + <> + <h3>Pending: {pending}</h3> + <h3>Completed: {completed}</h3> + <button on_click={handleClick}>Buy</button> + </> + ); +} + +function delay(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} +``` + +This ensures that when you increment or decrement a counter, you do it in relation to its _latest_ state rather than what the state was at the time of the click. + +</Solution> + +#### Implement the state queue yourself + +In this challenge, you will reimplement a tiny part of React from scratch! It's not as hard as it sounds. + +Scroll through the sandbox preview. Notice that it shows **four test cases.** They correspond to the examples you've seen earlier on this page. Your task is to implement the `getFinalState` function so that it returns the correct result for each of those cases. If you implement it correctly, all four tests should pass. + +You will receive two arguments: `baseState` is the initial state (like `0`), and the `queue` is an array which contains a mix of numbers (like `5`) and updater functions (like `n => n + 1`) in the order they were added. + +Your task is to return the final state, just like the tables on this page show! + +<Hint> + +If you're feeling stuck, start with this code structure: + +```js +export function getFinalState(baseState, queue) { + let finalState = baseState; + + for (let update of queue) { + if (typeof update === "function") { + // TODO: apply the updater function + } else { + // TODO: replace the state + } + } + + return finalState; +} +``` + +Fill out the missing lines! + +</Hint> + +```js +export function getFinalState(baseState, queue) { + let finalState = baseState; + + // TODO: do something with the queue... + + return finalState; +} +``` + +```js +import { getFinalState } from "./processQueue.js"; + +function increment(n) { + return n + 1; +} +increment.toString = () => "n => n+1"; + +export default function App() { + return ( + <> + <TestCase baseState={0} queue={[1, 1, 1]} expected={1} /> + <hr /> + <TestCase + baseState={0} + queue={[increment, increment, increment]} + expected={3} + /> + <hr /> + <TestCase baseState={0} queue={[5, increment]} expected={6} /> + <hr /> + <TestCase baseState={0} queue={[5, increment, 42]} expected={42} /> + </> + ); +} + +function TestCase({ baseState, queue, expected }) { + const actual = getFinalState(baseState, queue); + return ( + <> + <p> + Base state: <b>{baseState}</b> + </p> + <p> + Queue: <b>[{queue.join(", ")}]</b> + </p> + <p> + Expected result: <b>{expected}</b> + </p> + <p + style={{ + color: actual === expected ? "green" : "red", + }} + > + Your result: <b>{actual}</b> ( + {actual === expected ? "correct" : "wrong"}) + </p> + </> + ); +} +``` + +<Solution> + +This is the exact algorithm described on this page that React uses to calculate the final state: + +```js +export function getFinalState(baseState, queue) { + let finalState = baseState; + + for (let update of queue) { + if (typeof update === "function") { + // Apply the updater function. + finalState = update(finalState); + } else { + // Replace the next state. + finalState = update; + } + } + + return finalState; +} +``` + +```js +import { getFinalState } from "./processQueue.js"; + +function increment(n) { + return n + 1; +} +increment.toString = () => "n => n+1"; + +export default function App() { + return ( + <> + <TestCase baseState={0} queue={[1, 1, 1]} expected={1} /> + <hr /> + <TestCase + baseState={0} + queue={[increment, increment, increment]} + expected={3} + /> + <hr /> + <TestCase baseState={0} queue={[5, increment]} expected={6} /> + <hr /> + <TestCase baseState={0} queue={[5, increment, 42]} expected={42} /> + </> + ); +} + +function TestCase({ baseState, queue, expected }) { + const actual = getFinalState(baseState, queue); + return ( + <> + <p> + Base state: <b>{baseState}</b> + </p> + <p> + Queue: <b>[{queue.join(", ")}]</b> + </p> + <p> + Expected result: <b>{expected}</b> + </p> + <p + style={{ + color: actual === expected ? "green" : "red", + }} + > + Your result: <b>{actual}</b> ( + {actual === expected ? "correct" : "wrong"}) + </p> + </> + ); +} +``` + +Now you know how this part of React works! + +</Solution> + +</Challenges> diff --git a/docs/src/learn/react-developer-tools.md b/docs/src/learn/react-developer-tools.md new file mode 100644 index 000000000..d951fae3c --- /dev/null +++ b/docs/src/learn/react-developer-tools.md @@ -0,0 +1,85 @@ +--- +title: React Developer Tools 🚧 +--- + +## Overview + +<p class="intro" markdown> + +Use React Developer Tools to inspect React [components](/learn/your-first-component), edit [props](/learn/passing-props-to-a-component) and [state](/learn/state-a-components-memory), and identify performance problems. + +</p> + +!!! summary "You Will Learn" + + - How to install React Developer Tools + +## Browser extension + +The easiest way to debug websites built with React is to install the React Developer Tools browser extension. It is available for several popular browsers: + +- [Install for **Chrome**](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en) +- [Install for **Firefox**](https://addons.mozilla.org/en-US/firefox/addon/react-devtools/) +- [Install for **Edge**](https://microsoftedge.microsoft.com/addons/detail/react-developer-tools/gpphkfbcpidddadnkolkpfckpihlkkil) + +Now, if you visit a website **built with React,** you will see the _Components_ and _Profiler_ panels. + + + +### Safari and other browsers + +For other browsers (for example, Safari), install the [`react-devtools`](https://www.npmjs.com/package/react-devtools) npm package: + +```bash +# Yarn +yarn global add react-devtools + +# Npm +npm install -g react-devtools +``` + +Next open the developer tools from the terminal: + +```bash +react-devtools +``` + +Then connect your website by adding the following `<script>` tag to the beginning of your website's `<head>`: + +```html +<html> + <head> + <script src="http://localhost:8097"></script> + </head> +</html> +``` + +Reload your website in the browser now to view it in developer tools. + + + +## Mobile (React Native) + +React Developer Tools can be used to inspect apps built with [React Native](https://reactnative.dev/) as well. + +The easiest way to use React Developer Tools is to install it globally: + +```bash +# Yarn +yarn global add react-devtools + +# Npm +npm install -g react-devtools +``` + +Next open the developer tools from the terminal. + +```bash +react-devtools +``` + +It should connect to any local React Native app that's running. + +> Try reloading the app if developer tools doesn't connect after a few seconds. + +[Learn more about debugging React Native.](https://reactnative.dev/docs/debugging) diff --git a/docs/src/learn/reacting-to-input-with-state.md b/docs/src/learn/reacting-to-input-with-state.md new file mode 100644 index 000000000..2ad1390f9 --- /dev/null +++ b/docs/src/learn/reacting-to-input-with-state.md @@ -0,0 +1,1179 @@ +--- +title: Reacting to Input with State 🚧 +--- + +## Overview + +<p class="intro" markdown> + +React provides a declarative way to manipulate the UI. Instead of manipulating individual pieces of the UI directly, you describe the different states that your component can be in, and switch between them in response to the user input. This is similar to how designers think about the UI. + +</p> + +!!! summary "You Will Learn" + + - How declarative UI programming differs from imperative UI programming + - How to enumerate the different visual states your component can be in + - How to trigger the changes between the different visual states from code + +## How declarative UI compares to imperative + +When you design UI interactions, you probably think about how the UI _changes_ in response to user actions. Consider a form that lets the user submit an answer: + +- When you type something into the form, the "Submit" button **becomes enabled.** +- When you press "Submit", both the form and the button **become disabled,** and a spinner **appears.** +- If the network request succeeds, the form **gets hidden,** and the "Thank you" message **appears.** +- If the network request fails, an error message **appears,** and the form **becomes enabled** again. + +In **imperative programming,** the above corresponds directly to how you implement interaction. You have to write the exact instructions to manipulate the UI depending on what just happened. Here's another way to think about this: imagine riding next to someone in a car and telling them turn by turn where to go. + +<Illustration src="/images/docs/illustrations/i_imperative-ui-programming.png" alt="In a car driven by an anxious-looking person representing JavaScript, a passenger orders the driver to execute a sequence of complicated turn by turn navigations." /> + +They don't know where you want to go, they just follow your commands. (And if you get the directions wrong, you end up in the wrong place!) It's called _imperative_ because you have to "command" each element, from the spinner to the button, telling the computer _how_ to update the UI. + +In this example of imperative UI programming, the form is built _without_ React. It only uses the browser [DOM](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model): + +```js +async function handleFormSubmit(e) { + e.preventDefault(); + disable(textarea); + disable(button); + show(loadingMessage); + hide(errorMessage); + try { + await submitForm(textarea.value); + show(successMessage); + hide(form); + } catch (err) { + show(errorMessage); + errorMessage.textContent = err.message; + } finally { + hide(loadingMessage); + enable(textarea); + enable(button); + } +} + +function handleTextareaChange() { + if (textarea.value.length === 0) { + disable(button); + } else { + enable(button); + } +} + +function hide(el) { + el.style.display = "none"; +} + +function show(el) { + el.style.display = ""; +} + +function enable(el) { + el.disabled = false; +} + +function disable(el) { + el.disabled = true; +} + +function submitForm(answer) { + // Pretend it's hitting the network. + return new Promise((resolve, reject) => { + setTimeout(() => { + if (answer.toLowerCase() == "istanbul") { + resolve(); + } else { + reject(new Error("Good guess but a wrong answer. Try again!")); + } + }, 1500); + }); +} + +let form = document.getElementById("form"); +let textarea = document.getElementById("textarea"); +let button = document.getElementById("button"); +let loadingMessage = document.getElementById("loading"); +let errorMessage = document.getElementById("error"); +let successMessage = document.getElementById("success"); +form.onsubmit = handleFormSubmit; +textarea.oninput = handleTextareaChange; +``` + +```js +{ + "hardReloadOnChange": true +} +``` + +```html +<form id="form"> + <h2>City quiz</h2> + <p>What city is located on two continents?</p> + <textarea id="textarea"></textarea> + <br /> + <button id="button" disabled>Submit</button> + <p id="loading" style="display: none">Loading...</p> + <p id="error" style="display: none; color: red;"></p> +</form> +<h1 id="success" style="display: none">That's right!</h1> + +<style> + * { + box-sizing: border-box; + } + body { + font-family: sans-serif; + margin: 20px; + padding: 0; + } +</style> +``` + +Manipulating the UI imperatively works well enough for isolated examples, but it gets exponentially more difficult to manage in more complex systems. Imagine updating a page full of different forms like this one. Adding a new UI element or a new interaction would require carefully checking all existing code to make sure you haven't introduced a bug (for example, forgetting to show or hide something). + +React was built to solve this problem. + +In React, you don't directly manipulate the UI--meaning you don't enable, disable, show, or hide components directly. Instead, you **declare what you want to show,** and React figures out how to update the UI. Think of getting into a taxi and telling the driver where you want to go instead of telling them exactly where to turn. It's the driver's job to get you there, and they might even know some shortcuts you haven't considered! + +<Illustration src="/images/docs/illustrations/i_declarative-ui-programming.png" alt="In a car driven by React, a passenger asks to be taken to a specific place on the map. React figures out how to do that." /> + +## Thinking about UI declaratively + +You've seen how to implement a form imperatively above. To better understand how to think in React, you'll walk through reimplementing this UI in React below: + +1. **Identify** your component's different visual states +2. **Determine** what triggers those state changes +3. **Represent** the state in memory using `useState` +4. **Remove** any non-essential state variables +5. **Connect** the event handlers to set the state + +### Step 1: Identify your component's different visual states + +In computer science, you may hear about a ["state machine"](https://en.wikipedia.org/wiki/Finite-state_machine) being in one of several “states”. If you work with a designer, you may have seen mockups for different "visual states". React stands at the intersection of design and computer science, so both of these ideas are sources of inspiration. + +First, you need to visualize all the different "states" of the UI the user might see: + +- **Empty**: Form has a disabled "Submit" button. +- **Typing**: Form has an enabled "Submit" button. +- **Submitting**: Form is completely disabled. Spinner is shown. +- **Success**: "Thank you" message is shown instead of a form. +- **Error**: Same as Typing state, but with an extra error message. + +Just like a designer, you'll want to "mock up" or create "mocks" for the different states before you add logic. For example, here is a mock for just the visual part of the form. This mock is controlled by a prop called `status` with a default value of `'empty'`: + +```js +export default function Form({ status = "empty" }) { + if (status === "success") { + return <h1>That's right!</h1>; + } + return ( + <> + <h2>City quiz</h2> + <p> + In which city is there a billboard that turns air into drinkable + water? + </p> + <form> + <textarea /> + <br /> + <button>Submit</button> + </form> + </> + ); +} +``` + +You could call that prop anything you like, the naming is not important. Try editing `status = 'empty'` to `status = 'success'` to see the success message appear. Mocking lets you quickly iterate on the UI before you wire up any logic. Here is a more fleshed out prototype of the same component, still "controlled" by the `status` prop: + +```js +export default function Form({ + // Try 'submitting', 'error', 'success': + status = "empty", +}) { + if (status === "success") { + return <h1>That's right!</h1>; + } + return ( + <> + <h2>City quiz</h2> + <p> + In which city is there a billboard that turns air into drinkable + water? + </p> + <form> + <textarea disabled={status === "submitting"} /> + <br /> + <button + disabled={status === "empty" || status === "submitting"} + > + Submit + </button> + {status === "error" && ( + <p className="Error"> + Good guess but a wrong answer. Try again! + </p> + )} + </form> + </> + ); +} +``` + +```css +.Error { + color: red; +} +``` + +<DeepDive> + +#### Displaying many visual states at once + +If a component has a lot of visual states, it can be convenient to show them all on one page: + +```js +import Form from "./Form.js"; + +let statuses = ["empty", "typing", "submitting", "success", "error"]; + +export default function App() { + return ( + <> + {statuses.map((status) => ( + <section key={status}> + <h4>Form ({status}):</h4> + <Form status={status} /> + </section> + ))} + </> + ); +} +``` + +```js +export default function Form({ status }) { + if (status === "success") { + return <h1>That's right!</h1>; + } + return ( + <form> + <textarea disabled={status === "submitting"} /> + <br /> + <button disabled={status === "empty" || status === "submitting"}> + Submit + </button> + {status === "error" && ( + <p className="Error"> + Good guess but a wrong answer. Try again! + </p> + )} + </form> + ); +} +``` + +```css +section { + border-bottom: 1px solid #aaa; + padding: 20px; +} +h4 { + color: #222; +} +body { + margin: 0; +} +.Error { + color: red; +} +``` + +Pages like this are often called "living styleguides" or "storybooks". + +</DeepDive> + +### Step 2: Determine what triggers those state changes + +You can trigger state updates in response to two kinds of inputs: + +- **Human inputs,** like clicking a button, typing in a field, navigating a link. +- **Computer inputs,** like a network response arriving, a timeout completing, an image loading. + +<IllustrationBlock> + <Illustration caption="Human inputs" alt="A finger." src="/images/docs/illustrations/i_inputs1.png" /> + <Illustration caption="Computer inputs" alt="Ones and zeroes." src="/images/docs/illustrations/i_inputs2.png" /> +</IllustrationBlock> + +In both cases, **you must set [state variables](/learn/state-a-components-memory#anatomy-of-usestate) to update the UI.** For the form you're developing, you will need to change state in response to a few different inputs: + +- **Changing the text input** (human) should switch it from the _Empty_ state to the _Typing_ state or back, depending on whether the text box is empty or not. +- **Clicking the Submit button** (human) should switch it to the _Submitting_ state. +- **Successful network response** (computer) should switch it to the _Success_ state. +- **Failed network response** (computer) should switch it to the _Error_ state with the matching error message. + +<Note> + +Notice that human inputs often require [event handlers](/learn/responding-to-events)! + +</Note> + +To help visualize this flow, try drawing each state on paper as a labeled circle, and each change between two states as an arrow. You can sketch out many flows this way and sort out bugs long before implementation. + +<!-- TODO: Diagram --> + +### Step 3: Represent the state in memory with `useState` + +Next you'll need to represent the visual states of your component in memory with [`useState`.](/reference/react/useState) Simplicity is key: each piece of state is a "moving piece", and **you want as few "moving pieces" as possible.** More complexity leads to more bugs! + +Start with the state that _absolutely must_ be there. For example, you'll need to store the `answer` for the input, and the `error` (if it exists) to store the last error: + +```js +const [answer, setAnswer] = useState(""); +const [error, setError] = useState(null); +``` + +Then, you'll need a state variable representing which one of the visual states that you want to display. There's usually more than a single way to represent that in memory, so you'll need to experiment with it. + +If you struggle to think of the best way immediately, start by adding enough state that you're _definitely_ sure that all the possible visual states are covered: + +```js +const [isEmpty, setIsEmpty] = useState(true); +const [isTyping, setIsTyping] = useState(false); +const [isSubmitting, setIsSubmitting] = useState(false); +const [isSuccess, setIsSuccess] = useState(false); +const [isError, setIsError] = useState(false); +``` + +Your first idea likely won't be the best, but that's ok--refactoring state is a part of the process! + +### Step 4: Remove any non-essential state variables + +You want to avoid duplication in the state content so you're only tracking what is essential. Spending a little time on refactoring your state structure will make your components easier to understand, reduce duplication, and avoid unintended meanings. Your goal is to **prevent the cases where the state in memory doesn't represent any valid UI that you'd want a user to see.** (For example, you never want to show an error message and disable the input at the same time, or the user won't be able to correct the error!) + +Here are some questions you can ask about your state variables: + +- **Does this state cause a paradox?** For example, `isTyping` and `isSubmitting` can't both be `true`. A paradox usually means that the state is not constrained enough. There are four possible combinations of two booleans, but only three correspond to valid states. To remove the "impossible" state, you can combine these into a `status` that must be one of three values: `'typing'`, `'submitting'`, or `'success'`. +- **Is the same information available in another state variable already?** Another paradox: `isEmpty` and `isTyping` can't be `true` at the same time. By making them separate state variables, you risk them going out of sync and causing bugs. Fortunately, you can remove `isEmpty` and instead check `answer.length === 0`. +- **Can you get the same information from the inverse of another state variable?** `isError` is not needed because you can check `error !== null` instead. + +After this clean-up, you're left with 3 (down from 7!) _essential_ state variables: + +```js +const [answer, setAnswer] = useState(""); +const [error, setError] = useState(null); +const [status, setStatus] = useState("typing"); // 'typing', 'submitting', or 'success' +``` + +You know they are essential, because you can't remove any of them without breaking the functionality. + +<DeepDive> + +#### Eliminating “impossible” states with a reducer + +These three variables are a good enough representation of this form's state. However, there are still some intermediate states that don't fully make sense. For example, a non-null `error` doesn't make sense when `status` is `'success'`. To model the state more precisely, you can [extract it into a reducer.](/learn/extracting-state-logic-into-a-reducer) Reducers let you unify multiple state variables into a single object and consolidate all the related logic! + +</DeepDive> + +### Step 5: Connect the event handlers to set state + +Lastly, create event handlers that update the state. Below is the final form, with all event handlers wired up: + +```js +import { useState } from "react"; + +export default function Form() { + const [answer, setAnswer] = useState(""); + const [error, setError] = useState(null); + const [status, setStatus] = useState("typing"); + + if (status === "success") { + return <h1>That's right!</h1>; + } + + async function handleSubmit(e) { + e.preventDefault(); + setStatus("submitting"); + try { + await submitForm(answer); + setStatus("success"); + } catch (err) { + setStatus("typing"); + setError(err); + } + } + + function handleTextareaChange(e) { + setAnswer(e.target.value); + } + + return ( + <> + <h2>City quiz</h2> + <p> + In which city is there a billboard that turns air into drinkable + water? + </p> + <form onSubmit={handleSubmit}> + <textarea + value={answer} + onChange={handleTextareaChange} + disabled={status === "submitting"} + /> + <br /> + <button + disabled={answer.length === 0 || status === "submitting"} + > + Submit + </button> + {error !== null && <p className="Error">{error.message}</p>} + </form> + </> + ); +} + +function submitForm(answer) { + // Pretend it's hitting the network. + return new Promise((resolve, reject) => { + setTimeout(() => { + let shouldError = answer.toLowerCase() !== "lima"; + if (shouldError) { + reject(new Error("Good guess but a wrong answer. Try again!")); + } else { + resolve(); + } + }, 1500); + }); +} +``` + +```css +.Error { + color: red; +} +``` + +Although this code is longer than the original imperative example, it is much less fragile. Expressing all interactions as state changes lets you later introduce new visual states without breaking existing ones. It also lets you change what should be displayed in each state without changing the logic of the interaction itself. + +<Recap> + +- Declarative programming means describing the UI for each visual state rather than micromanaging the UI (imperative). +- When developing a component: + 1. Identify all its visual states. + 2. Determine the human and computer triggers for state changes. + 3. Model the state with `useState`. + 4. Remove non-essential state to avoid bugs and paradoxes. + 5. Connect the event handlers to set state. + +</Recap> + +<Challenges> + +#### Add and remove a CSS class + +Make it so that clicking on the picture _removes_ the `background--active` CSS class from the outer `<div>`, but _adds_ the `picture--active` class to the `<img>`. Clicking the background again should restore the original CSS classes. + +Visually, you should expect that clicking on the picture removes the purple background and highlights the picture border. Clicking outside the picture highlights the background, but removes the picture border highlight. + +```js +export default function Picture() { + return ( + <div className="background background--active"> + <img + className="picture" + alt="Rainbow houses in Kampung Pelangi, Indonesia" + src="https://i.imgur.com/5qwVYb1.jpeg" + /> + </div> + ); +} +``` + +```css +body { + margin: 0; + padding: 0; + height: 250px; +} + +.background { + width: 100vw; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + background: #eee; +} + +.background--active { + background: #a6b5ff; +} + +.picture { + width: 200px; + height: 200px; + border-radius: 10px; +} + +.picture--active { + border: 5px solid #a6b5ff; +} +``` + +<Solution> + +This component has two visual states: when the image is active, and when the image is inactive: + +- When the image is active, the CSS classes are `background` and `picture picture--active`. +- When the image is inactive, the CSS classes are `background background--active` and `picture`. + +A single boolean state variable is enough to remember whether the image is active. The original task was to remove or add CSS classes. However, in React you need to _describe_ what you want to see rather than _manipulate_ the UI elements. So you need to calculate both CSS classes based on the current state. You also need to [stop the propagation](/learn/responding-to-events#stopping-propagation) so that clicking the image doesn't register as a click on the background. + +Verify that this version works by clicking the image and then outside of it: + +```js +import { useState } from "react"; + +export default function Picture() { + const [isActive, setIsActive] = useState(false); + + let backgroundClassName = "background"; + let pictureClassName = "picture"; + if (isActive) { + pictureClassName += " picture--active"; + } else { + backgroundClassName += " background--active"; + } + + return ( + <div + className={backgroundClassName} + on_click={() => setIsActive(false)} + > + <img + on_click={(e) => { + e.stopPropagation(); + setIsActive(true); + }} + className={pictureClassName} + alt="Rainbow houses in Kampung Pelangi, Indonesia" + src="https://i.imgur.com/5qwVYb1.jpeg" + /> + </div> + ); +} +``` + +```css +body { + margin: 0; + padding: 0; + height: 250px; +} + +.background { + width: 100vw; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + background: #eee; +} + +.background--active { + background: #a6b5ff; +} + +.picture { + width: 200px; + height: 200px; + border-radius: 10px; + border: 5px solid transparent; +} + +.picture--active { + border: 5px solid #a6b5ff; +} +``` + +Alternatively, you could return two separate chunks of JSX: + +```js +import { useState } from "react"; + +export default function Picture() { + const [isActive, setIsActive] = useState(false); + if (isActive) { + return ( + <div className="background" on_click={() => setIsActive(false)}> + <img + className="picture picture--active" + alt="Rainbow houses in Kampung Pelangi, Indonesia" + src="https://i.imgur.com/5qwVYb1.jpeg" + on_click={(e) => e.stopPropagation()} + /> + </div> + ); + } + return ( + <div className="background background--active"> + <img + className="picture" + alt="Rainbow houses in Kampung Pelangi, Indonesia" + src="https://i.imgur.com/5qwVYb1.jpeg" + on_click={() => setIsActive(true)} + /> + </div> + ); +} +``` + +```css +body { + margin: 0; + padding: 0; + height: 250px; +} + +.background { + width: 100vw; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + background: #eee; +} + +.background--active { + background: #a6b5ff; +} + +.picture { + width: 200px; + height: 200px; + border-radius: 10px; + border: 5px solid transparent; +} + +.picture--active { + border: 5px solid #a6b5ff; +} +``` + +Keep in mind that if two different JSX chunks describe the same tree, their nesting (first `<div>` → first `<img>`) has to line up. Otherwise, toggling `isActive` would recreate the whole tree below and [reset its state.](/learn/preserving-and-resetting-state) This is why, if a similar JSX tree gets returned in both cases, it is better to write them as a single piece of JSX. + +</Solution> + +#### Profile editor + +Here is a small form implemented with plain JavaScript and DOM. Play with it to understand its behavior: + +```js +function handleFormSubmit(e) { + e.preventDefault(); + if (editButton.textContent === "Edit Profile") { + editButton.textContent = "Save Profile"; + hide(firstNameText); + hide(lastNameText); + show(firstNameInput); + show(lastNameInput); + } else { + editButton.textContent = "Edit Profile"; + hide(firstNameInput); + hide(lastNameInput); + show(firstNameText); + show(lastNameText); + } +} + +function handleFirstNameChange() { + firstNameText.textContent = firstNameInput.value; + helloText.textContent = + "Hello " + firstNameInput.value + " " + lastNameInput.value + "!"; +} + +function handleLastNameChange() { + lastNameText.textContent = lastNameInput.value; + helloText.textContent = + "Hello " + firstNameInput.value + " " + lastNameInput.value + "!"; +} + +function hide(el) { + el.style.display = "none"; +} + +function show(el) { + el.style.display = ""; +} + +let form = document.getElementById("form"); +let editButton = document.getElementById("editButton"); +let firstNameInput = document.getElementById("firstNameInput"); +let firstNameText = document.getElementById("firstNameText"); +let lastNameInput = document.getElementById("lastNameInput"); +let lastNameText = document.getElementById("lastNameText"); +let helloText = document.getElementById("helloText"); +form.onsubmit = handleFormSubmit; +firstNameInput.oninput = handleFirstNameChange; +lastNameInput.oninput = handleLastNameChange; +``` + +```js +{ + "hardReloadOnChange": true +} +``` + +```html +<form id="form"> + <label> + First name: + <b id="firstNameText">Jane</b> + <input id="firstNameInput" value="Jane" style="display: none" /> + </label> + <label> + Last name: + <b id="lastNameText">Jacobs</b> + <input id="lastNameInput" value="Jacobs" style="display: none" /> + </label> + <button type="submit" id="editButton">Edit Profile</button> + <p><i id="helloText">Hello, Jane Jacobs!</i></p> +</form> + +<style> + * { + box-sizing: border-box; + } + body { + font-family: sans-serif; + margin: 20px; + padding: 0; + } + label { + display: block; + margin-bottom: 20px; + } +</style> +``` + +This form switches between two modes: in the editing mode, you see the inputs, and in the viewing mode, you only see the result. The button label changes between "Edit" and "Save" depending on the mode you're in. When you change the inputs, the welcome message at the bottom updates in real time. + +Your task is to reimplement it in React in the sandbox below. For your convenience, the markup was already converted to JSX, but you'll need to make it show and hide the inputs like the original does. + +Make sure that it updates the text at the bottom, too! + +```js +export default function EditProfile() { + return ( + <form> + <label> + First name: <b>Jane</b> + <input /> + </label> + <label> + Last name: <b>Jacobs</b> + <input /> + </label> + <button type="submit">Edit Profile</button> + <p> + <i>Hello, Jane Jacobs!</i> + </p> + </form> + ); +} +``` + +```css +label { + display: block; + margin-bottom: 20px; +} +``` + +<Solution> + +You will need two state variables to hold the input values: `firstName` and `lastName`. You're also going to need an `isEditing` state variable that holds whether to display the inputs or not. You should _not_ need a `fullName` variable because the full name can always be calculated from the `firstName` and the `lastName`. + +Finally, you should use [conditional rendering](/learn/conditional-rendering) to show or hide the inputs depending on `isEditing`. + +```js +import { useState } from "react"; + +export default function EditProfile() { + const [isEditing, setIsEditing] = useState(false); + const [firstName, setFirstName] = useState("Jane"); + const [lastName, setLastName] = useState("Jacobs"); + + return ( + <form + onSubmit={(e) => { + e.preventDefault(); + setIsEditing(!isEditing); + }} + > + <label> + First name:{" "} + {isEditing ? ( + <input + value={firstName} + onChange={(e) => { + setFirstName(e.target.value); + }} + /> + ) : ( + <b>{firstName}</b> + )} + </label> + <label> + Last name:{" "} + {isEditing ? ( + <input + value={lastName} + onChange={(e) => { + setLastName(e.target.value); + }} + /> + ) : ( + <b>{lastName}</b> + )} + </label> + <button type="submit">{isEditing ? "Save" : "Edit"} Profile</button> + <p> + <i> + Hello, {firstName} {lastName}! + </i> + </p> + </form> + ); +} +``` + +```css +label { + display: block; + margin-bottom: 20px; +} +``` + +Compare this solution to the original imperative code. How are they different? + +</Solution> + +#### Refactor the imperative solution without React + +Here is the original sandbox from the previous challenge, written imperatively without React: + +```js +function handleFormSubmit(e) { + e.preventDefault(); + if (editButton.textContent === "Edit Profile") { + editButton.textContent = "Save Profile"; + hide(firstNameText); + hide(lastNameText); + show(firstNameInput); + show(lastNameInput); + } else { + editButton.textContent = "Edit Profile"; + hide(firstNameInput); + hide(lastNameInput); + show(firstNameText); + show(lastNameText); + } +} + +function handleFirstNameChange() { + firstNameText.textContent = firstNameInput.value; + helloText.textContent = + "Hello " + firstNameInput.value + " " + lastNameInput.value + "!"; +} + +function handleLastNameChange() { + lastNameText.textContent = lastNameInput.value; + helloText.textContent = + "Hello " + firstNameInput.value + " " + lastNameInput.value + "!"; +} + +function hide(el) { + el.style.display = "none"; +} + +function show(el) { + el.style.display = ""; +} + +let form = document.getElementById("form"); +let editButton = document.getElementById("editButton"); +let firstNameInput = document.getElementById("firstNameInput"); +let firstNameText = document.getElementById("firstNameText"); +let lastNameInput = document.getElementById("lastNameInput"); +let lastNameText = document.getElementById("lastNameText"); +let helloText = document.getElementById("helloText"); +form.onsubmit = handleFormSubmit; +firstNameInput.oninput = handleFirstNameChange; +lastNameInput.oninput = handleLastNameChange; +``` + +```js +{ + "hardReloadOnChange": true +} +``` + +```html +<form id="form"> + <label> + First name: + <b id="firstNameText">Jane</b> + <input id="firstNameInput" value="Jane" style="display: none" /> + </label> + <label> + Last name: + <b id="lastNameText">Jacobs</b> + <input id="lastNameInput" value="Jacobs" style="display: none" /> + </label> + <button type="submit" id="editButton">Edit Profile</button> + <p><i id="helloText">Hello, Jane Jacobs!</i></p> +</form> + +<style> + * { + box-sizing: border-box; + } + body { + font-family: sans-serif; + margin: 20px; + padding: 0; + } + label { + display: block; + margin-bottom: 20px; + } +</style> +``` + +Imagine React didn't exist. Can you refactor this code in a way that makes the logic less fragile and more similar to the React version? What would it look like if the state was explicit, like in React? + +If you're struggling to think where to start, the stub below already has most of the structure in place. If you start here, fill in the missing logic in the `updateDOM` function. (Refer to the original code where needed.) + +```js +let firstName = "Jane"; +let lastName = "Jacobs"; +let isEditing = false; + +function handleFormSubmit(e) { + e.preventDefault(); + setIsEditing(!isEditing); +} + +function handleFirstNameChange(e) { + setFirstName(e.target.value); +} + +function handleLastNameChange(e) { + setLastName(e.target.value); +} + +function setFirstName(value) { + firstName = value; + updateDOM(); +} + +function setLastName(value) { + lastName = value; + updateDOM(); +} + +function setIsEditing(value) { + isEditing = value; + updateDOM(); +} + +function updateDOM() { + if (isEditing) { + editButton.textContent = "Save Profile"; + // TODO: show inputs, hide content + } else { + editButton.textContent = "Edit Profile"; + // TODO: hide inputs, show content + } + // TODO: update text labels +} + +function hide(el) { + el.style.display = "none"; +} + +function show(el) { + el.style.display = ""; +} + +let form = document.getElementById("form"); +let editButton = document.getElementById("editButton"); +let firstNameInput = document.getElementById("firstNameInput"); +let firstNameText = document.getElementById("firstNameText"); +let lastNameInput = document.getElementById("lastNameInput"); +let lastNameText = document.getElementById("lastNameText"); +let helloText = document.getElementById("helloText"); +form.onsubmit = handleFormSubmit; +firstNameInput.oninput = handleFirstNameChange; +lastNameInput.oninput = handleLastNameChange; +``` + +```js +{ + "hardReloadOnChange": true +} +``` + +```html +<form id="form"> + <label> + First name: + <b id="firstNameText">Jane</b> + <input id="firstNameInput" value="Jane" style="display: none" /> + </label> + <label> + Last name: + <b id="lastNameText">Jacobs</b> + <input id="lastNameInput" value="Jacobs" style="display: none" /> + </label> + <button type="submit" id="editButton">Edit Profile</button> + <p><i id="helloText">Hello, Jane Jacobs!</i></p> +</form> + +<style> + * { + box-sizing: border-box; + } + body { + font-family: sans-serif; + margin: 20px; + padding: 0; + } + label { + display: block; + margin-bottom: 20px; + } +</style> +``` + +<Solution> + +The missing logic included toggling the display of inputs and content, and updating the labels: + +```js +let firstName = "Jane"; +let lastName = "Jacobs"; +let isEditing = false; + +function handleFormSubmit(e) { + e.preventDefault(); + setIsEditing(!isEditing); +} + +function handleFirstNameChange(e) { + setFirstName(e.target.value); +} + +function handleLastNameChange(e) { + setLastName(e.target.value); +} + +function setFirstName(value) { + firstName = value; + updateDOM(); +} + +function setLastName(value) { + lastName = value; + updateDOM(); +} + +function setIsEditing(value) { + isEditing = value; + updateDOM(); +} + +function updateDOM() { + if (isEditing) { + editButton.textContent = "Save Profile"; + hide(firstNameText); + hide(lastNameText); + show(firstNameInput); + show(lastNameInput); + } else { + editButton.textContent = "Edit Profile"; + hide(firstNameInput); + hide(lastNameInput); + show(firstNameText); + show(lastNameText); + } + firstNameText.textContent = firstName; + lastNameText.textContent = lastName; + helloText.textContent = "Hello " + firstName + " " + lastName + "!"; +} + +function hide(el) { + el.style.display = "none"; +} + +function show(el) { + el.style.display = ""; +} + +let form = document.getElementById("form"); +let editButton = document.getElementById("editButton"); +let firstNameInput = document.getElementById("firstNameInput"); +let firstNameText = document.getElementById("firstNameText"); +let lastNameInput = document.getElementById("lastNameInput"); +let lastNameText = document.getElementById("lastNameText"); +let helloText = document.getElementById("helloText"); +form.onsubmit = handleFormSubmit; +firstNameInput.oninput = handleFirstNameChange; +lastNameInput.oninput = handleLastNameChange; +``` + +```js +{ + "hardReloadOnChange": true +} +``` + +```html +<form id="form"> + <label> + First name: + <b id="firstNameText">Jane</b> + <input id="firstNameInput" value="Jane" style="display: none" /> + </label> + <label> + Last name: + <b id="lastNameText">Jacobs</b> + <input id="lastNameInput" value="Jacobs" style="display: none" /> + </label> + <button type="submit" id="editButton">Edit Profile</button> + <p><i id="helloText">Hello, Jane Jacobs!</i></p> +</form> + +<style> + * { + box-sizing: border-box; + } + body { + font-family: sans-serif; + margin: 20px; + padding: 0; + } + label { + display: block; + margin-bottom: 20px; + } +</style> +``` + +The `updateDOM` function you wrote shows what React does under the hood when you set the state. (However, React also avoids touching the DOM for properties that have not changed since the last time they were set.) + +</Solution> + +</Challenges> diff --git a/docs/src/learn/referencing-values-with-refs.md b/docs/src/learn/referencing-values-with-refs.md new file mode 100644 index 000000000..3d1fd7d42 --- /dev/null +++ b/docs/src/learn/referencing-values-with-refs.md @@ -0,0 +1,569 @@ +--- +title: "Referencing Values with Refs 🚧" +--- + +## Overview + +<p class="intro" markdown> + +When you want a component to "remember" some information, but you don't want that information to [trigger new renders](/learn/render-and-commit), you can use a _ref_. + +</p> + +!!! summary "You Will Learn" + + - How to add a ref to your component + - How to update a ref's value + - How refs are different from state + - How to use refs safely + +## Adding a ref to your component + +You can add a ref to your component by importing the `useRef` Hook from React: + +```js +import { useRef } from "react"; +``` + +Inside your component, call the `useRef` Hook and pass the initial value that you want to reference as the only argument. For example, here is a ref to the value `0`: + +```js +const ref = useRef(0); +``` + +`useRef` returns an object like this: + +```js +{ + current: 0; // The value you passed to useRef +} +``` + +<Illustration src="/images/docs/illustrations/i_ref.png" alt="An arrow with 'current' written on it stuffed into a pocket with 'ref' written on it." /> + +You can access the current value of that ref through the `ref.current` property. This value is intentionally mutable, meaning you can both read and write to it. It's like a secret pocket of your component that React doesn't track. (This is what makes it an "escape hatch" from React's one-way data flow--more on that below!) + +Here, a button will increment `ref.current` on every click: + +```js +import { useRef } from "react"; + +export default function Counter() { + let ref = useRef(0); + + function handleClick() { + ref.current = ref.current + 1; + alert("You clicked " + ref.current + " times!"); + } + + return <button on_click={handleClick}>Click me!</button>; +} +``` + +The ref points to a number, but, like [state](/learn/state-a-components-memory), you could point to anything: a string, an object, or even a function. Unlike state, ref is a plain JavaScript object with the `current` property that you can read and modify. + +Note that **the component doesn't re-render with every increment.** Like state, refs are retained by React between re-renders. However, setting state re-renders a component. Changing a ref does not! + +## Example: building a stopwatch + +You can combine refs and state in a single component. For example, let's make a stopwatch that the user can start or stop by pressing a button. In order to display how much time has passed since the user pressed "Start", you will need to keep track of when the Start button was pressed and what the current time is. **This information is used for rendering, so you'll keep it in state:** + +```js +const [startTime, setStartTime] = useState(null); +const [now, setNow] = useState(null); +``` + +When the user presses "Start", you'll use [`setInterval`](https://developer.mozilla.org/docs/Web/API/setInterval) in order to update the time every 10 milliseconds: + +```js +import { useState } from "react"; + +export default function Stopwatch() { + const [startTime, setStartTime] = useState(null); + const [now, setNow] = useState(null); + + function handleStart() { + // Start counting. + setStartTime(Date.now()); + setNow(Date.now()); + + setInterval(() => { + // Update the current time every 10ms. + setNow(Date.now()); + }, 10); + } + + let secondsPassed = 0; + if (startTime != null && now != null) { + secondsPassed = (now - startTime) / 1000; + } + + return ( + <> + <h1>Time passed: {secondsPassed.toFixed(3)}</h1> + <button on_click={handleStart}>Start</button> + </> + ); +} +``` + +When the "Stop" button is pressed, you need to cancel the existing interval so that it stops updating the `now` state variable. You can do this by calling [`clearInterval`](https://developer.mozilla.org/en-US/docs/Web/API/clearInterval), but you need to give it the interval ID that was previously returned by the `setInterval` call when the user pressed Start. You need to keep the interval ID somewhere. **Since the interval ID is not used for rendering, you can keep it in a ref:** + +```js +import { useState, useRef } from "react"; + +export default function Stopwatch() { + const [startTime, setStartTime] = useState(null); + const [now, setNow] = useState(null); + const intervalRef = useRef(null); + + function handleStart() { + setStartTime(Date.now()); + setNow(Date.now()); + + clearInterval(intervalRef.current); + intervalRef.current = setInterval(() => { + setNow(Date.now()); + }, 10); + } + + function handleStop() { + clearInterval(intervalRef.current); + } + + let secondsPassed = 0; + if (startTime != null && now != null) { + secondsPassed = (now - startTime) / 1000; + } + + return ( + <> + <h1>Time passed: {secondsPassed.toFixed(3)}</h1> + <button on_click={handleStart}>Start</button> + <button on_click={handleStop}>Stop</button> + </> + ); +} +``` + +When a piece of information is used for rendering, keep it in state. When a piece of information is only needed by event handlers and changing it doesn't require a re-render, using a ref may be more efficient. + +## Differences between refs and state + +Perhaps you're thinking refs seem less "strict" than state—you can mutate them instead of always having to use a state setting function, for instance. But in most cases, you'll want to use state. Refs are an "escape hatch" you won't need often. Here's how state and refs compare: + +| refs | state | +| --- | --- | +| `useRef(initialValue)` returns `{ current: initialValue }` | `useState(initialValue)` returns the current value of a state variable and a state setter function ( `[value, setValue]`) | +| Doesn't trigger re-render when you change it. | Triggers re-render when you change it. | +| Mutable—you can modify and update `current`'s value outside of the rendering process. | "Immutable"—you must use the state setting function to modify state variables to queue a re-render. | +| You shouldn't read (or write) the `current` value during rendering. | You can read state at any time. However, each render has its own [snapshot](/learn/state-as-a-snapshot) of state which does not change. | + +Here is a counter button that's implemented with state: + +```js +import { useState } from "react"; + +export default function Counter() { + const [count, setCount] = useState(0); + + function handleClick() { + setCount(count + 1); + } + + return <button on_click={handleClick}>You clicked {count} times</button>; +} +``` + +Because the `count` value is displayed, it makes sense to use a state value for it. When the counter's value is set with `setCount()`, React re-renders the component and the screen updates to reflect the new count. + +If you tried to implement this with a ref, React would never re-render the component, so you'd never see the count change! See how clicking this button **does not update its text**: + +```js +import { useRef } from "react"; + +export default function Counter() { + let countRef = useRef(0); + + function handleClick() { + // This doesn't re-render the component! + countRef.current = countRef.current + 1; + } + + return ( + <button on_click={handleClick}> + You clicked {countRef.current} times + </button> + ); +} +``` + +This is why reading `ref.current` during render leads to unreliable code. If you need that, use state instead. + +<DeepDive> + +#### How does useRef work inside? + +Although both `useState` and `useRef` are provided by React, in principle `useRef` could be implemented _on top of_ `useState`. You can imagine that inside of React, `useRef` is implemented like this: + +```js +// Inside of React +function useRef(initialValue) { + const [ref, unused] = useState({ current: initialValue }); + return ref; +} +``` + +During the first render, `useRef` returns `{ current: initialValue }`. This object is stored by React, so during the next render the same object will be returned. Note how the state setter is unused in this example. It is unnecessary because `useRef` always needs to return the same object! + +React provides a built-in version of `useRef` because it is common enough in practice. But you can think of it as a regular state variable without a setter. If you're familiar with object-oriented programming, refs might remind you of instance fields--but instead of `this.something` you write `somethingRef.current`. + +</DeepDive> + +## When to use refs + +Typically, you will use a ref when your component needs to "step outside" React and communicate with external APIs—often a browser API that won't impact the appearance of the component. Here are a few of these rare situations: + +- Storing [timeout IDs](https://developer.mozilla.org/docs/Web/API/setTimeout) +- Storing and manipulating [DOM elements](https://developer.mozilla.org/docs/Web/API/Element), which we cover on [the next page](/learn/manipulating-the-dom-with-refs) +- Storing other objects that aren't necessary to calculate the JSX. + +If your component needs to store some value, but it doesn't impact the rendering logic, choose refs. + +## Best practices for refs + +Following these principles will make your components more predictable: + +- **Treat refs as an escape hatch.** Refs are useful when you work with external systems or browser APIs. If much of your application logic and data flow relies on refs, you might want to rethink your approach. +- **Don't read or write `ref.current` during rendering.** If some information is needed during rendering, use [state](/learn/state-a-components-memory) instead. Since React doesn't know when `ref.current` changes, even reading it while rendering makes your component's behavior difficult to predict. (The only exception to this is code like `if (!ref.current) ref.current = new Thing()` which only sets the ref once during the first render.) + +Limitations of React state don't apply to refs. For example, state acts like a [snapshot for every render](/learn/state-as-a-snapshot) and [doesn't update synchronously.](/learn/queueing-a-series-of-state-updates) But when you mutate the current value of a ref, it changes immediately: + +```js +ref.current = 5; +console.log(ref.current); // 5 +``` + +This is because **the ref itself is a regular JavaScript object,** and so it behaves like one. + +You also don't need to worry about [avoiding mutation](/learn/updating-objects-in-state) when you work with a ref. As long as the object you're mutating isn't used for rendering, React doesn't care what you do with the ref or its contents. + +## Refs and the DOM + +You can point a ref to any value. However, the most common use case for a ref is to access a DOM element. For example, this is handy if you want to focus an input programmatically. When you pass a ref to a `ref` attribute in JSX, like `<div ref={myRef}>`, React will put the corresponding DOM element into `myRef.current`. You can read more about this in [Manipulating the DOM with Refs.](/learn/manipulating-the-dom-with-refs) + +<Recap> + +- Refs are an escape hatch to hold onto values that aren't used for rendering. You won't need them often. +- A ref is a plain JavaScript object with a single property called `current`, which you can read or set. +- You can ask React to give you a ref by calling the `useRef` Hook. +- Like state, refs let you retain information between re-renders of a component. +- Unlike state, setting the ref's `current` value does not trigger a re-render. +- Don't read or write `ref.current` during rendering. This makes your component hard to predict. + +</Recap> + +<Challenges> + +#### Fix a broken chat input + +Type a message and click "Send". You will notice there is a three second delay before you see the "Sent!" alert. During this delay, you can see an "Undo" button. Click it. This "Undo" button is supposed to stop the "Sent!" message from appearing. It does this by calling [`clearTimeout`](https://developer.mozilla.org/en-US/docs/Web/API/clearTimeout) for the timeout ID saved during `handleSend`. However, even after "Undo" is clicked, the "Sent!" message still appears. Find why it doesn't work, and fix it. + +<Hint> + +Regular variables like `let timeoutID` don't "survive" between re-renders because every render runs your component (and initializes its variables) from scratch. Should you keep the timeout ID somewhere else? + +</Hint> + +```js +import { useState } from "react"; + +export default function Chat() { + const [text, setText] = useState(""); + const [isSending, setIsSending] = useState(false); + let timeoutID = null; + + function handleSend() { + setIsSending(true); + timeoutID = setTimeout(() => { + alert("Sent!"); + setIsSending(false); + }, 3000); + } + + function handleUndo() { + setIsSending(false); + clearTimeout(timeoutID); + } + + return ( + <> + <input + disabled={isSending} + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button disabled={isSending} on_click={handleSend}> + {isSending ? "Sending..." : "Send"} + </button> + {isSending && <button on_click={handleUndo}>Undo</button>} + </> + ); +} +``` + +<Solution> + +Whenever your component re-renders (such as when you set state), all local variables get initialized from scratch. This is why you can't save the timeout ID in a local variable like `timeoutID` and then expect another event handler to "see" it in the future. Instead, store it in a ref, which React will preserve between renders. + +```js +import { useState, useRef } from "react"; + +export default function Chat() { + const [text, setText] = useState(""); + const [isSending, setIsSending] = useState(false); + const timeoutRef = useRef(null); + + function handleSend() { + setIsSending(true); + timeoutRef.current = setTimeout(() => { + alert("Sent!"); + setIsSending(false); + }, 3000); + } + + function handleUndo() { + setIsSending(false); + clearTimeout(timeoutRef.current); + } + + return ( + <> + <input + disabled={isSending} + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button disabled={isSending} on_click={handleSend}> + {isSending ? "Sending..." : "Send"} + </button> + {isSending && <button on_click={handleUndo}>Undo</button>} + </> + ); +} +``` + +</Solution> + +#### Fix a component failing to re-render + +This button is supposed to toggle between showing "On" and "Off". However, it always shows "Off". What is wrong with this code? Fix it. + +```js +import { useRef } from "react"; + +export default function Toggle() { + const isOnRef = useRef(false); + + return ( + <button + on_click={() => { + isOnRef.current = !isOnRef.current; + }} + > + {isOnRef.current ? "On" : "Off"} + </button> + ); +} +``` + +<Solution> + +In this example, the current value of a ref is used to calculate the rendering output: `{isOnRef.current ? 'On' : 'Off'}`. This is a sign that this information should not be in a ref, and should have instead been put in state. To fix it, remove the ref and use state instead: + +```js +import { useState } from "react"; + +export default function Toggle() { + const [isOn, setIsOn] = useState(false); + + return ( + <button + on_click={() => { + setIsOn(!isOn); + }} + > + {isOn ? "On" : "Off"} + </button> + ); +} +``` + +</Solution> + +#### Fix debouncing + +In this example, all button click handlers are ["debounced".](https://redd.one/blog/debounce-vs-throttle) To see what this means, press one of the buttons. Notice how the message appears a second later. If you press the button while waiting for the message, the timer will reset. So if you keep clicking the same button fast many times, the message won't appear until a second _after_ you stop clicking. Debouncing lets you delay some action until the user "stops doing things". + +This example works, but not quite as intended. The buttons are not independent. To see the problem, click one of the buttons, and then immediately click another button. You'd expect that after a delay, you would see both button's messages. But only the last button's message shows up. The first button's message gets lost. + +Why are the buttons interfering with each other? Find and fix the issue. + +<Hint> + +The last timeout ID variable is shared between all `DebouncedButton` components. This is why clicking one button resets another button's timeout. Can you store a separate timeout ID for each button? + +</Hint> + +```js +let timeoutID; + +function DebouncedButton({ on_click, children }) { + return ( + <button + on_click={() => { + clearTimeout(timeoutID); + timeoutID = setTimeout(() => { + on_click(); + }, 1000); + }} + > + {children} + </button> + ); +} + +export default function Dashboard() { + return ( + <> + <DebouncedButton on_click={() => alert("Spaceship launched!")}> + Launch the spaceship + </DebouncedButton> + <DebouncedButton on_click={() => alert("Soup boiled!")}> + Boil the soup + </DebouncedButton> + <DebouncedButton on_click={() => alert("Lullaby sung!")}> + Sing a lullaby + </DebouncedButton> + </> + ); +} +``` + +```css +button { + display: block; + margin: 10px; +} +``` + +<Solution> + +A variable like `timeoutID` is shared between all components. This is why clicking on the second button resets the first button's pending timeout. To fix this, you can keep timeout in a ref. Each button will get its own ref, so they won't conflict with each other. Notice how clicking two buttons fast will show both messages. + +```js +import { useRef } from "react"; + +function DebouncedButton({ on_click, children }) { + const timeoutRef = useRef(null); + return ( + <button + on_click={() => { + clearTimeout(timeoutRef.current); + timeoutRef.current = setTimeout(() => { + on_click(); + }, 1000); + }} + > + {children} + </button> + ); +} + +export default function Dashboard() { + return ( + <> + <DebouncedButton on_click={() => alert("Spaceship launched!")}> + Launch the spaceship + </DebouncedButton> + <DebouncedButton on_click={() => alert("Soup boiled!")}> + Boil the soup + </DebouncedButton> + <DebouncedButton on_click={() => alert("Lullaby sung!")}> + Sing a lullaby + </DebouncedButton> + </> + ); +} +``` + +```css +button { + display: block; + margin: 10px; +} +``` + +</Solution> + +#### Read the latest state + +In this example, after you press "Send", there is a small delay before the message is shown. Type "hello", press Send, and then quickly edit the input again. Despite your edits, the alert would still show "hello" (which was the value of state [at the time](/learn/state-as-a-snapshot#state-over-time) the button was clicked). + +Usually, this behavior is what you want in an app. However, there may be occasional cases where you want some asynchronous code to read the _latest_ version of some state. Can you think of a way to make the alert show the _current_ input text rather than what it was at the time of the click? + +```js +import { useState, useRef } from "react"; + +export default function Chat() { + const [text, setText] = useState(""); + + function handleSend() { + setTimeout(() => { + alert("Sending: " + text); + }, 3000); + } + + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <button on_click={handleSend}>Send</button> + </> + ); +} +``` + +<Solution> + +State works [like a snapshot](/learn/state-as-a-snapshot), so you can't read the latest state from an asynchronous operation like a timeout. However, you can keep the latest input text in a ref. A ref is mutable, so you can read the `current` property at any time. Since the current text is also used for rendering, in this example, you will need _both_ a state variable (for rendering), _and_ a ref (to read it in the timeout). You will need to update the current ref value manually. + +```js +import { useState, useRef } from "react"; + +export default function Chat() { + const [text, setText] = useState(""); + const textRef = useRef(text); + + function handleChange(e) { + setText(e.target.value); + textRef.current = e.target.value; + } + + function handleSend() { + setTimeout(() => { + alert("Sending: " + textRef.current); + }, 3000); + } + + return ( + <> + <input value={text} onChange={handleChange} /> + <button on_click={handleSend}>Send</button> + </> + ); +} +``` + +</Solution> + +</Challenges> diff --git a/docs/src/learn/removing-effect-dependencies.md b/docs/src/learn/removing-effect-dependencies.md new file mode 100644 index 000000000..55a983a27 --- /dev/null +++ b/docs/src/learn/removing-effect-dependencies.md @@ -0,0 +1,2421 @@ +--- +title: "Removing Effect Dependencies 🚧" +--- + +## Overview + +<p class="intro" markdown> + +When you write an Effect, the linter will verify that you've included every reactive value (like props and state) that the Effect reads in the list of your Effect's dependencies. This ensures that your Effect remains synchronized with the latest props and state of your component. Unnecessary dependencies may cause your Effect to run too often, or even create an infinite loop. Follow this guide to review and remove unnecessary dependencies from your Effects. + +</p> + +!!! summary "You Will Learn" + + - How to fix infinite Effect dependency loops + - What to do when you want to remove a dependency + - How to read a value from your Effect without "reacting" to it + - How and why to avoid object and function dependencies + - Why suppressing the dependency linter is dangerous, and what to do instead + +## Dependencies should match the code + +When you write an Effect, you first specify how to [start and stop](/learn/lifecycle-of-reactive-effects#the-lifecycle-of-an-effect) whatever you want your Effect to be doing: + +```js +const serverUrl = 'https://localhost:1234'; + +function ChatRoom({ roomId }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + // ... +} +``` + +Then, if you leave the Effect dependencies empty (`[]`), the linter will suggest the correct dependencies: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, []); // <-- Fix the mistake here! + return <h1>Welcome to the {roomId} room!</h1>; +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +Fill them in according to what the linter says: + +```js +function ChatRoom({ roomId }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); // ✅ All dependencies declared + // ... +} +``` + +[Effects "react" to reactive values.](/learn/lifecycle-of-reactive-effects#effects-react-to-reactive-values) Since `roomId` is a reactive value (it can change due to a re-render), the linter verifies that you've specified it as a dependency. If `roomId` receives a different value, React will re-synchronize your Effect. This ensures that the chat stays connected to the selected room and "reacts" to the dropdown: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + return <h1>Welcome to the {roomId} room!</h1>; +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +### To remove a dependency, prove that it's not a dependency + +Notice that you can't "choose" the dependencies of your Effect. Every <CodeStep step={2}>reactive value</CodeStep> used by your Effect's code must be declared in your dependency list. The dependency list is determined by the surrounding code: + +```js +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + // This is a reactive value + useEffect(() => { + const connection = createConnection(serverUrl, roomId); // This Effect reads that reactive value + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); // ✅ So you must specify that reactive value as a dependency of your Effect + // ... +} +``` + +[Reactive values](/learn/lifecycle-of-reactive-effects#all-variables-declared-in-the-component-body-are-reactive) include props and all variables and functions declared directly inside of your component. Since `roomId` is a reactive value, you can't remove it from the dependency list. The linter wouldn't allow it: + +```js +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, []); // 🔴 React Hook useEffect has a missing dependency: 'roomId' + // ... +} +``` + +And the linter would be right! Since `roomId` may change over time, this would introduce a bug in your code. + +**To remove a dependency, "prove" to the linter that it _doesn't need_ to be a dependency.** For example, you can move `roomId` out of your component to prove that it's not reactive and won't change on re-renders: + +```js +const serverUrl = "https://localhost:1234"; +const roomId = "music"; // Not a reactive value anymore + +function ChatRoom() { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, []); // ✅ All dependencies declared + // ... +} +``` + +Now that `roomId` is not a reactive value (and can't change on a re-render), it doesn't need to be a dependency: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; +const roomId = "music"; + +export default function ChatRoom() { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, []); + return <h1>Welcome to the {roomId} room!</h1>; +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +This is why you could now specify an [empty (`[]`) dependency list.](/learn/lifecycle-of-reactive-effects#what-an-effect-with-empty-dependencies-means) Your Effect _really doesn't_ depend on any reactive value anymore, so it _really doesn't_ need to re-run when any of the component's props or state change. + +### To change the dependencies, change the code + +You might have noticed a pattern in your workflow: + +1. First, you **change the code** of your Effect or how your reactive values are declared. +2. Then, you follow the linter and adjust the dependencies to **match the code you have changed.** +3. If you're not happy with the list of dependencies, you **go back to the first step** (and change the code again). + +The last part is important. **If you want to change the dependencies, change the surrounding code first.** You can think of the dependency list as [a list of all the reactive values used by your Effect's code.](/learn/lifecycle-of-reactive-effects#react-verifies-that-you-specified-every-reactive-value-as-a-dependency) You don't _choose_ what to put on that list. The list _describes_ your code. To change the dependency list, change the code. + +This might feel like solving an equation. You might start with a goal (for example, to remove a dependency), and you need to "find" the code matching that goal. Not everyone finds solving equations fun, and the same thing could be said about writing Effects! Luckily, there is a list of common recipes that you can try below. + +<Pitfall> + +If you have an existing codebase, you might have some Effects that suppress the linter like this: + +```js +useEffect(() => { + // ... + // 🔴 Avoid suppressing the linter like this: + // eslint-ignore-next-line react-hooks/exhaustive-deps +}, []); +``` + +**When dependencies don't match the code, there is a very high risk of introducing bugs.** By suppressing the linter, you "lie" to React about the values your Effect depends on. + +Instead, use the techniques below. + +</Pitfall> + +<DeepDive> + +#### Why is suppressing the dependency linter so dangerous? + +Suppressing the linter leads to very unintuitive bugs that are hard to find and fix. Here's one example: + +```js +import { useState, useEffect } from "react"; + +export default function Timer() { + const [count, setCount] = useState(0); + const [increment, setIncrement] = useState(1); + + function onTick() { + setCount(count + increment); + } + + useEffect(() => { + const id = setInterval(onTick, 1000); + return () => clearInterval(id); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + <> + <h1> + Counter: {count} + <button on_click={() => setCount(0)}>Reset</button> + </h1> + <hr /> + <p> + Every second, increment by: + <button + disabled={increment === 0} + on_click={() => { + setIncrement((i) => i - 1); + }} + > + – + </button> + <b>{increment}</b> + <button + on_click={() => { + setIncrement((i) => i + 1); + }} + > + + + </button> + </p> + </> + ); +} +``` + +```css +button { + margin: 10px; +} +``` + +Let's say that you wanted to run the Effect "only on mount". You've read that [empty (`[]`) dependencies](/learn/lifecycle-of-reactive-effects#what-an-effect-with-empty-dependencies-means) do that, so you've decided to ignore the linter, and forcefully specified `[]` as the dependencies. + +This counter was supposed to increment every second by the amount configurable with the two buttons. However, since you "lied" to React that this Effect doesn't depend on anything, React forever keeps using the `onTick` function from the initial render. [During that render,](/learn/state-as-a-snapshot#rendering-takes-a-snapshot-in-time) `count` was `0` and `increment` was `1`. This is why `onTick` from that render always calls `setCount(0 + 1)` every second, and you always see `1`. Bugs like this are harder to fix when they're spread across multiple components. + +There's always a better solution than ignoring the linter! To fix this code, you need to add `onTick` to the dependency list. (To ensure the interval is only setup once, [make `onTick` an Effect Event.](/learn/separating-events-from-effects#reading-latest-props-and-state-with-effect-events)) + +**We recommend treating the dependency lint error as a compilation error. If you don't suppress it, you will never see bugs like this.** The rest of this page documents the alternatives for this and other cases. + +</DeepDive> + +## Removing unnecessary dependencies + +Every time you adjust the Effect's dependencies to reflect the code, look at the dependency list. Does it make sense for the Effect to re-run when any of these dependencies change? Sometimes, the answer is "no": + +- You might want to re-execute _different parts_ of your Effect under different conditions. +- You might want to only read the _latest value_ of some dependency instead of "reacting" to its changes. +- A dependency may change too often _unintentionally_ because it's an object or a function. + +To find the right solution, you'll need to answer a few questions about your Effect. Let's walk through them. + +### Should this code move to an event handler? + +The first thing you should think about is whether this code should be an Effect at all. + +Imagine a form. On submit, you set the `submitted` state variable to `true`. You need to send a POST request and show a notification. You've put this logic inside an Effect that "reacts" to `submitted` being `true`: + +```js +function Form() { + const [submitted, setSubmitted] = useState(false); + + useEffect(() => { + if (submitted) { + // 🔴 Avoid: Event-specific logic inside an Effect + post("/api/register"); + showNotification("Successfully registered!"); + } + }, [submitted]); + + function handleSubmit() { + setSubmitted(true); + } + + // ... +} +``` + +Later, you want to style the notification message according to the current theme, so you read the current theme. Since `theme` is declared in the component body, it is a reactive value, so you add it as a dependency: + +```js +function Form() { + const [submitted, setSubmitted] = useState(false); + const theme = useContext(ThemeContext); + + useEffect(() => { + if (submitted) { + // 🔴 Avoid: Event-specific logic inside an Effect + post("/api/register"); + showNotification("Successfully registered!", theme); + } + }, [submitted, theme]); // ✅ All dependencies declared + + function handleSubmit() { + setSubmitted(true); + } + + // ... +} +``` + +By doing this, you've introduced a bug. Imagine you submit the form first and then switch between Dark and Light themes. The `theme` will change, the Effect will re-run, and so it will display the same notification again! + +**The problem here is that this shouldn't be an Effect in the first place.** You want to send this POST request and show the notification in response to _submitting the form,_ which is a particular interaction. To run some code in response to particular interaction, put that logic directly into the corresponding event handler: + +```js +function Form() { + const theme = useContext(ThemeContext); + + function handleSubmit() { + // ✅ Good: Event-specific logic is called from event handlers + post("/api/register"); + showNotification("Successfully registered!", theme); + } + + // ... +} +``` + +Now that the code is in an event handler, it's not reactive--so it will only run when the user submits the form. Read more about [choosing between event handlers and Effects](/learn/separating-events-from-effects#reactive-values-and-reactive-logic) and [how to delete unnecessary Effects.](/learn/you-might-not-need-an-effect) + +### Is your Effect doing several unrelated things? + +The next question you should ask yourself is whether your Effect is doing several unrelated things. + +Imagine you're creating a shipping form where the user needs to choose their city and area. You fetch the list of `cities` from the server according to the selected `country` to show them in a dropdown: + +```js +function ShippingForm({ country }) { + const [cities, setCities] = useState(null); + const [city, setCity] = useState(null); + + useEffect(() => { + let ignore = false; + fetch(`/api/cities?country=${country}`) + .then(response => response.json()) + .then(json => { + if (!ignore) { + setCities(json); + } + }); + return () => { + ignore = true; + }; + }, [country]); // ✅ All dependencies declared + + // ... +``` + +This is a good example of [fetching data in an Effect.](/learn/you-might-not-need-an-effect#fetching-data) You are synchronizing the `cities` state with the network according to the `country` prop. You can't do this in an event handler because you need to fetch as soon as `ShippingForm` is displayed and whenever the `country` changes (no matter which interaction causes it). + +Now let's say you're adding a second select box for city areas, which should fetch the `areas` for the currently selected `city`. You might start by adding a second `fetch` call for the list of areas inside the same Effect: + +```js +function ShippingForm({ country }) { + const [cities, setCities] = useState(null); + const [city, setCity] = useState(null); + const [areas, setAreas] = useState(null); + + useEffect(() => { + let ignore = false; + fetch(`/api/cities?country=${country}`) + .then(response => response.json()) + .then(json => { + if (!ignore) { + setCities(json); + } + }); + // 🔴 Avoid: A single Effect synchronizes two independent processes + if (city) { + fetch(`/api/areas?city=${city}`) + .then(response => response.json()) + .then(json => { + if (!ignore) { + setAreas(json); + } + }); + } + return () => { + ignore = true; + }; + }, [country, city]); // ✅ All dependencies declared + + // ... +``` + +However, since the Effect now uses the `city` state variable, you've had to add `city` to the list of dependencies. That, in turn, introduced a problem: when the user selects a different city, the Effect will re-run and call `fetchCities(country)`. As a result, you will be unnecessarily refetching the list of cities many times. + +**The problem with this code is that you're synchronizing two different unrelated things:** + +1. You want to synchronize the `cities` state to the network based on the `country` prop. +1. You want to synchronize the `areas` state to the network based on the `city` state. + +Split the logic into two Effects, each of which reacts to the prop that it needs to synchronize with: + +```js +function ShippingForm({ country }) { + const [cities, setCities] = useState(null); + useEffect(() => { + let ignore = false; + fetch(`/api/cities?country=${country}`) + .then(response => response.json()) + .then(json => { + if (!ignore) { + setCities(json); + } + }); + return () => { + ignore = true; + }; + }, [country]); // ✅ All dependencies declared + + const [city, setCity] = useState(null); + const [areas, setAreas] = useState(null); + useEffect(() => { + if (city) { + let ignore = false; + fetch(`/api/areas?city=${city}`) + .then(response => response.json()) + .then(json => { + if (!ignore) { + setAreas(json); + } + }); + return () => { + ignore = true; + }; + } + }, [city]); // ✅ All dependencies declared + + // ... +``` + +Now the first Effect only re-runs if the `country` changes, while the second Effect re-runs when the `city` changes. You've separated them by purpose: two different things are synchronized by two separate Effects. Two separate Effects have two separate dependency lists, so they won't trigger each other unintentionally. + +The final code is longer than the original, but splitting these Effects is still correct. [Each Effect should represent an independent synchronization process.](/learn/lifecycle-of-reactive-effects#each-effect-represents-a-separate-synchronization-process) In this example, deleting one Effect doesn't break the other Effect's logic. This means they _synchronize different things,_ and it's good to split them up. If you're concerned about duplication, you can improve this code by [extracting repetitive logic into a custom Hook.](/learn/reusing-logic-with-custom-hooks#when-to-use-custom-hooks) + +### Are you reading some state to calculate the next state? + +This Effect updates the `messages` state variable with a newly created array every time a new message arrives: + +```js +function ChatRoom({ roomId }) { + const [messages, setMessages] = useState([]); + useEffect(() => { + const connection = createConnection(); + connection.connect(); + connection.on('message', (receivedMessage) => { + setMessages([...messages, receivedMessage]); + }); + // ... +``` + +It uses the `messages` variable to [create a new array](/learn/updating-arrays-in-state) starting with all the existing messages and adds the new message at the end. However, since `messages` is a reactive value read by an Effect, it must be a dependency: + +```js +function ChatRoom({ roomId }) { + const [messages, setMessages] = useState([]); + useEffect(() => { + const connection = createConnection(); + connection.connect(); + connection.on('message', (receivedMessage) => { + setMessages([...messages, receivedMessage]); + }); + return () => connection.disconnect(); + }, [roomId, messages]); // ✅ All dependencies declared + // ... +``` + +And making `messages` a dependency introduces a problem. + +Every time you receive a message, `setMessages()` causes the component to re-render with a new `messages` array that includes the received message. However, since this Effect now depends on `messages`, this will _also_ re-synchronize the Effect. So every new message will make the chat re-connect. The user would not like that! + +To fix the issue, don't read `messages` inside the Effect. Instead, pass an [updater function](/reference/react/useState#updating-state-based-on-the-previous-state) to `setMessages`: + +```js +function ChatRoom({ roomId }) { + const [messages, setMessages] = useState([]); + useEffect(() => { + const connection = createConnection(); + connection.connect(); + connection.on('message', (receivedMessage) => { + setMessages(msgs => [...msgs, receivedMessage]); + }); + return () => connection.disconnect(); + }, [roomId]); // ✅ All dependencies declared + // ... +``` + +**Notice how your Effect does not read the `messages` variable at all now.** You only need to pass an updater function like `msgs => [...msgs, receivedMessage]`. React [puts your updater function in a queue](/learn/queueing-a-series-of-state-updates) and will provide the `msgs` argument to it during the next render. This is why the Effect itself doesn't need to depend on `messages` anymore. As a result of this fix, receiving a chat message will no longer make the chat re-connect. + +### Do you want to read a value without "reacting" to its changes? + +<Wip> + +This section describes an **experimental API that has not yet been released** in a stable version of React. + +</Wip> + +Suppose that you want to play a sound when the user receives a new message unless `isMuted` is `true`: + +```js +function ChatRoom({ roomId }) { + const [messages, setMessages] = useState([]); + const [isMuted, setIsMuted] = useState(false); + + useEffect(() => { + const connection = createConnection(); + connection.connect(); + connection.on('message', (receivedMessage) => { + setMessages(msgs => [...msgs, receivedMessage]); + if (!isMuted) { + playSound(); + } + }); + // ... +``` + +Since your Effect now uses `isMuted` in its code, you have to add it to the dependencies: + +```js +function ChatRoom({ roomId }) { + const [messages, setMessages] = useState([]); + const [isMuted, setIsMuted] = useState(false); + + useEffect(() => { + const connection = createConnection(); + connection.connect(); + connection.on('message', (receivedMessage) => { + setMessages(msgs => [...msgs, receivedMessage]); + if (!isMuted) { + playSound(); + } + }); + return () => connection.disconnect(); + }, [roomId, isMuted]); // ✅ All dependencies declared + // ... +``` + +The problem is that every time `isMuted` changes (for example, when the user presses the "Muted" toggle), the Effect will re-synchronize, and reconnect to the chat. This is not the desired user experience! (In this example, even disabling the linter would not work--if you do that, `isMuted` would get "stuck" with its old value.) + +To solve this problem, you need to extract the logic that shouldn't be reactive out of the Effect. You don't want this Effect to "react" to the changes in `isMuted`. [Move this non-reactive piece of logic into an Effect Event:](/learn/separating-events-from-effects#declaring-an-effect-event) + +```js +import { useState, useEffect, useEffectEvent } from 'react'; + +function ChatRoom({ roomId }) { + const [messages, setMessages] = useState([]); + const [isMuted, setIsMuted] = useState(false); + + const onMessage = useEffectEvent(receivedMessage => { + setMessages(msgs => [...msgs, receivedMessage]); + if (!isMuted) { + playSound(); + } + }); + + useEffect(() => { + const connection = createConnection(); + connection.connect(); + connection.on('message', (receivedMessage) => { + onMessage(receivedMessage); + }); + return () => connection.disconnect(); + }, [roomId]); // ✅ All dependencies declared + // ... +``` + +Effect Events let you split an Effect into reactive parts (which should "react" to reactive values like `roomId` and their changes) and non-reactive parts (which only read their latest values, like `onMessage` reads `isMuted`). **Now that you read `isMuted` inside an Effect Event, it doesn't need to be a dependency of your Effect.** As a result, the chat won't re-connect when you toggle the "Muted" setting on and off, solving the original issue! + +#### Wrapping an event handler from the props + +You might run into a similar problem when your component receives an event handler as a prop: + +```js +function ChatRoom({ roomId, onReceiveMessage }) { + const [messages, setMessages] = useState([]); + + useEffect(() => { + const connection = createConnection(); + connection.connect(); + connection.on('message', (receivedMessage) => { + onReceiveMessage(receivedMessage); + }); + return () => connection.disconnect(); + }, [roomId, onReceiveMessage]); // ✅ All dependencies declared + // ... +``` + +Suppose that the parent component passes a _different_ `onReceiveMessage` function on every render: + +```js +<ChatRoom + roomId={roomId} + onReceiveMessage={(receivedMessage) => { + // ... + }} +/> +``` + +Since `onReceiveMessage` is a dependency, it would cause the Effect to re-synchronize after every parent re-render. This would make it re-connect to the chat. To solve this, wrap the call in an Effect Event: + +```js +function ChatRoom({ roomId, onReceiveMessage }) { + const [messages, setMessages] = useState([]); + + const onMessage = useEffectEvent(receivedMessage => { + onReceiveMessage(receivedMessage); + }); + + useEffect(() => { + const connection = createConnection(); + connection.connect(); + connection.on('message', (receivedMessage) => { + onMessage(receivedMessage); + }); + return () => connection.disconnect(); + }, [roomId]); // ✅ All dependencies declared + // ... +``` + +Effect Events aren't reactive, so you don't need to specify them as dependencies. As a result, the chat will no longer re-connect even if the parent component passes a function that's different on every re-render. + +#### Separating reactive and non-reactive code + +In this example, you want to log a visit every time `roomId` changes. You want to include the current `notificationCount` with every log, but you _don't_ want a change to `notificationCount` to trigger a log event. + +The solution is again to split out the non-reactive code into an Effect Event: + +```js +function Chat({ roomId, notificationCount }) { + const onVisit = useEffectEvent((visitedRoomId) => { + logVisit(visitedRoomId, notificationCount); + }); + + useEffect(() => { + onVisit(roomId); + }, [roomId]); // ✅ All dependencies declared + // ... +} +``` + +You want your logic to be reactive with regards to `roomId`, so you read `roomId` inside of your Effect. However, you don't want a change to `notificationCount` to log an extra visit, so you read `notificationCount` inside of the Effect Event. [Learn more about reading the latest props and state from Effects using Effect Events.](/learn/separating-events-from-effects#reading-latest-props-and-state-with-effect-events) + +### Does some reactive value change unintentionally? + +Sometimes, you _do_ want your Effect to "react" to a certain value, but that value changes more often than you'd like--and might not reflect any actual change from the user's perspective. For example, let's say that you create an `options` object in the body of your component, and then read that object from inside of your Effect: + +```js +function ChatRoom({ roomId }) { + // ... + const options = { + serverUrl: serverUrl, + roomId: roomId + }; + + useEffect(() => { + const connection = createConnection(options); + connection.connect(); + // ... +``` + +This object is declared in the component body, so it's a [reactive value.](/learn/lifecycle-of-reactive-effects#effects-react-to-reactive-values) When you read a reactive value like this inside an Effect, you declare it as a dependency. This ensures your Effect "reacts" to its changes: + +```js +// ... +useEffect(() => { + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); +}, [options]); // ✅ All dependencies declared +// ... +``` + +It is important to declare it as a dependency! This ensures, for example, that if the `roomId` changes, your Effect will re-connect to the chat with the new `options`. However, there is also a problem with the code above. To see it, try typing into the input in the sandbox below, and watch what happens in the console: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(""); + + // Temporarily disable the linter to demonstrate the problem + // eslint-disable-next-line react-hooks/exhaustive-deps + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + + useEffect(() => { + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [options]); + + return ( + <> + <h1>Welcome to the {roomId} room!</h1> + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +export function createConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +In the sandbox above, the input only updates the `message` state variable. From the user's perspective, this should not affect the chat connection. However, every time you update the `message`, your component re-renders. When your component re-renders, the code inside of it runs again from scratch. + +A new `options` object is created from scratch on every re-render of the `ChatRoom` component. React sees that the `options` object is a _different object_ from the `options` object created during the last render. This is why it re-synchronizes your Effect (which depends on `options`), and the chat re-connects as you type. + +**This problem only affects objects and functions. In JavaScript, each newly created object and function is considered distinct from all the others. It doesn't matter that the contents inside of them may be the same!** + +```js +// During the first render +const options1 = { serverUrl: "https://localhost:1234", roomId: "music" }; + +// During the next render +const options2 = { serverUrl: "https://localhost:1234", roomId: "music" }; + +// These are two different objects! +console.log(Object.is(options1, options2)); // false +``` + +**Object and function dependencies can make your Effect re-synchronize more often than you need.** + +This is why, whenever possible, you should try to avoid objects and functions as your Effect's dependencies. Instead, try moving them outside the component, inside the Effect, or extracting primitive values out of them. + +#### Move static objects and functions outside your component + +If the object does not depend on any props and state, you can move that object outside your component: + +```js +const options = { + serverUrl: 'https://localhost:1234', + roomId: 'music' +}; + +function ChatRoom() { + const [message, setMessage] = useState(''); + + useEffect(() => { + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, []); // ✅ All dependencies declared + // ... +``` + +This way, you _prove_ to the linter that it's not reactive. It can't change as a result of a re-render, so it doesn't need to be a dependency. Now re-rendering `ChatRoom` won't cause your Effect to re-synchronize. + +This works for functions too: + +```js +function createOptions() { + return { + serverUrl: 'https://localhost:1234', + roomId: 'music' + }; +} + +function ChatRoom() { + const [message, setMessage] = useState(''); + + useEffect(() => { + const options = createOptions(); + const connection = createConnection(); + connection.connect(); + return () => connection.disconnect(); + }, []); // ✅ All dependencies declared + // ... +``` + +Since `createOptions` is declared outside your component, it's not a reactive value. This is why it doesn't need to be specified in your Effect's dependencies, and why it won't ever cause your Effect to re-synchronize. + +#### Move dynamic objects and functions inside your Effect + +If your object depends on some reactive value that may change as a result of a re-render, like a `roomId` prop, you can't pull it _outside_ your component. You can, however, move its creation _inside_ of your Effect's code: + +```js +const serverUrl = 'https://localhost:1234'; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(''); + + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId + }; + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); // ✅ All dependencies declared + // ... +``` + +Now that `options` is declared inside of your Effect, it is no longer a dependency of your Effect. Instead, the only reactive value used by your Effect is `roomId`. Since `roomId` is not an object or function, you can be sure that it won't be _unintentionally_ different. In JavaScript, numbers and strings are compared by their content: + +```js +// During the first render +const roomId1 = "music"; + +// During the next render +const roomId2 = "music"; + +// These two strings are the same! +console.log(Object.is(roomId1, roomId2)); // true +``` + +Thanks to this fix, the chat no longer re-connects if you edit the input: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(""); + + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + + return ( + <> + <h1>Welcome to the {roomId} room!</h1> + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +export function createConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +However, it _does_ re-connect when you change the `roomId` dropdown, as you would expect. + +This works for functions, too: + +```js +const serverUrl = 'https://localhost:1234'; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(''); + + useEffect(() => { + function createOptions() { + return { + serverUrl: serverUrl, + roomId: roomId + }; + } + + const options = createOptions(); + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); // ✅ All dependencies declared + // ... +``` + +You can write your own functions to group pieces of logic inside your Effect. As long as you also declare them _inside_ your Effect, they're not reactive values, and so they don't need to be dependencies of your Effect. + +#### Read primitive values from objects + +Sometimes, you may receive an object from props: + +```js +function ChatRoom({ options }) { + const [message, setMessage] = useState(''); + + useEffect(() => { + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [options]); // ✅ All dependencies declared + // ... +``` + +The risk here is that the parent component will create the object during rendering: + +```js +<ChatRoom + roomId={roomId} + options={{ + serverUrl: serverUrl, + roomId: roomId, + }} +/> +``` + +This would cause your Effect to re-connect every time the parent component re-renders. To fix this, read information from the object _outside_ the Effect, and avoid having object and function dependencies: + +```js +function ChatRoom({ options }) { + const [message, setMessage] = useState(''); + + const { roomId, serverUrl } = options; + useEffect(() => { + const connection = createConnection({ + roomId: roomId, + serverUrl: serverUrl + }); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, serverUrl]); // ✅ All dependencies declared + // ... +``` + +The logic gets a little repetitive (you read some values from an object outside an Effect, and then create an object with the same values inside the Effect). But it makes it very explicit what information your Effect _actually_ depends on. If an object is re-created unintentionally by the parent component, the chat would not re-connect. However, if `options.roomId` or `options.serverUrl` really are different, the chat would re-connect. + +#### Calculate primitive values from functions + +The same approach can work for functions. For example, suppose the parent component passes a function: + +```js +<ChatRoom + roomId={roomId} + getOptions={() => { + return { + serverUrl: serverUrl, + roomId: roomId, + }; + }} +/> +``` + +To avoid making it a dependency (and causing it to re-connect on re-renders), call it outside the Effect. This gives you the `roomId` and `serverUrl` values that aren't objects, and that you can read from inside your Effect: + +```js +function ChatRoom({ getOptions }) { + const [message, setMessage] = useState(''); + + const { roomId, serverUrl } = getOptions(); + useEffect(() => { + const connection = createConnection({ + roomId: roomId, + serverUrl: serverUrl + }); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, serverUrl]); // ✅ All dependencies declared + // ... +``` + +This only works for [pure](/learn/keeping-components-pure) functions because they are safe to call during rendering. If your function is an event handler, but you don't want its changes to re-synchronize your Effect, [wrap it into an Effect Event instead.](#do-you-want-to-read-a-value-without-reacting-to-its-changes) + +<Recap> + +- Dependencies should always match the code. +- When you're not happy with your dependencies, what you need to edit is the code. +- Suppressing the linter leads to very confusing bugs, and you should always avoid it. +- To remove a dependency, you need to "prove" to the linter that it's not necessary. +- If some code should run in response to a specific interaction, move that code to an event handler. +- If different parts of your Effect should re-run for different reasons, split it into several Effects. +- If you want to update some state based on the previous state, pass an updater function. +- If you want to read the latest value without "reacting" it, extract an Effect Event from your Effect. +- In JavaScript, objects and functions are considered different if they were created at different times. +- Try to avoid object and function dependencies. Move them outside the component or inside the Effect. + +</Recap> + +<Challenges> + +#### Fix a resetting interval + +This Effect sets up an interval that ticks every second. You've noticed something strange happening: it seems like the interval gets destroyed and re-created every time it ticks. Fix the code so that the interval doesn't get constantly re-created. + +<Hint> + +It seems like this Effect's code depends on `count`. Is there some way to not need this dependency? There should be a way to update the `count` state based on its previous value without adding a dependency on that value. + +</Hint> + +```js +import { useState, useEffect } from "react"; + +export default function Timer() { + const [count, setCount] = useState(0); + + useEffect(() => { + console.log("✅ Creating an interval"); + const id = setInterval(() => { + console.log("⏰ Interval tick"); + setCount(count + 1); + }, 1000); + return () => { + console.log("❌ Clearing an interval"); + clearInterval(id); + }; + }, [count]); + + return <h1>Counter: {count}</h1>; +} +``` + +<Solution> + +You want to update the `count` state to be `count + 1` from inside the Effect. However, this makes your Effect depend on `count`, which changes with every tick, and that's why your interval gets re-created on every tick. + +To solve this, use the [updater function](/reference/react/useState#updating-state-based-on-the-previous-state) and write `setCount(c => c + 1)` instead of `setCount(count + 1)`: + +```js +import { useState, useEffect } from "react"; + +export default function Timer() { + const [count, setCount] = useState(0); + + useEffect(() => { + console.log("✅ Creating an interval"); + const id = setInterval(() => { + console.log("⏰ Interval tick"); + setCount((c) => c + 1); + }, 1000); + return () => { + console.log("❌ Clearing an interval"); + clearInterval(id); + }; + }, []); + + return <h1>Counter: {count}</h1>; +} +``` + +Instead of reading `count` inside the Effect, you pass a `c => c + 1` instruction ("increment this number!") to React. React will apply it on the next render. And since you don't need to read the value of `count` inside your Effect anymore, so you can keep your Effect's dependencies empty (`[]`). This prevents your Effect from re-creating the interval on every tick. + +</Solution> + +#### Fix a retriggering animation + +In this example, when you press "Show", a welcome message fades in. The animation takes a second. When you press "Remove", the welcome message immediately disappears. The logic for the fade-in animation is implemented in the `animation.js` file as plain JavaScript [animation loop.](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame) You don't need to change that logic. You can treat it as a third-party library. Your Effect creates an instance of `FadeInAnimation` for the DOM node, and then calls `start(duration)` or `stop()` to control the animation. The `duration` is controlled by a slider. Adjust the slider and see how the animation changes. + +This code already works, but there is something you want to change. Currently, when you move the slider that controls the `duration` state variable, it retriggers the animation. Change the behavior so that the Effect does not "react" to the `duration` variable. When you press "Show", the Effect should use the current `duration` on the slider. However, moving the slider itself should not by itself retrigger the animation. + +<Hint> + +Is there a line of code inside the Effect that should not be reactive? How can you move non-reactive code out of the Effect? + +</Hint> + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState, useEffect, useRef } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; +import { FadeInAnimation } from "./animation.js"; + +function Welcome({ duration }) { + const ref = useRef(null); + + useEffect(() => { + const animation = new FadeInAnimation(ref.current); + animation.start(duration); + return () => { + animation.stop(); + }; + }, [duration]); + + return ( + <h1 + ref={ref} + style={{ + opacity: 0, + color: "white", + padding: 50, + textAlign: "center", + fontSize: 50, + backgroundImage: + "radial-gradient(circle, rgba(63,94,251,1) 0%, rgba(252,70,107,1) 100%)", + }} + > + Welcome + </h1> + ); +} + +export default function App() { + const [duration, setDuration] = useState(1000); + const [show, setShow] = useState(false); + + return ( + <> + <label> + <input + type="range" + min="100" + max="3000" + value={duration} + onChange={(e) => setDuration(Number(e.target.value))} + /> + <br /> + Fade in duration: {duration} ms + </label> + <button on_click={() => setShow(!show)}> + {show ? "Remove" : "Show"} + </button> + <hr /> + {show && <Welcome duration={duration} />} + </> + ); +} +``` + +```js +export class FadeInAnimation { + constructor(node) { + this.node = node; + } + start(duration) { + this.duration = duration; + if (this.duration === 0) { + // Jump to end immediately + this.onProgress(1); + } else { + this.onProgress(0); + // Start animating + this.startTime = performance.now(); + this.frameId = requestAnimationFrame(() => this.onFrame()); + } + } + onFrame() { + const timePassed = performance.now() - this.startTime; + const progress = Math.min(timePassed / this.duration, 1); + this.onProgress(progress); + if (progress < 1) { + // We still have more frames to paint + this.frameId = requestAnimationFrame(() => this.onFrame()); + } + } + onProgress(progress) { + this.node.style.opacity = progress; + } + stop() { + cancelAnimationFrame(this.frameId); + this.startTime = null; + this.frameId = null; + this.duration = 0; + } +} +``` + +```css +label, +button { + display: block; + margin-bottom: 20px; +} +html, +body { + min-height: 300px; +} +``` + +<Solution> + +Your Effect needs to read the latest value of `duration`, but you don't want it to "react" to changes in `duration`. You use `duration` to start the animation, but starting animation isn't reactive. Extract the non-reactive line of code into an Effect Event, and call that function from your Effect. + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState, useEffect, useRef } from "react"; +import { FadeInAnimation } from "./animation.js"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; + +function Welcome({ duration }) { + const ref = useRef(null); + + const onAppear = useEffectEvent((animation) => { + animation.start(duration); + }); + + useEffect(() => { + const animation = new FadeInAnimation(ref.current); + onAppear(animation); + return () => { + animation.stop(); + }; + }, []); + + return ( + <h1 + ref={ref} + style={{ + opacity: 0, + color: "white", + padding: 50, + textAlign: "center", + fontSize: 50, + backgroundImage: + "radial-gradient(circle, rgba(63,94,251,1) 0%, rgba(252,70,107,1) 100%)", + }} + > + Welcome + </h1> + ); +} + +export default function App() { + const [duration, setDuration] = useState(1000); + const [show, setShow] = useState(false); + + return ( + <> + <label> + <input + type="range" + min="100" + max="3000" + value={duration} + onChange={(e) => setDuration(Number(e.target.value))} + /> + <br /> + Fade in duration: {duration} ms + </label> + <button on_click={() => setShow(!show)}> + {show ? "Remove" : "Show"} + </button> + <hr /> + {show && <Welcome duration={duration} />} + </> + ); +} +``` + +```js +export class FadeInAnimation { + constructor(node) { + this.node = node; + } + start(duration) { + this.duration = duration; + this.onProgress(0); + this.startTime = performance.now(); + this.frameId = requestAnimationFrame(() => this.onFrame()); + } + onFrame() { + const timePassed = performance.now() - this.startTime; + const progress = Math.min(timePassed / this.duration, 1); + this.onProgress(progress); + if (progress < 1) { + // We still have more frames to paint + this.frameId = requestAnimationFrame(() => this.onFrame()); + } + } + onProgress(progress) { + this.node.style.opacity = progress; + } + stop() { + cancelAnimationFrame(this.frameId); + this.startTime = null; + this.frameId = null; + this.duration = 0; + } +} +``` + +```css +label, +button { + display: block; + margin-bottom: 20px; +} +html, +body { + min-height: 300px; +} +``` + +Effect Events like `onAppear` are not reactive, so you can read `duration` inside without retriggering the animation. + +</Solution> + +#### Fix a reconnecting chat + +In this example, every time you press "Toggle theme", the chat re-connects. Why does this happen? Fix the mistake so that the chat re-connects only when you edit the Server URL or choose a different chat room. + +Treat `chat.js` as an external third-party library: you can consult it to check its API, but don't edit it. + +<Hint> + +There's more than one way to fix this, but ultimately you want to avoid having an object as your dependency. + +</Hint> + +```js +import { useState } from "react"; +import ChatRoom from "./ChatRoom.js"; + +export default function App() { + const [isDark, setIsDark] = useState(false); + const [roomId, setRoomId] = useState("general"); + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + + return ( + <div className={isDark ? "dark" : "light"}> + <button on_click={() => setIsDark(!isDark)}>Toggle theme</button> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom options={options} /> + </div> + ); +} +``` + +```js +import { useEffect } from "react"; +import { createConnection } from "./chat.js"; + +export default function ChatRoom({ options }) { + useEffect(() => { + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [options]); + + return <h1>Welcome to the {options.roomId} room!</h1>; +} +``` + +```js +export function createConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + if (typeof serverUrl !== "string") { + throw Error( + "Expected serverUrl to be a string. Received: " + serverUrl + ); + } + if (typeof roomId !== "string") { + throw Error("Expected roomId to be a string. Received: " + roomId); + } + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +label, +button { + display: block; + margin-bottom: 5px; +} +.dark { + background: #222; + color: #eee; +} +``` + +<Solution> + +Your Effect is re-running because it depends on the `options` object. Objects can be re-created unintentionally, you should try to avoid them as dependencies of your Effects whenever possible. + +The least invasive fix is to read `roomId` and `serverUrl` right outside the Effect, and then make the Effect depend on those primitive values (which can't change unintentionally). Inside the Effect, create an object and it pass to `createConnection`: + +```js +import { useState } from "react"; +import ChatRoom from "./ChatRoom.js"; + +export default function App() { + const [isDark, setIsDark] = useState(false); + const [roomId, setRoomId] = useState("general"); + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + + return ( + <div className={isDark ? "dark" : "light"}> + <button on_click={() => setIsDark(!isDark)}>Toggle theme</button> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom options={options} /> + </div> + ); +} +``` + +```js +import { useEffect } from "react"; +import { createConnection } from "./chat.js"; + +export default function ChatRoom({ options }) { + const { roomId, serverUrl } = options; + useEffect(() => { + const connection = createConnection({ + roomId: roomId, + serverUrl: serverUrl, + }); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, serverUrl]); + + return <h1>Welcome to the {options.roomId} room!</h1>; +} +``` + +```js +export function createConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + if (typeof serverUrl !== "string") { + throw Error( + "Expected serverUrl to be a string. Received: " + serverUrl + ); + } + if (typeof roomId !== "string") { + throw Error("Expected roomId to be a string. Received: " + roomId); + } + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +label, +button { + display: block; + margin-bottom: 5px; +} +.dark { + background: #222; + color: #eee; +} +``` + +It would be even better to replace the object `options` prop with the more specific `roomId` and `serverUrl` props: + +```js +import { useState } from "react"; +import ChatRoom from "./ChatRoom.js"; + +export default function App() { + const [isDark, setIsDark] = useState(false); + const [roomId, setRoomId] = useState("general"); + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + return ( + <div className={isDark ? "dark" : "light"}> + <button on_click={() => setIsDark(!isDark)}>Toggle theme</button> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} serverUrl={serverUrl} /> + </div> + ); +} +``` + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +export default function ChatRoom({ roomId, serverUrl }) { + useEffect(() => { + const connection = createConnection({ + roomId: roomId, + serverUrl: serverUrl, + }); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, serverUrl]); + + return <h1>Welcome to the {roomId} room!</h1>; +} +``` + +```js +export function createConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + if (typeof serverUrl !== "string") { + throw Error( + "Expected serverUrl to be a string. Received: " + serverUrl + ); + } + if (typeof roomId !== "string") { + throw Error("Expected roomId to be a string. Received: " + roomId); + } + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +label, +button { + display: block; + margin-bottom: 5px; +} +.dark { + background: #222; + color: #eee; +} +``` + +Sticking to primitive props where possible makes it easier to optimize your components later. + +</Solution> + +#### Fix a reconnecting chat, again + +This example connects to the chat either with or without encryption. Toggle the checkbox and notice the different messages in the console when the encryption is on and off. Try changing the room. Then, try toggling the theme. When you're connected to a chat room, you will receive new messages every few seconds. Verify that their color matches the theme you've picked. + +In this example, the chat re-connects every time you try to change the theme. Fix this. After the fix, changing the theme should not re-connect the chat, but toggling encryption settings or changing the room should re-connect. + +Don't change any code in `chat.js`. Other than that, you can change any code as long as it results in the same behavior. For example, you may find it helpful to change which props are being passed down. + +<Hint> + +You're passing down two functions: `onMessage` and `createConnection`. Both of them are created from scratch every time `App` re-renders. They are considered to be new values every time, which is why they re-trigger your Effect. + +One of these functions is an event handler. Do you know some way to call an event handler an Effect without "reacting" to the new values of the event handler function? That would come in handy! + +Another of these functions only exists to pass some state to an imported API method. Is this function really necessary? What is the essential information that's being passed down? You might need to move some imports from `App.js` to `ChatRoom.js`. + +</Hint> + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest", + "toastify-js": "1.12.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState } from "react"; +import ChatRoom from "./ChatRoom.js"; +import { + createEncryptedConnection, + createUnencryptedConnection, +} from "./chat.js"; +import { showNotification } from "./notifications.js"; + +export default function App() { + const [isDark, setIsDark] = useState(false); + const [roomId, setRoomId] = useState("general"); + const [isEncrypted, setIsEncrypted] = useState(false); + + return ( + <> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Use dark theme + </label> + <label> + <input + type="checkbox" + checked={isEncrypted} + onChange={(e) => setIsEncrypted(e.target.checked)} + /> + Enable encryption + </label> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom + roomId={roomId} + onMessage={(msg) => { + showNotification( + "New message: " + msg, + isDark ? "dark" : "light" + ); + }} + createConnection={() => { + const options = { + serverUrl: "https://localhost:1234", + roomId: roomId, + }; + if (isEncrypted) { + return createEncryptedConnection(options); + } else { + return createUnencryptedConnection(options); + } + }} + /> + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; + +export default function ChatRoom({ roomId, createConnection, onMessage }) { + useEffect(() => { + const connection = createConnection(); + connection.on("message", (msg) => onMessage(msg)); + connection.connect(); + return () => connection.disconnect(); + }, [createConnection, onMessage]); + + return <h1>Welcome to the {roomId} room!</h1>; +} +``` + +```js +export function createEncryptedConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + if (typeof serverUrl !== "string") { + throw Error( + "Expected serverUrl to be a string. Received: " + serverUrl + ); + } + if (typeof roomId !== "string") { + throw Error("Expected roomId to be a string. Received: " + roomId); + } + let intervalId; + let messageCallback; + return { + connect() { + console.log( + '✅ 🔐 Connecting to "' + roomId + '" room... (encrypted)' + ); + clearInterval(intervalId); + intervalId = setInterval(() => { + if (messageCallback) { + if (Math.random() > 0.5) { + messageCallback("hey"); + } else { + messageCallback("lol"); + } + } + }, 3000); + }, + disconnect() { + clearInterval(intervalId); + messageCallback = null; + console.log( + '❌ 🔐 Disconnected from "' + roomId + '" room (encrypted)' + ); + }, + on(event, callback) { + if (messageCallback) { + throw Error("Cannot add the handler twice."); + } + if (event !== "message") { + throw Error('Only "message" event is supported.'); + } + messageCallback = callback; + }, + }; +} + +export function createUnencryptedConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + if (typeof serverUrl !== "string") { + throw Error( + "Expected serverUrl to be a string. Received: " + serverUrl + ); + } + if (typeof roomId !== "string") { + throw Error("Expected roomId to be a string. Received: " + roomId); + } + let intervalId; + let messageCallback; + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room (unencrypted)...' + ); + clearInterval(intervalId); + intervalId = setInterval(() => { + if (messageCallback) { + if (Math.random() > 0.5) { + messageCallback("hey"); + } else { + messageCallback("lol"); + } + } + }, 3000); + }, + disconnect() { + clearInterval(intervalId); + messageCallback = null; + console.log( + '❌ Disconnected from "' + roomId + '" room (unencrypted)' + ); + }, + on(event, callback) { + if (messageCallback) { + throw Error("Cannot add the handler twice."); + } + if (event !== "message") { + throw Error('Only "message" event is supported.'); + } + messageCallback = callback; + }, + }; +} +``` + +```js +import Toastify from "toastify-js"; +import "toastify-js/src/toastify.css"; + +export function showNotification(message, theme) { + Toastify({ + text: message, + duration: 2000, + gravity: "top", + position: "right", + style: { + background: theme === "dark" ? "black" : "white", + color: theme === "dark" ? "white" : "black", + }, + }).showToast(); +} +``` + +```css +label, +button { + display: block; + margin-bottom: 5px; +} +``` + +<Solution> + +There's more than one correct way to solve this, but here is one possible solution. + +In the original example, toggling the theme caused different `onMessage` and `createConnection` functions to be created and passed down. Since the Effect depended on these functions, the chat would re-connect every time you toggle the theme. + +To fix the problem with `onMessage`, you needed to wrap it into an Effect Event: + +```js +export default function ChatRoom({ roomId, createConnection, onMessage }) { + const onReceiveMessage = useEffectEvent(onMessage); + + useEffect(() => { + const connection = createConnection(); + connection.on('message', (msg) => onReceiveMessage(msg)); + // ... +``` + +Unlike the `onMessage` prop, the `onReceiveMessage` Effect Event is not reactive. This is why it doesn't need to be a dependency of your Effect. As a result, changes to `onMessage` won't cause the chat to re-connect. + +You can't do the same with `createConnection` because it _should_ be reactive. You _want_ the Effect to re-trigger if the user switches between an encrypted and an unencryption connection, or if the user switches the current room. However, because `createConnection` is a function, you can't check whether the information it reads has _actually_ changed or not. To solve this, instead of passing `createConnection` down from the `App` component, pass the raw `roomId` and `isEncrypted` values: + +```js +<ChatRoom + roomId={roomId} + isEncrypted={isEncrypted} + onMessage={(msg) => { + showNotification("New message: " + msg, isDark ? "dark" : "light"); + }} +/> +``` + +Now you can move the `createConnection` function _inside_ the Effect instead of passing it down from the `App`: + +```js +import { + createEncryptedConnection, + createUnencryptedConnection, +} from './chat.js'; + +export default function ChatRoom({ roomId, isEncrypted, onMessage }) { + const onReceiveMessage = useEffectEvent(onMessage); + + useEffect(() => { + function createConnection() { + const options = { + serverUrl: 'https://localhost:1234', + roomId: roomId + }; + if (isEncrypted) { + return createEncryptedConnection(options); + } else { + return createUnencryptedConnection(options); + } + } + // ... +``` + +After these two changes, your Effect no longer depends on any function values: + +```js +export default function ChatRoom({ roomId, isEncrypted, onMessage }) { // Reactive values + const onReceiveMessage = useEffectEvent(onMessage); // Not reactive + + useEffect(() => { + function createConnection() { + const options = { + serverUrl: 'https://localhost:1234', + roomId: roomId // Reading a reactive value + }; + if (isEncrypted) { // Reading a reactive value + return createEncryptedConnection(options); + } else { + return createUnencryptedConnection(options); + } + } + + const connection = createConnection(); + connection.on('message', (msg) => onReceiveMessage(msg)); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, isEncrypted]); // ✅ All dependencies declared +``` + +As a result, the chat re-connects only when something meaningful (`roomId` or `isEncrypted`) changes: + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest", + "toastify-js": "1.12.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState } from "react"; +import ChatRoom from "./ChatRoom.js"; + +import { showNotification } from "./notifications.js"; + +export default function App() { + const [isDark, setIsDark] = useState(false); + const [roomId, setRoomId] = useState("general"); + const [isEncrypted, setIsEncrypted] = useState(false); + + return ( + <> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Use dark theme + </label> + <label> + <input + type="checkbox" + checked={isEncrypted} + onChange={(e) => setIsEncrypted(e.target.checked)} + /> + Enable encryption + </label> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom + roomId={roomId} + isEncrypted={isEncrypted} + onMessage={(msg) => { + showNotification( + "New message: " + msg, + isDark ? "dark" : "light" + ); + }} + /> + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; +import { + createEncryptedConnection, + createUnencryptedConnection, +} from "./chat.js"; + +export default function ChatRoom({ roomId, isEncrypted, onMessage }) { + const onReceiveMessage = useEffectEvent(onMessage); + + useEffect(() => { + function createConnection() { + const options = { + serverUrl: "https://localhost:1234", + roomId: roomId, + }; + if (isEncrypted) { + return createEncryptedConnection(options); + } else { + return createUnencryptedConnection(options); + } + } + + const connection = createConnection(); + connection.on("message", (msg) => onReceiveMessage(msg)); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, isEncrypted]); + + return <h1>Welcome to the {roomId} room!</h1>; +} +``` + +```js +export function createEncryptedConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + if (typeof serverUrl !== "string") { + throw Error( + "Expected serverUrl to be a string. Received: " + serverUrl + ); + } + if (typeof roomId !== "string") { + throw Error("Expected roomId to be a string. Received: " + roomId); + } + let intervalId; + let messageCallback; + return { + connect() { + console.log( + '✅ 🔐 Connecting to "' + roomId + '" room... (encrypted)' + ); + clearInterval(intervalId); + intervalId = setInterval(() => { + if (messageCallback) { + if (Math.random() > 0.5) { + messageCallback("hey"); + } else { + messageCallback("lol"); + } + } + }, 3000); + }, + disconnect() { + clearInterval(intervalId); + messageCallback = null; + console.log( + '❌ 🔐 Disconnected from "' + roomId + '" room (encrypted)' + ); + }, + on(event, callback) { + if (messageCallback) { + throw Error("Cannot add the handler twice."); + } + if (event !== "message") { + throw Error('Only "message" event is supported.'); + } + messageCallback = callback; + }, + }; +} + +export function createUnencryptedConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + if (typeof serverUrl !== "string") { + throw Error( + "Expected serverUrl to be a string. Received: " + serverUrl + ); + } + if (typeof roomId !== "string") { + throw Error("Expected roomId to be a string. Received: " + roomId); + } + let intervalId; + let messageCallback; + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room (unencrypted)...' + ); + clearInterval(intervalId); + intervalId = setInterval(() => { + if (messageCallback) { + if (Math.random() > 0.5) { + messageCallback("hey"); + } else { + messageCallback("lol"); + } + } + }, 3000); + }, + disconnect() { + clearInterval(intervalId); + messageCallback = null; + console.log( + '❌ Disconnected from "' + roomId + '" room (unencrypted)' + ); + }, + on(event, callback) { + if (messageCallback) { + throw Error("Cannot add the handler twice."); + } + if (event !== "message") { + throw Error('Only "message" event is supported.'); + } + messageCallback = callback; + }, + }; +} +``` + +```js +import Toastify from "toastify-js"; +import "toastify-js/src/toastify.css"; + +export function showNotification(message, theme) { + Toastify({ + text: message, + duration: 2000, + gravity: "top", + position: "right", + style: { + background: theme === "dark" ? "black" : "white", + color: theme === "dark" ? "white" : "black", + }, + }).showToast(); +} +``` + +```css +label, +button { + display: block; + margin-bottom: 5px; +} +``` + +</Solution> + +</Challenges> diff --git a/docs/src/learn/render-and-commit.md b/docs/src/learn/render-and-commit.md new file mode 100644 index 000000000..94238ca65 --- /dev/null +++ b/docs/src/learn/render-and-commit.md @@ -0,0 +1,201 @@ +--- +title: Render and Commit 🚧 +--- + +## Overview + +<p class="intro" markdown> + +Before your components are displayed on screen, they must be rendered by React. Understanding the steps in this process will help you think about how your code executes and explain its behavior. + +</p> + +!!! summary "You Will Learn" + + - What rendering means in React + - When and why React renders a component + - The steps involved in displaying a component on screen + - Why rendering does not always produce a DOM update + +Imagine that your components are cooks in the kitchen, assembling tasty dishes from ingredients. In this scenario, React is the waiter who puts in requests from customers and brings them their orders. This process of requesting and serving UI has three steps: + +1. **Triggering** a render (delivering the guest's order to the kitchen) +2. **Rendering** the component (preparing the order in the kitchen) +3. **Committing** to the DOM (placing the order on the table) + +<IllustrationBlock sequential> + <Illustration caption="Trigger" alt="React as a server in a restaurant, fetching orders from the users and delivering them to the Component Kitchen." src="/images/docs/illustrations/i_render-and-commit1.png" /> + <Illustration caption="Render" alt="The Card Chef gives React a fresh Card component." src="/images/docs/illustrations/i_render-and-commit2.png" /> + <Illustration caption="Commit" alt="React delivers the Card to the user at their table." src="/images/docs/illustrations/i_render-and-commit3.png" /> +</IllustrationBlock> + +## Step 1: Trigger a render + +There are two reasons for a component to render: + +1. It's the component's **initial render.** +2. The component's (or one of its ancestors') **state has been updated.** + +### Initial render + +When your app starts, you need to trigger the initial render. Frameworks and sandboxes sometimes hide this code, but it's done by calling [`createRoot`](/reference/react-dom/client/createRoot) with the target DOM node, and then calling its `render` method with your component: + +```js +import Image from "./Image.js"; +import { createRoot } from "react-dom/client"; + +const root = createRoot(document.getElementById("root")); +root.render(<Image />); +``` + +```js +export default function Image() { + return ( + <img + src="https://i.imgur.com/ZF6s192.jpg" + alt="'Floralis Genérica' by Eduardo Catalano: a gigantic metallic flower sculpture with reflective petals" + /> + ); +} +``` + +Try commenting out the `root.render()` call and see the component disappear! + +### Re-renders when state updates + +Once the component has been initially rendered, you can trigger further renders by updating its state with the [`set` function.](/reference/react/useState#setstate) Updating your component's state automatically queues a render. (You can imagine these as a restaurant guest ordering tea, dessert, and all sorts of things after putting in their first order, depending on the state of their thirst or hunger.) + +<IllustrationBlock sequential> + <Illustration caption="State update..." alt="React as a server in a restaurant, serving a Card UI to the user, represented as a patron with a cursor for their head. They patron expresses they want a pink card, not a black one!" src="/images/docs/illustrations/i_rerender1.png" /> + <Illustration caption="...triggers..." alt="React returns to the Component Kitchen and tells the Card Chef they need a pink Card." src="/images/docs/illustrations/i_rerender2.png" /> + <Illustration caption="...render!" alt="The Card Chef gives React the pink Card." src="/images/docs/illustrations/i_rerender3.png" /> +</IllustrationBlock> + +## Step 2: React renders your components + +After you trigger a render, React calls your components to figure out what to display on screen. **"Rendering" is React calling your components.** + +- **On initial render,** React will call the root component. +- **For subsequent renders,** React will call the function component whose state update triggered the render. + +This process is recursive: if the updated component returns some other component, React will render _that_ component next, and if that component also returns something, it will render _that_ component next, and so on. The process will continue until there are no more nested components and React knows exactly what should be displayed on screen. + +In the following example, React will call `Gallery()` and `Image()` several times: + +```js +export default function Gallery() { + return ( + <section> + <h1>Inspiring Sculptures</h1> + <Image /> + <Image /> + <Image /> + </section> + ); +} + +function Image() { + return ( + <img + src="https://i.imgur.com/ZF6s192.jpg" + alt="'Floralis Genérica' by Eduardo Catalano: a gigantic metallic flower sculpture with reflective petals" + /> + ); +} +``` + +```js +import Gallery from "./Gallery.js"; +import { createRoot } from "react-dom/client"; + +const root = createRoot(document.getElementById("root")); +root.render(<Gallery />); +``` + +```css +img { + margin: 0 10px 10px 0; +} +``` + +- **During the initial render,** React will [create the DOM nodes](https://developer.mozilla.org/docs/Web/API/Document/createElement) for `<section>`, `<h1>`, and three `<img>` tags. +- **During a re-render,** React will calculate which of their properties, if any, have changed since the previous render. It won't do anything with that information until the next step, the commit phase. + +<Pitfall> + +Rendering must always be a [pure calculation](/learn/keeping-components-pure): + +- **Same inputs, same output.** Given the same inputs, a component should always return the same JSX. (When someone orders a salad with tomatoes, they should not receive a salad with onions!) +- **It minds its own business.** It should not change any objects or variables that existed before rendering. (One order should not change anyone else's order.) + +Otherwise, you can encounter confusing bugs and unpredictable behavior as your codebase grows in complexity. When developing in "Strict Mode", React calls each component's function twice, which can help surface mistakes caused by impure functions. + +</Pitfall> + +<DeepDive> + +#### Optimizing performance + +The default behavior of rendering all components nested within the updated component is not optimal for performance if the updated component is very high in the tree. If you run into a performance issue, there are several opt-in ways to solve it described in the [Performance](https://reactjs.org/docs/optimizing-performance.html) section. **Don't optimize prematurely!** + +</DeepDive> + +## Step 3: React commits changes to the DOM + +After rendering (calling) your components, React will modify the DOM. + +- **For the initial render,** React will use the [`appendChild()`](https://developer.mozilla.org/docs/Web/API/Node/appendChild) DOM API to put all the DOM nodes it has created on screen. +- **For re-renders,** React will apply the minimal necessary operations (calculated while rendering!) to make the DOM match the latest rendering output. + +**React only changes the DOM nodes if there's a difference between renders.** For example, here is a component that re-renders with different props passed from its parent every second. Notice how you can add some text into the `<input>`, updating its `value`, but the text doesn't disappear when the component re-renders: + +```js +export default function Clock({ time }) { + return ( + <> + <h1>{time}</h1> + <input /> + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; +import Clock from "./Clock.js"; + +function useTime() { + const [time, setTime] = useState(() => new Date()); + useEffect(() => { + const id = setInterval(() => { + setTime(new Date()); + }, 1000); + return () => clearInterval(id); + }, []); + return time; +} + +export default function App() { + const time = useTime(); + return <Clock time={time.toLocaleTimeString()} />; +} +``` + +This works because during this last step, React only updates the content of `<h1>` with the new `time`. It sees that the `<input>` appears in the JSX in the same place as last time, so React doesn't touch the `<input>`—or its `value`! + +## Epilogue: Browser paint + +After rendering is done and React updated the DOM, the browser will repaint the screen. Although this process is known as "browser rendering", we'll refer to it as "painting" to avoid confusion throughout the docs. + +<Illustration alt="A browser painting 'still life with card element'." src="/images/docs/illustrations/i_browser-paint.png" /> + +<Recap> + +- Any screen update in a React app happens in three steps: + 1. Trigger + 2. Render + 3. Commit +- You can use Strict Mode to find mistakes in your components +- React does not touch the DOM if the rendering result is the same as last time + +</Recap> diff --git a/docs/src/learn/rendering-lists.md b/docs/src/learn/rendering-lists.md new file mode 100644 index 000000000..d0b74c85b --- /dev/null +++ b/docs/src/learn/rendering-lists.md @@ -0,0 +1,1272 @@ +--- +title: Rendering Lists 🚧 +--- + +## Overview + +<p class="intro" markdown> + +You will often want to display multiple similar components from a collection of data. You can use the [JavaScript array methods](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array#) to manipulate an array of data. On this page, you'll use [`filter()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) and [`map()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/map) with React to filter and transform your array of data into an array of components. + +</p> + +!!! summary "You Will Learn" + + - How to render components from an array using JavaScript's `map()` + - How to render only specific components using JavaScript's `filter()` + - When and why to use React keys + +## Rendering data from arrays + +Say that you have a list of content. + +```js +<ul> + <li>Creola Katherine Johnson: mathematician</li> + <li>Mario José Molina-Pasquel Henríquez: chemist</li> + <li>Mohammad Abdus Salam: physicist</li> + <li>Percy Lavon Julian: chemist</li> + <li>Subrahmanyan Chandrasekhar: astrophysicist</li> +</ul> +``` + +The only difference among those list items is their contents, their data. You will often need to show several instances of the same component using different data when building interfaces: from lists of comments to galleries of profile images. In these situations, you can store that data in JavaScript objects and arrays and use methods like [`map()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) and [`filter()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) to render lists of components from them. + +Here’s a short example of how to generate a list of items from an array: + +1. **Move** the data into an array: + +```js +const people = [ + "Creola Katherine Johnson: mathematician", + "Mario José Molina-Pasquel Henríquez: chemist", + "Mohammad Abdus Salam: physicist", + "Percy Lavon Julian: chemist", + "Subrahmanyan Chandrasekhar: astrophysicist", +]; +``` + +2. **Map** the `people` members into a new array of JSX nodes, `listItems`: + +```js +const listItems = people.map((person) => <li>{person}</li>); +``` + +3. **Return** `listItems` from your component wrapped in a `<ul>`: + +```js +return <ul>{listItems}</ul>; +``` + +Here is the result: + +```js +const people = [ + "Creola Katherine Johnson: mathematician", + "Mario José Molina-Pasquel Henríquez: chemist", + "Mohammad Abdus Salam: physicist", + "Percy Lavon Julian: chemist", + "Subrahmanyan Chandrasekhar: astrophysicist", +]; + +export default function List() { + const listItems = people.map((person) => <li>{person}</li>); + return <ul>{listItems}</ul>; +} +``` + +```css +li { + margin-bottom: 10px; +} +``` + +Notice the sandbox above displays a console error: + +<ConsoleBlock level="error"> + +Warning: Each child in a list should have a unique "key" prop. + +</ConsoleBlock> + +You'll learn how to fix this error later on this page. Before we get to that, let's add some structure to your data. + +## Filtering arrays of items + +This data can be structured even more. + +```js +const people = [ + { + id: 0, + name: "Creola Katherine Johnson", + profession: "mathematician", + }, + { + id: 1, + name: "Mario José Molina-Pasquel Henríquez", + profession: "chemist", + }, + { + id: 2, + name: "Mohammad Abdus Salam", + profession: "physicist", + }, + { + name: "Percy Lavon Julian", + profession: "chemist", + }, + { + name: "Subrahmanyan Chandrasekhar", + profession: "astrophysicist", + }, +]; +``` + +Let's say you want a way to only show people whose profession is `'chemist'`. You can use JavaScript's `filter()` method to return just those people. This method takes an array of items, passes them through a “test” (a function that returns `true` or `false`), and returns a new array of only those items that passed the test (returned `true`). + +You only want the items where `profession` is `'chemist'`. The "test" function for this looks like `(person) => person.profession === 'chemist'`. Here's how to put it together: + +1. **Create** a new array of just “chemist” people, `chemists`, by calling `filter()` on the `people` filtering by `person.profession === 'chemist'`: + +```js +const chemists = people.filter((person) => person.profession === "chemist"); +``` + +2. Now **map** over `chemists`: + +```js +const listItems = chemists.map((person) => ( + <li> + <img src={getImageUrl(person)} alt={person.name} /> + <p> + <b>{person.name}:</b> + {" " + person.profession + " "} + known for {person.accomplishment} + </p> + </li> +)); +``` + +3. Lastly, **return** the `listItems` from your component: + +```js +return <ul>{listItems}</ul>; +``` + +```js +import { people } from "./data.js"; +import { getImageUrl } from "./utils.js"; + +export default function List() { + const chemists = people.filter((person) => person.profession === "chemist"); + const listItems = chemists.map((person) => ( + <li> + <img src={getImageUrl(person)} alt={person.name} /> + <p> + <b>{person.name}:</b> + {" " + person.profession + " "} + known for {person.accomplishment} + </p> + </li> + )); + return <ul>{listItems}</ul>; +} +``` + +```js +export const people = [ + { + id: 0, + name: "Creola Katherine Johnson", + profession: "mathematician", + accomplishment: "spaceflight calculations", + imageId: "MK3eW3A", + }, + { + id: 1, + name: "Mario José Molina-Pasquel Henríquez", + profession: "chemist", + accomplishment: "discovery of Arctic ozone hole", + imageId: "mynHUSa", + }, + { + id: 2, + name: "Mohammad Abdus Salam", + profession: "physicist", + accomplishment: "electromagnetism theory", + imageId: "bE7W1ji", + }, + { + id: 3, + name: "Percy Lavon Julian", + profession: "chemist", + accomplishment: + "pioneering cortisone drugs, steroids and birth control pills", + imageId: "IOjWm71", + }, + { + id: 4, + name: "Subrahmanyan Chandrasekhar", + profession: "astrophysicist", + accomplishment: "white dwarf star mass calculations", + imageId: "lrWQx8l", + }, +]; +``` + +```js +export function getImageUrl(person) { + return "https://i.imgur.com/" + person.imageId + "s.jpg"; +} +``` + +```css +ul { + list-style-type: none; + padding: 0px 10px; +} +li { + margin-bottom: 10px; + display: grid; + grid-template-columns: auto 1fr; + gap: 20px; + align-items: center; +} +img { + width: 100px; + height: 100px; + border-radius: 50%; +} +``` + +<Pitfall> + +Arrow functions implicitly return the expression right after `=>`, so you didn't need a `return` statement: + +```js +const listItems = chemists.map( + (person) => <li>...</li> // Implicit return! +); +``` + +However, **you must write `return` explicitly if your `=>` is followed by a `{` curly brace!** + +```js +const listItems = chemists.map((person) => { + // Curly brace + return <li>...</li>; +}); +``` + +Arrow functions containing `=> {` are said to have a ["block body".](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#function_body) They let you write more than a single line of code, but you _have to_ write a `return` statement yourself. If you forget it, nothing gets returned! + +</Pitfall> + +## Keeping list items in order with `key` + +Notice that all the sandboxes above show an error in the console: + +<ConsoleBlock level="error"> + +Warning: Each child in a list should have a unique "key" prop. + +</ConsoleBlock> + +You need to give each array item a `key` -- a string or a number that uniquely identifies it among other items in that array: + +```js +<li key={person.id}>...</li> +``` + +<Note> + +JSX elements directly inside a `map()` call always need keys! + +</Note> + +Keys tell React which array item each component corresponds to, so that it can match them up later. This becomes important if your array items can move (e.g. due to sorting), get inserted, or get deleted. A well-chosen `key` helps React infer what exactly has happened, and make the correct updates to the DOM tree. + +Rather than generating keys on the fly, you should include them in your data: + +```js +import { people } from "./data.js"; +import { getImageUrl } from "./utils.js"; + +export default function List() { + const listItems = people.map((person) => ( + <li key={person.id}> + <img src={getImageUrl(person)} alt={person.name} /> + <p> + <b>{person.name}</b> + {" " + person.profession + " "} + known for {person.accomplishment} + </p> + </li> + )); + return <ul>{listItems}</ul>; +} +``` + +```js +export const people = [ + { + id: 0, // Used in JSX as a key + name: "Creola Katherine Johnson", + profession: "mathematician", + accomplishment: "spaceflight calculations", + imageId: "MK3eW3A", + }, + { + id: 1, // Used in JSX as a key + name: "Mario José Molina-Pasquel Henríquez", + profession: "chemist", + accomplishment: "discovery of Arctic ozone hole", + imageId: "mynHUSa", + }, + { + id: 2, // Used in JSX as a key + name: "Mohammad Abdus Salam", + profession: "physicist", + accomplishment: "electromagnetism theory", + imageId: "bE7W1ji", + }, + { + id: 3, // Used in JSX as a key + name: "Percy Lavon Julian", + profession: "chemist", + accomplishment: + "pioneering cortisone drugs, steroids and birth control pills", + imageId: "IOjWm71", + }, + { + id: 4, // Used in JSX as a key + name: "Subrahmanyan Chandrasekhar", + profession: "astrophysicist", + accomplishment: "white dwarf star mass calculations", + imageId: "lrWQx8l", + }, +]; +``` + +```js +export function getImageUrl(person) { + return "https://i.imgur.com/" + person.imageId + "s.jpg"; +} +``` + +```css +ul { + list-style-type: none; + padding: 0px 10px; +} +li { + margin-bottom: 10px; + display: grid; + grid-template-columns: auto 1fr; + gap: 20px; + align-items: center; +} +img { + width: 100px; + height: 100px; + border-radius: 50%; +} +``` + +<DeepDive> + +#### Displaying several DOM nodes for each list item + +What do you do when each item needs to render not one, but several DOM nodes? + +The short [`<>...</>` Fragment](/reference/react/Fragment) syntax won't let you pass a key, so you need to either group them into a single `<div>`, or use the slightly longer and [more explicit `<Fragment>` syntax:](/reference/react/Fragment#rendering-a-list-of-fragments) + +```js +import { Fragment } from "react"; + +// ... + +const listItems = people.map((person) => ( + <Fragment key={person.id}> + <h1>{person.name}</h1> + <p>{person.bio}</p> + </Fragment> +)); +``` + +Fragments disappear from the DOM, so this will produce a flat list of `<h1>`, `<p>`, `<h1>`, `<p>`, and so on. + +</DeepDive> + +### Where to get your `key` + +Different sources of data provide different sources of keys: + +- **Data from a database:** If your data is coming from a database, you can use the database keys/IDs, which are unique by nature. +- **Locally generated data:** If your data is generated and persisted locally (e.g. notes in a note-taking app), use an incrementing counter, [`crypto.randomUUID()`](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/randomUUID) or a package like [`uuid`](https://www.npmjs.com/package/uuid) when creating items. + +### Rules of keys + +- **Keys must be unique among siblings.** However, it’s okay to use the same keys for JSX nodes in _different_ arrays. +- **Keys must not change** or that defeats their purpose! Don't generate them while rendering. + +### Why does React need keys? + +Imagine that files on your desktop didn't have names. Instead, you'd refer to them by their order -- the first file, the second file, and so on. You could get used to it, but once you delete a file, it would get confusing. The second file would become the first file, the third file would be the second file, and so on. + +File names in a folder and JSX keys in an array serve a similar purpose. They let us uniquely identify an item between its siblings. A well-chosen key provides more information than the position within the array. Even if the _position_ changes due to reordering, the `key` lets React identify the item throughout its lifetime. + +<Pitfall> + +You might be tempted to use an item's index in the array as its key. In fact, that's what React will use if you don't specify a `key` at all. But the order in which you render items will change over time if an item is inserted, deleted, or if the array gets reordered. Index as a key often leads to subtle and confusing bugs. + +Similarly, do not generate keys on the fly, e.g. with `key={Math.random()}`. This will cause keys to never match up between renders, leading to all your components and DOM being recreated every time. Not only is this slow, but it will also lose any user input inside the list items. Instead, use a stable ID based on the data. + +Note that your components won't receive `key` as a prop. It's only used as a hint by React itself. If your component needs an ID, you have to pass it as a separate prop: `<Profile key={id} userId={id} />`. + +</Pitfall> + +<Recap> + +On this page you learned: + +- How to move data out of components and into data structures like arrays and objects. +- How to generate sets of similar components with JavaScript's `map()`. +- How to create arrays of filtered items with JavaScript's `filter()`. +- Why and how to set `key` on each component in a collection so React can keep track of each of them even if their position or data changes. + +</Recap> + +<Challenges> + +#### Splitting a list in two + +This example shows a list of all people. + +Change it to show two separate lists one after another: **Chemists** and **Everyone Else.** Like previously, you can determine whether a person is a chemist by checking if `person.profession === 'chemist'`. + +```js +import { people } from "./data.js"; +import { getImageUrl } from "./utils.js"; + +export default function List() { + const listItems = people.map((person) => ( + <li key={person.id}> + <img src={getImageUrl(person)} alt={person.name} /> + <p> + <b>{person.name}:</b> + {" " + person.profession + " "} + known for {person.accomplishment} + </p> + </li> + )); + return ( + <article> + <h1>Scientists</h1> + <ul>{listItems}</ul> + </article> + ); +} +``` + +```js +export const people = [ + { + id: 0, + name: "Creola Katherine Johnson", + profession: "mathematician", + accomplishment: "spaceflight calculations", + imageId: "MK3eW3A", + }, + { + id: 1, + name: "Mario José Molina-Pasquel Henríquez", + profession: "chemist", + accomplishment: "discovery of Arctic ozone hole", + imageId: "mynHUSa", + }, + { + id: 2, + name: "Mohammad Abdus Salam", + profession: "physicist", + accomplishment: "electromagnetism theory", + imageId: "bE7W1ji", + }, + { + id: 3, + name: "Percy Lavon Julian", + profession: "chemist", + accomplishment: + "pioneering cortisone drugs, steroids and birth control pills", + imageId: "IOjWm71", + }, + { + id: 4, + name: "Subrahmanyan Chandrasekhar", + profession: "astrophysicist", + accomplishment: "white dwarf star mass calculations", + imageId: "lrWQx8l", + }, +]; +``` + +```js +export function getImageUrl(person) { + return "https://i.imgur.com/" + person.imageId + "s.jpg"; +} +``` + +```css +ul { + list-style-type: none; + padding: 0px 10px; +} +li { + margin-bottom: 10px; + display: grid; + grid-template-columns: auto 1fr; + gap: 20px; + align-items: center; +} +img { + width: 100px; + height: 100px; + border-radius: 50%; +} +``` + +<Solution> + +You could use `filter()` twice, creating two separate arrays, and then `map` over both of them: + +```js +import { people } from "./data.js"; +import { getImageUrl } from "./utils.js"; + +export default function List() { + const chemists = people.filter((person) => person.profession === "chemist"); + const everyoneElse = people.filter( + (person) => person.profession !== "chemist" + ); + return ( + <article> + <h1>Scientists</h1> + <h2>Chemists</h2> + <ul> + {chemists.map((person) => ( + <li key={person.id}> + <img src={getImageUrl(person)} alt={person.name} /> + <p> + <b>{person.name}:</b> + {" " + person.profession + " "} + known for {person.accomplishment} + </p> + </li> + ))} + </ul> + <h2>Everyone Else</h2> + <ul> + {everyoneElse.map((person) => ( + <li key={person.id}> + <img src={getImageUrl(person)} alt={person.name} /> + <p> + <b>{person.name}:</b> + {" " + person.profession + " "} + known for {person.accomplishment} + </p> + </li> + ))} + </ul> + </article> + ); +} +``` + +```js +export const people = [ + { + id: 0, + name: "Creola Katherine Johnson", + profession: "mathematician", + accomplishment: "spaceflight calculations", + imageId: "MK3eW3A", + }, + { + id: 1, + name: "Mario José Molina-Pasquel Henríquez", + profession: "chemist", + accomplishment: "discovery of Arctic ozone hole", + imageId: "mynHUSa", + }, + { + id: 2, + name: "Mohammad Abdus Salam", + profession: "physicist", + accomplishment: "electromagnetism theory", + imageId: "bE7W1ji", + }, + { + id: 3, + name: "Percy Lavon Julian", + profession: "chemist", + accomplishment: + "pioneering cortisone drugs, steroids and birth control pills", + imageId: "IOjWm71", + }, + { + id: 4, + name: "Subrahmanyan Chandrasekhar", + profession: "astrophysicist", + accomplishment: "white dwarf star mass calculations", + imageId: "lrWQx8l", + }, +]; +``` + +```js +export function getImageUrl(person) { + return "https://i.imgur.com/" + person.imageId + "s.jpg"; +} +``` + +```css +ul { + list-style-type: none; + padding: 0px 10px; +} +li { + margin-bottom: 10px; + display: grid; + grid-template-columns: auto 1fr; + gap: 20px; + align-items: center; +} +img { + width: 100px; + height: 100px; + border-radius: 50%; +} +``` + +In this solution, the `map` calls are placed directly inline into the parent `<ul>` elements, but you could introduce variables for them if you find that more readable. + +There is still a bit duplication between the rendered lists. You can go further and extract the repetitive parts into a `<ListSection>` component: + +```js +import { people } from "./data.js"; +import { getImageUrl } from "./utils.js"; + +function ListSection({ title, people }) { + return ( + <> + <h2>{title}</h2> + <ul> + {people.map((person) => ( + <li key={person.id}> + <img src={getImageUrl(person)} alt={person.name} /> + <p> + <b>{person.name}:</b> + {" " + person.profession + " "} + known for {person.accomplishment} + </p> + </li> + ))} + </ul> + </> + ); +} + +export default function List() { + const chemists = people.filter((person) => person.profession === "chemist"); + const everyoneElse = people.filter( + (person) => person.profession !== "chemist" + ); + return ( + <article> + <h1>Scientists</h1> + <ListSection title="Chemists" people={chemists} /> + <ListSection title="Everyone Else" people={everyoneElse} /> + </article> + ); +} +``` + +```js +export const people = [ + { + id: 0, + name: "Creola Katherine Johnson", + profession: "mathematician", + accomplishment: "spaceflight calculations", + imageId: "MK3eW3A", + }, + { + id: 1, + name: "Mario José Molina-Pasquel Henríquez", + profession: "chemist", + accomplishment: "discovery of Arctic ozone hole", + imageId: "mynHUSa", + }, + { + id: 2, + name: "Mohammad Abdus Salam", + profession: "physicist", + accomplishment: "electromagnetism theory", + imageId: "bE7W1ji", + }, + { + id: 3, + name: "Percy Lavon Julian", + profession: "chemist", + accomplishment: + "pioneering cortisone drugs, steroids and birth control pills", + imageId: "IOjWm71", + }, + { + id: 4, + name: "Subrahmanyan Chandrasekhar", + profession: "astrophysicist", + accomplishment: "white dwarf star mass calculations", + imageId: "lrWQx8l", + }, +]; +``` + +```js +export function getImageUrl(person) { + return "https://i.imgur.com/" + person.imageId + "s.jpg"; +} +``` + +```css +ul { + list-style-type: none; + padding: 0px 10px; +} +li { + margin-bottom: 10px; + display: grid; + grid-template-columns: auto 1fr; + gap: 20px; + align-items: center; +} +img { + width: 100px; + height: 100px; + border-radius: 50%; +} +``` + +A very attentive reader might notice that with two `filter` calls, we check each person's profession twice. Checking a property is very fast, so in this example it's fine. If your logic was more expensive than that, you could replace the `filter` calls with a loop that manually constructs the arrays and checks each person once. + +In fact, if `people` never change, you could move this code out of your component. From React's perspective, all that matters is that you give it an array of JSX nodes in the end. It doesn't care how you produce that array: + +```js +import { people } from "./data.js"; +import { getImageUrl } from "./utils.js"; + +let chemists = []; +let everyoneElse = []; +people.forEach((person) => { + if (person.profession === "chemist") { + chemists.push(person); + } else { + everyoneElse.push(person); + } +}); + +function ListSection({ title, people }) { + return ( + <> + <h2>{title}</h2> + <ul> + {people.map((person) => ( + <li key={person.id}> + <img src={getImageUrl(person)} alt={person.name} /> + <p> + <b>{person.name}:</b> + {" " + person.profession + " "} + known for {person.accomplishment} + </p> + </li> + ))} + </ul> + </> + ); +} + +export default function List() { + return ( + <article> + <h1>Scientists</h1> + <ListSection title="Chemists" people={chemists} /> + <ListSection title="Everyone Else" people={everyoneElse} /> + </article> + ); +} +``` + +```js +export const people = [ + { + id: 0, + name: "Creola Katherine Johnson", + profession: "mathematician", + accomplishment: "spaceflight calculations", + imageId: "MK3eW3A", + }, + { + id: 1, + name: "Mario José Molina-Pasquel Henríquez", + profession: "chemist", + accomplishment: "discovery of Arctic ozone hole", + imageId: "mynHUSa", + }, + { + id: 2, + name: "Mohammad Abdus Salam", + profession: "physicist", + accomplishment: "electromagnetism theory", + imageId: "bE7W1ji", + }, + { + id: 3, + name: "Percy Lavon Julian", + profession: "chemist", + accomplishment: + "pioneering cortisone drugs, steroids and birth control pills", + imageId: "IOjWm71", + }, + { + id: 4, + name: "Subrahmanyan Chandrasekhar", + profession: "astrophysicist", + accomplishment: "white dwarf star mass calculations", + imageId: "lrWQx8l", + }, +]; +``` + +```js +export function getImageUrl(person) { + return "https://i.imgur.com/" + person.imageId + "s.jpg"; +} +``` + +```css +ul { + list-style-type: none; + padding: 0px 10px; +} +li { + margin-bottom: 10px; + display: grid; + grid-template-columns: auto 1fr; + gap: 20px; + align-items: center; +} +img { + width: 100px; + height: 100px; + border-radius: 50%; +} +``` + +</Solution> + +#### Nested lists in one component + +Make a list of recipes from this array! For each recipe in the array, display its name as an `<h2>` and list its ingredients in a `<ul>`. + +<Hint> + +This will require nesting two different `map` calls. + +</Hint> + +```js +import { recipes } from "./data.js"; + +export default function RecipeList() { + return ( + <div> + <h1>Recipes</h1> + </div> + ); +} +``` + +```js +export const recipes = [ + { + id: "greek-salad", + name: "Greek Salad", + ingredients: ["tomatoes", "cucumber", "onion", "olives", "feta"], + }, + { + id: "hawaiian-pizza", + name: "Hawaiian Pizza", + ingredients: [ + "pizza crust", + "pizza sauce", + "mozzarella", + "ham", + "pineapple", + ], + }, + { + id: "hummus", + name: "Hummus", + ingredients: [ + "chickpeas", + "olive oil", + "garlic cloves", + "lemon", + "tahini", + ], + }, +]; +``` + +<Solution> + +Here is one way you could go about it: + +```js +import { recipes } from "./data.js"; + +export default function RecipeList() { + return ( + <div> + <h1>Recipes</h1> + {recipes.map((recipe) => ( + <div key={recipe.id}> + <h2>{recipe.name}</h2> + <ul> + {recipe.ingredients.map((ingredient) => ( + <li key={ingredient}>{ingredient}</li> + ))} + </ul> + </div> + ))} + </div> + ); +} +``` + +```js +export const recipes = [ + { + id: "greek-salad", + name: "Greek Salad", + ingredients: ["tomatoes", "cucumber", "onion", "olives", "feta"], + }, + { + id: "hawaiian-pizza", + name: "Hawaiian Pizza", + ingredients: [ + "pizza crust", + "pizza sauce", + "mozzarella", + "ham", + "pineapple", + ], + }, + { + id: "hummus", + name: "Hummus", + ingredients: [ + "chickpeas", + "olive oil", + "garlic cloves", + "lemon", + "tahini", + ], + }, +]; +``` + +Each of the `recipes` already includes an `id` field, so that's what the outer loop uses for its `key`. There is no ID you could use to loop over ingredients. However, it's reasonable to assume that the same ingredient won't be listed twice within the same recipe, so its name can serve as a `key`. Alternatively, you could change the data structure to add IDs, or use index as a `key` (with the caveat that you can't safely reorder ingredients). + +</Solution> + +#### Extracting a list item component + +This `RecipeList` component contains two nested `map` calls. To simplify it, extract a `Recipe` component from it which will accept `id`, `name`, and `ingredients` props. Where do you place the outer `key` and why? + +```js +import { recipes } from "./data.js"; + +export default function RecipeList() { + return ( + <div> + <h1>Recipes</h1> + {recipes.map((recipe) => ( + <div key={recipe.id}> + <h2>{recipe.name}</h2> + <ul> + {recipe.ingredients.map((ingredient) => ( + <li key={ingredient}>{ingredient}</li> + ))} + </ul> + </div> + ))} + </div> + ); +} +``` + +```js +export const recipes = [ + { + id: "greek-salad", + name: "Greek Salad", + ingredients: ["tomatoes", "cucumber", "onion", "olives", "feta"], + }, + { + id: "hawaiian-pizza", + name: "Hawaiian Pizza", + ingredients: [ + "pizza crust", + "pizza sauce", + "mozzarella", + "ham", + "pineapple", + ], + }, + { + id: "hummus", + name: "Hummus", + ingredients: [ + "chickpeas", + "olive oil", + "garlic cloves", + "lemon", + "tahini", + ], + }, +]; +``` + +<Solution> + +You can copy-paste the JSX from the outer `map` into a new `Recipe` component and return that JSX. Then you can change `recipe.name` to `name`, `recipe.id` to `id`, and so on, and pass them as props to the `Recipe`: + +```js +import { recipes } from "./data.js"; + +function Recipe({ id, name, ingredients }) { + return ( + <div> + <h2>{name}</h2> + <ul> + {ingredients.map((ingredient) => ( + <li key={ingredient}>{ingredient}</li> + ))} + </ul> + </div> + ); +} + +export default function RecipeList() { + return ( + <div> + <h1>Recipes</h1> + {recipes.map((recipe) => ( + <Recipe {...recipe} key={recipe.id} /> + ))} + </div> + ); +} +``` + +```js +export const recipes = [ + { + id: "greek-salad", + name: "Greek Salad", + ingredients: ["tomatoes", "cucumber", "onion", "olives", "feta"], + }, + { + id: "hawaiian-pizza", + name: "Hawaiian Pizza", + ingredients: [ + "pizza crust", + "pizza sauce", + "mozzarella", + "ham", + "pineapple", + ], + }, + { + id: "hummus", + name: "Hummus", + ingredients: [ + "chickpeas", + "olive oil", + "garlic cloves", + "lemon", + "tahini", + ], + }, +]; +``` + +Here, `<Recipe {...recipe} key={recipe.id} />` is a syntax shortcut saying "pass all properties of the `recipe` object as props to the `Recipe` component". You could also write each prop explicitly: `<Recipe id={recipe.id} name={recipe.name} ingredients={recipe.ingredients} key={recipe.id} />`. + +**Note that the `key` is specified on the `<Recipe>` itself rather than on the root `<div>` returned from `Recipe`.** This is because this `key` is needed directly within the context of the surrounding array. Previously, you had an array of `<div>`s so each of them needed a `key`, but now you have an array of `<Recipe>`s. In other words, when you extract a component, don't forget to leave the `key` outside the JSX you copy and paste. + +</Solution> + +#### List with a separator + +This example renders a famous haiku by Katsushika Hokusai, with each line wrapped in a `<p>` tag. Your job is to insert an `<hr />` separator between each paragraph. Your resulting structure should look like this: + +```js +<article> + <p>I write, erase, rewrite</p> + <hr /> + <p>Erase again, and then</p> + <hr /> + <p>A poppy blooms.</p> +</article> +``` + +A haiku only contains three lines, but your solution should work with any number of lines. Note that `<hr />` elements only appear _between_ the `<p>` elements, not in the beginning or the end! + +```js +const poem = { + lines: [ + "I write, erase, rewrite", + "Erase again, and then", + "A poppy blooms.", + ], +}; + +export default function Poem() { + return ( + <article> + {poem.lines.map((line, index) => ( + <p key={index}>{line}</p> + ))} + </article> + ); +} +``` + +```css +body { + text-align: center; +} +p { + font-family: Georgia, serif; + font-size: 20px; + font-style: italic; +} +hr { + margin: 0 120px 0 120px; + border: 1px dashed #45c3d8; +} +``` + +(This is a rare case where index as a key is acceptable because a poem's lines will never reorder.) + +<Hint> + +You'll either need to convert `map` to a manual loop, or use a fragment. + +</Hint> + +<Solution> + +You can write a manual loop, inserting `<hr />` and `<p>...</p>` into the output array as you go: + +```js +const poem = { + lines: [ + "I write, erase, rewrite", + "Erase again, and then", + "A poppy blooms.", + ], +}; + +export default function Poem() { + let output = []; + + // Fill the output array + poem.lines.forEach((line, i) => { + output.push(<hr key={i + "-separator"} />); + output.push(<p key={i + "-text"}>{line}</p>); + }); + // Remove the first <hr /> + output.shift(); + + return <article>{output}</article>; +} +``` + +```css +body { + text-align: center; +} +p { + font-family: Georgia, serif; + font-size: 20px; + font-style: italic; +} +hr { + margin: 0 120px 0 120px; + border: 1px dashed #45c3d8; +} +``` + +Using the original line index as a `key` doesn't work anymore because each separator and paragraph are now in the same array. However, you can give each of them a distinct key using a suffix, e.g. `key={i + '-text'}`. + +Alternatively, you could render a collection of fragments which contain `<hr />` and `<p>...</p>`. However, the `<>...</>` shorthand syntax doesn't support passing keys, so you'd have to write `<Fragment>` explicitly: + +```js +import { Fragment } from "react"; + +const poem = { + lines: [ + "I write, erase, rewrite", + "Erase again, and then", + "A poppy blooms.", + ], +}; + +export default function Poem() { + return ( + <article> + {poem.lines.map((line, i) => ( + <Fragment key={i}> + {i > 0 && <hr />} + <p>{line}</p> + </Fragment> + ))} + </article> + ); +} +``` + +```css +body { + text-align: center; +} +p { + font-family: Georgia, serif; + font-size: 20px; + font-style: italic; +} +hr { + margin: 0 120px 0 120px; + border: 1px dashed #45c3d8; +} +``` + +Remember, fragments (often written as `<> </>`) let you group JSX nodes without adding extra `<div>`s! + +</Solution> + +</Challenges> diff --git a/docs/src/learn/responding-to-events.md b/docs/src/learn/responding-to-events.md new file mode 100644 index 000000000..2e5385bd1 --- /dev/null +++ b/docs/src/learn/responding-to-events.md @@ -0,0 +1,648 @@ +--- +title: Responding to Events 🚧 +--- + +## Overview + +<p class="intro" markdown> + +React lets you add _event handlers_ to your JSX. Event handlers are your own functions that will be triggered in response to interactions like clicking, hovering, focusing form inputs, and so on. + +</p> + +!!! summary "You Will Learn" + + - Different ways to write an event handler + - How to pass event handling logic from a parent component + - How events propagate and how to stop them + +## Adding event handlers + +To add an event handler, you will first define a function and then [pass it as a prop](/learn/passing-props-to-a-component) to the appropriate JSX tag. For example, here is a button that doesn't do anything yet: + +```js +export default function Button() { + return <button>I don't do anything</button>; +} +``` + +You can make it show a message when a user clicks by following these three steps: + +1. Declare a function called `handleClick` _inside_ your `Button` component. +2. Implement the logic inside that function (use `alert` to show the message). +3. Add `on_click={handleClick}` to the `<button>` JSX. + +```js +export default function Button() { + function handleClick() { + alert("You clicked me!"); + } + + return <button on_click={handleClick}>Click me</button>; +} +``` + +```css +button { + margin-right: 10px; +} +``` + +You defined the `handleClick` function and then [passed it as a prop](/learn/passing-props-to-a-component) to `<button>`. `handleClick` is an **event handler.** Event handler functions: + +- Are usually defined _inside_ your components. +- Have names that start with `handle`, followed by the name of the event. + +By convention, it is common to name event handlers as `handle` followed by the event name. You'll often see `on_click={handleClick}`, `onMouseEnter={handleMouseEnter}`, and so on. + +Alternatively, you can define an event handler inline in the JSX: + +```jsx +<button on_click={function handleClick() { + alert('You clicked me!'); +}}> +``` + +Or, more concisely, using an arrow function: + +```jsx +<button on_click={() => { + alert('You clicked me!'); +}}> +``` + +All of these styles are equivalent. Inline event handlers are convenient for short functions. + +<Pitfall> + +Functions passed to event handlers must be passed, not called. For example: + +| passing a function (correct) | calling a function (incorrect) | +| --------------------------------- | ----------------------------------- | +| `<button on_click={handleClick}>` | `<button on_click={handleClick()}>` | + +The difference is subtle. In the first example, the `handleClick` function is passed as an `on_click` event handler. This tells React to remember it and only call your function when the user clicks the button. + +In the second example, the `()` at the end of `handleClick()` fires the function _immediately_ during [rendering](/learn/render-and-commit), without any clicks. This is because JavaScript inside the [JSX `{` and `}`](/learn/javascript-in-jsx-with-curly-braces) executes right away. + +When you write code inline, the same pitfall presents itself in a different way: + +| passing a function (correct) | calling a function (incorrect) | +| --- | --- | +| `<button on_click={() => alert('...')}>` | `<button on_click={alert('...')}>` | + +Passing inline code like this won't fire on click—it fires every time the component renders: + +```jsx +// This alert fires when the component renders, not when clicked! +<button on_click={alert('You clicked me!')}> +``` + +If you want to define your event handler inline, wrap it in an anonymous function like so: + +```jsx +<button on_click={() => alert('You clicked me!')}> +``` + +Rather than executing the code inside with every render, this creates a function to be called later. + +In both cases, what you want to pass is a function: + +- `<button on_click={handleClick}>` passes the `handleClick` function. +- `<button on_click={() => alert('...')}>` passes the `() => alert('...')` function. + +[Read more about arrow functions.](https://javascript.info/arrow-functions-basics) + +</Pitfall> + +### Reading props in event handlers + +Because event handlers are declared inside of a component, they have access to the component's props. Here is a button that, when clicked, shows an alert with its `message` prop: + +```js +function AlertButton({ message, children }) { + return <button on_click={() => alert(message)}>{children}</button>; +} + +export default function Toolbar() { + return ( + <div> + <AlertButton message="Playing!">Play Movie</AlertButton> + <AlertButton message="Uploading!">Upload Image</AlertButton> + </div> + ); +} +``` + +```css +button { + margin-right: 10px; +} +``` + +This lets these two buttons show different messages. Try changing the messages passed to them. + +### Passing event handlers as props + +Often you'll want the parent component to specify a child's event handler. Consider buttons: depending on where you're using a `Button` component, you might want to execute a different function—perhaps one plays a movie and another uploads an image. + +To do this, pass a prop the component receives from its parent as the event handler like so: + +```js +function Button({ on_click, children }) { + return <button on_click={on_click}>{children}</button>; +} + +function PlayButton({ movieName }) { + function handlePlayClick() { + alert(`Playing ${movieName}!`); + } + + return <Button on_click={handlePlayClick}>Play "{movieName}"</Button>; +} + +function UploadButton() { + return <Button on_click={() => alert("Uploading!")}>Upload Image</Button>; +} + +export default function Toolbar() { + return ( + <div> + <PlayButton movieName="Kiki's Delivery Service" /> + <UploadButton /> + </div> + ); +} +``` + +```css +button { + margin-right: 10px; +} +``` + +Here, the `Toolbar` component renders a `PlayButton` and an `UploadButton`: + +- `PlayButton` passes `handlePlayClick` as the `on_click` prop to the `Button` inside. +- `UploadButton` passes `() => alert('Uploading!')` as the `on_click` prop to the `Button` inside. + +Finally, your `Button` component accepts a prop called `on_click`. It passes that prop directly to the built-in browser `<button>` with `on_click={on_click}`. This tells React to call the passed function on click. + +If you use a [design system](https://uxdesign.cc/everything-you-need-to-know-about-design-systems-54b109851969), it's common for components like buttons to contain styling but not specify behavior. Instead, components like `PlayButton` and `UploadButton` will pass event handlers down. + +### Naming event handler props + +Built-in components like `<button>` and `<div>` only support [browser event names](/reference/react-dom/components/common#common-props) like `on_click`. However, when you're building your own components, you can name their event handler props any way that you like. + +By convention, event handler props should start with `on`, followed by a capital letter. + +For example, the `Button` component's `on_click` prop could have been called `onSmash`: + +```js +function Button({ onSmash, children }) { + return <button on_click={onSmash}>{children}</button>; +} + +export default function App() { + return ( + <div> + <Button onSmash={() => alert("Playing!")}>Play Movie</Button> + <Button onSmash={() => alert("Uploading!")}>Upload Image</Button> + </div> + ); +} +``` + +```css +button { + margin-right: 10px; +} +``` + +In this example, `<button on_click={onSmash}>` shows that the browser `<button>` (lowercase) still needs a prop called `on_click`, but the prop name received by your custom `Button` component is up to you! + +When your component supports multiple interactions, you might name event handler props for app-specific concepts. For example, this `Toolbar` component receives `onPlayMovie` and `onUploadImage` event handlers: + +```js +export default function App() { + return ( + <Toolbar + onPlayMovie={() => alert("Playing!")} + onUploadImage={() => alert("Uploading!")} + /> + ); +} + +function Toolbar({ onPlayMovie, onUploadImage }) { + return ( + <div> + <Button on_click={onPlayMovie}>Play Movie</Button> + <Button on_click={onUploadImage}>Upload Image</Button> + </div> + ); +} + +function Button({ on_click, children }) { + return <button on_click={on_click}>{children}</button>; +} +``` + +```css +button { + margin-right: 10px; +} +``` + +Notice how the `App` component does not need to know _what_ `Toolbar` will do with `onPlayMovie` or `onUploadImage`. That's an implementation detail of the `Toolbar`. Here, `Toolbar` passes them down as `on_click` handlers to its `Button`s, but it could later also trigger them on a keyboard shortcut. Naming props after app-specific interactions like `onPlayMovie` gives you the flexibility to change how they're used later. + +<Note> + +Make sure that you use the appropriate HTML tags for your event handlers. For example, to handle clicks, use [`<button on_click={handleClick}>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button) instead of `<div on_click={handleClick}>`. Using a real browser `<button>` enables built-in browser behaviors like keyboard navigation. If you don't like the default browser styling of a button and want to make it look more like a link or a different UI element, you can achieve it with CSS. [Learn more about writing accessible markup.](https://developer.mozilla.org/en-US/docs/Learn/Accessibility/HTML) + +</Note> + +## Event propagation + +Event handlers will also catch events from any children your component might have. We say that an event "bubbles" or "propagates" up the tree: it starts with where the event happened, and then goes up the tree. + +This `<div>` contains two buttons. Both the `<div>` _and_ each button have their own `on_click` handlers. Which handlers do you think will fire when you click a button? + +```js +export default function Toolbar() { + return ( + <div + className="Toolbar" + on_click={() => { + alert("You clicked on the toolbar!"); + }} + > + <button on_click={() => alert("Playing!")}>Play Movie</button> + <button on_click={() => alert("Uploading!")}>Upload Image</button> + </div> + ); +} +``` + +```css +.Toolbar { + background: #aaa; + padding: 5px; +} +button { + margin: 5px; +} +``` + +If you click on either button, its `on_click` will run first, followed by the parent `<div>`'s `on_click`. So two messages will appear. If you click the toolbar itself, only the parent `<div>`'s `on_click` will run. + +<Pitfall> + +All events propagate in React except `onScroll`, which only works on the JSX tag you attach it to. + +</Pitfall> + +### Stopping propagation + +Event handlers receive an **event object** as their only argument. By convention, it's usually called `e`, which stands for "event". You can use this object to read information about the event. + +That event object also lets you stop the propagation. If you want to prevent an event from reaching parent components, you need to call `e.stopPropagation()` like this `Button` component does: + +```js +function Button({ on_click, children }) { + return ( + <button + on_click={(e) => { + e.stopPropagation(); + on_click(); + }} + > + {children} + </button> + ); +} + +export default function Toolbar() { + return ( + <div + className="Toolbar" + on_click={() => { + alert("You clicked on the toolbar!"); + }} + > + <Button on_click={() => alert("Playing!")}>Play Movie</Button> + <Button on_click={() => alert("Uploading!")}>Upload Image</Button> + </div> + ); +} +``` + +```css +.Toolbar { + background: #aaa; + padding: 5px; +} +button { + margin: 5px; +} +``` + +When you click on a button: + +1. React calls the `on_click` handler passed to `<button>`. +2. That handler, defined in `Button`, does the following: + - Calls `e.stopPropagation()`, preventing the event from bubbling further. + - Calls the `on_click` function, which is a prop passed from the `Toolbar` component. +3. That function, defined in the `Toolbar` component, displays the button's own alert. +4. Since the propagation was stopped, the parent `<div>`'s `on_click` handler does _not_ run. + +As a result of `e.stopPropagation()`, clicking on the buttons now only shows a single alert (from the `<button>`) rather than the two of them (from the `<button>` and the parent toolbar `<div>`). Clicking a button is not the same thing as clicking the surrounding toolbar, so stopping the propagation makes sense for this UI. + +<DeepDive> + +#### Capture phase events + +In rare cases, you might need to catch all events on child elements, _even if they stopped propagation_. For example, maybe you want to log every click to analytics, regardless of the propagation logic. You can do this by adding `Capture` at the end of the event name: + +```js +<div + on_clickCapture={() => { + /* this runs first */ + }} +> + <button on_click={(e) => e.stopPropagation()} /> + <button on_click={(e) => e.stopPropagation()} /> +</div> +``` + +Each event propagates in three phases: + +1. It travels down, calling all `on_clickCapture` handlers. +2. It runs the clicked element's `on_click` handler. +3. It travels upwards, calling all `on_click` handlers. + +Capture events are useful for code like routers or analytics, but you probably won't use them in app code. + +</DeepDive> + +### Passing handlers as alternative to propagation + +Notice how this click handler runs a line of code _and then_ calls the `on_click` prop passed by the parent: + +```js +function Button({ on_click, children }) { + return ( + <button + on_click={(e) => { + e.stopPropagation(); + on_click(); + }} + > + {children} + </button> + ); +} +``` + +You could add more code to this handler before calling the parent `on_click` event handler, too. This pattern provides an _alternative_ to propagation. It lets the child component handle the event, while also letting the parent component specify some additional behavior. Unlike propagation, it's not automatic. But the benefit of this pattern is that you can clearly follow the whole chain of code that executes as a result of some event. + +If you rely on propagation and it's difficult to trace which handlers execute and why, try this approach instead. + +### Preventing default behavior + +Some browser events have default behavior associated with them. For example, a `<form>` submit event, which happens when a button inside of it is clicked, will reload the whole page by default: + +```js +export default function Signup() { + return ( + <form onSubmit={() => alert("Submitting!")}> + <input /> + <button>Send</button> + </form> + ); +} +``` + +```css +button { + margin-left: 5px; +} +``` + +You can call `e.preventDefault()` on the event object to stop this from happening: + +```js +export default function Signup() { + return ( + <form + onSubmit={(e) => { + e.preventDefault(); + alert("Submitting!"); + }} + > + <input /> + <button>Send</button> + </form> + ); +} +``` + +```css +button { + margin-left: 5px; +} +``` + +Don't confuse `e.stopPropagation()` and `e.preventDefault()`. They are both useful, but are unrelated: + +- [`e.stopPropagation()`](https://developer.mozilla.org/docs/Web/API/Event/stopPropagation) stops the event handlers attached to the tags above from firing. +- [`e.preventDefault()` ](https://developer.mozilla.org/docs/Web/API/Event/preventDefault) prevents the default browser behavior for the few events that have it. + +## Can event handlers have side effects? + +Absolutely! Event handlers are the best place for side effects. + +Unlike rendering functions, event handlers don't need to be [pure](/learn/keeping-components-pure), so it's a great place to _change_ something—for example, change an input's value in response to typing, or change a list in response to a button press. However, in order to change some information, you first need some way to store it. In React, this is done by using [state, a component's memory.](/learn/state-a-components-memory) You will learn all about it on the next page. + +<Recap> + +- You can handle events by passing a function as a prop to an element like `<button>`. +- Event handlers must be passed, **not called!** `on_click={handleClick}`, not `on_click={handleClick()}`. +- You can define an event handler function separately or inline. +- Event handlers are defined inside a component, so they can access props. +- You can declare an event handler in a parent and pass it as a prop to a child. +- You can define your own event handler props with application-specific names. +- Events propagate upwards. Call `e.stopPropagation()` on the first argument to prevent that. +- Events may have unwanted default browser behavior. Call `e.preventDefault()` to prevent that. +- Explicitly calling an event handler prop from a child handler is a good alternative to propagation. + +</Recap> + +<Challenges> + +#### Fix an event handler + +Clicking this button is supposed to switch the page background between white and black. However, nothing happens when you click it. Fix the problem. (Don't worry about the logic inside `handleClick`—that part is fine.) + +```js +export default function LightSwitch() { + function handleClick() { + let bodyStyle = document.body.style; + if (bodyStyle.backgroundColor === "black") { + bodyStyle.backgroundColor = "white"; + } else { + bodyStyle.backgroundColor = "black"; + } + } + + return <button on_click={handleClick()}>Toggle the lights</button>; +} +``` + +<Solution> + +The problem is that `<button on_click={handleClick()}>` _calls_ the `handleClick` function while rendering instead of _passing_ it. Removing the `()` call so that it's `<button on_click={handleClick}>` fixes the issue: + +```js +export default function LightSwitch() { + function handleClick() { + let bodyStyle = document.body.style; + if (bodyStyle.backgroundColor === "black") { + bodyStyle.backgroundColor = "white"; + } else { + bodyStyle.backgroundColor = "black"; + } + } + + return <button on_click={handleClick}>Toggle the lights</button>; +} +``` + +Alternatively, you could wrap the call into another function, like `<button on_click={() => handleClick()}>`: + +```js +export default function LightSwitch() { + function handleClick() { + let bodyStyle = document.body.style; + if (bodyStyle.backgroundColor === "black") { + bodyStyle.backgroundColor = "white"; + } else { + bodyStyle.backgroundColor = "black"; + } + } + + return <button on_click={() => handleClick()}>Toggle the lights</button>; +} +``` + +</Solution> + +#### Wire up the events + +This `ColorSwitch` component renders a button. It's supposed to change the page color. Wire it up to the `onChangeColor` event handler prop it receives from the parent so that clicking the button changes the color. + +After you do this, notice that clicking the button also increments the page click counter. Your colleague who wrote the parent component insists that `onChangeColor` does not increment any counters. What else might be happening? Fix it so that clicking the button _only_ changes the color, and does _not_ increment the counter. + +```js +export default function ColorSwitch({ onChangeColor }) { + return <button>Change color</button>; +} +``` + +```js +import { useState } from "react"; +import ColorSwitch from "./ColorSwitch.js"; + +export default function App() { + const [clicks, setClicks] = useState(0); + + function handleClickOutside() { + setClicks((c) => c + 1); + } + + function getRandomLightColor() { + let r = 150 + Math.round(100 * Math.random()); + let g = 150 + Math.round(100 * Math.random()); + let b = 150 + Math.round(100 * Math.random()); + return `rgb(${r}, ${g}, ${b})`; + } + + function handleChangeColor() { + let bodyStyle = document.body.style; + bodyStyle.backgroundColor = getRandomLightColor(); + } + + return ( + <div + style={{ width: "100%", height: "100%" }} + on_click={handleClickOutside} + > + <ColorSwitch onChangeColor={handleChangeColor} /> + <br /> + <br /> + <h2>Clicks on the page: {clicks}</h2> + </div> + ); +} +``` + +<Solution> + +First, you need to add the event handler, like `<button on_click={onChangeColor}>`. + +However, this introduces the problem of the incrementing counter. If `onChangeColor` does not do this, as your colleague insists, then the problem is that this event propagates up, and some handler above does it. To solve this problem, you need to stop the propagation. But don't forget that you should still call `onChangeColor`. + +```js +export default function ColorSwitch({ onChangeColor }) { + return ( + <button + on_click={(e) => { + e.stopPropagation(); + onChangeColor(); + }} + > + Change color + </button> + ); +} +``` + +```js +import { useState } from "react"; +import ColorSwitch from "./ColorSwitch.js"; + +export default function App() { + const [clicks, setClicks] = useState(0); + + function handleClickOutside() { + setClicks((c) => c + 1); + } + + function getRandomLightColor() { + let r = 150 + Math.round(100 * Math.random()); + let g = 150 + Math.round(100 * Math.random()); + let b = 150 + Math.round(100 * Math.random()); + return `rgb(${r}, ${g}, ${b})`; + } + + function handleChangeColor() { + let bodyStyle = document.body.style; + bodyStyle.backgroundColor = getRandomLightColor(); + } + + return ( + <div + style={{ width: "100%", height: "100%" }} + on_click={handleClickOutside} + > + <ColorSwitch onChangeColor={handleChangeColor} /> + <br /> + <br /> + <h2>Clicks on the page: {clicks}</h2> + </div> + ); +} +``` + +</Solution> + +</Challenges> diff --git a/docs/src/learn/reusing-logic-with-custom-hooks.md b/docs/src/learn/reusing-logic-with-custom-hooks.md new file mode 100644 index 000000000..a9c16248f --- /dev/null +++ b/docs/src/learn/reusing-logic-with-custom-hooks.md @@ -0,0 +1,2519 @@ +--- +title: "Reusing Logic with Custom Hooks 🚧" +--- + +## Overview + +<p class="intro" markdown> + +React comes with several built-in Hooks like `useState`, `useContext`, and `useEffect`. Sometimes, you'll wish that there was a Hook for some more specific purpose: for example, to fetch data, to keep track of whether the user is online, or to connect to a chat room. You might not find these Hooks in React, but you can create your own Hooks for your application's needs. + +</p> + +!!! summary "You Will Learn" + + - What custom Hooks are, and how to write your own + - How to reuse logic between components + - How to name and structure your custom Hooks + - When and why to extract custom Hooks + +## Custom Hooks: Sharing logic between components + +Imagine you're developing an app that heavily relies on the network (as most apps do). You want to warn the user if their network connection has accidentally gone off while they were using your app. How would you go about it? It seems like you'll need two things in your component: + +1. A piece of state that tracks whether the network is online. +2. An Effect that subscribes to the global [`online`](https://developer.mozilla.org/en-US/docs/Web/API/Window/online_event) and [`offline`](https://developer.mozilla.org/en-US/docs/Web/API/Window/offline_event) events, and updates that state. + +This will keep your component [synchronized](/learn/synchronizing-with-effects) with the network status. You might start with something like this: + +```js +import { useState, useEffect } from "react"; + +export default function StatusBar() { + const [isOnline, setIsOnline] = useState(true); + useEffect(() => { + function handleOnline() { + setIsOnline(true); + } + function handleOffline() { + setIsOnline(false); + } + window.addEventListener("online", handleOnline); + window.addEventListener("offline", handleOffline); + return () => { + window.removeEventListener("online", handleOnline); + window.removeEventListener("offline", handleOffline); + }; + }, []); + + return <h1>{isOnline ? "✅ Online" : "❌ Disconnected"}</h1>; +} +``` + +Try turning your network on and off, and notice how this `StatusBar` updates in response to your actions. + +Now imagine you _also_ want to use the same logic in a different component. You want to implement a Save button that will become disabled and show "Reconnecting..." instead of "Save" while the network is off. + +To start, you can copy and paste the `isOnline` state and the Effect into `SaveButton`: + +```js +import { useState, useEffect } from "react"; + +export default function SaveButton() { + const [isOnline, setIsOnline] = useState(true); + useEffect(() => { + function handleOnline() { + setIsOnline(true); + } + function handleOffline() { + setIsOnline(false); + } + window.addEventListener("online", handleOnline); + window.addEventListener("offline", handleOffline); + return () => { + window.removeEventListener("online", handleOnline); + window.removeEventListener("offline", handleOffline); + }; + }, []); + + function handleSaveClick() { + console.log("✅ Progress saved"); + } + + return ( + <button disabled={!isOnline} on_click={handleSaveClick}> + {isOnline ? "Save progress" : "Reconnecting..."} + </button> + ); +} +``` + +Verify that, if you turn off the network, the button will change its appearance. + +These two components work fine, but the duplication in logic between them is unfortunate. It seems like even though they have different _visual appearance,_ you want to reuse the logic between them. + +### Extracting your own custom Hook from a component + +Imagine for a moment that, similar to [`useState`](/reference/react/useState) and [`useEffect`](/reference/react/useEffect), there was a built-in `useOnlineStatus` Hook. Then both of these components could be simplified and you could remove the duplication between them: + +```js +function StatusBar() { + const isOnline = useOnlineStatus(); + return <h1>{isOnline ? "✅ Online" : "❌ Disconnected"}</h1>; +} + +function SaveButton() { + const isOnline = useOnlineStatus(); + + function handleSaveClick() { + console.log("✅ Progress saved"); + } + + return ( + <button disabled={!isOnline} on_click={handleSaveClick}> + {isOnline ? "Save progress" : "Reconnecting..."} + </button> + ); +} +``` + +Although there is no such built-in Hook, you can write it yourself. Declare a function called `useOnlineStatus` and move all the duplicated code into it from the components you wrote earlier: + +```js +function useOnlineStatus() { + const [isOnline, setIsOnline] = useState(true); + useEffect(() => { + function handleOnline() { + setIsOnline(true); + } + function handleOffline() { + setIsOnline(false); + } + window.addEventListener("online", handleOnline); + window.addEventListener("offline", handleOffline); + return () => { + window.removeEventListener("online", handleOnline); + window.removeEventListener("offline", handleOffline); + }; + }, []); + return isOnline; +} +``` + +At the end of the function, return `isOnline`. This lets your components read that value: + +```js +import { useOnlineStatus } from "./useOnlineStatus.js"; + +function StatusBar() { + const isOnline = useOnlineStatus(); + return <h1>{isOnline ? "✅ Online" : "❌ Disconnected"}</h1>; +} + +function SaveButton() { + const isOnline = useOnlineStatus(); + + function handleSaveClick() { + console.log("✅ Progress saved"); + } + + return ( + <button disabled={!isOnline} on_click={handleSaveClick}> + {isOnline ? "Save progress" : "Reconnecting..."} + </button> + ); +} + +export default function App() { + return ( + <> + <SaveButton /> + <StatusBar /> + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export function useOnlineStatus() { + const [isOnline, setIsOnline] = useState(true); + useEffect(() => { + function handleOnline() { + setIsOnline(true); + } + function handleOffline() { + setIsOnline(false); + } + window.addEventListener("online", handleOnline); + window.addEventListener("offline", handleOffline); + return () => { + window.removeEventListener("online", handleOnline); + window.removeEventListener("offline", handleOffline); + }; + }, []); + return isOnline; +} +``` + +Verify that switching the network on and off updates both components. + +Now your components don't have as much repetitive logic. **More importantly, the code inside them describes _what they want to do_ (use the online status!) rather than _how to do it_ (by subscribing to the browser events).** + +When you extract logic into custom Hooks, you can hide the gnarly details of how you deal with some external system or a browser API. The code of your components expresses your intent, not the implementation. + +### Hook names always start with `use` + +React applications are built from components. Components are built from Hooks, whether built-in or custom. You'll likely often use custom Hooks created by others, but occasionally you might write one yourself! + +You must follow these naming conventions: + +1. **React component names must start with a capital letter,** like `StatusBar` and `SaveButton`. React components also need to return something that React knows how to display, like a piece of JSX. +2. **Hook names must start with `use` followed by a capital letter,** like [`useState`](/reference/react/useState) (built-in) or `useOnlineStatus` (custom, like earlier on the page). Hooks may return arbitrary values. + +This convention guarantees that you can always look at a component and know where its state, Effects, and other React features might "hide". For example, if you see a `getColor()` function call inside your component, you can be sure that it can't possibly contain React state inside because its name doesn't start with `use`. However, a function call like `useOnlineStatus()` will most likely contain calls to other Hooks inside! + +<Note> + +If your linter is [configured for React,](/learn/editor-setup#linting) it will enforce this naming convention. Scroll up to the sandbox above and rename `useOnlineStatus` to `getOnlineStatus`. Notice that the linter won't allow you to call `useState` or `useEffect` inside of it anymore. Only Hooks and components can call other Hooks! + +</Note> + +<DeepDive> + +#### Should all functions called during rendering start with the use prefix? + +No. Functions that don't _call_ Hooks don't need to _be_ Hooks. + +If your function doesn't call any Hooks, avoid the `use` prefix. Instead, write it as a regular function _without_ the `use` prefix. For example, `useSorted` below doesn't call Hooks, so call it `getSorted` instead: + +```js +// 🔴 Avoid: A Hook that doesn't use Hooks +function useSorted(items) { + return items.slice().sort(); +} + +// ✅ Good: A regular function that doesn't use Hooks +function getSorted(items) { + return items.slice().sort(); +} +``` + +This ensures that your code can call this regular function anywhere, including conditions: + +```js +function List({ items, shouldSort }) { + let displayedItems = items; + if (shouldSort) { + // ✅ It's ok to call getSorted() conditionally because it's not a Hook + displayedItems = getSorted(items); + } + // ... +} +``` + +You should give `use` prefix to a function (and thus make it a Hook) if it uses at least one Hook inside of it: + +```js +// ✅ Good: A Hook that uses other Hooks +function useAuth() { + return useContext(Auth); +} +``` + +Technically, this isn't enforced by React. In principle, you could make a Hook that doesn't call other Hooks. This is often confusing and limiting so it's best to avoid that pattern. However, there may be rare cases where it is helpful. For example, maybe your function doesn't use any Hooks right now, but you plan to add some Hook calls to it in the future. Then it makes sense to name it with the `use` prefix: + +```js +// ✅ Good: A Hook that will likely use some other Hooks later +function useAuth() { + // TODO: Replace with this line when authentication is implemented: + // return useContext(Auth); + return TEST_USER; +} +``` + +Then components won't be able to call it conditionally. This will become important when you actually add Hook calls inside. If you don't plan to use Hooks inside it (now or later), don't make it a Hook. + +</DeepDive> + +### Custom Hooks let you share stateful logic, not state itself + +In the earlier example, when you turned the network on and off, both components updated together. However, it's wrong to think that a single `isOnline` state variable is shared between them. Look at this code: + +```js +function StatusBar() { + const isOnline = useOnlineStatus(); + // ... +} + +function SaveButton() { + const isOnline = useOnlineStatus(); + // ... +} +``` + +It works the same way as before you extracted the duplication: + +```js +function StatusBar() { + const [isOnline, setIsOnline] = useState(true); + useEffect(() => { + // ... + }, []); + // ... +} + +function SaveButton() { + const [isOnline, setIsOnline] = useState(true); + useEffect(() => { + // ... + }, []); + // ... +} +``` + +These are two completely independent state variables and Effects! They happened to have the same value at the same time because you synchronized them with the same external value (whether the network is on). + +To better illustrate this, we'll need a different example. Consider this `Form` component: + +```js +import { useState } from "react"; + +export default function Form() { + const [firstName, setFirstName] = useState("Mary"); + const [lastName, setLastName] = useState("Poppins"); + + function handleFirstNameChange(e) { + setFirstName(e.target.value); + } + + function handleLastNameChange(e) { + setLastName(e.target.value); + } + + return ( + <> + <label> + First name: + <input value={firstName} onChange={handleFirstNameChange} /> + </label> + <label> + Last name: + <input value={lastName} onChange={handleLastNameChange} /> + </label> + <p> + <b> + Good morning, {firstName} {lastName}. + </b> + </p> + </> + ); +} +``` + +```css +label { + display: block; +} +input { + margin-left: 10px; +} +``` + +There's some repetitive logic for each form field: + +1. There's a piece of state (`firstName` and `lastName`). +1. There's a change handler (`handleFirstNameChange` and `handleLastNameChange`). +1. There's a piece of JSX that specifies the `value` and `onChange` attributes for that input. + +You can extract the repetitive logic into this `useFormInput` custom Hook: + +```js +import { useFormInput } from "./useFormInput.js"; + +export default function Form() { + const firstNameProps = useFormInput("Mary"); + const lastNameProps = useFormInput("Poppins"); + + return ( + <> + <label> + First name: + <input {...firstNameProps} /> + </label> + <label> + Last name: + <input {...lastNameProps} /> + </label> + <p> + <b> + Good morning, {firstNameProps.value} {lastNameProps.value}. + </b> + </p> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export function useFormInput(initialValue) { + const [value, setValue] = useState(initialValue); + + function handleChange(e) { + setValue(e.target.value); + } + + const inputProps = { + value: value, + onChange: handleChange, + }; + + return inputProps; +} +``` + +```css +label { + display: block; +} +input { + margin-left: 10px; +} +``` + +Notice that it only declares _one_ state variable called `value`. + +However, the `Form` component calls `useFormInput` _two times:_ + +```js +function Form() { + const firstNameProps = useFormInput('Mary'); + const lastNameProps = useFormInput('Poppins'); + // ... +``` + +This is why it works like declaring two separate state variables! + +**Custom Hooks let you share _stateful logic_ but not _state itself._ Each call to a Hook is completely independent from every other call to the same Hook.** This is why the two sandboxes above are completely equivalent. If you'd like, scroll back up and compare them. The behavior before and after extracting a custom Hook is identical. + +When you need to share the state itself between multiple components, [lift it up and pass it down](/learn/sharing-state-between-components) instead. + +## Passing reactive values between Hooks + +The code inside your custom Hooks will re-run during every re-render of your component. This is why, like components, custom Hooks [need to be pure.](/learn/keeping-components-pure) Think of custom Hooks' code as part of your component's body! + +Because custom Hooks re-render together with your component, they always receive the latest props and state. To see what this means, consider this chat room example. Change the server URL or the chat room: + +```js +import { useState } from "react"; +import ChatRoom from "./ChatRoom.js"; + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; +import { showNotification } from "./notifications.js"; + +export default function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + const connection = createConnection(options); + connection.on("message", (msg) => { + showNotification("New message: " + msg); + }); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, serverUrl]); + + return ( + <> + <label> + Server URL: + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + </> + ); +} +``` + +```js +export function createConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + if (typeof serverUrl !== "string") { + throw Error( + "Expected serverUrl to be a string. Received: " + serverUrl + ); + } + if (typeof roomId !== "string") { + throw Error("Expected roomId to be a string. Received: " + roomId); + } + let intervalId; + let messageCallback; + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + clearInterval(intervalId); + intervalId = setInterval(() => { + if (messageCallback) { + if (Math.random() > 0.5) { + messageCallback("hey"); + } else { + messageCallback("lol"); + } + } + }, 3000); + }, + disconnect() { + clearInterval(intervalId); + messageCallback = null; + console.log( + '❌ Disconnected from "' + + roomId + + '" room at ' + + serverUrl + + "" + ); + }, + on(event, callback) { + if (messageCallback) { + throw Error("Cannot add the handler twice."); + } + if (event !== "message") { + throw Error('Only "message" event is supported.'); + } + messageCallback = callback; + }, + }; +} +``` + +```js +import Toastify from "toastify-js"; +import "toastify-js/src/toastify.css"; + +export function showNotification(message, theme = "dark") { + Toastify({ + text: message, + duration: 2000, + gravity: "top", + position: "right", + style: { + background: theme === "dark" ? "black" : "white", + color: theme === "dark" ? "white" : "black", + }, + }).showToast(); +} +``` + +```json +{ + "dependencies": { + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "toastify-js": "1.12.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +When you change `serverUrl` or `roomId`, the Effect ["reacts" to your changes](/learn/lifecycle-of-reactive-effects#effects-react-to-reactive-values) and re-synchronizes. You can tell by the console messages that the chat re-connects every time that you change your Effect's dependencies. + +Now move the Effect's code into a custom Hook: + +```js +export function useChatRoom({ serverUrl, roomId }) { + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + const connection = createConnection(options); + connection.connect(); + connection.on("message", (msg) => { + showNotification("New message: " + msg); + }); + return () => connection.disconnect(); + }, [roomId, serverUrl]); +} +``` + +This lets your `ChatRoom` component call your custom Hook without worrying about how it works inside: + +```js +export default function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useChatRoom({ + roomId: roomId, + serverUrl: serverUrl, + }); + + return ( + <> + <label> + Server URL: + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + </> + ); +} +``` + +This looks much simpler! (But it does the same thing.) + +Notice that the logic _still responds_ to prop and state changes. Try editing the server URL or the selected room: + +```js +import { useState } from "react"; +import ChatRoom from "./ChatRoom.js"; + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +import { useState } from "react"; +import { useChatRoom } from "./useChatRoom.js"; + +export default function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useChatRoom({ + roomId: roomId, + serverUrl: serverUrl, + }); + + return ( + <> + <label> + Server URL: + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + </> + ); +} +``` + +```js +import { useEffect } from "react"; +import { createConnection } from "./chat.js"; +import { showNotification } from "./notifications.js"; + +export function useChatRoom({ serverUrl, roomId }) { + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + const connection = createConnection(options); + connection.connect(); + connection.on("message", (msg) => { + showNotification("New message: " + msg); + }); + return () => connection.disconnect(); + }, [roomId, serverUrl]); +} +``` + +```js +export function createConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + if (typeof serverUrl !== "string") { + throw Error( + "Expected serverUrl to be a string. Received: " + serverUrl + ); + } + if (typeof roomId !== "string") { + throw Error("Expected roomId to be a string. Received: " + roomId); + } + let intervalId; + let messageCallback; + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + clearInterval(intervalId); + intervalId = setInterval(() => { + if (messageCallback) { + if (Math.random() > 0.5) { + messageCallback("hey"); + } else { + messageCallback("lol"); + } + } + }, 3000); + }, + disconnect() { + clearInterval(intervalId); + messageCallback = null; + console.log( + '❌ Disconnected from "' + + roomId + + '" room at ' + + serverUrl + + "" + ); + }, + on(event, callback) { + if (messageCallback) { + throw Error("Cannot add the handler twice."); + } + if (event !== "message") { + throw Error('Only "message" event is supported.'); + } + messageCallback = callback; + }, + }; +} +``` + +```js +import Toastify from "toastify-js"; +import "toastify-js/src/toastify.css"; + +export function showNotification(message, theme = "dark") { + Toastify({ + text: message, + duration: 2000, + gravity: "top", + position: "right", + style: { + background: theme === "dark" ? "black" : "white", + color: theme === "dark" ? "white" : "black", + }, + }).showToast(); +} +``` + +```json +{ + "dependencies": { + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "toastify-js": "1.12.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +Notice how you're taking the return value of one Hook: + +```js +export default function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState('https://localhost:1234'); + + useChatRoom({ + roomId: roomId, + serverUrl: serverUrl + }); + // ... +``` + +and pass it as an input to another Hook: + +```js +export default function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState('https://localhost:1234'); + + useChatRoom({ + roomId: roomId, + serverUrl: serverUrl + }); + // ... +``` + +Every time your `ChatRoom` component re-renders, it passes the latest `roomId` and `serverUrl` to your Hook. This is why your Effect re-connects to the chat whenever their values are different after a re-render. (If you ever worked with audio or video processing software, chaining Hooks like this might remind you of chaining visual or audio effects. It's as if the output of `useState` "feeds into" the input of the `useChatRoom`.) + +### Passing event handlers to custom Hooks + +<Wip> + +This section describes an **experimental API that has not yet been released** in a stable version of React. + +</Wip> + +As you start using `useChatRoom` in more components, you might want to let components customize its behavior. For example, currently, the logic for what to do when a message arrives is hardcoded inside the Hook: + +```js +export function useChatRoom({ serverUrl, roomId }) { + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + const connection = createConnection(options); + connection.connect(); + connection.on("message", (msg) => { + showNotification("New message: " + msg); + }); + return () => connection.disconnect(); + }, [roomId, serverUrl]); +} +``` + +Let's say you want to move this logic back to your component: + +```js +export default function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState('https://localhost:1234'); + + useChatRoom({ + roomId: roomId, + serverUrl: serverUrl, + onReceiveMessage(msg) { + showNotification('New message: ' + msg); + } + }); + // ... +``` + +To make this work, change your custom Hook to take `onReceiveMessage` as one of its named options: + +```js +export function useChatRoom({ serverUrl, roomId, onReceiveMessage }) { + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + const connection = createConnection(options); + connection.connect(); + connection.on("message", (msg) => { + onReceiveMessage(msg); + }); + return () => connection.disconnect(); + }, [roomId, serverUrl, onReceiveMessage]); // ✅ All dependencies declared +} +``` + +This will work, but there's one more improvement you can do when your custom Hook accepts event handlers. + +Adding a dependency on `onReceiveMessage` is not ideal because it will cause the chat to re-connect every time the component re-renders. [Wrap this event handler into an Effect Event to remove it from the dependencies:](/learn/removing-effect-dependencies#wrapping-an-event-handler-from-the-props) + +```js +import { useEffect, useEffectEvent } from "react"; +// ... + +export function useChatRoom({ serverUrl, roomId, onReceiveMessage }) { + const onMessage = useEffectEvent(onReceiveMessage); + + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + const connection = createConnection(options); + connection.connect(); + connection.on("message", (msg) => { + onMessage(msg); + }); + return () => connection.disconnect(); + }, [roomId, serverUrl]); // ✅ All dependencies declared +} +``` + +Now the chat won't re-connect every time that the `ChatRoom` component re-renders. Here is a fully working demo of passing an event handler to a custom Hook that you can play with: + +```js +import { useState } from "react"; +import ChatRoom from "./ChatRoom.js"; + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +import { useState } from "react"; +import { useChatRoom } from "./useChatRoom.js"; +import { showNotification } from "./notifications.js"; + +export default function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useChatRoom({ + roomId: roomId, + serverUrl: serverUrl, + onReceiveMessage(msg) { + showNotification("New message: " + msg); + }, + }); + + return ( + <> + <label> + Server URL: + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + </> + ); +} +``` + +```js +import { useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; +import { createConnection } from "./chat.js"; + +export function useChatRoom({ serverUrl, roomId, onReceiveMessage }) { + const onMessage = useEffectEvent(onReceiveMessage); + + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + const connection = createConnection(options); + connection.connect(); + connection.on("message", (msg) => { + onMessage(msg); + }); + return () => connection.disconnect(); + }, [roomId, serverUrl]); +} +``` + +```js +export function createConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + if (typeof serverUrl !== "string") { + throw Error( + "Expected serverUrl to be a string. Received: " + serverUrl + ); + } + if (typeof roomId !== "string") { + throw Error("Expected roomId to be a string. Received: " + roomId); + } + let intervalId; + let messageCallback; + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + clearInterval(intervalId); + intervalId = setInterval(() => { + if (messageCallback) { + if (Math.random() > 0.5) { + messageCallback("hey"); + } else { + messageCallback("lol"); + } + } + }, 3000); + }, + disconnect() { + clearInterval(intervalId); + messageCallback = null; + console.log( + '❌ Disconnected from "' + + roomId + + '" room at ' + + serverUrl + + "" + ); + }, + on(event, callback) { + if (messageCallback) { + throw Error("Cannot add the handler twice."); + } + if (event !== "message") { + throw Error('Only "message" event is supported.'); + } + messageCallback = callback; + }, + }; +} +``` + +```js +import Toastify from "toastify-js"; +import "toastify-js/src/toastify.css"; + +export function showNotification(message, theme = "dark") { + Toastify({ + text: message, + duration: 2000, + gravity: "top", + position: "right", + style: { + background: theme === "dark" ? "black" : "white", + color: theme === "dark" ? "white" : "black", + }, + }).showToast(); +} +``` + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest", + "toastify-js": "1.12.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +Notice how you no longer need to know _how_ `useChatRoom` works in order to use it. You could add it to any other component, pass any other options, and it would work the same way. That's the power of custom Hooks. + +## When to use custom Hooks + +You don't need to extract a custom Hook for every little duplicated bit of code. Some duplication is fine. For example, extracting a `useFormInput` Hook to wrap a single `useState` call like earlier is probably unnecessary. + +However, whenever you write an Effect, consider whether it would be clearer to also wrap it in a custom Hook. [You shouldn't need Effects very often,](/learn/you-might-not-need-an-effect) so if you're writing one, it means that you need to "step outside React" to synchronize with some external system or to do something that React doesn't have a built-in API for. Wrapping it into a custom Hook lets you precisely communicate your intent and how the data flows through it. + +For example, consider a `ShippingForm` component that displays two dropdowns: one shows the list of cities, and another shows the list of areas in the selected city. You might start with some code that looks like this: + +```js +function ShippingForm({ country }) { + const [cities, setCities] = useState(null); + // This Effect fetches cities for a country + useEffect(() => { + let ignore = false; + fetch(`/api/cities?country=${country}`) + .then(response => response.json()) + .then(json => { + if (!ignore) { + setCities(json); + } + }); + return () => { + ignore = true; + }; + }, [country]); + + const [city, setCity] = useState(null); + const [areas, setAreas] = useState(null); + // This Effect fetches areas for the selected city + useEffect(() => { + if (city) { + let ignore = false; + fetch(`/api/areas?city=${city}`) + .then(response => response.json()) + .then(json => { + if (!ignore) { + setAreas(json); + } + }); + return () => { + ignore = true; + }; + } + }, [city]); + + // ... +``` + +Although this code is quite repetitive, [it's correct to keep these Effects separate from each other.](/learn/removing-effect-dependencies#is-your-effect-doing-several-unrelated-things) They synchronize two different things, so you shouldn't merge them into one Effect. Instead, you can simplify the `ShippingForm` component above by extracting the common logic between them into your own `useData` Hook: + +```js +function useData(url) { + const [data, setData] = useState(null); + useEffect(() => { + if (url) { + let ignore = false; + fetch(url) + .then((response) => response.json()) + .then((json) => { + if (!ignore) { + setData(json); + } + }); + return () => { + ignore = true; + }; + } + }, [url]); + return data; +} +``` + +Now you can replace both Effects in the `ShippingForm` components with calls to `useData`: + +```js +function ShippingForm({ country }) { + const cities = useData(`/api/cities?country=${country}`); + const [city, setCity] = useState(null); + const areas = useData(city ? `/api/areas?city=${city}` : null); + // ... +``` + +Extracting a custom Hook makes the data flow explicit. You feed the `url` in and you get the `data` out. By "hiding" your Effect inside `useData`, you also prevent someone working on the `ShippingForm` component from adding [unnecessary dependencies](/learn/removing-effect-dependencies) to it. With time, most of your app's Effects will be in custom Hooks. + +<DeepDive> + +#### Keep your custom Hooks focused on concrete high-level use cases + +Start by choosing your custom Hook's name. If you struggle to pick a clear name, it might mean that your Effect is too coupled to the rest of your component's logic, and is not yet ready to be extracted. + +Ideally, your custom Hook's name should be clear enough that even a person who doesn't write code often could have a good guess about what your custom Hook does, what it takes, and what it returns: + +- ✅ `useData(url)` +- ✅ `useImpressionLog(eventName, extraData)` +- ✅ `useChatRoom(options)` + +When you synchronize with an external system, your custom Hook name may be more technical and use jargon specific to that system. It's good as long as it would be clear to a person familiar with that system: + +- ✅ `useMediaQuery(query)` +- ✅ `useSocket(url)` +- ✅ `useIntersectionObserver(ref, options)` + +**Keep custom Hooks focused on concrete high-level use cases.** Avoid creating and using custom "lifecycle" Hooks that act as alternatives and convenience wrappers for the `useEffect` API itself: + +- 🔴 `useMount(fn)` +- 🔴 `useEffectOnce(fn)` +- 🔴 `useUpdateEffect(fn)` + +For example, this `useMount` Hook tries to ensure some code only runs "on mount": + +```js +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + // 🔴 Avoid: using custom "lifecycle" Hooks + useMount(() => { + const connection = createConnection({ roomId, serverUrl }); + connection.connect(); + + post("/analytics/event", { eventName: "visit_chat" }); + }); + // ... +} + +// 🔴 Avoid: creating custom "lifecycle" Hooks +function useMount(fn) { + useEffect(() => { + fn(); + }, []); // 🔴 React Hook useEffect has a missing dependency: 'fn' +} +``` + +**Custom "lifecycle" Hooks like `useMount` don't fit well into the React paradigm.** For example, this code example has a mistake (it doesn't "react" to `roomId` or `serverUrl` changes), but the linter won't warn you about it because the linter only checks direct `useEffect` calls. It won't know about your Hook. + +If you're writing an Effect, start by using the React API directly: + +```js +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + // ✅ Good: two raw Effects separated by purpose + + useEffect(() => { + const connection = createConnection({ serverUrl, roomId }); + connection.connect(); + return () => connection.disconnect(); + }, [serverUrl, roomId]); + + useEffect(() => { + post("/analytics/event", { eventName: "visit_chat", roomId }); + }, [roomId]); + + // ... +} +``` + +Then, you can (but don't have to) extract custom Hooks for different high-level use cases: + +```js +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + // ✅ Great: custom Hooks named after their purpose + useChatRoom({ serverUrl, roomId }); + useImpressionLog("visit_chat", { roomId }); + // ... +} +``` + +**A good custom Hook makes the calling code more declarative by constraining what it does.** For example, `useChatRoom(options)` can only connect to the chat room, while `useImpressionLog(eventName, extraData)` can only send an impression log to the analytics. If your custom Hook API doesn't constrain the use cases and is very abstract, in the long run it's likely to introduce more problems than it solves. + +</DeepDive> + +### Custom Hooks help you migrate to better patterns + +Effects are an ["escape hatch"](/learn/escape-hatches): you use them when you need to "step outside React" and when there is no better built-in solution for your use case. With time, the React team's goal is to reduce the number of the Effects in your app to the minimum by providing more specific solutions to more specific problems. Wrapping your Effects in custom Hooks makes it easier to upgrade your code when these solutions become available. + +Let's return to this example: + +```js +import { useOnlineStatus } from "./useOnlineStatus.js"; + +function StatusBar() { + const isOnline = useOnlineStatus(); + return <h1>{isOnline ? "✅ Online" : "❌ Disconnected"}</h1>; +} + +function SaveButton() { + const isOnline = useOnlineStatus(); + + function handleSaveClick() { + console.log("✅ Progress saved"); + } + + return ( + <button disabled={!isOnline} on_click={handleSaveClick}> + {isOnline ? "Save progress" : "Reconnecting..."} + </button> + ); +} + +export default function App() { + return ( + <> + <SaveButton /> + <StatusBar /> + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export function useOnlineStatus() { + const [isOnline, setIsOnline] = useState(true); + useEffect(() => { + function handleOnline() { + setIsOnline(true); + } + function handleOffline() { + setIsOnline(false); + } + window.addEventListener("online", handleOnline); + window.addEventListener("offline", handleOffline); + return () => { + window.removeEventListener("online", handleOnline); + window.removeEventListener("offline", handleOffline); + }; + }, []); + return isOnline; +} +``` + +In the above example, `useOnlineStatus` is implemented with a pair of [`useState`](/reference/react/useState) and [`useEffect`.](/reference/react/useEffect) However, this isn't the best possible solution. There is a number of edge cases it doesn't consider. For example, it assumes that when the component mounts, `isOnline` is already `true`, but this may be wrong if the network already went offline. You can use the browser [`navigator.onLine`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/onLine) API to check for that, but using it directly would not work on the server for generating the initial HTML. In short, this code could be improved. + +Luckily, React 18 includes a dedicated API called [`useSyncExternalStore`](/reference/react/useSyncExternalStore) which takes care of all of these problems for you. Here is how your `useOnlineStatus` Hook, rewritten to take advantage of this new API: + +```js +import { useOnlineStatus } from "./useOnlineStatus.js"; + +function StatusBar() { + const isOnline = useOnlineStatus(); + return <h1>{isOnline ? "✅ Online" : "❌ Disconnected"}</h1>; +} + +function SaveButton() { + const isOnline = useOnlineStatus(); + + function handleSaveClick() { + console.log("✅ Progress saved"); + } + + return ( + <button disabled={!isOnline} on_click={handleSaveClick}> + {isOnline ? "Save progress" : "Reconnecting..."} + </button> + ); +} + +export default function App() { + return ( + <> + <SaveButton /> + <StatusBar /> + </> + ); +} +``` + +```js +import { useSyncExternalStore } from "react"; + +function subscribe(callback) { + window.addEventListener("online", callback); + window.addEventListener("offline", callback); + return () => { + window.removeEventListener("online", callback); + window.removeEventListener("offline", callback); + }; +} + +export function useOnlineStatus() { + return useSyncExternalStore( + subscribe, + () => navigator.onLine, // How to get the value on the client + () => true // How to get the value on the server + ); +} +``` + +Notice how **you didn't need to change any of the components** to make this migration: + +```js +function StatusBar() { + const isOnline = useOnlineStatus(); + // ... +} + +function SaveButton() { + const isOnline = useOnlineStatus(); + // ... +} +``` + +This is another reason for why wrapping Effects in custom Hooks is often beneficial: + +1. You make the data flow to and from your Effects very explicit. +2. You let your components focus on the intent rather than on the exact implementation of your Effects. +3. When React adds new features, you can remove those Effects without changing any of your components. + +Similar to a [design system,](https://uxdesign.cc/everything-you-need-to-know-about-design-systems-54b109851969) you might find it helpful to start extracting common idioms from your app's components into custom Hooks. This will keep your components' code focused on the intent, and let you avoid writing raw Effects very often. Many excellent custom Hooks are maintained by the React community. + +<DeepDive> + +#### Will React provide any built-in solution for data fetching? + +We're still working out the details, but we expect that in the future, you'll write data fetching like this: + +```js +import { use } from 'react'; // Not available yet! + +function ShippingForm({ country }) { + const cities = use(fetch(`/api/cities?country=${country}`)); + const [city, setCity] = useState(null); + const areas = city ? use(fetch(`/api/areas?city=${city}`)) : null; + // ... +``` + +If you use custom Hooks like `useData` above in your app, it will require fewer changes to migrate to the eventually recommended approach than if you write raw Effects in every component manually. However, the old approach will still work fine, so if you feel happy writing raw Effects, you can continue to do that. + +</DeepDive> + +### There is more than one way to do it + +Let's say you want to implement a fade-in animation _from scratch_ using the browser [`requestAnimationFrame`](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame) API. You might start with an Effect that sets up an animation loop. During each frame of the animation, you could change the opacity of the DOM node you [hold in a ref](/learn/manipulating-the-dom-with-refs) until it reaches `1`. Your code might start like this: + +```js +import { useState, useEffect, useRef } from "react"; + +function Welcome() { + const ref = useRef(null); + + useEffect(() => { + const duration = 1000; + const node = ref.current; + + let startTime = performance.now(); + let frameId = null; + + function onFrame(now) { + const timePassed = now - startTime; + const progress = Math.min(timePassed / duration, 1); + onProgress(progress); + if (progress < 1) { + // We still have more frames to paint + frameId = requestAnimationFrame(onFrame); + } + } + + function onProgress(progress) { + node.style.opacity = progress; + } + + function start() { + onProgress(0); + startTime = performance.now(); + frameId = requestAnimationFrame(onFrame); + } + + function stop() { + cancelAnimationFrame(frameId); + startTime = null; + frameId = null; + } + + start(); + return () => stop(); + }, []); + + return ( + <h1 className="welcome" ref={ref}> + Welcome + </h1> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button on_click={() => setShow(!show)}> + {show ? "Remove" : "Show"} + </button> + <hr /> + {show && <Welcome />} + </> + ); +} +``` + +```css +label, +button { + display: block; + margin-bottom: 20px; +} +html, +body { + min-height: 300px; +} +.welcome { + opacity: 0; + color: white; + padding: 50px; + text-align: center; + font-size: 50px; + background-image: radial-gradient( + circle, + rgba(63, 94, 251, 1) 0%, + rgba(252, 70, 107, 1) 100% + ); +} +``` + +To make the component more readable, you might extract the logic into a `useFadeIn` custom Hook: + +```js +import { useState, useEffect, useRef } from "react"; +import { useFadeIn } from "./useFadeIn.js"; + +function Welcome() { + const ref = useRef(null); + + useFadeIn(ref, 1000); + + return ( + <h1 className="welcome" ref={ref}> + Welcome + </h1> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button on_click={() => setShow(!show)}> + {show ? "Remove" : "Show"} + </button> + <hr /> + {show && <Welcome />} + </> + ); +} +``` + +```js +import { useEffect } from "react"; + +export function useFadeIn(ref, duration) { + useEffect(() => { + const node = ref.current; + + let startTime = performance.now(); + let frameId = null; + + function onFrame(now) { + const timePassed = now - startTime; + const progress = Math.min(timePassed / duration, 1); + onProgress(progress); + if (progress < 1) { + // We still have more frames to paint + frameId = requestAnimationFrame(onFrame); + } + } + + function onProgress(progress) { + node.style.opacity = progress; + } + + function start() { + onProgress(0); + startTime = performance.now(); + frameId = requestAnimationFrame(onFrame); + } + + function stop() { + cancelAnimationFrame(frameId); + startTime = null; + frameId = null; + } + + start(); + return () => stop(); + }, [ref, duration]); +} +``` + +```css +label, +button { + display: block; + margin-bottom: 20px; +} +html, +body { + min-height: 300px; +} +.welcome { + opacity: 0; + color: white; + padding: 50px; + text-align: center; + font-size: 50px; + background-image: radial-gradient( + circle, + rgba(63, 94, 251, 1) 0%, + rgba(252, 70, 107, 1) 100% + ); +} +``` + +You could keep the `useFadeIn` code as is, but you could also refactor it more. For example, you could extract the logic for setting up the animation loop out of `useFadeIn` into a custom `useAnimationLoop` Hook: + +```js +import { useState, useEffect, useRef } from "react"; +import { useFadeIn } from "./useFadeIn.js"; + +function Welcome() { + const ref = useRef(null); + + useFadeIn(ref, 1000); + + return ( + <h1 className="welcome" ref={ref}> + Welcome + </h1> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button on_click={() => setShow(!show)}> + {show ? "Remove" : "Show"} + </button> + <hr /> + {show && <Welcome />} + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; + +export function useFadeIn(ref, duration) { + const [isRunning, setIsRunning] = useState(true); + + useAnimationLoop(isRunning, (timePassed) => { + const progress = Math.min(timePassed / duration, 1); + ref.current.style.opacity = progress; + if (progress === 1) { + setIsRunning(false); + } + }); +} + +function useAnimationLoop(isRunning, drawFrame) { + const onFrame = useEffectEvent(drawFrame); + + useEffect(() => { + if (!isRunning) { + return; + } + + const startTime = performance.now(); + let frameId = null; + + function tick(now) { + const timePassed = now - startTime; + onFrame(timePassed); + frameId = requestAnimationFrame(tick); + } + + tick(); + return () => cancelAnimationFrame(frameId); + }, [isRunning]); +} +``` + +```css +label, +button { + display: block; + margin-bottom: 20px; +} +html, +body { + min-height: 300px; +} +.welcome { + opacity: 0; + color: white; + padding: 50px; + text-align: center; + font-size: 50px; + background-image: radial-gradient( + circle, + rgba(63, 94, 251, 1) 0%, + rgba(252, 70, 107, 1) 100% + ); +} +``` + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +However, you didn't _have to_ do that. As with regular functions, ultimately you decide where to draw the boundaries between different parts of your code. You could also take a very different approach. Instead of keeping the logic in the Effect, you could move most of the imperative logic inside a JavaScript [class:](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) + +```js +import { useState, useEffect, useRef } from "react"; +import { useFadeIn } from "./useFadeIn.js"; + +function Welcome() { + const ref = useRef(null); + + useFadeIn(ref, 1000); + + return ( + <h1 className="welcome" ref={ref}> + Welcome + </h1> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button on_click={() => setShow(!show)}> + {show ? "Remove" : "Show"} + </button> + <hr /> + {show && <Welcome />} + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; +import { FadeInAnimation } from "./animation.js"; + +export function useFadeIn(ref, duration) { + useEffect(() => { + const animation = new FadeInAnimation(ref.current); + animation.start(duration); + return () => { + animation.stop(); + }; + }, [ref, duration]); +} +``` + +```js +export class FadeInAnimation { + constructor(node) { + this.node = node; + } + start(duration) { + this.duration = duration; + this.onProgress(0); + this.startTime = performance.now(); + this.frameId = requestAnimationFrame(() => this.onFrame()); + } + onFrame() { + const timePassed = performance.now() - this.startTime; + const progress = Math.min(timePassed / this.duration, 1); + this.onProgress(progress); + if (progress === 1) { + this.stop(); + } else { + // We still have more frames to paint + this.frameId = requestAnimationFrame(() => this.onFrame()); + } + } + onProgress(progress) { + this.node.style.opacity = progress; + } + stop() { + cancelAnimationFrame(this.frameId); + this.startTime = null; + this.frameId = null; + this.duration = 0; + } +} +``` + +```css +label, +button { + display: block; + margin-bottom: 20px; +} +html, +body { + min-height: 300px; +} +.welcome { + opacity: 0; + color: white; + padding: 50px; + text-align: center; + font-size: 50px; + background-image: radial-gradient( + circle, + rgba(63, 94, 251, 1) 0%, + rgba(252, 70, 107, 1) 100% + ); +} +``` + +Effects let you connect React to external systems. The more coordination between Effects is needed (for example, to chain multiple animations), the more it makes sense to extract that logic out of Effects and Hooks _completely_ like in the sandbox above. Then, the code you extracted _becomes_ the "external system". This lets your Effects stay simple because they only need to send messages to the system you've moved outside React. + +The examples above assume that the fade-in logic needs to be written in JavaScript. However, this particular fade-in animation is both simpler and much more efficient to implement with a plain [CSS Animation:](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Animations/Using_CSS_animations) + +```js +import { useState, useEffect, useRef } from "react"; +import "./welcome.css"; + +function Welcome() { + return <h1 className="welcome">Welcome</h1>; +} + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button on_click={() => setShow(!show)}> + {show ? "Remove" : "Show"} + </button> + <hr /> + {show && <Welcome />} + </> + ); +} +``` + +```css +label, +button { + display: block; + margin-bottom: 20px; +} +html, +body { + min-height: 300px; +} +``` + +```css +.welcome { + color: white; + padding: 50px; + text-align: center; + font-size: 50px; + background-image: radial-gradient( + circle, + rgba(63, 94, 251, 1) 0%, + rgba(252, 70, 107, 1) 100% + ); + + animation: fadeIn 1000ms; +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +``` + +Sometimes, you don't even need a Hook! + +<Recap> + +- Custom Hooks let you share logic between components. +- Custom Hooks must be named starting with `use` followed by a capital letter. +- Custom Hooks only share stateful logic, not state itself. +- You can pass reactive values from one Hook to another, and they stay up-to-date. +- All Hooks re-run every time your component re-renders. +- The code of your custom Hooks should be pure, like your component's code. +- Wrap event handlers received by custom Hooks into Effect Events. +- Don't create custom Hooks like `useMount`. Keep their purpose specific. +- It's up to you how and where to choose the boundaries of your code. + +</Recap> + +<Challenges> + +#### Extract a `useCounter` Hook + +This component uses a state variable and an Effect to display a number that increments every second. Extract this logic into a custom Hook called `useCounter`. Your goal is to make the `Counter` component implementation look exactly like this: + +```js +export default function Counter() { + const count = useCounter(); + return <h1>Seconds passed: {count}</h1>; +} +``` + +You'll need to write your custom Hook in `useCounter.js` and import it into the `Counter.js` file. + +```js +import { useState, useEffect } from "react"; + +export default function Counter() { + const [count, setCount] = useState(0); + useEffect(() => { + const id = setInterval(() => { + setCount((c) => c + 1); + }, 1000); + return () => clearInterval(id); + }, []); + return <h1>Seconds passed: {count}</h1>; +} +``` + +```js +// Write your custom Hook in this file! +``` + +<Solution> + +Your code should look like this: + +```js +import { useCounter } from "./useCounter.js"; + +export default function Counter() { + const count = useCounter(); + return <h1>Seconds passed: {count}</h1>; +} +``` + +```js +import { useState, useEffect } from "react"; + +export function useCounter() { + const [count, setCount] = useState(0); + useEffect(() => { + const id = setInterval(() => { + setCount((c) => c + 1); + }, 1000); + return () => clearInterval(id); + }, []); + return count; +} +``` + +Notice that `App.js` doesn't need to import `useState` or `useEffect` anymore. + +</Solution> + +#### Make the counter delay configurable + +In this example, there is a `delay` state variable controlled by a slider, but its value is not used. Pass the `delay` value to your custom `useCounter` Hook, and change the `useCounter` Hook to use the passed `delay` instead of hardcoding `1000` ms. + +```js +import { useState } from "react"; +import { useCounter } from "./useCounter.js"; + +export default function Counter() { + const [delay, setDelay] = useState(1000); + const count = useCounter(); + return ( + <> + <label> + Tick duration: {delay} ms + <br /> + <input + type="range" + value={delay} + min="10" + max="2000" + onChange={(e) => setDelay(Number(e.target.value))} + /> + </label> + <hr /> + <h1>Ticks: {count}</h1> + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export function useCounter() { + const [count, setCount] = useState(0); + useEffect(() => { + const id = setInterval(() => { + setCount((c) => c + 1); + }, 1000); + return () => clearInterval(id); + }, []); + return count; +} +``` + +<Solution> + +Pass the `delay` to your Hook with `useCounter(delay)`. Then, inside the Hook, use `delay` instead of the hardcoded `1000` value. You'll need to add `delay` to your Effect's dependencies. This ensures that a change in `delay` will reset the interval. + +```js +import { useState } from "react"; +import { useCounter } from "./useCounter.js"; + +export default function Counter() { + const [delay, setDelay] = useState(1000); + const count = useCounter(delay); + return ( + <> + <label> + Tick duration: {delay} ms + <br /> + <input + type="range" + value={delay} + min="10" + max="2000" + onChange={(e) => setDelay(Number(e.target.value))} + /> + </label> + <hr /> + <h1>Ticks: {count}</h1> + </> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export function useCounter(delay) { + const [count, setCount] = useState(0); + useEffect(() => { + const id = setInterval(() => { + setCount((c) => c + 1); + }, delay); + return () => clearInterval(id); + }, [delay]); + return count; +} +``` + +</Solution> + +#### Extract `useInterval` out of `useCounter` + +Currently, your `useCounter` Hook does two things. It sets up an interval, and it also increments a state variable on every interval tick. Split out the logic that sets up the interval into a separate Hook called `useInterval`. It should take two arguments: the `onTick` callback, and the `delay`. After this change, your `useCounter` implementation should look like this: + +```js +export function useCounter(delay) { + const [count, setCount] = useState(0); + useInterval(() => { + setCount((c) => c + 1); + }, delay); + return count; +} +``` + +Write `useInterval` in the `useInterval.js` file and import it into the `useCounter.js` file. + +```js +import { useState } from "react"; +import { useCounter } from "./useCounter.js"; + +export default function Counter() { + const count = useCounter(1000); + return <h1>Seconds passed: {count}</h1>; +} +``` + +```js +import { useState, useEffect } from "react"; + +export function useCounter(delay) { + const [count, setCount] = useState(0); + useEffect(() => { + const id = setInterval(() => { + setCount((c) => c + 1); + }, delay); + return () => clearInterval(id); + }, [delay]); + return count; +} +``` + +```js +// Write your Hook here! +``` + +<Solution> + +The logic inside `useInterval` should set up and clear the interval. It doesn't need to do anything else. + +```js +import { useCounter } from "./useCounter.js"; + +export default function Counter() { + const count = useCounter(1000); + return <h1>Seconds passed: {count}</h1>; +} +``` + +```js +import { useState } from "react"; +import { useInterval } from "./useInterval.js"; + +export function useCounter(delay) { + const [count, setCount] = useState(0); + useInterval(() => { + setCount((c) => c + 1); + }, delay); + return count; +} +``` + +```js +import { useEffect } from "react"; + +export function useInterval(onTick, delay) { + useEffect(() => { + const id = setInterval(onTick, delay); + return () => clearInterval(id); + }, [onTick, delay]); +} +``` + +Note that there is a bit of a problem with this solution, which you'll solve in the next challenge. + +</Solution> + +#### Fix a resetting interval + +In this example, there are _two_ separate intervals. + +The `App` component calls `useCounter`, which calls `useInterval` to update the counter every second. But the `App` component _also_ calls `useInterval` to randomly update the page background color every two seconds. + +For some reason, the callback that updates the page background never runs. Add some logs inside `useInterval`: + +```js +useEffect(() => { + console.log("✅ Setting up an interval with delay ", delay); + const id = setInterval(onTick, delay); + return () => { + console.log("❌ Clearing an interval with delay ", delay); + clearInterval(id); + }; +}, [onTick, delay]); +``` + +Do the logs match what you expect to happen? If some of your Effects seem to re-synchronize unnecessarily, can you guess which dependency is causing that to happen? Is there some way to [remove that dependency](/learn/removing-effect-dependencies) from your Effect? + +After you fix the issue, you should expect the page background to update every two seconds. + +<Hint> + +It looks like your `useInterval` Hook accepts an event listener as an argument. Can you think of some way to wrap that event listener so that it doesn't need to be a dependency of your Effect? + +</Hint> + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useCounter } from "./useCounter.js"; +import { useInterval } from "./useInterval.js"; + +export default function Counter() { + const count = useCounter(1000); + + useInterval(() => { + const randomColor = `hsla(${Math.random() * 360}, 100%, 50%, 0.2)`; + document.body.style.backgroundColor = randomColor; + }, 2000); + + return <h1>Seconds passed: {count}</h1>; +} +``` + +```js +import { useState } from "react"; +import { useInterval } from "./useInterval.js"; + +export function useCounter(delay) { + const [count, setCount] = useState(0); + useInterval(() => { + setCount((c) => c + 1); + }, delay); + return count; +} +``` + +```js +import { useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; + +export function useInterval(onTick, delay) { + useEffect(() => { + const id = setInterval(onTick, delay); + return () => { + clearInterval(id); + }; + }, [onTick, delay]); +} +``` + +<Solution> + +Inside `useInterval`, wrap the tick callback into an Effect Event, as you did [earlier on this page.](/learn/reusing-logic-with-custom-hooks#passing-event-handlers-to-custom-hooks) + +This will allow you to omit `onTick` from dependencies of your Effect. The Effect won't re-synchronize on every re-render of the component, so the page background color change interval won't get reset every second before it has a chance to fire. + +With this change, both intervals work as expected and don't interfere with each other: + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useCounter } from "./useCounter.js"; +import { useInterval } from "./useInterval.js"; + +export default function Counter() { + const count = useCounter(1000); + + useInterval(() => { + const randomColor = `hsla(${Math.random() * 360}, 100%, 50%, 0.2)`; + document.body.style.backgroundColor = randomColor; + }, 2000); + + return <h1>Seconds passed: {count}</h1>; +} +``` + +```js +import { useState } from "react"; +import { useInterval } from "./useInterval.js"; + +export function useCounter(delay) { + const [count, setCount] = useState(0); + useInterval(() => { + setCount((c) => c + 1); + }, delay); + return count; +} +``` + +```js +import { useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; + +export function useInterval(callback, delay) { + const onTick = useEffectEvent(callback); + useEffect(() => { + const id = setInterval(onTick, delay); + return () => clearInterval(id); + }, [delay]); +} +``` + +</Solution> + +#### Implement a staggering movement + +In this example, the `usePointerPosition()` Hook tracks the current pointer position. Try moving your cursor or your finger over the preview area and see the red dot follow your movement. Its position is saved in the `pos1` variable. + +In fact, there are five (!) different red dots being rendered. You don't see them because currently they all appear at the same position. This is what you need to fix. What you want to implement instead is a "staggered" movement: each dot should "follow" the previous dot's path. For example, if you quickly move your cursor, the first dot should follow it immediately, the second dot should follow the first dot with a small delay, the third dot should follow the second dot, and so on. + +You need to implement the `useDelayedValue` custom Hook. Its current implementation returns the `value` provided to it. Instead, you want to return the value back from `delay` milliseconds ago. You might need some state and an Effect to do this. + +After you implement `useDelayedValue`, you should see the dots move following one another. + +<Hint> + +You'll need to store the `delayedValue` as a state variable inside your custom Hook. When the `value` changes, you'll want to run an Effect. This Effect should update `delayedValue` after the `delay`. You might find it helpful to call `setTimeout`. + +Does this Effect need cleanup? Why or why not? + +</Hint> + +```js +import { usePointerPosition } from "./usePointerPosition.js"; + +function useDelayedValue(value, delay) { + // TODO: Implement this Hook + return value; +} + +export default function Canvas() { + const pos1 = usePointerPosition(); + const pos2 = useDelayedValue(pos1, 100); + const pos3 = useDelayedValue(pos2, 200); + const pos4 = useDelayedValue(pos3, 100); + const pos5 = useDelayedValue(pos3, 50); + return ( + <> + <Dot position={pos1} opacity={1} /> + <Dot position={pos2} opacity={0.8} /> + <Dot position={pos3} opacity={0.6} /> + <Dot position={pos4} opacity={0.4} /> + <Dot position={pos5} opacity={0.2} /> + </> + ); +} + +function Dot({ position, opacity }) { + return ( + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export function usePointerPosition() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + useEffect(() => { + function handleMove(e) { + setPosition({ x: e.clientX, y: e.clientY }); + } + window.addEventListener("pointermove", handleMove); + return () => window.removeEventListener("pointermove", handleMove); + }, []); + return position; +} +``` + +```css +body { + min-height: 300px; +} +``` + +<Solution> + +Here is a working version. You keep the `delayedValue` as a state variable. When `value` updates, your Effect schedules a timeout to update the `delayedValue`. This is why the `delayedValue` always "lags behind" the actual `value`. + +```js +import { useState, useEffect } from "react"; +import { usePointerPosition } from "./usePointerPosition.js"; + +function useDelayedValue(value, delay) { + const [delayedValue, setDelayedValue] = useState(value); + + useEffect(() => { + setTimeout(() => { + setDelayedValue(value); + }, delay); + }, [value, delay]); + + return delayedValue; +} + +export default function Canvas() { + const pos1 = usePointerPosition(); + const pos2 = useDelayedValue(pos1, 100); + const pos3 = useDelayedValue(pos2, 200); + const pos4 = useDelayedValue(pos3, 100); + const pos5 = useDelayedValue(pos3, 50); + return ( + <> + <Dot position={pos1} opacity={1} /> + <Dot position={pos2} opacity={0.8} /> + <Dot position={pos3} opacity={0.6} /> + <Dot position={pos4} opacity={0.4} /> + <Dot position={pos5} opacity={0.2} /> + </> + ); +} + +function Dot({ position, opacity }) { + return ( + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export function usePointerPosition() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + useEffect(() => { + function handleMove(e) { + setPosition({ x: e.clientX, y: e.clientY }); + } + window.addEventListener("pointermove", handleMove); + return () => window.removeEventListener("pointermove", handleMove); + }, []); + return position; +} +``` + +```css +body { + min-height: 300px; +} +``` + +Note that this Effect _does not_ need cleanup. If you called `clearTimeout` in the cleanup function, then each time the `value` changes, it would reset the already scheduled timeout. To keep the movement continuous, you want all the timeouts to fire. + +</Solution> + +</Challenges> diff --git a/docs/src/learn/scaling-up-with-reducer-and-context.md b/docs/src/learn/scaling-up-with-reducer-and-context.md new file mode 100644 index 000000000..755a27e29 --- /dev/null +++ b/docs/src/learn/scaling-up-with-reducer-and-context.md @@ -0,0 +1,1373 @@ +--- +title: Scaling Up with Reducer and Context 🚧 +--- + +## Overview + +<p class="intro" markdown> + +Reducers let you consolidate a component's state update logic. Context lets you pass information deep down to other components. You can combine reducers and context together to manage state of a complex screen. + +</p> + +!!! summary "You Will Learn" + + - How to combine a reducer with context + - How to avoid passing state and dispatch through props + - How to keep context and state logic in a separate file + +## Combining a reducer with context + +In this example from [the introduction to reducers](/learn/extracting-state-logic-into-a-reducer), the state is managed by a reducer. The reducer function contains all of the state update logic and is declared at the bottom of this file: + +```js +import { useReducer } from "react"; +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; + +export default function TaskApp() { + const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); + + function handleAddTask(text) { + dispatch({ + type: "added", + id: nextId++, + text: text, + }); + } + + function handleChangeTask(task) { + dispatch({ + type: "changed", + task: task, + }); + } + + function handleDeleteTask(taskId) { + dispatch({ + type: "deleted", + id: taskId, + }); + } + + return ( + <> + <h1>Day off in Kyoto</h1> + <AddTask onAddTask={handleAddTask} /> + <TaskList + tasks={tasks} + onChangeTask={handleChangeTask} + onDeleteTask={handleDeleteTask} + /> + </> + ); +} + +function tasksReducer(tasks, action) { + switch (action.type) { + case "added": { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } + case "changed": { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } + case "deleted": { + return tasks.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} + +let nextId = 3; +const initialTasks = [ + { id: 0, text: "Philosopher’s Path", done: true }, + { id: 1, text: "Visit the temple", done: false }, + { id: 2, text: "Drink matcha", done: false }, +]; +``` + +```js +import { useState } from "react"; + +export default function AddTask({ onAddTask }) { + const [text, setText] = useState(""); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + on_click={() => { + setText(""); + onAddTask(text); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ tasks, onChangeTask, onDeleteTask }) { + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task + task={task} + onChange={onChangeTask} + onDelete={onDeleteTask} + /> + </li> + ))} + </ul> + ); +} + +function Task({ task, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + onChange({ + ...task, + text: e.target.value, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + onChange({ + ...task, + done: e.target.checked, + }); + }} + /> + {taskContent} + <button on_click={() => onDelete(task.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +A reducer helps keep the event handlers short and concise. However, as your app grows, you might run into another difficulty. **Currently, the `tasks` state and the `dispatch` function are only available in the top-level `TaskApp` component.** To let other components read the list of tasks or change it, you have to explicitly [pass down](/learn/passing-props-to-a-component) the current state and the event handlers that change it as props. + +For example, `TaskApp` passes a list of tasks and the event handlers to `TaskList`: + +```js +<TaskList + tasks={tasks} + onChangeTask={handleChangeTask} + onDeleteTask={handleDeleteTask} +/> +``` + +And `TaskList` passes the event handlers to `Task`: + +```js +<Task task={task} onChange={onChangeTask} onDelete={onDeleteTask} /> +``` + +In a small example like this, this works well, but if you have tens or hundreds of components in the middle, passing down all state and functions can be quite frustrating! + +This is why, as an alternative to passing them through props, you might want to put both the `tasks` state and the `dispatch` function [into context.](/learn/passing-data-deeply-with-context) **This way, any component below `TaskApp` in the tree can read the tasks and dispatch actions without the repetitive "prop drilling".** + +Here is how you can combine a reducer with context: + +1. **Create** the context. +2. **Put** state and dispatch into context. +3. **Use** context anywhere in the tree. + +### Step 1: Create the context + +The `useReducer` Hook returns the current `tasks` and the `dispatch` function that lets you update them: + +```js +const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); +``` + +To pass them down the tree, you will [create](/learn/passing-data-deeply-with-context#step-2-use-the-context) two separate contexts: + +- `TasksContext` provides the current list of tasks. +- `TasksDispatchContext` provides the function that lets components dispatch actions. + +Export them from a separate file so that you can later import them from other files: + +```js +import { useReducer } from "react"; +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; + +export default function TaskApp() { + const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); + + function handleAddTask(text) { + dispatch({ + type: "added", + id: nextId++, + text: text, + }); + } + + function handleChangeTask(task) { + dispatch({ + type: "changed", + task: task, + }); + } + + function handleDeleteTask(taskId) { + dispatch({ + type: "deleted", + id: taskId, + }); + } + + return ( + <> + <h1>Day off in Kyoto</h1> + <AddTask onAddTask={handleAddTask} /> + <TaskList + tasks={tasks} + onChangeTask={handleChangeTask} + onDeleteTask={handleDeleteTask} + /> + </> + ); +} + +function tasksReducer(tasks, action) { + switch (action.type) { + case "added": { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } + case "changed": { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } + case "deleted": { + return tasks.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} + +let nextId = 3; +const initialTasks = [ + { id: 0, text: "Philosopher’s Path", done: true }, + { id: 1, text: "Visit the temple", done: false }, + { id: 2, text: "Drink matcha", done: false }, +]; +``` + +```js +import { createContext } from "react"; + +export const TasksContext = createContext(null); +export const TasksDispatchContext = createContext(null); +``` + +```js +import { useState } from "react"; + +export default function AddTask({ onAddTask }) { + const [text, setText] = useState(""); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + on_click={() => { + setText(""); + onAddTask(text); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ tasks, onChangeTask, onDeleteTask }) { + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task + task={task} + onChange={onChangeTask} + onDelete={onDeleteTask} + /> + </li> + ))} + </ul> + ); +} + +function Task({ task, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + onChange({ + ...task, + text: e.target.value, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + onChange({ + ...task, + done: e.target.checked, + }); + }} + /> + {taskContent} + <button on_click={() => onDelete(task.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +Here, you're passing `null` as the default value to both contexts. The actual values will be provided by the `TaskApp` component. + +### Step 2: Put state and dispatch into context + +Now you can import both contexts in your `TaskApp` component. Take the `tasks` and `dispatch` returned by `useReducer()` and [provide them](/learn/passing-data-deeply-with-context#step-3-provide-the-context) to the entire tree below: + +```js +import { TasksContext, TasksDispatchContext } from "./TasksContext.js"; + +export default function TaskApp() { + const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); + // ... + return ( + <TasksContext.Provider value={tasks}> + <TasksDispatchContext.Provider value={dispatch}> + ... + </TasksDispatchContext.Provider> + </TasksContext.Provider> + ); +} +``` + +For now, you pass the information both via props and in context: + +```js +import { useReducer } from "react"; +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; +import { TasksContext, TasksDispatchContext } from "./TasksContext.js"; + +export default function TaskApp() { + const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); + + function handleAddTask(text) { + dispatch({ + type: "added", + id: nextId++, + text: text, + }); + } + + function handleChangeTask(task) { + dispatch({ + type: "changed", + task: task, + }); + } + + function handleDeleteTask(taskId) { + dispatch({ + type: "deleted", + id: taskId, + }); + } + + return ( + <TasksContext.Provider value={tasks}> + <TasksDispatchContext.Provider value={dispatch}> + <h1>Day off in Kyoto</h1> + <AddTask onAddTask={handleAddTask} /> + <TaskList + tasks={tasks} + onChangeTask={handleChangeTask} + onDeleteTask={handleDeleteTask} + /> + </TasksDispatchContext.Provider> + </TasksContext.Provider> + ); +} + +function tasksReducer(tasks, action) { + switch (action.type) { + case "added": { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } + case "changed": { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } + case "deleted": { + return tasks.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} + +let nextId = 3; +const initialTasks = [ + { id: 0, text: "Philosopher’s Path", done: true }, + { id: 1, text: "Visit the temple", done: false }, + { id: 2, text: "Drink matcha", done: false }, +]; +``` + +```js +import { createContext } from "react"; + +export const TasksContext = createContext(null); +export const TasksDispatchContext = createContext(null); +``` + +```js +import { useState } from "react"; + +export default function AddTask({ onAddTask }) { + const [text, setText] = useState(""); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + on_click={() => { + setText(""); + onAddTask(text); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ tasks, onChangeTask, onDeleteTask }) { + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task + task={task} + onChange={onChangeTask} + onDelete={onDeleteTask} + /> + </li> + ))} + </ul> + ); +} + +function Task({ task, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + onChange({ + ...task, + text: e.target.value, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + onChange({ + ...task, + done: e.target.checked, + }); + }} + /> + {taskContent} + <button on_click={() => onDelete(task.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +In the next step, you will remove prop passing. + +### Step 3: Use context anywhere in the tree + +Now you don't need to pass the list of tasks or the event handlers down the tree: + +```js +<TasksContext.Provider value={tasks}> + <TasksDispatchContext.Provider value={dispatch}> + <h1>Day off in Kyoto</h1> + <AddTask /> + <TaskList /> + </TasksDispatchContext.Provider> +</TasksContext.Provider> +``` + +Instead, any component that needs the task list can read it from the `TaskContext`: + +```js +export default function TaskList() { + const tasks = useContext(TasksContext); + // ... +``` + +To update the task list, any component can read the `dispatch` function from context and call it: + +```js +export default function AddTask() { + const [text, setText] = useState(''); + const dispatch = useContext(TasksDispatchContext); + // ... + return ( + // ... + <button on_click={() => { + setText(''); + dispatch({ + type: 'added', + id: nextId++, + text: text, + }); + }}>Add</button> + // ... +``` + +**The `TaskApp` component does not pass any event handlers down, and the `TaskList` does not pass any event handlers to the `Task` component either.** Each component reads the context that it needs: + +```js +import { useReducer } from "react"; +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; +import { TasksContext, TasksDispatchContext } from "./TasksContext.js"; + +export default function TaskApp() { + const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); + + return ( + <TasksContext.Provider value={tasks}> + <TasksDispatchContext.Provider value={dispatch}> + <h1>Day off in Kyoto</h1> + <AddTask /> + <TaskList /> + </TasksDispatchContext.Provider> + </TasksContext.Provider> + ); +} + +function tasksReducer(tasks, action) { + switch (action.type) { + case "added": { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } + case "changed": { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } + case "deleted": { + return tasks.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} + +const initialTasks = [ + { id: 0, text: "Philosopher’s Path", done: true }, + { id: 1, text: "Visit the temple", done: false }, + { id: 2, text: "Drink matcha", done: false }, +]; +``` + +```js +import { createContext } from "react"; + +export const TasksContext = createContext(null); +export const TasksDispatchContext = createContext(null); +``` + +```js +import { useState, useContext } from "react"; +import { TasksDispatchContext } from "./TasksContext.js"; + +export default function AddTask() { + const [text, setText] = useState(""); + const dispatch = useContext(TasksDispatchContext); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + on_click={() => { + setText(""); + dispatch({ + type: "added", + id: nextId++, + text: text, + }); + }} + > + Add + </button> + </> + ); +} + +let nextId = 3; +``` + +```js +import { useState, useContext } from "react"; +import { TasksContext, TasksDispatchContext } from "./TasksContext.js"; + +export default function TaskList() { + const tasks = useContext(TasksContext); + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task task={task} /> + </li> + ))} + </ul> + ); +} + +function Task({ task }) { + const [isEditing, setIsEditing] = useState(false); + const dispatch = useContext(TasksDispatchContext); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + dispatch({ + type: "changed", + task: { + ...task, + text: e.target.value, + }, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + dispatch({ + type: "changed", + task: { + ...task, + done: e.target.checked, + }, + }); + }} + /> + {taskContent} + <button + on_click={() => { + dispatch({ + type: "deleted", + id: task.id, + }); + }} + > + Delete + </button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +**The state still "lives" in the top-level `TaskApp` component, managed with `useReducer`.** But its `tasks` and `dispatch` are now available to every component below in the tree by importing and using these contexts. + +## Moving all wiring into a single file + +You don't have to do this, but you could further declutter the components by moving both reducer and context into a single file. Currently, `TasksContext.js` contains only two context declarations: + +```js +import { createContext } from "react"; + +export const TasksContext = createContext(null); +export const TasksDispatchContext = createContext(null); +``` + +This file is about to get crowded! You'll move the reducer into that same file. Then you'll declare a new `TasksProvider` component in the same file. This component will tie all the pieces together: + +1. It will manage the state with a reducer. +2. It will provide both contexts to components below. +3. It will [take `children` as a prop](/learn/passing-props-to-a-component#passing-jsx-as-children) so you can pass JSX to it. + +```js +export function TasksProvider({ children }) { + const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); + + return ( + <TasksContext.Provider value={tasks}> + <TasksDispatchContext.Provider value={dispatch}> + {children} + </TasksDispatchContext.Provider> + </TasksContext.Provider> + ); +} +``` + +**This removes all the complexity and wiring from your `TaskApp` component:** + +```js +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; +import { TasksProvider } from "./TasksContext.js"; + +export default function TaskApp() { + return ( + <TasksProvider> + <h1>Day off in Kyoto</h1> + <AddTask /> + <TaskList /> + </TasksProvider> + ); +} +``` + +```js +import { createContext, useReducer } from "react"; + +export const TasksContext = createContext(null); +export const TasksDispatchContext = createContext(null); + +export function TasksProvider({ children }) { + const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); + + return ( + <TasksContext.Provider value={tasks}> + <TasksDispatchContext.Provider value={dispatch}> + {children} + </TasksDispatchContext.Provider> + </TasksContext.Provider> + ); +} + +function tasksReducer(tasks, action) { + switch (action.type) { + case "added": { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } + case "changed": { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } + case "deleted": { + return tasks.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} + +const initialTasks = [ + { id: 0, text: "Philosopher’s Path", done: true }, + { id: 1, text: "Visit the temple", done: false }, + { id: 2, text: "Drink matcha", done: false }, +]; +``` + +```js +import { useState, useContext } from "react"; +import { TasksDispatchContext } from "./TasksContext.js"; + +export default function AddTask() { + const [text, setText] = useState(""); + const dispatch = useContext(TasksDispatchContext); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + on_click={() => { + setText(""); + dispatch({ + type: "added", + id: nextId++, + text: text, + }); + }} + > + Add + </button> + </> + ); +} + +let nextId = 3; +``` + +```js +import { useState, useContext } from "react"; +import { TasksContext, TasksDispatchContext } from "./TasksContext.js"; + +export default function TaskList() { + const tasks = useContext(TasksContext); + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task task={task} /> + </li> + ))} + </ul> + ); +} + +function Task({ task }) { + const [isEditing, setIsEditing] = useState(false); + const dispatch = useContext(TasksDispatchContext); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + dispatch({ + type: "changed", + task: { + ...task, + text: e.target.value, + }, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + dispatch({ + type: "changed", + task: { + ...task, + done: e.target.checked, + }, + }); + }} + /> + {taskContent} + <button + on_click={() => { + dispatch({ + type: "deleted", + id: task.id, + }); + }} + > + Delete + </button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +You can also export functions that _use_ the context from `TasksContext.js`: + +```js +export function useTasks() { + return useContext(TasksContext); +} + +export function useTasksDispatch() { + return useContext(TasksDispatchContext); +} +``` + +When a component needs to read context, it can do it through these functions: + +```js +const tasks = useTasks(); +const dispatch = useTasksDispatch(); +``` + +This doesn't change the behavior in any way, but it lets you later split these contexts further or add some logic to these functions. **Now all of the context and reducer wiring is in `TasksContext.js`. This keeps the components clean and uncluttered, focused on what they display rather than where they get the data:** + +```js +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; +import { TasksProvider } from "./TasksContext.js"; + +export default function TaskApp() { + return ( + <TasksProvider> + <h1>Day off in Kyoto</h1> + <AddTask /> + <TaskList /> + </TasksProvider> + ); +} +``` + +```js +import { createContext, useContext, useReducer } from "react"; + +const TasksContext = createContext(null); + +const TasksDispatchContext = createContext(null); + +export function TasksProvider({ children }) { + const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); + + return ( + <TasksContext.Provider value={tasks}> + <TasksDispatchContext.Provider value={dispatch}> + {children} + </TasksDispatchContext.Provider> + </TasksContext.Provider> + ); +} + +export function useTasks() { + return useContext(TasksContext); +} + +export function useTasksDispatch() { + return useContext(TasksDispatchContext); +} + +function tasksReducer(tasks, action) { + switch (action.type) { + case "added": { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } + case "changed": { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } + case "deleted": { + return tasks.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} + +const initialTasks = [ + { id: 0, text: "Philosopher’s Path", done: true }, + { id: 1, text: "Visit the temple", done: false }, + { id: 2, text: "Drink matcha", done: false }, +]; +``` + +```js +import { useState } from "react"; +import { useTasksDispatch } from "./TasksContext.js"; + +export default function AddTask() { + const [text, setText] = useState(""); + const dispatch = useTasksDispatch(); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + on_click={() => { + setText(""); + dispatch({ + type: "added", + id: nextId++, + text: text, + }); + }} + > + Add + </button> + </> + ); +} + +let nextId = 3; +``` + +```js +import { useState } from "react"; +import { useTasks, useTasksDispatch } from "./TasksContext.js"; + +export default function TaskList() { + const tasks = useTasks(); + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task task={task} /> + </li> + ))} + </ul> + ); +} + +function Task({ task }) { + const [isEditing, setIsEditing] = useState(false); + const dispatch = useTasksDispatch(); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + dispatch({ + type: "changed", + task: { + ...task, + text: e.target.value, + }, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + dispatch({ + type: "changed", + task: { + ...task, + done: e.target.checked, + }, + }); + }} + /> + {taskContent} + <button + on_click={() => { + dispatch({ + type: "deleted", + id: task.id, + }); + }} + > + Delete + </button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +You can think of `TasksProvider` as a part of the screen that knows how to deal with tasks, `useTasks` as a way to read them, and `useTasksDispatch` as a way to update them from any component below in the tree. + +<Note> + +Functions like `useTasks` and `useTasksDispatch` are called _[Custom Hooks.](/learn/reusing-logic-with-custom-hooks)_ Your function is considered a custom Hook if its name starts with `use`. This lets you use other Hooks, like `useContext`, inside it. + +</Note> + +As your app grows, you may have many context-reducer pairs like this. This is a powerful way to scale your app and [lift state up](/learn/sharing-state-between-components) without too much work whenever you want to access the data deep in the tree. + +<Recap> + +- You can combine reducer with context to let any component read and update state above it. +- To provide state and the dispatch function to components below: + 1. Create two contexts (for state and for dispatch functions). + 2. Provide both contexts from the component that uses the reducer. + 3. Use either context from components that need to read them. +- You can further declutter the components by moving all wiring into one file. + - You can export a component like `TasksProvider` that provides context. + - You can also export custom Hooks like `useTasks` and `useTasksDispatch` to read it. +- You can have many context-reducer pairs like this in your app. + +</Recap> diff --git a/docs/src/learn/separating-events-from-effects.md b/docs/src/learn/separating-events-from-effects.md new file mode 100644 index 000000000..aaeb9c30a --- /dev/null +++ b/docs/src/learn/separating-events-from-effects.md @@ -0,0 +1,1888 @@ +--- +title: "Separating Events from Effects 🚧" +--- + +## Overview + +<p class="intro" markdown> + +Event handlers only re-run when you perform the same interaction again. Unlike event handlers, Effects re-synchronize if some value they read, like a prop or a state variable, is different from what it was during the last render. Sometimes, you also want a mix of both behaviors: an Effect that re-runs in response to some values but not others. This page will teach you how to do that. + +</p> + +!!! summary "You Will Learn" + + - How to choose between an event handler and an Effect + - Why Effects are reactive, and event handlers are not + - What to do when you want a part of your Effect's code to not be reactive + - What Effect Events are, and how to extract them from your Effects + - How to read the latest props and state from Effects using Effect Events + +## Choosing between event handlers and Effects + +First, let's recap the difference between event handlers and Effects. + +Imagine you're implementing a chat room component. Your requirements look like this: + +1. Your component should automatically connect to the selected chat room. +1. When you click the "Send" button, it should send a message to the chat. + +Let's say you've already implemented the code for them, but you're not sure where to put it. Should you use event handlers or Effects? Every time you need to answer this question, consider [_why_ the code needs to run.](/learn/synchronizing-with-effects#what-are-effects-and-how-are-they-different-from-events) + +### Event handlers run in response to specific interactions + +From the user's perspective, sending a message should happen _because_ the particular "Send" button was clicked. The user will get rather upset if you send their message at any other time or for any other reason. This is why sending a message should be an event handler. Event handlers let you handle specific interactions: + +```js +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(""); + // ... + function handleSendClick() { + sendMessage(message); + } + // ... + return ( + <> + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + <button on_click={handleSendClick}>Send</button>; + </> + ); +} +``` + +With an event handler, you can be sure that `sendMessage(message)` will _only_ run if the user presses the button. + +### Effects run whenever synchronization is needed + +Recall that you also need to keep the component connected to the chat room. Where does that code go? + +The _reason_ to run this code is not some particular interaction. It doesn't matter why or how the user navigated to the chat room screen. Now that they're looking at it and could interact with it, the component needs to stay connected to the selected chat server. Even if the chat room component was the initial screen of your app, and the user has not performed any interactions at all, you would _still_ need to connect. This is why it's an Effect: + +```js +function ChatRoom({ roomId }) { + // ... + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [roomId]); + // ... +} +``` + +With this code, you can be sure that there is always an active connection to the currently selected chat server, _regardless_ of the specific interactions performed by the user. Whether the user has only opened your app, selected a different room, or navigated to another screen and back, your Effect ensures that the component will _remain synchronized_ with the currently selected room, and will [re-connect whenever it's necessary.](/learn/lifecycle-of-reactive-effects#why-synchronization-may-need-to-happen-more-than-once) + +```js +import { useState, useEffect } from "react"; +import { createConnection, sendMessage } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(""); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + + function handleSendClick() { + sendMessage(message); + } + + return ( + <> + <h1>Welcome to the {roomId} room!</h1> + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + <button on_click={handleSendClick}>Send</button> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [show, setShow] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <button on_click={() => setShow(!show)}> + {show ? "Close chat" : "Open chat"} + </button> + {show && <hr />} + {show && <ChatRoom roomId={roomId} />} + </> + ); +} +``` + +```js +export function sendMessage(message) { + console.log("🔵 You sent: " + message); +} + +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input, +select { + margin-right: 20px; +} +``` + +## Reactive values and reactive logic + +Intuitively, you could say that event handlers are always triggered "manually", for example by clicking a button. Effects, on the other hand, are "automatic": they run and re-run as often as it's needed to stay synchronized. + +There is a more precise way to think about this. + +Props, state, and variables declared inside your component's body are called <CodeStep step={2}>reactive values</CodeStep>. In this example, `serverUrl` is not a reactive value, but `roomId` and `message` are. They participate in the rendering data flow: + +```js +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(""); + + // ... +} +``` + +Reactive values like these can change due to a re-render. For example, the user may edit the `message` or choose a different `roomId` in a dropdown. Event handlers and Effects respond to changes differently: + +- **Logic inside event handlers is _not reactive._** It will not run again unless the user performs the same interaction (e.g. a click) again. Event handlers can read reactive values without "reacting" to their changes. +- **Logic inside Effects is _reactive._** If your Effect reads a reactive value, [you have to specify it as a dependency.](/learn/lifecycle-of-reactive-effects#effects-react-to-reactive-values) Then, if a re-render causes that value to change, React will re-run your Effect's logic with the new value. + +Let's revisit the previous example to illustrate this difference. + +### Logic inside event handlers is not reactive + +Take a look at this line of code. Should this logic be reactive or not? + +```js +// ... +sendMessage(message); +// ... +``` + +From the user's perspective, **a change to the `message` does _not_ mean that they want to send a message.** It only means that the user is typing. In other words, the logic that sends a message should not be reactive. It should not run again only because the <CodeStep step={2}>reactive value</CodeStep> has changed. That's why it belongs in the event handler: + +```js +function handleSendClick() { + sendMessage(message); +} +``` + +Event handlers aren't reactive, so `sendMessage(message)` will only run when the user clicks the Send button. + +### Logic inside Effects is reactive + +Now let's return to these lines: + +```js +// ... +const connection = createConnection(serverUrl, roomId); +connection.connect(); +// ... +``` + +From the user's perspective, **a change to the `roomId` _does_ mean that they want to connect to a different room.** In other words, the logic for connecting to the room should be reactive. You _want_ these lines of code to "keep up" with the <CodeStep step={2}>reactive value</CodeStep>, and to run again if that value is different. That's why it belongs in an Effect: + +```js +useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; +}, [roomId]); +``` + +Effects are reactive, so `createConnection(serverUrl, roomId)` and `connection.connect()` will run for every distinct value of `roomId`. Your Effect keeps the chat connection synchronized to the currently selected room. + +## Extracting non-reactive logic out of Effects + +Things get more tricky when you want to mix reactive logic with non-reactive logic. + +For example, imagine that you want to show a notification when the user connects to the chat. You read the current theme (dark or light) from the props so that you can show the notification in the correct color: + +```js +function ChatRoom({ roomId, theme }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.on('connected', () => { + showNotification('Connected!', theme); + }); + connection.connect(); + // ... +``` + +However, `theme` is a reactive value (it can change as a result of re-rendering), and [every reactive value read by an Effect must be declared as its dependency.](/learn/lifecycle-of-reactive-effects#react-verifies-that-you-specified-every-reactive-value-as-a-dependency) Now you have to specify `theme` as a dependency of your Effect: + +```js +function ChatRoom({ roomId, theme }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.on('connected', () => { + showNotification('Connected!', theme); + }); + connection.connect(); + return () => { + connection.disconnect() + }; + }, [roomId, theme]); // ✅ All dependencies declared + // ... +``` + +Play with this example and see if you can spot the problem with this user experience: + +```json +{ + "dependencies": { + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "toastify-js": "1.12.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState, useEffect } from "react"; +import { createConnection, sendMessage } from "./chat.js"; +import { showNotification } from "./notifications.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId, theme }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.on("connected", () => { + showNotification("Connected!", theme); + }); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, theme]); + + return <h1>Welcome to the {roomId} room!</h1>; +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [isDark, setIsDark] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Use dark theme + </label> + <hr /> + <ChatRoom roomId={roomId} theme={isDark ? "dark" : "light"} /> + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + let connectedCallback; + let timeout; + return { + connect() { + timeout = setTimeout(() => { + if (connectedCallback) { + connectedCallback(); + } + }, 100); + }, + on(event, callback) { + if (connectedCallback) { + throw Error("Cannot add the handler twice."); + } + if (event !== "connected") { + throw Error('Only "connected" event is supported.'); + } + connectedCallback = callback; + }, + disconnect() { + clearTimeout(timeout); + }, + }; +} +``` + +```js +import Toastify from "toastify-js"; +import "toastify-js/src/toastify.css"; + +export function showNotification(message, theme) { + Toastify({ + text: message, + duration: 2000, + gravity: "top", + position: "right", + style: { + background: theme === "dark" ? "black" : "white", + color: theme === "dark" ? "white" : "black", + }, + }).showToast(); +} +``` + +```css +label { + display: block; + margin-top: 10px; +} +``` + +When the `roomId` changes, the chat re-connects as you would expect. But since `theme` is also a dependency, the chat _also_ re-connects every time you switch between the dark and the light theme. That's not great! + +In other words, you _don't_ want this line to be reactive, even though it is inside an Effect (which is reactive): + +```js +// ... +showNotification("Connected!", theme); +// ... +``` + +You need a way to separate this non-reactive logic from the reactive Effect around it. + +### Declaring an Effect Event + +<Wip> + +This section describes an **experimental API that has not yet been released** in a stable version of React. + +</Wip> + +Use a special Hook called [`useEffectEvent`](/reference/react/experimental_useEffectEvent) to extract this non-reactive logic out of your Effect: + +```js +import { useEffect, useEffectEvent } from 'react'; + +function ChatRoom({ roomId, theme }) { + const onConnected = useEffectEvent(() => { + showNotification('Connected!', theme); + }); + // ... +``` + +Here, `onConnected` is called an _Effect Event._ It's a part of your Effect logic, but it behaves a lot more like an event handler. The logic inside it is not reactive, and it always "sees" the latest values of your props and state. + +Now you can call the `onConnected` Effect Event from inside your Effect: + +```js +function ChatRoom({ roomId, theme }) { + const onConnected = useEffectEvent(() => { + showNotification('Connected!', theme); + }); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.on('connected', () => { + onConnected(); + }); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); // ✅ All dependencies declared + // ... +``` + +This solves the problem. Note that you had to _remove_ `onConnected` from the list of your Effect's dependencies. **Effect Events are not reactive and must be omitted from dependencies.** + +Verify that the new behavior works as you would expect: + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest", + "toastify-js": "1.12.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState, useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; +import { createConnection, sendMessage } from "./chat.js"; +import { showNotification } from "./notifications.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId, theme }) { + const onConnected = useEffectEvent(() => { + showNotification("Connected!", theme); + }); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.on("connected", () => { + onConnected(); + }); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + + return <h1>Welcome to the {roomId} room!</h1>; +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [isDark, setIsDark] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Use dark theme + </label> + <hr /> + <ChatRoom roomId={roomId} theme={isDark ? "dark" : "light"} /> + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + let connectedCallback; + let timeout; + return { + connect() { + timeout = setTimeout(() => { + if (connectedCallback) { + connectedCallback(); + } + }, 100); + }, + on(event, callback) { + if (connectedCallback) { + throw Error("Cannot add the handler twice."); + } + if (event !== "connected") { + throw Error('Only "connected" event is supported.'); + } + connectedCallback = callback; + }, + disconnect() { + clearTimeout(timeout); + }, + }; +} +``` + +```js +import Toastify from "toastify-js"; +import "toastify-js/src/toastify.css"; + +export function showNotification(message, theme) { + Toastify({ + text: message, + duration: 2000, + gravity: "top", + position: "right", + style: { + background: theme === "dark" ? "black" : "white", + color: theme === "dark" ? "white" : "black", + }, + }).showToast(); +} +``` + +```css +label { + display: block; + margin-top: 10px; +} +``` + +You can think of Effect Events as being very similar to event handlers. The main difference is that event handlers run in response to a user interactions, whereas Effect Events are triggered by you from Effects. Effect Events let you "break the chain" between the reactivity of Effects and code that should not be reactive. + +### Reading latest props and state with Effect Events + +<Wip> + +This section describes an **experimental API that has not yet been released** in a stable version of React. + +</Wip> + +Effect Events let you fix many patterns where you might be tempted to suppress the dependency linter. + +For example, say you have an Effect to log the page visits: + +```js +function Page() { + useEffect(() => { + logVisit(); + }, []); + // ... +} +``` + +Later, you add multiple routes to your site. Now your `Page` component receives a `url` prop with the current path. You want to pass the `url` as a part of your `logVisit` call, but the dependency linter complains: + +```js +function Page({ url }) { + useEffect(() => { + logVisit(url); + }, []); // 🔴 React Hook useEffect has a missing dependency: 'url' + // ... +} +``` + +Think about what you want the code to do. You _want_ to log a separate visit for different URLs since each URL represents a different page. In other words, this `logVisit` call _should_ be reactive with respect to the `url`. This is why, in this case, it makes sense to follow the dependency linter, and add `url` as a dependency: + +```js +function Page({ url }) { + useEffect(() => { + logVisit(url); + }, [url]); // ✅ All dependencies declared + // ... +} +``` + +Now let's say you want to include the number of items in the shopping cart together with every page visit: + +```js +function Page({ url }) { + const { items } = useContext(ShoppingCartContext); + const numberOfItems = items.length; + + useEffect(() => { + logVisit(url, numberOfItems); + }, [url]); // 🔴 React Hook useEffect has a missing dependency: 'numberOfItems' + // ... +} +``` + +You used `numberOfItems` inside the Effect, so the linter asks you to add it as a dependency. However, you _don't_ want the `logVisit` call to be reactive with respect to `numberOfItems`. If the user puts something into the shopping cart, and the `numberOfItems` changes, this _does not mean_ that the user visited the page again. In other words, _visiting the page_ is, in some sense, an "event". It happens at a precise moment in time. + +Split the code in two parts: + +```js +function Page({ url }) { + const { items } = useContext(ShoppingCartContext); + const numberOfItems = items.length; + + const onVisit = useEffectEvent((visitedUrl) => { + logVisit(visitedUrl, numberOfItems); + }); + + useEffect(() => { + onVisit(url); + }, [url]); // ✅ All dependencies declared + // ... +} +``` + +Here, `onVisit` is an Effect Event. The code inside it isn't reactive. This is why you can use `numberOfItems` (or any other reactive value!) without worrying that it will cause the surrounding code to re-execute on changes. + +On the other hand, the Effect itself remains reactive. Code inside the Effect uses the `url` prop, so the Effect will re-run after every re-render with a different `url`. This, in turn, will call the `onVisit` Effect Event. + +As a result, you will call `logVisit` for every change to the `url`, and always read the latest `numberOfItems`. However, if `numberOfItems` changes on its own, this will not cause any of the code to re-run. + +<Note> + +You might be wondering if you could call `onVisit()` with no arguments, and read the `url` inside it: + +```js +const onVisit = useEffectEvent(() => { + logVisit(url, numberOfItems); +}); + +useEffect(() => { + onVisit(); +}, [url]); +``` + +This would work, but it's better to pass this `url` to the Effect Event explicitly. **By passing `url` as an argument to your Effect Event, you are saying that visiting a page with a different `url` constitutes a separate "event" from the user's perspective.** The `visitedUrl` is a _part_ of the "event" that happened: + +```js +const onVisit = useEffectEvent((visitedUrl) => { + logVisit(visitedUrl, numberOfItems); +}); + +useEffect(() => { + onVisit(url); +}, [url]); +``` + +Since your Effect Event explicitly "asks" for the `visitedUrl`, now you can't accidentally remove `url` from the Effect's dependencies. If you remove the `url` dependency (causing distinct page visits to be counted as one), the linter will warn you about it. You want `onVisit` to be reactive with regards to the `url`, so instead of reading the `url` inside (where it wouldn't be reactive), you pass it _from_ your Effect. + +This becomes especially important if there is some asynchronous logic inside the Effect: + +```js +const onVisit = useEffectEvent((visitedUrl) => { + logVisit(visitedUrl, numberOfItems); +}); + +useEffect(() => { + setTimeout(() => { + onVisit(url); + }, 5000); // Delay logging visits +}, [url]); +``` + +Here, `url` inside `onVisit` corresponds to the _latest_ `url` (which could have already changed), but `visitedUrl` corresponds to the `url` that originally caused this Effect (and this `onVisit` call) to run. + +</Note> + +<DeepDive> + +#### Is it okay to suppress the dependency linter instead? + +In the existing codebases, you may sometimes see the lint rule suppressed like this: + +```js +function Page({ url }) { + const { items } = useContext(ShoppingCartContext); + const numberOfItems = items.length; + + useEffect(() => { + logVisit(url, numberOfItems); + // 🔴 Avoid suppressing the linter like this: + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [url]); + // ... +} +``` + +After `useEffectEvent` becomes a stable part of React, we recommend **never suppressing the linter**. + +The first downside of suppressing the rule is that React will no longer warn you when your Effect needs to "react" to a new reactive dependency you've introduced to your code. In the earlier example, you added `url` to the dependencies _because_ React reminded you to do it. You will no longer get such reminders for any future edits to that Effect if you disable the linter. This leads to bugs. + +Here is an example of a confusing bug caused by suppressing the linter. In this example, the `handleMove` function is supposed to read the current `canMove` state variable value in order to decide whether the dot should follow the cursor. However, `canMove` is always `true` inside `handleMove`. + +Can you see why? + +```js +import { useState, useEffect } from "react"; + +export default function App() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + const [canMove, setCanMove] = useState(true); + + function handleMove(e) { + if (canMove) { + setPosition({ x: e.clientX, y: e.clientY }); + } + } + + useEffect(() => { + window.addEventListener("pointermove", handleMove); + return () => window.removeEventListener("pointermove", handleMove); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + <> + <label> + <input + type="checkbox" + checked={canMove} + onChange={(e) => setCanMove(e.target.checked)} + /> + The dot is allowed to move + </label> + <hr /> + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity: 0.6, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + </> + ); +} +``` + +```css +body { + height: 200px; +} +``` + +The problem with this code is in suppressing the dependency linter. If you remove the suppression, you'll see that this Effect should depend on the `handleMove` function. This makes sense: `handleMove` is declared inside the component body, which makes it a reactive value. Every reactive value must be specified as a dependency, or it can potentially get stale over time! + +The author of the original code has "lied" to React by saying that the Effect does not depend (`[]`) on any reactive values. This is why React did not re-synchronize the Effect after `canMove` has changed (and `handleMove` with it). Because React did not re-synchronize the Effect, the `handleMove` attached as a listener is the `handleMove` function created during the initial render. During the initial render, `canMove` was `true`, which is why `handleMove` from the initial render will forever see that value. + +**If you never suppress the linter, you will never see problems with stale values.** + +With `useEffectEvent`, there is no need to "lie" to the linter, and the code works as you would expect: + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState, useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; + +export default function App() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + const [canMove, setCanMove] = useState(true); + + const onMove = useEffectEvent((e) => { + if (canMove) { + setPosition({ x: e.clientX, y: e.clientY }); + } + }); + + useEffect(() => { + window.addEventListener("pointermove", onMove); + return () => window.removeEventListener("pointermove", onMove); + }, []); + + return ( + <> + <label> + <input + type="checkbox" + checked={canMove} + onChange={(e) => setCanMove(e.target.checked)} + /> + The dot is allowed to move + </label> + <hr /> + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity: 0.6, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + </> + ); +} +``` + +```css +body { + height: 200px; +} +``` + +This doesn't mean that `useEffectEvent` is _always_ the correct solution. You should only apply it to the lines of code that you don't want to be reactive. In the above sandbox, you didn't want the Effect's code to be reactive with regards to `canMove`. That's why it made sense to extract an Effect Event. + +Read [Removing Effect Dependencies](/learn/removing-effect-dependencies) for other correct alternatives to suppressing the linter. + +</DeepDive> + +### Limitations of Effect Events + +<Wip> + +This section describes an **experimental API that has not yet been released** in a stable version of React. + +</Wip> + +Effect Events are very limited in how you can use them: + +- **Only call them from inside Effects.** +- **Never pass them to other components or Hooks.** + +For example, don't declare and pass an Effect Event like this: + +```js +function Timer() { + const [count, setCount] = useState(0); + + const onTick = useEffectEvent(() => { + setCount(count + 1); + }); + + useTimer(onTick, 1000); // 🔴 Avoid: Passing Effect Events + + return <h1>{count}</h1>; +} + +function useTimer(callback, delay) { + useEffect(() => { + const id = setInterval(() => { + callback(); + }, delay); + return () => { + clearInterval(id); + }; + }, [delay, callback]); // Need to specify "callback" in dependencies +} +``` + +Instead, always declare Effect Events directly next to the Effects that use them: + +```js +function Timer() { + const [count, setCount] = useState(0); + useTimer(() => { + setCount(count + 1); + }, 1000); + return <h1>{count}</h1>; +} + +function useTimer(callback, delay) { + const onTick = useEffectEvent(() => { + callback(); + }); + + useEffect(() => { + const id = setInterval(() => { + onTick(); // ✅ Good: Only called locally inside an Effect + }, delay); + return () => { + clearInterval(id); + }; + }, [delay]); // No need to specify "onTick" (an Effect Event) as a dependency +} +``` + +Effect Events are non-reactive "pieces" of your Effect code. They should be next to the Effect using them. + +<Recap> + +- Event handlers run in response to specific interactions. +- Effects run whenever synchronization is needed. +- Logic inside event handlers is not reactive. +- Logic inside Effects is reactive. +- You can move non-reactive logic from Effects into Effect Events. +- Only call Effect Events from inside Effects. +- Don't pass Effect Events to other components or Hooks. + +</Recap> + +<Challenges> + +#### Fix a variable that doesn't update + +This `Timer` component keeps a `count` state variable which increases every second. The value by which it's increasing is stored in the `increment` state variable. You can control the `increment` variable with the plus and minus buttons. + +However, no matter how many times you click the plus button, the counter is still incremented by one every second. What's wrong with this code? Why is `increment` always equal to `1` inside the Effect's code? Find the mistake and fix it. + +<Hint> + +To fix this code, it's enough to follow the rules. + +</Hint> + +```js +import { useState, useEffect } from "react"; + +export default function Timer() { + const [count, setCount] = useState(0); + const [increment, setIncrement] = useState(1); + + useEffect(() => { + const id = setInterval(() => { + setCount((c) => c + increment); + }, 1000); + return () => { + clearInterval(id); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + <> + <h1> + Counter: {count} + <button on_click={() => setCount(0)}>Reset</button> + </h1> + <hr /> + <p> + Every second, increment by: + <button + disabled={increment === 0} + on_click={() => { + setIncrement((i) => i - 1); + }} + > + – + </button> + <b>{increment}</b> + <button + on_click={() => { + setIncrement((i) => i + 1); + }} + > + + + </button> + </p> + </> + ); +} +``` + +```css +button { + margin: 10px; +} +``` + +<Solution> + +As usual, when you're looking for bugs in Effects, start by searching for linter suppressions. + +If you remove the suppression comment, React will tell you that this Effect's code depends on `increment`, but you "lied" to React by claiming that this Effect does not depend on any reactive values (`[]`). Add `increment` to the dependency array: + +```js +import { useState, useEffect } from "react"; + +export default function Timer() { + const [count, setCount] = useState(0); + const [increment, setIncrement] = useState(1); + + useEffect(() => { + const id = setInterval(() => { + setCount((c) => c + increment); + }, 1000); + return () => { + clearInterval(id); + }; + }, [increment]); + + return ( + <> + <h1> + Counter: {count} + <button on_click={() => setCount(0)}>Reset</button> + </h1> + <hr /> + <p> + Every second, increment by: + <button + disabled={increment === 0} + on_click={() => { + setIncrement((i) => i - 1); + }} + > + – + </button> + <b>{increment}</b> + <button + on_click={() => { + setIncrement((i) => i + 1); + }} + > + + + </button> + </p> + </> + ); +} +``` + +```css +button { + margin: 10px; +} +``` + +Now, when `increment` changes, React will re-synchronize your Effect, which will restart the interval. + +</Solution> + +#### Fix a freezing counter + +This `Timer` component keeps a `count` state variable which increases every second. The value by which it's increasing is stored in the `increment` state variable, which you can control it with the plus and minus buttons. For example, try pressing the plus button nine times, and notice that the `count` now increases each second by ten rather than by one. + +There is a small issue with this user interface. You might notice that if you keep pressing the plus or minus buttons faster than once per second, the timer itself seems to pause. It only resumes after a second passes since the last time you've pressed either button. Find why this is happening, and fix the issue so that the timer ticks on _every_ second without interruptions. + +<Hint> + +It seems like the Effect which sets up the timer "reacts" to the `increment` value. Does the line that uses the current `increment` value in order to call `setCount` really need to be reactive? + +</Hint> + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState, useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; + +export default function Timer() { + const [count, setCount] = useState(0); + const [increment, setIncrement] = useState(1); + + useEffect(() => { + const id = setInterval(() => { + setCount((c) => c + increment); + }, 1000); + return () => { + clearInterval(id); + }; + }, [increment]); + + return ( + <> + <h1> + Counter: {count} + <button on_click={() => setCount(0)}>Reset</button> + </h1> + <hr /> + <p> + Every second, increment by: + <button + disabled={increment === 0} + on_click={() => { + setIncrement((i) => i - 1); + }} + > + – + </button> + <b>{increment}</b> + <button + on_click={() => { + setIncrement((i) => i + 1); + }} + > + + + </button> + </p> + </> + ); +} +``` + +```css +button { + margin: 10px; +} +``` + +<Solution> + +The issue is that the code inside the Effect uses the `increment` state variable. Since it's a dependency of your Effect, every change to `increment` causes the Effect to re-synchronize, which causes the interval to clear. If you keep clearing the interval every time before it has a chance to fire, it will appear as if the timer has stalled. + +To solve the issue, extract an `onTick` Effect Event from the Effect: + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState, useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; + +export default function Timer() { + const [count, setCount] = useState(0); + const [increment, setIncrement] = useState(1); + + const onTick = useEffectEvent(() => { + setCount((c) => c + increment); + }); + + useEffect(() => { + const id = setInterval(() => { + onTick(); + }, 1000); + return () => { + clearInterval(id); + }; + }, []); + + return ( + <> + <h1> + Counter: {count} + <button on_click={() => setCount(0)}>Reset</button> + </h1> + <hr /> + <p> + Every second, increment by: + <button + disabled={increment === 0} + on_click={() => { + setIncrement((i) => i - 1); + }} + > + – + </button> + <b>{increment}</b> + <button + on_click={() => { + setIncrement((i) => i + 1); + }} + > + + + </button> + </p> + </> + ); +} +``` + +```css +button { + margin: 10px; +} +``` + +Since `onTick` is an Effect Event, the code inside it isn't reactive. The change to `increment` does not trigger any Effects. + +</Solution> + +#### Fix a non-adjustable delay + +In this example, you can customize the interval delay. It's stored in a `delay` state variable which is updated by two buttons. However, even if you press the "plus 100 ms" button until the `delay` is 1000 milliseconds (that is, a second), you'll notice that the timer still increments very fast (every 100 ms). It's as if your changes to the `delay` are ignored. Find and fix the bug. + +<Hint> + +Code inside Effect Events is not reactive. Are there cases in which you would _want_ the `setInterval` call to re-run? + +</Hint> + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState, useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; + +export default function Timer() { + const [count, setCount] = useState(0); + const [increment, setIncrement] = useState(1); + const [delay, setDelay] = useState(100); + + const onTick = useEffectEvent(() => { + setCount((c) => c + increment); + }); + + const onMount = useEffectEvent(() => { + return setInterval(() => { + onTick(); + }, delay); + }); + + useEffect(() => { + const id = onMount(); + return () => { + clearInterval(id); + }; + }, []); + + return ( + <> + <h1> + Counter: {count} + <button on_click={() => setCount(0)}>Reset</button> + </h1> + <hr /> + <p> + Increment by: + <button + disabled={increment === 0} + on_click={() => { + setIncrement((i) => i - 1); + }} + > + – + </button> + <b>{increment}</b> + <button + on_click={() => { + setIncrement((i) => i + 1); + }} + > + + + </button> + </p> + <p> + Increment delay: + <button + disabled={delay === 100} + on_click={() => { + setDelay((d) => d - 100); + }} + > + –100 ms + </button> + <b>{delay} ms</b> + <button + on_click={() => { + setDelay((d) => d + 100); + }} + > + +100 ms + </button> + </p> + </> + ); +} +``` + +```css +button { + margin: 10px; +} +``` + +<Solution> + +The problem with the above example is that it extracted an Effect Event called `onMount` without considering what the code should actually be doing. You should only extract Effect Events for a specific reason: when you want to make a part of your code non-reactive. However, the `setInterval` call _should_ be reactive with respect to the `delay` state variable. If the `delay` changes, you want to set up the interval from scratch! To fix this code, pull all the reactive code back inside the Effect: + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState, useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; + +export default function Timer() { + const [count, setCount] = useState(0); + const [increment, setIncrement] = useState(1); + const [delay, setDelay] = useState(100); + + const onTick = useEffectEvent(() => { + setCount((c) => c + increment); + }); + + useEffect(() => { + const id = setInterval(() => { + onTick(); + }, delay); + return () => { + clearInterval(id); + }; + }, [delay]); + + return ( + <> + <h1> + Counter: {count} + <button on_click={() => setCount(0)}>Reset</button> + </h1> + <hr /> + <p> + Increment by: + <button + disabled={increment === 0} + on_click={() => { + setIncrement((i) => i - 1); + }} + > + – + </button> + <b>{increment}</b> + <button + on_click={() => { + setIncrement((i) => i + 1); + }} + > + + + </button> + </p> + <p> + Increment delay: + <button + disabled={delay === 100} + on_click={() => { + setDelay((d) => d - 100); + }} + > + –100 ms + </button> + <b>{delay} ms</b> + <button + on_click={() => { + setDelay((d) => d + 100); + }} + > + +100 ms + </button> + </p> + </> + ); +} +``` + +```css +button { + margin: 10px; +} +``` + +In general, you should be suspicious of functions like `onMount` that focus on the _timing_ rather than the _purpose_ of a piece of code. It may feel "more descriptive" at first but it obscures your intent. As a rule of thumb, Effect Events should correspond to something that happens from the _user's_ perspective. For example, `onMessage`, `onTick`, `onVisit`, or `onConnected` are good Effect Event names. Code inside them would likely not need to be reactive. On the other hand, `onMount`, `onUpdate`, `onUnmount`, or `onAfterRender` are so generic that it's easy to accidentally put code that _should_ be reactive into them. This is why you should name your Effect Events after _what the user thinks has happened,_ not when some code happened to run. + +</Solution> + +#### Fix a delayed notification + +When you join a chat room, this component shows a notification. However, it doesn't show the notification immediately. Instead, the notification is artificially delayed by two seconds so that the user has a chance to look around the UI. + +This almost works, but there is a bug. Try changing the dropdown from "general" to "travel" and then to "music" very quickly. If you do it fast enough, you will see two notifications (as expected!) but they will _both_ say "Welcome to music". + +Fix it so that when you switch from "general" to "travel" and then to "music" very quickly, you see two notifications, the first one being "Welcome to travel" and the second one being "Welcome to music". (For an additional challenge, assuming you've _already_ made the notifications show the correct rooms, change the code so that only the latter notification is displayed.) + +<Hint> + +Your Effect knows which room it connected to. Is there any information that you might want to pass to your Effect Event? + +</Hint> + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest", + "toastify-js": "1.12.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState, useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; +import { createConnection, sendMessage } from "./chat.js"; +import { showNotification } from "./notifications.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId, theme }) { + const onConnected = useEffectEvent(() => { + showNotification("Welcome to " + roomId, theme); + }); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.on("connected", () => { + setTimeout(() => { + onConnected(); + }, 2000); + }); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + + return <h1>Welcome to the {roomId} room!</h1>; +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [isDark, setIsDark] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Use dark theme + </label> + <hr /> + <ChatRoom roomId={roomId} theme={isDark ? "dark" : "light"} /> + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + let connectedCallback; + let timeout; + return { + connect() { + timeout = setTimeout(() => { + if (connectedCallback) { + connectedCallback(); + } + }, 100); + }, + on(event, callback) { + if (connectedCallback) { + throw Error("Cannot add the handler twice."); + } + if (event !== "connected") { + throw Error('Only "connected" event is supported.'); + } + connectedCallback = callback; + }, + disconnect() { + clearTimeout(timeout); + }, + }; +} +``` + +```js +import Toastify from "toastify-js"; +import "toastify-js/src/toastify.css"; + +export function showNotification(message, theme) { + Toastify({ + text: message, + duration: 2000, + gravity: "top", + position: "right", + style: { + background: theme === "dark" ? "black" : "white", + color: theme === "dark" ? "white" : "black", + }, + }).showToast(); +} +``` + +```css +label { + display: block; + margin-top: 10px; +} +``` + +<Solution> + +Inside your Effect Event, `roomId` is the value _at the time Effect Event was called._ + +Your Effect Event is called with a two second delay. If you're quickly switching from the travel to the music room, by the time the travel room's notification shows, `roomId` is already `"music"`. This is why both notifications say "Welcome to music". + +To fix the issue, instead of reading the _latest_ `roomId` inside the Effect Event, make it a parameter of your Effect Event, like `connectedRoomId` below. Then pass `roomId` from your Effect by calling `onConnected(roomId)`: + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest", + "toastify-js": "1.12.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState, useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; +import { createConnection, sendMessage } from "./chat.js"; +import { showNotification } from "./notifications.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId, theme }) { + const onConnected = useEffectEvent((connectedRoomId) => { + showNotification("Welcome to " + connectedRoomId, theme); + }); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.on("connected", () => { + setTimeout(() => { + onConnected(roomId); + }, 2000); + }); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + + return <h1>Welcome to the {roomId} room!</h1>; +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [isDark, setIsDark] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Use dark theme + </label> + <hr /> + <ChatRoom roomId={roomId} theme={isDark ? "dark" : "light"} /> + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + let connectedCallback; + let timeout; + return { + connect() { + timeout = setTimeout(() => { + if (connectedCallback) { + connectedCallback(); + } + }, 100); + }, + on(event, callback) { + if (connectedCallback) { + throw Error("Cannot add the handler twice."); + } + if (event !== "connected") { + throw Error('Only "connected" event is supported.'); + } + connectedCallback = callback; + }, + disconnect() { + clearTimeout(timeout); + }, + }; +} +``` + +```js +import Toastify from "toastify-js"; +import "toastify-js/src/toastify.css"; + +export function showNotification(message, theme) { + Toastify({ + text: message, + duration: 2000, + gravity: "top", + position: "right", + style: { + background: theme === "dark" ? "black" : "white", + color: theme === "dark" ? "white" : "black", + }, + }).showToast(); +} +``` + +```css +label { + display: block; + margin-top: 10px; +} +``` + +The Effect that had `roomId` set to `"travel"` (so it connected to the `"travel"` room) will show the notification for `"travel"`. The Effect that had `roomId` set to `"music"` (so it connected to the `"music"` room) will show the notification for `"music"`. In other words, `connectedRoomId` comes from your Effect (which is reactive), while `theme` always uses the latest value. + +To solve the additional challenge, save the notification timeout ID and clear it in the cleanup function of your Effect: + +```json +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental", + "react-scripts": "latest", + "toastify-js": "1.12.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState, useEffect } from "react"; +import { experimental_useEffectEvent as useEffectEvent } from "react"; +import { createConnection, sendMessage } from "./chat.js"; +import { showNotification } from "./notifications.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId, theme }) { + const onConnected = useEffectEvent((connectedRoomId) => { + showNotification("Welcome to " + connectedRoomId, theme); + }); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + let notificationTimeoutId; + connection.on("connected", () => { + notificationTimeoutId = setTimeout(() => { + onConnected(roomId); + }, 2000); + }); + connection.connect(); + return () => { + connection.disconnect(); + if (notificationTimeoutId !== undefined) { + clearTimeout(notificationTimeoutId); + } + }; + }, [roomId]); + + return <h1>Welcome to the {roomId} room!</h1>; +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [isDark, setIsDark] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Use dark theme + </label> + <hr /> + <ChatRoom roomId={roomId} theme={isDark ? "dark" : "light"} /> + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + let connectedCallback; + let timeout; + return { + connect() { + timeout = setTimeout(() => { + if (connectedCallback) { + connectedCallback(); + } + }, 100); + }, + on(event, callback) { + if (connectedCallback) { + throw Error("Cannot add the handler twice."); + } + if (event !== "connected") { + throw Error('Only "connected" event is supported.'); + } + connectedCallback = callback; + }, + disconnect() { + clearTimeout(timeout); + }, + }; +} +``` + +```js +import Toastify from "toastify-js"; +import "toastify-js/src/toastify.css"; + +export function showNotification(message, theme) { + Toastify({ + text: message, + duration: 2000, + gravity: "top", + position: "right", + style: { + background: theme === "dark" ? "black" : "white", + color: theme === "dark" ? "white" : "black", + }, + }).showToast(); +} +``` + +```css +label { + display: block; + margin-top: 10px; +} +``` + +This ensures that already scheduled (but not yet displayed) notifications get cancelled when you change rooms. + +</Solution> + +</Challenges> diff --git a/docs/src/learn/sharing-state-between-components.md b/docs/src/learn/sharing-state-between-components.md new file mode 100644 index 000000000..543a56110 --- /dev/null +++ b/docs/src/learn/sharing-state-between-components.md @@ -0,0 +1,579 @@ +--- +title: Sharing State Between Components 🚧 +--- + +## Overview + +<p class="intro" markdown> + +Sometimes, you want the state of two components to always change together. To do it, remove state from both of them, move it to their closest common parent, and then pass it down to them via props. This is known as _lifting state up,_ and it's one of the most common things you will do writing React code. + +</p> + +!!! summary "You Will Learn" + + - How to share state between components by lifting it up + - What are controlled and uncontrolled components + +## Lifting state up by example + +In this example, a parent `Accordion` component renders two separate `Panel`s: + +- `Accordion` + - `Panel` + - `Panel` + +Each `Panel` component has a boolean `isActive` state that determines whether its content is visible. + +Press the Show button for both panels: + +```js +import { useState } from "react"; + +function Panel({ title, children }) { + const [isActive, setIsActive] = useState(false); + return ( + <section className="panel"> + <h3>{title}</h3> + {isActive ? ( + <p>{children}</p> + ) : ( + <button on_click={() => setIsActive(true)}>Show</button> + )} + </section> + ); +} + +export default function Accordion() { + return ( + <> + <h2>Almaty, Kazakhstan</h2> + <Panel title="About"> + With a population of about 2 million, Almaty is Kazakhstan's + largest city. From 1929 to 1997, it was its capital city. + </Panel> + <Panel title="Etymology"> + The name comes from <span lang="kk-KZ">алма</span>, the Kazakh + word for "apple" and is often translated as "full of apples". In + fact, the region surrounding Almaty is thought to be the + ancestral home of the apple, and the wild{" "} + <i lang="la">Malus sieversii</i> is considered a likely + candidate for the ancestor of the modern domestic apple. + </Panel> + </> + ); +} +``` + +```css +h3, +p { + margin: 5px 0px; +} +.panel { + padding: 10px; + border: 1px solid #aaa; +} +``` + +Notice how pressing one panel's button does not affect the other panel--they are independent. + +<!-- TODO: Diagram --> + +**But now let's say you want to change it so that only one panel is expanded at any given time.** With that design, expanding the second panel should collapse the first one. How would you do that? + +To coordinate these two panels, you need to "lift their state up" to a parent component in three steps: + +1. **Remove** state from the child components. +2. **Pass** hardcoded data from the common parent. +3. **Add** state to the common parent and pass it down together with the event handlers. + +This will allow the `Accordion` component to coordinate both `Panel`s and only expand one at a time. + +### Step 1: Remove state from the child components + +You will give control of the `Panel`'s `isActive` to its parent component. This means that the parent component will pass `isActive` to `Panel` as a prop instead. Start by **removing this line** from the `Panel` component: + +```js +const [isActive, setIsActive] = useState(false); +``` + +And instead, add `isActive` to the `Panel`'s list of props: + +```js +function Panel({ title, children, isActive }) { +``` + +Now the `Panel`'s parent component can _control_ `isActive` by [passing it down as a prop.](/learn/passing-props-to-a-component) Conversely, the `Panel` component now has _no control_ over the value of `isActive`--it's now up to the parent component! + +### Step 2: Pass hardcoded data from the common parent + +To lift state up, you must locate the closest common parent component of _both_ of the child components that you want to coordinate: + +- `Accordion` _(closest common parent)_ + - `Panel` + - `Panel` + +In this example, it's the `Accordion` component. Since it's above both panels and can control their props, it will become the "source of truth" for which panel is currently active. Make the `Accordion` component pass a hardcoded value of `isActive` (for example, `true`) to both panels: + +```js +import { useState } from "react"; + +export default function Accordion() { + return ( + <> + <h2>Almaty, Kazakhstan</h2> + <Panel title="About" isActive={true}> + With a population of about 2 million, Almaty is Kazakhstan's + largest city. From 1929 to 1997, it was its capital city. + </Panel> + <Panel title="Etymology" isActive={true}> + The name comes from <span lang="kk-KZ">алма</span>, the Kazakh + word for "apple" and is often translated as "full of apples". In + fact, the region surrounding Almaty is thought to be the + ancestral home of the apple, and the wild{" "} + <i lang="la">Malus sieversii</i> is considered a likely + candidate for the ancestor of the modern domestic apple. + </Panel> + </> + ); +} + +function Panel({ title, children, isActive }) { + return ( + <section className="panel"> + <h3>{title}</h3> + {isActive ? ( + <p>{children}</p> + ) : ( + <button on_click={() => setIsActive(true)}>Show</button> + )} + </section> + ); +} +``` + +```css +h3, +p { + margin: 5px 0px; +} +.panel { + padding: 10px; + border: 1px solid #aaa; +} +``` + +Try editing the hardcoded `isActive` values in the `Accordion` component and see the result on the screen. + +### Step 3: Add state to the common parent + +Lifting state up often changes the nature of what you're storing as state. + +In this case, only one panel should be active at a time. This means that the `Accordion` common parent component needs to keep track of _which_ panel is the active one. Instead of a `boolean` value, it could use a number as the index of the active `Panel` for the state variable: + +```js +const [activeIndex, setActiveIndex] = useState(0); +``` + +When the `activeIndex` is `0`, the first panel is active, and when it's `1`, it's the second one. + +Clicking the "Show" button in either `Panel` needs to change the active index in `Accordion`. A `Panel` can't set the `activeIndex` state directly because it's defined inside the `Accordion`. The `Accordion` component needs to _explicitly allow_ the `Panel` component to change its state by [passing an event handler down as a prop](/learn/responding-to-events#passing-event-handlers-as-props): + +```js +<> + <Panel isActive={activeIndex === 0} onShow={() => setActiveIndex(0)}> + ... + </Panel> + <Panel isActive={activeIndex === 1} onShow={() => setActiveIndex(1)}> + ... + </Panel> +</> +``` + +The `<button>` inside the `Panel` will now use the `onShow` prop as its click event handler: + +```js +import { useState } from "react"; + +export default function Accordion() { + const [activeIndex, setActiveIndex] = useState(0); + return ( + <> + <h2>Almaty, Kazakhstan</h2> + <Panel + title="About" + isActive={activeIndex === 0} + onShow={() => setActiveIndex(0)} + > + With a population of about 2 million, Almaty is Kazakhstan's + largest city. From 1929 to 1997, it was its capital city. + </Panel> + <Panel + title="Etymology" + isActive={activeIndex === 1} + onShow={() => setActiveIndex(1)} + > + The name comes from <span lang="kk-KZ">алма</span>, the Kazakh + word for "apple" and is often translated as "full of apples". In + fact, the region surrounding Almaty is thought to be the + ancestral home of the apple, and the wild{" "} + <i lang="la">Malus sieversii</i> is considered a likely + candidate for the ancestor of the modern domestic apple. + </Panel> + </> + ); +} + +function Panel({ title, children, isActive, onShow }) { + return ( + <section className="panel"> + <h3>{title}</h3> + {isActive ? ( + <p>{children}</p> + ) : ( + <button on_click={onShow}>Show</button> + )} + </section> + ); +} +``` + +```css +h3, +p { + margin: 5px 0px; +} +.panel { + padding: 10px; + border: 1px solid #aaa; +} +``` + +This completes lifting state up! Moving state into the common parent component allowed you to coordinate the two panels. Using the active index instead of two "is shown" flags ensured that only one panel is active at a given time. And passing down the event handler to the child allowed the child to change the parent's state. + +<!-- TODO: Diagram --> + +<DeepDive> + +#### Controlled and uncontrolled components + +It is common to call a component with some local state "uncontrolled". For example, the original `Panel` component with an `isActive` state variable is uncontrolled because its parent cannot influence whether the panel is active or not. + +In contrast, you might say a component is "controlled" when the important information in it is driven by props rather than its own local state. This lets the parent component fully specify its behavior. The final `Panel` component with the `isActive` prop is controlled by the `Accordion` component. + +Uncontrolled components are easier to use within their parents because they require less configuration. But they're less flexible when you want to coordinate them together. Controlled components are maximally flexible, but they require the parent components to fully configure them with props. + +In practice, "controlled" and "uncontrolled" aren't strict technical terms--each component usually has some mix of both local state and props. However, this is a useful way to talk about how components are designed and what capabilities they offer. + +When writing a component, consider which information in it should be controlled (via props), and which information should be uncontrolled (via state). But you can always change your mind and refactor later. + +</DeepDive> + +## A single source of truth for each state + +In a React application, many components will have their own state. Some state may "live" close to the leaf components (components at the bottom of the tree) like inputs. Other state may "live" closer to the top of the app. For example, even client-side routing libraries are usually implemented by storing the current route in the React state, and passing it down by props! + +**For each unique piece of state, you will choose the component that "owns" it.** This principle is also known as having a ["single source of truth".](https://en.wikipedia.org/wiki/Single_source_of_truth) It doesn't mean that all state lives in one place--but that for _each_ piece of state, there is a _specific_ component that holds that piece of information. Instead of duplicating shared state between components, _lift it up_ to their common shared parent, and _pass it down_ to the children that need it. + +Your app will change as you work on it. It is common that you will move state down or back up while you're still figuring out where each piece of the state "lives". This is all part of the process! + +To see what this feels like in practice with a few more components, read [Thinking in React.](/learn/thinking-in-react) + +<Recap> + +- When you want to coordinate two components, move their state to their common parent. +- Then pass the information down through props from their common parent. +- Finally, pass the event handlers down so that the children can change the parent's state. +- It's useful to consider components as "controlled" (driven by props) or "uncontrolled" (driven by state). + +</Recap> + +<Challenges> + +#### Synced inputs + +These two inputs are independent. Make them stay in sync: editing one input should update the other input with the same text, and vice versa. + +<Hint> + +You'll need to lift their state up into the parent component. + +</Hint> + +```js +import { useState } from "react"; + +export default function SyncedInputs() { + return ( + <> + <Input label="First input" /> + <Input label="Second input" /> + </> + ); +} + +function Input({ label }) { + const [text, setText] = useState(""); + + function handleChange(e) { + setText(e.target.value); + } + + return ( + <label> + {label} <input value={text} onChange={handleChange} /> + </label> + ); +} +``` + +```css +input { + margin: 5px; +} +label { + display: block; +} +``` + +<Solution> + +Move the `text` state variable into the parent component along with the `handleChange` handler. Then pass them down as props to both of the `Input` components. This will keep them in sync. + +```js +import { useState } from "react"; + +export default function SyncedInputs() { + const [text, setText] = useState(""); + + function handleChange(e) { + setText(e.target.value); + } + + return ( + <> + <Input label="First input" value={text} onChange={handleChange} /> + <Input label="Second input" value={text} onChange={handleChange} /> + </> + ); +} + +function Input({ label, value, onChange }) { + return ( + <label> + {label} <input value={value} onChange={onChange} /> + </label> + ); +} +``` + +```css +input { + margin: 5px; +} +label { + display: block; +} +``` + +</Solution> + +#### Filtering a list + +In this example, the `SearchBar` has its own `query` state that controls the text input. Its parent `FilterableList` component displays a `List` of items, but it doesn't take the search query into account. + +Use the `filterItems(foods, query)` function to filter the list according to the search query. To test your changes, verify that typing "s" into the input filters down the list to "Sushi", "Shish kebab", and "Dim sum". + +Note that `filterItems` is already implemented and imported so you don't need to write it yourself! + +<Hint> + +You will want to remove the `query` state and the `handleChange` handler from the `SearchBar`, and move them to the `FilterableList`. Then pass them down to `SearchBar` as `query` and `onChange` props. + +</Hint> + +```js +import { useState } from "react"; +import { foods, filterItems } from "./data.js"; + +export default function FilterableList() { + return ( + <> + <SearchBar /> + <hr /> + <List items={foods} /> + </> + ); +} + +function SearchBar() { + const [query, setQuery] = useState(""); + + function handleChange(e) { + setQuery(e.target.value); + } + + return ( + <label> + Search: <input value={query} onChange={handleChange} /> + </label> + ); +} + +function List({ items }) { + return ( + <table> + <tbody> + {items.map((food) => ( + <tr key={food.id}> + <td>{food.name}</td> + <td>{food.description}</td> + </tr> + ))} + </tbody> + </table> + ); +} +``` + +```js +export function filterItems(items, query) { + query = query.toLowerCase(); + return items.filter((item) => + item.name + .split(" ") + .some((word) => word.toLowerCase().startsWith(query)) + ); +} + +export const foods = [ + { + id: 0, + name: "Sushi", + description: + "Sushi is a traditional Japanese dish of prepared vinegared rice", + }, + { + id: 1, + name: "Dal", + description: + "The most common way of preparing dal is in the form of a soup to which onions, tomatoes and various spices may be added", + }, + { + id: 2, + name: "Pierogi", + description: + "Pierogi are filled dumplings made by wrapping unleavened dough around a savoury or sweet filling and cooking in boiling water", + }, + { + id: 3, + name: "Shish kebab", + description: + "Shish kebab is a popular meal of skewered and grilled cubes of meat.", + }, + { + id: 4, + name: "Dim sum", + description: + "Dim sum is a large range of small dishes that Cantonese people traditionally enjoy in restaurants for breakfast and lunch", + }, +]; +``` + +<Solution> + +Lift the `query` state up into the `FilterableList` component. Call `filterItems(foods, query)` to get the filtered list and pass it down to the `List`. Now changing the query input is reflected in the list: + +```js +import { useState } from "react"; +import { foods, filterItems } from "./data.js"; + +export default function FilterableList() { + const [query, setQuery] = useState(""); + const results = filterItems(foods, query); + + function handleChange(e) { + setQuery(e.target.value); + } + + return ( + <> + <SearchBar query={query} onChange={handleChange} /> + <hr /> + <List items={results} /> + </> + ); +} + +function SearchBar({ query, onChange }) { + return ( + <label> + Search: <input value={query} onChange={onChange} /> + </label> + ); +} + +function List({ items }) { + return ( + <table> + <tbody> + {items.map((food) => ( + <tr key={food.id}> + <td>{food.name}</td> + <td>{food.description}</td> + </tr> + ))} + </tbody> + </table> + ); +} +``` + +```js +export function filterItems(items, query) { + query = query.toLowerCase(); + return items.filter((item) => + item.name + .split(" ") + .some((word) => word.toLowerCase().startsWith(query)) + ); +} + +export const foods = [ + { + id: 0, + name: "Sushi", + description: + "Sushi is a traditional Japanese dish of prepared vinegared rice", + }, + { + id: 1, + name: "Dal", + description: + "The most common way of preparing dal is in the form of a soup to which onions, tomatoes and various spices may be added", + }, + { + id: 2, + name: "Pierogi", + description: + "Pierogi are filled dumplings made by wrapping unleavened dough around a savoury or sweet filling and cooking in boiling water", + }, + { + id: 3, + name: "Shish kebab", + description: + "Shish kebab is a popular meal of skewered and grilled cubes of meat.", + }, + { + id: 4, + name: "Dim sum", + description: + "Dim sum is a large range of small dishes that Cantonese people traditionally enjoy in restaurants for breakfast and lunch", + }, +]; +``` + +</Solution> + +</Challenges> diff --git a/docs/src/learn/start-a-new-react-project.md b/docs/src/learn/start-a-new-react-project.md new file mode 100644 index 000000000..dbe1ad06a --- /dev/null +++ b/docs/src/learn/start-a-new-react-project.md @@ -0,0 +1,133 @@ +--- +title: Start a New React Project 🚧 +--- + +## Overview + +<p class="intro" markdown> + +If you want to build a new app or a new website fully with React, we recommend picking one of the React-powered frameworks popular in the community. Frameworks provide features that most apps and sites eventually need, including routing, data fetching, and generating HTML. + +</p> + +<Note> + +**You need to install [Node.js](https://nodejs.org/en/) for local development.** You can _also_ choose to use Node.js in production, but you don't have to. Many React frameworks support export to a static HTML/CSS/JS folder. + +</Note> + +## Production-grade React frameworks + +### Next.js + +**[Next.js](https://nextjs.org/) is a full-stack React framework.** It's versatile and lets you create React apps of any size--from a mostly static blog to a complex dynamic application. To create a new Next.js project, run in your terminal: + +<TerminalBlock> +npx create-next-app +</TerminalBlock> + +If you're new to Next.js, check out the [Next.js tutorial.](https://nextjs.org/learn/foundations/about-nextjs) + +Next.js is maintained by [Vercel](https://vercel.com/). You can [deploy a Next.js app](https://nextjs.org/docs/deployment) to any Node.js or serverless hosting, or to your own server. [Fully static Next.js apps](https://nextjs.org/docs/advanced-features/static-html-export) can be deployed to any static hosting. + +### Remix + +**[Remix](https://remix.run/) is a full-stack React framework with nested routing.** It lets you break your app into nested parts that can load data in parallel and refresh in response to the user actions. To create a new Remix project, run: + +<TerminalBlock> +npx create-remix +</TerminalBlock> + +If you're new to Remix, check out the Remix [blog tutorial](https://remix.run/docs/en/main/tutorials/blog) (short) and [app tutorial](https://remix.run/docs/en/main/tutorials/jokes) (long). + +Remix is maintained by [Shopify](https://www.shopify.com/). When you create a Remix project, you need to [pick your deployment target](https://remix.run/docs/en/main/guides/deployment). You can deploy a Remix app to any Node.js or serverless hosting by using or writing an [adapter](https://remix.run/docs/en/main/other-api/adapter). + +### Gatsby + +**[Gatsby](https://www.gatsbyjs.com/) is a React framework for fast CMS-backed websites.** Its rich plugin ecosystem and its GraphQL data layer simplify integrating content, APIs, and services into one website. To create a new Gatsby project, run: + +<TerminalBlock> +npx create-gatsby +</TerminalBlock> + +If you're new to Gatsby, check out the [Gatsby tutorial.](https://www.gatsbyjs.com/docs/tutorial/) + +Gatsby is maintained by [Netlify](https://www.netlify.com/). You can [deploy a fully static Gatsby site](https://www.gatsbyjs.com/docs/how-to/previews-deploys-hosting) to any static hosting. If you opt into using server-only features, make sure your hosting provider supports them for Gatsby. + +### Expo (for native apps) + +**[Expo](https://expo.dev/) is a React framework that lets you create universal Android, iOS, and web apps with truly native UIs.** It provides an SDK for [React Native](https://reactnative.dev/) that makes the native parts easier to use. To create a new Expo project, run: + +<TerminalBlock> +npx create-expo-app +</TerminalBlock> + +If you're new to Expo, check out the [Expo tutorial](https://docs.expo.dev/tutorial/introduction/). + +Expo is maintained by [Expo (the company)](https://expo.dev/about). Building apps with Expo is free, and you can submit them to the Google and Apple app stores without restrictions. Expo additionally provides opt-in paid cloud services. + +<DeepDive> + +#### Can I use React without a framework? + +You can definitely use React without a framework--that's how you'd [use React for a part of your page.](/learn/add-react-to-an-existing-project#using-react-for-a-part-of-your-existing-page) **However, if you're building a new app or a site fully with React, we recommend using a framework.** + +Here's why. + +Even if you don't need routing or data fetching at first, you'll likely want to add some libraries for them. As your JavaScript bundle grows with every new feature, you might have to figure out how to split code for every route individually. As your data fetching needs get more complex, you are likely to encounter server-client network waterfalls that make your app feel very slow. As your audience includes more users with poor network conditions and low-end devices, you might need to generate HTML from your components to display content early--either on the server, or during the build time. Changing your setup to run some of your code on the server or during the build can be very tricky. + +**These problems are not React-specific. This is why Svelte has SvelteKit, Vue has Nuxt, and so on.** To solve these problems on your own, you'll need to integrate your bundler with your router and with your data fetching library. It's not hard to get an initial setup working, but there are a lot of subtleties involved in making an app that loads quickly even as it grows over time. You'll want to send down the minimal amount of app code but do so in a single client–server roundtrip, in parallel with any data required for the page. You'll likely want the page to be interactive before your JavaScript code even runs, to support progressive enhancement. You may want to generate a folder of fully static HTML files for your marketing pages that can be hosted anywhere and still work with JavaScript disabled. Building these capabilities yourself takes real work. + +**React frameworks on this page solve problems like these by default, with no extra work from your side.** They let you start very lean and then scale your app with your needs. Each React framework has a community, so finding answers to questions and upgrading tooling is easier. Frameworks also give structure to your code, helping you and others retain context and skills between different projects. Conversely, with a custom setup it's easier to get stuck on unsupported dependency versions, and you'll essentially end up creating your own framework—albeit one with no community or upgrade path (and if it's anything like the ones we've made in the past, more haphazardly designed). + +If you're still not convinced, or your app has unusual constraints not served well by these frameworks and you'd like to roll your own custom setup, we can't stop you--go for it! Grab `react` and `react-dom` from npm, set up your custom build process with a bundler like [Vite](https://vitejs.dev/) or [Parcel](https://parceljs.org/), and add other tools as you need them for routing, static generation or server-side rendering, and more. </DeepDive> + +## Bleeding-edge React frameworks + +As we've explored how to continue improving React, we realized that integrating React more closely with frameworks (specifically, with routing, bundling, and server technologies) is our biggest opportunity to help React users build better apps. The Next.js team has agreed to collaborate with us in researching, developing, integrating, and testing framework-agnostic bleeding-edge React features like [React Server Components.](/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-server-components) + +These features are getting closer to being production-ready every day, and we've been in talks with other bundler and framework developers about integrating them. Our hope is that in a year or two, all frameworks listed on this page will have full support for these features. (If you're a framework author interested in partnering with us to experiment with these features, please let us know!) + +### Next.js (App Router) + +**[Next.js's App Router](https://beta.nextjs.org/docs/getting-started) is a redesign of the Next.js APIs aiming to fulfill the React team’s full-stack architecture vision.** It lets you fetch data in asynchronous components that run on the server or even during the build. + +Next.js is maintained by [Vercel](https://vercel.com/). You can [deploy a Next.js app](https://nextjs.org/docs/deployment) to any Node.js or serverless hosting, or to your own server. Next.js also supports [static export](https://beta.nextjs.org/docs/configuring/static-export) which doesn't require a server. <Pitfall> + +Next.js's App Router is **currently in beta and is not yet recommended for production** (as of Mar 2023). To experiment with it in an existing Next.js project, [follow this incremental migration guide](https://beta.nextjs.org/docs/upgrade-guide#migrating-from-pages-to-app). + +</Pitfall> + +<DeepDive> + +#### Which features make up the React team’s full-stack architecture vision? + +Next.js's App Router bundler fully implements the official [React Server Components specification](https://github.com/reactjs/rfcs/blob/main/text/0188-server-components.md). This lets you mix build-time, server-only, and interactive components in a single React tree. + +For example, you can write a server-only React component as an `async` function that reads from a database or from a file. Then you can pass data down from it to your interactive components: + +```js +// This component runs *only* on the server (or during the build). +async function Talks({ confId }) { + // 1. You're on the server, so you can talk to your data layer. API endpoint not required. + const talks = await db.Talks.findAll({ confId }); + + // 2. Add any amount of rendering logic. It won't make your JavaScript bundle larger. + const videos = talks.map((talk) => talk.video); + + // 3. Pass the data down to the components that will run in the browser. + return <SearchableVideoList videos={videos} />; +} +``` + +Next.js's App Router also integrates [data fetching with Suspense](/blog/2022/03/29/react-v18#suspense-in-data-frameworks). This lets you specify a loading state (like a skeleton placeholder) for different parts of your user interface directly in your React tree: + +```js +<Suspense fallback={<TalksLoading />}> + <Talks confId={conf.id} /> +</Suspense> +``` + +Server Components and Suspense are React features rather than Next.js features. However, adopting them at the framework level requires buy-in and non-trivial implementation work. At the moment, the Next.js App Router is the most complete implementation. The React team is working with bundler developers to make these features easier to implement in the next generation of frameworks. + +</DeepDive> diff --git a/docs/src/learn/state-a-components-memory.md b/docs/src/learn/state-a-components-memory.md new file mode 100644 index 000000000..ce350c1f7 --- /dev/null +++ b/docs/src/learn/state-a-components-memory.md @@ -0,0 +1,1652 @@ +--- +title: "State: A Component's Memory 🚧" +--- + +## Overview + +<p class="intro" markdown> + +Components often need to change what's on the screen as a result of an interaction. Typing into the form should update the input field, clicking "next" on an image carousel should change which image is displayed, clicking "buy" should put a product in the shopping cart. Components need to "remember" things: the current input value, the current image, the shopping cart. In React, this kind of component-specific memory is called _state_. + +</p> + +!!! summary "You Will Learn" + + - How to add a state variable with the [`useState`](/reference/react/useState) Hook + - What pair of values the `useState` Hook returns + - How to add more than one state variable + - Why state is called local + +## When a regular variable isn’t enough + +Here's a component that renders a sculpture image. Clicking the "Next" button should show the next sculpture by changing the `index` to `1`, then `2`, and so on. However, this **won't work** (you can try it!): + +```js +import { sculptureList } from "./data.js"; + +export default function Gallery() { + let index = 0; + + function handleClick() { + index = index + 1; + } + + let sculpture = sculptureList[index]; + return ( + <> + <button on_click={handleClick}>Next</button> + <h2> + <i>{sculpture.name} </i> + by {sculpture.artist} + </h2> + <h3> + ({index + 1} of {sculptureList.length}) + </h3> + <img src={sculpture.url} alt={sculpture.alt} /> + <p>{sculpture.description}</p> + </> + ); +} +``` + +```js +export const sculptureList = [ + { + name: "Homenaje a la Neurocirugía", + artist: "Marta Colvin Andrade", + description: + "Although Colvin is predominantly known for abstract themes that allude to pre-Hispanic symbols, this gigantic sculpture, an homage to neurosurgery, is one of her most recognizable public art pieces.", + url: "https://i.imgur.com/Mx7dA2Y.jpg", + alt: "A bronze statue of two crossed hands delicately holding a human brain in their fingertips.", + }, + { + name: "Floralis Genérica", + artist: "Eduardo Catalano", + description: + "This enormous (75 ft. or 23m) silver flower is located in Buenos Aires. It is designed to move, closing its petals in the evening or when strong winds blow and opening them in the morning.", + url: "https://i.imgur.com/ZF6s192m.jpg", + alt: "A gigantic metallic flower sculpture with reflective mirror-like petals and strong stamens.", + }, + { + name: "Eternal Presence", + artist: "John Woodrow Wilson", + description: + 'Wilson was known for his preoccupation with equality, social justice, as well as the essential and spiritual qualities of humankind. This massive (7ft. or 2,13m) bronze represents what he described as "a symbolic Black presence infused with a sense of universal humanity."', + url: "https://i.imgur.com/aTtVpES.jpg", + alt: "The sculpture depicting a human head seems ever-present and solemn. It radiates calm and serenity.", + }, + { + name: "Moai", + artist: "Unknown Artist", + description: + "Located on the Easter Island, there are 1,000 moai, or extant monumental statues, created by the early Rapa Nui people, which some believe represented deified ancestors.", + url: "https://i.imgur.com/RCwLEoQm.jpg", + alt: "Three monumental stone busts with the heads that are disproportionately large with somber faces.", + }, + { + name: "Blue Nana", + artist: "Niki de Saint Phalle", + description: + "The Nanas are triumphant creatures, symbols of femininity and maternity. Initially, Saint Phalle used fabric and found objects for the Nanas, and later on introduced polyester to achieve a more vibrant effect.", + url: "https://i.imgur.com/Sd1AgUOm.jpg", + alt: "A large mosaic sculpture of a whimsical dancing female figure in a colorful costume emanating joy.", + }, + { + name: "Ultimate Form", + artist: "Barbara Hepworth", + description: + "This abstract bronze sculpture is a part of The Family of Man series located at Yorkshire Sculpture Park. Hepworth chose not to create literal representations of the world but developed abstract forms inspired by people and landscapes.", + url: "https://i.imgur.com/2heNQDcm.jpg", + alt: "A tall sculpture made of three elements stacked on each other reminding of a human figure.", + }, + { + name: "Cavaliere", + artist: "Lamidi Olonade Fakeye", + description: + "Descended from four generations of woodcarvers, Fakeye's work blended traditional and contemporary Yoruba themes.", + url: "https://i.imgur.com/wIdGuZwm.png", + alt: "An intricate wood sculpture of a warrior with a focused face on a horse adorned with patterns.", + }, + { + name: "Big Bellies", + artist: "Alina Szapocznikow", + description: + "Szapocznikow is known for her sculptures of the fragmented body as a metaphor for the fragility and impermanence of youth and beauty. This sculpture depicts two very realistic large bellies stacked on top of each other, each around five feet (1,5m) tall.", + url: "https://i.imgur.com/AlHTAdDm.jpg", + alt: "The sculpture reminds a cascade of folds, quite different from bellies in classical sculptures.", + }, + { + name: "Terracotta Army", + artist: "Unknown Artist", + description: + "The Terracotta Army is a collection of terracotta sculptures depicting the armies of Qin Shi Huang, the first Emperor of China. The army consisted of more than 8,000 soldiers, 130 chariots with 520 horses, and 150 cavalry horses.", + url: "https://i.imgur.com/HMFmH6m.jpg", + alt: "12 terracotta sculptures of solemn warriors, each with a unique facial expression and armor.", + }, + { + name: "Lunar Landscape", + artist: "Louise Nevelson", + description: + "Nevelson was known for scavenging objects from New York City debris, which she would later assemble into monumental constructions. In this one, she used disparate parts like a bedpost, juggling pin, and seat fragment, nailing and gluing them into boxes that reflect the influence of Cubism’s geometric abstraction of space and form.", + url: "https://i.imgur.com/rN7hY6om.jpg", + alt: "A black matte sculpture where the individual elements are initially indistinguishable.", + }, + { + name: "Aureole", + artist: "Ranjani Shettar", + description: + 'Shettar merges the traditional and the modern, the natural and the industrial. Her art focuses on the relationship between man and nature. Her work was described as compelling both abstractly and figuratively, gravity defying, and a "fine synthesis of unlikely materials."', + url: "https://i.imgur.com/okTpbHhm.jpg", + alt: "A pale wire-like sculpture mounted on concrete wall and descending on the floor. It appears light.", + }, + { + name: "Hippos", + artist: "Taipei Zoo", + description: + "The Taipei Zoo commissioned a Hippo Square featuring submerged hippos at play.", + url: "https://i.imgur.com/6o5Vuyu.jpg", + alt: "A group of bronze hippo sculptures emerging from the sett sidewalk as if they were swimming.", + }, +]; +``` + +```css +h2 { + margin-top: 10px; + margin-bottom: 0; +} +h3 { + margin-top: 5px; + font-weight: normal; + font-size: 100%; +} +img { + width: 120px; + height: 120px; +} +button { + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +``` + +The `handleClick` event handler is updating a local variable, `index`. But two things prevent that change from being visible: + +1. **Local variables don't persist between renders.** When React renders this component a second time, it renders it from scratch—it doesn't consider any changes to the local variables. +2. **Changes to local variables won't trigger renders.** React doesn't realize it needs to render the component again with the new data. + +To update a component with new data, two things need to happen: + +1. **Retain** the data between renders. +2. **Trigger** React to render the component with new data (re-rendering). + +The [`useState`](/reference/react/useState) Hook provides those two things: + +1. A **state variable** to retain the data between renders. +2. A **state setter function** to update the variable and trigger React to render the component again. + +## Adding a state variable + +To add a state variable, import `useState` from React at the top of the file: + +```js +import { useState } from "react"; +``` + +Then, replace this line: + +```js +let index = 0; +``` + +with + +```js +const [index, setIndex] = useState(0); +``` + +`index` is a state variable and `setIndex` is the setter function. + +> The `[` and `]` syntax here is called [array destructuring](https://javascript.info/destructuring-assignment) and it lets you read values from an array. The array returned by `useState` always has exactly two items. + +This is how they work together in `handleClick`: + +```js +function handleClick() { + setIndex(index + 1); +} +``` + +Now clicking the "Next" button switches the current sculpture: + +```js +import { useState } from "react"; +import { sculptureList } from "./data.js"; + +export default function Gallery() { + const [index, setIndex] = useState(0); + + function handleClick() { + setIndex(index + 1); + } + + let sculpture = sculptureList[index]; + return ( + <> + <button on_click={handleClick}>Next</button> + <h2> + <i>{sculpture.name} </i> + by {sculpture.artist} + </h2> + <h3> + ({index + 1} of {sculptureList.length}) + </h3> + <img src={sculpture.url} alt={sculpture.alt} /> + <p>{sculpture.description}</p> + </> + ); +} +``` + +```js +export const sculptureList = [ + { + name: "Homenaje a la Neurocirugía", + artist: "Marta Colvin Andrade", + description: + "Although Colvin is predominantly known for abstract themes that allude to pre-Hispanic symbols, this gigantic sculpture, an homage to neurosurgery, is one of her most recognizable public art pieces.", + url: "https://i.imgur.com/Mx7dA2Y.jpg", + alt: "A bronze statue of two crossed hands delicately holding a human brain in their fingertips.", + }, + { + name: "Floralis Genérica", + artist: "Eduardo Catalano", + description: + "This enormous (75 ft. or 23m) silver flower is located in Buenos Aires. It is designed to move, closing its petals in the evening or when strong winds blow and opening them in the morning.", + url: "https://i.imgur.com/ZF6s192m.jpg", + alt: "A gigantic metallic flower sculpture with reflective mirror-like petals and strong stamens.", + }, + { + name: "Eternal Presence", + artist: "John Woodrow Wilson", + description: + 'Wilson was known for his preoccupation with equality, social justice, as well as the essential and spiritual qualities of humankind. This massive (7ft. or 2,13m) bronze represents what he described as "a symbolic Black presence infused with a sense of universal humanity."', + url: "https://i.imgur.com/aTtVpES.jpg", + alt: "The sculpture depicting a human head seems ever-present and solemn. It radiates calm and serenity.", + }, + { + name: "Moai", + artist: "Unknown Artist", + description: + "Located on the Easter Island, there are 1,000 moai, or extant monumental statues, created by the early Rapa Nui people, which some believe represented deified ancestors.", + url: "https://i.imgur.com/RCwLEoQm.jpg", + alt: "Three monumental stone busts with the heads that are disproportionately large with somber faces.", + }, + { + name: "Blue Nana", + artist: "Niki de Saint Phalle", + description: + "The Nanas are triumphant creatures, symbols of femininity and maternity. Initially, Saint Phalle used fabric and found objects for the Nanas, and later on introduced polyester to achieve a more vibrant effect.", + url: "https://i.imgur.com/Sd1AgUOm.jpg", + alt: "A large mosaic sculpture of a whimsical dancing female figure in a colorful costume emanating joy.", + }, + { + name: "Ultimate Form", + artist: "Barbara Hepworth", + description: + "This abstract bronze sculpture is a part of The Family of Man series located at Yorkshire Sculpture Park. Hepworth chose not to create literal representations of the world but developed abstract forms inspired by people and landscapes.", + url: "https://i.imgur.com/2heNQDcm.jpg", + alt: "A tall sculpture made of three elements stacked on each other reminding of a human figure.", + }, + { + name: "Cavaliere", + artist: "Lamidi Olonade Fakeye", + description: + "Descended from four generations of woodcarvers, Fakeye's work blended traditional and contemporary Yoruba themes.", + url: "https://i.imgur.com/wIdGuZwm.png", + alt: "An intricate wood sculpture of a warrior with a focused face on a horse adorned with patterns.", + }, + { + name: "Big Bellies", + artist: "Alina Szapocznikow", + description: + "Szapocznikow is known for her sculptures of the fragmented body as a metaphor for the fragility and impermanence of youth and beauty. This sculpture depicts two very realistic large bellies stacked on top of each other, each around five feet (1,5m) tall.", + url: "https://i.imgur.com/AlHTAdDm.jpg", + alt: "The sculpture reminds a cascade of folds, quite different from bellies in classical sculptures.", + }, + { + name: "Terracotta Army", + artist: "Unknown Artist", + description: + "The Terracotta Army is a collection of terracotta sculptures depicting the armies of Qin Shi Huang, the first Emperor of China. The army consisted of more than 8,000 soldiers, 130 chariots with 520 horses, and 150 cavalry horses.", + url: "https://i.imgur.com/HMFmH6m.jpg", + alt: "12 terracotta sculptures of solemn warriors, each with a unique facial expression and armor.", + }, + { + name: "Lunar Landscape", + artist: "Louise Nevelson", + description: + "Nevelson was known for scavenging objects from New York City debris, which she would later assemble into monumental constructions. In this one, she used disparate parts like a bedpost, juggling pin, and seat fragment, nailing and gluing them into boxes that reflect the influence of Cubism’s geometric abstraction of space and form.", + url: "https://i.imgur.com/rN7hY6om.jpg", + alt: "A black matte sculpture where the individual elements are initially indistinguishable.", + }, + { + name: "Aureole", + artist: "Ranjani Shettar", + description: + 'Shettar merges the traditional and the modern, the natural and the industrial. Her art focuses on the relationship between man and nature. Her work was described as compelling both abstractly and figuratively, gravity defying, and a "fine synthesis of unlikely materials."', + url: "https://i.imgur.com/okTpbHhm.jpg", + alt: "A pale wire-like sculpture mounted on concrete wall and descending on the floor. It appears light.", + }, + { + name: "Hippos", + artist: "Taipei Zoo", + description: + "The Taipei Zoo commissioned a Hippo Square featuring submerged hippos at play.", + url: "https://i.imgur.com/6o5Vuyu.jpg", + alt: "A group of bronze hippo sculptures emerging from the sett sidewalk as if they were swimming.", + }, +]; +``` + +```css +h2 { + margin-top: 10px; + margin-bottom: 0; +} +h3 { + margin-top: 5px; + font-weight: normal; + font-size: 100%; +} +img { + width: 120px; + height: 120px; +} +button { + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +``` + +### Meet your first Hook + +In React, `useState`, as well as any other function starting with "`use`", is called a Hook. + +_Hooks_ are special functions that are only available while React is [rendering](/learn/render-and-commit#step-1-trigger-a-render) (which we'll get into in more detail on the next page). They let you "hook into" different React features. + +State is just one of those features, but you will meet the other Hooks later. + +<Pitfall> + +**Hooks—functions starting with `use`—can only be called at the top level of your components or [your own Hooks.](/learn/reusing-logic-with-custom-hooks)** You can't call Hooks inside conditions, loops, or other nested functions. Hooks are functions, but it's helpful to think of them as unconditional declarations about your component's needs. You "use" React features at the top of your component similar to how you "import" modules at the top of your file. + +</Pitfall> + +### Anatomy of `useState` + +When you call [`useState`](/reference/react/useState), you are telling React that you want this component to remember something: + +```js +const [index, setIndex] = useState(0); +``` + +In this case, you want React to remember `index`. + +<Note> + +The convention is to name this pair like `const [something, setSomething]`. You could name it anything you like, but conventions make things easier to understand across projects. + +</Note> + +The only argument to `useState` is the **initial value** of your state variable. In this example, the `index`'s initial value is set to `0` with `useState(0)`. + +Every time your component renders, `useState` gives you an array containing two values: + +1. The **state variable** (`index`) with the value you stored. +2. The **state setter function** (`setIndex`) which can update the state variable and trigger React to render the component again. + +Here's how that happens in action: + +```js +const [index, setIndex] = useState(0); +``` + +1. **Your component renders the first time.** Because you passed `0` to `useState` as the initial value for `index`, it will return `[0, setIndex]`. React remembers `0` is the latest state value. +2. **You update the state.** When a user clicks the button, it calls `setIndex(index + 1)`. `index` is `0`, so it's `setIndex(1)`. This tells React to remember `index` is `1` now and triggers another render. +3. **Your component's second render.** React still sees `useState(0)`, but because React _remembers_ that you set `index` to `1`, it returns `[1, setIndex]` instead. +4. And so on! + +## Giving a component multiple state variables + +You can have as many state variables of as many types as you like in one component. This component has two state variables, a number `index` and a boolean `showMore` that's toggled when you click "Show details": + +```js +import { useState } from "react"; +import { sculptureList } from "./data.js"; + +export default function Gallery() { + const [index, setIndex] = useState(0); + const [showMore, setShowMore] = useState(false); + + function handleNextClick() { + setIndex(index + 1); + } + + function handleMoreClick() { + setShowMore(!showMore); + } + + let sculpture = sculptureList[index]; + return ( + <> + <button on_click={handleNextClick}>Next</button> + <h2> + <i>{sculpture.name} </i> + by {sculpture.artist} + </h2> + <h3> + ({index + 1} of {sculptureList.length}) + </h3> + <button on_click={handleMoreClick}> + {showMore ? "Hide" : "Show"} details + </button> + {showMore && <p>{sculpture.description}</p>} + <img src={sculpture.url} alt={sculpture.alt} /> + </> + ); +} +``` + +```js +export const sculptureList = [ + { + name: "Homenaje a la Neurocirugía", + artist: "Marta Colvin Andrade", + description: + "Although Colvin is predominantly known for abstract themes that allude to pre-Hispanic symbols, this gigantic sculpture, an homage to neurosurgery, is one of her most recognizable public art pieces.", + url: "https://i.imgur.com/Mx7dA2Y.jpg", + alt: "A bronze statue of two crossed hands delicately holding a human brain in their fingertips.", + }, + { + name: "Floralis Genérica", + artist: "Eduardo Catalano", + description: + "This enormous (75 ft. or 23m) silver flower is located in Buenos Aires. It is designed to move, closing its petals in the evening or when strong winds blow and opening them in the morning.", + url: "https://i.imgur.com/ZF6s192m.jpg", + alt: "A gigantic metallic flower sculpture with reflective mirror-like petals and strong stamens.", + }, + { + name: "Eternal Presence", + artist: "John Woodrow Wilson", + description: + 'Wilson was known for his preoccupation with equality, social justice, as well as the essential and spiritual qualities of humankind. This massive (7ft. or 2,13m) bronze represents what he described as "a symbolic Black presence infused with a sense of universal humanity."', + url: "https://i.imgur.com/aTtVpES.jpg", + alt: "The sculpture depicting a human head seems ever-present and solemn. It radiates calm and serenity.", + }, + { + name: "Moai", + artist: "Unknown Artist", + description: + "Located on the Easter Island, there are 1,000 moai, or extant monumental statues, created by the early Rapa Nui people, which some believe represented deified ancestors.", + url: "https://i.imgur.com/RCwLEoQm.jpg", + alt: "Three monumental stone busts with the heads that are disproportionately large with somber faces.", + }, + { + name: "Blue Nana", + artist: "Niki de Saint Phalle", + description: + "The Nanas are triumphant creatures, symbols of femininity and maternity. Initially, Saint Phalle used fabric and found objects for the Nanas, and later on introduced polyester to achieve a more vibrant effect.", + url: "https://i.imgur.com/Sd1AgUOm.jpg", + alt: "A large mosaic sculpture of a whimsical dancing female figure in a colorful costume emanating joy.", + }, + { + name: "Ultimate Form", + artist: "Barbara Hepworth", + description: + "This abstract bronze sculpture is a part of The Family of Man series located at Yorkshire Sculpture Park. Hepworth chose not to create literal representations of the world but developed abstract forms inspired by people and landscapes.", + url: "https://i.imgur.com/2heNQDcm.jpg", + alt: "A tall sculpture made of three elements stacked on each other reminding of a human figure.", + }, + { + name: "Cavaliere", + artist: "Lamidi Olonade Fakeye", + description: + "Descended from four generations of woodcarvers, Fakeye's work blended traditional and contemporary Yoruba themes.", + url: "https://i.imgur.com/wIdGuZwm.png", + alt: "An intricate wood sculpture of a warrior with a focused face on a horse adorned with patterns.", + }, + { + name: "Big Bellies", + artist: "Alina Szapocznikow", + description: + "Szapocznikow is known for her sculptures of the fragmented body as a metaphor for the fragility and impermanence of youth and beauty. This sculpture depicts two very realistic large bellies stacked on top of each other, each around five feet (1,5m) tall.", + url: "https://i.imgur.com/AlHTAdDm.jpg", + alt: "The sculpture reminds a cascade of folds, quite different from bellies in classical sculptures.", + }, + { + name: "Terracotta Army", + artist: "Unknown Artist", + description: + "The Terracotta Army is a collection of terracotta sculptures depicting the armies of Qin Shi Huang, the first Emperor of China. The army consisted of more than 8,000 soldiers, 130 chariots with 520 horses, and 150 cavalry horses.", + url: "https://i.imgur.com/HMFmH6m.jpg", + alt: "12 terracotta sculptures of solemn warriors, each with a unique facial expression and armor.", + }, + { + name: "Lunar Landscape", + artist: "Louise Nevelson", + description: + "Nevelson was known for scavenging objects from New York City debris, which she would later assemble into monumental constructions. In this one, she used disparate parts like a bedpost, juggling pin, and seat fragment, nailing and gluing them into boxes that reflect the influence of Cubism’s geometric abstraction of space and form.", + url: "https://i.imgur.com/rN7hY6om.jpg", + alt: "A black matte sculpture where the individual elements are initially indistinguishable.", + }, + { + name: "Aureole", + artist: "Ranjani Shettar", + description: + 'Shettar merges the traditional and the modern, the natural and the industrial. Her art focuses on the relationship between man and nature. Her work was described as compelling both abstractly and figuratively, gravity defying, and a "fine synthesis of unlikely materials."', + url: "https://i.imgur.com/okTpbHhm.jpg", + alt: "A pale wire-like sculpture mounted on concrete wall and descending on the floor. It appears light.", + }, + { + name: "Hippos", + artist: "Taipei Zoo", + description: + "The Taipei Zoo commissioned a Hippo Square featuring submerged hippos at play.", + url: "https://i.imgur.com/6o5Vuyu.jpg", + alt: "A group of bronze hippo sculptures emerging from the sett sidewalk as if they were swimming.", + }, +]; +``` + +```css +h2 { + margin-top: 10px; + margin-bottom: 0; +} +h3 { + margin-top: 5px; + font-weight: normal; + font-size: 100%; +} +img { + width: 120px; + height: 120px; +} +button { + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +``` + +It is a good idea to have multiple state variables if their state is unrelated, like `index` and `showMore` in this example. But if you find that you often change two state variables together, it might be easier to combine them into one. For example, if you have a form with many fields, it's more convenient to have a single state variable that holds an object than state variable per field. Read [Choosing the State Structure](/learn/choosing-the-state-structure) for more tips. + +<DeepDive> + +#### How does React know which state to return? + +You might have noticed that the `useState` call does not receive any information about _which_ state variable it refers to. There is no "identifier" that is passed to `useState`, so how does it know which of the state variables to return? Does it rely on some magic like parsing your functions? The answer is no. + +Instead, to enable their concise syntax, Hooks **rely on a stable call order on every render of the same component.** This works well in practice because if you follow the rule above ("only call Hooks at the top level"), Hooks will always be called in the same order. Additionally, a [linter plugin](https://www.npmjs.com/package/eslint-plugin-react-hooks) catches most mistakes. + +Internally, React holds an array of state pairs for every component. It also maintains the current pair index, which is set to `0` before rendering. Each time you call `useState`, React gives you the next state pair and increments the index. You can read more about this mechanism in [React Hooks: Not Magic, Just Arrays.](https://medium.com/@ryardley/react-hooks-not-magic-just-arrays-cd4f1857236e) + +This example **doesn't use React** but it gives you an idea of how `useState` works internally: + +```js +let componentHooks = []; +let currentHookIndex = 0; + +// How useState works inside React (simplified). +function useState(initialState) { + let pair = componentHooks[currentHookIndex]; + if (pair) { + // This is not the first render, + // so the state pair already exists. + // Return it and prepare for next Hook call. + currentHookIndex++; + return pair; + } + + // This is the first time we're rendering, + // so create a state pair and store it. + pair = [initialState, setState]; + + function setState(nextState) { + // When the user requests a state change, + // put the new value into the pair. + pair[0] = nextState; + updateDOM(); + } + + // Store the pair for future renders + // and prepare for the next Hook call. + componentHooks[currentHookIndex] = pair; + currentHookIndex++; + return pair; +} + +function Gallery() { + // Each useState() call will get the next pair. + const [index, setIndex] = useState(0); + const [showMore, setShowMore] = useState(false); + + function handleNextClick() { + setIndex(index + 1); + } + + function handleMoreClick() { + setShowMore(!showMore); + } + + let sculpture = sculptureList[index]; + // This example doesn't use React, so + // return an output object instead of JSX. + return { + onNextClick: handleNextClick, + onMoreClick: handleMoreClick, + header: `${sculpture.name} by ${sculpture.artist}`, + counter: `${index + 1} of ${sculptureList.length}`, + more: `${showMore ? "Hide" : "Show"} details`, + description: showMore ? sculpture.description : null, + imageSrc: sculpture.url, + imageAlt: sculpture.alt, + }; +} + +function updateDOM() { + // Reset the current Hook index + // before rendering the component. + currentHookIndex = 0; + let output = Gallery(); + + // Update the DOM to match the output. + // This is the part React does for you. + nextButton.onclick = output.onNextClick; + header.textContent = output.header; + moreButton.onclick = output.onMoreClick; + moreButton.textContent = output.more; + image.src = output.imageSrc; + image.alt = output.imageAlt; + if (output.description !== null) { + description.textContent = output.description; + description.style.display = ""; + } else { + description.style.display = "none"; + } +} + +let nextButton = document.getElementById("nextButton"); +let header = document.getElementById("header"); +let moreButton = document.getElementById("moreButton"); +let description = document.getElementById("description"); +let image = document.getElementById("image"); +let sculptureList = [ + { + name: "Homenaje a la Neurocirugía", + artist: "Marta Colvin Andrade", + description: + "Although Colvin is predominantly known for abstract themes that allude to pre-Hispanic symbols, this gigantic sculpture, an homage to neurosurgery, is one of her most recognizable public art pieces.", + url: "https://i.imgur.com/Mx7dA2Y.jpg", + alt: "A bronze statue of two crossed hands delicately holding a human brain in their fingertips.", + }, + { + name: "Floralis Genérica", + artist: "Eduardo Catalano", + description: + "This enormous (75 ft. or 23m) silver flower is located in Buenos Aires. It is designed to move, closing its petals in the evening or when strong winds blow and opening them in the morning.", + url: "https://i.imgur.com/ZF6s192m.jpg", + alt: "A gigantic metallic flower sculpture with reflective mirror-like petals and strong stamens.", + }, + { + name: "Eternal Presence", + artist: "John Woodrow Wilson", + description: + 'Wilson was known for his preoccupation with equality, social justice, as well as the essential and spiritual qualities of humankind. This massive (7ft. or 2,13m) bronze represents what he described as "a symbolic Black presence infused with a sense of universal humanity."', + url: "https://i.imgur.com/aTtVpES.jpg", + alt: "The sculpture depicting a human head seems ever-present and solemn. It radiates calm and serenity.", + }, + { + name: "Moai", + artist: "Unknown Artist", + description: + "Located on the Easter Island, there are 1,000 moai, or extant monumental statues, created by the early Rapa Nui people, which some believe represented deified ancestors.", + url: "https://i.imgur.com/RCwLEoQm.jpg", + alt: "Three monumental stone busts with the heads that are disproportionately large with somber faces.", + }, + { + name: "Blue Nana", + artist: "Niki de Saint Phalle", + description: + "The Nanas are triumphant creatures, symbols of femininity and maternity. Initially, Saint Phalle used fabric and found objects for the Nanas, and later on introduced polyester to achieve a more vibrant effect.", + url: "https://i.imgur.com/Sd1AgUOm.jpg", + alt: "A large mosaic sculpture of a whimsical dancing female figure in a colorful costume emanating joy.", + }, + { + name: "Ultimate Form", + artist: "Barbara Hepworth", + description: + "This abstract bronze sculpture is a part of The Family of Man series located at Yorkshire Sculpture Park. Hepworth chose not to create literal representations of the world but developed abstract forms inspired by people and landscapes.", + url: "https://i.imgur.com/2heNQDcm.jpg", + alt: "A tall sculpture made of three elements stacked on each other reminding of a human figure.", + }, + { + name: "Cavaliere", + artist: "Lamidi Olonade Fakeye", + description: + "Descended from four generations of woodcarvers, Fakeye's work blended traditional and contemporary Yoruba themes.", + url: "https://i.imgur.com/wIdGuZwm.png", + alt: "An intricate wood sculpture of a warrior with a focused face on a horse adorned with patterns.", + }, + { + name: "Big Bellies", + artist: "Alina Szapocznikow", + description: + "Szapocznikow is known for her sculptures of the fragmented body as a metaphor for the fragility and impermanence of youth and beauty. This sculpture depicts two very realistic large bellies stacked on top of each other, each around five feet (1,5m) tall.", + url: "https://i.imgur.com/AlHTAdDm.jpg", + alt: "The sculpture reminds a cascade of folds, quite different from bellies in classical sculptures.", + }, + { + name: "Terracotta Army", + artist: "Unknown Artist", + description: + "The Terracotta Army is a collection of terracotta sculptures depicting the armies of Qin Shi Huang, the first Emperor of China. The army consisted of more than 8,000 soldiers, 130 chariots with 520 horses, and 150 cavalry horses.", + url: "https://i.imgur.com/HMFmH6m.jpg", + alt: "12 terracotta sculptures of solemn warriors, each with a unique facial expression and armor.", + }, + { + name: "Lunar Landscape", + artist: "Louise Nevelson", + description: + "Nevelson was known for scavenging objects from New York City debris, which she would later assemble into monumental constructions. In this one, she used disparate parts like a bedpost, juggling pin, and seat fragment, nailing and gluing them into boxes that reflect the influence of Cubism’s geometric abstraction of space and form.", + url: "https://i.imgur.com/rN7hY6om.jpg", + alt: "A black matte sculpture where the individual elements are initially indistinguishable.", + }, + { + name: "Aureole", + artist: "Ranjani Shettar", + description: + 'Shettar merges the traditional and the modern, the natural and the industrial. Her art focuses on the relationship between man and nature. Her work was described as compelling both abstractly and figuratively, gravity defying, and a "fine synthesis of unlikely materials."', + url: "https://i.imgur.com/okTpbHhm.jpg", + alt: "A pale wire-like sculpture mounted on concrete wall and descending on the floor. It appears light.", + }, + { + name: "Hippos", + artist: "Taipei Zoo", + description: + "The Taipei Zoo commissioned a Hippo Square featuring submerged hippos at play.", + url: "https://i.imgur.com/6o5Vuyu.jpg", + alt: "A group of bronze hippo sculptures emerging from the sett sidewalk as if they were swimming.", + }, +]; + +// Make UI match the initial state. +updateDOM(); +``` + +```html +<button id="nextButton">Next</button> +<h3 id="header"></h3> +<button id="moreButton"></button> +<p id="description"></p> +<img id="image" /> + +<style> + * { + box-sizing: border-box; + } + body { + font-family: sans-serif; + margin: 20px; + padding: 0; + } + button { + display: block; + margin-bottom: 10px; + } +</style> +``` + +```css +button { + display: block; + margin-bottom: 10px; +} +``` + +You don't have to understand it to use React, but you might find this a helpful mental model. + +</DeepDive> + +## State is isolated and private + +State is local to a component instance on the screen. In other words, **if you render the same component twice, each copy will have completely isolated state!** Changing one of them will not affect the other. + +In this example, the `Gallery` component from earlier is rendered twice with no changes to its logic. Try clicking the buttons inside each of the galleries. Notice that their state is independent: + +```js +import Gallery from "./Gallery.js"; + +export default function Page() { + return ( + <div className="Page"> + <Gallery /> + <Gallery /> + </div> + ); +} +``` + +```js +import { useState } from "react"; +import { sculptureList } from "./data.js"; + +export default function Gallery() { + const [index, setIndex] = useState(0); + const [showMore, setShowMore] = useState(false); + + function handleNextClick() { + setIndex(index + 1); + } + + function handleMoreClick() { + setShowMore(!showMore); + } + + let sculpture = sculptureList[index]; + return ( + <section> + <button on_click={handleNextClick}>Next</button> + <h2> + <i>{sculpture.name} </i> + by {sculpture.artist} + </h2> + <h3> + ({index + 1} of {sculptureList.length}) + </h3> + <button on_click={handleMoreClick}> + {showMore ? "Hide" : "Show"} details + </button> + {showMore && <p>{sculpture.description}</p>} + <img src={sculpture.url} alt={sculpture.alt} /> + </section> + ); +} +``` + +```js +export const sculptureList = [ + { + name: "Homenaje a la Neurocirugía", + artist: "Marta Colvin Andrade", + description: + "Although Colvin is predominantly known for abstract themes that allude to pre-Hispanic symbols, this gigantic sculpture, an homage to neurosurgery, is one of her most recognizable public art pieces.", + url: "https://i.imgur.com/Mx7dA2Y.jpg", + alt: "A bronze statue of two crossed hands delicately holding a human brain in their fingertips.", + }, + { + name: "Floralis Genérica", + artist: "Eduardo Catalano", + description: + "This enormous (75 ft. or 23m) silver flower is located in Buenos Aires. It is designed to move, closing its petals in the evening or when strong winds blow and opening them in the morning.", + url: "https://i.imgur.com/ZF6s192m.jpg", + alt: "A gigantic metallic flower sculpture with reflective mirror-like petals and strong stamens.", + }, + { + name: "Eternal Presence", + artist: "John Woodrow Wilson", + description: + 'Wilson was known for his preoccupation with equality, social justice, as well as the essential and spiritual qualities of humankind. This massive (7ft. or 2,13m) bronze represents what he described as "a symbolic Black presence infused with a sense of universal humanity."', + url: "https://i.imgur.com/aTtVpES.jpg", + alt: "The sculpture depicting a human head seems ever-present and solemn. It radiates calm and serenity.", + }, + { + name: "Moai", + artist: "Unknown Artist", + description: + "Located on the Easter Island, there are 1,000 moai, or extant monumental statues, created by the early Rapa Nui people, which some believe represented deified ancestors.", + url: "https://i.imgur.com/RCwLEoQm.jpg", + alt: "Three monumental stone busts with the heads that are disproportionately large with somber faces.", + }, + { + name: "Blue Nana", + artist: "Niki de Saint Phalle", + description: + "The Nanas are triumphant creatures, symbols of femininity and maternity. Initially, Saint Phalle used fabric and found objects for the Nanas, and later on introduced polyester to achieve a more vibrant effect.", + url: "https://i.imgur.com/Sd1AgUOm.jpg", + alt: "A large mosaic sculpture of a whimsical dancing female figure in a colorful costume emanating joy.", + }, + { + name: "Ultimate Form", + artist: "Barbara Hepworth", + description: + "This abstract bronze sculpture is a part of The Family of Man series located at Yorkshire Sculpture Park. Hepworth chose not to create literal representations of the world but developed abstract forms inspired by people and landscapes.", + url: "https://i.imgur.com/2heNQDcm.jpg", + alt: "A tall sculpture made of three elements stacked on each other reminding of a human figure.", + }, + { + name: "Cavaliere", + artist: "Lamidi Olonade Fakeye", + description: + "Descended from four generations of woodcarvers, Fakeye's work blended traditional and contemporary Yoruba themes.", + url: "https://i.imgur.com/wIdGuZwm.png", + alt: "An intricate wood sculpture of a warrior with a focused face on a horse adorned with patterns.", + }, + { + name: "Big Bellies", + artist: "Alina Szapocznikow", + description: + "Szapocznikow is known for her sculptures of the fragmented body as a metaphor for the fragility and impermanence of youth and beauty. This sculpture depicts two very realistic large bellies stacked on top of each other, each around five feet (1,5m) tall.", + url: "https://i.imgur.com/AlHTAdDm.jpg", + alt: "The sculpture reminds a cascade of folds, quite different from bellies in classical sculptures.", + }, + { + name: "Terracotta Army", + artist: "Unknown Artist", + description: + "The Terracotta Army is a collection of terracotta sculptures depicting the armies of Qin Shi Huang, the first Emperor of China. The army consisted of more than 8,000 soldiers, 130 chariots with 520 horses, and 150 cavalry horses.", + url: "https://i.imgur.com/HMFmH6m.jpg", + alt: "12 terracotta sculptures of solemn warriors, each with a unique facial expression and armor.", + }, + { + name: "Lunar Landscape", + artist: "Louise Nevelson", + description: + "Nevelson was known for scavenging objects from New York City debris, which she would later assemble into monumental constructions. In this one, she used disparate parts like a bedpost, juggling pin, and seat fragment, nailing and gluing them into boxes that reflect the influence of Cubism’s geometric abstraction of space and form.", + url: "https://i.imgur.com/rN7hY6om.jpg", + alt: "A black matte sculpture where the individual elements are initially indistinguishable.", + }, + { + name: "Aureole", + artist: "Ranjani Shettar", + description: + 'Shettar merges the traditional and the modern, the natural and the industrial. Her art focuses on the relationship between man and nature. Her work was described as compelling both abstractly and figuratively, gravity defying, and a "fine synthesis of unlikely materials."', + url: "https://i.imgur.com/okTpbHhm.jpg", + alt: "A pale wire-like sculpture mounted on concrete wall and descending on the floor. It appears light.", + }, + { + name: "Hippos", + artist: "Taipei Zoo", + description: + "The Taipei Zoo commissioned a Hippo Square featuring submerged hippos at play.", + url: "https://i.imgur.com/6o5Vuyu.jpg", + alt: "A group of bronze hippo sculptures emerging from the sett sidewalk as if they were swimming.", + }, +]; +``` + +```css +button { + display: block; + margin-bottom: 10px; +} +.Page > * { + float: left; + width: 50%; + padding: 10px; +} +h2 { + margin-top: 10px; + margin-bottom: 0; +} +h3 { + margin-top: 5px; + font-weight: normal; + font-size: 100%; +} +img { + width: 120px; + height: 120px; +} +button { + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +``` + +This is what makes state different from regular variables that you might declare at the top of your module. State is not tied to a particular function call or a place in the code, but it's "local" to the specific place on the screen. You rendered two `<Gallery />` components, so their state is stored separately. + +Also notice how the `Page` component doesn't "know" anything about the `Gallery` state or even whether it has any. Unlike props, **state is fully private to the component declaring it.** The parent component can't change it. This lets you add state to any component or remove it without impacting the rest of the components. + +What if you wanted both galleries to keep their states in sync? The right way to do it in React is to _remove_ state from child components and add it to their closest shared parent. The next few pages will focus on organizing state of a single component, but we will return to this topic in [Sharing State Between Components.](/learn/sharing-state-between-components) + +<Recap> + +- Use a state variable when a component needs to "remember" some information between renders. +- State variables are declared by calling the `useState` Hook. +- Hooks are special functions that start with `use`. They let you "hook into" React features like state. +- Hooks might remind you of imports: they need to be called unconditionally. Calling Hooks, including `useState`, is only valid at the top level of a component or another Hook. +- The `useState` Hook returns a pair of values: the current state and the function to update it. +- You can have more than one state variable. Internally, React matches them up by their order. +- State is private to the component. If you render it in two places, each copy gets its own state. + +</Recap> + +<Challenges> + +#### Complete the gallery + +When you press "Next" on the last sculpture, the code crashes. Fix the logic to prevent the crash. You may do this by adding extra logic to event handler or by disabling the button when the action is not possible. + +After fixing the crash, add a "Previous" button that shows the previous sculpture. It shouldn't crash on the first sculpture. + +```js +import { useState } from "react"; +import { sculptureList } from "./data.js"; + +export default function Gallery() { + const [index, setIndex] = useState(0); + const [showMore, setShowMore] = useState(false); + + function handleNextClick() { + setIndex(index + 1); + } + + function handleMoreClick() { + setShowMore(!showMore); + } + + let sculpture = sculptureList[index]; + return ( + <> + <button on_click={handleNextClick}>Next</button> + <h2> + <i>{sculpture.name} </i> + by {sculpture.artist} + </h2> + <h3> + ({index + 1} of {sculptureList.length}) + </h3> + <button on_click={handleMoreClick}> + {showMore ? "Hide" : "Show"} details + </button> + {showMore && <p>{sculpture.description}</p>} + <img src={sculpture.url} alt={sculpture.alt} /> + </> + ); +} +``` + +```js +export const sculptureList = [ + { + name: "Homenaje a la Neurocirugía", + artist: "Marta Colvin Andrade", + description: + "Although Colvin is predominantly known for abstract themes that allude to pre-Hispanic symbols, this gigantic sculpture, an homage to neurosurgery, is one of her most recognizable public art pieces.", + url: "https://i.imgur.com/Mx7dA2Y.jpg", + alt: "A bronze statue of two crossed hands delicately holding a human brain in their fingertips.", + }, + { + name: "Floralis Genérica", + artist: "Eduardo Catalano", + description: + "This enormous (75 ft. or 23m) silver flower is located in Buenos Aires. It is designed to move, closing its petals in the evening or when strong winds blow and opening them in the morning.", + url: "https://i.imgur.com/ZF6s192m.jpg", + alt: "A gigantic metallic flower sculpture with reflective mirror-like petals and strong stamens.", + }, + { + name: "Eternal Presence", + artist: "John Woodrow Wilson", + description: + 'Wilson was known for his preoccupation with equality, social justice, as well as the essential and spiritual qualities of humankind. This massive (7ft. or 2,13m) bronze represents what he described as "a symbolic Black presence infused with a sense of universal humanity."', + url: "https://i.imgur.com/aTtVpES.jpg", + alt: "The sculpture depicting a human head seems ever-present and solemn. It radiates calm and serenity.", + }, + { + name: "Moai", + artist: "Unknown Artist", + description: + "Located on the Easter Island, there are 1,000 moai, or extant monumental statues, created by the early Rapa Nui people, which some believe represented deified ancestors.", + url: "https://i.imgur.com/RCwLEoQm.jpg", + alt: "Three monumental stone busts with the heads that are disproportionately large with somber faces.", + }, + { + name: "Blue Nana", + artist: "Niki de Saint Phalle", + description: + "The Nanas are triumphant creatures, symbols of femininity and maternity. Initially, Saint Phalle used fabric and found objects for the Nanas, and later on introduced polyester to achieve a more vibrant effect.", + url: "https://i.imgur.com/Sd1AgUOm.jpg", + alt: "A large mosaic sculpture of a whimsical dancing female figure in a colorful costume emanating joy.", + }, + { + name: "Ultimate Form", + artist: "Barbara Hepworth", + description: + "This abstract bronze sculpture is a part of The Family of Man series located at Yorkshire Sculpture Park. Hepworth chose not to create literal representations of the world but developed abstract forms inspired by people and landscapes.", + url: "https://i.imgur.com/2heNQDcm.jpg", + alt: "A tall sculpture made of three elements stacked on each other reminding of a human figure.", + }, + { + name: "Cavaliere", + artist: "Lamidi Olonade Fakeye", + description: + "Descended from four generations of woodcarvers, Fakeye's work blended traditional and contemporary Yoruba themes.", + url: "https://i.imgur.com/wIdGuZwm.png", + alt: "An intricate wood sculpture of a warrior with a focused face on a horse adorned with patterns.", + }, + { + name: "Big Bellies", + artist: "Alina Szapocznikow", + description: + "Szapocznikow is known for her sculptures of the fragmented body as a metaphor for the fragility and impermanence of youth and beauty. This sculpture depicts two very realistic large bellies stacked on top of each other, each around five feet (1,5m) tall.", + url: "https://i.imgur.com/AlHTAdDm.jpg", + alt: "The sculpture reminds a cascade of folds, quite different from bellies in classical sculptures.", + }, + { + name: "Terracotta Army", + artist: "Unknown Artist", + description: + "The Terracotta Army is a collection of terracotta sculptures depicting the armies of Qin Shi Huang, the first Emperor of China. The army consisted of more than 8,000 soldiers, 130 chariots with 520 horses, and 150 cavalry horses.", + url: "https://i.imgur.com/HMFmH6m.jpg", + alt: "12 terracotta sculptures of solemn warriors, each with a unique facial expression and armor.", + }, + { + name: "Lunar Landscape", + artist: "Louise Nevelson", + description: + "Nevelson was known for scavenging objects from New York City debris, which she would later assemble into monumental constructions. In this one, she used disparate parts like a bedpost, juggling pin, and seat fragment, nailing and gluing them into boxes that reflect the influence of Cubism’s geometric abstraction of space and form.", + url: "https://i.imgur.com/rN7hY6om.jpg", + alt: "A black matte sculpture where the individual elements are initially indistinguishable.", + }, + { + name: "Aureole", + artist: "Ranjani Shettar", + description: + 'Shettar merges the traditional and the modern, the natural and the industrial. Her art focuses on the relationship between man and nature. Her work was described as compelling both abstractly and figuratively, gravity defying, and a "fine synthesis of unlikely materials."', + url: "https://i.imgur.com/okTpbHhm.jpg", + alt: "A pale wire-like sculpture mounted on concrete wall and descending on the floor. It appears light.", + }, + { + name: "Hippos", + artist: "Taipei Zoo", + description: + "The Taipei Zoo commissioned a Hippo Square featuring submerged hippos at play.", + url: "https://i.imgur.com/6o5Vuyu.jpg", + alt: "A group of bronze hippo sculptures emerging from the sett sidewalk as if they were swimming.", + }, +]; +``` + +```css +button { + display: block; + margin-bottom: 10px; +} +.Page > * { + float: left; + width: 50%; + padding: 10px; +} +h2 { + margin-top: 10px; + margin-bottom: 0; +} +h3 { + margin-top: 5px; + font-weight: normal; + font-size: 100%; +} +img { + width: 120px; + height: 120px; +} +``` + +<Solution> + +This adds a guarding condition inside both event handlers and disables the buttons when needed: + +```js +import { useState } from "react"; +import { sculptureList } from "./data.js"; + +export default function Gallery() { + const [index, setIndex] = useState(0); + const [showMore, setShowMore] = useState(false); + + let hasPrev = index > 0; + let hasNext = index < sculptureList.length - 1; + + function handlePrevClick() { + if (hasPrev) { + setIndex(index - 1); + } + } + + function handleNextClick() { + if (hasNext) { + setIndex(index + 1); + } + } + + function handleMoreClick() { + setShowMore(!showMore); + } + + let sculpture = sculptureList[index]; + return ( + <> + <button on_click={handlePrevClick} disabled={!hasPrev}> + Previous + </button> + <button on_click={handleNextClick} disabled={!hasNext}> + Next + </button> + <h2> + <i>{sculpture.name} </i> + by {sculpture.artist} + </h2> + <h3> + ({index + 1} of {sculptureList.length}) + </h3> + <button on_click={handleMoreClick}> + {showMore ? "Hide" : "Show"} details + </button> + {showMore && <p>{sculpture.description}</p>} + <img src={sculpture.url} alt={sculpture.alt} /> + </> + ); +} +``` + +```js +export const sculptureList = [ + { + name: "Homenaje a la Neurocirugía", + artist: "Marta Colvin Andrade", + description: + "Although Colvin is predominantly known for abstract themes that allude to pre-Hispanic symbols, this gigantic sculpture, an homage to neurosurgery, is one of her most recognizable public art pieces.", + url: "https://i.imgur.com/Mx7dA2Y.jpg", + alt: "A bronze statue of two crossed hands delicately holding a human brain in their fingertips.", + }, + { + name: "Floralis Genérica", + artist: "Eduardo Catalano", + description: + "This enormous (75 ft. or 23m) silver flower is located in Buenos Aires. It is designed to move, closing its petals in the evening or when strong winds blow and opening them in the morning.", + url: "https://i.imgur.com/ZF6s192m.jpg", + alt: "A gigantic metallic flower sculpture with reflective mirror-like petals and strong stamens.", + }, + { + name: "Eternal Presence", + artist: "John Woodrow Wilson", + description: + 'Wilson was known for his preoccupation with equality, social justice, as well as the essential and spiritual qualities of humankind. This massive (7ft. or 2,13m) bronze represents what he described as "a symbolic Black presence infused with a sense of universal humanity."', + url: "https://i.imgur.com/aTtVpES.jpg", + alt: "The sculpture depicting a human head seems ever-present and solemn. It radiates calm and serenity.", + }, + { + name: "Moai", + artist: "Unknown Artist", + description: + "Located on the Easter Island, there are 1,000 moai, or extant monumental statues, created by the early Rapa Nui people, which some believe represented deified ancestors.", + url: "https://i.imgur.com/RCwLEoQm.jpg", + alt: "Three monumental stone busts with the heads that are disproportionately large with somber faces.", + }, + { + name: "Blue Nana", + artist: "Niki de Saint Phalle", + description: + "The Nanas are triumphant creatures, symbols of femininity and maternity. Initially, Saint Phalle used fabric and found objects for the Nanas, and later on introduced polyester to achieve a more vibrant effect.", + url: "https://i.imgur.com/Sd1AgUOm.jpg", + alt: "A large mosaic sculpture of a whimsical dancing female figure in a colorful costume emanating joy.", + }, + { + name: "Ultimate Form", + artist: "Barbara Hepworth", + description: + "This abstract bronze sculpture is a part of The Family of Man series located at Yorkshire Sculpture Park. Hepworth chose not to create literal representations of the world but developed abstract forms inspired by people and landscapes.", + url: "https://i.imgur.com/2heNQDcm.jpg", + alt: "A tall sculpture made of three elements stacked on each other reminding of a human figure.", + }, + { + name: "Cavaliere", + artist: "Lamidi Olonade Fakeye", + description: + "Descended from four generations of woodcarvers, Fakeye's work blended traditional and contemporary Yoruba themes.", + url: "https://i.imgur.com/wIdGuZwm.png", + alt: "An intricate wood sculpture of a warrior with a focused face on a horse adorned with patterns.", + }, + { + name: "Big Bellies", + artist: "Alina Szapocznikow", + description: + "Szapocznikow is known for her sculptures of the fragmented body as a metaphor for the fragility and impermanence of youth and beauty. This sculpture depicts two very realistic large bellies stacked on top of each other, each around five feet (1,5m) tall.", + url: "https://i.imgur.com/AlHTAdDm.jpg", + alt: "The sculpture reminds a cascade of folds, quite different from bellies in classical sculptures.", + }, + { + name: "Terracotta Army", + artist: "Unknown Artist", + description: + "The Terracotta Army is a collection of terracotta sculptures depicting the armies of Qin Shi Huang, the first Emperor of China. The army consisted of more than 8,000 soldiers, 130 chariots with 520 horses, and 150 cavalry horses.", + url: "https://i.imgur.com/HMFmH6m.jpg", + alt: "12 terracotta sculptures of solemn warriors, each with a unique facial expression and armor.", + }, + { + name: "Lunar Landscape", + artist: "Louise Nevelson", + description: + "Nevelson was known for scavenging objects from New York City debris, which she would later assemble into monumental constructions. In this one, she used disparate parts like a bedpost, juggling pin, and seat fragment, nailing and gluing them into boxes that reflect the influence of Cubism’s geometric abstraction of space and form.", + url: "https://i.imgur.com/rN7hY6om.jpg", + alt: "A black matte sculpture where the individual elements are initially indistinguishable.", + }, + { + name: "Aureole", + artist: "Ranjani Shettar", + description: + 'Shettar merges the traditional and the modern, the natural and the industrial. Her art focuses on the relationship between man and nature. Her work was described as compelling both abstractly and figuratively, gravity defying, and a "fine synthesis of unlikely materials."', + url: "https://i.imgur.com/okTpbHhm.jpg", + alt: "A pale wire-like sculpture mounted on concrete wall and descending on the floor. It appears light.", + }, + { + name: "Hippos", + artist: "Taipei Zoo", + description: + "The Taipei Zoo commissioned a Hippo Square featuring submerged hippos at play.", + url: "https://i.imgur.com/6o5Vuyu.jpg", + alt: "A group of bronze hippo sculptures emerging from the sett sidewalk as if they were swimming.", + }, +]; +``` + +```css +button { + display: block; + margin-bottom: 10px; +} +.Page > * { + float: left; + width: 50%; + padding: 10px; +} +h2 { + margin-top: 10px; + margin-bottom: 0; +} +h3 { + margin-top: 5px; + font-weight: normal; + font-size: 100%; +} +img { + width: 120px; + height: 120px; +} +``` + +Notice how `hasPrev` and `hasNext` are used _both_ for the returned JSX and inside the event handlers! This handy pattern works because event handler functions ["close over"](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures) any variables declared while rendering. + +</Solution> + +#### Fix stuck form inputs + +When you type into the input fields, nothing appears. It's like the input values are "stuck" with empty strings. The `value` of the first `<input>` is set to always match the `firstName` variable, and the `value` for the second `<input>` is set to always match the `lastName` variable. This is correct. Both inputs have `onChange` event handlers, which try to update the variables based on the latest user input (`e.target.value`). However, the variables don't seem to "remember" their values between re-renders. Fix this by using state variables instead. + +```js +export default function Form() { + let firstName = ""; + let lastName = ""; + + function handleFirstNameChange(e) { + firstName = e.target.value; + } + + function handleLastNameChange(e) { + lastName = e.target.value; + } + + function handleReset() { + firstName = ""; + lastName = ""; + } + + return ( + <form onSubmit={(e) => e.preventDefault()}> + <input + placeholder="First name" + value={firstName} + onChange={handleFirstNameChange} + /> + <input + placeholder="Last name" + value={lastName} + onChange={handleLastNameChange} + /> + <h1> + Hi, {firstName} {lastName} + </h1> + <button on_click={handleReset}>Reset</button> + </form> + ); +} +``` + +```css +h1 { + margin-top: 10px; +} +``` + +<Solution> + +First, import `useState` from React. Then replace `firstName` and `lastName` with state variables declared by calling `useState`. Finally, replace every `firstName = ...` assignment with `setFirstName(...)`, and do the same for `lastName`. Don't forget to update `handleReset` too so that the reset button works. + +```js +import { useState } from "react"; + +export default function Form() { + const [firstName, setFirstName] = useState(""); + const [lastName, setLastName] = useState(""); + + function handleFirstNameChange(e) { + setFirstName(e.target.value); + } + + function handleLastNameChange(e) { + setLastName(e.target.value); + } + + function handleReset() { + setFirstName(""); + setLastName(""); + } + + return ( + <form onSubmit={(e) => e.preventDefault()}> + <input + placeholder="First name" + value={firstName} + onChange={handleFirstNameChange} + /> + <input + placeholder="Last name" + value={lastName} + onChange={handleLastNameChange} + /> + <h1> + Hi, {firstName} {lastName} + </h1> + <button on_click={handleReset}>Reset</button> + </form> + ); +} +``` + +```css +h1 { + margin-top: 10px; +} +``` + +</Solution> + +#### Fix a crash + +Here is a small form that is supposed to let the user leave some feedback. When the feedback is submitted, it's supposed to display a thank-you message. However, it crashes with an error message saying "Rendered fewer hooks than expected". Can you spot the mistake and fix it? + +<Hint> + +Are there any limitations on _where_ Hooks may be called? Does this component break any rules? Check if there are any comments disabling the linter checks--this is where the bugs often hide! + +</Hint> + +```js +import { useState } from "react"; + +export default function FeedbackForm() { + const [isSent, setIsSent] = useState(false); + if (isSent) { + return <h1>Thank you!</h1>; + } else { + // eslint-disable-next-line + const [message, setMessage] = useState(""); + return ( + <form + onSubmit={(e) => { + e.preventDefault(); + alert(`Sending: "${message}"`); + setIsSent(true); + }} + > + <textarea + placeholder="Message" + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + <br /> + <button type="submit">Send</button> + </form> + ); + } +} +``` + +<Solution> + +Hooks can only be called at the top level of the component function. Here, the first `isSent` definition follows this rule, but the `message` definition is nested in a condition. + +Move it out of the condition to fix the issue: + +```js +import { useState } from "react"; + +export default function FeedbackForm() { + const [isSent, setIsSent] = useState(false); + const [message, setMessage] = useState(""); + + if (isSent) { + return <h1>Thank you!</h1>; + } else { + return ( + <form + onSubmit={(e) => { + e.preventDefault(); + alert(`Sending: "${message}"`); + setIsSent(true); + }} + > + <textarea + placeholder="Message" + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + <br /> + <button type="submit">Send</button> + </form> + ); + } +} +``` + +Remember, Hooks must be called unconditionally and always in the same order! + +You could also remove the unnecessary `else` branch to reduce the nesting. However, it's still important that all calls to Hooks happen _before_ the first `return`. + +```js +import { useState } from "react"; + +export default function FeedbackForm() { + const [isSent, setIsSent] = useState(false); + const [message, setMessage] = useState(""); + + if (isSent) { + return <h1>Thank you!</h1>; + } + + return ( + <form + onSubmit={(e) => { + e.preventDefault(); + alert(`Sending: "${message}"`); + setIsSent(true); + }} + > + <textarea + placeholder="Message" + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + <br /> + <button type="submit">Send</button> + </form> + ); +} +``` + +Try moving the second `useState` call after the `if` condition and notice how this breaks it again. + +If your linter is [configured for React](/learn/editor-setup#linting), you should see a lint error when you make a mistake like this. If you don't see an error when you try the faulty code locally, you need to set up linting for your project. + +</Solution> + +#### Remove unnecessary state + +When the button is clicked, this example should ask for the user's name and then display an alert greeting them. You tried to use state to keep the name, but for some reason it always shows "Hello, !". + +To fix this code, remove the unnecessary state variable. (We will discuss about [why this didn't work](/learn/state-as-a-snapshot) later.) + +Can you explain why this state variable was unnecessary? + +```js +import { useState } from "react"; + +export default function FeedbackForm() { + const [name, setName] = useState(""); + + function handleClick() { + setName(prompt("What is your name?")); + alert(`Hello, ${name}!`); + } + + return <button on_click={handleClick}>Greet</button>; +} +``` + +<Solution> + +Here is a fixed version that uses a regular `name` variable declared in the function that needs it: + +```js +import { useState } from "react"; + +export default function FeedbackForm() { + function handleClick() { + const name = prompt("What is your name?"); + alert(`Hello, ${name}!`); + } + + return <button on_click={handleClick}>Greet</button>; +} +``` + +A state variable is only necessary to keep information between re-renders of a component. Within a single event handler, a regular variable will do fine. Don't introduce state variables when a regular variable works well. + +</Solution> + +</Challenges> diff --git a/docs/src/learn/state-as-a-snapshot.md b/docs/src/learn/state-as-a-snapshot.md new file mode 100644 index 000000000..0fe725ed7 --- /dev/null +++ b/docs/src/learn/state-as-a-snapshot.md @@ -0,0 +1,472 @@ +--- +title: State as a Snapshot 🚧 +--- + +## Overview + +<p class="intro" markdown> + +State variables might look like regular JavaScript variables that you can read and write to. However, state behaves more like a snapshot. Setting it does not change the state variable you already have, but instead triggers a re-render. + +</p> + +!!! summary "You Will Learn" + + - How setting state triggers re-renders + - When and how state updates + - Why state does not update immediately after you set it + - How event handlers access a "snapshot" of the state + +## Setting state triggers renders + +You might think of your user interface as changing directly in response to the user event like a click. In React, it works a little differently from this mental model. On the previous page, you saw that [setting state requests a re-render](/learn/render-and-commit#step-1-trigger-a-render) from React. This means that for an interface to react to the event, you need to _update the state_. + +In this example, when you press "send", `setIsSent(true)` tells React to re-render the UI: + +```js +import { useState } from "react"; + +export default function Form() { + const [isSent, setIsSent] = useState(false); + const [message, setMessage] = useState("Hi!"); + if (isSent) { + return <h1>Your message is on its way!</h1>; + } + return ( + <form + onSubmit={(e) => { + e.preventDefault(); + setIsSent(true); + sendMessage(message); + }} + > + <textarea + placeholder="Message" + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + <button type="submit">Send</button> + </form> + ); +} + +function sendMessage(message) { + // ... +} +``` + +```css +label, +textarea { + margin-bottom: 10px; + display: block; +} +``` + +Here's what happens when you click the button: + +1. The `onSubmit` event handler executes. +2. `setIsSent(true)` sets `isSent` to `true` and queues a new render. +3. React re-renders the component according to the new `isSent` value. + +Let's take a closer look at the relationship between state and rendering. + +## Rendering takes a snapshot in time + +["Rendering"](/learn/render-and-commit#step-2-react-renders-your-components) means that React is calling your component, which is a function. The JSX you return from that function is like a snapshot of the UI in time. Its props, event handlers, and local variables were all calculated **using its state at the time of the render.** + +Unlike a photograph or a movie frame, the UI "snapshot" you return is interactive. It includes logic like event handlers that specify what happens in response to inputs. React updates the screen to match this snapshot and connects the event handlers. As a result, pressing a button will trigger the click handler from your JSX. + +When React re-renders a component: + +1. React calls your function again. +2. Your function returns a new JSX snapshot. +3. React then updates the screen to match the snapshot you've returned. + +<IllustrationBlock sequential> + <Illustration caption="React executing the function" src="/images/docs/illustrations/i_render1.png" /> + <Illustration caption="Calculating the snapshot" src="/images/docs/illustrations/i_render2.png" /> + <Illustration caption="Updating the DOM tree" src="/images/docs/illustrations/i_render3.png" /> +</IllustrationBlock> + +As a component's memory, state is not like a regular variable that disappears after your function returns. State actually "lives" in React itself--as if on a shelf!--outside of your function. When React calls your component, it gives you a snapshot of the state for that particular render. Your component returns a snapshot of the UI with a fresh set of props and event handlers in its JSX, all calculated **using the state values from that render!** + +<IllustrationBlock sequential> + <Illustration caption="You tell React to update the state" src="/images/docs/illustrations/i_state-snapshot1.png" /> + <Illustration caption="React updates the state value" src="/images/docs/illustrations/i_state-snapshot2.png" /> + <Illustration caption="React passes a snapshot of the state value into the component" src="/images/docs/illustrations/i_state-snapshot3.png" /> +</IllustrationBlock> + +Here's a little experiment to show you how this works. In this example, you might expect that clicking the "+3" button would increment the counter three times because it calls `setNumber(number + 1)` three times. + +See what happens when you click the "+3" button: + +```js +import { useState } from "react"; + +export default function Counter() { + const [number, setNumber] = useState(0); + + return ( + <> + <h1>{number}</h1> + <button + on_click={() => { + setNumber(number + 1); + setNumber(number + 1); + setNumber(number + 1); + }} + > + +3 + </button> + </> + ); +} +``` + +```css +button { + display: inline-block; + margin: 10px; + font-size: 20px; +} +h1 { + display: inline-block; + margin: 10px; + width: 30px; + text-align: center; +} +``` + +Notice that `number` only increments once per click! + +**Setting state only changes it for the _next_ render.** During the first render, `number` was `0`. This is why, in _that render's_ `on_click` handler, the value of `number` is still `0` even after `setNumber(number + 1)` was called: + +```js +<button + on_click={() => { + setNumber(number + 1); + setNumber(number + 1); + setNumber(number + 1); + }} +> + +3 +</button> +``` + +Here is what this button's click handler tells React to do: + +1. `setNumber(number + 1)`: `number` is `0` so `setNumber(0 + 1)`. + - React prepares to change `number` to `1` on the next render. +2. `setNumber(number + 1)`: `number` is `0` so `setNumber(0 + 1)`. + - React prepares to change `number` to `1` on the next render. +3. `setNumber(number + 1)`: `number` is `0` so `setNumber(0 + 1)`. + - React prepares to change `number` to `1` on the next render. + +Even though you called `setNumber(number + 1)` three times, in _this render's_ event handler `number` is always `0`, so you set the state to `1` three times. This is why, after your event handler finishes, React re-renders the component with `number` equal to `1` rather than `3`. + +You can also visualize this by mentally substituting state variables with their values in your code. Since the `number` state variable is `0` for _this render_, its event handler looks like this: + +```js +<button + on_click={() => { + setNumber(0 + 1); + setNumber(0 + 1); + setNumber(0 + 1); + }} +> + +3 +</button> +``` + +For the next render, `number` is `1`, so _that render's_ click handler looks like this: + +```js +<button + on_click={() => { + setNumber(1 + 1); + setNumber(1 + 1); + setNumber(1 + 1); + }} +> + +3 +</button> +``` + +This is why clicking the button again will set the counter to `2`, then to `3` on the next click, and so on. + +## State over time + +Well, that was fun. Try to guess what clicking this button will alert: + +```js +import { useState } from "react"; + +export default function Counter() { + const [number, setNumber] = useState(0); + + return ( + <> + <h1>{number}</h1> + <button + on_click={() => { + setNumber(number + 5); + alert(number); + }} + > + +5 + </button> + </> + ); +} +``` + +```css +button { + display: inline-block; + margin: 10px; + font-size: 20px; +} +h1 { + display: inline-block; + margin: 10px; + width: 30px; + text-align: center; +} +``` + +If you use the substitution method from before, you can guess that the alert shows "0": + +```js +setNumber(0 + 5); +alert(0); +``` + +But what if you put a timer on the alert, so it only fires _after_ the component re-rendered? Would it say "0" or "5"? Have a guess! + +```js +import { useState } from "react"; + +export default function Counter() { + const [number, setNumber] = useState(0); + + return ( + <> + <h1>{number}</h1> + <button + on_click={() => { + setNumber(number + 5); + setTimeout(() => { + alert(number); + }, 3000); + }} + > + +5 + </button> + </> + ); +} +``` + +```css +button { + display: inline-block; + margin: 10px; + font-size: 20px; +} +h1 { + display: inline-block; + margin: 10px; + width: 30px; + text-align: center; +} +``` + +Surprised? If you use the substitution method, you can see the "snapshot" of the state passed to the alert. + +```js +setNumber(0 + 5); +setTimeout(() => { + alert(0); +}, 3000); +``` + +The state stored in React may have changed by the time the alert runs, but it was scheduled using a snapshot of the state at the time the user interacted with it! + +**A state variable's value never changes within a render,** even if its event handler's code is asynchronous. Inside _that render's_ `on_click`, the value of `number` continues to be `0` even after `setNumber(number + 5)` was called. Its value was "fixed" when React "took the snapshot" of the UI by calling your component. + +Here is an example of how that makes your event handlers less prone to timing mistakes. Below is a form that sends a message with a five-second delay. Imagine this scenario: + +1. You press the "Send" button, sending "Hello" to Alice. +2. Before the five-second delay ends, you change the value of the "To" field to "Bob". + +What do you expect the `alert` to display? Would it display, "You said Hello to Alice"? Or would it display, "You said Hello to Bob"? Make a guess based on what you know, and then try it: + +```js +import { useState } from "react"; + +export default function Form() { + const [to, setTo] = useState("Alice"); + const [message, setMessage] = useState("Hello"); + + function handleSubmit(e) { + e.preventDefault(); + setTimeout(() => { + alert(`You said ${message} to ${to}`); + }, 5000); + } + + return ( + <form onSubmit={handleSubmit}> + <label> + To:{" "} + <select value={to} onChange={(e) => setTo(e.target.value)}> + <option value="Alice">Alice</option> + <option value="Bob">Bob</option> + </select> + </label> + <textarea + placeholder="Message" + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + <button type="submit">Send</button> + </form> + ); +} +``` + +```css +label, +textarea { + margin-bottom: 10px; + display: block; +} +``` + +**React keeps the state values "fixed" within one render's event handlers.** You don't need to worry whether the state has changed while the code is running. + +But what if you wanted to read the latest state before a re-render? You'll want to use a [state updater function](/learn/queueing-a-series-of-state-updates), covered on the next page! + +<Recap> + +- Setting state requests a new render. +- React stores state outside of your component, as if on a shelf. +- When you call `useState`, React gives you a snapshot of the state _for that render_. +- Variables and event handlers don't "survive" re-renders. Every render has its own event handlers. +- Every render (and functions inside it) will always "see" the snapshot of the state that React gave to _that_ render. +- You can mentally substitute state in event handlers, similarly to how you think about the rendered JSX. +- Event handlers created in the past have the state values from the render in which they were created. + +</Recap> + +<Challenges> + +#### Implement a traffic light + +Here is a crosswalk light component that toggles when the button is pressed: + +```js +import { useState } from "react"; + +export default function TrafficLight() { + const [walk, setWalk] = useState(true); + + function handleClick() { + setWalk(!walk); + } + + return ( + <> + <button on_click={handleClick}> + Change to {walk ? "Stop" : "Walk"} + </button> + <h1 + style={{ + color: walk ? "darkgreen" : "darkred", + }} + > + {walk ? "Walk" : "Stop"} + </h1> + </> + ); +} +``` + +```css +h1 { + margin-top: 20px; +} +``` + +Add an `alert` to the click handler. When the light is green and says "Walk", clicking the button should say "Stop is next". When the light is red and says "Stop", clicking the button should say "Walk is next". + +Does it make a difference whether you put the `alert` before or after the `setWalk` call? + +<Solution> + +Your `alert` should look like this: + +```js +import { useState } from "react"; + +export default function TrafficLight() { + const [walk, setWalk] = useState(true); + + function handleClick() { + setWalk(!walk); + alert(walk ? "Stop is next" : "Walk is next"); + } + + return ( + <> + <button on_click={handleClick}> + Change to {walk ? "Stop" : "Walk"} + </button> + <h1 + style={{ + color: walk ? "darkgreen" : "darkred", + }} + > + {walk ? "Walk" : "Stop"} + </h1> + </> + ); +} +``` + +```css +h1 { + margin-top: 20px; +} +``` + +Whether you put it before or after the `setWalk` call makes no difference. That render's value of `walk` is fixed. Calling `setWalk` will only change it for the _next_ render, but will not affect the event handler from the previous render. + +This line might seem counter-intuitive at first: + +```js +alert(walk ? "Stop is next" : "Walk is next"); +``` + +But it makes sense if you read it as: "If the traffic light shows 'Walk now', the message should say 'Stop is next.'" The `walk` variable inside your event handler matches that render's value of `walk` and does not change. + +You can verify that this is correct by applying the substitution method. When `walk` is `true`, you get: + +```js +<button on_click={() => { + setWalk(false); + alert('Stop is next'); +}}> + Change to Stop +</button> +<h1 style={{color: 'darkgreen'}}> + Walk +</h1> +``` + +So clicking "Change to Stop" queues a render with `walk` set to `false`, and alerts "Stop is next". + +</Solution> + +</Challenges> diff --git a/docs/src/learn/synchronizing-with-effects.md b/docs/src/learn/synchronizing-with-effects.md new file mode 100644 index 000000000..7ebfeb240 --- /dev/null +++ b/docs/src/learn/synchronizing-with-effects.md @@ -0,0 +1,1550 @@ +--- +title: "Synchronizing with Effects 🚧" +--- + +## Overview + +<p class="intro" markdown> + +Some components need to synchronize with external systems. For example, you might want to control a non-React component based on the React state, set up a server connection, or send an analytics log when a component appears on the screen. _Effects_ let you run some code after rendering so that you can synchronize your component with some system outside of React. + +</p> + +!!! summary "You Will Learn" + + - What Effects are + - How Effects are different from events + - How to declare an Effect in your component + - How to skip re-running an Effect unnecessarily + - Why Effects run twice in development and how to fix them + +## What are Effects and how are they different from events? + +Before getting to Effects, you need to be familiar with two types of logic inside React components: + +- **Rendering code** (introduced in [Describing the UI](/learn/describing-the-ui)) lives at the top level of your component. This is where you take the props and state, transform them, and return the JSX you want to see on the screen. [Rendering code must be pure.](/learn/keeping-components-pure) Like a math formula, it should only _calculate_ the result, but not do anything else. + +- **Event handlers** (introduced in [Adding Interactivity](/learn/adding-interactivity)) are nested functions inside your components that _do_ things rather than just calculate them. An event handler might update an input field, submit an HTTP POST request to buy a product, or navigate the user to another screen. Event handlers contain ["side effects"](<https://en.wikipedia.org/wiki/Side_effect_(computer_science)>) (they change the program's state) caused by a specific user action (for example, a button click or typing). + +Sometimes this isn't enough. Consider a `ChatRoom` component that must connect to the chat server whenever it's visible on the screen. Connecting to a server is not a pure calculation (it's a side effect) so it can't happen during rendering. However, there is no single particular event like a click that causes `ChatRoom` to be displayed. + +**_Effects_ let you specify side effects that are caused by rendering itself, rather than by a particular event.** Sending a message in the chat is an _event_ because it is directly caused by the user clicking a specific button. However, setting up a server connection is an _Effect_ because it should happen no matter which interaction caused the component to appear. Effects run at the end of a [commit](/learn/render-and-commit) after the screen updates. This is a good time to synchronize the React components with some external system (like network or a third-party library). + +<Note> + +Here and later in this text, capitalized "Effect" refers to the React-specific definition above, i.e. a side effect caused by rendering. To refer to the broader programming concept, we'll say "side effect". + +</Note> + +## You might not need an Effect + +**Don't rush to add Effects to your components.** Keep in mind that Effects are typically used to "step out" of your React code and synchronize with some _external_ system. This includes browser APIs, third-party widgets, network, and so on. If your Effect only adjusts some state based on other state, [you might not need an Effect.](/learn/you-might-not-need-an-effect) + +## How to write an Effect + +To write an Effect, follow these three steps: + +1. **Declare an Effect.** By default, your Effect will run after every render. +2. **Specify the Effect dependencies.** Most Effects should only re-run _when needed_ rather than after every render. For example, a fade-in animation should only trigger when a component appears. Connecting and disconnecting to a chat room should only happen when the component appears and disappears, or when the chat room changes. You will learn how to control this by specifying _dependencies._ +3. **Add cleanup if needed.** Some Effects need to specify how to stop, undo, or clean up whatever they were doing. For example, "connect" needs "disconnect", "subscribe" needs "unsubscribe", and "fetch" needs either "cancel" or "ignore". You will learn how to do this by returning a _cleanup function_. + +Let's look at each of these steps in detail. + +### Step 1: Declare an Effect + +To declare an Effect in your component, import the [`useEffect` Hook](/reference/react/useEffect) from React: + +```js +import { useEffect } from "react"; +``` + +Then, call it at the top level of your component and put some code inside your Effect: + +```js +function MyComponent() { + useEffect(() => { + // Code here will run after *every* render + }); + return <div />; +} +``` + +Every time your component renders, React will update the screen _and then_ run the code inside `useEffect`. In other words, **`useEffect` "delays" a piece of code from running until that render is reflected on the screen.** + +Let's see how you can use an Effect to synchronize with an external system. Consider a `<VideoPlayer>` React component. It would be nice to control whether it's playing or paused by passing an `isPlaying` prop to it: + +```js +<VideoPlayer isPlaying={isPlaying} /> +``` + +Your custom `VideoPlayer` component renders the built-in browser [`<video>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video) tag: + +```js +function VideoPlayer({ src, isPlaying }) { + // TODO: do something with isPlaying + return <video src={src} />; +} +``` + +However, the browser `<video>` tag does not have an `isPlaying` prop. The only way to control it is to manually call the [`play()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play) and [`pause()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause) methods on the DOM element. **You need to synchronize the value of `isPlaying` prop, which tells whether the video _should_ currently be playing, with calls like `play()` and `pause()`.** + +We'll need to first [get a ref](/learn/manipulating-the-dom-with-refs) to the `<video>` DOM node. + +You might be tempted to try to call `play()` or `pause()` during rendering, but that isn't correct: + +```js +import { useState, useRef, useEffect } from "react"; + +function VideoPlayer({ src, isPlaying }) { + const ref = useRef(null); + + if (isPlaying) { + ref.current.play(); // Calling these while rendering isn't allowed. + } else { + ref.current.pause(); // Also, this crashes. + } + + return <video ref={ref} src={src} loop playsInline />; +} + +export default function App() { + const [isPlaying, setIsPlaying] = useState(false); + return ( + <> + <button on_click={() => setIsPlaying(!isPlaying)}> + {isPlaying ? "Pause" : "Play"} + </button> + <VideoPlayer + isPlaying={isPlaying} + src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4" + /> + </> + ); +} +``` + +```css +button { + display: block; + margin-bottom: 20px; +} +video { + width: 250px; +} +``` + +The reason this code isn't correct is that it tries to do something with the DOM node during rendering. In React, [rendering should be a pure calculation](/learn/keeping-components-pure) of JSX and should not contain side effects like modifying the DOM. + +Moreover, when `VideoPlayer` is called for the first time, its DOM does not exist yet! There isn't a DOM node yet to call `play()` or `pause()` on, because React doesn't know what DOM to create until you return the JSX. + +The solution here is to **wrap the side effect with `useEffect` to move it out of the rendering calculation:** + +```js +import { useEffect, useRef } from "react"; + +function VideoPlayer({ src, isPlaying }) { + const ref = useRef(null); + + useEffect(() => { + if (isPlaying) { + ref.current.play(); + } else { + ref.current.pause(); + } + }); + + return <video ref={ref} src={src} loop playsInline />; +} +``` + +By wrapping the DOM update in an Effect, you let React update the screen first. Then your Effect runs. + +When your `VideoPlayer` component renders (either the first time or if it re-renders), a few things will happen. First, React will update the screen, ensuring the `<video>` tag is in the DOM with the right props. Then React will run your Effect. Finally, your Effect will call `play()` or `pause()` depending on the value of `isPlaying`. + +Press Play/Pause multiple times and see how the video player stays synchronized to the `isPlaying` value: + +```js +import { useState, useRef, useEffect } from "react"; + +function VideoPlayer({ src, isPlaying }) { + const ref = useRef(null); + + useEffect(() => { + if (isPlaying) { + ref.current.play(); + } else { + ref.current.pause(); + } + }); + + return <video ref={ref} src={src} loop playsInline />; +} + +export default function App() { + const [isPlaying, setIsPlaying] = useState(false); + return ( + <> + <button on_click={() => setIsPlaying(!isPlaying)}> + {isPlaying ? "Pause" : "Play"} + </button> + <VideoPlayer + isPlaying={isPlaying} + src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4" + /> + </> + ); +} +``` + +```css +button { + display: block; + margin-bottom: 20px; +} +video { + width: 250px; +} +``` + +In this example, the "external system" you synchronized to React state was the browser media API. You can use a similar approach to wrap legacy non-React code (like jQuery plugins) into declarative React components. + +Note that controlling a video player is much more complex in practice. Calling `play()` may fail, the user might play or pause using the built-in browser controls, and so on. This example is very simplified and incomplete. + +<Pitfall> + +By default, Effects run after _every_ render. This is why code like this will **produce an infinite loop:** + +```js +const [count, setCount] = useState(0); +useEffect(() => { + setCount(count + 1); +}); +``` + +Effects run as a _result_ of rendering. Setting state _triggers_ rendering. Setting state immediately in an Effect is like plugging a power outlet into itself. The Effect runs, it sets the state, which causes a re-render, which causes the Effect to run, it sets the state again, this causes another re-render, and so on. + +Effects should usually synchronize your components with an _external_ system. If there's no external system and you only want to adjust some state based on other state, [you might not need an Effect.](/learn/you-might-not-need-an-effect) + +</Pitfall> + +### Step 2: Specify the Effect dependencies + +By default, Effects run after _every_ render. Often, this is **not what you want:** + +- Sometimes, it's slow. Synchronizing with an external system is not always instant, so you might want to skip doing it unless it's necessary. For example, you don't want to reconnect to the chat server on every keystroke. +- Sometimes, it's wrong. For example, you don't want to trigger a component fade-in animation on every keystroke. The animation should only play once when the component appears for the first time. + +To demonstrate the issue, here is the previous example with a few `console.log` calls and a text input that updates the parent component's state. Notice how typing causes the Effect to re-run: + +```js +import { useState, useRef, useEffect } from "react"; + +function VideoPlayer({ src, isPlaying }) { + const ref = useRef(null); + + useEffect(() => { + if (isPlaying) { + console.log("Calling video.play()"); + ref.current.play(); + } else { + console.log("Calling video.pause()"); + ref.current.pause(); + } + }); + + return <video ref={ref} src={src} loop playsInline />; +} + +export default function App() { + const [isPlaying, setIsPlaying] = useState(false); + const [text, setText] = useState(""); + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <button on_click={() => setIsPlaying(!isPlaying)}> + {isPlaying ? "Pause" : "Play"} + </button> + <VideoPlayer + isPlaying={isPlaying} + src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4" + /> + </> + ); +} +``` + +```css +input, +button { + display: block; + margin-bottom: 20px; +} +video { + width: 250px; +} +``` + +You can tell React to **skip unnecessarily re-running the Effect** by specifying an array of _dependencies_ as the second argument to the `useEffect` call. Start by adding an empty `[]` array to the above example on line 14: + +```js +useEffect(() => { + // ... +}, []); +``` + +You should see an error saying `React Hook useEffect has a missing dependency: 'isPlaying'`: + +```js +import { useState, useRef, useEffect } from "react"; + +function VideoPlayer({ src, isPlaying }) { + const ref = useRef(null); + + useEffect(() => { + if (isPlaying) { + console.log("Calling video.play()"); + ref.current.play(); + } else { + console.log("Calling video.pause()"); + ref.current.pause(); + } + }, []); // This causes an error + + return <video ref={ref} src={src} loop playsInline />; +} + +export default function App() { + const [isPlaying, setIsPlaying] = useState(false); + const [text, setText] = useState(""); + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <button on_click={() => setIsPlaying(!isPlaying)}> + {isPlaying ? "Pause" : "Play"} + </button> + <VideoPlayer + isPlaying={isPlaying} + src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4" + /> + </> + ); +} +``` + +```css +input, +button { + display: block; + margin-bottom: 20px; +} +video { + width: 250px; +} +``` + +The problem is that the code inside of your Effect _depends on_ the `isPlaying` prop to decide what to do, but this dependency was not explicitly declared. To fix this issue, add `isPlaying` to the dependency array: + +```js +useEffect(() => { + if (isPlaying) { + // It's used here... + // ... + } else { + // ... + } +}, [isPlaying]); // ...so it must be declared here! +``` + +Now all dependencies are declared, so there is no error. Specifying `[isPlaying]` as the dependency array tells React that it should skip re-running your Effect if `isPlaying` is the same as it was during the previous render. With this change, typing into the input doesn't cause the Effect to re-run, but pressing Play/Pause does: + +```js +import { useState, useRef, useEffect } from "react"; + +function VideoPlayer({ src, isPlaying }) { + const ref = useRef(null); + + useEffect(() => { + if (isPlaying) { + console.log("Calling video.play()"); + ref.current.play(); + } else { + console.log("Calling video.pause()"); + ref.current.pause(); + } + }, [isPlaying]); + + return <video ref={ref} src={src} loop playsInline />; +} + +export default function App() { + const [isPlaying, setIsPlaying] = useState(false); + const [text, setText] = useState(""); + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <button on_click={() => setIsPlaying(!isPlaying)}> + {isPlaying ? "Pause" : "Play"} + </button> + <VideoPlayer + isPlaying={isPlaying} + src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4" + /> + </> + ); +} +``` + +```css +input, +button { + display: block; + margin-bottom: 20px; +} +video { + width: 250px; +} +``` + +The dependency array can contain multiple dependencies. React will only skip re-running the Effect if _all_ of the dependencies you specify have exactly the same values as they had during the previous render. React compares the dependency values using the [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison. See the [`useEffect` reference](/reference/react/useEffect#reference) for details. + +**Notice that you can't "choose" your dependencies.** You will get a lint error if the dependencies you specified don't match what React expects based on the code inside your Effect. This helps catch many bugs in your code. If you don't want some code to re-run, [_edit the Effect code itself_ to not "need" that dependency.](/learn/lifecycle-of-reactive-effects#what-to-do-when-you-dont-want-to-re-synchronize) + +<Pitfall> + +The behaviors without the dependency array and with an _empty_ `[]` dependency array are different: + +```js +useEffect(() => { + // This runs after every render +}); + +useEffect(() => { + // This runs only on mount (when the component appears) +}, []); + +useEffect(() => { + // This runs on mount *and also* if either a or b have changed since the last render +}, [a, b]); +``` + +We'll take a close look at what "mount" means in the next step. + +</Pitfall> + +<DeepDive> + +#### Why was the ref omitted from the dependency array? + +This Effect uses _both_ `ref` and `isPlaying`, but only `isPlaying` is declared as a dependency: + +```js +function VideoPlayer({ src, isPlaying }) { + const ref = useRef(null); + useEffect(() => { + if (isPlaying) { + ref.current.play(); + } else { + ref.current.pause(); + } + }, [isPlaying]); +``` + +This is because the `ref` object has a _stable identity:_ React guarantees [you'll always get the same object](/reference/react/useRef#returns) from the same `useRef` call on every render. It never changes, so it will never by itself cause the Effect to re-run. Therefore, it does not matter whether you include it or not. Including it is fine too: + +```js +function VideoPlayer({ src, isPlaying }) { + const ref = useRef(null); + useEffect(() => { + if (isPlaying) { + ref.current.play(); + } else { + ref.current.pause(); + } + }, [isPlaying, ref]); +``` + +The [`set` functions](/reference/react/useState#setstate) returned by `useState` also have stable identity, so you will often see them omitted from the dependencies too. If the linter lets you omit a dependency without errors, it is safe to do. + +Omitting always-stable dependencies only works when the linter can "see" that the object is stable. For example, if `ref` was passed from a parent component, you would have to specify it in the dependency array. However, this is good because you can't know whether the parent component always passes the same ref, or passes one of several refs conditionally. So your Effect _would_ depend on which ref is passed. + +</DeepDive> + +### Step 3: Add cleanup if needed + +Consider a different example. You're writing a `ChatRoom` component that needs to connect to the chat server when it appears. You are given a `createConnection()` API that returns an object with `connect()` and `disconnect()` methods. How do you keep the component connected while it is displayed to the user? + +Start by writing the Effect logic: + +```js +useEffect(() => { + const connection = createConnection(); + connection.connect(); +}); +``` + +It would be slow to connect to the chat after every re-render, so you add the dependency array: + +```js +useEffect(() => { + const connection = createConnection(); + connection.connect(); +}, []); +``` + +**The code inside the Effect does not use any props or state, so your dependency array is `[]` (empty). This tells React to only run this code when the component "mounts", i.e. appears on the screen for the first time.** + +Let's try running this code: + +```js +import { useEffect } from "react"; +import { createConnection } from "./chat.js"; + +export default function ChatRoom() { + useEffect(() => { + const connection = createConnection(); + connection.connect(); + }, []); + return <h1>Welcome to the chat!</h1>; +} +``` + +```js +export function createConnection() { + // A real implementation would actually connect to the server + return { + connect() { + console.log("✅ Connecting..."); + }, + disconnect() { + console.log("❌ Disconnected."); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +``` + +This Effect only runs on mount, so you might expect `"✅ Connecting..."` to be printed once in the console. **However, if you check the console, `"✅ Connecting..."` gets printed twice. Why does it happen?** + +Imagine the `ChatRoom` component is a part of a larger app with many different screens. The user starts their journey on the `ChatRoom` page. The component mounts and calls `connection.connect()`. Then imagine the user navigates to another screen--for example, to the Settings page. The `ChatRoom` component unmounts. Finally, the user clicks Back and `ChatRoom` mounts again. This would set up a second connection--but the first connection was never destroyed! As the user navigates across the app, the connections would keep piling up. + +Bugs like this are easy to miss without extensive manual testing. To help you spot them quickly, in development React remounts every component once immediately after its initial mount. + +Seeing the `"✅ Connecting..."` log twice helps you notice the real issue: your code doesn't close the connection when the component unmounts. + +To fix the issue, return a _cleanup function_ from your Effect: + +```js +useEffect(() => { + const connection = createConnection(); + connection.connect(); + return () => { + connection.disconnect(); + }; +}, []); +``` + +React will call your cleanup function each time before the Effect runs again, and one final time when the component unmounts (gets removed). Let's see what happens when the cleanup function is implemented: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +export default function ChatRoom() { + useEffect(() => { + const connection = createConnection(); + connection.connect(); + return () => connection.disconnect(); + }, []); + return <h1>Welcome to the chat!</h1>; +} +``` + +```js +export function createConnection() { + // A real implementation would actually connect to the server + return { + connect() { + console.log("✅ Connecting..."); + }, + disconnect() { + console.log("❌ Disconnected."); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +``` + +Now you get three console logs in development: + +1. `"✅ Connecting..."` +2. `"❌ Disconnected."` +3. `"✅ Connecting..."` + +**This is the correct behavior in development.** By remounting your component, React verifies that navigating away and back would not break your code. Disconnecting and then connecting again is exactly what should happen! When you implement the cleanup well, there should be no user-visible difference between running the Effect once vs running it, cleaning it up, and running it again. There's an extra connect/disconnect call pair because React is probing your code for bugs in development. This is normal--don't try to make it go away! + +**In production, you would only see `"✅ Connecting..."` printed once.** Remounting components only happens in development to help you find Effects that need cleanup. You can turn off [Strict Mode](/reference/react/StrictMode) to opt out of the development behavior, but we recommend keeping it on. This lets you find many bugs like the one above. + +## How to handle the Effect firing twice in development? + +React intentionally remounts your components in development to find bugs like in the last example. **The right question isn't "how to run an Effect once", but "how to fix my Effect so that it works after remounting".** + +Usually, the answer is to implement the cleanup function. The cleanup function should stop or undo whatever the Effect was doing. The rule of thumb is that the user shouldn't be able to distinguish between the Effect running once (as in production) and a _setup → cleanup → setup_ sequence (as you'd see in development). + +Most of the Effects you'll write will fit into one of the common patterns below. + +### Controlling non-React widgets + +Sometimes you need to add UI widgets that aren't written to React. For example, let's say you're adding a map component to your page. It has a `setZoomLevel()` method, and you'd like to keep the zoom level in sync with a `zoomLevel` state variable in your React code. Your Effect would look similar to this: + +```js +useEffect(() => { + const map = mapRef.current; + map.setZoomLevel(zoomLevel); +}, [zoomLevel]); +``` + +Note that there is no cleanup needed in this case. In development, React will call the Effect twice, but this is not a problem because calling `setZoomLevel` twice with the same value does not do anything. It may be slightly slower, but this doesn't matter because it won't remount needlessly in production. + +Some APIs may not allow you to call them twice in a row. For example, the [`showModal`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/showModal) method of the built-in [`<dialog>`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement) element throws if you call it twice. Implement the cleanup function and make it close the dialog: + +```js +useEffect(() => { + const dialog = dialogRef.current; + dialog.showModal(); + return () => dialog.close(); +}, []); +``` + +In development, your Effect will call `showModal()`, then immediately `close()`, and then `showModal()` again. This has the same user-visible behavior as calling `showModal()` once, as you would see in production. + +### Subscribing to events + +If your Effect subscribes to something, the cleanup function should unsubscribe: + +```js +useEffect(() => { + function handleScroll(e) { + console.log(window.scrollX, window.scrollY); + } + window.addEventListener("scroll", handleScroll); + return () => window.removeEventListener("scroll", handleScroll); +}, []); +``` + +In development, your Effect will call `addEventListener()`, then immediately `removeEventListener()`, and then `addEventListener()` again with the same handler. So there would be only one active subscription at a time. This has the same user-visible behavior as calling `addEventListener()` once, as in production. + +### Triggering animations + +If your Effect animates something in, the cleanup function should reset the animation to the initial values: + +```js +useEffect(() => { + const node = ref.current; + node.style.opacity = 1; // Trigger the animation + return () => { + node.style.opacity = 0; // Reset to the initial value + }; +}, []); +``` + +In development, opacity will be set to `1`, then to `0`, and then to `1` again. This should have the same user-visible behavior as setting it to `1` directly, which is what would happen in production. If you use a third-party animation library with support for tweening, your cleanup function should reset the timeline to its initial state. + +### Fetching data + +If your Effect fetches something, the cleanup function should either [abort the fetch](https://developer.mozilla.org/en-US/docs/Web/API/AbortController) or ignore its result: + +```js +useEffect(() => { + let ignore = false; + + async function startFetching() { + const json = await fetchTodos(userId); + if (!ignore) { + setTodos(json); + } + } + + startFetching(); + + return () => { + ignore = true; + }; +}, [userId]); +``` + +You can't "undo" a network request that already happened, but your cleanup function should ensure that the fetch that's _not relevant anymore_ does not keep affecting your application. If the `userId` changes from `'Alice'` to `'Bob'`, cleanup ensures that the `'Alice'` response is ignored even if it arrives after `'Bob'`. + +**In development, you will see two fetches in the Network tab.** There is nothing wrong with that. With the approach above, the first Effect will immediately get cleaned up so its copy of the `ignore` variable will be set to `true`. So even though there is an extra request, it won't affect the state thanks to the `if (!ignore)` check. + +**In production, there will only be one request.** If the second request in development is bothering you, the best approach is to use a solution that deduplicates requests and caches their responses between components: + +```js +function TodoList() { + const todos = useSomeDataLibrary(`/api/user/${userId}/todos`); + // ... +``` + +This will not only improve the development experience, but also make your application feel faster. For example, the user pressing the Back button won't have to wait for some data to load again because it will be cached. You can either build such a cache yourself or use one of the many alternatives to manual fetching in Effects. + +<DeepDive> + +#### What are good alternatives to data fetching in Effects? + +Writing `fetch` calls inside Effects is a [popular way to fetch data](https://www.robinwieruch.de/react-hooks-fetch-data/), especially in fully client-side apps. This is, however, a very manual approach and it has significant downsides: + +- **Effects don't run on the server.** This means that the initial server-rendered HTML will only include a loading state with no data. The client computer will have to download all JavaScript and render your app only to discover that now it needs to load the data. This is not very efficient. +- **Fetching directly in Effects makes it easy to create "network waterfalls".** You render the parent component, it fetches some data, renders the child components, and then they start fetching their data. If the network is not very fast, this is significantly slower than fetching all data in parallel. +- **Fetching directly in Effects usually means you don't preload or cache data.** For example, if the component unmounts and then mounts again, it would have to fetch the data again. +- **It's not very ergonomic.** There's quite a bit of boilerplate code involved when writing `fetch` calls in a way that doesn't suffer from bugs like [race conditions.](https://maxrozen.com/race-conditions-fetching-data-react-with-useeffect) + +This list of downsides is not specific to React. It applies to fetching data on mount with any library. Like with routing, data fetching is not trivial to do well, so we recommend the following approaches: + +- **If you use a [framework](/learn/start-a-new-react-project#production-grade-react-frameworks), use its built-in data fetching mechanism.** Modern React frameworks have integrated data fetching mechanisms that are efficient and don't suffer from the above pitfalls. +- **Otherwise, consider using or building a client-side cache.** Popular open source solutions include [React Query](https://tanstack.com/query/latest), [useSWR](https://swr.vercel.app/), and [React Router 6.4+.](https://beta.reactrouter.com/en/main/start/overview) You can build your own solution too, in which case you would use Effects under the hood, but add logic for deduplicating requests, caching responses, and avoiding network waterfalls (by preloading data or hoisting data requirements to routes). + +You can continue fetching data directly in Effects if neither of these approaches suit you. + +</DeepDive> + +### Sending analytics + +Consider this code that sends an analytics event on the page visit: + +```js +useEffect(() => { + logVisit(url); // Sends a POST request +}, [url]); +``` + +In development, `logVisit` will be called twice for every URL, so you might be tempted to try to fix that. **We recommend keeping this code as is.** Like with earlier examples, there is no _user-visible_ behavior difference between running it once and running it twice. From a practical point of view, `logVisit` should not do anything in development because you don't want the logs from the development machines to skew the production metrics. Your component remounts every time you save its file, so it logs extra visits in development anyway. + +**In production, there will be no duplicate visit logs.** + +To debug the analytics events you're sending, you can deploy your app to a staging environment (which runs in production mode) or temporarily opt out of [Strict Mode](/reference/react/StrictMode) and its development-only remounting checks. You may also send analytics from the route change event handlers instead of Effects. For more precise analytics, [intersection observers](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) can help track which components are in the viewport and how long they remain visible. + +### Not an Effect: Initializing the application + +Some logic should only run once when the application starts. You can put it outside your components: + +```js +if (typeof window !== "undefined") { + // Check if we're running in the browser. + checkAuthToken(); + loadDataFromLocalStorage(); +} + +function App() { + // ... +} +``` + +This guarantees that such logic only runs once after the browser loads the page. + +### Not an Effect: Buying a product + +Sometimes, even if you write a cleanup function, there's no way to prevent user-visible consequences of running the Effect twice. For example, maybe your Effect sends a POST request like buying a product: + +```js +useEffect(() => { + // 🔴 Wrong: This Effect fires twice in development, exposing a problem in the code. + fetch("/api/buy", { method: "POST" }); +}, []); +``` + +You wouldn't want to buy the product twice. However, this is also why you shouldn't put this logic in an Effect. What if the user goes to another page and then presses Back? Your Effect would run again. You don't want to buy the product when the user _visits_ a page; you want to buy it when the user _clicks_ the Buy button. + +Buying is not caused by rendering; it's caused by a specific interaction. It should run only when the user presses the button. **Delete the Effect and move your `/api/buy` request into the Buy button event handler:** + +```js +function handleClick() { + // ✅ Buying is an event because it is caused by a particular interaction. + fetch("/api/buy", { method: "POST" }); +} +``` + +**This illustrates that if remounting breaks the logic of your application, this usually uncovers existing bugs.** From the user's perspective, visiting a page shouldn't be different from visiting it, clicking a link, and pressing Back. React verifies that your components abide by this principle by remounting them once in development. + +## Putting it all together + +This playground can help you "get a feel" for how Effects work in practice. + +This example uses [`setTimeout`](https://developer.mozilla.org/en-US/docs/Web/API/setTimeout) to schedule a console log with the input text to appear three seconds after the Effect runs. The cleanup function cancels the pending timeout. Start by pressing "Mount the component": + +```js +import { useState, useEffect } from "react"; + +function Playground() { + const [text, setText] = useState("a"); + + useEffect(() => { + function onTimeout() { + console.log("⏰ " + text); + } + + console.log('🔵 Schedule "' + text + '" log'); + const timeoutId = setTimeout(onTimeout, 3000); + + return () => { + console.log('🟡 Cancel "' + text + '" log'); + clearTimeout(timeoutId); + }; + }, [text]); + + return ( + <> + <label> + What to log:{" "} + <input value={text} onChange={(e) => setText(e.target.value)} /> + </label> + <h1>{text}</h1> + </> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button on_click={() => setShow(!show)}> + {show ? "Unmount" : "Mount"} the component + </button> + {show && <hr />} + {show && <Playground />} + </> + ); +} +``` + +You will see three logs at first: `Schedule "a" log`, `Cancel "a" log`, and `Schedule "a" log` again. Three second later there will also be a log saying `a`. As you learned earlier, the extra schedule/cancel pair is because React remounts the component once in development to verify that you've implemented cleanup well. + +Now edit the input to say `abc`. If you do it fast enough, you'll see `Schedule "ab" log` immediately followed by `Cancel "ab" log` and `Schedule "abc" log`. **React always cleans up the previous render's Effect before the next render's Effect.** This is why even if you type into the input fast, there is at most one timeout scheduled at a time. Edit the input a few times and watch the console to get a feel for how Effects get cleaned up. + +Type something into the input and then immediately press "Unmount the component". Notice how unmounting cleans up the last render's Effect. Here, it clears the last timeout before it has a chance to fire. + +Finally, edit the component above and comment out the cleanup function so that the timeouts don't get cancelled. Try typing `abcde` fast. What do you expect to happen in three seconds? Will `console.log(text)` inside the timeout print the _latest_ `text` and produce five `abcde` logs? Give it a try to check your intuition! + +Three seconds later, you should see a sequence of logs (`a`, `ab`, `abc`, `abcd`, and `abcde`) rather than five `abcde` logs. **Each Effect "captures" the `text` value from its corresponding render.** It doesn't matter that the `text` state changed: an Effect from the render with `text = 'ab'` will always see `'ab'`. In other words, Effects from each render are isolated from each other. If you're curious how this works, you can read about [closures](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures). + +<DeepDive> + +#### Each render has its own Effects + +You can think of `useEffect` as "attaching" a piece of behavior to the render output. Consider this Effect: + +```js +export default function ChatRoom({ roomId }) { + useEffect(() => { + const connection = createConnection(roomId); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + + return <h1>Welcome to {roomId}!</h1>; +} +``` + +Let's see what exactly happens as the user navigates around the app. + +#### Initial render + +The user visits `<ChatRoom roomId="general" />`. Let's [mentally substitute](/learn/state-as-a-snapshot#rendering-takes-a-snapshot-in-time) `roomId` with `'general'`: + +```js +// JSX for the first render (roomId = "general") +return <h1>Welcome to general!</h1>; +``` + +**The Effect is _also_ a part of the rendering output.** The first render's Effect becomes: + +```js +// Effect for the first render (roomId = "general") +() => { + const connection = createConnection("general"); + connection.connect(); + return () => connection.disconnect(); +}, + // Dependencies for the first render (roomId = "general") + ["general"]; +``` + +React runs this Effect, which connects to the `'general'` chat room. + +#### Re-render with same dependencies + +Let's say `<ChatRoom roomId="general" />` re-renders. The JSX output is the same: + +```js +// JSX for the second render (roomId = "general") +return <h1>Welcome to general!</h1>; +``` + +React sees that the rendering output has not changed, so it doesn't update the DOM. + +The Effect from the second render looks like this: + +```js +// Effect for the second render (roomId = "general") +() => { + const connection = createConnection("general"); + connection.connect(); + return () => connection.disconnect(); +}, + // Dependencies for the second render (roomId = "general") + ["general"]; +``` + +React compares `['general']` from the second render with `['general']` from the first render. **Because all dependencies are the same, React _ignores_ the Effect from the second render.** It never gets called. + +#### Re-render with different dependencies + +Then, the user visits `<ChatRoom roomId="travel" />`. This time, the component returns different JSX: + +```js +// JSX for the third render (roomId = "travel") +return <h1>Welcome to travel!</h1>; +``` + +React updates the DOM to change `"Welcome to general"` into `"Welcome to travel"`. + +The Effect from the third render looks like this: + +```js +// Effect for the third render (roomId = "travel") +() => { + const connection = createConnection("travel"); + connection.connect(); + return () => connection.disconnect(); +}, + // Dependencies for the third render (roomId = "travel") + ["travel"]; +``` + +React compares `['travel']` from the third render with `['general']` from the second render. One dependency is different: `Object.is('travel', 'general')` is `false`. The Effect can't be skipped. + +**Before React can apply the Effect from the third render, it needs to clean up the last Effect that _did_ run.** The second render's Effect was skipped, so React needs to clean up the first render's Effect. If you scroll up to the first render, you'll see that its cleanup calls `disconnect()` on the connection that was created with `createConnection('general')`. This disconnects the app from the `'general'` chat room. + +After that, React runs the third render's Effect. It connects to the `'travel'` chat room. + +#### Unmount + +Finally, let's say the user navigates away, and the `ChatRoom` component unmounts. React runs the last Effect's cleanup function. The last Effect was from the third render. The third render's cleanup destroys the `createConnection('travel')` connection. So the app disconnects from the `'travel'` room. + +#### Development-only behaviors + +When [Strict Mode](/reference/react/StrictMode) is on, React remounts every component once after mount (state and DOM are preserved). This [helps you find Effects that need cleanup](#step-3-add-cleanup-if-needed) and exposes bugs like race conditions early. Additionally, React will remount the Effects whenever you save a file in development. Both of these behaviors are development-only. + +</DeepDive> + +<Recap> + +- Unlike events, Effects are caused by rendering itself rather than a particular interaction. +- Effects let you synchronize a component with some external system (third-party API, network, etc). +- By default, Effects run after every render (including the initial one). +- React will skip the Effect if all of its dependencies have the same values as during the last render. +- You can't "choose" your dependencies. They are determined by the code inside the Effect. +- Empty dependency array (`[]`) corresponds to the component "mounting", i.e. being added to the screen. +- In Strict Mode, React mounts components twice (in development only!) to stress-test your Effects. +- If your Effect breaks because of remounting, you need to implement a cleanup function. +- React will call your cleanup function before the Effect runs next time, and during the unmount. + +</Recap> + +<Challenges> + +#### Focus a field on mount + +In this example, the form renders a `<MyInput />` component. + +Use the input's [`focus()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus) method to make `MyInput` automatically focus when it appears on the screen. There is already a commented out implementation, but it doesn't quite work. Figure out why it doesn't work, and fix it. (If you're familiar with the `autoFocus` attribute, pretend that it does not exist: we are reimplementing the same functionality from scratch.) + +```js +import { useEffect, useRef } from "react"; + +export default function MyInput({ value, onChange }) { + const ref = useRef(null); + + // TODO: This doesn't quite work. Fix it. + // ref.current.focus() + + return <input ref={ref} value={value} onChange={onChange} />; +} +``` + +```js +import { useState } from "react"; +import MyInput from "./MyInput.js"; + +export default function Form() { + const [show, setShow] = useState(false); + const [name, setName] = useState("Taylor"); + const [upper, setUpper] = useState(false); + return ( + <> + <button on_click={() => setShow((s) => !s)}> + {show ? "Hide" : "Show"} form + </button> + <br /> + <hr /> + {show && ( + <> + <label> + Enter your name: + <MyInput + value={name} + onChange={(e) => setName(e.target.value)} + /> + </label> + <label> + <input + type="checkbox" + checked={upper} + onChange={(e) => setUpper(e.target.checked)} + /> + Make it uppercase + </label> + <p> + Hello, <b>{upper ? name.toUpperCase() : name}</b> + </p> + </> + )} + </> + ); +} +``` + +```css +label { + display: block; + margin-top: 20px; + margin-bottom: 20px; +} + +body { + min-height: 150px; +} +``` + +To verify that your solution works, press "Show form" and verify that the input receives focus (becomes highlighted and the cursor is placed inside). Press "Hide form" and "Show form" again. Verify the input is highlighted again. + +`MyInput` should only focus _on mount_ rather than after every render. To verify that the behavior is right, press "Show form" and then repeatedly press the "Make it uppercase" checkbox. Clicking the checkbox should _not_ focus the input above it. + +<Solution> + +Calling `ref.current.focus()` during render is wrong because it is a _side effect_. Side effects should either be placed inside an event handler or be declared with `useEffect`. In this case, the side effect is _caused_ by the component appearing rather than by any specific interaction, so it makes sense to put it in an Effect. + +To fix the mistake, wrap the `ref.current.focus()` call into an Effect declaration. Then, to ensure that this Effect runs only on mount rather than after every render, add the empty `[]` dependencies to it. + +```js +import { useEffect, useRef } from "react"; + +export default function MyInput({ value, onChange }) { + const ref = useRef(null); + + useEffect(() => { + ref.current.focus(); + }, []); + + return <input ref={ref} value={value} onChange={onChange} />; +} +``` + +```js +import { useState } from "react"; +import MyInput from "./MyInput.js"; + +export default function Form() { + const [show, setShow] = useState(false); + const [name, setName] = useState("Taylor"); + const [upper, setUpper] = useState(false); + return ( + <> + <button on_click={() => setShow((s) => !s)}> + {show ? "Hide" : "Show"} form + </button> + <br /> + <hr /> + {show && ( + <> + <label> + Enter your name: + <MyInput + value={name} + onChange={(e) => setName(e.target.value)} + /> + </label> + <label> + <input + type="checkbox" + checked={upper} + onChange={(e) => setUpper(e.target.checked)} + /> + Make it uppercase + </label> + <p> + Hello, <b>{upper ? name.toUpperCase() : name}</b> + </p> + </> + )} + </> + ); +} +``` + +```css +label { + display: block; + margin-top: 20px; + margin-bottom: 20px; +} + +body { + min-height: 150px; +} +``` + +</Solution> + +#### Focus a field conditionally + +This form renders two `<MyInput />` components. + +Press "Show form" and notice that the second field automatically gets focused. This is because both of the `<MyInput />` components try to focus the field inside. When you call `focus()` for two input fields in a row, the last one always "wins". + +Let's say you want to focus the first field. The first `MyInput` component now receives a boolean `shouldFocus` prop set to `true`. Change the logic so that `focus()` is only called if the `shouldFocus` prop received by `MyInput` is `true`. + +```js +import { useEffect, useRef } from "react"; + +export default function MyInput({ shouldFocus, value, onChange }) { + const ref = useRef(null); + + // TODO: call focus() only if shouldFocus is true. + useEffect(() => { + ref.current.focus(); + }, []); + + return <input ref={ref} value={value} onChange={onChange} />; +} +``` + +```js +import { useState } from "react"; +import MyInput from "./MyInput.js"; + +export default function Form() { + const [show, setShow] = useState(false); + const [firstName, setFirstName] = useState("Taylor"); + const [lastName, setLastName] = useState("Swift"); + const [upper, setUpper] = useState(false); + const name = firstName + " " + lastName; + return ( + <> + <button on_click={() => setShow((s) => !s)}> + {show ? "Hide" : "Show"} form + </button> + <br /> + <hr /> + {show && ( + <> + <label> + Enter your first name: + <MyInput + value={firstName} + onChange={(e) => setFirstName(e.target.value)} + shouldFocus={true} + /> + </label> + <label> + Enter your last name: + <MyInput + value={lastName} + onChange={(e) => setLastName(e.target.value)} + shouldFocus={false} + /> + </label> + <p> + Hello, <b>{upper ? name.toUpperCase() : name}</b> + </p> + </> + )} + </> + ); +} +``` + +```css +label { + display: block; + margin-top: 20px; + margin-bottom: 20px; +} + +body { + min-height: 150px; +} +``` + +To verify your solution, press "Show form" and "Hide form" repeatedly. When the form appears, only the _first_ input should get focused. This is because the parent component renders the first input with `shouldFocus={true}` and the second input with `shouldFocus={false}`. Also check that both inputs still work and you can type into both of them. + +<Hint> + +You can't declare an Effect conditionally, but your Effect can include conditional logic. + +</Hint> + +<Solution> + +Put the conditional logic inside the Effect. You will need to specify `shouldFocus` as a dependency because you are using it inside the Effect. (This means that if some input's `shouldFocus` changes from `false` to `true`, it will focus after mount.) + +```js +import { useEffect, useRef } from "react"; + +export default function MyInput({ shouldFocus, value, onChange }) { + const ref = useRef(null); + + useEffect(() => { + if (shouldFocus) { + ref.current.focus(); + } + }, [shouldFocus]); + + return <input ref={ref} value={value} onChange={onChange} />; +} +``` + +```js +import { useState } from "react"; +import MyInput from "./MyInput.js"; + +export default function Form() { + const [show, setShow] = useState(false); + const [firstName, setFirstName] = useState("Taylor"); + const [lastName, setLastName] = useState("Swift"); + const [upper, setUpper] = useState(false); + const name = firstName + " " + lastName; + return ( + <> + <button on_click={() => setShow((s) => !s)}> + {show ? "Hide" : "Show"} form + </button> + <br /> + <hr /> + {show && ( + <> + <label> + Enter your first name: + <MyInput + value={firstName} + onChange={(e) => setFirstName(e.target.value)} + shouldFocus={true} + /> + </label> + <label> + Enter your last name: + <MyInput + value={lastName} + onChange={(e) => setLastName(e.target.value)} + shouldFocus={false} + /> + </label> + <p> + Hello, <b>{upper ? name.toUpperCase() : name}</b> + </p> + </> + )} + </> + ); +} +``` + +```css +label { + display: block; + margin-top: 20px; + margin-bottom: 20px; +} + +body { + min-height: 150px; +} +``` + +</Solution> + +#### Fix an interval that fires twice + +This `Counter` component displays a counter that should increment every second. On mount, it calls [`setInterval`.](https://developer.mozilla.org/en-US/docs/Web/API/setInterval) This causes `onTick` to run every second. The `onTick` function increments the counter. + +However, instead of incrementing once per second, it increments twice. Why is that? Find the cause of the bug and fix it. + +<Hint> + +Keep in mind that `setInterval` returns an interval ID, which you can pass to [`clearInterval`](https://developer.mozilla.org/en-US/docs/Web/API/clearInterval) to stop the interval. + +</Hint> + +```js +import { useState, useEffect } from "react"; + +export default function Counter() { + const [count, setCount] = useState(0); + + useEffect(() => { + function onTick() { + setCount((c) => c + 1); + } + + setInterval(onTick, 1000); + }, []); + + return <h1>{count}</h1>; +} +``` + +```js +import { useState } from "react"; +import Counter from "./Counter.js"; + +export default function Form() { + const [show, setShow] = useState(false); + return ( + <> + <button on_click={() => setShow((s) => !s)}> + {show ? "Hide" : "Show"} counter + </button> + <br /> + <hr /> + {show && <Counter />} + </> + ); +} +``` + +```css +label { + display: block; + margin-top: 20px; + margin-bottom: 20px; +} + +body { + min-height: 150px; +} +``` + +<Solution> + +When [Strict Mode](/reference/react/StrictMode) is on (like in the sandboxes on this site), React remounts each component once in development. This causes the interval to be set up twice, and this is why each second the counter increments twice. + +However, React's behavior is not the _cause_ of the bug: the bug already exists in the code. React's behavior makes the bug more noticeable. The real cause is that this Effect starts a process but doesn't provide a way to clean it up. + +To fix this code, save the interval ID returned by `setInterval`, and implement a cleanup function with [`clearInterval`](https://developer.mozilla.org/en-US/docs/Web/API/clearInterval): + +```js +import { useState, useEffect } from "react"; + +export default function Counter() { + const [count, setCount] = useState(0); + + useEffect(() => { + function onTick() { + setCount((c) => c + 1); + } + + const intervalId = setInterval(onTick, 1000); + return () => clearInterval(intervalId); + }, []); + + return <h1>{count}</h1>; +} +``` + +```js +import { useState } from "react"; +import Counter from "./Counter.js"; + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button on_click={() => setShow((s) => !s)}> + {show ? "Hide" : "Show"} counter + </button> + <br /> + <hr /> + {show && <Counter />} + </> + ); +} +``` + +```css +label { + display: block; + margin-top: 20px; + margin-bottom: 20px; +} + +body { + min-height: 150px; +} +``` + +In development, React will still remount your component once to verify that you've implemented cleanup well. So there will be a `setInterval` call, immediately followed by `clearInterval`, and `setInterval` again. In production, there will be only one `setInterval` call. The user-visible behavior in both cases is the same: the counter increments once per second. + +</Solution> + +#### Fix fetching inside an Effect + +This component shows the biography for the selected person. It loads the biography by calling an asynchronous function `fetchBio(person)` on mount and whenever `person` changes. That asynchronous function returns a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) which eventually resolves to a string. When fetching is done, it calls `setBio` to display that string under the select box. + +```js +import { useState, useEffect } from "react"; +import { fetchBio } from "./api.js"; + +export default function Page() { + const [person, setPerson] = useState("Alice"); + const [bio, setBio] = useState(null); + + useEffect(() => { + setBio(null); + fetchBio(person).then((result) => { + setBio(result); + }); + }, [person]); + + return ( + <> + <select + value={person} + onChange={(e) => { + setPerson(e.target.value); + }} + > + <option value="Alice">Alice</option> + <option value="Bob">Bob</option> + <option value="Taylor">Taylor</option> + </select> + <hr /> + <p> + <i>{bio ?? "Loading..."}</i> + </p> + </> + ); +} +``` + +```js +export async function fetchBio(person) { + const delay = person === "Bob" ? 2000 : 200; + return new Promise((resolve) => { + setTimeout(() => { + resolve("This is " + person + "’s bio."); + }, delay); + }); +} +``` + +There is a bug in this code. Start by selecting "Alice". Then select "Bob" and then immediately after that select "Taylor". If you do this fast enough, you will notice that bug: Taylor is selected, but the paragraph below says "This is Bob's bio." + +Why does this happen? Fix the bug inside this Effect. + +<Hint> + +If an Effect fetches something asynchronously, it usually needs cleanup. + +</Hint> + +<Solution> + +To trigger the bug, things need to happen in this order: + +- Selecting `'Bob'` triggers `fetchBio('Bob')` +- Selecting `'Taylor'` triggers `fetchBio('Taylor')` +- **Fetching `'Taylor'` completes _before_ fetching `'Bob'`** +- The Effect from the `'Taylor'` render calls `setBio('This is Taylor’s bio')` +- Fetching `'Bob'` completes +- The Effect from the `'Bob'` render calls `setBio('This is Bob’s bio')` + +This is why you see Bob's bio even though Taylor is selected. Bugs like this are called [race conditions](https://en.wikipedia.org/wiki/Race_condition) because two asynchronous operations are "racing" with each other, and they might arrive in an unexpected order. + +To fix this race condition, add a cleanup function: + +```js +import { useState, useEffect } from "react"; +import { fetchBio } from "./api.js"; + +export default function Page() { + const [person, setPerson] = useState("Alice"); + const [bio, setBio] = useState(null); + useEffect(() => { + let ignore = false; + setBio(null); + fetchBio(person).then((result) => { + if (!ignore) { + setBio(result); + } + }); + return () => { + ignore = true; + }; + }, [person]); + + return ( + <> + <select + value={person} + onChange={(e) => { + setPerson(e.target.value); + }} + > + <option value="Alice">Alice</option> + <option value="Bob">Bob</option> + <option value="Taylor">Taylor</option> + </select> + <hr /> + <p> + <i>{bio ?? "Loading..."}</i> + </p> + </> + ); +} +``` + +```js +export async function fetchBio(person) { + const delay = person === "Bob" ? 2000 : 200; + return new Promise((resolve) => { + setTimeout(() => { + resolve("This is " + person + "’s bio."); + }, delay); + }); +} +``` + +Each render's Effect has its own `ignore` variable. Initially, the `ignore` variable is set to `false`. However, if an Effect gets cleaned up (such as when you select a different person), its `ignore` variable becomes `true`. So now it doesn't matter in which order the requests complete. Only the last person's Effect will have `ignore` set to `false`, so it will call `setBio(result)`. Past Effects have been cleaned up, so the `if (!ignore)` check will prevent them from calling `setBio`: + +- Selecting `'Bob'` triggers `fetchBio('Bob')` +- Selecting `'Taylor'` triggers `fetchBio('Taylor')` **and cleans up the previous (Bob's) Effect** +- Fetching `'Taylor'` completes _before_ fetching `'Bob'` +- The Effect from the `'Taylor'` render calls `setBio('This is Taylor’s bio')` +- Fetching `'Bob'` completes +- The Effect from the `'Bob'` render **does not do anything because its `ignore` flag was set to `true`** + +In addition to ignoring the result of an outdated API call, you can also use [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController) to cancel the requests that are no longer needed. However, by itself this is not enough to protect against race conditions. More asynchronous steps could be chained after the fetch, so using an explicit flag like `ignore` is the most reliable way to fix this type of problems. + +</Solution> + +</Challenges> diff --git a/docs/src/learn/thinking-in-react.md b/docs/src/learn/thinking-in-react.md new file mode 100644 index 000000000..1e99ec5cc --- /dev/null +++ b/docs/src/learn/thinking-in-react.md @@ -0,0 +1,631 @@ +--- +title: Thinking in React 🚧 +--- + +## Overview + +<p class="intro" markdown> + +React can change how you think about the designs you look at and the apps you build. When you build a user interface with React, you will first break it apart into pieces called _components_. Then, you will describe the different visual states for each of your components. Finally, you will connect your components together so that the data flows through them. In this tutorial, we’ll guide you through the thought process of building a searchable product data table with React. + +</p> + +## Start with the mockup + +Imagine that you already have a JSON API and a mockup from a designer. + +The JSON API returns some data that looks like this: + +```json +[ + { "category": "Fruits", "price": "$1", "stocked": true, "name": "Apple" }, + { + "category": "Fruits", + "price": "$1", + "stocked": true, + "name": "Dragonfruit" + }, + { + "category": "Fruits", + "price": "$2", + "stocked": false, + "name": "Passionfruit" + }, + { + "category": "Vegetables", + "price": "$2", + "stocked": true, + "name": "Spinach" + }, + { + "category": "Vegetables", + "price": "$4", + "stocked": false, + "name": "Pumpkin" + }, + { "category": "Vegetables", "price": "$1", "stocked": true, "name": "Peas" } +] +``` + +The mockup looks like this: + +<img src="../../static/images/s_thinking-in-react_ui.png" width="300" style="margin: 0 auto" /> + +To implement a UI in React, you will usually follow the same five steps. + +## Step 1: Break the UI into a component hierarchy + +Start by drawing boxes around every component and subcomponent in the mockup and naming them. If you work with a designer, they may have already named these components in their design tool. Ask them! + +Depending on your background, you can think about splitting up a design into components in different ways: + +- **Programming**--use the same techniques for deciding if you should create a new function or object. One such technique is the [single responsibility principle](https://en.wikipedia.org/wiki/Single_responsibility_principle), that is, a component should ideally only do one thing. If it ends up growing, it should be decomposed into smaller subcomponents. +- **CSS**--consider what you would make class selectors for. (However, components are a bit less granular.) +- **Design**--consider how you would organize the design's layers. + +If your JSON is well-structured, you'll often find that it naturally maps to the component structure of your UI. That's because UI and data models often have the same information architecture--that is, the same shape. Separate your UI into components, where each component matches one piece of your data model. + +There are five components on this screen: + +<!-- TODO: Change this image to use snake_case --> + +<img src="../../static/images/s_thinking-in-react_ui_outline.png" width="500" style="margin: 0 auto" /> + +1. `filterable_product_table` (grey) contains the entire app. +2. `search_bar` (blue) receives the user input. +3. `product_table` (lavender) displays and filters the list according to the user input. +4. `product_category_row` (green) displays a heading for each category. +5. `product_row` (yellow) displays a row for each product. + +If you look at `product_table` (lavender), you'll see that the table header (containing the "Name" and "Price" labels) isn't its own component. This is a matter of preference, and you could go either way. For this example, it is a part of `product_table` because it appears inside the `product_table`'s list. However, if this header grows to be complex (e.g., if you add sorting), you can move it into its own `product_table_header` component. + +Now that you've identified the components in the mockup, arrange them into a hierarchy. Components that appear within another component in the mockup should appear as a child in the hierarchy: + +- `filterable_product_table` + - `search_bar` + - `product_table` + - `product_category_row` + - `product_row` + +## Step 2: Build a static version in React + +Now that you have your component hierarchy, it's time to implement your app. The most straightforward approach is to build a version that renders the UI from your data model without adding any interactivity... yet! It's often easier to build the static version first and add interactivity later. Building a static version requires a lot of typing and no thinking, but adding interactivity requires a lot of thinking and not a lot of typing. + +To build a static version of your app that renders your data model, you'll want to build [components](your-first-component.md) that reuse other components and pass data using [props.](/learn/passing-props-to-a-component) Props are a way of passing data from parent to child. (If you're familiar with the concept of [state](/learn/state-a-components-memory), don't use state at all to build this static version. State is reserved only for interactivity, that is, data that changes over time. Since this is a static version of the app, you don't need it.) + +You can either build "top down" by starting with building the components higher up in the hierarchy (like `filterable_product_table`) or "bottom up" by working from components lower down (like `product_row`). In simpler examples, it’s usually easier to go top-down, and on larger projects, it’s easier to go bottom-up. + +```jsx +function product_category_row({ category }) { + return ( + <tr> + <th colSpan="2">{category}</th> + </tr> + ); +} + +function product_row({ product }) { + const name = product.stocked ? ( + product.name + ) : ( + <span style={{ color: "red" }}>{product.name}</span> + ); + + return ( + <tr> + <td>{name}</td> + <td>{product.price}</td> + </tr> + ); +} + +function product_table({ products }) { + const rows = []; + let lastCategory = null; + + products.forEach((product) => { + if (product.category !== lastCategory) { + rows.push( + <product_category_row + category={product.category} + key={product.category} + /> + ); + } + rows.push(<product_row product={product} key={product.name} />); + lastCategory = product.category; + }); + + return ( + <table> + <thead> + <tr> + <th>Name</th> + <th>Price</th> + </tr> + </thead> + <tbody>{rows}</tbody> + </table> + ); +} + +function search_bar() { + return ( + <form> + <input type="text" placeholder="Search..." /> + <label> + <input type="checkbox" /> Only show products in stock + </label> + </form> + ); +} + +function filterable_product_table({ products }) { + return ( + <div> + <search_bar /> + <product_table products={products} /> + </div> + ); +} + +const PRODUCTS = [ + { category: "Fruits", price: "$1", stocked: true, name: "Apple" }, + { category: "Fruits", price: "$1", stocked: true, name: "Dragonfruit" }, + { category: "Fruits", price: "$2", stocked: false, name: "Passionfruit" }, + { category: "Vegetables", price: "$2", stocked: true, name: "Spinach" }, + { category: "Vegetables", price: "$4", stocked: false, name: "Pumpkin" }, + { category: "Vegetables", price: "$1", stocked: true, name: "Peas" }, +]; + +export default function App() { + return <filterable_product_table products={PRODUCTS} />; +} +``` + +```css +body { + padding: 5px; +} +label { + display: block; + margin-top: 5px; + margin-bottom: 5px; +} +th { + padding-top: 10px; +} +td { + padding: 2px; + padding-right: 40px; +} +``` + +(If this code looks intimidating, go through the [Quick Start](/learn/) first!) + +After building your components, you'll have a library of reusable components that render your data model. Because this is a static app, the components will only return JSX. The component at the top of the hierarchy (`filterable_product_table`) will take your data model as a prop. This is called _one-way data flow_ because the data flows down from the top-level component to the ones at the bottom of the tree. + +<Pitfall> + +At this point, you should not be using any state values. That’s for the next step! + +</Pitfall> + +## Step 3: Find the minimal but complete representation of UI state + +To make the UI interactive, you need to let users change your underlying data model. You will use _state_ for this. + +Think of state as the minimal set of changing data that your app needs to remember. The most important principle for structuring state is to keep it [DRY (Don't Repeat Yourself).](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) Figure out the absolute minimal representation of the state your application needs and compute everything else on-demand. For example, if you're building a shopping list, you can store the items as an array in state. If you want to also display the number of items in the list, don't store the number of items as another state value--instead, read the length of your array. + +Now think of all of the pieces of data in this example application: + +1. The original list of products +2. The search text the user has entered +3. The value of the checkbox +4. The filtered list of products + +Which of these are state? Identify the ones that are not: + +- Does it **remain unchanged** over time? If so, it isn't state. +- Is it **passed in from a parent** via props? If so, it isn't state. +- **Can you compute it** based on existing state or props in your component? If so, it _definitely_ isn't state! + +What's left is probably state. + +Let's go through them one by one again: + +1. The original list of products is **passed in as props, so it's not state.** +2. The search text seems to be state since it changes over time and can't be computed from anything. +3. The value of the checkbox seems to be state since it changes over time and can't be computed from anything. +4. The filtered list of products **isn't state because it can be computed** by taking the original list of products and filtering it according to the search text and value of the checkbox. + +This means only the search text and the value of the checkbox are state! Nicely done! + +<DeepDive> + +#### Props vs State + +There are two types of "model" data in React: props and state. The two are very different: + +- [**Props** are like arguments you pass](/learn/passing-props-to-a-component) to a function. They let a parent component pass data to a child component and customize its appearance. For example, a `Form` can pass a `color` prop to a `Button`. +- [**State** is like a component’s memory.](/learn/state-a-components-memory) It lets a component keep track of some information and change it in response to interactions. For example, a `Button` might keep track of `isHovered` state. + +Props and state are different, but they work together. A parent component will often keep some information in state (so that it can change it), and _pass it down_ to child components as their props. It's okay if the difference still feels fuzzy on the first read. It takes a bit of practice for it to really stick! + +</DeepDive> + +## Step 4: Identify where your state should live + +After identifying your app’s minimal state data, you need to identify which component is responsible for changing this state, or _owns_ the state. Remember: React uses one-way data flow, passing data down the component hierarchy from parent to child component. It may not be immediately clear which component should own what state. This can be challenging if you’re new to this concept, but you can figure it out by following these steps! + +For each piece of state in your application: + +1. Identify _every_ component that renders something based on that state. +2. Find their closest common parent component--a component above them all in the hierarchy. +3. Decide where the state should live: + 1. Often, you can put the state directly into their common parent. + 2. You can also put the state into some component above their common parent. + 3. If you can't find a component where it makes sense to own the state, create a new component solely for holding the state and add it somewhere in the hierarchy above the common parent component. + +In the previous step, you found two pieces of state in this application: the search input text, and the value of the checkbox. In this example, they always appear together, so it makes sense to put them into the same place. + +Now let's run through our strategy for them: + +1. **Identify components that use state:** + - `product_table` needs to filter the product list based on that state (search text and checkbox value). + - `search_bar` needs to display that state (search text and checkbox value). +1. **Find their common parent:** The first parent component both components share is `filterable_product_table`. +1. **Decide where the state lives**: We'll keep the filter text and checked state values in `filterable_product_table`. + +So the state values will live in `filterable_product_table`. + +Add state to the component with the [`useState()` Hook.](/reference/react/useState) Hooks are special functions that let you "hook into" React. Add two state variables at the top of `filterable_product_table` and specify their initial state: + +```js +function filterable_product_table({ products }) { + const [filterText, setFilterText] = useState(''); + const [inStockOnly, setInStockOnly] = useState(false); +``` + +Then, pass `filterText` and `inStockOnly` to `product_table` and `search_bar` as props: + +```js +<div> + <search_bar filterText={filterText} inStockOnly={inStockOnly} /> + <product_table + products={products} + filterText={filterText} + inStockOnly={inStockOnly} + /> +</div> +``` + +You can start seeing how your application will behave. Edit the `filterText` initial value from `useState('')` to `useState('fruit')` in the sandbox code below. You'll see both the search input text and the table update: + +```jsx +import { useState } from "react"; + +function filterable_product_table({ products }) { + const [filterText, setFilterText] = useState(""); + const [inStockOnly, setInStockOnly] = useState(false); + + return ( + <div> + <search_bar filterText={filterText} inStockOnly={inStockOnly} /> + <product_table + products={products} + filterText={filterText} + inStockOnly={inStockOnly} + /> + </div> + ); +} + +function product_category_row({ category }) { + return ( + <tr> + <th colSpan="2">{category}</th> + </tr> + ); +} + +function product_row({ product }) { + const name = product.stocked ? ( + product.name + ) : ( + <span style={{ color: "red" }}>{product.name}</span> + ); + + return ( + <tr> + <td>{name}</td> + <td>{product.price}</td> + </tr> + ); +} + +function product_table({ products, filterText, inStockOnly }) { + const rows = []; + let lastCategory = null; + + products.forEach((product) => { + if ( + product.name.toLowerCase().indexOf(filterText.toLowerCase()) === -1 + ) { + return; + } + if (inStockOnly && !product.stocked) { + return; + } + if (product.category !== lastCategory) { + rows.push( + <product_category_row + category={product.category} + key={product.category} + /> + ); + } + rows.push(<product_row product={product} key={product.name} />); + lastCategory = product.category; + }); + + return ( + <table> + <thead> + <tr> + <th>Name</th> + <th>Price</th> + </tr> + </thead> + <tbody>{rows}</tbody> + </table> + ); +} + +function search_bar({ filterText, inStockOnly }) { + return ( + <form> + <input type="text" value={filterText} placeholder="Search..." /> + <label> + <input type="checkbox" checked={inStockOnly} /> Only show + products in stock + </label> + </form> + ); +} + +const PRODUCTS = [ + { category: "Fruits", price: "$1", stocked: true, name: "Apple" }, + { category: "Fruits", price: "$1", stocked: true, name: "Dragonfruit" }, + { category: "Fruits", price: "$2", stocked: false, name: "Passionfruit" }, + { category: "Vegetables", price: "$2", stocked: true, name: "Spinach" }, + { category: "Vegetables", price: "$4", stocked: false, name: "Pumpkin" }, + { category: "Vegetables", price: "$1", stocked: true, name: "Peas" }, +]; + +export default function App() { + return <filterable_product_table products={PRODUCTS} />; +} +``` + +```css +body { + padding: 5px; +} +label { + display: block; + margin-top: 5px; + margin-bottom: 5px; +} +th { + padding-top: 5px; +} +td { + padding: 2px; +} +``` + +Notice that editing the form doesn't work yet. There is a console error in the sandbox above explaining why: + +<ConsoleBlock level="error"> + +You provided a \`value\` prop to a form field without an \`onChange\` handler. This will render a read-only field. + +</ConsoleBlock> + +In the sandbox above, `product_table` and `search_bar` read the `filterText` and `inStockOnly` props to render the table, the input, and the checkbox. For example, here is how `search_bar` populates the input value: + +```js +function search_bar({ filterText, inStockOnly }) { + return ( + <form> + <input + type="text" + value={filterText} + placeholder="Search..."/> +``` + +However, you haven't added any code to respond to the user actions like typing yet. This will be your final step. + +## Step 5: Add inverse data flow + +Currently your app renders correctly with props and state flowing down the hierarchy. But to change the state according to user input, you will need to support data flowing the other way: the form components deep in the hierarchy need to update the state in `filterable_product_table`. + +React makes this data flow explicit, but it requires a little more typing than two-way data binding. If you try to type or check the box in the example above, you'll see that React ignores your input. This is intentional. By writing `<input value={filterText} />`, you've set the `value` prop of the `input` to always be equal to the `filterText` state passed in from `filterable_product_table`. Since `filterText` state is never set, the input never changes. + +You want to make it so whenever the user changes the form inputs, the state updates to reflect those changes. The state is owned by `filterable_product_table`, so only it can call `setFilterText` and `setInStockOnly`. To let `search_bar` update the `filterable_product_table`'s state, you need to pass these functions down to `search_bar`: + +```js +function filterable_product_table({ products }) { + const [filterText, setFilterText] = useState(''); + const [inStockOnly, setInStockOnly] = useState(false); + + return ( + <div> + <search_bar + filterText={filterText} + inStockOnly={inStockOnly} + onFilterTextChange={setFilterText} + onInStockOnlyChange={setInStockOnly} /> +``` + +Inside the `search_bar`, you will add the `onChange` event handlers and set the parent state from them: + +```js +<input + type="text" + value={filterText} + placeholder="Search..." + onChange={(e) => onFilterTextChange(e.target.value)} +/> +``` + +Now the application fully works! + +```jsx +import { useState } from "react"; + +function filterable_product_table({ products }) { + const [filterText, setFilterText] = useState(""); + const [inStockOnly, setInStockOnly] = useState(false); + + return ( + <div> + <search_bar + filterText={filterText} + inStockOnly={inStockOnly} + onFilterTextChange={setFilterText} + onInStockOnlyChange={setInStockOnly} + /> + <product_table + products={products} + filterText={filterText} + inStockOnly={inStockOnly} + /> + </div> + ); +} + +function product_category_row({ category }) { + return ( + <tr> + <th colSpan="2">{category}</th> + </tr> + ); +} + +function product_row({ product }) { + const name = product.stocked ? ( + product.name + ) : ( + <span style={{ color: "red" }}>{product.name}</span> + ); + + return ( + <tr> + <td>{name}</td> + <td>{product.price}</td> + </tr> + ); +} + +function product_table({ products, filterText, inStockOnly }) { + const rows = []; + let lastCategory = null; + + products.forEach((product) => { + if ( + product.name.toLowerCase().indexOf(filterText.toLowerCase()) === -1 + ) { + return; + } + if (inStockOnly && !product.stocked) { + return; + } + if (product.category !== lastCategory) { + rows.push( + <product_category_row + category={product.category} + key={product.category} + /> + ); + } + rows.push(<product_row product={product} key={product.name} />); + lastCategory = product.category; + }); + + return ( + <table> + <thead> + <tr> + <th>Name</th> + <th>Price</th> + </tr> + </thead> + <tbody>{rows}</tbody> + </table> + ); +} + +function search_bar({ + filterText, + inStockOnly, + onFilterTextChange, + onInStockOnlyChange, +}) { + return ( + <form> + <input + type="text" + value={filterText} + placeholder="Search..." + onChange={(e) => onFilterTextChange(e.target.value)} + /> + <label> + <input + type="checkbox" + checked={inStockOnly} + onChange={(e) => onInStockOnlyChange(e.target.checked)} + />{" "} + Only show products in stock + </label> + </form> + ); +} + +const PRODUCTS = [ + { category: "Fruits", price: "$1", stocked: true, name: "Apple" }, + { category: "Fruits", price: "$1", stocked: true, name: "Dragonfruit" }, + { category: "Fruits", price: "$2", stocked: false, name: "Passionfruit" }, + { category: "Vegetables", price: "$2", stocked: true, name: "Spinach" }, + { category: "Vegetables", price: "$4", stocked: false, name: "Pumpkin" }, + { category: "Vegetables", price: "$1", stocked: true, name: "Peas" }, +]; + +export default function App() { + return <filterable_product_table products={PRODUCTS} />; +} +``` + +```css +body { + padding: 5px; +} +label { + display: block; + margin-top: 5px; + margin-bottom: 5px; +} +th { + padding: 4px; +} +td { + padding: 2px; +} +``` + +You can learn all about handling events and updating state in the [Adding Interactivity](/learn/adding-interactivity) section. + +## Where to go from here + +This was a very brief introduction to how to think about building components and applications with React. You can [start a React project](/learn/installation) right now or [dive deeper on all the syntax](/learn/describing-the-ui) used in this tutorial. diff --git a/docs/src/learn/tutorial-material-ui.md b/docs/src/learn/tutorial-material-ui.md new file mode 100644 index 000000000..30e56fbc7 --- /dev/null +++ b/docs/src/learn/tutorial-material-ui.md @@ -0,0 +1,3 @@ +--- +title: "Tutorial: Material UI 🚧" +--- diff --git a/docs/src/learn/tutorial-react-bootstrap.md b/docs/src/learn/tutorial-react-bootstrap.md new file mode 100644 index 000000000..79abb885c --- /dev/null +++ b/docs/src/learn/tutorial-react-bootstrap.md @@ -0,0 +1,3 @@ +--- +title: "Tutorial: React Bootstrap 🚧" +--- diff --git a/docs/src/learn/tutorial-tic-tac-toe.md b/docs/src/learn/tutorial-tic-tac-toe.md new file mode 100644 index 000000000..46ad9325e --- /dev/null +++ b/docs/src/learn/tutorial-tic-tac-toe.md @@ -0,0 +1,2996 @@ +--- +title: "Tutorial: Tic-Tac-Toe 🚧" +--- + +## Overview + +<p class="intro" markdown> + +You will build a small tic-tac-toe game during this tutorial. This tutorial does not assume any existing React knowledge. The techniques you'll learn in the tutorial are fundamental to building any React app, and fully understanding it will give you a deep understanding of React. + +</p> + +!!! abstract "Note" + + This tutorial is designed for people who prefer to **learn by doing** and want to quickly try making something tangible. If you prefer learning each concept step by step, start with [Describing the UI.](./your-first-component.md) + +The tutorial is divided into several sections: + +- [Setup for the tutorial](#setup-for-the-tutorial) will give you **a starting point** to follow the tutorial. +- [Overview](#overview) will teach you **the fundamentals** of React: components, props, and state. +- [Completing the game](#completing-the-game) will teach you **the most common techniques** in React development. +- [Adding time travel](#adding-time-travel) will give you **a deeper insight** into the unique strengths of React. + +### What are you building? + +In this tutorial, you'll build an interactive tic-tac-toe game with React. + +You can see what it will look like when you're finished here: + +=== "app.py" + + ```python + {% include "../../examples/python/tutorial-tic-tac-toe/tic_tac_toe.py" end="# end" %} + ``` + +=== "stylesheet.css" + + ```css + {% include "../../examples/css/tutorial-tic-tac-toe/tic_tac_toe.css" %} + ``` + +=== ":material-play: Run" + + ```python + # TODO + ``` + +If the code doesn't make sense to you yet, or if you are unfamiliar with the code's syntax, don't worry! The goal of this tutorial is to help you understand React and its syntax. + +We recommend that you check out the tic-tac-toe game above before continuing with the tutorial. One of the features that you'll notice is that there is a numbered list to the right of the game's board. This list gives you a history of all of the moves that have occurred in the game, and it is updated as the game progresses. + +Once you've played around with the finished tic-tac-toe game, keep scrolling. You'll start with a simpler template in this tutorial. Our next step is to set you up so that you can start building the game. + +## Setup for the tutorial + +In the live code editor below, click **Fork** in the top-right corner to open the editor in a new tab using the website CodeSandbox. CodeSandbox lets you write code in your browser and preview how your users will see the app you've created. The new tab should display an empty square and the starter code for this tutorial. + +```js +export default function Square() { + return <button className="square">X</button>; +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +<Note> + +You can also follow this tutorial using your local development environment. To do this, you need to: + +1. Install [Node.js](https://nodejs.org/en/) +1. In the CodeSandbox tab you opened earlier, press the top-left corner button to open the menu, and then choose **File > Export to ZIP** in that menu to download an archive of the files locally +1. Unzip the archive, then open a terminal and `cd` to the directory you unzipped +1. Install the dependencies with `npm install` +1. Run `npm start` to start a local server and follow the prompts to view the code running in a browser + +If you get stuck, don't let this stop you! Follow along online instead and try a local setup again later. + +</Note> + +## Overview + +Now that you're set up, let's get an overview of React! + +### Inspecting the starter code + +In CodeSandbox you'll see three main sections: + +![CodeSandbox with starter code]() + +1. The _Files_ section with a list of files like `App.js`, `index.js`, `styles.css` and a folder called `public` +1. The _code editor_ where you'll see the source code of your selected file +1. The _browser_ section where you'll see how the code you've written will be displayed + +The `App.js` file should be selected in the _Files_ section. The contents of that file in the _code editor_ should be: + +```jsx +export default function Square() { + return <button className="square">X</button>; +} +``` + +The _browser_ section should be displaying a square with a X in it like this: + +![x-filled square]() + +Now let's have a look at the files in the starter code. + +#### `App.js` + +The code in `App.js` creates a _component_. In React, a component is a piece of reusable code that represents a part of a user interface. Components are used to render, manage, and update the UI elements in your application. Let's look at the component line by line to see what's going on: + +```js +export default function Square() { + return <button className="square">X</button>; +} +``` + +The first line defines a function called `Square`. The `export` JavaScript keyword makes this function accessible outside of this file. The `default` keyword tells other files using your code that it's the main function in your file. + +```js +export default function Square() { + return <button className="square">X</button>; +} +``` + +The second line returns a button. The `return` JavaScript keyword means whatever comes after is returned as a value to the caller of the function. `<button>` is a _JSX element_. A JSX element is a combination of JavaScript code and HTML tags that describes what you'd like to display. `className="square"` is a button property or _prop_ that tells CSS how to style the button. `X` is the text displayed inside of the button and `</button>` closes the JSX element to indicate that any following content shouldn't be placed inside the button. + +#### `styles.css` + +Click on the file labeled `styles.css` in the _Files_ section of CodeSandbox. This file defines the styles for your React app. The first two _CSS selectors_ (`*` and `body`) define the style of large parts of your app while the `.square` selector defines the style of any component where the `className` property is set to `square`. In your code, that would match the button from your Square component in the `App.js` file. + +#### `index.js` + +Click on the file labeled `index.js` in the _Files_ section of CodeSandbox. You won't be editing this file during the tutorial but it is the bridge between the component you created in the `App.js` file and the web browser. + +```jsx +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./styles.css"; + +import App from "./App"; +``` + +Lines 1-5 brings all the necessary pieces together: + +- React +- React's library to talk to web browsers (React DOM) +- the styles for your components +- the component you created in `App.js`. + +The remainder of the file brings all the pieces together and injects the final product into `index.html` in the `public` folder. + +### Building the board + +Let's get back to `App.js`. This is where you'll spend the rest of the tutorial. + +Currently the board is only a single square, but you need nine! If you just try and copy paste your square to make two squares like this: + +```js +export default function Square() { + return <button className="square">X</button><button className="square">X</button>; +} +``` + +You'll get this error: + +<ConsoleBlock level="error"> + +/src/App.js: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment `<>...</>`? + +</ConsoleBlock> + +React components need to return a single JSX element and not multiple adjacent JSX elements like two buttons. To fix this you can use _fragments_ (`<>` and `</>`) to wrap multiple adjacent JSX elements like this: + +```js +export default function Square() { + return ( + <> + <button className="square">X</button> + <button className="square">X</button> + </> + ); +} +``` + +Now you should see: + +![two x-filled squares]() + +Great! Now you just need to copy-paste a few times to add nine squares and... + +![nine x-filled squares in a line]() + +Oh no! The squares are all in a single line, not in a grid like you need for our board. To fix this you'll need to group your squares into rows with `div`s and add some CSS classes. While you're at it, you'll give each square a number to make sure you know where each square is displayed. + +In the `App.js` file, update the `Square` component to look like this: + +```js +export default function Square() { + return ( + <> + <div className="board-row"> + <button className="square">1</button> + <button className="square">2</button> + <button className="square">3</button> + </div> + <div className="board-row"> + <button className="square">4</button> + <button className="square">5</button> + <button className="square">6</button> + </div> + <div className="board-row"> + <button className="square">7</button> + <button className="square">8</button> + <button className="square">9</button> + </div> + </> + ); +} +``` + +The CSS defined in `styles.css` styles the divs with the `className` of `board-row`. Now that you've grouped your components into rows with the styled `div`s you have your tic-tac-toe board: + +![tic-tac-toe board filled with numbers 1 through 9]() + +But you now have a problem. Your component named `Square`, really isn't a square anymore. Let's fix that by changing the name to `Board`: + +```js +export default function Board() { + //... +} +``` + +At this point your code should look something like this: + +```js +export default function Board() { + return ( + <> + <div className="board-row"> + <button className="square">1</button> + <button className="square">2</button> + <button className="square">3</button> + </div> + <div className="board-row"> + <button className="square">4</button> + <button className="square">5</button> + <button className="square">6</button> + </div> + <div className="board-row"> + <button className="square">7</button> + <button className="square">8</button> + <button className="square">9</button> + </div> + </> + ); +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +<Note> + +Psssst... That's a lot to type! It's okay to copy and paste code from this page. However, if you're up for a little challenge, we recommend only copying code that you've manually typed at least once yourself. + +</Note> + +### Passing data through props + +Next, you'll want to change the value of a square from empty to "X" when the user clicks on the square. With how you've built the board so far you would need to copy-paste the code that updates the square nine times (once for each square you have)! Instead of copy-pasting, React's component architecture allows you to create a reusable component to avoid messy, duplicated code. + +First, you are going to copy the line defining your first square (`<button className="square">1</button>`) from your `Board` component into a new `Square` component: + +```js +function Square() { + return <button className="square">1</button>; +} + +export default function Board() { + // ... +} +``` + +Then you'll update the Board component to render that `Square` component using JSX syntax: + +```js +// ... +export default function Board() { + return ( + <> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + </> + ); +} +``` + +Note how unlike the browser `div`s, your own components `Board` and `Square` must start with a capital letter. + +Let's take a look: + +![one-filled board]() + +Oh no! You lost the numbered squares you had before. Now each square says "1". To fix this, you will use _props_ to pass the value each square should have from the parent component (`Board`) to its child (`Square`). + +Update the `Square` component to read the `value` prop that you'll pass from the `Board`: + +```js +function Square({ value }) { + return <button className="square">1</button>; +} +``` + +`function Square({ value })` indicates the Square component can be passed a prop called `value`. + +Now you want to display that `value` instead of `1` inside every square. Try doing it like this: + +```js +function Square({ value }) { + return <button className="square">value</button>; +} +``` + +Oops, this is not what you wanted: + +![value-filled board]() + +You wanted to render the JavaScript variable called `value` from your component, not the word "value". To "escape into JavaScript" from JSX, you need curly braces. Add curly braces around `value` in JSX like so: + +```js +function Square({ value }) { + return <button className="square">{value}</button>; +} +``` + +For now, you should see an empty board: + +![empty board]() + +This is because the `Board` component hasn't passed the `value` prop to each `Square` component it renders yet. To fix it you'll add the `value` prop to each `Square` component rendered by the `Board` component: + +```js +export default function Board() { + return ( + <> + <div className="board-row"> + <Square value="1" /> + <Square value="2" /> + <Square value="3" /> + </div> + <div className="board-row"> + <Square value="4" /> + <Square value="5" /> + <Square value="6" /> + </div> + <div className="board-row"> + <Square value="7" /> + <Square value="8" /> + <Square value="9" /> + </div> + </> + ); +} +``` + +Now you should see a grid of numbers again: + +![tic-tac-toe board filled with numbers 1 through 9]() + +Your updated code should look like this: + +```js +function Square({ value }) { + return <button className="square">{value}</button>; +} + +export default function Board() { + return ( + <> + <div className="board-row"> + <Square value="1" /> + <Square value="2" /> + <Square value="3" /> + </div> + <div className="board-row"> + <Square value="4" /> + <Square value="5" /> + <Square value="6" /> + </div> + <div className="board-row"> + <Square value="7" /> + <Square value="8" /> + <Square value="9" /> + </div> + </> + ); +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +### Making an interactive component + +Let's fill the `Square` component with an `X` when you click it. Declare a function called `handleClick` inside of the `Square`. Then, add `on_click` to the props of the button JSX element returned from the `Square`: + +```js +function Square({ value }) { + function handleClick() { + console.log("clicked!"); + } + + return ( + <button className="square" on_click={handleClick}> + {value} + </button> + ); +} +``` + +If you click on a square now, you should see a log saying `"clicked!"` in the _Console_ tab at the bottom of the _Browser_ section in CodeSandbox. Clicking the square more than once will log `"clicked!"` again. Repeated console logs with the same message will not create more lines in the console. Instead, you will see an incrementing counter next to your first `"clicked!"` log. + +<Note> + +If you are following this tutorial using your local development environment, you need to open your browser's Console. For example, if you use the Chrome browser, you can view the Console with the keyboard shortcut **Shift + Ctrl + J** (on Windows/Linux) or **Option + ⌘ + J** (on macOS). + +</Note> + +As a next step, you want the Square component to "remember" that it got clicked, and fill it with an "X" mark. To "remember" things, components use _state_. + +React provides a special function called `useState` that you can call from your component to let it "remember" things. Let's store the current value of the `Square` in state, and change it when the `Square` is clicked. + +Import `useState` at the top of the file. Remove the `value` prop from the `Square` component. Instead, add a new line at the start of the `Square` that calls `useState`. Have it return a state variable called `value`: + +```js +import { useState } from 'react'; + +function Square() { + const [value, setValue] = useState(null); + + function handleClick() { + //... +``` + +`value` stores the value and `setValue` is a function that can be used to change the value. The `null` passed to `useState` is used as the initial value for this state variable, so `value` here starts off equal to `null`. + +Since the `Square` component no longer accepts props anymore, you'll remove the `value` prop from all nine of the Square components created by the Board component: + +```js +// ... +export default function Board() { + return ( + <> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + </> + ); +} +``` + +Now you'll change `Square` to display an "X" when clicked. Replace the `console.log("clicked!");` event handler with `setValue('X');`. Now your `Square` component looks like this: + +```js +function Square() { + const [value, setValue] = useState(null); + + function handleClick() { + setValue("X"); + } + + return ( + <button className="square" on_click={handleClick}> + {value} + </button> + ); +} +``` + +By calling this `set` function from an `on_click` handler, you're telling React to re-render that `Square` whenever its `<button>` is clicked. After the update, the `Square`'s `value` will be `'X'`, so you'll see the "X" on the game board. Click on any Square, and "X" should show up: + +![adding xes to board]() + +Each Square has its own state: the `value` stored in each Square is completely independent of the others. When you call a `set` function in a component, React automatically updates the child components inside too. + +After you've made the above changes, your code will look like this: + +```js +import { useState } from "react"; + +function Square() { + const [value, setValue] = useState(null); + + function handleClick() { + setValue("X"); + } + + return ( + <button className="square" on_click={handleClick}> + {value} + </button> + ); +} + +export default function Board() { + return ( + <> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + </> + ); +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +### React Developer Tools + +React DevTools let you check the props and the state of your React components. You can find the React DevTools tab at the bottom of the _browser_ section in CodeSandbox: + +![React DevTools in CodeSandbox]() + +To inspect a particular component on the screen, use the button in the top left corner of React DevTools: + +![Selecting components on the page with React DevTools]() + +<Note> + +For local development, React DevTools is available as a [Chrome](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en), [Firefox](https://addons.mozilla.org/en-US/firefox/addon/react-devtools/), and [Edge](https://microsoftedge.microsoft.com/addons/detail/react-developer-tools/gpphkfbcpidddadnkolkpfckpihlkkil) browser extension. Install it, and the _Components_ tab will appear in your browser Developer Tools for sites using React. + +</Note> + +## Completing the game + +By this point, you have all the basic building blocks for your tic-tac-toe game. To have a complete game, you now need to alternate placing "X"s and "O"s on the board, and you need a way to determine a winner. + +### Lifting state up + +Currently, each `Square` component maintains a part of the game's state. To check for a winner in a tic-tac-toe game, the `Board` would need to somehow know the state of each of the 9 `Square` components. + +How would you approach that? At first, you might guess that the `Board` needs to "ask" each `Square` for that `Square`'s state. Although this approach is technically possible in React, we discourage it because the code becomes difficult to understand, susceptible to bugs, and hard to refactor. Instead, the best approach is to store the game's state in the parent `Board` component instead of in each `Square`. The `Board` component can tell each `Square` what to display by passing a prop, like you did when you passed a number to each Square. + +**To collect data from multiple children, or to have two child components communicate with each other, declare the shared state in their parent component instead. The parent component can pass that state back down to the children via props. This keeps the child components in sync with each other and with their parent.** + +Lifting state into a parent component is common when React components are refactored. + +Let's take this opportunity to try it out. Edit the `Board` component so that it declares a state variable named `squares` that defaults to an array of 9 nulls corresponding to the 9 squares: + +```js +// ... +export default function Board() { + const [squares, setSquares] = useState(Array(9).fill(null)); + return ( + // ... + ); +} +``` + +`Array(9).fill(null)` creates an array with nine elements and sets each of them to `null`. The `useState()` call around it declares a `squares` state variable that's initially set to that array. Each entry in the array corresponds to the value of a square. When you fill the board in later, the `squares` array will look like this: + +```jsx +["O", null, "X", "X", "X", "O", "O", null, null]; +``` + +Now your `Board` component needs to pass the `value` prop down to each `Square` that it renders: + +```js +export default function Board() { + const [squares, setSquares] = useState(Array(9).fill(null)); + return ( + <> + <div className="board-row"> + <Square value={squares[0]} /> + <Square value={squares[1]} /> + <Square value={squares[2]} /> + </div> + <div className="board-row"> + <Square value={squares[3]} /> + <Square value={squares[4]} /> + <Square value={squares[5]} /> + </div> + <div className="board-row"> + <Square value={squares[6]} /> + <Square value={squares[7]} /> + <Square value={squares[8]} /> + </div> + </> + ); +} +``` + +Next, you'll edit the `Square` component to receive the `value` prop from the Board component. This will require removing the Square component's own stateful tracking of `value` and the button's `on_click` prop: + +```js +function Square({ value }) { + return <button className="square">{value}</button>; +} +``` + +At this point you should see an empty tic-tac-toe board: + +![empty board]() + +And your code should look like this: + +```js +import { useState } from "react"; + +function Square({ value }) { + return <button className="square">{value}</button>; +} + +export default function Board() { + const [squares, setSquares] = useState(Array(9).fill(null)); + return ( + <> + <div className="board-row"> + <Square value={squares[0]} /> + <Square value={squares[1]} /> + <Square value={squares[2]} /> + </div> + <div className="board-row"> + <Square value={squares[3]} /> + <Square value={squares[4]} /> + <Square value={squares[5]} /> + </div> + <div className="board-row"> + <Square value={squares[6]} /> + <Square value={squares[7]} /> + <Square value={squares[8]} /> + </div> + </> + ); +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +Each Square will now receive a `value` prop that will either be `'X'`, `'O'`, or `null` for empty squares. + +Next, you need to change what happens when a `Square` is clicked. The `Board` component now maintains which squares are filled. You'll need to create a way for the `Square` to update the `Board`'s state. Since state is private to a component that defines it, you cannot update the `Board`'s state directly from `Square`. + +Instead, you'll pass down a function from the `Board` component to the `Square` component, and you'll have `Square` call that function when a square is clicked. You'll start with the function that the `Square` component will call when it is clicked. You'll call that function `onSquareClick`: + +```js +function Square({ value }) { + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); +} +``` + +Next, you'll add the `onSquareClick` function to the `Square` component's props: + +```js +function Square({ value, onSquareClick }) { + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); +} +``` + +Now you'll connect the `onSquareClick` prop to a function in the `Board` component that you'll name `handleClick`. To connect `onSquareClick` to `handleClick` you'll pass a function to the `onSquareClick` prop of the first `Square` component: + +```js +export default function Board() { + const [squares, setSquares] = useState(Array(9).fill(null)); + + return ( + <> + <div className="board-row"> + <Square value={squares[0]} onSquareClick={handleClick} /> + //... + ); +} +``` + +Lastly, you will define the `handleClick` function inside the Board component to update the `squares` array holding your board's state: + +```js +export default function Board() { + const [squares, setSquares] = useState(Array(9).fill(null)); + + function handleClick() { + const nextSquares = squares.slice(); + nextSquares[0] = "X"; + setSquares(nextSquares); + } + + return ( + // ... + ) +} +``` + +The `handleClick` function creates a copy of the `squares` array (`nextSquares`) with the JavaScript `slice()` Array method. Then, `handleClick` updates the `nextSquares` array to add `X` to the first (`[0]` index) square. + +Calling the `setSquares` function lets React know the state of the component has changed. This will trigger a re-render of the components that use the `squares` state (`Board`) as well as its child components (the `Square` components that make up the board). + +<Note> + +JavaScript supports [closures](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures) which means an inner function (e.g. `handleClick`) has access to variables and functions defined in a outer function (e.g. `Board`). The `handleClick` function can read the `squares` state and call the `setSquares` method because they are both defined inside of the `Board` function. + +</Note> + +Now you can add X's to the board... but only to the upper left square. Your `handleClick` function is hardcoded to update the index for the upper left square (`0`). Let's update `handleClick` to be able to update any square. Add an argument `i` to the `handleClick` function that takes the index of the square to update: + +```js +export default function Board() { + const [squares, setSquares] = useState(Array(9).fill(null)); + + function handleClick(i) { + const nextSquares = squares.slice(); + nextSquares[i] = "X"; + setSquares(nextSquares); + } + + return ( + // ... + ) +} +``` + +Next, you will need to pass that `i` to `handleClick`. You could try to set the `onSquareClick` prop of square to be `handleClick(0)` directly in the JSX like this, but it won't work: + +```jsx +<Square value={squares[0]} onSquareClick={handleClick(0)} /> +``` + +Here is why this doesn't work. The `handleClick(0)` call will be a part of rendering the board component. Because `handleClick(0)` alters the state of the board component by calling `setSquares`, your entire board component will be re-rendered again. But this runs `handleClick(0)` again, leading to an infinite loop: + +<ConsoleBlock level="error"> + +Too many re-renders. React limits the number of renders to prevent an infinite loop. + +</ConsoleBlock> + +Why didn't this problem happen earlier? + +When you were passing `onSquareClick={handleClick}`, you were passing the `handleClick` function down as a prop. You were not calling it! But now you are _calling_ that function right away--notice the parentheses in `handleClick(0)`--and that's why it runs too early. You don't _want_ to call `handleClick` until the user clicks! + +You could fix by creating a function like `handleFirstSquareClick` that calls `handleClick(0)`, a function like `handleSecondSquareClick` that calls `handleClick(1)`, and so on. You would pass (rather than call) these functions down as props like `onSquareClick={handleFirstSquareClick}`. This would solve the infinite loop. + +However, defining nine different functions and giving each of them a name is too verbose. Instead, let's do this: + +```js +export default function Board() { + // ... + return ( + <> + <div className="board-row"> + <Square value={squares[0]} onSquareClick={() => handleClick(0)} /> + // ... + ); +} +``` + +Notice the new `() =>` syntax. Here, `() => handleClick(0)` is an _arrow function,_ which is a shorter way to define functions. When the square is clicked, the code after the `=>` "arrow" will run, calling `handleClick(0)`. + +Now you need to update the other eight squares to call `handleClick` from the arrow functions you pass. Make sure that the argument for each call of the `handleClick` corresponds to the index of the correct square: + +```js +export default function Board() { + // ... + return ( + <> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); +} +``` + +Now you can again add X's to any square on the board by clicking on them: + +![filling the board with X]() + +But this time all the state management is handled by the `Board` component! + +This is what your code should look like: + +```js +import { useState } from "react"; + +function Square({ value, onSquareClick }) { + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); +} + +export default function Board() { + const [squares, setSquares] = useState(Array(9).fill(null)); + + function handleClick(i) { + const nextSquares = squares.slice(); + nextSquares[i] = "X"; + setSquares(nextSquares); + } + + return ( + <> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +Now that your state handling is in the `Board` component, the parent `Board` component passes props to the child `Square` components so that they can be displayed correctly. When clicking on a `Square`, the child `Square` component now asks the parent `Board` component to update the state of the board. When the `Board`'s state changes, both the `Board` component and every child `Square` re-renders automatically. Keeping the state of all squares in the `Board` component will allow it to determine the winner in the future. + +Let's recap what happens when a user clicks the top left square on your board to add an `X` to it: + +1. Clicking on the upper left square runs the function that the `button` received as its `on_click` prop from the `Square`. The `Square` component received that function as its `onSquareClick` prop from the `Board`. The `Board` component defined that function directly in the JSX. It calls `handleClick` with an argument of `0`. +1. `handleClick` uses the argument (`0`) to update the first element of the `squares` array from `null` to `X`. +1. The `squares` state of the `Board` component was updated, so the `Board` and all of its children re-render. This causes the `value` prop of the `Square` component with index `0` to change from `null` to `X`. + +In the end the user sees that the upper left square has changed from empty to having a `X` after clicking it. + +<Note> + +The DOM `<button>` element's `on_click` attribute has a special meaning to React because it is a built-in component. For custom components like Square, the naming is up to you. You could give any name to the `Square`'s `onSquareClick` prop or `Board`'s `handleClick` function, and the code would work the same. In React, it's conventional to use `onSomething` names for props which represent events and `handleSomething` for the function definitions which handle those events. + +</Note> + +### Why immutability is important + +Note how in `handleClick`, you call `.slice()` to create a copy of the `squares` array instead of modifying the existing array. To explain why, we need to discuss immutability and why immutability is important to learn. + +There are generally two approaches to changing data. The first approach is to _mutate_ the data by directly changing the data's values. The second approach is to replace the data with a new copy which has the desired changes. Here is what it would look like if you mutated the `squares` array: + +```jsx +const squares = [null, null, null, null, null, null, null, null, null]; +squares[0] = "X"; +// Now `squares` is ["X", null, null, null, null, null, null, null, null]; +``` + +And here is what it would look like if you changed data without mutating the `squares` array: + +```jsx +const squares = [null, null, null, null, null, null, null, null, null]; +const nextSquares = ["X", null, null, null, null, null, null, null, null]; +// Now `squares` is unchanged, but `nextSquares` first element is 'X' rather than `null` +``` + +The result is the same but by not mutating (changing the underlying data) directly, you gain several benefits. + +Immutability makes complex features much easier to implement. Later in this tutorial, you will implement a "time travel" feature that lets you review the game's history and "jump back" to past moves. This functionality isn't specific to games--an ability to undo and redo certain actions is a common requirement for apps. Avoiding direct data mutation lets you keep previous versions of the data intact, and reuse them later. + +There is also another benefit of immutability. By default, all child components re-render automatically when the state of a parent component changes. This includes even the child components that weren't affected by the change. Although re-rendering is not by itself noticeable to the user (you shouldn't actively try to avoid it!), you might want to skip re-rendering a part of the tree that clearly wasn't affected by it for performance reasons. Immutability makes it very cheap for components to compare whether their data has changed or not. You can learn more about how React chooses when to re-render a component in [the `memo` API reference](/reference/react/memo). + +### Taking turns + +It's now time to fix a major defect in this tic-tac-toe game: the "O"s cannot be marked on the board. + +You'll set the first move to be "X" by default. Let's keep track of this by adding another piece of state to the Board component: + +```js +function Board() { + const [xIsNext, setXIsNext] = useState(true); + const [squares, setSquares] = useState(Array(9).fill(null)); + + // ... +} +``` + +Each time a player moves, `xIsNext` (a boolean) will be flipped to determine which player goes next and the game's state will be saved. You'll update the `Board`'s `handleClick` function to flip the value of `xIsNext`: + +```js +export default function Board() { + const [xIsNext, setXIsNext] = useState(true); + const [squares, setSquares] = useState(Array(9).fill(null)); + + function handleClick(i) { + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + setSquares(nextSquares); + setXIsNext(!xIsNext); + } + + return ( + //... + ); +} +``` + +Now, as you click on different squares, they will alternate between `X` and `O`, as they should! + +But wait, there's a problem. Try clicking on the same square multiple times: + +![O overwriting an X]() + +The `X` is overwritten by an `O`! While this would add a very interesting twist to the game, we're going to stick to the original rules for now. + +When you mark a square with a `X` or an `O` you aren't first checking to see if the square already has a `X` or `O` value. You can fix this by _returning early_. You'll check to see if the square already has a `X` or an `O`. If the square is already filled, you will `return` in the `handleClick` function early--before it tries to update the board state. + +```js +function handleClick(i) { + if (squares[i]) { + return; + } + const nextSquares = squares.slice(); + //... +} +``` + +Now you can only add `X`'s or `O`'s to empty squares! Here is what your code should look like at this point: + +```js +import { useState } from "react"; + +function Square({ value, onSquareClick }) { + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); +} + +export default function Board() { + const [xIsNext, setXIsNext] = useState(true); + const [squares, setSquares] = useState(Array(9).fill(null)); + + function handleClick(i) { + if (squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + setSquares(nextSquares); + setXIsNext(!xIsNext); + } + + return ( + <> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +### Declaring a winner + +Now that the players can take turns, you'll want to show when the game is won and there are no more turns to make. To do this you'll add a helper function called `calculateWinner` that takes an array of 9 squares, checks for a winner and returns `'X'`, `'O'`, or `null` as appropriate. Don't worry too much about the `calculateWinner` function; it's not specific to React: + +```js +export default function Board() { + //... +} + +function calculateWinner(squares) { + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; +} +``` + +<Note> + +It does not matter whether you define `calculateWinner` before or after the `Board`. Let's put it at the end so that you don't have to scroll past it every time you edit your components. + +</Note> + +You will call `calculateWinner(squares)` in the `Board` component's `handleClick` function to check if a player has won. You can perform this check at the same time you check if a user has clicked a square that already has a `X` or and `O`. We'd like to return early in both cases: + +```js +function handleClick(i) { + if (squares[i] || calculateWinner(squares)) { + return; + } + const nextSquares = squares.slice(); + //... +} +``` + +To let the players know when the game is over, you can display text such as "Winner: X" or "Winner: O". To do that you'll add a `status` section to the `Board` component. The status will display the winner if the game is over and if the game is ongoing you'll display which player's turn is next: + +```js +export default function Board() { + // ... + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + // ... + ) +} +``` + +Congratulations! You now have a working tic-tac-toe game. And you've just learned the basics of React too. So _you_ are the real winner here. Here is what the code should look like: + +```js +import { useState } from "react"; + +function Square({ value, onSquareClick }) { + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); +} + +export default function Board() { + const [xIsNext, setXIsNext] = useState(true); + const [squares, setSquares] = useState(Array(9).fill(null)); + + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + setSquares(nextSquares); + setXIsNext(!xIsNext); + } + + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); +} + +function calculateWinner(squares) { + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +## Adding time travel + +As a final exercise, let's make it possible to "go back in time" to the previous moves in the game. + +### Storing a history of moves + +If you mutated the `squares` array, implementing time travel would be very difficult. + +However, you used `slice()` to create a new copy of the `squares` array after every move, and treated it as immutable. This will allow you to store every past version of the `squares` array, and navigate between the turns that have already happened. + +You'll store the past `squares` arrays in another array called `history`, which you'll store as a new state variable. The `history` array represents all board states, from the first to the last move, and has a shape like this: + +```jsx +[ + // Before first move + [null, null, null, null, null, null, null, null, null], + // After first move + [null, null, null, null, "X", null, null, null, null], + // After second move + [null, null, null, null, "X", null, null, null, "O"], + // ... +]; +``` + +### Lifting state up, again + +You will now write a new top-level component called `Game` to display a list of past moves. That's where you will place the `history` state that contains the entire game history. + +Placing the `history` state into the `Game` component will let you remove the `squares` state from its child `Board` component. Just like you "lifted state up" from the `Square` component into the `Board` component, you will now lift it up from the `Board` into the top-level `Game` component. This gives the `Game` component full control over the `Board`'s data and lets it instruct the `Board` to render previous turns from the `history`. + +First, add a `Game` component with `export default`. Have it render the `Board` component and some markup: + +```js +function Board() { + // ... +} + +export default function Game() { + return ( + <div className="game"> + <div className="game-board"> + <Board /> + </div> + <div className="game-info"> + <ol>{/*TODO*/}</ol> + </div> + </div> + ); +} +``` + +Note that you are removing the `export default` keywords before the `function Board() {` declaration and adding them before the `function Game() {` declaration. This tells your `index.js` file to use the `Game` component as the top-level component instead of your `Board` component. The additional `div`s returned by the `Game` component are making room for the game information you'll add to the board later. + +Add some state to the `Game` component to track which player is next and the history of moves: + +```js +export default function Game() { + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + // ... +``` + +Notice how `[Array(9).fill(null)]` is an array with a single item, which itself is an array of 9 `null`s. + +To render the squares for the current move, you'll want to read the last squares array from the `history`. You don't need `useState` for this--you already have enough information to calculate it during rendering: + +```js +export default function Game() { + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const currentSquares = history[history.length - 1]; + // ... +``` + +Next, create a `handlePlay` function inside the `Game` component that will be called by the `Board` component to update the game. Pass `xIsNext`, `currentSquares` and `handlePlay` as props to the `Board` component: + +```js +export default function Game() { + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const currentSquares = history[history.length - 1]; + + function handlePlay(nextSquares) { + // TODO + } + + return ( + <div className="game"> + <div className="game-board"> + <Board xIsNext={xIsNext} squares={currentSquares} onPlay={handlePlay} /> + //... + ) +} +``` + +Let's make the `Board` component fully controlled by the props it receives. Change the `Board` component to take three props: `xIsNext`, `squares`, and a new `onPlay` function that `Board` can call with the updated squares array when a player makes a move. Next, remove the first two lines of the `Board` function that call `useState`: + +```js +function Board({ xIsNext, squares, onPlay }) { + function handleClick(i) { + //... + } + // ... +} +``` + +Now replace the `setSquares` and `setXIsNext` calls in `handleClick` in the `Board` component with a single call to your new `onPlay` function so the `Game` component can update the `Board` when the user clicks a square: + +```js +function Board({ xIsNext, squares, onPlay }) { + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + onPlay(nextSquares); + } + //... +} +``` + +The `Board` component is fully controlled by the props passed to it by the `Game` component. You need to implement the `handlePlay` function in the `Game` component to get the game working again. + +What should `handlePlay` do when called? Remember that Board used to call `setSquares` with an updated array; now it passes the updated `squares` array to `onPlay`. + +The `handlePlay` function needs to update `Game`'s state to trigger a re-render, but you don't have a `setSquares` function that you can call any more--you're now using the `history` state variable to store this information. You'll want to update `history` by appending the updated `squares` array as a new history entry. You also want to toggle `xIsNext`, just as Board used to do: + +```js +export default function Game() { + //... + function handlePlay(nextSquares) { + setHistory([...history, nextSquares]); + setXIsNext(!xIsNext); + } + //... +} +``` + +Here, `[...history, nextSquares]` creates a new array that contains all the items in `history`, followed by `nextSquares`. (You can read the `...history` [_spread syntax_](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax) as "enumerate all the items in `history`".) + +For example, if `history` is `[[null,null,null], ["X",null,null]]` and `nextSquares` is `["X",null,"O"]`, then the new `[...history, nextSquares]` array will be `[[null,null,null], ["X",null,null], ["X",null,"O"]]`. + +At this point, you've moved the state to live in the `Game` component, and the UI should be fully working, just as it was before the refactor. Here is what the code should look like at this point: + +```js +import { useState } from "react"; + +function Square({ value, onSquareClick }) { + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); +} + +function Board({ xIsNext, squares, onPlay }) { + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + onPlay(nextSquares); + } + + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); +} + +export default function Game() { + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const currentSquares = history[history.length - 1]; + + function handlePlay(nextSquares) { + setHistory([...history, nextSquares]); + setXIsNext(!xIsNext); + } + + return ( + <div className="game"> + <div className="game-board"> + <Board + xIsNext={xIsNext} + squares={currentSquares} + onPlay={handlePlay} + /> + </div> + <div className="game-info"> + <ol>{/*TODO*/}</ol> + </div> + </div> + ); +} + +function calculateWinner(squares) { + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +### Showing the past moves + +Since you are recording the tic-tac-toe game's history, you can now display a list of past moves to the player. + +React elements like `<button>` are regular JavaScript objects; you can pass them around in your application. To render multiple items in React, you can use an array of React elements. + +You already have an array of `history` moves in state, so now you need to transform it to an array of React elements. In JavaScript, to transform one array into another, you can use the [array `map` method:](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) + +```jsx +[1, 2, 3].map((x) => x * 2); // [2, 4, 6] +``` + +You'll use `map` to transform your `history` of moves into React elements representing buttons on the screen, and display a list of buttons to "jump" to past moves. Let's `map` over the `history` in the Game component: + +```js +export default function Game() { + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const currentSquares = history[history.length - 1]; + + function handlePlay(nextSquares) { + setHistory([...history, nextSquares]); + setXIsNext(!xIsNext); + } + + function jumpTo(nextMove) { + // TODO + } + + const moves = history.map((squares, move) => { + let description; + if (move > 0) { + description = "Go to move #" + move; + } else { + description = "Go to game start"; + } + return ( + <li> + <button on_click={() => jumpTo(move)}>{description}</button> + </li> + ); + }); + + return ( + <div className="game"> + <div className="game-board"> + <Board + xIsNext={xIsNext} + squares={currentSquares} + onPlay={handlePlay} + /> + </div> + <div className="game-info"> + <ol>{moves}</ol> + </div> + </div> + ); +} +``` + +You can see what your code should look like below. Note that you should see an error in the developer tools console that says: `` Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of `Game`. `` You'll fix this error in the next section. + +```js +import { useState } from "react"; + +function Square({ value, onSquareClick }) { + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); +} + +function Board({ xIsNext, squares, onPlay }) { + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + onPlay(nextSquares); + } + + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); +} + +export default function Game() { + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const currentSquares = history[history.length - 1]; + + function handlePlay(nextSquares) { + setHistory([...history, nextSquares]); + setXIsNext(!xIsNext); + } + + function jumpTo(nextMove) { + // TODO + } + + const moves = history.map((squares, move) => { + let description; + if (move > 0) { + description = "Go to move #" + move; + } else { + description = "Go to game start"; + } + return ( + <li> + <button on_click={() => jumpTo(move)}>{description}</button> + </li> + ); + }); + + return ( + <div className="game"> + <div className="game-board"> + <Board + xIsNext={xIsNext} + squares={currentSquares} + onPlay={handlePlay} + /> + </div> + <div className="game-info"> + <ol>{moves}</ol> + </div> + </div> + ); +} + +function calculateWinner(squares) { + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} + +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +As you iterate through `history` array inside the function you passed to `map`, the `squares` argument goes through each element of `history`, and the `move` argument goes through each array index: `0`, `1`, `2`, …. (In most cases, you'd need the actual array elements, but to render a list of moves you will only need indexes.) + +For each move in the tic-tac-toe game's history, you create a list item `<li>` which contains a button `<button>`. The button has an `on_click` handler which calls a function called `jumpTo` (that you haven't implemented yet). + +For now, you should see a list of the moves that occurred in the game and an error in the developer tools console. Let's discuss what the "key" error means. + +### Picking a key + +When you render a list, React stores some information about each rendered list item. When you update a list, React needs to determine what has changed. You could have added, removed, re-arranged, or updated the list's items. + +Imagine transitioning from + +```html +<li>Alexa: 7 tasks left</li> +<li>Ben: 5 tasks left</li> +``` + +to + +```html +<li>Ben: 9 tasks left</li> +<li>Claudia: 8 tasks left</li> +<li>Alexa: 5 tasks left</li> +``` + +In addition to the updated counts, a human reading this would probably say that you swapped Alexa and Ben's ordering and inserted Claudia between Alexa and Ben. However, React is a computer program and can't know what you intended, so you need to specify a _key_ property for each list item to differentiate each list item from its siblings. If your data was from a database, Alexa, Ben, and Claudia's database IDs could be used as keys. + +```js +<li key={user.id}> + {user.name}: {user.taskCount} tasks left +</li> +``` + +When a list is re-rendered, React takes each list item's key and searches the previous list's items for a matching key. If the current list has a key that didn't exist before, React creates a component. If the current list is missing a key that existed in the previous list, React destroys the previous component. If two keys match, the corresponding component is moved. + +Keys tell React about the identity of each component, which allows React to maintain state between re-renders. If a component's key changes, the component will be destroyed and re-created with a new state. + +`key` is a special and reserved property in React. When an element is created, React extracts the `key` property and stores the key directly on the returned element. Even though `key` may look like it is passed as props, React automatically uses `key` to decide which components to update. There's no way for a component to ask what `key` its parent specified. + +**It's strongly recommended that you assign proper keys whenever you build dynamic lists.** If you don't have an appropriate key, you may want to consider restructuring your data so that you do. + +If no key is specified, React will report an error and use the array index as a key by default. Using the array index as a key is problematic when trying to re-order a list's items or inserting/removing list items. Explicitly passing `key={i}` silences the error but has the same problems as array indices and is not recommended in most cases. + +Keys do not need to be globally unique; they only need to be unique between components and their siblings. + +### Implementing time travel + +In the tic-tac-toe game's history, each past move has a unique ID associated with it: it's the sequential number of the move. Moves will never be re-ordered, deleted, or inserted in the middle, so it's safe to use the move index as a key. + +In the `Game` function, you can add the key as `<li key={move}>`, and if you reload the rendered game, React's "key" error should disappear: + +```js +const moves = history.map((squares, move) => { + //... + return ( + <li key={move}> + <button on_click={() => jumpTo(move)}>{description}</button> + </li> + ); +}); +``` + +```js +import { useState } from "react"; + +function Square({ value, onSquareClick }) { + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); +} + +function Board({ xIsNext, squares, onPlay }) { + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + onPlay(nextSquares); + } + + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); +} + +export default function Game() { + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const currentSquares = history[history.length - 1]; + + function handlePlay(nextSquares) { + setHistory([...history, nextSquares]); + setXIsNext(!xIsNext); + } + + function jumpTo(nextMove) { + // TODO + } + + const moves = history.map((squares, move) => { + let description; + if (move > 0) { + description = "Go to move #" + move; + } else { + description = "Go to game start"; + } + return ( + <li key={move}> + <button on_click={() => jumpTo(move)}>{description}</button> + </li> + ); + }); + + return ( + <div className="game"> + <div className="game-board"> + <Board + xIsNext={xIsNext} + squares={currentSquares} + onPlay={handlePlay} + /> + </div> + <div className="game-info"> + <ol>{moves}</ol> + </div> + </div> + ); +} + +function calculateWinner(squares) { + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} + +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +Before you can implement `jumpTo`, you need the `Game` component to keep track of which step the user is currently viewing. To do this, define a new state variable called `currentMove`, defaulting to `0`: + +```js +export default function Game() { + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const [currentMove, setCurrentMove] = useState(0); + const currentSquares = history[history.length - 1]; + //... +} +``` + +Next, update the `jumpTo` function inside `Game` to update that `currentMove`. You'll also set `xIsNext` to `true` if the number that you're changing `currentMove` to is even. + +```js +export default function Game() { + // ... + function jumpTo(nextMove) { + setCurrentMove(nextMove); + setXIsNext(nextMove % 2 === 0); + } + //... +} +``` + +You will now make two changes to the `Game`'s `handlePlay` function which is called when you click on a square. + +- If you "go back in time" and then make a new move from that point, you only want to keep the history up to that point. Instead of adding `nextSquares` after all items (`...` spread syntax) in `history`, you'll add it after all items in `history.slice(0, currentMove + 1)` so that you're only keeping that portion of the old history. +- Each time a move is made, you need to update `currentMove` to point to the latest history entry. + +```js +function handlePlay(nextSquares) { + const nextHistory = [...history.slice(0, currentMove + 1), nextSquares]; + setHistory(nextHistory); + setCurrentMove(nextHistory.length - 1); + setXIsNext(!xIsNext); +} +``` + +Finally, you will modify the `Game` component to render the currently selected move, instead of always rendering the final move: + +```js +export default function Game() { + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const [currentMove, setCurrentMove] = useState(0); + const currentSquares = history[currentMove]; + + // ... +} +``` + +If you click on any step in the game's history, the tic-tac-toe board should immediately update to show what the board looked like after that step occurred. + +```js +import { useState } from "react"; + +function Square({ value, onSquareClick }) { + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); +} + +function Board({ xIsNext, squares, onPlay }) { + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + onPlay(nextSquares); + } + + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); +} + +export default function Game() { + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const [currentMove, setCurrentMove] = useState(0); + const currentSquares = history[currentMove]; + + function handlePlay(nextSquares) { + const nextHistory = [...history.slice(0, currentMove + 1), nextSquares]; + setHistory(nextHistory); + setCurrentMove(nextHistory.length - 1); + setXIsNext(!xIsNext); + } + + function jumpTo(nextMove) { + setCurrentMove(nextMove); + setXIsNext(nextMove % 2 === 0); + } + + const moves = history.map((squares, move) => { + let description; + if (move > 0) { + description = "Go to move #" + move; + } else { + description = "Go to game start"; + } + return ( + <li key={move}> + <button on_click={() => jumpTo(move)}>{description}</button> + </li> + ); + }); + + return ( + <div className="game"> + <div className="game-board"> + <Board + xIsNext={xIsNext} + squares={currentSquares} + onPlay={handlePlay} + /> + </div> + <div className="game-info"> + <ol>{moves}</ol> + </div> + </div> + ); +} + +function calculateWinner(squares) { + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +### Final cleanup + +If you look at the code very closely, you may notice that `xIsNext === true` when `currentMove` is even and `xIsNext === false` when `currentMove` is odd. In other words, if you know the value of `currentMove`, then you can always figure out what `xIsNext` should be. + +There's no reason for you to store both of these in state. In fact, always try to avoid redundant state. Simplifying what you store in state reduces bugs and makes your code easier to understand. Change `Game` so that it doesn't store `xIsNext` as a separate state variable and instead figures it out based on the `currentMove`: + +```js +export default function Game() { + const [history, setHistory] = useState([Array(9).fill(null)]); + const [currentMove, setCurrentMove] = useState(0); + const xIsNext = currentMove % 2 === 0; + const currentSquares = history[currentMove]; + + function handlePlay(nextSquares) { + const nextHistory = [...history.slice(0, currentMove + 1), nextSquares]; + setHistory(nextHistory); + setCurrentMove(nextHistory.length - 1); + } + + function jumpTo(nextMove) { + setCurrentMove(nextMove); + } + // ... +} +``` + +You no longer need the `xIsNext` state declaration or the calls to `setXIsNext`. Now, there's no chance for `xIsNext` to get out of sync with `currentMove`, even if you make a mistake while coding the components. + +### Wrapping up + +Congratulations! You've created a tic-tac-toe game that: + +- Lets you play tic-tac-toe, +- Indicates when a player has won the game, +- Stores a game's history as a game progresses, +- Allows players to review a game's history and see previous versions of a game's board. + +Nice work! We hope you now feel like you have a decent grasp of how React works. + +Check out the final result here: + +```js +import { useState } from "react"; + +function Square({ value, onSquareClick }) { + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); +} + +function Board({ xIsNext, squares, onPlay }) { + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + onPlay(nextSquares); + } + + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); +} + +export default function Game() { + const [history, setHistory] = useState([Array(9).fill(null)]); + const [currentMove, setCurrentMove] = useState(0); + const xIsNext = currentMove % 2 === 0; + const currentSquares = history[currentMove]; + + function handlePlay(nextSquares) { + const nextHistory = [...history.slice(0, currentMove + 1), nextSquares]; + setHistory(nextHistory); + setCurrentMove(nextHistory.length - 1); + } + + function jumpTo(nextMove) { + setCurrentMove(nextMove); + } + + const moves = history.map((squares, move) => { + let description; + if (move > 0) { + description = "Go to move #" + move; + } else { + description = "Go to game start"; + } + return ( + <li key={move}> + <button on_click={() => jumpTo(move)}>{description}</button> + </li> + ); + }); + + return ( + <div className="game"> + <div className="game-board"> + <Board + xIsNext={xIsNext} + squares={currentSquares} + onPlay={handlePlay} + /> + </div> + <div className="game-info"> + <ol>{moves}</ol> + </div> + </div> + ); +} + +function calculateWinner(squares) { + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; +} +``` + +```css +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} +``` + +If you have extra time or want to practice your new React skills, here are some ideas for improvements that you could make to the tic-tac-toe game, listed in order of increasing difficulty: + +1. For the current move only, show "You are at move #..." instead of a button. +1. Rewrite `Board` to use two loops to make the squares instead of hardcoding them. +1. Add a toggle button that lets you sort the moves in either ascending or descending order. +1. When someone wins, highlight the three squares that caused the win (and when no one wins, display a message about the result being a draw). +1. Display the location for each move in the format (row, col) in the move history list. + +Throughout this tutorial, you've touched on React concepts including elements, components, props, and state. Now that you've seen how these concepts work when building a game, check out [Thinking in React](/learn/thinking-in-react) to see how the same React concepts work when build an app's UI. diff --git a/docs/src/learn/updating-arrays-in-state.md b/docs/src/learn/updating-arrays-in-state.md new file mode 100644 index 000000000..ee031175d --- /dev/null +++ b/docs/src/learn/updating-arrays-in-state.md @@ -0,0 +1,1853 @@ +--- +title: Updating Arrays in State 🚧 +--- + +## Overview + +<p class="intro" markdown> + +Arrays are mutable in JavaScript, but you should treat them as immutable when you store them in state. Just like with objects, when you want to update an array stored in state, you need to create a new one (or make a copy of an existing one), and then set state to use the new array. + +</p> + +!!! summary "You Will Learn" + + - How to add, remove, or change items in an array in React state + - How to update an object inside of an array + - How to make array copying less repetitive with Immer + +## Updating arrays without mutation + +In JavaScript, arrays are just another kind of object. [Like with objects](/learn/updating-objects-in-state), **you should treat arrays in React state as read-only.** This means that you shouldn't reassign items inside an array like `arr[0] = 'bird'`, and you also shouldn't use methods that mutate the array, such as `push()` and `pop()`. + +Instead, every time you want to update an array, you'll want to pass a _new_ array to your state setting function. To do that, you can create a new array from the original array in your state by calling its non-mutating methods like `filter()` and `map()`. Then you can set your state to the resulting new array. + +Here is a reference table of common array operations. When dealing with arrays inside React state, you will need to avoid the methods in the left column, and instead prefer the methods in the right column: + +| | avoid (mutates the array) | prefer (returns a new array) | +| --- | --- | --- | +| adding | `push`, `unshift` | `concat`, `[...arr]` spread syntax ([example](#adding-to-an-array)) | +| removing | `pop`, `shift`, `splice` | `filter`, `slice` ([example](#removing-from-an-array)) | +| replacing | `splice`, `arr[i] = ...` assignment | `map` ([example](#replacing-items-in-an-array)) | +| sorting | `reverse`, `sort` | copy the array first ([example](#making-other-changes-to-an-array)) | + +Alternatively, you can [use Immer](#write-concise-update-logic-with-immer) which lets you use methods from both columns. + +<Pitfall> + +Unfortunately, [`slice`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice) and [`splice`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice) are named similarly but are very different: + +- `slice` lets you copy an array or a part of it. +- `splice` **mutates** the array (to insert or delete items). + +In React, you will be using `slice` (no `p`!) a lot more often because you don't want to mutate objects or arrays in state. [Updating Objects](/learn/updating-objects-in-state) explains what mutation is and why it's not recommended for state. + +</Pitfall> + +### Adding to an array + +`push()` will mutate an array, which you don't want: + +```js +import { useState } from "react"; + +let nextId = 0; + +export default function List() { + const [name, setName] = useState(""); + const [artists, setArtists] = useState([]); + + return ( + <> + <h1>Inspiring sculptors:</h1> + <input value={name} onChange={(e) => setName(e.target.value)} /> + <button + on_click={() => { + artists.push({ + id: nextId++, + name: name, + }); + }} + > + Add + </button> + <ul> + {artists.map((artist) => ( + <li key={artist.id}>{artist.name}</li> + ))} + </ul> + </> + ); +} +``` + +```css +button { + margin-left: 5px; +} +``` + +Instead, create a _new_ array which contains the existing items _and_ a new item at the end. There are multiple ways to do this, but the easiest one is to use the `...` [array spread](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax#spread_in_array_literals) syntax: + +```js +setArtists( + // Replace the state + [ + // with a new array + ...artists, // that contains all the old items + { id: nextId++, name: name }, // and one new item at the end + ] +); +``` + +Now it works correctly: + +```js +import { useState } from "react"; + +let nextId = 0; + +export default function List() { + const [name, setName] = useState(""); + const [artists, setArtists] = useState([]); + + return ( + <> + <h1>Inspiring sculptors:</h1> + <input value={name} onChange={(e) => setName(e.target.value)} /> + <button + on_click={() => { + setArtists([...artists, { id: nextId++, name: name }]); + }} + > + Add + </button> + <ul> + {artists.map((artist) => ( + <li key={artist.id}>{artist.name}</li> + ))} + </ul> + </> + ); +} +``` + +```css +button { + margin-left: 5px; +} +``` + +The array spread syntax also lets you prepend an item by placing it _before_ the original `...artists`: + +```js +setArtists([ + { id: nextId++, name: name }, + ...artists, // Put old items at the end +]); +``` + +In this way, spread can do the job of both `push()` by adding to the end of an array and `unshift()` by adding to the beginning of an array. Try it in the sandbox above! + +### Removing from an array + +The easiest way to remove an item from an array is to _filter it out_. In other words, you will produce a new array that will not contain that item. To do this, use the `filter` method, for example: + +```js +import { useState } from "react"; + +let initialArtists = [ + { id: 0, name: "Marta Colvin Andrade" }, + { id: 1, name: "Lamidi Olonade Fakeye" }, + { id: 2, name: "Louise Nevelson" }, +]; + +export default function List() { + const [artists, setArtists] = useState(initialArtists); + + return ( + <> + <h1>Inspiring sculptors:</h1> + <ul> + {artists.map((artist) => ( + <li key={artist.id}> + {artist.name}{" "} + <button + on_click={() => { + setArtists( + artists.filter((a) => a.id !== artist.id) + ); + }} + > + Delete + </button> + </li> + ))} + </ul> + </> + ); +} +``` + +Click the "Delete" button a few times, and look at its click handler. + +```js +setArtists(artists.filter((a) => a.id !== artist.id)); +``` + +Here, `artists.filter(a => a.id !== artist.id)` means "create an array that consists of those `artists` whose IDs are different from `artist.id`". In other words, each artist's "Delete" button will filter _that_ artist out of the array, and then request a re-render with the resulting array. Note that `filter` does not modify the original array. + +### Transforming an array + +If you want to change some or all items of the array, you can use `map()` to create a **new** array. The function you will pass to `map` can decide what to do with each item, based on its data or its index (or both). + +In this example, an array holds coordinates of two circles and a square. When you press the button, it moves only the circles down by 50 pixels. It does this by producing a new array of data using `map()`: + +```js +import { useState } from "react"; + +let initialShapes = [ + { id: 0, type: "circle", x: 50, y: 100 }, + { id: 1, type: "square", x: 150, y: 100 }, + { id: 2, type: "circle", x: 250, y: 100 }, +]; + +export default function ShapeEditor() { + const [shapes, setShapes] = useState(initialShapes); + + function handleClick() { + const nextShapes = shapes.map((shape) => { + if (shape.type === "square") { + // No change + return shape; + } else { + // Return a new circle 50px below + return { + ...shape, + y: shape.y + 50, + }; + } + }); + // Re-render with the new array + setShapes(nextShapes); + } + + return ( + <> + <button on_click={handleClick}>Move circles down!</button> + {shapes.map((shape) => ( + <div + key={shape.id} + style={{ + background: "purple", + position: "absolute", + left: shape.x, + top: shape.y, + borderRadius: shape.type === "circle" ? "50%" : "", + width: 20, + height: 20, + }} + /> + ))} + </> + ); +} +``` + +```css +body { + height: 300px; +} +``` + +### Replacing items in an array + +It is particularly common to want to replace one or more items in an array. Assignments like `arr[0] = 'bird'` are mutating the original array, so instead you'll want to use `map` for this as well. + +To replace an item, create a new array with `map`. Inside your `map` call, you will receive the item index as the second argument. Use it to decide whether to return the original item (the first argument) or something else: + +```js +import { useState } from "react"; + +let initialCounters = [0, 0, 0]; + +export default function CounterList() { + const [counters, setCounters] = useState(initialCounters); + + function handleIncrementClick(index) { + const nextCounters = counters.map((c, i) => { + if (i === index) { + // Increment the clicked counter + return c + 1; + } else { + // The rest haven't changed + return c; + } + }); + setCounters(nextCounters); + } + + return ( + <ul> + {counters.map((counter, i) => ( + <li key={i}> + {counter} + <button + on_click={() => { + handleIncrementClick(i); + }} + > + +1 + </button> + </li> + ))} + </ul> + ); +} +``` + +```css +button { + margin: 5px; +} +``` + +### Inserting into an array + +Sometimes, you may want to insert an item at a particular position that's neither at the beginning nor at the end. To do this, you can use the `...` array spread syntax together with the `slice()` method. The `slice()` method lets you cut a "slice" of the array. To insert an item, you will create an array that spreads the slice _before_ the insertion point, then the new item, and then the rest of the original array. + +In this example, the Insert button always inserts at the index `1`: + +```js +import { useState } from "react"; + +let nextId = 3; +const initialArtists = [ + { id: 0, name: "Marta Colvin Andrade" }, + { id: 1, name: "Lamidi Olonade Fakeye" }, + { id: 2, name: "Louise Nevelson" }, +]; + +export default function List() { + const [name, setName] = useState(""); + const [artists, setArtists] = useState(initialArtists); + + function handleClick() { + const insertAt = 1; // Could be any index + const nextArtists = [ + // Items before the insertion point: + ...artists.slice(0, insertAt), + // New item: + { id: nextId++, name: name }, + // Items after the insertion point: + ...artists.slice(insertAt), + ]; + setArtists(nextArtists); + setName(""); + } + + return ( + <> + <h1>Inspiring sculptors:</h1> + <input value={name} onChange={(e) => setName(e.target.value)} /> + <button on_click={handleClick}>Insert</button> + <ul> + {artists.map((artist) => ( + <li key={artist.id}>{artist.name}</li> + ))} + </ul> + </> + ); +} +``` + +```css +button { + margin-left: 5px; +} +``` + +### Making other changes to an array + +There are some things you can't do with the spread syntax and non-mutating methods like `map()` and `filter()` alone. For example, you may want to reverse or sort an array. The JavaScript `reverse()` and `sort()` methods are mutating the original array, so you can't use them directly. + +**However, you can copy the array first, and then make changes to it.** + +For example: + +```js +import { useState } from "react"; + +let nextId = 3; +const initialList = [ + { id: 0, title: "Big Bellies" }, + { id: 1, title: "Lunar Landscape" }, + { id: 2, title: "Terracotta Army" }, +]; + +export default function List() { + const [list, setList] = useState(initialList); + + function handleClick() { + const nextList = [...list]; + nextList.reverse(); + setList(nextList); + } + + return ( + <> + <button on_click={handleClick}>Reverse</button> + <ul> + {list.map((artwork) => ( + <li key={artwork.id}>{artwork.title}</li> + ))} + </ul> + </> + ); +} +``` + +Here, you use the `[...list]` spread syntax to create a copy of the original array first. Now that you have a copy, you can use mutating methods like `nextList.reverse()` or `nextList.sort()`, or even assign individual items with `nextList[0] = "something"`. + +However, **even if you copy an array, you can't mutate existing items _inside_ of it directly.** This is because copying is shallow--the new array will contain the same items as the original one. So if you modify an object inside the copied array, you are mutating the existing state. For example, code like this is a problem. + +```js +const nextList = [...list]; +nextList[0].seen = true; // Problem: mutates list[0] +setList(nextList); +``` + +Although `nextList` and `list` are two different arrays, **`nextList[0]` and `list[0]` point to the same object.** So by changing `nextList[0].seen`, you are also changing `list[0].seen`. This is a state mutation, which you should avoid! You can solve this issue in a similar way to [updating nested JavaScript objects](/learn/updating-objects-in-state#updating-a-nested-object)--by copying individual items you want to change instead of mutating them. Here's how. + +## Updating objects inside arrays + +Objects are not _really_ located "inside" arrays. They might appear to be "inside" in code, but each object in an array is a separate value, to which the array "points". This is why you need to be careful when changing nested fields like `list[0]`. Another person's artwork list may point to the same element of the array! + +**When updating nested state, you need to create copies from the point where you want to update, and all the way up to the top level.** Let's see how this works. + +In this example, two separate artwork lists have the same initial state. They are supposed to be isolated, but because of a mutation, their state is accidentally shared, and checking a box in one list affects the other list: + +```js +import { useState } from "react"; + +let nextId = 3; +const initialList = [ + { id: 0, title: "Big Bellies", seen: false }, + { id: 1, title: "Lunar Landscape", seen: false }, + { id: 2, title: "Terracotta Army", seen: true }, +]; + +export default function BucketList() { + const [myList, setMyList] = useState(initialList); + const [yourList, setYourList] = useState(initialList); + + function handleToggleMyList(artworkId, nextSeen) { + const myNextList = [...myList]; + const artwork = myNextList.find((a) => a.id === artworkId); + artwork.seen = nextSeen; + setMyList(myNextList); + } + + function handleToggleYourList(artworkId, nextSeen) { + const yourNextList = [...yourList]; + const artwork = yourNextList.find((a) => a.id === artworkId); + artwork.seen = nextSeen; + setYourList(yourNextList); + } + + return ( + <> + <h1>Art Bucket List</h1> + <h2>My list of art to see:</h2> + <ItemList artworks={myList} onToggle={handleToggleMyList} /> + <h2>Your list of art to see:</h2> + <ItemList artworks={yourList} onToggle={handleToggleYourList} /> + </> + ); +} + +function ItemList({ artworks, onToggle }) { + return ( + <ul> + {artworks.map((artwork) => ( + <li key={artwork.id}> + <label> + <input + type="checkbox" + checked={artwork.seen} + onChange={(e) => { + onToggle(artwork.id, e.target.checked); + }} + /> + {artwork.title} + </label> + </li> + ))} + </ul> + ); +} +``` + +The problem is in code like this: + +```js +const myNextList = [...myList]; +const artwork = myNextList.find((a) => a.id === artworkId); +artwork.seen = nextSeen; // Problem: mutates an existing item +setMyList(myNextList); +``` + +Although the `myNextList` array itself is new, the _items themselves_ are the same as in the original `myList` array. So changing `artwork.seen` changes the _original_ artwork item. That artwork item is also in `yourList`, which causes the bug. Bugs like this can be difficult to think about, but thankfully they disappear if you avoid mutating state. + +**You can use `map` to substitute an old item with its updated version without mutation.** + +```js +setMyList( + myList.map((artwork) => { + if (artwork.id === artworkId) { + // Create a *new* object with changes + return { ...artwork, seen: nextSeen }; + } else { + // No changes + return artwork; + } + }) +); +``` + +Here, `...` is the object spread syntax used to [create a copy of an object.](/learn/updating-objects-in-state#copying-objects-with-the-spread-syntax) + +With this approach, none of the existing state items are being mutated, and the bug is fixed: + +```js +import { useState } from "react"; + +let nextId = 3; +const initialList = [ + { id: 0, title: "Big Bellies", seen: false }, + { id: 1, title: "Lunar Landscape", seen: false }, + { id: 2, title: "Terracotta Army", seen: true }, +]; + +export default function BucketList() { + const [myList, setMyList] = useState(initialList); + const [yourList, setYourList] = useState(initialList); + + function handleToggleMyList(artworkId, nextSeen) { + setMyList( + myList.map((artwork) => { + if (artwork.id === artworkId) { + // Create a *new* object with changes + return { ...artwork, seen: nextSeen }; + } else { + // No changes + return artwork; + } + }) + ); + } + + function handleToggleYourList(artworkId, nextSeen) { + setYourList( + yourList.map((artwork) => { + if (artwork.id === artworkId) { + // Create a *new* object with changes + return { ...artwork, seen: nextSeen }; + } else { + // No changes + return artwork; + } + }) + ); + } + + return ( + <> + <h1>Art Bucket List</h1> + <h2>My list of art to see:</h2> + <ItemList artworks={myList} onToggle={handleToggleMyList} /> + <h2>Your list of art to see:</h2> + <ItemList artworks={yourList} onToggle={handleToggleYourList} /> + </> + ); +} + +function ItemList({ artworks, onToggle }) { + return ( + <ul> + {artworks.map((artwork) => ( + <li key={artwork.id}> + <label> + <input + type="checkbox" + checked={artwork.seen} + onChange={(e) => { + onToggle(artwork.id, e.target.checked); + }} + /> + {artwork.title} + </label> + </li> + ))} + </ul> + ); +} +``` + +In general, **you should only mutate objects that you have just created.** If you were inserting a _new_ artwork, you could mutate it, but if you're dealing with something that's already in state, you need to make a copy. + +### Write concise update logic with Immer + +Updating nested arrays without mutation can get a little bit repetitive. [Just as with objects](/learn/updating-objects-in-state#write-concise-update-logic-with-immer): + +- Generally, you shouldn't need to update state more than a couple of levels deep. If your state objects are very deep, you might want to [restructure them differently](/learn/choosing-the-state-structure#avoid-deeply-nested-state) so that they are flat. +- If you don't want to change your state structure, you might prefer to use [Immer](https://github.com/immerjs/use-immer), which lets you write using the convenient but mutating syntax and takes care of producing the copies for you. + +Here is the Art Bucket List example rewritten with Immer: + +```js +import { useState } from "react"; +import { useImmer } from "use-immer"; + +let nextId = 3; +const initialList = [ + { id: 0, title: "Big Bellies", seen: false }, + { id: 1, title: "Lunar Landscape", seen: false }, + { id: 2, title: "Terracotta Army", seen: true }, +]; + +export default function BucketList() { + const [myList, updateMyList] = useImmer(initialList); + const [yourList, updateYourList] = useImmer(initialList); + + function handleToggleMyList(id, nextSeen) { + updateMyList((draft) => { + const artwork = draft.find((a) => a.id === id); + artwork.seen = nextSeen; + }); + } + + function handleToggleYourList(artworkId, nextSeen) { + updateYourList((draft) => { + const artwork = draft.find((a) => a.id === artworkId); + artwork.seen = nextSeen; + }); + } + + return ( + <> + <h1>Art Bucket List</h1> + <h2>My list of art to see:</h2> + <ItemList artworks={myList} onToggle={handleToggleMyList} /> + <h2>Your list of art to see:</h2> + <ItemList artworks={yourList} onToggle={handleToggleYourList} /> + </> + ); +} + +function ItemList({ artworks, onToggle }) { + return ( + <ul> + {artworks.map((artwork) => ( + <li key={artwork.id}> + <label> + <input + type="checkbox" + checked={artwork.seen} + onChange={(e) => { + onToggle(artwork.id, e.target.checked); + }} + /> + {artwork.title} + </label> + </li> + ))} + </ul> + ); +} +``` + +```json +{ + "dependencies": { + "immer": "1.7.3", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "use-immer": "0.5.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +Note how with Immer, **mutation like `artwork.seen = nextSeen` is now okay:** + +```js +updateMyTodos((draft) => { + const artwork = draft.find((a) => a.id === artworkId); + artwork.seen = nextSeen; +}); +``` + +This is because you're not mutating the _original_ state, but you're mutating a special `draft` object provided by Immer. Similarly, you can apply mutating methods like `push()` and `pop()` to the content of the `draft`. + +Behind the scenes, Immer always constructs the next state from scratch according to the changes that you've done to the `draft`. This keeps your event handlers very concise without ever mutating state. + +<Recap> + +- You can put arrays into state, but you can't change them. +- Instead of mutating an array, create a _new_ version of it, and update the state to it. +- You can use the `[...arr, newItem]` array spread syntax to create arrays with new items. +- You can use `filter()` and `map()` to create new arrays with filtered or transformed items. +- You can use Immer to keep your code concise. + +</Recap> + +<Challenges> + +#### Update an item in the shopping cart + +Fill in the `handleIncreaseClick` logic so that pressing "+" increases the corresponding number: + +```js +import { useState } from "react"; + +const initialProducts = [ + { + id: 0, + name: "Baklava", + count: 1, + }, + { + id: 1, + name: "Cheese", + count: 5, + }, + { + id: 2, + name: "Spaghetti", + count: 2, + }, +]; + +export default function ShoppingCart() { + const [products, setProducts] = useState(initialProducts); + + function handleIncreaseClick(productId) {} + + return ( + <ul> + {products.map((product) => ( + <li key={product.id}> + {product.name} (<b>{product.count}</b>) + <button + on_click={() => { + handleIncreaseClick(product.id); + }} + > + + + </button> + </li> + ))} + </ul> + ); +} +``` + +```css +button { + margin: 5px; +} +``` + +<Solution> + +You can use the `map` function to create a new array, and then use the `...` object spread syntax to create a copy of the changed object for the new array: + +```js +import { useState } from "react"; + +const initialProducts = [ + { + id: 0, + name: "Baklava", + count: 1, + }, + { + id: 1, + name: "Cheese", + count: 5, + }, + { + id: 2, + name: "Spaghetti", + count: 2, + }, +]; + +export default function ShoppingCart() { + const [products, setProducts] = useState(initialProducts); + + function handleIncreaseClick(productId) { + setProducts( + products.map((product) => { + if (product.id === productId) { + return { + ...product, + count: product.count + 1, + }; + } else { + return product; + } + }) + ); + } + + return ( + <ul> + {products.map((product) => ( + <li key={product.id}> + {product.name} (<b>{product.count}</b>) + <button + on_click={() => { + handleIncreaseClick(product.id); + }} + > + + + </button> + </li> + ))} + </ul> + ); +} +``` + +```css +button { + margin: 5px; +} +``` + +</Solution> + +#### Remove an item from the shopping cart + +This shopping cart has a working "+" button, but the "–" button doesn't do anything. You need to add an event handler to it so that pressing it decreases the `count` of the corresponding product. If you press "–" when the count is 1, the product should automatically get removed from the cart. Make sure it never shows 0. + +```js +import { useState } from "react"; + +const initialProducts = [ + { + id: 0, + name: "Baklava", + count: 1, + }, + { + id: 1, + name: "Cheese", + count: 5, + }, + { + id: 2, + name: "Spaghetti", + count: 2, + }, +]; + +export default function ShoppingCart() { + const [products, setProducts] = useState(initialProducts); + + function handleIncreaseClick(productId) { + setProducts( + products.map((product) => { + if (product.id === productId) { + return { + ...product, + count: product.count + 1, + }; + } else { + return product; + } + }) + ); + } + + return ( + <ul> + {products.map((product) => ( + <li key={product.id}> + {product.name} (<b>{product.count}</b>) + <button + on_click={() => { + handleIncreaseClick(product.id); + }} + > + + + </button> + <button>–</button> + </li> + ))} + </ul> + ); +} +``` + +```css +button { + margin: 5px; +} +``` + +<Solution> + +You can first use `map` to produce a new array, and then `filter` to remove products with a `count` set to `0`: + +```js +import { useState } from "react"; + +const initialProducts = [ + { + id: 0, + name: "Baklava", + count: 1, + }, + { + id: 1, + name: "Cheese", + count: 5, + }, + { + id: 2, + name: "Spaghetti", + count: 2, + }, +]; + +export default function ShoppingCart() { + const [products, setProducts] = useState(initialProducts); + + function handleIncreaseClick(productId) { + setProducts( + products.map((product) => { + if (product.id === productId) { + return { + ...product, + count: product.count + 1, + }; + } else { + return product; + } + }) + ); + } + + function handleDecreaseClick(productId) { + let nextProducts = products.map((product) => { + if (product.id === productId) { + return { + ...product, + count: product.count - 1, + }; + } else { + return product; + } + }); + nextProducts = nextProducts.filter((p) => p.count > 0); + setProducts(nextProducts); + } + + return ( + <ul> + {products.map((product) => ( + <li key={product.id}> + {product.name} (<b>{product.count}</b>) + <button + on_click={() => { + handleIncreaseClick(product.id); + }} + > + + + </button> + <button + on_click={() => { + handleDecreaseClick(product.id); + }} + > + – + </button> + </li> + ))} + </ul> + ); +} +``` + +```css +button { + margin: 5px; +} +``` + +</Solution> + +#### Fix the mutations using non-mutative methods + +In this example, all of the event handlers in `App.js` use mutation. As a result, editing and deleting todos doesn't work. Rewrite `handleAddTodo`, `handleChangeTodo`, and `handleDeleteTodo` to use the non-mutative methods: + +```js +import { useState } from "react"; +import AddTodo from "./AddTodo.js"; +import TaskList from "./TaskList.js"; + +let nextId = 3; +const initialTodos = [ + { id: 0, title: "Buy milk", done: true }, + { id: 1, title: "Eat tacos", done: false }, + { id: 2, title: "Brew tea", done: false }, +]; + +export default function TaskApp() { + const [todos, setTodos] = useState(initialTodos); + + function handleAddTodo(title) { + todos.push({ + id: nextId++, + title: title, + done: false, + }); + } + + function handleChangeTodo(nextTodo) { + const todo = todos.find((t) => t.id === nextTodo.id); + todo.title = nextTodo.title; + todo.done = nextTodo.done; + } + + function handleDeleteTodo(todoId) { + const index = todos.findIndex((t) => t.id === todoId); + todos.splice(index, 1); + } + + return ( + <> + <AddTodo onAddTodo={handleAddTodo} /> + <TaskList + todos={todos} + onChangeTodo={handleChangeTodo} + onDeleteTodo={handleDeleteTodo} + /> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function AddTodo({ onAddTodo }) { + const [title, setTitle] = useState(""); + return ( + <> + <input + placeholder="Add todo" + value={title} + onChange={(e) => setTitle(e.target.value)} + /> + <button + on_click={() => { + setTitle(""); + onAddTodo(title); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ todos, onChangeTodo, onDeleteTodo }) { + return ( + <ul> + {todos.map((todo) => ( + <li key={todo.id}> + <Task + todo={todo} + onChange={onChangeTodo} + onDelete={onDeleteTodo} + /> + </li> + ))} + </ul> + ); +} + +function Task({ todo, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let todoContent; + if (isEditing) { + todoContent = ( + <> + <input + value={todo.title} + onChange={(e) => { + onChange({ + ...todo, + title: e.target.value, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + todoContent = ( + <> + {todo.title} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={todo.done} + onChange={(e) => { + onChange({ + ...todo, + done: e.target.checked, + }); + }} + /> + {todoContent} + <button on_click={() => onDelete(todo.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +<Solution> + +In `handleAddTodo`, you can use the array spread syntax. In `handleChangeTodo`, you can create a new array with `map`. In `handleDeleteTodo`, you can create a new array with `filter`. Now the list works correctly: + +```js +import { useState } from "react"; +import AddTodo from "./AddTodo.js"; +import TaskList from "./TaskList.js"; + +let nextId = 3; +const initialTodos = [ + { id: 0, title: "Buy milk", done: true }, + { id: 1, title: "Eat tacos", done: false }, + { id: 2, title: "Brew tea", done: false }, +]; + +export default function TaskApp() { + const [todos, setTodos] = useState(initialTodos); + + function handleAddTodo(title) { + setTodos([ + ...todos, + { + id: nextId++, + title: title, + done: false, + }, + ]); + } + + function handleChangeTodo(nextTodo) { + setTodos( + todos.map((t) => { + if (t.id === nextTodo.id) { + return nextTodo; + } else { + return t; + } + }) + ); + } + + function handleDeleteTodo(todoId) { + setTodos(todos.filter((t) => t.id !== todoId)); + } + + return ( + <> + <AddTodo onAddTodo={handleAddTodo} /> + <TaskList + todos={todos} + onChangeTodo={handleChangeTodo} + onDeleteTodo={handleDeleteTodo} + /> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function AddTodo({ onAddTodo }) { + const [title, setTitle] = useState(""); + return ( + <> + <input + placeholder="Add todo" + value={title} + onChange={(e) => setTitle(e.target.value)} + /> + <button + on_click={() => { + setTitle(""); + onAddTodo(title); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ todos, onChangeTodo, onDeleteTodo }) { + return ( + <ul> + {todos.map((todo) => ( + <li key={todo.id}> + <Task + todo={todo} + onChange={onChangeTodo} + onDelete={onDeleteTodo} + /> + </li> + ))} + </ul> + ); +} + +function Task({ todo, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let todoContent; + if (isEditing) { + todoContent = ( + <> + <input + value={todo.title} + onChange={(e) => { + onChange({ + ...todo, + title: e.target.value, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + todoContent = ( + <> + {todo.title} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={todo.done} + onChange={(e) => { + onChange({ + ...todo, + done: e.target.checked, + }); + }} + /> + {todoContent} + <button on_click={() => onDelete(todo.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +</Solution> + +#### Fix the mutations using Immer + +This is the same example as in the previous challenge. This time, fix the mutations by using Immer. For your convenience, `useImmer` is already imported, so you need to change the `todos` state variable to use it. + +```js +import { useState } from "react"; +import { useImmer } from "use-immer"; +import AddTodo from "./AddTodo.js"; +import TaskList from "./TaskList.js"; + +let nextId = 3; +const initialTodos = [ + { id: 0, title: "Buy milk", done: true }, + { id: 1, title: "Eat tacos", done: false }, + { id: 2, title: "Brew tea", done: false }, +]; + +export default function TaskApp() { + const [todos, setTodos] = useState(initialTodos); + + function handleAddTodo(title) { + todos.push({ + id: nextId++, + title: title, + done: false, + }); + } + + function handleChangeTodo(nextTodo) { + const todo = todos.find((t) => t.id === nextTodo.id); + todo.title = nextTodo.title; + todo.done = nextTodo.done; + } + + function handleDeleteTodo(todoId) { + const index = todos.findIndex((t) => t.id === todoId); + todos.splice(index, 1); + } + + return ( + <> + <AddTodo onAddTodo={handleAddTodo} /> + <TaskList + todos={todos} + onChangeTodo={handleChangeTodo} + onDeleteTodo={handleDeleteTodo} + /> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function AddTodo({ onAddTodo }) { + const [title, setTitle] = useState(""); + return ( + <> + <input + placeholder="Add todo" + value={title} + onChange={(e) => setTitle(e.target.value)} + /> + <button + on_click={() => { + setTitle(""); + onAddTodo(title); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ todos, onChangeTodo, onDeleteTodo }) { + return ( + <ul> + {todos.map((todo) => ( + <li key={todo.id}> + <Task + todo={todo} + onChange={onChangeTodo} + onDelete={onDeleteTodo} + /> + </li> + ))} + </ul> + ); +} + +function Task({ todo, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let todoContent; + if (isEditing) { + todoContent = ( + <> + <input + value={todo.title} + onChange={(e) => { + onChange({ + ...todo, + title: e.target.value, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + todoContent = ( + <> + {todo.title} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={todo.done} + onChange={(e) => { + onChange({ + ...todo, + done: e.target.checked, + }); + }} + /> + {todoContent} + <button on_click={() => onDelete(todo.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +```json +{ + "dependencies": { + "immer": "1.7.3", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "use-immer": "0.5.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +<Solution> + +With Immer, you can write code in the mutative fashion, as long as you're only mutating parts of the `draft` that Immer gives you. Here, all mutations are performed on the `draft` so the code works: + +```js +import { useState } from "react"; +import { useImmer } from "use-immer"; +import AddTodo from "./AddTodo.js"; +import TaskList from "./TaskList.js"; + +let nextId = 3; +const initialTodos = [ + { id: 0, title: "Buy milk", done: true }, + { id: 1, title: "Eat tacos", done: false }, + { id: 2, title: "Brew tea", done: false }, +]; + +export default function TaskApp() { + const [todos, updateTodos] = useImmer(initialTodos); + + function handleAddTodo(title) { + updateTodos((draft) => { + draft.push({ + id: nextId++, + title: title, + done: false, + }); + }); + } + + function handleChangeTodo(nextTodo) { + updateTodos((draft) => { + const todo = draft.find((t) => t.id === nextTodo.id); + todo.title = nextTodo.title; + todo.done = nextTodo.done; + }); + } + + function handleDeleteTodo(todoId) { + updateTodos((draft) => { + const index = draft.findIndex((t) => t.id === todoId); + draft.splice(index, 1); + }); + } + + return ( + <> + <AddTodo onAddTodo={handleAddTodo} /> + <TaskList + todos={todos} + onChangeTodo={handleChangeTodo} + onDeleteTodo={handleDeleteTodo} + /> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function AddTodo({ onAddTodo }) { + const [title, setTitle] = useState(""); + return ( + <> + <input + placeholder="Add todo" + value={title} + onChange={(e) => setTitle(e.target.value)} + /> + <button + on_click={() => { + setTitle(""); + onAddTodo(title); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ todos, onChangeTodo, onDeleteTodo }) { + return ( + <ul> + {todos.map((todo) => ( + <li key={todo.id}> + <Task + todo={todo} + onChange={onChangeTodo} + onDelete={onDeleteTodo} + /> + </li> + ))} + </ul> + ); +} + +function Task({ todo, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let todoContent; + if (isEditing) { + todoContent = ( + <> + <input + value={todo.title} + onChange={(e) => { + onChange({ + ...todo, + title: e.target.value, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + todoContent = ( + <> + {todo.title} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={todo.done} + onChange={(e) => { + onChange({ + ...todo, + done: e.target.checked, + }); + }} + /> + {todoContent} + <button on_click={() => onDelete(todo.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +```json +{ + "dependencies": { + "immer": "1.7.3", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "use-immer": "0.5.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +You can also mix and match the mutative and non-mutative approaches with Immer. + +For example, in this version `handleAddTodo` is implemented by mutating the Immer `draft`, while `handleChangeTodo` and `handleDeleteTodo` use the non-mutative `map` and `filter` methods: + +```js +import { useState } from "react"; +import { useImmer } from "use-immer"; +import AddTodo from "./AddTodo.js"; +import TaskList from "./TaskList.js"; + +let nextId = 3; +const initialTodos = [ + { id: 0, title: "Buy milk", done: true }, + { id: 1, title: "Eat tacos", done: false }, + { id: 2, title: "Brew tea", done: false }, +]; + +export default function TaskApp() { + const [todos, updateTodos] = useImmer(initialTodos); + + function handleAddTodo(title) { + updateTodos((draft) => { + draft.push({ + id: nextId++, + title: title, + done: false, + }); + }); + } + + function handleChangeTodo(nextTodo) { + updateTodos( + todos.map((todo) => { + if (todo.id === nextTodo.id) { + return nextTodo; + } else { + return todo; + } + }) + ); + } + + function handleDeleteTodo(todoId) { + updateTodos(todos.filter((t) => t.id !== todoId)); + } + + return ( + <> + <AddTodo onAddTodo={handleAddTodo} /> + <TaskList + todos={todos} + onChangeTodo={handleChangeTodo} + onDeleteTodo={handleDeleteTodo} + /> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function AddTodo({ onAddTodo }) { + const [title, setTitle] = useState(""); + return ( + <> + <input + placeholder="Add todo" + value={title} + onChange={(e) => setTitle(e.target.value)} + /> + <button + on_click={() => { + setTitle(""); + onAddTodo(title); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ todos, onChangeTodo, onDeleteTodo }) { + return ( + <ul> + {todos.map((todo) => ( + <li key={todo.id}> + <Task + todo={todo} + onChange={onChangeTodo} + onDelete={onDeleteTodo} + /> + </li> + ))} + </ul> + ); +} + +function Task({ todo, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let todoContent; + if (isEditing) { + todoContent = ( + <> + <input + value={todo.title} + onChange={(e) => { + onChange({ + ...todo, + title: e.target.value, + }); + }} + /> + <button on_click={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + todoContent = ( + <> + {todo.title} + <button on_click={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={todo.done} + onChange={(e) => { + onChange({ + ...todo, + done: e.target.checked, + }); + }} + /> + {todoContent} + <button on_click={() => onDelete(todo.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +```json +{ + "dependencies": { + "immer": "1.7.3", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "use-immer": "0.5.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +With Immer, you can pick the style that feels the most natural for each separate case. + +</Solution> + +</Challenges> diff --git a/docs/src/learn/updating-objects-in-state.md b/docs/src/learn/updating-objects-in-state.md new file mode 100644 index 000000000..ec6459955 --- /dev/null +++ b/docs/src/learn/updating-objects-in-state.md @@ -0,0 +1,1569 @@ +--- +title: Updating Objects in State 🚧 +--- + +## Overview + +<p class="intro" markdown> + +State can hold any kind of JavaScript value, including objects. But you shouldn't change objects that you hold in the React state directly. Instead, when you want to update an object, you need to create a new one (or make a copy of an existing one), and then set the state to use that copy. + +</p> + +!!! summary "You Will Learn" + + - How to correctly update an object in React state + - How to update a nested object without mutating it + - What immutability is, and how not to break it + - How to make object copying less repetitive with Immer + +## What's a mutation? + +You can store any kind of JavaScript value in state. + +```js +const [x, setX] = useState(0); +``` + +So far you've been working with numbers, strings, and booleans. These kinds of JavaScript values are "immutable", meaning unchangeable or "read-only". You can trigger a re-render to _replace_ a value: + +```js +setX(5); +``` + +The `x` state changed from `0` to `5`, but the _number `0` itself_ did not change. It's not possible to make any changes to the built-in primitive values like numbers, strings, and booleans in JavaScript. + +Now consider an object in state: + +```js +const [position, setPosition] = useState({ x: 0, y: 0 }); +``` + +Technically, it is possible to change the contents of _the object itself_. **This is called a mutation:** + +```js +position.x = 5; +``` + +However, although objects in React state are technically mutable, you should treat them **as if** they were immutable--like numbers, booleans, and strings. Instead of mutating them, you should always replace them. + +## Treat state as read-only + +In other words, you should **treat any JavaScript object that you put into state as read-only.** + +This example holds an object in state to represent the current pointer position. The red dot is supposed to move when you touch or move the cursor over the preview area. But the dot stays in the initial position: + +```js +import { useState } from "react"; +export default function MovingDot() { + const [position, setPosition] = useState({ + x: 0, + y: 0, + }); + return ( + <div + onPointerMove={(e) => { + position.x = e.clientX; + position.y = e.clientY; + }} + style={{ + position: "relative", + width: "100vw", + height: "100vh", + }} + > + <div + style={{ + position: "absolute", + backgroundColor: "red", + borderRadius: "50%", + transform: `translate(${position.x}px, ${position.y}px)`, + left: -10, + top: -10, + width: 20, + height: 20, + }} + /> + </div> + ); +} +``` + +```css +body { + margin: 0; + padding: 0; + height: 250px; +} +``` + +The problem is with this bit of code. + +```js +onPointerMove={e => { + position.x = e.clientX; + position.y = e.clientY; +}} +``` + +This code modifies the object assigned to `position` from [the previous render.](/learn/state-as-a-snapshot#rendering-takes-a-snapshot-in-time) But without using the state setting function, React has no idea that object has changed. So React does not do anything in response. It's like trying to change the order after you've already eaten the meal. While mutating state can work in some cases, we don't recommend it. You should treat the state value you have access to in a render as read-only. + +To actually [trigger a re-render](/learn/state-as-a-snapshot#setting-state-triggers-renders) in this case, **create a _new_ object and pass it to the state setting function:** + +```js +onPointerMove={e => { + setPosition({ + x: e.clientX, + y: e.clientY + }); +}} +``` + +With `setPosition`, you're telling React: + +- Replace `position` with this new object +- And render this component again + +Notice how the red dot now follows your pointer when you touch or hover over the preview area: + +```js +import { useState } from "react"; +export default function MovingDot() { + const [position, setPosition] = useState({ + x: 0, + y: 0, + }); + return ( + <div + onPointerMove={(e) => { + setPosition({ + x: e.clientX, + y: e.clientY, + }); + }} + style={{ + position: "relative", + width: "100vw", + height: "100vh", + }} + > + <div + style={{ + position: "absolute", + backgroundColor: "red", + borderRadius: "50%", + transform: `translate(${position.x}px, ${position.y}px)`, + left: -10, + top: -10, + width: 20, + height: 20, + }} + /> + </div> + ); +} +``` + +```css +body { + margin: 0; + padding: 0; + height: 250px; +} +``` + +<DeepDive> + +#### Local mutation is fine + +Code like this is a problem because it modifies an _existing_ object in state: + +```js +position.x = e.clientX; +position.y = e.clientY; +``` + +But code like this is **absolutely fine** because you're mutating a fresh object you have _just created_: + +```js +const nextPosition = {}; +nextPosition.x = e.clientX; +nextPosition.y = e.clientY; +setPosition(nextPosition); +``` + +In fact, it is completely equivalent to writing this: + +```js +setPosition({ + x: e.clientX, + y: e.clientY, +}); +``` + +Mutation is only a problem when you change _existing_ objects that are already in state. Mutating an object you've just created is okay because _no other code references it yet._ Changing it isn't going to accidentally impact something that depends on it. This is called a "local mutation". You can even do local mutation [while rendering.](/learn/keeping-components-pure#local-mutation-your-components-little-secret) Very convenient and completely okay! + +</DeepDive> + +## Copying objects with the spread syntax + +In the previous example, the `position` object is always created fresh from the current cursor position. But often, you will want to include _existing_ data as a part of the new object you're creating. For example, you may want to update _only one_ field in a form, but keep the previous values for all other fields. + +These input fields don't work because the `onChange` handlers mutate the state: + +```js +import { useState } from "react"; + +export default function Form() { + const [person, setPerson] = useState({ + firstName: "Barbara", + lastName: "Hepworth", + email: "bhepworth@sculpture.com", + }); + + function handleFirstNameChange(e) { + person.firstName = e.target.value; + } + + function handleLastNameChange(e) { + person.lastName = e.target.value; + } + + function handleEmailChange(e) { + person.email = e.target.value; + } + + return ( + <> + <label> + First name: + <input + value={person.firstName} + onChange={handleFirstNameChange} + /> + </label> + <label> + Last name: + <input + value={person.lastName} + onChange={handleLastNameChange} + /> + </label> + <label> + Email: + <input value={person.email} onChange={handleEmailChange} /> + </label> + <p> + {person.firstName} {person.lastName} ({person.email}) + </p> + </> + ); +} +``` + +```css +label { + display: block; +} +input { + margin-left: 5px; + margin-bottom: 5px; +} +``` + +For example, this line mutates the state from a past render: + +```js +person.firstName = e.target.value; +``` + +The reliable way to get the behavior you're looking for is to create a new object and pass it to `setPerson`. But here, you want to also **copy the existing data into it** because only one of the fields has changed: + +```js +setPerson({ + firstName: e.target.value, // New first name from the input + lastName: person.lastName, + email: person.email, +}); +``` + +You can use the `...` [object spread](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax#spread_in_object_literals) syntax so that you don't need to copy every property separately. + +```js +setPerson({ + ...person, // Copy the old fields + firstName: e.target.value, // But override this one +}); +``` + +Now the form works! + +Notice how you didn't declare a separate state variable for each input field. For large forms, keeping all data grouped in an object is very convenient--as long as you update it correctly! + +```js +import { useState } from "react"; + +export default function Form() { + const [person, setPerson] = useState({ + firstName: "Barbara", + lastName: "Hepworth", + email: "bhepworth@sculpture.com", + }); + + function handleFirstNameChange(e) { + setPerson({ + ...person, + firstName: e.target.value, + }); + } + + function handleLastNameChange(e) { + setPerson({ + ...person, + lastName: e.target.value, + }); + } + + function handleEmailChange(e) { + setPerson({ + ...person, + email: e.target.value, + }); + } + + return ( + <> + <label> + First name: + <input + value={person.firstName} + onChange={handleFirstNameChange} + /> + </label> + <label> + Last name: + <input + value={person.lastName} + onChange={handleLastNameChange} + /> + </label> + <label> + Email: + <input value={person.email} onChange={handleEmailChange} /> + </label> + <p> + {person.firstName} {person.lastName} ({person.email}) + </p> + </> + ); +} +``` + +```css +label { + display: block; +} +input { + margin-left: 5px; + margin-bottom: 5px; +} +``` + +Note that the `...` spread syntax is "shallow"--it only copies things one level deep. This makes it fast, but it also means that if you want to update a nested property, you'll have to use it more than once. + +<DeepDive> + +#### Using a single event handler for multiple fields + +You can also use the `[` and `]` braces inside your object definition to specify a property with dynamic name. Here is the same example, but with a single event handler instead of three different ones: + +```js +import { useState } from "react"; + +export default function Form() { + const [person, setPerson] = useState({ + firstName: "Barbara", + lastName: "Hepworth", + email: "bhepworth@sculpture.com", + }); + + function handleChange(e) { + setPerson({ + ...person, + [e.target.name]: e.target.value, + }); + } + + return ( + <> + <label> + First name: + <input + name="firstName" + value={person.firstName} + onChange={handleChange} + /> + </label> + <label> + Last name: + <input + name="lastName" + value={person.lastName} + onChange={handleChange} + /> + </label> + <label> + Email: + <input + name="email" + value={person.email} + onChange={handleChange} + /> + </label> + <p> + {person.firstName} {person.lastName} ({person.email}) + </p> + </> + ); +} +``` + +```css +label { + display: block; +} +input { + margin-left: 5px; + margin-bottom: 5px; +} +``` + +Here, `e.target.name` refers to the `name` property given to the `<input>` DOM element. + +</DeepDive> + +## Updating a nested object + +Consider a nested object structure like this: + +```js +const [person, setPerson] = useState({ + name: "Niki de Saint Phalle", + artwork: { + title: "Blue Nana", + city: "Hamburg", + image: "https://i.imgur.com/Sd1AgUOm.jpg", + }, +}); +``` + +If you wanted to update `person.artwork.city`, it's clear how to do it with mutation: + +```js +person.artwork.city = "New Delhi"; +``` + +But in React, you treat state as immutable! In order to change `city`, you would first need to produce the new `artwork` object (pre-populated with data from the previous one), and then produce the new `person` object which points at the new `artwork`: + +```js +const nextArtwork = { ...person.artwork, city: "New Delhi" }; +const nextPerson = { ...person, artwork: nextArtwork }; +setPerson(nextPerson); +``` + +Or, written as a single function call: + +```js +setPerson({ + ...person, // Copy other fields + artwork: { + // but replace the artwork + ...person.artwork, // with the same one + city: "New Delhi", // but in New Delhi! + }, +}); +``` + +This gets a bit wordy, but it works fine for many cases: + +```js +import { useState } from "react"; + +export default function Form() { + const [person, setPerson] = useState({ + name: "Niki de Saint Phalle", + artwork: { + title: "Blue Nana", + city: "Hamburg", + image: "https://i.imgur.com/Sd1AgUOm.jpg", + }, + }); + + function handleNameChange(e) { + setPerson({ + ...person, + name: e.target.value, + }); + } + + function handleTitleChange(e) { + setPerson({ + ...person, + artwork: { + ...person.artwork, + title: e.target.value, + }, + }); + } + + function handleCityChange(e) { + setPerson({ + ...person, + artwork: { + ...person.artwork, + city: e.target.value, + }, + }); + } + + function handleImageChange(e) { + setPerson({ + ...person, + artwork: { + ...person.artwork, + image: e.target.value, + }, + }); + } + + return ( + <> + <label> + Name: + <input value={person.name} onChange={handleNameChange} /> + </label> + <label> + Title: + <input + value={person.artwork.title} + onChange={handleTitleChange} + /> + </label> + <label> + City: + <input + value={person.artwork.city} + onChange={handleCityChange} + /> + </label> + <label> + Image: + <input + value={person.artwork.image} + onChange={handleImageChange} + /> + </label> + <p> + <i>{person.artwork.title}</i> + {" by "} + {person.name} + <br /> + (located in {person.artwork.city}) + </p> + <img src={person.artwork.image} alt={person.artwork.title} /> + </> + ); +} +``` + +```css +label { + display: block; +} +input { + margin-left: 5px; + margin-bottom: 5px; +} +img { + width: 200px; + height: 200px; +} +``` + +<DeepDive> + +#### Objects are not really nested + +An object like this appears "nested" in code: + +```js +let obj = { + name: "Niki de Saint Phalle", + artwork: { + title: "Blue Nana", + city: "Hamburg", + image: "https://i.imgur.com/Sd1AgUOm.jpg", + }, +}; +``` + +However, "nesting" is an inaccurate way to think about how objects behave. When the code executes, there is no such thing as a "nested" object. You are really looking at two different objects: + +```js +let obj1 = { + title: "Blue Nana", + city: "Hamburg", + image: "https://i.imgur.com/Sd1AgUOm.jpg", +}; + +let obj2 = { + name: "Niki de Saint Phalle", + artwork: obj1, +}; +``` + +The `obj1` object is not "inside" `obj2`. For example, `obj3` could "point" at `obj1` too: + +```js +let obj1 = { + title: "Blue Nana", + city: "Hamburg", + image: "https://i.imgur.com/Sd1AgUOm.jpg", +}; + +let obj2 = { + name: "Niki de Saint Phalle", + artwork: obj1, +}; + +let obj3 = { + name: "Copycat", + artwork: obj1, +}; +``` + +If you were to mutate `obj3.artwork.city`, it would affect both `obj2.artwork.city` and `obj1.city`. This is because `obj3.artwork`, `obj2.artwork`, and `obj1` are the same object. This is difficult to see when you think of objects as "nested". Instead, they are separate objects "pointing" at each other with properties. + +</DeepDive> + +### Write concise update logic with Immer + +If your state is deeply nested, you might want to consider [flattening it.](/learn/choosing-the-state-structure#avoid-deeply-nested-state) But, if you don't want to change your state structure, you might prefer a shortcut to nested spreads. [Immer](https://github.com/immerjs/use-immer) is a popular library that lets you write using the convenient but mutating syntax and takes care of producing the copies for you. With Immer, the code you write looks like you are "breaking the rules" and mutating an object: + +```js +updatePerson((draft) => { + draft.artwork.city = "Lagos"; +}); +``` + +But unlike a regular mutation, it doesn't overwrite the past state! + +<DeepDive> + +#### How does Immer work? + +The `draft` provided by Immer is a special type of object, called a [Proxy](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy), that "records" what you do with it. This is why you can mutate it freely as much as you like! Under the hood, Immer figures out which parts of the `draft` have been changed, and produces a completely new object that contains your edits. + +</DeepDive> + +To try Immer: + +1. Run `npm install use-immer` to add Immer as a dependency +2. Then replace `import { useState } from 'react'` with `import { useImmer } from 'use-immer'` + +Here is the above example converted to Immer: + +```js +import { useImmer } from "use-immer"; + +export default function Form() { + const [person, updatePerson] = useImmer({ + name: "Niki de Saint Phalle", + artwork: { + title: "Blue Nana", + city: "Hamburg", + image: "https://i.imgur.com/Sd1AgUOm.jpg", + }, + }); + + function handleNameChange(e) { + updatePerson((draft) => { + draft.name = e.target.value; + }); + } + + function handleTitleChange(e) { + updatePerson((draft) => { + draft.artwork.title = e.target.value; + }); + } + + function handleCityChange(e) { + updatePerson((draft) => { + draft.artwork.city = e.target.value; + }); + } + + function handleImageChange(e) { + updatePerson((draft) => { + draft.artwork.image = e.target.value; + }); + } + + return ( + <> + <label> + Name: + <input value={person.name} onChange={handleNameChange} /> + </label> + <label> + Title: + <input + value={person.artwork.title} + onChange={handleTitleChange} + /> + </label> + <label> + City: + <input + value={person.artwork.city} + onChange={handleCityChange} + /> + </label> + <label> + Image: + <input + value={person.artwork.image} + onChange={handleImageChange} + /> + </label> + <p> + <i>{person.artwork.title}</i> + {" by "} + {person.name} + <br /> + (located in {person.artwork.city}) + </p> + <img src={person.artwork.image} alt={person.artwork.title} /> + </> + ); +} +``` + +```json +{ + "dependencies": { + "immer": "1.7.3", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "use-immer": "0.5.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```css +label { + display: block; +} +input { + margin-left: 5px; + margin-bottom: 5px; +} +img { + width: 200px; + height: 200px; +} +``` + +Notice how much more concise the event handlers have become. You can mix and match `useState` and `useImmer` in a single component as much as you like. Immer is a great way to keep the update handlers concise, especially if there's nesting in your state, and copying objects leads to repetitive code. + +<DeepDive> + +#### Why is mutating state not recommended in React? + +There are a few reasons: + +- **Debugging:** If you use `console.log` and don't mutate state, your past logs won't get clobbered by the more recent state changes. So you can clearly see how state has changed between renders. +- **Optimizations:** Common React [optimization strategies](/reference/react/memo) rely on skipping work if previous props or state are the same as the next ones. If you never mutate state, it is very fast to check whether there were any changes. If `prevObj === obj`, you can be sure that nothing could have changed inside of it. +- **New Features:** The new React features we're building rely on state being [treated like a snapshot.](/learn/state-as-a-snapshot) If you're mutating past versions of state, that may prevent you from using the new features. +- **Requirement Changes:** Some application features, like implementing Undo/Redo, showing a history of changes, or letting the user reset a form to earlier values, are easier to do when nothing is mutated. This is because you can keep past copies of state in memory, and reuse them when appropriate. If you start with a mutative approach, features like this can be difficult to add later on. +- **Simpler Implementation:** Because React does not rely on mutation, it does not need to do anything special with your objects. It does not need to hijack their properties, always wrap them into Proxies, or do other work at initialization as many "reactive" solutions do. This is also why React lets you put any object into state--no matter how large--without additional performance or correctness pitfalls. + +In practice, you can often "get away" with mutating state in React, but we strongly advise you not to do that so that you can use new React features developed with this approach in mind. Future contributors and perhaps even your future self will thank you! + +</DeepDive> + +<Recap> + +- Treat all state in React as immutable. +- When you store objects in state, mutating them will not trigger renders and will change the state in previous render "snapshots". +- Instead of mutating an object, create a _new_ version of it, and trigger a re-render by setting state to it. +- You can use the `{...obj, something: 'newValue'}` object spread syntax to create copies of objects. +- Spread syntax is shallow: it only copies one level deep. +- To update a nested object, you need to create copies all the way up from the place you're updating. +- To reduce repetitive copying code, use Immer. + +</Recap> + +<Challenges> + +#### Fix incorrect state updates + +This form has a few bugs. Click the button that increases the score a few times. Notice that it does not increase. Then edit the first name, and notice that the score has suddenly "caught up" with your changes. Finally, edit the last name, and notice that the score has disappeared completely. + +Your task is to fix all of these bugs. As you fix them, explain why each of them happens. + +```js +import { useState } from "react"; + +export default function Scoreboard() { + const [player, setPlayer] = useState({ + firstName: "Ranjani", + lastName: "Shettar", + score: 10, + }); + + function handlePlusClick() { + player.score++; + } + + function handleFirstNameChange(e) { + setPlayer({ + ...player, + firstName: e.target.value, + }); + } + + function handleLastNameChange(e) { + setPlayer({ + lastName: e.target.value, + }); + } + + return ( + <> + <label> + Score: <b>{player.score}</b>{" "} + <button on_click={handlePlusClick}>+1</button> + </label> + <label> + First name: + <input + value={player.firstName} + onChange={handleFirstNameChange} + /> + </label> + <label> + Last name: + <input + value={player.lastName} + onChange={handleLastNameChange} + /> + </label> + </> + ); +} +``` + +```css +label { + display: block; + margin-bottom: 10px; +} +input { + margin-left: 5px; + margin-bottom: 5px; +} +``` + +<Solution> + +Here is a version with both bugs fixed: + +```js +import { useState } from "react"; + +export default function Scoreboard() { + const [player, setPlayer] = useState({ + firstName: "Ranjani", + lastName: "Shettar", + score: 10, + }); + + function handlePlusClick() { + setPlayer({ + ...player, + score: player.score + 1, + }); + } + + function handleFirstNameChange(e) { + setPlayer({ + ...player, + firstName: e.target.value, + }); + } + + function handleLastNameChange(e) { + setPlayer({ + ...player, + lastName: e.target.value, + }); + } + + return ( + <> + <label> + Score: <b>{player.score}</b>{" "} + <button on_click={handlePlusClick}>+1</button> + </label> + <label> + First name: + <input + value={player.firstName} + onChange={handleFirstNameChange} + /> + </label> + <label> + Last name: + <input + value={player.lastName} + onChange={handleLastNameChange} + /> + </label> + </> + ); +} +``` + +```css +label { + display: block; +} +input { + margin-left: 5px; + margin-bottom: 5px; +} +``` + +The problem with `handlePlusClick` was that it mutated the `player` object. As a result, React did not know that there's a reason to re-render, and did not update the score on the screen. This is why, when you edited the first name, the state got updated, triggering a re-render which _also_ updated the score on the screen. + +The problem with `handleLastNameChange` was that it did not copy the existing `...player` fields into the new object. This is why the score got lost after you edited the last name. + +</Solution> + +#### Find and fix the mutation + +There is a draggable box on a static background. You can change the box's color using the select input. + +But there is a bug. If you move the box first, and then change its color, the background (which isn't supposed to move!) will "jump" to the box position. But this should not happen: the `Background`'s `position` prop is set to `initialPosition`, which is `{ x: 0, y: 0 }`. Why is the background moving after the color change? + +Find the bug and fix it. + +<Hint> + +If something unexpected changes, there is a mutation. Find the mutation in `App.js` and fix it. + +</Hint> + +```js +import { useState } from "react"; +import Background from "./Background.js"; +import Box from "./Box.js"; + +const initialPosition = { + x: 0, + y: 0, +}; + +export default function Canvas() { + const [shape, setShape] = useState({ + color: "orange", + position: initialPosition, + }); + + function handleMove(dx, dy) { + shape.position.x += dx; + shape.position.y += dy; + } + + function handleColorChange(e) { + setShape({ + ...shape, + color: e.target.value, + }); + } + + return ( + <> + <select value={shape.color} onChange={handleColorChange}> + <option value="orange">orange</option> + <option value="lightpink">lightpink</option> + <option value="aliceblue">aliceblue</option> + </select> + <Background position={initialPosition} /> + <Box + color={shape.color} + position={shape.position} + onMove={handleMove} + > + Drag me! + </Box> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Box({ children, color, position, onMove }) { + const [lastCoordinates, setLastCoordinates] = useState(null); + + function handlePointerDown(e) { + e.target.setPointerCapture(e.pointerId); + setLastCoordinates({ + x: e.clientX, + y: e.clientY, + }); + } + + function handlePointerMove(e) { + if (lastCoordinates) { + setLastCoordinates({ + x: e.clientX, + y: e.clientY, + }); + const dx = e.clientX - lastCoordinates.x; + const dy = e.clientY - lastCoordinates.y; + onMove(dx, dy); + } + } + + function handlePointerUp(e) { + setLastCoordinates(null); + } + + return ( + <div + onPointerDown={handlePointerDown} + onPointerMove={handlePointerMove} + onPointerUp={handlePointerUp} + style={{ + width: 100, + height: 100, + cursor: "grab", + backgroundColor: color, + position: "absolute", + border: "1px solid black", + display: "flex", + justifyContent: "center", + alignItems: "center", + transform: `translate( + ${position.x}px, + ${position.y}px + )`, + }} + > + {children} + </div> + ); +} +``` + +```js +export default function Background({ position }) { + return ( + <div + style={{ + position: "absolute", + transform: `translate( + ${position.x}px, + ${position.y}px + )`, + width: 250, + height: 250, + backgroundColor: "rgba(200, 200, 0, 0.2)", + }} + /> + ); +} +``` + +```css +body { + height: 280px; +} +select { + margin-bottom: 10px; +} +``` + +<Solution> + +The problem was in the mutation inside `handleMove`. It mutated `shape.position`, but that's the same object that `initialPosition` points at. This is why both the shape and the background move. (It's a mutation, so the change doesn't reflect on the screen until an unrelated update--the color change--triggers a re-render.) + +The fix is to remove the mutation from `handleMove`, and use the spread syntax to copy the shape. Note that `+=` is a mutation, so you need to rewrite it to use a regular `+` operation. + +```js +import { useState } from "react"; +import Background from "./Background.js"; +import Box from "./Box.js"; + +const initialPosition = { + x: 0, + y: 0, +}; + +export default function Canvas() { + const [shape, setShape] = useState({ + color: "orange", + position: initialPosition, + }); + + function handleMove(dx, dy) { + setShape({ + ...shape, + position: { + x: shape.position.x + dx, + y: shape.position.y + dy, + }, + }); + } + + function handleColorChange(e) { + setShape({ + ...shape, + color: e.target.value, + }); + } + + return ( + <> + <select value={shape.color} onChange={handleColorChange}> + <option value="orange">orange</option> + <option value="lightpink">lightpink</option> + <option value="aliceblue">aliceblue</option> + </select> + <Background position={initialPosition} /> + <Box + color={shape.color} + position={shape.position} + onMove={handleMove} + > + Drag me! + </Box> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Box({ children, color, position, onMove }) { + const [lastCoordinates, setLastCoordinates] = useState(null); + + function handlePointerDown(e) { + e.target.setPointerCapture(e.pointerId); + setLastCoordinates({ + x: e.clientX, + y: e.clientY, + }); + } + + function handlePointerMove(e) { + if (lastCoordinates) { + setLastCoordinates({ + x: e.clientX, + y: e.clientY, + }); + const dx = e.clientX - lastCoordinates.x; + const dy = e.clientY - lastCoordinates.y; + onMove(dx, dy); + } + } + + function handlePointerUp(e) { + setLastCoordinates(null); + } + + return ( + <div + onPointerDown={handlePointerDown} + onPointerMove={handlePointerMove} + onPointerUp={handlePointerUp} + style={{ + width: 100, + height: 100, + cursor: "grab", + backgroundColor: color, + position: "absolute", + border: "1px solid black", + display: "flex", + justifyContent: "center", + alignItems: "center", + transform: `translate( + ${position.x}px, + ${position.y}px + )`, + }} + > + {children} + </div> + ); +} +``` + +```js +export default function Background({ position }) { + return ( + <div + style={{ + position: "absolute", + transform: `translate( + ${position.x}px, + ${position.y}px + )`, + width: 250, + height: 250, + backgroundColor: "rgba(200, 200, 0, 0.2)", + }} + /> + ); +} +``` + +```css +body { + height: 280px; +} +select { + margin-bottom: 10px; +} +``` + +</Solution> + +#### Update an object with Immer + +This is the same buggy example as in the previous challenge. This time, fix the mutation by using Immer. For your convenience, `useImmer` is already imported, so you need to change the `shape` state variable to use it. + +```js +import { useState } from "react"; +import { useImmer } from "use-immer"; +import Background from "./Background.js"; +import Box from "./Box.js"; + +const initialPosition = { + x: 0, + y: 0, +}; + +export default function Canvas() { + const [shape, setShape] = useState({ + color: "orange", + position: initialPosition, + }); + + function handleMove(dx, dy) { + shape.position.x += dx; + shape.position.y += dy; + } + + function handleColorChange(e) { + setShape({ + ...shape, + color: e.target.value, + }); + } + + return ( + <> + <select value={shape.color} onChange={handleColorChange}> + <option value="orange">orange</option> + <option value="lightpink">lightpink</option> + <option value="aliceblue">aliceblue</option> + </select> + <Background position={initialPosition} /> + <Box + color={shape.color} + position={shape.position} + onMove={handleMove} + > + Drag me! + </Box> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Box({ children, color, position, onMove }) { + const [lastCoordinates, setLastCoordinates] = useState(null); + + function handlePointerDown(e) { + e.target.setPointerCapture(e.pointerId); + setLastCoordinates({ + x: e.clientX, + y: e.clientY, + }); + } + + function handlePointerMove(e) { + if (lastCoordinates) { + setLastCoordinates({ + x: e.clientX, + y: e.clientY, + }); + const dx = e.clientX - lastCoordinates.x; + const dy = e.clientY - lastCoordinates.y; + onMove(dx, dy); + } + } + + function handlePointerUp(e) { + setLastCoordinates(null); + } + + return ( + <div + onPointerDown={handlePointerDown} + onPointerMove={handlePointerMove} + onPointerUp={handlePointerUp} + style={{ + width: 100, + height: 100, + cursor: "grab", + backgroundColor: color, + position: "absolute", + border: "1px solid black", + display: "flex", + justifyContent: "center", + alignItems: "center", + transform: `translate( + ${position.x}px, + ${position.y}px + )`, + }} + > + {children} + </div> + ); +} +``` + +```js +export default function Background({ position }) { + return ( + <div + style={{ + position: "absolute", + transform: `translate( + ${position.x}px, + ${position.y}px + )`, + width: 250, + height: 250, + backgroundColor: "rgba(200, 200, 0, 0.2)", + }} + /> + ); +} +``` + +```css +body { + height: 280px; +} +select { + margin-bottom: 10px; +} +``` + +```json +{ + "dependencies": { + "immer": "1.7.3", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "use-immer": "0.5.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +<Solution> + +This is the solution rewritten with Immer. Notice how the event handlers are written in a mutating fashion, but the bug does not occur. This is because under the hood, Immer never mutates the existing objects. + +```js +import { useImmer } from "use-immer"; +import Background from "./Background.js"; +import Box from "./Box.js"; + +const initialPosition = { + x: 0, + y: 0, +}; + +export default function Canvas() { + const [shape, updateShape] = useImmer({ + color: "orange", + position: initialPosition, + }); + + function handleMove(dx, dy) { + updateShape((draft) => { + draft.position.x += dx; + draft.position.y += dy; + }); + } + + function handleColorChange(e) { + updateShape((draft) => { + draft.color = e.target.value; + }); + } + + return ( + <> + <select value={shape.color} onChange={handleColorChange}> + <option value="orange">orange</option> + <option value="lightpink">lightpink</option> + <option value="aliceblue">aliceblue</option> + </select> + <Background position={initialPosition} /> + <Box + color={shape.color} + position={shape.position} + onMove={handleMove} + > + Drag me! + </Box> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function Box({ children, color, position, onMove }) { + const [lastCoordinates, setLastCoordinates] = useState(null); + + function handlePointerDown(e) { + e.target.setPointerCapture(e.pointerId); + setLastCoordinates({ + x: e.clientX, + y: e.clientY, + }); + } + + function handlePointerMove(e) { + if (lastCoordinates) { + setLastCoordinates({ + x: e.clientX, + y: e.clientY, + }); + const dx = e.clientX - lastCoordinates.x; + const dy = e.clientY - lastCoordinates.y; + onMove(dx, dy); + } + } + + function handlePointerUp(e) { + setLastCoordinates(null); + } + + return ( + <div + onPointerDown={handlePointerDown} + onPointerMove={handlePointerMove} + onPointerUp={handlePointerUp} + style={{ + width: 100, + height: 100, + cursor: "grab", + backgroundColor: color, + position: "absolute", + border: "1px solid black", + display: "flex", + justifyContent: "center", + alignItems: "center", + transform: `translate( + ${position.x}px, + ${position.y}px + )`, + }} + > + {children} + </div> + ); +} +``` + +```js +export default function Background({ position }) { + return ( + <div + style={{ + position: "absolute", + transform: `translate( + ${position.x}px, + ${position.y}px + )`, + width: 250, + height: 250, + backgroundColor: "rgba(200, 200, 0, 0.2)", + }} + /> + ); +} +``` + +```css +body { + height: 280px; +} +select { + margin-bottom: 10px; +} +``` + +```json +{ + "dependencies": { + "immer": "1.7.3", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "use-immer": "0.5.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +</Solution> + +</Challenges> diff --git a/docs/src/learn/vdom-mutations.md b/docs/src/learn/vdom-mutations.md new file mode 100644 index 000000000..6015f6905 --- /dev/null +++ b/docs/src/learn/vdom-mutations.md @@ -0,0 +1,3 @@ +--- +title: VDOM Mutations 🚧 +--- diff --git a/docs/src/learn/writing-markup-with-psx.md b/docs/src/learn/writing-markup-with-psx.md new file mode 100644 index 000000000..829a83725 --- /dev/null +++ b/docs/src/learn/writing-markup-with-psx.md @@ -0,0 +1,326 @@ +--- +title: Writing Markup with PSX 🚧 +--- + +## Overview + +<p class="intro" markdown> + +_JSX_ is a syntax extension for JavaScript that lets you write HTML-like markup inside a JavaScript file. Although there are other ways to write components, most React developers prefer the conciseness of JSX, and most codebases use it. + +</p> + +!!! summary "You Will Learn" + + - Why React mixes markup with rendering logic + - How JSX is different from HTML + - How to display information with JSX + +## JSX: Putting markup into JavaScript + +The Web has been built on HTML, CSS, and JavaScript. For many years, web developers kept content in HTML, design in CSS, and logic in JavaScript—often in separate files! Content was marked up inside HTML while the page's logic lived separately in JavaScript: + +<!-- TODO: Diagram --> + +But as the Web became more interactive, logic increasingly determined content. JavaScript was in charge of the HTML! This is why **in React, rendering logic and markup live together in the same place—components.** + +<!-- TODO: Diagram --> + +Keeping a button's rendering logic and markup together ensures that they stay in sync with each other on every edit. Conversely, details that are unrelated, such as the button's markup and a sidebar's markup, are isolated from each other, making it safer to change either of them on their own. + +Each React component is a JavaScript function that may contain some markup that React renders into the browser. React components use a syntax extension called JSX to represent that markup. JSX looks a lot like HTML, but it is a bit stricter and can display dynamic information. The best way to understand this is to convert some HTML markup to JSX markup. + +<Note> + +JSX and React are two separate things. They're often used together, but you _can_ [use them independently](https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html#whats-a-jsx-transform) of each other. JSX is a syntax extension, while React is a JavaScript library. + +</Note> + +## Converting HTML to JSX + +Suppose that you have some (perfectly valid) HTML: + +```html +<h1>Hedy Lamarr's Todos</h1> +<img src="https://i.imgur.com/yXOvdOSs.jpg" alt="Hedy Lamarr" class="photo" /> +<ul> + <li>Invent new traffic lights</li> + <li>Rehearse a movie scene</li> + <li>Improve the spectrum technology</li> +</ul> +``` + +And you want to put it into your component: + +```js +export default function TodoList() { + return ( + // ??? + ) +} +``` + +If you copy and paste it as is, it will not work: + +```js +export default function TodoList() { + return ( + // This doesn't quite work! + <h1>Hedy Lamarr's Todos</h1> + <img + src="https://i.imgur.com/yXOvdOSs.jpg" + alt="Hedy Lamarr" + class="photo" + > + <ul> + <li>Invent new traffic lights + <li>Rehearse a movie scene + <li>Improve the spectrum technology + </ul> + ); +} +``` + +```css +img { + height: 90px; +} +``` + +This is because JSX is stricter and has a few more rules than HTML! If you read the error messages above, they'll guide you to fix the markup, or you can follow the guide below. + +<Note> + +Most of the time, React's on-screen error messages will help you find where the problem is. Give them a read if you get stuck! + +</Note> + +## The Rules of JSX + +### 1. Return a single root element + +To return multiple elements from a component, **wrap them with a single parent tag.** + +For example, you can use a `<div>`: + +```js +<div> + <h1>Hedy Lamarr's Todos</h1> + <img + src="https://i.imgur.com/yXOvdOSs.jpg" + alt="Hedy Lamarr" + class="photo" + > + <ul> + ... + </ul> +</div> +``` + +If you don't want to add an extra `<div>` to your markup, you can write `<>` and `</>` instead: + +```js +<> + <h1>Hedy Lamarr's Todos</h1> + <img + src="https://i.imgur.com/yXOvdOSs.jpg" + alt="Hedy Lamarr" + class="photo" + > + <ul> + ... + </ul> +</> +``` + +This empty tag is called a _[Fragment.](/reference/react/Fragment)_ Fragments let you group things without leaving any trace in the browser HTML tree. + +<DeepDive> + +#### Why do multiple JSX tags need to be wrapped? + +JSX looks like HTML, but under the hood it is transformed into plain JavaScript objects. You can't return two objects from a function without wrapping them into an array. This explains why you also can't return two JSX tags without wrapping them into another tag or a Fragment. + +</DeepDive> + +### 2. Close all the tags + +JSX requires tags to be explicitly closed: self-closing tags like `<img>` must become `<img />`, and wrapping tags like `<li>oranges` must be written as `<li>oranges</li>`. + +This is how Hedy Lamarr's image and list items look closed: + +```js +<> + <img + src="https://i.imgur.com/yXOvdOSs.jpg" + alt="Hedy Lamarr" + class="photo" + /> + <ul> + <li>Invent new traffic lights</li> + <li>Rehearse a movie scene</li> + <li>Improve the spectrum technology</li> + </ul> +</> +``` + +### 3. camelCase <s>all</s> most of the things! + +JSX turns into JavaScript and attributes written in JSX become keys of JavaScript objects. In your own components, you will often want to read those attributes into variables. But JavaScript has limitations on variable names. For example, their names can't contain dashes or be reserved words like `class`. + +This is why, in React, many HTML and SVG attributes are written in camelCase. For example, instead of `stroke-width` you use `strokeWidth`. Since `class` is a reserved word, in React you write `className` instead, named after the [corresponding DOM property](https://developer.mozilla.org/en-US/docs/Web/API/Element/className): + +```js +<img + src="https://i.imgur.com/yXOvdOSs.jpg" + alt="Hedy Lamarr" + className="photo" +/> +``` + +You can [find all these attributes in the list of DOM component props.](/reference/react-dom/components/common) If you get one wrong, don't worry—React will print a message with a possible correction to the [browser console.](https://developer.mozilla.org/docs/Tools/Browser_Console) + +<Pitfall> + +For historical reasons, [`aria-*`](https://developer.mozilla.org/docs/Web/Accessibility/ARIA) and [`data-*`](https://developer.mozilla.org/docs/Learn/HTML/Howto/Use_data_attributes) attributes are written as in HTML with dashes. + +</Pitfall> + +### Pro-tip: Use a JSX Converter + +Converting all these attributes in existing markup can be tedious! We recommend using a [converter](https://transform.tools/html-to-jsx) to translate your existing HTML and SVG to JSX. Converters are very useful in practice, but it's still worth understanding what is going on so that you can comfortably write JSX on your own. + +Here is your final result: + +```js +export default function TodoList() { + return ( + <> + <h1>Hedy Lamarr's Todos</h1> + <img + src="https://i.imgur.com/yXOvdOSs.jpg" + alt="Hedy Lamarr" + className="photo" + /> + <ul> + <li>Invent new traffic lights</li> + <li>Rehearse a movie scene</li> + <li>Improve the spectrum technology</li> + </ul> + </> + ); +} +``` + +```css +img { + height: 90px; +} +``` + +<Recap> + +Now you know why JSX exists and how to use it in components: + +- React components group rendering logic together with markup because they are related. +- JSX is similar to HTML, with a few differences. You can use a [converter](https://transform.tools/html-to-jsx) if you need to. +- Error messages will often point you in the right direction to fixing your markup. + +</Recap> + +<Challenges> + +#### Convert some HTML to JSX + +This HTML was pasted into a component, but it's not valid JSX. Fix it: + +```js +export default function Bio() { + return ( + <div class="intro"> + <h1>Welcome to my website!</h1> + </div> + <p class="summary"> + You can find my thoughts here. + <br><br> + <b>And <i>pictures</b></i> of scientists! + </p> + ); +} +``` + +```css +.intro { + background-image: linear-gradient( + to left, + violet, + indigo, + blue, + green, + yellow, + orange, + red + ); + background-clip: text; + color: transparent; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.summary { + padding: 20px; + border: 10px solid gold; +} +``` + +Whether to do it by hand or using the converter is up to you! + +<Solution> + +```js +export default function Bio() { + return ( + <div> + <div className="intro"> + <h1>Welcome to my website!</h1> + </div> + <p className="summary"> + You can find my thoughts here. + <br /> + <br /> + <b> + And <i>pictures</i> + </b> of scientists! + </p> + </div> + ); +} +``` + +```css +.intro { + background-image: linear-gradient( + to left, + violet, + indigo, + blue, + green, + yellow, + orange, + red + ); + background-clip: text; + color: transparent; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.summary { + padding: 20px; + border: 10px solid gold; +} +``` + +</Solution> + +</Challenges> diff --git a/docs/src/learn/you-might-not-need-an-effect.md b/docs/src/learn/you-might-not-need-an-effect.md new file mode 100644 index 000000000..712c5e946 --- /dev/null +++ b/docs/src/learn/you-might-not-need-an-effect.md @@ -0,0 +1,1702 @@ +--- +title: "You Might Not Need an Effect 🚧" +--- + +## Overview + +<p class="intro" markdown> + +Effects are an escape hatch from the React paradigm. They let you "step outside" of React and synchronize your components with some external system like a non-React widget, network, or the browser DOM. If there is no external system involved (for example, if you want to update a component's state when some props or state change), you shouldn't need an Effect. Removing unnecessary Effects will make your code easier to follow, faster to run, and less error-prone. + +</p> + +!!! summary "You Will Learn" + + - Why and how to remove unnecessary Effects from your components + - How to cache expensive computations without Effects + - How to reset and adjust component state without Effects + - How to share logic between event handlers + - Which logic should be moved to event handlers + - How to notify parent components about changes + +## How to remove unnecessary Effects + +There are two common cases in which you don't need Effects: + +- **You don't need Effects to transform data for rendering.** For example, let's say you want to filter a list before displaying it. You might feel tempted to write an Effect that updates a state variable when the list changes. However, this is inefficient. When you update the state, React will first call your component functions to calculate what should be on the screen. Then React will ["commit"](/learn/render-and-commit) these changes to the DOM, updating the screen. Then React will run your Effects. If your Effect _also_ immediately updates the state, this restarts the whole process from scratch! To avoid the unnecessary render passes, transform all the data at the top level of your components. That code will automatically re-run whenever your props or state change. +- **You don't need Effects to handle user events.** For example, let's say you want to send an `/api/buy` POST request and show a notification when the user buys a product. In the Buy button click event handler, you know exactly what happened. By the time an Effect runs, you don't know _what_ the user did (for example, which button was clicked). This is why you'll usually handle user events in the corresponding event handlers. + +You _do_ need Effects to [synchronize](/learn/synchronizing-with-effects#what-are-effects-and-how-are-they-different-from-events) with external systems. For example, you can write an Effect that keeps a jQuery widget synchronized with the React state. You can also fetch data with Effects: for example, you can synchronize the search results with the current search query. Keep in mind that modern [frameworks](/learn/start-a-new-react-project#production-grade-react-frameworks) provide more efficient built-in data fetching mechanisms than writing Effects directly in your components. + +To help you gain the right intuition, let's look at some common concrete examples! + +### Updating state based on props or state + +Suppose you have a component with two state variables: `firstName` and `lastName`. You want to calculate a `fullName` from them by concatenating them. Moreover, you'd like `fullName` to update whenever `firstName` or `lastName` change. Your first instinct might be to add a `fullName` state variable and update it in an Effect: + +```js +function Form() { + const [firstName, setFirstName] = useState("Taylor"); + const [lastName, setLastName] = useState("Swift"); + + // 🔴 Avoid: redundant state and unnecessary Effect + const [fullName, setFullName] = useState(""); + useEffect(() => { + setFullName(firstName + " " + lastName); + }, [firstName, lastName]); + // ... +} +``` + +This is more complicated than necessary. It is inefficient too: it does an entire render pass with a stale value for `fullName`, then immediately re-renders with the updated value. Remove the state variable and the Effect: + +```js +function Form() { + const [firstName, setFirstName] = useState("Taylor"); + const [lastName, setLastName] = useState("Swift"); + // ✅ Good: calculated during rendering + const fullName = firstName + " " + lastName; + // ... +} +``` + +**When something can be calculated from the existing props or state, [don't put it in state.](/learn/choosing-the-state-structure#avoid-redundant-state) Instead, calculate it during rendering.** This makes your code faster (you avoid the extra "cascading" updates), simpler (you remove some code), and less error-prone (you avoid bugs caused by different state variables getting out of sync with each other). If this approach feels new to you, [Thinking in React](/learn/thinking-in-react#step-3-find-the-minimal-but-complete-representation-of-ui-state) explains what should go into state. + +### Caching expensive calculations + +This component computes `visibleTodos` by taking the `todos` it receives by props and filtering them according to the `filter` prop. You might feel tempted to store the result in state and update it from an Effect: + +```js +function TodoList({ todos, filter }) { + const [newTodo, setNewTodo] = useState(""); + + // 🔴 Avoid: redundant state and unnecessary Effect + const [visibleTodos, setVisibleTodos] = useState([]); + useEffect(() => { + setVisibleTodos(getFilteredTodos(todos, filter)); + }, [todos, filter]); + + // ... +} +``` + +Like in the earlier example, this is both unnecessary and inefficient. First, remove the state and the Effect: + +```js +function TodoList({ todos, filter }) { + const [newTodo, setNewTodo] = useState(""); + // ✅ This is fine if getFilteredTodos() is not slow. + const visibleTodos = getFilteredTodos(todos, filter); + // ... +} +``` + +Usually, this code is fine! But maybe `getFilteredTodos()` is slow or you have a lot of `todos`. In that case you don't want to recalculate `getFilteredTodos()` if some unrelated state variable like `newTodo` has changed. + +You can cache (or ["memoize"](https://en.wikipedia.org/wiki/Memoization)) an expensive calculation by wrapping it in a [`useMemo`](/reference/react/useMemo) Hook: + +```js +import { useMemo, useState } from "react"; + +function TodoList({ todos, filter }) { + const [newTodo, setNewTodo] = useState(""); + const visibleTodos = useMemo(() => { + // ✅ Does not re-run unless todos or filter change + return getFilteredTodos(todos, filter); + }, [todos, filter]); + // ... +} +``` + +Or, written as a single line: + +```js +import { useMemo, useState } from "react"; + +function TodoList({ todos, filter }) { + const [newTodo, setNewTodo] = useState(""); + // ✅ Does not re-run getFilteredTodos() unless todos or filter change + const visibleTodos = useMemo( + () => getFilteredTodos(todos, filter), + [todos, filter] + ); + // ... +} +``` + +**This tells React that you don't want the inner function to re-run unless either `todos` or `filter` have changed.** React will remember the return value of `getFilteredTodos()` during the initial render. During the next renders, it will check if `todos` or `filter` are different. If they're the same as last time, `useMemo` will return the last result it has stored. But if they are different, React will call the inner function again (and store its result). + +The function you wrap in [`useMemo`](/reference/react/useMemo) runs during rendering, so this only works for [pure calculations.](/learn/keeping-components-pure) + +<DeepDive> + +#### How to tell if a calculation is expensive? + +In general, unless you're creating or looping over thousands of objects, it's probably not expensive. If you want to get more confidence, you can add a console log to measure the time spent in a piece of code: + +```js +console.time("filter array"); +const visibleTodos = getFilteredTodos(todos, filter); +console.timeEnd("filter array"); +``` + +Perform the interaction you're measuring (for example, typing into the input). You will then see logs like `filter array: 0.15ms` in your console. If the overall logged time adds up to a significant amount (say, `1ms` or more), it might make sense to memoize that calculation. As an experiment, you can then wrap the calculation in `useMemo` to verify whether the total logged time has decreased for that interaction or not: + +```js +console.time("filter array"); +const visibleTodos = useMemo(() => { + return getFilteredTodos(todos, filter); // Skipped if todos and filter haven't changed +}, [todos, filter]); +console.timeEnd("filter array"); +``` + +`useMemo` won't make the _first_ render faster. It only helps you skip unnecessary work on updates. + +Keep in mind that your machine is probably faster than your users' so it's a good idea to test the performance with an artificial slowdown. For example, Chrome offers a [CPU Throttling](https://developer.chrome.com/blog/new-in-devtools-61/#throttling) option for this. + +Also note that measuring performance in development will not give you the most accurate results. (For example, when [Strict Mode](/reference/react/StrictMode) is on, you will see each component render twice rather than once.) To get the most accurate timings, build your app for production and test it on a device like your users have. + +</DeepDive> + +### Resetting all state when a prop changes + +This `ProfilePage` component receives a `userId` prop. The page contains a comment input, and you use a `comment` state variable to hold its value. One day, you notice a problem: when you navigate from one profile to another, the `comment` state does not get reset. As a result, it's easy to accidentally post a comment on a wrong user's profile. To fix the issue, you want to clear out the `comment` state variable whenever the `userId` changes: + +```js +export default function ProfilePage({ userId }) { + const [comment, setComment] = useState(""); + + // 🔴 Avoid: Resetting state on prop change in an Effect + useEffect(() => { + setComment(""); + }, [userId]); + // ... +} +``` + +This is inefficient because `ProfilePage` and its children will first render with the stale value, and then render again. It is also complicated because you'd need to do this in _every_ component that has some state inside `ProfilePage`. For example, if the comment UI is nested, you'd want to clear out nested comment state too. + +Instead, you can tell React that each user's profile is conceptually a _different_ profile by giving it an explicit key. Split your component in two and pass a `key` attribute from the outer component to the inner one: + +```js +export default function ProfilePage({ userId }) { + return <Profile userId={userId} key={userId} />; +} + +function Profile({ userId }) { + // ✅ This and any other state below will reset on key change automatically + const [comment, setComment] = useState(""); + // ... +} +``` + +Normally, React preserves the state when the same component is rendered in the same spot. **By passing `userId` as a `key` to the `Profile` component, you're asking React to treat two `Profile` components with different `userId` as two different components that should not share any state.** Whenever the key (which you've set to `userId`) changes, React will recreate the DOM and [reset the state](/learn/preserving-and-resetting-state#option-2-resetting-state-with-a-key) of the `Profile` component and all of its children. Now the `comment` field will clear out automatically when navigating between profiles. + +Note that in this example, only the outer `ProfilePage` component is exported and visible to other files in the project. Components rendering `ProfilePage` don't need to pass the key to it: they pass `userId` as a regular prop. The fact `ProfilePage` passes it as a `key` to the inner `Profile` component is an implementation detail. + +### Adjusting some state when a prop changes + +Sometimes, you might want to reset or adjust a part of the state on a prop change, but not all of it. + +This `List` component receives a list of `items` as a prop, and maintains the selected item in the `selection` state variable. You want to reset the `selection` to `null` whenever the `items` prop receives a different array: + +```js +function List({ items }) { + const [isReverse, setIsReverse] = useState(false); + const [selection, setSelection] = useState(null); + + // 🔴 Avoid: Adjusting state on prop change in an Effect + useEffect(() => { + setSelection(null); + }, [items]); + // ... +} +``` + +This, too, is not ideal. Every time the `items` change, the `List` and its child components will render with a stale `selection` value at first. Then React will update the DOM and run the Effects. Finally, the `setSelection(null)` call will cause another re-render of the `List` and its child components, restarting this whole process again. + +Start by deleting the Effect. Instead, adjust the state directly during rendering: + +```js +function List({ items }) { + const [isReverse, setIsReverse] = useState(false); + const [selection, setSelection] = useState(null); + + // Better: Adjust the state while rendering + const [prevItems, setPrevItems] = useState(items); + if (items !== prevItems) { + setPrevItems(items); + setSelection(null); + } + // ... +} +``` + +[Storing information from previous renders](/reference/react/useState#storing-information-from-previous-renders) like this can be hard to understand, but it’s better than updating the same state in an Effect. In the above example, `setSelection` is called directly during a render. React will re-render the `List` _immediately_ after it exits with a `return` statement. React has not rendered the `List` children or updated the DOM yet, so this lets the `List` children skip rendering the stale `selection` value. + +When you update a component during rendering, React throws away the returned JSX and immediately retries rendering. To avoid very slow cascading retries, React only lets you update the _same_ component's state during a render. If you update another component's state during a render, you'll see an error. A condition like `items !== prevItems` is necessary to avoid loops. You may adjust state like this, but any other side effects (like changing the DOM or setting timeouts) should stay in event handlers or Effects to [keep components pure.](/learn/keeping-components-pure) + +**Although this pattern is more efficient than an Effect, most components shouldn't need it either.** No matter how you do it, adjusting state based on props or other state makes your data flow more difficult to understand and debug. Always check whether you can [reset all state with a key](#resetting-all-state-when-a-prop-changes) or [calculate everything during rendering](#updating-state-based-on-props-or-state) instead. For example, instead of storing (and resetting) the selected _item_, you can store the selected _item ID:_ + +```js +function List({ items }) { + const [isReverse, setIsReverse] = useState(false); + const [selectedId, setSelectedId] = useState(null); + // ✅ Best: Calculate everything during rendering + const selection = items.find((item) => item.id === selectedId) ?? null; + // ... +} +``` + +Now there is no need to "adjust" the state at all. If the item with the selected ID is in the list, it remains selected. If it's not, the `selection` calculated during rendering will be `null` because no matching item was found. This behavior is different, but arguably better because most changes to `items` preserve the selection. + +### Sharing logic between event handlers + +Let's say you have a product page with two buttons (Buy and Checkout) that both let you buy that product. You want to show a notification whenever the user puts the product in the cart. Calling `showNotification()` in both buttons' click handlers feels repetitive so you might be tempted to place this logic in an Effect: + +```js +function ProductPage({ product, addToCart }) { + // 🔴 Avoid: Event-specific logic inside an Effect + useEffect(() => { + if (product.isInCart) { + showNotification(`Added ${product.name} to the shopping cart!`); + } + }, [product]); + + function handleBuyClick() { + addToCart(product); + } + + function handleCheckoutClick() { + addToCart(product); + navigateTo("/checkout"); + } + // ... +} +``` + +This Effect is unnecessary. It will also most likely cause bugs. For example, let's say that your app "remembers" the shopping cart between the page reloads. If you add a product to the cart once and refresh the page, the notification will appear again. It will keep appearing every time you refresh that product's page. This is because `product.isInCart` will already be `true` on the page load, so the Effect above will call `showNotification()`. + +**When you're not sure whether some code should be in an Effect or in an event handler, ask yourself _why_ this code needs to run. Use Effects only for code that should run _because_ the component was displayed to the user.** In this example, the notification should appear because the user _pressed the button_, not because the page was displayed! Delete the Effect and put the shared logic into a function called from both event handlers: + +```js +function ProductPage({ product, addToCart }) { + // ✅ Good: Event-specific logic is called from event handlers + function buyProduct() { + addToCart(product); + showNotification(`Added ${product.name} to the shopping cart!`); + } + + function handleBuyClick() { + buyProduct(); + } + + function handleCheckoutClick() { + buyProduct(); + navigateTo("/checkout"); + } + // ... +} +``` + +This both removes the unnecessary Effect and fixes the bug. + +### Sending a POST request + +This `Form` component sends two kinds of POST requests. It sends an analytics event when it mounts. When you fill in the form and click the Submit button, it will send a POST request to the `/api/register` endpoint: + +```js +function Form() { + const [firstName, setFirstName] = useState(""); + const [lastName, setLastName] = useState(""); + + // ✅ Good: This logic should run because the component was displayed + useEffect(() => { + post("/analytics/event", { eventName: "visit_form" }); + }, []); + + // 🔴 Avoid: Event-specific logic inside an Effect + const [jsonToSubmit, setJsonToSubmit] = useState(null); + useEffect(() => { + if (jsonToSubmit !== null) { + post("/api/register", jsonToSubmit); + } + }, [jsonToSubmit]); + + function handleSubmit(e) { + e.preventDefault(); + setJsonToSubmit({ firstName, lastName }); + } + // ... +} +``` + +Let's apply the same criteria as in the example before. + +The analytics POST request should remain in an Effect. This is because the _reason_ to send the analytics event is that the form was displayed. (It would fire twice in development, but [see here](/learn/synchronizing-with-effects#sending-analytics) for how to deal with that.) + +However, the `/api/register` POST request is not caused by the form being _displayed_. You only want to send the request at one specific moment in time: when the user presses the button. It should only ever happen _on that particular interaction_. Delete the second Effect and move that POST request into the event handler: + +```js +function Form() { + const [firstName, setFirstName] = useState(""); + const [lastName, setLastName] = useState(""); + + // ✅ Good: This logic runs because the component was displayed + useEffect(() => { + post("/analytics/event", { eventName: "visit_form" }); + }, []); + + function handleSubmit(e) { + e.preventDefault(); + // ✅ Good: Event-specific logic is in the event handler + post("/api/register", { firstName, lastName }); + } + // ... +} +``` + +When you choose whether to put some logic into an event handler or an Effect, the main question you need to answer is _what kind of logic_ it is from the user's perspective. If this logic is caused by a particular interaction, keep it in the event handler. If it's caused by the user _seeing_ the component on the screen, keep it in the Effect. + +### Chains of computations + +Sometimes you might feel tempted to chain Effects that each adjust a piece of state based on other state: + +```js +function Game() { + const [card, setCard] = useState(null); + const [goldCardCount, setGoldCardCount] = useState(0); + const [round, setRound] = useState(1); + const [isGameOver, setIsGameOver] = useState(false); + + // 🔴 Avoid: Chains of Effects that adjust the state solely to trigger each other + useEffect(() => { + if (card !== null && card.gold) { + setGoldCardCount(c => c + 1); + } + }, [card]); + + useEffect(() => { + if (goldCardCount > 3) { + setRound(r => r + 1) + setGoldCardCount(0); + } + }, [goldCardCount]); + + useEffect(() => { + if (round > 5) { + setIsGameOver(true); + } + }, [round]); + + useEffect(() => { + alert('Good game!'); + }, [isGameOver]); + + function handlePlaceCard(nextCard) { + if (isGameOver) { + throw Error('Game already ended.'); + } else { + setCard(nextCard); + } + } + + // ... +``` + +There are two problems with this code. + +One problem is that it is very inefficient: the component (and its children) have to re-render between each `set` call in the chain. In the example above, in the worst case (`setCard` → render → `setGoldCardCount` → render → `setRound` → render → `setIsGameOver` → render) there are three unnecessary re-renders of the tree below. + +Even if it weren't slow, as your code evolves, you will run into cases where the "chain" you wrote doesn't fit the new requirements. Imagine you are adding a way to step through the history of the game moves. You'd do it by updating each state variable to a value from the past. However, setting the `card` state to a value from the past would trigger the Effect chain again and change the data you're showing. Such code is often rigid and fragile. + +In this case, it's better to calculate what you can during rendering, and adjust the state in the event handler: + +```js +function Game() { + const [card, setCard] = useState(null); + const [goldCardCount, setGoldCardCount] = useState(0); + const [round, setRound] = useState(1); + + // ✅ Calculate what you can during rendering + const isGameOver = round > 5; + + function handlePlaceCard(nextCard) { + if (isGameOver) { + throw Error('Game already ended.'); + } + + // ✅ Calculate all the next state in the event handler + setCard(nextCard); + if (nextCard.gold) { + if (goldCardCount <= 3) { + setGoldCardCount(goldCardCount + 1); + } else { + setGoldCardCount(0); + setRound(round + 1); + if (round === 5) { + alert('Good game!'); + } + } + } + } + + // ... +``` + +This is a lot more efficient. Also, if you implement a way to view game history, now you will be able to set each state variable to a move from the past without triggering the Effect chain that adjusts every other value. If you need to reuse logic between several event handlers, you can [extract a function](#sharing-logic-between-event-handlers) and call it from those handlers. + +Remember that inside event handlers, [state behaves like a snapshot.](/learn/state-as-a-snapshot) For example, even after you call `setRound(round + 1)`, the `round` variable will reflect the value at the time the user clicked the button. If you need to use the next value for calculations, define it manually like `const nextRound = round + 1`. + +In some cases, you _can't_ calculate the next state directly in the event handler. For example, imagine a form with multiple dropdowns where the options of the next dropdown depend on the selected value of the previous dropdown. Then, a chain of Effects is appropriate because you are synchronizing with network. + +### Initializing the application + +Some logic should only run once when the app loads. + +You might be tempted to place it in an Effect in the top-level component: + +```js +function App() { + // 🔴 Avoid: Effects with logic that should only ever run once + useEffect(() => { + loadDataFromLocalStorage(); + checkAuthToken(); + }, []); + // ... +} +``` + +However, you'll quickly discover that it [runs twice in development.](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development) This can cause issues--for example, maybe it invalidates the authentication token because the function wasn't designed to be called twice. In general, your components should be resilient to being remounted. This includes your top-level `App` component. + +Although it may not ever get remounted in practice in production, following the same constraints in all components makes it easier to move and reuse code. If some logic must run _once per app load_ rather than _once per component mount_, add a top-level variable to track whether it has already executed: + +```js +let didInit = false; + +function App() { + useEffect(() => { + if (!didInit) { + didInit = true; + // ✅ Only runs once per app load + loadDataFromLocalStorage(); + checkAuthToken(); + } + }, []); + // ... +} +``` + +You can also run it during module initialization and before the app renders: + +```js +if (typeof window !== "undefined") { + // Check if we're running in the browser. + // ✅ Only runs once per app load + checkAuthToken(); + loadDataFromLocalStorage(); +} + +function App() { + // ... +} +``` + +Code at the top level runs once when your component is imported--even if it doesn't end up being rendered. To avoid slowdown or surprising behavior when importing arbitrary components, don't overuse this pattern. Keep app-wide initialization logic to root component modules like `App.js` or in your application's entry point. + +### Notifying parent components about state changes + +Let's say you're writing a `Toggle` component with an internal `isOn` state which can be either `true` or `false`. There are a few different ways to toggle it (by clicking or dragging). You want to notify the parent component whenever the `Toggle` internal state changes, so you expose an `onChange` event and call it from an Effect: + +```js +function Toggle({ onChange }) { + const [isOn, setIsOn] = useState(false); + + // 🔴 Avoid: The onChange handler runs too late + useEffect(() => { + onChange(isOn); + }, [isOn, onChange]); + + function handleClick() { + setIsOn(!isOn); + } + + function handleDragEnd(e) { + if (isCloserToRightEdge(e)) { + setIsOn(true); + } else { + setIsOn(false); + } + } + + // ... +} +``` + +Like earlier, this is not ideal. The `Toggle` updates its state first, and React updates the screen. Then React runs the Effect, which calls the `onChange` function passed from a parent component. Now the parent component will update its own state, starting another render pass. It would be better to do everything in a single pass. + +Delete the Effect and instead update the state of _both_ components within the same event handler: + +```js +function Toggle({ onChange }) { + const [isOn, setIsOn] = useState(false); + + function updateToggle(nextIsOn) { + // ✅ Good: Perform all updates during the event that caused them + setIsOn(nextIsOn); + onChange(nextIsOn); + } + + function handleClick() { + updateToggle(!isOn); + } + + function handleDragEnd(e) { + if (isCloserToRightEdge(e)) { + updateToggle(true); + } else { + updateToggle(false); + } + } + + // ... +} +``` + +With this approach, both the `Toggle` component and its parent component update their state during the event. React [batches updates](/learn/queueing-a-series-of-state-updates) from different components together, so there will only be one render pass. + +You might also be able to remove the state altogether, and instead receive `isOn` from the parent component: + +```js +// ✅ Also good: the component is fully controlled by its parent +function Toggle({ isOn, onChange }) { + function handleClick() { + onChange(!isOn); + } + + function handleDragEnd(e) { + if (isCloserToRightEdge(e)) { + onChange(true); + } else { + onChange(false); + } + } + + // ... +} +``` + +["Lifting state up"](/learn/sharing-state-between-components) lets the parent component fully control the `Toggle` by toggling the parent's own state. This means the parent component will have to contain more logic, but there will be less state overall to worry about. Whenever you try to keep two different state variables synchronized, try lifting state up instead! + +### Passing data to the parent + +This `Child` component fetches some data and then passes it to the `Parent` component in an Effect: + +```js +function Parent() { + const [data, setData] = useState(null); + // ... + return <Child onFetched={setData} />; +} + +function Child({ onFetched }) { + const data = useSomeAPI(); + // 🔴 Avoid: Passing data to the parent in an Effect + useEffect(() => { + if (data) { + onFetched(data); + } + }, [onFetched, data]); + // ... +} +``` + +In React, data flows from the parent components to their children. When you see something wrong on the screen, you can trace where the information comes from by going up the component chain until you find which component passes the wrong prop or has the wrong state. When child components update the state of their parent components in Effects, the data flow becomes very difficult to trace. Since both the child and the parent need the same data, let the parent component fetch that data, and _pass it down_ to the child instead: + +```js +function Parent() { + const data = useSomeAPI(); + // ... + // ✅ Good: Passing data down to the child + return <Child data={data} />; +} + +function Child({ data }) { + // ... +} +``` + +This is simpler and keeps the data flow predictable: the data flows down from the parent to the child. + +### Subscribing to an external store + +Sometimes, your components may need to subscribe to some data outside of the React state. This data could be from a third-party library or a built-in browser API. Since this data can change without React's knowledge, you need to manually subscribe your components to it. This is often done with an Effect, for example: + +```js +function useOnlineStatus() { + // Not ideal: Manual store subscription in an Effect + const [isOnline, setIsOnline] = useState(true); + useEffect(() => { + function updateState() { + setIsOnline(navigator.onLine); + } + + updateState(); + + window.addEventListener("online", updateState); + window.addEventListener("offline", updateState); + return () => { + window.removeEventListener("online", updateState); + window.removeEventListener("offline", updateState); + }; + }, []); + return isOnline; +} + +function ChatIndicator() { + const isOnline = useOnlineStatus(); + // ... +} +``` + +Here, the component subscribes to an external data store (in this case, the browser `navigator.onLine` API). Since this API does not exist on the server (so it can't be used for the initial HTML), initially the state is set to `true`. Whenever the value of that data store changes in the browser, the component updates its state. + +Although it's common to use Effects for this, React has a purpose-built Hook for subscribing to an external store that is preferred instead. Delete the Effect and replace it with a call to [`useSyncExternalStore`](/reference/react/useSyncExternalStore): + +```js +function subscribe(callback) { + window.addEventListener("online", callback); + window.addEventListener("offline", callback); + return () => { + window.removeEventListener("online", callback); + window.removeEventListener("offline", callback); + }; +} + +function useOnlineStatus() { + // ✅ Good: Subscribing to an external store with a built-in Hook + return useSyncExternalStore( + subscribe, // React won't resubscribe for as long as you pass the same function + () => navigator.onLine, // How to get the value on the client + () => true // How to get the value on the server + ); +} + +function ChatIndicator() { + const isOnline = useOnlineStatus(); + // ... +} +``` + +This approach is less error-prone than manually syncing mutable data to React state with an Effect. Typically, you'll write a custom Hook like `useOnlineStatus()` above so that you don't need to repeat this code in the individual components. [Read more about subscribing to external stores from React components.](/reference/react/useSyncExternalStore) + +### Fetching data + +Many apps use Effects to kick off data fetching. It is quite common to write a data fetching Effect like this: + +```js +function SearchResults({ query }) { + const [results, setResults] = useState([]); + const [page, setPage] = useState(1); + + useEffect(() => { + // 🔴 Avoid: Fetching without cleanup logic + fetchResults(query, page).then((json) => { + setResults(json); + }); + }, [query, page]); + + function handleNextPageClick() { + setPage(page + 1); + } + // ... +} +``` + +You _don't_ need to move this fetch to an event handler. + +This might seem like a contradiction with the earlier examples where you needed to put the logic into the event handlers! However, consider that it's not _the typing event_ that's the main reason to fetch. Search inputs are often prepopulated from the URL, and the user might navigate Back and Forward without touching the input. + +It doesn't matter where `page` and `query` come from. While this component is visible, you want to keep `results` [synchronized](/learn/synchronizing-with-effects) with data from the network for the current `page` and `query`. This is why it's an Effect. + +However, the code above has a bug. Imagine you type `"hello"` fast. Then the `query` will change from `"h"`, to `"he"`, `"hel"`, `"hell"`, and `"hello"`. This will kick off separate fetches, but there is no guarantee about which order the responses will arrive in. For example, the `"hell"` response may arrive _after_ the `"hello"` response. Since it will call `setResults()` last, you will be displaying the wrong search results. This is called a ["race condition"](https://en.wikipedia.org/wiki/Race_condition): two different requests "raced" against each other and came in a different order than you expected. + +**To fix the race condition, you need to [add a cleanup function](/learn/synchronizing-with-effects#fetching-data) to ignore stale responses:** + +```js +function SearchResults({ query }) { + const [results, setResults] = useState([]); + const [page, setPage] = useState(1); + useEffect(() => { + let ignore = false; + fetchResults(query, page).then((json) => { + if (!ignore) { + setResults(json); + } + }); + return () => { + ignore = true; + }; + }, [query, page]); + + function handleNextPageClick() { + setPage(page + 1); + } + // ... +} +``` + +This ensures that when your Effect fetches data, all responses except the last requested one will be ignored. + +Handling race conditions is not the only difficulty with implementing data fetching. You might also want to think about caching responses (so that the user can click Back and see the previous screen instantly), how to fetch data on the server (so that the initial server-rendered HTML contains the fetched content instead of a spinner), and how to avoid network waterfalls (so that a child can fetch data without waiting for every parent). + +**These issues apply to any UI library, not just React. Solving them is not trivial, which is why modern [frameworks](/learn/start-a-new-react-project#production-grade-react-frameworks) provide more efficient built-in data fetching mechanisms than fetching data in Effects.** + +If you don't use a framework (and don't want to build your own) but would like to make data fetching from Effects more ergonomic, consider extracting your fetching logic into a custom Hook like in this example: + +```js +function SearchResults({ query }) { + const [page, setPage] = useState(1); + const params = new URLSearchParams({ query, page }); + const results = useData(`/api/search?${params}`); + + function handleNextPageClick() { + setPage(page + 1); + } + // ... +} + +function useData(url) { + const [data, setData] = useState(null); + useEffect(() => { + let ignore = false; + fetch(url) + .then((response) => response.json()) + .then((json) => { + if (!ignore) { + setData(json); + } + }); + return () => { + ignore = true; + }; + }, [url]); + return data; +} +``` + +You'll likely also want to add some logic for error handling and to track whether the content is loading. You can build a Hook like this yourself or use one of the many solutions already available in the React ecosystem. **Although this alone won't be as efficient as using a framework's built-in data fetching mechanism, moving the data fetching logic into a custom Hook will make it easier to adopt an efficient data fetching strategy later.** + +In general, whenever you have to resort to writing Effects, keep an eye out for when you can extract a piece of functionality into a custom Hook with a more declarative and purpose-built API like `useData` above. The fewer raw `useEffect` calls you have in your components, the easier you will find to maintain your application. + +<Recap> + +- If you can calculate something during render, you don't need an Effect. +- To cache expensive calculations, add `useMemo` instead of `useEffect`. +- To reset the state of an entire component tree, pass a different `key` to it. +- To reset a particular bit of state in response to a prop change, set it during rendering. +- Code that runs because a component was _displayed_ should be in Effects, the rest should be in events. +- If you need to update the state of several components, it's better to do it during a single event. +- Whenever you try to synchronize state variables in different components, consider lifting state up. +- You can fetch data with Effects, but you need to implement cleanup to avoid race conditions. + +</Recap> + +<Challenges> + +#### Transform data without Effects + +The `TodoList` below displays a list of todos. When the "Show only active todos" checkbox is ticked, completed todos are not displayed in the list. Regardless of which todos are visible, the footer displays the count of todos that are not yet completed. + +Simplify this component by removing all the unnecessary state and Effects. + +```js +import { useState, useEffect } from "react"; +import { initialTodos, createTodo } from "./todos.js"; + +export default function TodoList() { + const [todos, setTodos] = useState(initialTodos); + const [showActive, setShowActive] = useState(false); + const [activeTodos, setActiveTodos] = useState([]); + const [visibleTodos, setVisibleTodos] = useState([]); + const [footer, setFooter] = useState(null); + + useEffect(() => { + setActiveTodos(todos.filter((todo) => !todo.completed)); + }, [todos]); + + useEffect(() => { + setVisibleTodos(showActive ? activeTodos : todos); + }, [showActive, todos, activeTodos]); + + useEffect(() => { + setFooter(<footer>{activeTodos.length} todos left</footer>); + }, [activeTodos]); + + return ( + <> + <label> + <input + type="checkbox" + checked={showActive} + onChange={(e) => setShowActive(e.target.checked)} + /> + Show only active todos + </label> + <NewTodo onAdd={(newTodo) => setTodos([...todos, newTodo])} /> + <ul> + {visibleTodos.map((todo) => ( + <li key={todo.id}> + {todo.completed ? <s>{todo.text}</s> : todo.text} + </li> + ))} + </ul> + {footer} + </> + ); +} + +function NewTodo({ onAdd }) { + const [text, setText] = useState(""); + + function handleAddClick() { + setText(""); + onAdd(createTodo(text)); + } + + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <button on_click={handleAddClick}>Add</button> + </> + ); +} +``` + +```js +let nextId = 0; + +export function createTodo(text, completed = false) { + return { + id: nextId++, + text, + completed, + }; +} + +export const initialTodos = [ + createTodo("Get apples", true), + createTodo("Get oranges", true), + createTodo("Get carrots"), +]; +``` + +```css +label { + display: block; +} +input { + margin-top: 10px; +} +``` + +<Hint> + +If you can calculate something during rendering, you don't need state or an Effect that updates it. + +</Hint> + +<Solution> + +There are only two essential pieces of state in this example: the list of `todos` and the `showActive` state variable which represents whether the checkbox is ticked. All of the other state variables are [redundant](/learn/choosing-the-state-structure#avoid-redundant-state) and can be calculated during rendering instead. This includes the `footer` which you can move directly into the surrounding JSX. + +Your result should end up looking like this: + +```js +import { useState } from "react"; +import { initialTodos, createTodo } from "./todos.js"; + +export default function TodoList() { + const [todos, setTodos] = useState(initialTodos); + const [showActive, setShowActive] = useState(false); + const activeTodos = todos.filter((todo) => !todo.completed); + const visibleTodos = showActive ? activeTodos : todos; + + return ( + <> + <label> + <input + type="checkbox" + checked={showActive} + onChange={(e) => setShowActive(e.target.checked)} + /> + Show only active todos + </label> + <NewTodo onAdd={(newTodo) => setTodos([...todos, newTodo])} /> + <ul> + {visibleTodos.map((todo) => ( + <li key={todo.id}> + {todo.completed ? <s>{todo.text}</s> : todo.text} + </li> + ))} + </ul> + <footer>{activeTodos.length} todos left</footer> + </> + ); +} + +function NewTodo({ onAdd }) { + const [text, setText] = useState(""); + + function handleAddClick() { + setText(""); + onAdd(createTodo(text)); + } + + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <button on_click={handleAddClick}>Add</button> + </> + ); +} +``` + +```js +let nextId = 0; + +export function createTodo(text, completed = false) { + return { + id: nextId++, + text, + completed, + }; +} + +export const initialTodos = [ + createTodo("Get apples", true), + createTodo("Get oranges", true), + createTodo("Get carrots"), +]; +``` + +```css +label { + display: block; +} +input { + margin-top: 10px; +} +``` + +</Solution> + +#### Cache a calculation without Effects + +In this example, filtering the todos was extracted into a separate function called `getVisibleTodos()`. This function contains a `console.log()` call inside of it which helps you notice when it's being called. Toggle "Show only active todos" and notice that it causes `getVisibleTodos()` to re-run. This is expected because visible todos change when you toggle which ones to display. + +Your task is to remove the Effect that recomputes the `visibleTodos` list in the `TodoList` component. However, you need to make sure that `getVisibleTodos()` does _not_ re-run (and so does not print any logs) when you type into the input. + +<Hint> + +One solution is to add a `useMemo` call to cache the visible todos. There is also another, less obvious solution. + +</Hint> + +```js +import { useState, useEffect } from "react"; +import { initialTodos, createTodo, getVisibleTodos } from "./todos.js"; + +export default function TodoList() { + const [todos, setTodos] = useState(initialTodos); + const [showActive, setShowActive] = useState(false); + const [text, setText] = useState(""); + const [visibleTodos, setVisibleTodos] = useState([]); + + useEffect(() => { + setVisibleTodos(getVisibleTodos(todos, showActive)); + }, [todos, showActive]); + + function handleAddClick() { + setText(""); + setTodos([...todos, createTodo(text)]); + } + + return ( + <> + <label> + <input + type="checkbox" + checked={showActive} + onChange={(e) => setShowActive(e.target.checked)} + /> + Show only active todos + </label> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <button on_click={handleAddClick}>Add</button> + <ul> + {visibleTodos.map((todo) => ( + <li key={todo.id}> + {todo.completed ? <s>{todo.text}</s> : todo.text} + </li> + ))} + </ul> + </> + ); +} +``` + +```js +let nextId = 0; +let calls = 0; + +export function getVisibleTodos(todos, showActive) { + console.log(`getVisibleTodos() was called ${++calls} times`); + const activeTodos = todos.filter((todo) => !todo.completed); + const visibleTodos = showActive ? activeTodos : todos; + return visibleTodos; +} + +export function createTodo(text, completed = false) { + return { + id: nextId++, + text, + completed, + }; +} + +export const initialTodos = [ + createTodo("Get apples", true), + createTodo("Get oranges", true), + createTodo("Get carrots"), +]; +``` + +```css +label { + display: block; +} +input { + margin-top: 10px; +} +``` + +<Solution> + +Remove the state variable and the Effect, and instead add a `useMemo` call to cache the result of calling `getVisibleTodos()`: + +```js +import { useState, useMemo } from "react"; +import { initialTodos, createTodo, getVisibleTodos } from "./todos.js"; + +export default function TodoList() { + const [todos, setTodos] = useState(initialTodos); + const [showActive, setShowActive] = useState(false); + const [text, setText] = useState(""); + const visibleTodos = useMemo( + () => getVisibleTodos(todos, showActive), + [todos, showActive] + ); + + function handleAddClick() { + setText(""); + setTodos([...todos, createTodo(text)]); + } + + return ( + <> + <label> + <input + type="checkbox" + checked={showActive} + onChange={(e) => setShowActive(e.target.checked)} + /> + Show only active todos + </label> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <button on_click={handleAddClick}>Add</button> + <ul> + {visibleTodos.map((todo) => ( + <li key={todo.id}> + {todo.completed ? <s>{todo.text}</s> : todo.text} + </li> + ))} + </ul> + </> + ); +} +``` + +```js +let nextId = 0; +let calls = 0; + +export function getVisibleTodos(todos, showActive) { + console.log(`getVisibleTodos() was called ${++calls} times`); + const activeTodos = todos.filter((todo) => !todo.completed); + const visibleTodos = showActive ? activeTodos : todos; + return visibleTodos; +} + +export function createTodo(text, completed = false) { + return { + id: nextId++, + text, + completed, + }; +} + +export const initialTodos = [ + createTodo("Get apples", true), + createTodo("Get oranges", true), + createTodo("Get carrots"), +]; +``` + +```css +label { + display: block; +} +input { + margin-top: 10px; +} +``` + +With this change, `getVisibleTodos()` will be called only if `todos` or `showActive` change. Typing into the input only changes the `text` state variable, so it does not trigger a call to `getVisibleTodos()`. + +There is also another solution which does not need `useMemo`. Since the `text` state variable can't possibly affect the list of todos, you can extract the `NewTodo` form into a separate component, and move the `text` state variable inside of it: + +```js +import { useState, useMemo } from "react"; +import { initialTodos, createTodo, getVisibleTodos } from "./todos.js"; + +export default function TodoList() { + const [todos, setTodos] = useState(initialTodos); + const [showActive, setShowActive] = useState(false); + const visibleTodos = getVisibleTodos(todos, showActive); + + return ( + <> + <label> + <input + type="checkbox" + checked={showActive} + onChange={(e) => setShowActive(e.target.checked)} + /> + Show only active todos + </label> + <NewTodo onAdd={(newTodo) => setTodos([...todos, newTodo])} /> + <ul> + {visibleTodos.map((todo) => ( + <li key={todo.id}> + {todo.completed ? <s>{todo.text}</s> : todo.text} + </li> + ))} + </ul> + </> + ); +} + +function NewTodo({ onAdd }) { + const [text, setText] = useState(""); + + function handleAddClick() { + setText(""); + onAdd(createTodo(text)); + } + + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <button on_click={handleAddClick}>Add</button> + </> + ); +} +``` + +```js +let nextId = 0; +let calls = 0; + +export function getVisibleTodos(todos, showActive) { + console.log(`getVisibleTodos() was called ${++calls} times`); + const activeTodos = todos.filter((todo) => !todo.completed); + const visibleTodos = showActive ? activeTodos : todos; + return visibleTodos; +} + +export function createTodo(text, completed = false) { + return { + id: nextId++, + text, + completed, + }; +} + +export const initialTodos = [ + createTodo("Get apples", true), + createTodo("Get oranges", true), + createTodo("Get carrots"), +]; +``` + +```css +label { + display: block; +} +input { + margin-top: 10px; +} +``` + +This approach satisfies the requirements too. When you type into the input, only the `text` state variable updates. Since the `text` state variable is in the child `NewTodo` component, the parent `TodoList` component won't get re-rendered. This is why `getVisibleTodos()` doesn't get called when you type. (It would still be called if the `TodoList` re-renders for another reason.) + +</Solution> + +#### Reset state without Effects + +This `EditContact` component receives a contact object shaped like `{ id, name, email }` as the `savedContact` prop. Try editing the name and email input fields. When you press Save, the contact's button above the form updates to the edited name. When you press Reset, any pending changes in the form are discarded. Play around with this UI to get a feel for it. + +When you select a contact with the buttons at the top, the form resets to reflect that contact's details. This is done with an Effect inside `EditContact.js`. Remove this Effect. Find another way to reset the form when `savedContact.id` changes. + +```js +import { useState } from "react"; +import ContactList from "./ContactList.js"; +import EditContact from "./EditContact.js"; + +export default function ContactManager() { + const [contacts, setContacts] = useState(initialContacts); + const [selectedId, setSelectedId] = useState(0); + const selectedContact = contacts.find((c) => c.id === selectedId); + + function handleSave(updatedData) { + const nextContacts = contacts.map((c) => { + if (c.id === updatedData.id) { + return updatedData; + } else { + return c; + } + }); + setContacts(nextContacts); + } + + return ( + <div> + <ContactList + contacts={contacts} + selectedId={selectedId} + onSelect={(id) => setSelectedId(id)} + /> + <hr /> + <EditContact savedContact={selectedContact} onSave={handleSave} /> + </div> + ); +} + +const initialContacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export default function ContactList({ contacts, selectedId, onSelect }) { + return ( + <section> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + onSelect(contact.id); + }} + > + {contact.id === selectedId ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export default function EditContact({ savedContact, onSave }) { + const [name, setName] = useState(savedContact.name); + const [email, setEmail] = useState(savedContact.email); + + useEffect(() => { + setName(savedContact.name); + setEmail(savedContact.email); + }, [savedContact]); + + return ( + <section> + <label> + Name:{" "} + <input + type="text" + value={name} + onChange={(e) => setName(e.target.value)} + /> + </label> + <label> + Email:{" "} + <input + type="email" + value={email} + onChange={(e) => setEmail(e.target.value)} + /> + </label> + <button + on_click={() => { + const updatedData = { + id: savedContact.id, + name: name, + email: email, + }; + onSave(updatedData); + }} + > + Save + </button> + <button + on_click={() => { + setName(savedContact.name); + setEmail(savedContact.email); + }} + > + Reset + </button> + </section> + ); +} +``` + +```css +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li { + display: inline-block; +} +li button { + padding: 10px; +} +label { + display: block; + margin: 10px 0; +} +button { + margin-right: 10px; + margin-bottom: 10px; +} +``` + +<Hint> + +It would be nice if there was a way to tell React that when `savedContact.id` is different, the `EditContact` form is conceptually a _different contact's form_ and should not preserve state. Do you recall any such way? + +</Hint> + +<Solution> + +Split the `EditContact` component in two. Move all the form state into the inner `EditForm` component. Export the outer `EditContact` component, and make it pass `savedContact.id` as the `key` to the inner `EditContact` component. As a result, the inner `EditForm` component resets all of the form state and recreates the DOM whenever you select a different contact. + +```js +import { useState } from "react"; +import ContactList from "./ContactList.js"; +import EditContact from "./EditContact.js"; + +export default function ContactManager() { + const [contacts, setContacts] = useState(initialContacts); + const [selectedId, setSelectedId] = useState(0); + const selectedContact = contacts.find((c) => c.id === selectedId); + + function handleSave(updatedData) { + const nextContacts = contacts.map((c) => { + if (c.id === updatedData.id) { + return updatedData; + } else { + return c; + } + }); + setContacts(nextContacts); + } + + return ( + <div> + <ContactList + contacts={contacts} + selectedId={selectedId} + onSelect={(id) => setSelectedId(id)} + /> + <hr /> + <EditContact savedContact={selectedContact} onSave={handleSave} /> + </div> + ); +} + +const initialContacts = [ + { id: 0, name: "Taylor", email: "taylor@mail.com" }, + { id: 1, name: "Alice", email: "alice@mail.com" }, + { id: 2, name: "Bob", email: "bob@mail.com" }, +]; +``` + +```js +export default function ContactList({ contacts, selectedId, onSelect }) { + return ( + <section> + <ul> + {contacts.map((contact) => ( + <li key={contact.id}> + <button + on_click={() => { + onSelect(contact.id); + }} + > + {contact.id === selectedId ? ( + <b>{contact.name}</b> + ) : ( + contact.name + )} + </button> + </li> + ))} + </ul> + </section> + ); +} +``` + +```js +import { useState } from "react"; + +export default function EditContact(props) { + return <EditForm {...props} key={props.savedContact.id} />; +} + +function EditForm({ savedContact, onSave }) { + const [name, setName] = useState(savedContact.name); + const [email, setEmail] = useState(savedContact.email); + + return ( + <section> + <label> + Name:{" "} + <input + type="text" + value={name} + onChange={(e) => setName(e.target.value)} + /> + </label> + <label> + Email:{" "} + <input + type="email" + value={email} + onChange={(e) => setEmail(e.target.value)} + /> + </label> + <button + on_click={() => { + const updatedData = { + id: savedContact.id, + name: name, + email: email, + }; + onSave(updatedData); + }} + > + Save + </button> + <button + on_click={() => { + setName(savedContact.name); + setEmail(savedContact.email); + }} + > + Reset + </button> + </section> + ); +} +``` + +```css +ul, +li { + list-style: none; + margin: 0; + padding: 0; +} +li { + display: inline-block; +} +li button { + padding: 10px; +} +label { + display: block; + margin: 10px 0; +} +button { + margin-right: 10px; + margin-bottom: 10px; +} +``` + +</Solution> + +#### Submit a form without Effects + +This `Form` component lets you send a message to a friend. When you submit the form, the `showForm` state variable is set to `false`. This triggers an Effect calling `sendMessage(message)`, which sends the message (you can see it in the console). After the message is sent, you see a "Thank you" dialog with an "Open chat" button that lets you get back to the form. + +Your app's users are sending way too many messages. To make chatting a little bit more difficult, you've decided to show the "Thank you" dialog _first_ rather than the form. Change the `showForm` state variable to initialize to `false` instead of `true`. As soon as you make that change, the console will show that an empty message was sent. Something in this logic is wrong! + +What's the root cause of this problem? And how can you fix it? + +<Hint> + +Should the message be sent _because_ the user saw the "Thank you" dialog? Or is it the other way around? + +</Hint> + +```js +import { useState, useEffect } from "react"; + +export default function Form() { + const [showForm, setShowForm] = useState(true); + const [message, setMessage] = useState(""); + + useEffect(() => { + if (!showForm) { + sendMessage(message); + } + }, [showForm, message]); + + function handleSubmit(e) { + e.preventDefault(); + setShowForm(false); + } + + if (!showForm) { + return ( + <> + <h1>Thanks for using our services!</h1> + <button + on_click={() => { + setMessage(""); + setShowForm(true); + }} + > + Open chat + </button> + </> + ); + } + + return ( + <form onSubmit={handleSubmit}> + <textarea + placeholder="Message" + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + <button type="submit" disabled={message === ""}> + Send + </button> + </form> + ); +} + +function sendMessage(message) { + console.log("Sending message: " + message); +} +``` + +```css +label, +textarea { + margin-bottom: 10px; + display: block; +} +``` + +<Solution> + +The `showForm` state variable determines whether to show the form or the "Thank you" dialog. However, you aren't sending the message because the "Thank you" dialog was _displayed_. You want to send the message because the user has _submitted the form._ Delete the misleading Effect and move the `sendMessage` call inside the `handleSubmit` event handler: + +```js +import { useState, useEffect } from "react"; + +export default function Form() { + const [showForm, setShowForm] = useState(true); + const [message, setMessage] = useState(""); + + function handleSubmit(e) { + e.preventDefault(); + setShowForm(false); + sendMessage(message); + } + + if (!showForm) { + return ( + <> + <h1>Thanks for using our services!</h1> + <button + on_click={() => { + setMessage(""); + setShowForm(true); + }} + > + Open chat + </button> + </> + ); + } + + return ( + <form onSubmit={handleSubmit}> + <textarea + placeholder="Message" + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + <button type="submit" disabled={message === ""}> + Send + </button> + </form> + ); +} + +function sendMessage(message) { + console.log("Sending message: " + message); +} +``` + +```css +label, +textarea { + margin-bottom: 10px; + display: block; +} +``` + +Notice how in this version, only _submitting the form_ (which is an event) causes the message to be sent. It works equally well regardless of whether `showForm` is initially set to `true` or `false`. (Set it to `false` and notice no extra console messages.) + +</Solution> + +</Challenges> diff --git a/docs/src/learn/your-first-component.md b/docs/src/learn/your-first-component.md new file mode 100644 index 000000000..a22d43f9b --- /dev/null +++ b/docs/src/learn/your-first-component.md @@ -0,0 +1,404 @@ +--- +title: Your First Component 🚧 +--- + +## Overview + +<p class="intro" markdown> + +_Components_ are one of the core concepts of React. They are the foundation upon which you build user interfaces (UI), which makes them the perfect place to start your React journey! + +</p> + +!!! summary "You Will Learn" + + - What a component is + - What role components play in a React application + - How to write your first React component + +## Components: UI building blocks + +On the Web, HTML lets us create rich structured documents with its built-in set of tags like `<h1>` and `<li>`: + +```html +<article> + <h1>My First Component</h1> + <ol> + <li>Components: UI Building Blocks</li> + <li>Defining a Component</li> + <li>Using a Component</li> + </ol> +</article> +``` + +This markup represents this article `<article>`, its heading `<h1>`, and an (abbreviated) table of contents as an ordered list `<ol>`. Markup like this, combined with CSS for style, and JavaScript for interactivity, lies behind every sidebar, avatar, modal, dropdown—every piece of UI you see on the Web. + +React lets you combine your markup, CSS, and JavaScript into custom "components", **reusable UI elements for your app.** The table of contents code you saw above could be turned into a `<TableOfContents />` component you could render on every page. Under the hood, it still uses the same HTML tags like `<article>`, `<h1>`, etc. + +Just like with HTML tags, you can compose, order and nest components to design whole pages. For example, the documentation page you're reading is made out of React components: + +```js +<PageLayout> + <NavigationHeader> + <SearchBar /> + <Link to="/docs">Docs</Link> + </NavigationHeader> + <Sidebar /> + <PageContent> + <TableOfContents /> + <DocumentationText /> + </PageContent> +</PageLayout> +``` + +As your project grows, you will notice that many of your designs can be composed by reusing components you already wrote, speeding up your development. Our table of contents above could be added to any screen with `<TableOfContents />`! You can even jumpstart your project with the thousands of components shared by the React open source community like [Chakra UI](https://chakra-ui.com/) and [Material UI.](https://material-ui.com/) + +## Defining a component + +Traditionally when creating web pages, web developers marked up their content and then added interaction by sprinkling on some JavaScript. This worked great when interaction was a nice-to-have on the web. Now it is expected for many sites and all apps. React puts interactivity first while still using the same technology: **a React component is a JavaScript function that you can _sprinkle with markup_.** Here's what that looks like (you can edit the example below): + +```js +export default function Profile() { + return ( + <img src="https://i.imgur.com/MK3eW3Am.jpg" alt="Katherine Johnson" /> + ); +} +``` + +```css +img { + height: 200px; +} +``` + +And here's how to build a component: + +### Step 1: Export the component + +The `export default` prefix is a [standard JavaScript syntax](https://developer.mozilla.org/docs/web/javascript/reference/statements/export) (not specific to React). It lets you mark the main function in a file so that you can later import it from other files. (More on importing in [Importing and Exporting Components](/learn/importing-and-exporting-components)!) + +### Step 2: Define the function + +With `function Profile() { }` you define a JavaScript function with the name `Profile`. + +<Pitfall> + +React components are regular JavaScript functions, but **their names must start with a capital letter** or they won't work! + +</Pitfall> + +### Step 3: Add markup + +The component returns an `<img />` tag with `src` and `alt` attributes. `<img />` is written like HTML, but it is actually JavaScript under the hood! This syntax is called [JSX](/learn/writing-markup-with-jsx), and it lets you embed markup inside JavaScript. + +Return statements can be written all on one line, as in this component: + +```js +return <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />; +``` + +But if your markup isn't all on the same line as the `return` keyword, you must wrap it in a pair of parentheses: + +```js +return ( + <div> + <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" /> + </div> +); +``` + +<Pitfall> + +Without parentheses, any code on the lines after `return` [will be ignored](https://stackoverflow.com/questions/2846283/what-are-the-rules-for-javascripts-automatic-semicolon-insertion-asi)! + +</Pitfall> + +## Using a component + +Now that you've defined your `Profile` component, you can nest it inside other components. For example, you can export a `Gallery` component that uses multiple `Profile` components: + +```js +function Profile() { + return ( + <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" /> + ); +} + +export default function Gallery() { + return ( + <section> + <h1>Amazing scientists</h1> + <Profile /> + <Profile /> + <Profile /> + </section> + ); +} +``` + +```css +img { + margin: 0 10px 10px 0; + height: 90px; +} +``` + +### What the browser sees + +Notice the difference in casing: + +- `<section>` is lowercase, so React knows we refer to an HTML tag. +- `<Profile />` starts with a capital `P`, so React knows that we want to use our component called `Profile`. + +And `Profile` contains even more HTML: `<img />`. In the end, this is what the browser sees: + +```html +<section> + <h1>Amazing scientists</h1> + <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" /> + <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" /> + <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" /> +</section> +``` + +### Nesting and organizing components + +Components are regular JavaScript functions, so you can keep multiple components in the same file. This is convenient when components are relatively small or tightly related to each other. If this file gets crowded, you can always move `Profile` to a separate file. You will learn how to do this shortly on the [page about imports.](/learn/importing-and-exporting-components) + +Because the `Profile` components are rendered inside `Gallery`—even several times!—we can say that `Gallery` is a **parent component,** rendering each `Profile` as a "child". This is part of the magic of React: you can define a component once, and then use it in as many places and as many times as you like. + +<Pitfall> + +Components can render other components, but **you must never nest their definitions:** + +```js +export default function Gallery() { + // 🔴 Never define a component inside another component! + function Profile() { + // ... + } + // ... +} +``` + +The snippet above is [very slow and causes bugs.](/learn/preserving-and-resetting-state#different-components-at-the-same-position-reset-state) Instead, define every component at the top level: + +```js +export default function Gallery() { + // ... +} + +// ✅ Declare components at the top level +function Profile() { + // ... +} +``` + +When a child component needs some data from a parent, [pass it by props](/learn/passing-props-to-a-component) instead of nesting definitions. + +</Pitfall> + +<DeepDive> + +#### Components all the way down + +Your React application begins at a "root" component. Usually, it is created automatically when you start a new project. For example, if you use [CodeSandbox](https://codesandbox.io/) or [Create React App](https://create-react-app.dev/), the root component is defined in `src/App.js`. If you use the framework [Next.js](https://nextjs.org/), the root component is defined in `pages/index.js`. In these examples, you've been exporting root components. + +Most React apps use components all the way down. This means that you won't only use components for reusable pieces like buttons, but also for larger pieces like sidebars, lists, and ultimately, complete pages! Components are a handy way to organize UI code and markup, even if some of them are only used once. + +[React-based frameworks](/learn/start-a-new-react-project) take this a step further. Instead of using an empty HTML file and letting React "take over" managing the page with JavaScript, they _also_ generate the HTML automatically from your React components. This allows your app to show some content before the JavaScript code loads. + +Still, many websites only use React to [add interactivity to existing HTML pages.](/learn/add-react-to-an-existing-project#using-react-for-a-part-of-your-existing-page) They have many root components instead of a single one for the entire page. You can use as much—or as little—React as you need. + +</DeepDive> + +<Recap> + +You've just gotten your first taste of React! Let's recap some key points. + +- React lets you create components, **reusable UI elements for your app.** +- In a React app, every piece of UI is a component. +- React components are regular JavaScript functions except: + + 1. Their names always begin with a capital letter. + 2. They return JSX markup. + +</Recap> + +<Challenges> + +#### Export the component + +This sandbox doesn't work because the root component is not exported: + +```js +function Profile() { + return <img src="https://i.imgur.com/lICfvbD.jpg" alt="Aklilu Lemma" />; +} +``` + +```css +img { + height: 181px; +} +``` + +Try to fix it yourself before looking at the solution! + +<Solution> + +Add `export default` before the function definition like so: + +```js +export default function Profile() { + return <img src="https://i.imgur.com/lICfvbD.jpg" alt="Aklilu Lemma" />; +} +``` + +```css +img { + height: 181px; +} +``` + +You might be wondering why writing `export` alone is not enough to fix this example. You can learn the difference between `export` and `export default` in [Importing and Exporting Components.](/learn/importing-and-exporting-components) + +</Solution> + +#### Fix the return statement + +Something isn't right about this `return` statement. Can you fix it? + +<Hint> + +You may get an "Unexpected token" error while trying to fix this. In that case, check that the semicolon appears _after_ the closing parenthesis. Leaving a semicolon inside `return ( )` will cause an error. + +</Hint> + +```js +export default function Profile() { + return; + <img src="https://i.imgur.com/jA8hHMpm.jpg" alt="Katsuko Saruhashi" />; +} +``` + +```css +img { + height: 180px; +} +``` + +<Solution> + +You can fix this component by moving the return statement to one line like so: + +```js +export default function Profile() { + return ( + <img src="https://i.imgur.com/jA8hHMpm.jpg" alt="Katsuko Saruhashi" /> + ); +} +``` + +```css +img { + height: 180px; +} +``` + +Or by wrapping the returned JSX markup in parentheses that open right after `return`: + +```js +export default function Profile() { + return ( + <img src="https://i.imgur.com/jA8hHMpm.jpg" alt="Katsuko Saruhashi" /> + ); +} +``` + +```css +img { + height: 180px; +} +``` + +</Solution> + +#### Spot the mistake + +Something's wrong with how the `Profile` component is declared and used. Can you spot the mistake? (Try to remember how React distinguishes components from the regular HTML tags!) + +```js +function profile() { + return <img src="https://i.imgur.com/QIrZWGIs.jpg" alt="Alan L. Hart" />; +} + +export default function Gallery() { + return ( + <section> + <h1>Amazing scientists</h1> + <profile /> + <profile /> + <profile /> + </section> + ); +} +``` + +```css +img { + margin: 0 10px 10px 0; + height: 90px; +} +``` + +<Solution> + +React component names must start with a capital letter. + +Change `function profile()` to `function Profile()`, and then change every `<profile />` to `<Profile />`: + +```js +function Profile() { + return <img src="https://i.imgur.com/QIrZWGIs.jpg" alt="Alan L. Hart" />; +} + +export default function Gallery() { + return ( + <section> + <h1>Amazing scientists</h1> + <Profile /> + <Profile /> + <Profile /> + </section> + ); +} +``` + +```css +img { + margin: 0 10px 10px 0; +} +``` + +</Solution> + +#### Your own component + +Write a component from scratch. You can give it any valid name and return any markup. If you're out of ideas, you can write a `Congratulations` component that shows `<h1>Good job!</h1>`. Don't forget to export it! + +```js +// Write your component below! +``` + +<Solution> + +```js +export default function Congratulations() { + return <h1>Good job!</h1>; +} +``` + +</Solution> + +</Challenges> diff --git a/docs/src/reference/client-api.md b/docs/src/reference/client-api.md new file mode 100644 index 000000000..777830f09 --- /dev/null +++ b/docs/src/reference/client-api.md @@ -0,0 +1,3 @@ +--- +title: Client API 🚧 +--- diff --git a/docs/src/reference/common-events.md b/docs/src/reference/common-events.md new file mode 100644 index 000000000..573da7afc --- /dev/null +++ b/docs/src/reference/common-events.md @@ -0,0 +1,3 @@ +--- +title: Common Events 🚧 +--- diff --git a/docs/src/reference/common-props.md b/docs/src/reference/common-props.md new file mode 100644 index 000000000..1c53918ff --- /dev/null +++ b/docs/src/reference/common-props.md @@ -0,0 +1,3 @@ +--- +title: Common Props 🚧 +--- diff --git a/docs/src/reference/common-types.md b/docs/src/reference/common-types.md new file mode 100644 index 000000000..950107e6f --- /dev/null +++ b/docs/src/reference/common-types.md @@ -0,0 +1,3 @@ +--- +title: Common Types 🚧 +--- diff --git a/docs/src/reference/django.md b/docs/src/reference/django.md new file mode 100644 index 000000000..3cc86a05e --- /dev/null +++ b/docs/src/reference/django.md @@ -0,0 +1,3 @@ +--- +title: Django 🚧 +--- diff --git a/docs/src/reference/fastapi.md b/docs/src/reference/fastapi.md new file mode 100644 index 000000000..e62f39fd3 --- /dev/null +++ b/docs/src/reference/fastapi.md @@ -0,0 +1,3 @@ +--- +title: FastAPI 🚧 +--- diff --git a/docs/src/reference/flask.md b/docs/src/reference/flask.md new file mode 100644 index 000000000..a5fc59a07 --- /dev/null +++ b/docs/src/reference/flask.md @@ -0,0 +1,3 @@ +--- +title: Flask 🚧 +--- diff --git a/docs/src/reference/jupyter.md b/docs/src/reference/jupyter.md new file mode 100644 index 000000000..5d0149420 --- /dev/null +++ b/docs/src/reference/jupyter.md @@ -0,0 +1,3 @@ +--- +title: Jupyter 🚧 +--- diff --git a/docs/src/reference/plotly-dash.md b/docs/src/reference/plotly-dash.md new file mode 100644 index 000000000..c050957e8 --- /dev/null +++ b/docs/src/reference/plotly-dash.md @@ -0,0 +1,3 @@ +--- +title: Plotly Dash 🚧 +--- diff --git a/docs/src/reference/protocol-structure.md b/docs/src/reference/protocol-structure.md new file mode 100644 index 000000000..cc48c47dc --- /dev/null +++ b/docs/src/reference/protocol-structure.md @@ -0,0 +1,3 @@ +--- +title: Protocol Structure 🚧 +--- diff --git a/docs/src/reference/sanic.md b/docs/src/reference/sanic.md new file mode 100644 index 000000000..4b941c71c --- /dev/null +++ b/docs/src/reference/sanic.md @@ -0,0 +1,3 @@ +--- +title: Sanic 🚧 +--- diff --git a/docs/src/reference/starlette.md b/docs/src/reference/starlette.md new file mode 100644 index 000000000..1414d1327 --- /dev/null +++ b/docs/src/reference/starlette.md @@ -0,0 +1,3 @@ +--- +title: Starlette 🚧 +--- diff --git a/docs/src/reference/tornado.md b/docs/src/reference/tornado.md new file mode 100644 index 000000000..6f09d1bb8 --- /dev/null +++ b/docs/src/reference/tornado.md @@ -0,0 +1,3 @@ +--- +title: Tornado 🚧 +--- diff --git a/docs/src/reference/usage.md b/docs/src/reference/usage.md new file mode 100644 index 000000000..32d698308 --- /dev/null +++ b/docs/src/reference/usage.md @@ -0,0 +1,3 @@ +--- +title: Usage 🚧 +--- diff --git a/docs/src/reference/use-callback.md b/docs/src/reference/use-callback.md new file mode 100644 index 000000000..0eb38f4a4 --- /dev/null +++ b/docs/src/reference/use-callback.md @@ -0,0 +1,3 @@ +--- +title: Use Callback 🚧 +--- diff --git a/docs/src/reference/use-connection.md b/docs/src/reference/use-connection.md new file mode 100644 index 000000000..582dd88c4 --- /dev/null +++ b/docs/src/reference/use-connection.md @@ -0,0 +1,3 @@ +--- +title: Use Connection 🚧 +--- diff --git a/docs/src/reference/use-context.md b/docs/src/reference/use-context.md new file mode 100644 index 000000000..f9843a78e --- /dev/null +++ b/docs/src/reference/use-context.md @@ -0,0 +1,3 @@ +--- +title: Use Context 🚧 +--- diff --git a/docs/src/reference/use-debug-value.md b/docs/src/reference/use-debug-value.md new file mode 100644 index 000000000..a2685d9af --- /dev/null +++ b/docs/src/reference/use-debug-value.md @@ -0,0 +1,3 @@ +--- +title: Use Debug Value 🚧 +--- diff --git a/docs/src/reference/use-effect.md b/docs/src/reference/use-effect.md new file mode 100644 index 000000000..9b28b65e7 --- /dev/null +++ b/docs/src/reference/use-effect.md @@ -0,0 +1,3 @@ +--- +title: Use Effect 🚧 +--- diff --git a/docs/src/reference/use-location.md b/docs/src/reference/use-location.md new file mode 100644 index 000000000..0d7ff700f --- /dev/null +++ b/docs/src/reference/use-location.md @@ -0,0 +1,3 @@ +--- +title: Use Location 🚧 +--- diff --git a/docs/src/reference/use-memo.md b/docs/src/reference/use-memo.md new file mode 100644 index 000000000..3daffe622 --- /dev/null +++ b/docs/src/reference/use-memo.md @@ -0,0 +1,3 @@ +--- +title: Use Memo 🚧 +--- diff --git a/docs/src/reference/use-reducer.md b/docs/src/reference/use-reducer.md new file mode 100644 index 000000000..eb732d01a --- /dev/null +++ b/docs/src/reference/use-reducer.md @@ -0,0 +1,3 @@ +--- +title: Use Reducer 🚧 +--- diff --git a/docs/src/reference/use-ref.md b/docs/src/reference/use-ref.md new file mode 100644 index 000000000..fa1f25a02 --- /dev/null +++ b/docs/src/reference/use-ref.md @@ -0,0 +1,3 @@ +--- +title: Use Ref 🚧 +--- diff --git a/docs/src/reference/use-scope.md b/docs/src/reference/use-scope.md new file mode 100644 index 000000000..080875017 --- /dev/null +++ b/docs/src/reference/use-scope.md @@ -0,0 +1,3 @@ +--- +title: Use Scope 🚧 +--- diff --git a/docs/src/reference/use-state.md b/docs/src/reference/use-state.md new file mode 100644 index 000000000..e60b34d64 --- /dev/null +++ b/docs/src/reference/use-state.md @@ -0,0 +1,3 @@ +--- +title: Use State 🚧 +--- diff --git a/docs/src/static/css/extra.css b/docs/src/static/css/extra.css new file mode 100644 index 000000000..b8b8e5351 --- /dev/null +++ b/docs/src/static/css/extra.css @@ -0,0 +1,323 @@ +/* Variable overrides */ +:root { + --code-max-height: 17.25rem; +} + +[data-md-color-scheme="slate"] { + --md-code-hl-color: #ffffcf1c; + --md-hue: 225; + --md-default-bg-color: hsla(var(--md-hue), 15%, 16%, 1); + --md-default-bg-color--light: hsla(var(--md-hue), 15%, 16%, 0.54); + --md-default-bg-color--lighter: hsla(var(--md-hue), 15%, 16%, 0.26); + --md-default-bg-color--lightest: hsla(var(--md-hue), 15%, 16%, 0.07); + --md-code-bg-color: #16181d; + --md-primary-fg-color: #2b3540; + --md-default-fg-color--light: #fff; + --md-typeset-a-color: #00b0f0; + --md-code-hl-comment-color: hsla(var(--md-hue), 75%, 90%, 0.43); + --tabbed-labels-color: rgb(52 58 70); +} + +[data-md-color-scheme="default"] { + --tabbed-labels-color: #7d829e26; +} + +/* General admonition styling */ +/* TODO: Write this in a way that supports the light theme */ +[data-md-color-scheme="slate"] + .md-typeset + details:not(.warning, .failure, .danger, .bug) + > .admonition-title, +[data-md-color-scheme="slate"] + .md-typeset + details:not(.warning, .failure, .danger, .bug) + > summary { + background: var(--md-primary-fg-color) !important; +} + +[data-md-color-scheme="slate"] .md-typeset .admonition, +[data-md-color-scheme="slate"] .md-typeset details { + border-color: transparent !important; +} + +[data-md-color-scheme="slate"] .md-typeset details > .admonition-title:after, +[data-md-color-scheme="slate"] .md-typeset details > summary:after { + color: var(--md-admonition-fg-color) !important; +} + +.md-typeset .admonition.summary, +.md-typeset details.summary { + font-size: 0.7rem; +} + +.md-typeset :is(.admonition, details) { + margin: 0.55em 0; +} + +/* Colors for "summary" admonition */ +[data-md-color-scheme="slate"] .md-typeset .admonition.summary, +[data-md-color-scheme="slate"] .md-typeset details.summary { + background: #353a45; + padding: 0.8rem 1.4rem; + border-radius: 0.8rem; +} + +[data-md-color-scheme="slate"] .md-typeset details.summary > .admonition-title, +[data-md-color-scheme="slate"] .md-typeset details.summary > summary { + background: #353a45 !important; +} + +[data-md-color-scheme="slate"] .md-typeset .summary .admonition-title, +[data-md-color-scheme="slate"] .md-typeset .summary summary { + font-size: 1rem; + background: transparent; + padding-left: 0.6rem; + padding-bottom: 0; +} + +[data-md-color-scheme="slate"] .md-typeset .summary .admonition-title:before { + display: none; +} + +[data-md-color-scheme="slate"] .md-typeset .admonition.summary, +[data-md-color-scheme="slate"] .md-typeset .summary details { + border-color: #ffffff17 !important; +} + +/* Colors for "abstract" admonition */ +[data-md-color-scheme="slate"] .md-typeset .admonition.abstract, +[data-md-color-scheme="slate"] .md-typeset details.abstract { + background: rgb(43 110 98/ 0.2); + padding: 0.8rem 1.4rem; + border-radius: 0.8rem; +} + +[data-md-color-scheme="slate"] .md-typeset .abstract .admonition-title, +[data-md-color-scheme="slate"] .md-typeset .abstract summary { + font-size: 1rem; + background: transparent; + padding-bottom: 0; + color: rgb(68 172 153); +} + +[data-md-color-scheme="slate"] .md-typeset .abstract .admonition-title:before { + font-size: 1.1rem; + background-color: rgb(68 172 153); +} + +/* Move the sidebars to the edges of the page */ +.md-main__inner.md-grid { + margin-left: 0; + margin-right: 0; + max-width: unset; + display: flex; + justify-content: center; +} + +.md-sidebar--primary { + margin-right: auto; +} + +.md-sidebar.md-sidebar--secondary { + margin-left: auto; +} + +.md-content { + max-width: 56rem; +} + +/* Maintain content positioning even if sidebars are disabled */ +@media screen and (min-width: 76.1875em) { + .md-sidebar { + display: block; + } + + .md-sidebar[hidden] { + visibility: hidden; + } +} + +/* Sidebar styling */ +@media screen and (min-width: 76.1875em) { + .md-nav--lifted > .md-nav__list > .md-nav__item--active > .md-nav__link { + text-transform: uppercase; + } + + .md-nav__title[for="__toc"] { + text-transform: uppercase; + margin: 0.5rem; + } + + .md-nav--lifted > .md-nav__list > .md-nav__item--active > .md-nav__link { + color: rgb(133 142 159); + margin: 0.5rem; + } + + .md-nav__item .md-nav__link { + position: relative; + } + + .md-nav__link:is(:focus, :hover):not(.md-nav__link--active) { + color: unset; + } + + .md-nav__item + .md-nav__link:is(:focus, :hover):not(.md-nav__link--active):before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0.2; + z-index: -1; + background-color: grey; + } + + .md-nav__item .md-nav__link--active:before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0.15; + z-index: -1; + background-color: var(--md-typeset-a-color); + } + + .md-nav__link { + padding: 0.5rem 0.5rem 0.5rem 1rem; + margin: 0; + border-radius: 0 10px 10px 0; + font-weight: 600; + } + + .md-sidebar__scrollwrap { + margin: 0; + } + + [dir="ltr"] + .md-nav--lifted + .md-nav[data-md-level="1"] + > .md-nav__list + > .md-nav__item { + padding: 0; + } + + .md-nav__item--nested .md-nav__item .md-nav__item { + padding: 0; + } + + .md-nav__item--nested .md-nav__item .md-nav__item .md-nav__link { + font-weight: 300; + } +} + +/* Table of Contents styling */ +@media screen and (min-width: 60em) { + [data-md-component="sidebar"] .md-nav__title[for="__toc"] { + text-transform: uppercase; + margin: 0.5rem; + margin-left: 0; + } + + [data-md-component="toc"] .md-nav__item .md-nav__link--active { + position: relative; + } + + [data-md-component="toc"] .md-nav__item .md-nav__link--active:before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0.15; + z-index: -1; + background-color: var(--md-typeset-a-color); + } + + [data-md-component="toc"] .md-nav__link { + padding: 0.5rem 0.5rem; + margin: 0; + border-radius: 10px 0 0 10px; + } + [dir="ltr"] .md-sidebar__inner { + padding: 0; + } + + .md-nav__item { + padding: 0; + } +} + +/* Font changes */ +.md-typeset { + font-weight: 300; +} + +.md-typeset h1 { + font-weight: 500; + margin: 0; + font-size: 2.5em; +} + +.md-typeset h2 { + font-weight: 500; +} + +.md-typeset h3 { + font-weight: 600; +} + +/* Intro section styling */ +p.intro { + font-size: 0.9rem; + font-weight: 500; +} + +/* Hide invisible jump selectors */ +h2#overview { + visibility: hidden; + height: 0; + margin: 0; + padding: 0; +} + +/* Code blocks */ +.md-typeset pre > code { + border-radius: 16px; +} + +.md-typeset .highlighttable .linenos { + max-height: var(--code-max-height); + overflow: hidden; +} + +.md-typeset .tabbed-block .highlighttable code { + border-radius: 0; +} + +.md-typeset .tabbed-block { + border-bottom-left-radius: 16px; + border-bottom-right-radius: 16px; + border-bottom: 20px solid var(--tabbed-labels-color); +} + +.js .md-typeset .tabbed-labels { + background: var(--tabbed-labels-color); + border-top-left-radius: 16px; + border-top-right-radius: 16px; +} + +.md-typeset .tabbed-labels > label { + font-weight: 400; + font-size: 0.7rem; + padding-top: 0.55em; + padding-bottom: 0.35em; +} + +.md-typeset pre > code { + max-height: var(--code-max-height); +} diff --git a/docs/src/static/images/s_thinking-in-react_ui.png b/docs/src/static/images/s_thinking-in-react_ui.png new file mode 100644 index 0000000000000000000000000000000000000000..a3249d52647848841221c1355042c19d8852e5e8 GIT binary patch literal 25981 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 L6Wt1&!<GL6a@duA literal 0 HcmV?d00001 diff --git a/docs/src/static/images/s_thinking-in-react_ui_outline.png b/docs/src/static/images/s_thinking-in-react_ui_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..e705738c9334106f0f92fd4e84414f9040bdba99 GIT binary patch literal 83418 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 literal 0 HcmV?d00001 diff --git a/docs/src/static/js/extra.js b/docs/src/static/js/extra.js new file mode 100644 index 000000000..50e2dda30 --- /dev/null +++ b/docs/src/static/js/extra.js @@ -0,0 +1,19 @@ +// Sync scrolling between the code node and the line number node +// Event needs to be a separate function, otherwise the event will be triggered multiple times +let code_with_lineno_scroll_event = function () { + let tr = this.parentNode.parentNode.parentNode.parentNode; + let lineno = tr.querySelector(".linenos"); + lineno.scrollTop = this.scrollTop; +}; + +const observer = new MutationObserver((mutations) => { + let lineno = document.querySelectorAll(".linenos~.code"); + lineno.forEach(function (element) { + let code = element.parentNode.querySelector("code"); + code.addEventListener("scroll", code_with_lineno_scroll_event); + }); +}); + +observer.observe(document.body, { + childList: true, +}); diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 000000000..27155631e --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,178 @@ +--- +nav: + - Home: index.md + - Get Started: + - Quick Start: + - learn/get-started.md + - learn/tutorial-tic-tac-toe.md + - learn/thinking-in-react.md + - Installation: + - learn/start-a-new-react-project.md + - learn/add-react-to-an-existing-project.md + - learn/editor-setup.md + - learn/react-developer-tools.md + - More Tutorials: + - learn/tutorial-react-bootstrap.md + - learn/tutorial-material-ui.md + - Learn React: + - Describing the UI: + - learn/your-first-component.md + - learn/importing-and-exporting-components.md + - learn/writing-markup-with-psx.md + - learn/python-in-psx-with-curly-braces.md + - learn/passing-props-to-a-component.md + - learn/conditional-rendering.md + - learn/rendering-lists.md + - learn/keeping-components-pure.md + - Adding Interactivity: + - learn/responding-to-events.md + - learn/state-a-components-memory.md + - learn/render-and-commit.md + - learn/state-as-a-snapshot.md + - learn/queueing-a-series-of-state-updates.md + - learn/updating-objects-in-state.md + - learn/updating-arrays-in-state.md + - Managing State: + - learn/reacting-to-input-with-state.md + - learn/choosing-the-state-structure.md + - learn/sharing-state-between-components.md + - learn/preserving-and-resetting-state.md + - learn/extracting-state-logic-into-a-reducer.md + - learn/passing-data-deeply-with-context.md + - learn/scaling-up-with-reducer-and-context.md + - Escape Hatches: + - learn/referencing-values-with-refs.md + - learn/manipulating-the-dom-with-refs.md + - learn/synchronizing-with-effects.md + - learn/you-might-not-need-an-effect.md + - learn/lifecycle-of-reactive-effects.md + - learn/separating-events-from-effects.md + - learn/removing-effect-dependencies.md + - learn/reusing-logic-with-custom-hooks.md + - learn/communicate-data-between-server-and-client.md + - learn/convert-between-vdom-and-html.md + - learn/vdom-mutations.md + - learn/creating-vdom-event-handlers.md + - learn/creating-html-tags.md + - learn/creating-backends.md + - learn/manually-register-a-client.md + - Reference: + - Hooks: + - reference/use-state.md + - reference/use-effect.md + - reference/use-context.md + - reference/use-reducer.md + - reference/use-callback.md + - reference/use-memo.md + - reference/use-ref.md + - reference/use-debug-value.md + - reference/use-connection.md + - reference/use-scope.md + - reference/use-location.md + - HTML Tags: + - reference/common-types.md + - reference/common-props.md + - reference/common-events.md + - reference/usage.md + - Backends: + - reference/fastapi.md + - reference/flask.md + - reference/sanic.md + - reference/starlette.md + - reference/tornado.md + - reference/django.md + - reference/jupyter.md + - reference/plotly-dash.md + - reference/protocol-structure.md + - reference/client-api.md + - About ReactPy: + - about/changelog.md + - about/community.md + - about/running-tests.md + - about/code.md + - about/docs.md + +theme: + name: material + custom_dir: docs/overrides + palette: + - media: "(prefers-color-scheme: dark)" + scheme: slate + toggle: + icon: material/white-balance-sunny + name: Switch to light mode + primary: light blue + accent: light blue + - media: "(prefers-color-scheme: light)" + scheme: default + toggle: + icon: material/weather-night + name: Switch to dark mode + primary: black + features: + - navigation.instant + - navigation.tabs + - navigation.top + - content.code.copy + icon: + repo: fontawesome/brands/github + logo: https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg + favicon: https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg + +markdown_extensions: + - toc: + permalink: true + - pymdownx.emoji: + emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg + - pymdownx.tabbed: + alternate_style: true + - pymdownx.highlight: + linenums: true + - pymdownx.superfences + - pymdownx.details + - pymdownx.inlinehilite + - admonition + - attr_list + - md_in_html + +plugins: + - search + - include-markdown + # - git-authors + # - minify: + # minify_html: true + # minify_js: true + # minify_css: true + # cache_safe: true + # - git-revision-date-localized: + # fallback_to_build_date: true + # - spellcheck: + # known_words: dictionary.txt + # allow_unicode: no + # ignore_code: yes + +extra: + generator: false + +extra_javascript: + - static/js/extra.js + +extra_css: + - static/css/extra.css + +watch: + - docs + - mkdocs.yml + - README.md + - CHANGELOG.md + +site_name: ReactPy +site_author: Archmonger +site_description: React for Python developers. +copyright: Copyright © 2023 Reactive Python +repo_url: https://github.com/reactive-python/reactpy +site_url: https://reactive-python.github.io/reactpy +repo_name: reactive-python/reactpy +edit_uri: edit/main/docs/src +docs_dir: docs/src From 8602fffb3d52eff677f591b05b4ba52feb7fd56d Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Wed, 14 Jun 2023 14:34:20 -0700 Subject: [PATCH 02/49] add gh pages publishing workflow --- .github/workflows/publish-docs.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/publish-docs.yml diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml new file mode 100644 index 000000000..78bde0f4a --- /dev/null +++ b/.github/workflows/publish-docs.yml @@ -0,0 +1,17 @@ +name: Publish Docs +on: + push: + branches: + - new-docs +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: actions/setup-python@v4 + with: + python-version: 3.x + - run: pip install -r requirements/build-docs.txt + - run: mkdocs gh-deploy --force From b05c29c653b72704c319031af2b2137f1b606319 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Wed, 14 Jun 2023 14:36:19 -0700 Subject: [PATCH 03/49] fix requirements path --- .github/workflows/publish-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 78bde0f4a..69342c994 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -13,5 +13,5 @@ jobs: - uses: actions/setup-python@v4 with: python-version: 3.x - - run: pip install -r requirements/build-docs.txt + - run: pip install -r docs/requirements.txt - run: mkdocs gh-deploy --force From 3b5341acc8f85fb36730a28401c3750407e62373 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Wed, 14 Jun 2023 14:46:09 -0700 Subject: [PATCH 04/49] update github pages link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0086a306a..b44222bd2 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,4 @@ Temporary branch being used to rewrite ReactPy's documentation. Many of these pages are in progress, and are using the [original ReactJS pages](https://beta.reactjs.org/learn) as placeholders. -See live preview here: https://archmonger.github.io/reactpy-docs/ +See live preview here: https://reactive-python.github.io/reactpy From 2b5dd4d47f9a665f2aa5caa68e0a05b8eb98cb6c Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Wed, 14 Jun 2023 18:02:54 -0700 Subject: [PATCH 05/49] update site description --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 27155631e..bb24bdaba 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -169,7 +169,7 @@ watch: site_name: ReactPy site_author: Archmonger -site_description: React for Python developers. +site_description: It's React, but in Python. copyright: Copyright © 2023 Reactive Python repo_url: https://github.com/reactive-python/reactpy site_url: https://reactive-python.github.io/reactpy From 8cc75aad1880140ffe1b44441988a3be27830236 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Thu, 15 Jun 2023 17:15:32 -0700 Subject: [PATCH 06/49] minor typos --- docs/src/learn/get-started.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/learn/get-started.md b/docs/src/learn/get-started.md index 20e52dd3b..b82d22c16 100644 --- a/docs/src/learn/get-started.md +++ b/docs/src/learn/get-started.md @@ -156,7 +156,7 @@ For example, let's say you have an array of products: {% include "../../examples/python/quick_start/rendering_lists_products.py" %} ``` -Inside your component, use the `map()` function to transform an array of products into an array of `<li>` items: +Inside your component, use list comprehension to transform an array of products into an array of `<li>` items: ```python linenums="0" {% include "../../examples/python/quick_start/rendering_lists_list_items.py" start="# start" %} @@ -202,7 +202,7 @@ Now you can declare a _state variable_ inside your component: {% include "../../examples/python/quick_start/updating_the_screen_use_state_button.py" start="# start" %} ``` -You’ll get two things from `use_state`: the current state (`count`), and the function that lets you update it (`set_sount`). You can give them any names, but the convention is to write `something, set_something = ...`. +You’ll get two things from `use_state`: the current state (`count`), and the function that lets you update it (`set_count`). You can give them any names, but the convention is to write `something, set_something = ...`. The first time the button is displayed, `count` will be `0` because you passed `0` to `use_state()`. When you want to change state, call `set_count()` and pass the new value to it. Clicking this button will increment the counter: @@ -238,7 +238,7 @@ Notice how each button "remembers" its own `count` state and doesn't affect othe Functions starting with `use` are called _Hooks_. `use_state` is a built-in Hook provided by React. You can find other built-in Hooks in the [API reference.](../reference/use-state.md) You can also write your own Hooks by combining the existing ones. -Hooks are more restrictive than other functions. You can only call Hooks _at the top_ of your components (or other Hooks). If you want to use `useState` in a condition or a loop, extract a new component and put it there. +Hooks are more restrictive than other functions. You can only call Hooks _at the top_ of your components (or other Hooks). If you want to use `use_state` in a condition or a loop, extract a new component and put it there. ## Sharing data between components From a05cbe06cf4523dc9cd58412e11b27ea232bd52c Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Thu, 15 Jun 2023 18:08:25 -0700 Subject: [PATCH 07/49] setup for the tutorial section --- .../setup_for_the_tutorial.css | 42 ++++++++++ .../setup_for_the_tutorial.py | 6 ++ docs/src/learn/tutorial-tic-tac-toe.md | 77 ++++++------------- 3 files changed, 70 insertions(+), 55 deletions(-) create mode 100644 docs/examples/css/tutorial-tic-tac-toe/setup_for_the_tutorial.css create mode 100644 docs/examples/python/tutorial-tic-tac-toe/setup_for_the_tutorial.py diff --git a/docs/examples/css/tutorial-tic-tac-toe/setup_for_the_tutorial.css b/docs/examples/css/tutorial-tic-tac-toe/setup_for_the_tutorial.css new file mode 100644 index 000000000..e3efaf92a --- /dev/null +++ b/docs/examples/css/tutorial-tic-tac-toe/setup_for_the_tutorial.css @@ -0,0 +1,42 @@ +* { + box-sizing: border-box; +} + +body { + font-family: sans-serif; + margin: 20px; + padding: 0; +} + +.square { + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; +} + +.board-row:after { + clear: both; + content: ""; + display: table; +} + +.status { + margin-bottom: 10px; +} +.game { + display: flex; + flex-direction: row; +} + +.game-info { + margin-left: 20px; +} diff --git a/docs/examples/python/tutorial-tic-tac-toe/setup_for_the_tutorial.py b/docs/examples/python/tutorial-tic-tac-toe/setup_for_the_tutorial.py new file mode 100644 index 000000000..efca94195 --- /dev/null +++ b/docs/examples/python/tutorial-tic-tac-toe/setup_for_the_tutorial.py @@ -0,0 +1,6 @@ +from reactpy import component, html + +# start +@component +def square(): + return html.button({"class_name":"square"}, "X") diff --git a/docs/src/learn/tutorial-tic-tac-toe.md b/docs/src/learn/tutorial-tic-tac-toe.md index 46ad9325e..5e15036ef 100644 --- a/docs/src/learn/tutorial-tic-tac-toe.md +++ b/docs/src/learn/tutorial-tic-tac-toe.md @@ -10,7 +10,7 @@ You will build a small tic-tac-toe game during this tutorial. This tutorial does </p> -!!! abstract "Note" +!!! note This tutorial is designed for people who prefer to **learn by doing** and want to quickly try making something tangible. If you prefer learning each concept step by step, start with [Describing the UI.](./your-first-component.md) @@ -53,72 +53,39 @@ Once you've played around with the finished tic-tac-toe game, keep scrolling. Yo ## Setup for the tutorial -In the live code editor below, click **Fork** in the top-right corner to open the editor in a new tab using the website CodeSandbox. CodeSandbox lets you write code in your browser and preview how your users will see the app you've created. The new tab should display an empty square and the starter code for this tutorial. +In the code example below, click **Run** to open the editor in a new tab using the website Jupyter. Jupyter lets you write code in your browser and preview how your users will see the app you've created. The new tab should display an empty square and the starter code for this tutorial. -```js -export default function Square() { - return <button className="square">X</button>; -} -``` -```css -* { - box-sizing: border-box; -} +=== "app.py" -body { - font-family: sans-serif; - margin: 20px; - padding: 0; -} + ```python + {% include "../../examples/python/tutorial-tic-tac-toe/setup_for_the_tutorial.py" start="# start" %} + ``` -.square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; -} +=== "stylesheet.css" -.board-row:after { - clear: both; - content: ""; - display: table; -} + ```css + {% include "../../examples/css/tutorial-tic-tac-toe/setup_for_the_tutorial.css" %} + ``` -.status { - margin-bottom: 10px; -} -.game { - display: flex; - flex-direction: row; -} +=== ":material-play: Run" -.game-info { - margin-left: 20px; -} -``` + ```python + # TODO + ``` -<Note> +!!! note -You can also follow this tutorial using your local development environment. To do this, you need to: + You can also follow this tutorial using your local development environment. To do this, you need to: -1. Install [Node.js](https://nodejs.org/en/) -1. In the CodeSandbox tab you opened earlier, press the top-left corner button to open the menu, and then choose **File > Export to ZIP** in that menu to download an archive of the files locally -1. Unzip the archive, then open a terminal and `cd` to the directory you unzipped -1. Install the dependencies with `npm install` -1. Run `npm start` to start a local server and follow the prompts to view the code running in a browser + 1. Install [Python](https://www.python.org/downloads/) + 2. Copy the example above into a file called `app.py` + 3. Install Reactpy for the [backend](../reference/fastapi.md) of your choice. + - For example: `pip install reactpy[fastapi]` + 4. Run `python app.py` to start a local server and follow the prompts to view the code running in a browser -If you get stuck, don't let this stop you! Follow along online instead and try a local setup again later. + If you get stuck, don't let this stop you! Follow along online instead and try a local setup again later. -</Note> ## Overview From 2f5b68a38235617d26fadeb72c9148be521db927 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Thu, 15 Jun 2023 18:08:37 -0700 Subject: [PATCH 08/49] switch from abstract to note admonitiion --- docs/src/static/css/extra.css | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/src/static/css/extra.css b/docs/src/static/css/extra.css index b8b8e5351..a0a4bb74c 100644 --- a/docs/src/static/css/extra.css +++ b/docs/src/static/css/extra.css @@ -84,27 +84,32 @@ border-color: #ffffff17 !important; } -/* Colors for "abstract" admonition */ -[data-md-color-scheme="slate"] .md-typeset .admonition.abstract, -[data-md-color-scheme="slate"] .md-typeset details.abstract { +/* Colors for "note" admonition */ +[data-md-color-scheme="slate"] .md-typeset .admonition.note, +[data-md-color-scheme="slate"] .md-typeset details.note { background: rgb(43 110 98/ 0.2); padding: 0.8rem 1.4rem; border-radius: 0.8rem; } -[data-md-color-scheme="slate"] .md-typeset .abstract .admonition-title, -[data-md-color-scheme="slate"] .md-typeset .abstract summary { +[data-md-color-scheme="slate"] .md-typeset .note .admonition-title, +[data-md-color-scheme="slate"] .md-typeset .note summary { font-size: 1rem; background: transparent; padding-bottom: 0; color: rgb(68 172 153); } -[data-md-color-scheme="slate"] .md-typeset .abstract .admonition-title:before { +[data-md-color-scheme="slate"] .md-typeset .note .admonition-title:before { font-size: 1.1rem; background-color: rgb(68 172 153); } +.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before { + -webkit-mask-image: var(--md-admonition-icon--abstract); + mask-image: var(--md-admonition-icon--abstract) +} + /* Move the sidebars to the edges of the page */ .md-main__inner.md-grid { margin-left: 0; From 308d2169aa25f0062d1d1864d232bd6a123f65f9 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Thu, 15 Jun 2023 18:26:17 -0700 Subject: [PATCH 09/49] reword note --- docs/src/learn/tutorial-tic-tac-toe.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/src/learn/tutorial-tic-tac-toe.md b/docs/src/learn/tutorial-tic-tac-toe.md index 5e15036ef..3ae8e7901 100644 --- a/docs/src/learn/tutorial-tic-tac-toe.md +++ b/docs/src/learn/tutorial-tic-tac-toe.md @@ -80,8 +80,7 @@ In the code example below, click **Run** to open the editor in a new tab using t 1. Install [Python](https://www.python.org/downloads/) 2. Copy the example above into a file called `app.py` - 3. Install Reactpy for the [backend](../reference/fastapi.md) of your choice. - - For example: `pip install reactpy[fastapi]` + 3. Install ReactPy for your [backend](../reference/fastapi.md), for example `pip install reactpy[fastapi]` 4. Run `python app.py` to start a local server and follow the prompts to view the code running in a browser If you get stuck, don't let this stop you! Follow along online instead and try a local setup again later. From 838671b191904a37c8a1976e0e3c47b832d8f0ec Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sat, 17 Jun 2023 23:15:45 -0700 Subject: [PATCH 10/49] cell-var-from-loop --- docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py | 8 ++++++-- docs/src/learn/tutorial-tic-tac-toe.md | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py b/docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py index 9a5fc40cc..8a05d89c4 100644 --- a/docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py +++ b/docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py @@ -13,8 +13,12 @@ def square(value, on_square_click): @component def board(x_is_next, squares, on_play): + def handle_click(i): - def event(_event): + def handle_click_event(_event): + """Due to a quirk of Python, if your event handler needs args other than + `event`, you will need to create a wrapper function as seen above. + Ref: https://pylint.readthedocs.io/en/stable/user_guide/messages/warning/cell-var-from-loop.html""" if calculate_winner(squares) or squares[i]: return @@ -22,7 +26,7 @@ def event(_event): next_squares[i] = "X" if x_is_next else "O" on_play(next_squares) - return event + return handle_click_event winner = calculate_winner(squares) status = ( diff --git a/docs/src/learn/tutorial-tic-tac-toe.md b/docs/src/learn/tutorial-tic-tac-toe.md index 3ae8e7901..98b6497f5 100644 --- a/docs/src/learn/tutorial-tic-tac-toe.md +++ b/docs/src/learn/tutorial-tic-tac-toe.md @@ -81,7 +81,8 @@ In the code example below, click **Run** to open the editor in a new tab using t 1. Install [Python](https://www.python.org/downloads/) 2. Copy the example above into a file called `app.py` 3. Install ReactPy for your [backend](../reference/fastapi.md), for example `pip install reactpy[fastapi]` - 4. Run `python app.py` to start a local server and follow the prompts to view the code running in a browser + 4. Add `reactpy.run(...)` to the end of your Python file + 5. Run `python app.py` to start a local server and follow the prompts to view the code running in a browser If you get stuck, don't let this stop you! Follow along online instead and try a local setup again later. From 58bac05417eff3d870717e26230a18319a0fd36d Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sun, 18 Jun 2023 21:33:15 -0700 Subject: [PATCH 11/49] update readme --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b44222bd2..790c60da8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,18 @@ Temporary branch being used to rewrite ReactPy's documentation. -Many of these pages are in progress, and are using the [original ReactJS pages](https://beta.reactjs.org/learn) as placeholders. +Many of these pages are in progress, and are using the [original ReactJS docs](https://react.dev/learn) as placeholders. See live preview here: https://reactive-python.github.io/reactpy + +In order to set up an environment to develop these docs... + +1. Install [Python](https://www.python.org/downloads/) 3.9 or higher +2. Fork and clone this repository +3. _Optional_: Create a Python virtual environment with the following command: `python3 -m venv venv` +4. _Optional_: Activate the virtual environment (this method will vary based on operating system) +5. Install the dependencies with the following command: `pip install -r docs/requirements.txt` +6. Run the following command: `mkdocs serve` +7. Follow the on-screen prompts to view the documentation in your browser +8. You can now edit the markdown files located within `docs/src/` and see the changes in real time + +Feel free to PR this branch with any changes you make to the documentation. If you have any questions, feel free to ask in the [Discord server](https://discord.gg/uNb5P4hA9X). From ad10c29c42b4f39cfd0553358b0790d9f4fe9a04 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sun, 18 Jun 2023 21:33:24 -0700 Subject: [PATCH 12/49] add padding to sidebar nav --- docs/src/static/css/extra.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/src/static/css/extra.css b/docs/src/static/css/extra.css index a0a4bb74c..58c9496c0 100644 --- a/docs/src/static/css/extra.css +++ b/docs/src/static/css/extra.css @@ -217,6 +217,11 @@ .md-nav__item--nested .md-nav__item .md-nav__item .md-nav__link { font-weight: 300; } + + .md-nav__item--nested .md-nav__item .md-nav__item .md-nav__link { + font-weight: 400; + padding-left: 1.25rem; + } } /* Table of Contents styling */ From 73dadc9a685ae963a7b49327dc73dcfc0f618ed8 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sun, 18 Jun 2023 21:36:31 -0700 Subject: [PATCH 13/49] Inspecting the starter code --- docs/src/learn/get-started.md | 6 +++--- docs/src/learn/tutorial-tic-tac-toe.md | 28 +++++++++++++------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/src/learn/get-started.md b/docs/src/learn/get-started.md index b82d22c16..0e501bd96 100644 --- a/docs/src/learn/get-started.md +++ b/docs/src/learn/get-started.md @@ -112,7 +112,7 @@ You can fetch data from a variety of sources and directly embed it into your com {% include "../../examples/python/quick_start/displaying_data.py" end="# end" %} ``` -=== "stylesheet.css" +=== "styles.css" ```css {% include "../../examples/css/quick_start/displaying_data.css" %} @@ -220,7 +220,7 @@ If you render the same component multiple times, each will get its own state. Cl {% include "../../examples/python/quick_start/updating_the_screen.py" end="# end" %} ``` -=== "stylesheet.css" +=== "styles.css" ```css {% include "../../examples/css/quick_start/updating_the_screen.css" %} @@ -284,7 +284,7 @@ When you click the button, the `on_click` handler fires. Each button's `on_click {% include "../../examples/python/quick_start/sharing_data_between_components.py" end="# end" %} ``` -=== "stylesheet.css" +=== "styles.css" ```css {% include "../../examples/css/quick_start/sharing_data_between_components.css" %} diff --git a/docs/src/learn/tutorial-tic-tac-toe.md b/docs/src/learn/tutorial-tic-tac-toe.md index 98b6497f5..49cc29ec1 100644 --- a/docs/src/learn/tutorial-tic-tac-toe.md +++ b/docs/src/learn/tutorial-tic-tac-toe.md @@ -33,7 +33,7 @@ You can see what it will look like when you're finished here: {% include "../../examples/python/tutorial-tic-tac-toe/tic_tac_toe.py" end="# end" %} ``` -=== "stylesheet.css" +=== "styles.css" ```css {% include "../../examples/css/tutorial-tic-tac-toe/tic_tac_toe.css" %} @@ -62,7 +62,7 @@ In the code example below, click **Run** to open the editor in a new tab using t {% include "../../examples/python/tutorial-tic-tac-toe/setup_for_the_tutorial.py" start="# start" %} ``` -=== "stylesheet.css" +=== "styles.css" ```css {% include "../../examples/css/tutorial-tic-tac-toe/setup_for_the_tutorial.css" %} @@ -93,25 +93,25 @@ Now that you're set up, let's get an overview of React! ### Inspecting the starter code -In CodeSandbox you'll see three main sections: +In Jupyter you'll see three main sections: -![CodeSandbox with starter code]() +<!-- TODO: Add screenshot --> +![TODO: screenshot of Jupyter]() -1. The _Files_ section with a list of files like `App.js`, `index.js`, `styles.css` and a folder called `public` -1. The _code editor_ where you'll see the source code of your selected file -1. The _browser_ section where you'll see how the code you've written will be displayed +1. The _Files_ section with a list of files like `tic-tac-toe.ipynb` +2. The _interactive code notebook_ where you'll see the source code for each step +3. The _run button_ located on top of the notebook in the command strip -The `App.js` file should be selected in the _Files_ section. The contents of that file in the _code editor_ should be: +The `tic-tac-toe.ipynb` file should be selected in the _Files_ section. Click on the first code box, where the contents of that _code editor_ should be: -```jsx -export default function Square() { - return <button className="square">X</button>; -} +```python linenums="0" +{% include "../../examples/python/tutorial-tic-tac-toe/setup_for_the_tutorial.py" start="# start" %} ``` -The _browser_ section should be displaying a square with a X in it like this: +After clicking the _run button_ the notebook should be displaying a square with a X in it like this: -![x-filled square]() +<!-- TODO: Add screenshot --> +![TODO: x-filled square]() Now let's have a look at the files in the starter code. From f28a6ab675a2102c010148aa46e5958ccf7cbf50 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sun, 18 Jun 2023 21:38:02 -0700 Subject: [PATCH 14/49] Add disclaimer about unfinished pages --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 790c60da8..db3e94484 100644 --- a/README.md +++ b/README.md @@ -15,4 +15,6 @@ In order to set up an environment to develop these docs... 7. Follow the on-screen prompts to view the documentation in your browser 8. You can now edit the markdown files located within `docs/src/` and see the changes in real time +All unfinished tabs are marked via a construction symbol ( 🚧 ). + Feel free to PR this branch with any changes you make to the documentation. If you have any questions, feel free to ask in the [Discord server](https://discord.gg/uNb5P4hA9X). From 60d54e062c2112a5b9647b762a17034221d52db1 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sun, 18 Jun 2023 21:59:09 -0700 Subject: [PATCH 15/49] rename tic-tac-toe folder --- .../setup_for_the_tutorial.css | 0 .../tic_tac_toe.css | 0 .../setup_for_the_tutorial.py | 0 .../tic_tac_toe.py | 0 docs/src/learn/tutorial-tic-tac-toe.md | 10 +++++----- 5 files changed, 5 insertions(+), 5 deletions(-) rename docs/examples/css/{tutorial-tic-tac-toe => tutorial_tic_tac_toe}/setup_for_the_tutorial.css (100%) rename docs/examples/css/{tutorial-tic-tac-toe => tutorial_tic_tac_toe}/tic_tac_toe.css (100%) rename docs/examples/python/{tutorial-tic-tac-toe => tutorial_tic_tac_toe}/setup_for_the_tutorial.py (100%) rename docs/examples/python/{tutorial-tic-tac-toe => tutorial_tic_tac_toe}/tic_tac_toe.py (100%) diff --git a/docs/examples/css/tutorial-tic-tac-toe/setup_for_the_tutorial.css b/docs/examples/css/tutorial_tic_tac_toe/setup_for_the_tutorial.css similarity index 100% rename from docs/examples/css/tutorial-tic-tac-toe/setup_for_the_tutorial.css rename to docs/examples/css/tutorial_tic_tac_toe/setup_for_the_tutorial.css diff --git a/docs/examples/css/tutorial-tic-tac-toe/tic_tac_toe.css b/docs/examples/css/tutorial_tic_tac_toe/tic_tac_toe.css similarity index 100% rename from docs/examples/css/tutorial-tic-tac-toe/tic_tac_toe.css rename to docs/examples/css/tutorial_tic_tac_toe/tic_tac_toe.css diff --git a/docs/examples/python/tutorial-tic-tac-toe/setup_for_the_tutorial.py b/docs/examples/python/tutorial_tic_tac_toe/setup_for_the_tutorial.py similarity index 100% rename from docs/examples/python/tutorial-tic-tac-toe/setup_for_the_tutorial.py rename to docs/examples/python/tutorial_tic_tac_toe/setup_for_the_tutorial.py diff --git a/docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py b/docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py similarity index 100% rename from docs/examples/python/tutorial-tic-tac-toe/tic_tac_toe.py rename to docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py diff --git a/docs/src/learn/tutorial-tic-tac-toe.md b/docs/src/learn/tutorial-tic-tac-toe.md index 49cc29ec1..8b696a61c 100644 --- a/docs/src/learn/tutorial-tic-tac-toe.md +++ b/docs/src/learn/tutorial-tic-tac-toe.md @@ -30,13 +30,13 @@ You can see what it will look like when you're finished here: === "app.py" ```python - {% include "../../examples/python/tutorial-tic-tac-toe/tic_tac_toe.py" end="# end" %} + {% include "../../examples/python/tutorial_tic_tac_toe/tic_tac_toe.py" end="# end" %} ``` === "styles.css" ```css - {% include "../../examples/css/tutorial-tic-tac-toe/tic_tac_toe.css" %} + {% include "../../examples/css/tutorial_tic_tac_toe/tic_tac_toe.css" %} ``` === ":material-play: Run" @@ -59,13 +59,13 @@ In the code example below, click **Run** to open the editor in a new tab using t === "app.py" ```python - {% include "../../examples/python/tutorial-tic-tac-toe/setup_for_the_tutorial.py" start="# start" %} + {% include "../../examples/python/tutorial_tic_tac_toe/setup_for_the_tutorial.py" start="# start" %} ``` === "styles.css" ```css - {% include "../../examples/css/tutorial-tic-tac-toe/setup_for_the_tutorial.css" %} + {% include "../../examples/css/tutorial_tic_tac_toe/setup_for_the_tutorial.css" %} ``` === ":material-play: Run" @@ -105,7 +105,7 @@ In Jupyter you'll see three main sections: The `tic-tac-toe.ipynb` file should be selected in the _Files_ section. Click on the first code box, where the contents of that _code editor_ should be: ```python linenums="0" -{% include "../../examples/python/tutorial-tic-tac-toe/setup_for_the_tutorial.py" start="# start" %} +{% include "../../examples/python/tutorial_tic_tac_toe/setup_for_the_tutorial.py" start="# start" %} ``` After clicking the _run button_ the notebook should be displaying a square with a X in it like this: From 0a347ddc5e3310bae98c3828d4cb6a6506e7cf17 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sun, 18 Jun 2023 23:03:29 -0700 Subject: [PATCH 16/49] add styling utils --- docs/examples/python/__init__.py | 0 docs/examples/python/quick_start/__init__.py | 0 .../python/quick_start/displaying_data.py | 7 ++++++- .../sharing_data_between_components.py | 7 ++++++- .../python/quick_start/updating_the_screen.py | 7 ++++++- .../python/tutorial_tic_tac_toe/tic_tac_toe.py | 7 ++++++- src/py/reactpy/reactpy/utils.py | 15 +++++++++++++++ 7 files changed, 39 insertions(+), 4 deletions(-) delete mode 100644 docs/examples/python/__init__.py delete mode 100644 docs/examples/python/quick_start/__init__.py diff --git a/docs/examples/python/__init__.py b/docs/examples/python/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/examples/python/quick_start/__init__.py b/docs/examples/python/quick_start/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/examples/python/quick_start/displaying_data.py b/docs/examples/python/quick_start/displaying_data.py index d4caa09c9..3534fe29d 100644 --- a/docs/examples/python/quick_start/displaying_data.py +++ b/docs/examples/python/quick_start/displaying_data.py @@ -28,5 +28,10 @@ def profile(): # end if __name__ == "__main__": from reactpy import run + from reactpy.utils import _read_docs_css - run(profile) + @component + def styled_app(): + return html._(html.style(_read_docs_css()), profile()) + + run(styled_app) diff --git a/docs/examples/python/quick_start/sharing_data_between_components.py b/docs/examples/python/quick_start/sharing_data_between_components.py index 7c4d9904d..b256e6ecc 100644 --- a/docs/examples/python/quick_start/sharing_data_between_components.py +++ b/docs/examples/python/quick_start/sharing_data_between_components.py @@ -23,5 +23,10 @@ def my_button(count, on_click): # end if __name__ == "__main__": from reactpy import run + from reactpy.utils import _read_docs_css - run(my_app) + @component + def styled_app(): + return html._(html.style(_read_docs_css()), my_app()) + + run(styled_app) diff --git a/docs/examples/python/quick_start/updating_the_screen.py b/docs/examples/python/quick_start/updating_the_screen.py index 906a0718f..1fc6cebcd 100644 --- a/docs/examples/python/quick_start/updating_the_screen.py +++ b/docs/examples/python/quick_start/updating_the_screen.py @@ -23,5 +23,10 @@ def handle_click(event): # end if __name__ == "__main__": from reactpy import run + from reactpy.utils import _read_docs_css - run(my_app) + @component + def styled_app(): + return html._(html.style(_read_docs_css()), my_app()) + + run(styled_app) diff --git a/docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py b/docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py index 8a05d89c4..29781a321 100644 --- a/docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py +++ b/docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py @@ -117,5 +117,10 @@ def calculate_winner(squares): # end if __name__ == "__main__": from reactpy import run + from reactpy.utils import _read_docs_css - run(game) + @component + def styled_app(): + return html._(html.style(_read_docs_css()), game()) + + run(styled_app) diff --git a/src/py/reactpy/reactpy/utils.py b/src/py/reactpy/reactpy/utils.py index e5e06d98d..0bfc604bf 100644 --- a/src/py/reactpy/reactpy/utils.py +++ b/src/py/reactpy/reactpy/utils.py @@ -1,5 +1,7 @@ from __future__ import annotations +import inspect +import os import re from collections.abc import Iterable from itertools import chain @@ -305,3 +307,16 @@ def _vdom_attr_to_html_str(key: str, value: Any) -> tuple[str, str]: # Pattern for delimitting camelCase names (e.g. camelCase to camel-case) _CAMEL_CASE_SUB_PATTERN = re.compile(r"(?<!^)(?=[A-Z])") + + +def _read_docs_css(): + """Reads a CSS file in the docs with the same relative path.""" + py_path = os.path.abspath((inspect.stack()[1])[1]) + css_path = ( + py_path.replace("/python/", "/css/") + .replace("\\python\\", "\\css\\") + .replace(".py", ".css") + ) + + with open(css_path, encoding="UTF-8") as css_file: + return css_file.read() From acf3f5cef5977afeb7c09bdf863409a15dab2408 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sun, 18 Jun 2023 23:13:15 -0700 Subject: [PATCH 17/49] build a static version in React --- .../build_a_static_version_in_react.css | 15 ++ .../start_with_the_mockup.json | 38 +++++ .../build_a_static_version_in_react.py | 73 +++++++++ docs/src/learn/thinking-in-react.md | 155 +++--------------- docs/src/static/css/extra.css | 28 +++- 5 files changed, 170 insertions(+), 139 deletions(-) create mode 100644 docs/examples/css/thinking_in_react/build_a_static_version_in_react.css create mode 100644 docs/examples/json/thinking_in_react/start_with_the_mockup.json create mode 100644 docs/examples/python/thinking_in_react/build_a_static_version_in_react.py diff --git a/docs/examples/css/thinking_in_react/build_a_static_version_in_react.css b/docs/examples/css/thinking_in_react/build_a_static_version_in_react.css new file mode 100644 index 000000000..5b8624389 --- /dev/null +++ b/docs/examples/css/thinking_in_react/build_a_static_version_in_react.css @@ -0,0 +1,15 @@ +body { + padding: 5px; +} +label { + display: block; + margin-top: 5px; + margin-bottom: 5px; +} +th { + padding-top: 10px; +} +td { + padding: 2px; + padding-right: 40px; +} diff --git a/docs/examples/json/thinking_in_react/start_with_the_mockup.json b/docs/examples/json/thinking_in_react/start_with_the_mockup.json new file mode 100644 index 000000000..f49a528b0 --- /dev/null +++ b/docs/examples/json/thinking_in_react/start_with_the_mockup.json @@ -0,0 +1,38 @@ +[ + { + "category": "Fruits", + "price": "$1", + "stocked": true, + "name": "Apple" + }, + { + "category": "Fruits", + "price": "$1", + "stocked": true, + "name": "Dragonfruit" + }, + { + "category": "Fruits", + "price": "$2", + "stocked": false, + "name": "Passionfruit" + }, + { + "category": "Vegetables", + "price": "$2", + "stocked": true, + "name": "Spinach" + }, + { + "category": "Vegetables", + "price": "$4", + "stocked": false, + "name": "Pumpkin" + }, + { + "category": "Vegetables", + "price": "$1", + "stocked": true, + "name": "Peas" + } +] diff --git a/docs/examples/python/thinking_in_react/build_a_static_version_in_react.py b/docs/examples/python/thinking_in_react/build_a_static_version_in_react.py new file mode 100644 index 000000000..c8c05b64e --- /dev/null +++ b/docs/examples/python/thinking_in_react/build_a_static_version_in_react.py @@ -0,0 +1,73 @@ +from reactpy import component, html + + +# start +@component +def product_category_row(category): + return html.tr(html.th({"colSpan": "2"}, category)) + + +@component +def product_row(product): + if product["stocked"]: + name = product["name"] + else: + name = html.span({"style": {"color": "red"}}, product["name"]) + return html.tr(html.td(name), html.td(product["price"])) + + +@component +def product_table(products): + rows = [] + last_category = None + for product in products: + if product["category"] != last_category: + rows.append( + product_category_row(product["category"], key=product["category"]) + ) + rows.append(product_row(product, key=product["name"])) + last_category = product["category"] + + return html.table( + html.thead(html.tr(html.th("Name"), html.th("Price"))), html.tbody(rows) + ) + + +@component +def search_bar(): + return html.form( + html.input({"type": "text", "placeholder": "Search..."}), + html.label(html.input({"type": "checkbox"}), "Only show products in stock"), + ) + + +@component +def filterable_product_table(products): + return html.div(search_bar(), product_table(products)) + + +PRODUCTS = [ + {"category": "Fruits", "price": "$1", "stocked": True, "name": "Apple"}, + {"category": "Fruits", "price": "$1", "stocked": True, "name": "Dragonfruit"}, + {"category": "Fruits", "price": "$2", "stocked": False, "name": "Passionfruit"}, + {"category": "Vegetables", "price": "$2", "stocked": True, "name": "Spinach"}, + {"category": "Vegetables", "price": "$4", "stocked": False, "name": "Pumpkin"}, + {"category": "Vegetables", "price": "$1", "stocked": True, "name": "Peas"}, +] + + +@component +def app(): + return filterable_product_table(PRODUCTS) + + +# end +if __name__ == "__main__": + from reactpy import run + from reactpy.utils import _read_docs_css + + @component + def styled_app(): + return html._(html.style(_read_docs_css()), app()) + + run(styled_app) diff --git a/docs/src/learn/thinking-in-react.md b/docs/src/learn/thinking-in-react.md index 1e99ec5cc..d348e8c87 100644 --- a/docs/src/learn/thinking-in-react.md +++ b/docs/src/learn/thinking-in-react.md @@ -16,35 +16,8 @@ Imagine that you already have a JSON API and a mockup from a designer. The JSON API returns some data that looks like this: -```json -[ - { "category": "Fruits", "price": "$1", "stocked": true, "name": "Apple" }, - { - "category": "Fruits", - "price": "$1", - "stocked": true, - "name": "Dragonfruit" - }, - { - "category": "Fruits", - "price": "$2", - "stocked": false, - "name": "Passionfruit" - }, - { - "category": "Vegetables", - "price": "$2", - "stocked": true, - "name": "Spinach" - }, - { - "category": "Vegetables", - "price": "$4", - "stocked": false, - "name": "Pumpkin" - }, - { "category": "Vegetables", "price": "$1", "stocked": true, "name": "Peas" } -] +```json linenums="0" +{% include "../../examples/json/thinking_in_react/start_with_the_mockup.json" %} ``` The mockup looks like this: @@ -91,125 +64,35 @@ Now that you've identified the components in the mockup, arrange them into a hie Now that you have your component hierarchy, it's time to implement your app. The most straightforward approach is to build a version that renders the UI from your data model without adding any interactivity... yet! It's often easier to build the static version first and add interactivity later. Building a static version requires a lot of typing and no thinking, but adding interactivity requires a lot of thinking and not a lot of typing. -To build a static version of your app that renders your data model, you'll want to build [components](your-first-component.md) that reuse other components and pass data using [props.](/learn/passing-props-to-a-component) Props are a way of passing data from parent to child. (If you're familiar with the concept of [state](/learn/state-a-components-memory), don't use state at all to build this static version. State is reserved only for interactivity, that is, data that changes over time. Since this is a static version of the app, you don't need it.) +To build a static version of your app that renders your data model, you'll want to build [components](your-first-component.md) that reuse other components and pass data using [props.](../learn/passing-props-to-a-component.md) Props are a way of passing data from parent to child. (If you're familiar with the concept of [state](../learn/state-a-components-memory.md), don't use state at all to build this static version. State is reserved only for interactivity, that is, data that changes over time. Since this is a static version of the app, you don't need it.) You can either build "top down" by starting with building the components higher up in the hierarchy (like `filterable_product_table`) or "bottom up" by working from components lower down (like `product_row`). In simpler examples, it’s usually easier to go top-down, and on larger projects, it’s easier to go bottom-up. -```jsx -function product_category_row({ category }) { - return ( - <tr> - <th colSpan="2">{category}</th> - </tr> - ); -} +=== "app.py" -function product_row({ product }) { - const name = product.stocked ? ( - product.name - ) : ( - <span style={{ color: "red" }}>{product.name}</span> - ); + ```python + {% include "../../examples/python/thinking_in_react/build_a_static_version_in_react.py" start="# start" end="# end" %} + ``` - return ( - <tr> - <td>{name}</td> - <td>{product.price}</td> - </tr> - ); -} +=== "styles.css" -function product_table({ products }) { - const rows = []; - let lastCategory = null; + ```css + {% include "../../examples/css/thinking_in_react/build_a_static_version_in_react.css" %} + ``` - products.forEach((product) => { - if (product.category !== lastCategory) { - rows.push( - <product_category_row - category={product.category} - key={product.category} - /> - ); - } - rows.push(<product_row product={product} key={product.name} />); - lastCategory = product.category; - }); - - return ( - <table> - <thead> - <tr> - <th>Name</th> - <th>Price</th> - </tr> - </thead> - <tbody>{rows}</tbody> - </table> - ); -} - -function search_bar() { - return ( - <form> - <input type="text" placeholder="Search..." /> - <label> - <input type="checkbox" /> Only show products in stock - </label> - </form> - ); -} - -function filterable_product_table({ products }) { - return ( - <div> - <search_bar /> - <product_table products={products} /> - </div> - ); -} - -const PRODUCTS = [ - { category: "Fruits", price: "$1", stocked: true, name: "Apple" }, - { category: "Fruits", price: "$1", stocked: true, name: "Dragonfruit" }, - { category: "Fruits", price: "$2", stocked: false, name: "Passionfruit" }, - { category: "Vegetables", price: "$2", stocked: true, name: "Spinach" }, - { category: "Vegetables", price: "$4", stocked: false, name: "Pumpkin" }, - { category: "Vegetables", price: "$1", stocked: true, name: "Peas" }, -]; - -export default function App() { - return <filterable_product_table products={PRODUCTS} />; -} -``` - -```css -body { - padding: 5px; -} -label { - display: block; - margin-top: 5px; - margin-bottom: 5px; -} -th { - padding-top: 10px; -} -td { - padding: 2px; - padding-right: 40px; -} -``` +=== ":material-play: Run" -(If this code looks intimidating, go through the [Quick Start](/learn/) first!) + ```python + # TODO + ``` -After building your components, you'll have a library of reusable components that render your data model. Because this is a static app, the components will only return JSX. The component at the top of the hierarchy (`filterable_product_table`) will take your data model as a prop. This is called _one-way data flow_ because the data flows down from the top-level component to the ones at the bottom of the tree. +(If this code looks intimidating, go through the [Quick Start](../learn/get-started.md) first!) -<Pitfall> +After building your components, you'll have a library of reusable components that render your data model. Because this is a static app, the components will only return non-interactive HTML. The component at the top of the hierarchy (`filterable_product_table`) will take your data model as a prop. This is called _one-way data flow_ because the data flows down from the top-level component to the ones at the bottom of the tree. -At this point, you should not be using any state values. That’s for the next step! +!!! warning "Pitfall" -</Pitfall> + At this point, you should not be using any state values. That’s for the next step! ## Step 3: Find the minimal but complete representation of UI state diff --git a/docs/src/static/css/extra.css b/docs/src/static/css/extra.css index 58c9496c0..2d8acff73 100644 --- a/docs/src/static/css/extra.css +++ b/docs/src/static/css/extra.css @@ -105,9 +105,31 @@ background-color: rgb(68 172 153); } -.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before { - -webkit-mask-image: var(--md-admonition-icon--abstract); - mask-image: var(--md-admonition-icon--abstract) +.md-typeset .note > .admonition-title:before, +.md-typeset .note > summary:before { + -webkit-mask-image: var(--md-admonition-icon--abstract); + mask-image: var(--md-admonition-icon--abstract); +} + +/* Colors for "warning" admonition */ +[data-md-color-scheme="slate"] .md-typeset .admonition.warning, +[data-md-color-scheme="slate"] .md-typeset details.warning { + background: rgb(182 87 0 / 0.2); + padding: 0.8rem 1.4rem; + border-radius: 0.8rem; +} + +[data-md-color-scheme="slate"] .md-typeset .warning .admonition-title, +[data-md-color-scheme="slate"] .md-typeset .warning summary { + font-size: 1rem; + background: transparent; + padding-bottom: 0; + color: rgb(219 125 39); +} + +[data-md-color-scheme="slate"] .md-typeset .warning .admonition-title:before { + font-size: 1.1rem; + background-color: rgb(219 125 39); } /* Move the sidebars to the edges of the page */ From e4be2995d9afbc26e83365637a9c66b782ec0068 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Mon, 19 Jun 2023 00:01:24 -0700 Subject: [PATCH 18/49] Find the minimal but complete representation of UI state --- docs/src/learn/thinking-in-react.md | 28 ++++++------ docs/src/static/css/extra.css | 71 ++++++++++++----------------- 2 files changed, 43 insertions(+), 56 deletions(-) diff --git a/docs/src/learn/thinking-in-react.md b/docs/src/learn/thinking-in-react.md index d348e8c87..770a45944 100644 --- a/docs/src/learn/thinking-in-react.md +++ b/docs/src/learn/thinking-in-react.md @@ -70,15 +70,15 @@ You can either build "top down" by starting with building the components higher === "app.py" - ```python - {% include "../../examples/python/thinking_in_react/build_a_static_version_in_react.py" start="# start" end="# end" %} - ``` + ```python + {% include "../../examples/python/thinking_in_react/build_a_static_version_in_react.py" start="# start" end="# end" %} + ``` === "styles.css" - ```css - {% include "../../examples/css/thinking_in_react/build_a_static_version_in_react.css" %} - ``` + ```css + {% include "../../examples/css/thinking_in_react/build_a_static_version_in_react.css" %} + ``` === ":material-play: Run" @@ -92,7 +92,7 @@ After building your components, you'll have a library of reusable components tha !!! warning "Pitfall" - At this point, you should not be using any state values. That’s for the next step! + At this point, you should not be using any state values. That’s for the next step! ## Step 3: Find the minimal but complete representation of UI state @@ -124,18 +124,16 @@ Let's go through them one by one again: This means only the search text and the value of the checkbox are state! Nicely done! -<DeepDive> - -#### Props vs State +!!! info "Deep Dive" -There are two types of "model" data in React: props and state. The two are very different: + <font size="4">**Props vs State**</font> -- [**Props** are like arguments you pass](/learn/passing-props-to-a-component) to a function. They let a parent component pass data to a child component and customize its appearance. For example, a `Form` can pass a `color` prop to a `Button`. -- [**State** is like a component’s memory.](/learn/state-a-components-memory) It lets a component keep track of some information and change it in response to interactions. For example, a `Button` might keep track of `isHovered` state. + There are two types of "model" data in React: props and state. The two are very different: -Props and state are different, but they work together. A parent component will often keep some information in state (so that it can change it), and _pass it down_ to child components as their props. It's okay if the difference still feels fuzzy on the first read. It takes a bit of practice for it to really stick! + - [**Props** are like arguments you pass](../learn/passing-props-to-a-component.md) to a function. They let a parent component pass data to a child component and customize its appearance. For example, a `html.form` can pass a `color` prop to a `html.button`. + - [**State** is like a component’s memory.](../learn/state-a-components-memory.md) It lets a component keep track of some information and change it in response to interactions. For example, a `html.button` might keep track of `is_hovered` state. -</DeepDive> + Props and state are different, but they work together. A parent component will often keep some information in state (so that it can change it), and _pass it down_ to child components as their props. It's okay if the difference still feels fuzzy on the first read. It takes a bit of practice for it to really stick! ## Step 4: Identify where your state should live diff --git a/docs/src/static/css/extra.css b/docs/src/static/css/extra.css index 2d8acff73..b049a15cd 100644 --- a/docs/src/static/css/extra.css +++ b/docs/src/static/css/extra.css @@ -24,51 +24,26 @@ /* General admonition styling */ /* TODO: Write this in a way that supports the light theme */ -[data-md-color-scheme="slate"] - .md-typeset - details:not(.warning, .failure, .danger, .bug) - > .admonition-title, -[data-md-color-scheme="slate"] - .md-typeset - details:not(.warning, .failure, .danger, .bug) - > summary { - background: var(--md-primary-fg-color) !important; -} - -[data-md-color-scheme="slate"] .md-typeset .admonition, -[data-md-color-scheme="slate"] .md-typeset details { +[data-md-color-scheme="slate"] .md-typeset .admonition { border-color: transparent !important; } -[data-md-color-scheme="slate"] .md-typeset details > .admonition-title:after, -[data-md-color-scheme="slate"] .md-typeset details > summary:after { - color: var(--md-admonition-fg-color) !important; +.md-typeset :is(.admonition, details) { + margin: 0.55em 0; } -.md-typeset .admonition.summary, -.md-typeset details.summary { +.md-typeset .admonition { font-size: 0.7rem; } -.md-typeset :is(.admonition, details) { - margin: 0.55em 0; -} - /* Colors for "summary" admonition */ -[data-md-color-scheme="slate"] .md-typeset .admonition.summary, -[data-md-color-scheme="slate"] .md-typeset details.summary { +[data-md-color-scheme="slate"] .md-typeset .admonition.summary { background: #353a45; padding: 0.8rem 1.4rem; border-radius: 0.8rem; } -[data-md-color-scheme="slate"] .md-typeset details.summary > .admonition-title, -[data-md-color-scheme="slate"] .md-typeset details.summary > summary { - background: #353a45 !important; -} - -[data-md-color-scheme="slate"] .md-typeset .summary .admonition-title, -[data-md-color-scheme="slate"] .md-typeset .summary summary { +[data-md-color-scheme="slate"] .md-typeset .summary .admonition-title { font-size: 1rem; background: transparent; padding-left: 0.6rem; @@ -79,21 +54,18 @@ display: none; } -[data-md-color-scheme="slate"] .md-typeset .admonition.summary, -[data-md-color-scheme="slate"] .md-typeset .summary details { +[data-md-color-scheme="slate"] .md-typeset .admonition.summary { border-color: #ffffff17 !important; } /* Colors for "note" admonition */ -[data-md-color-scheme="slate"] .md-typeset .admonition.note, -[data-md-color-scheme="slate"] .md-typeset details.note { +[data-md-color-scheme="slate"] .md-typeset .admonition.note { background: rgb(43 110 98/ 0.2); padding: 0.8rem 1.4rem; border-radius: 0.8rem; } -[data-md-color-scheme="slate"] .md-typeset .note .admonition-title, -[data-md-color-scheme="slate"] .md-typeset .note summary { +[data-md-color-scheme="slate"] .md-typeset .note .admonition-title { font-size: 1rem; background: transparent; padding-bottom: 0; @@ -112,15 +84,13 @@ } /* Colors for "warning" admonition */ -[data-md-color-scheme="slate"] .md-typeset .admonition.warning, -[data-md-color-scheme="slate"] .md-typeset details.warning { +[data-md-color-scheme="slate"] .md-typeset .admonition.warning { background: rgb(182 87 0 / 0.2); padding: 0.8rem 1.4rem; border-radius: 0.8rem; } -[data-md-color-scheme="slate"] .md-typeset .warning .admonition-title, -[data-md-color-scheme="slate"] .md-typeset .warning summary { +[data-md-color-scheme="slate"] .md-typeset .warning .admonition-title { font-size: 1rem; background: transparent; padding-bottom: 0; @@ -132,6 +102,25 @@ background-color: rgb(219 125 39); } +/* Colors for "info" admonition */ +[data-md-color-scheme="slate"] .md-typeset .admonition.info { + background: rgb(43 52 145 / 0.2); + padding: 0.8rem 1.4rem; + border-radius: 0.8rem; +} + +[data-md-color-scheme="slate"] .md-typeset .info .admonition-title { + font-size: 1rem; + background: transparent; + padding-bottom: 0; + color: rgb(136 145 236); +} + +[data-md-color-scheme="slate"] .md-typeset .info .admonition-title:before { + font-size: 1.1rem; + background-color: rgb(136 145 236); +} + /* Move the sidebars to the edges of the page */ .md-main__inner.md-grid { margin-left: 0; From 067279fb3d7bd84d6ef52108daa62789240db113 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Mon, 19 Jun 2023 01:43:24 -0700 Subject: [PATCH 19/49] Identify where your state should live --- .../identify_where_your_state_should_live.css | 14 ++ .../python/thinking_in_react/error_example.py | 19 ++ .../identify_where_your_state_should_live.py | 101 ++++++++ .../python/thinking_in_react/use_state.py | 8 + .../use_state_with_components.py | 17 ++ docs/src/learn/thinking-in-react.md | 234 ++++-------------- 6 files changed, 213 insertions(+), 180 deletions(-) create mode 100644 docs/examples/css/thinking_in_react/identify_where_your_state_should_live.css create mode 100644 docs/examples/python/thinking_in_react/error_example.py create mode 100644 docs/examples/python/thinking_in_react/identify_where_your_state_should_live.py create mode 100644 docs/examples/python/thinking_in_react/use_state.py create mode 100644 docs/examples/python/thinking_in_react/use_state_with_components.py diff --git a/docs/examples/css/thinking_in_react/identify_where_your_state_should_live.css b/docs/examples/css/thinking_in_react/identify_where_your_state_should_live.css new file mode 100644 index 000000000..b811252a1 --- /dev/null +++ b/docs/examples/css/thinking_in_react/identify_where_your_state_should_live.css @@ -0,0 +1,14 @@ +body { + padding: 5px; +} +label { + display: block; + margin-top: 5px; + margin-bottom: 5px; +} +th { + padding-top: 5px; +} +td { + padding: 2px; +} diff --git a/docs/examples/python/thinking_in_react/error_example.py b/docs/examples/python/thinking_in_react/error_example.py new file mode 100644 index 000000000..e1ae45c3c --- /dev/null +++ b/docs/examples/python/thinking_in_react/error_example.py @@ -0,0 +1,19 @@ +from reactpy import component, html + + +# start +@component +def search_bar(filter_text, in_stock_only): + return html.form( + html.input( + { + "type": "text", + "value": filter_text, + "placeholder": "Search...", + } + ), + html.p( + html.input({"type": "checkbox", "checked": in_stock_only}), + "Only show products in stock", + ), + ) diff --git a/docs/examples/python/thinking_in_react/identify_where_your_state_should_live.py b/docs/examples/python/thinking_in_react/identify_where_your_state_should_live.py new file mode 100644 index 000000000..c8d897cbc --- /dev/null +++ b/docs/examples/python/thinking_in_react/identify_where_your_state_should_live.py @@ -0,0 +1,101 @@ +from reactpy import component, html, use_state + + +# start +@component +def filterable_product_table(products): + filter_text, set_filter_text = use_state("") + in_stock_only, set_in_stock_only = use_state(False) + + return html.div( + search_bar(filter_text=filter_text, in_stock_only=in_stock_only), + product_table( + products=products, filter_text=filter_text, in_stock_only=in_stock_only + ), + ) + + +@component +def product_category_row(category): + return html.tr( + html.th({"colspan": 2}, category), + ) + + +@component +def product_row(product): + if product["stocked"]: + name = product["name"] + else: + name = html.span({"style": {"color": "red"}}, product["name"]) + + return html.tr( + html.td(name), + html.td(product["price"]), + ) + + +@component +def product_table(products, filter_text, in_stock_only): + rows = [] + last_category = None + + for product in products: + if filter_text.lower() not in product["name"].lower(): + continue + if in_stock_only and not product["stocked"]: + continue + if product["category"] != last_category: + rows.append( + product_category_row(product["category"], key=product["category"]) + ) + rows.append(product_row(product, key=product["name"])) + last_category = product["category"] + + return html.table( + html.thead( + html.tr( + html.th("Name"), + html.th("Price"), + ), + ), + html.tbody(rows), + ) + + +@component +def search_bar(filter_text, in_stock_only): + return html.form( + html.input({"type": "text", "value": filter_text, "placeholder": "Search..."}), + html.label( + html.input({"type": "checkbox", "checked": in_stock_only}), + "Only show products in stock", + ), + ) + + +PRODUCTS = [ + {"category": "Fruits", "price": "$1", "stocked": True, "name": "Apple"}, + {"category": "Fruits", "price": "$1", "stocked": True, "name": "Dragonfruit"}, + {"category": "Fruits", "price": "$2", "stocked": False, "name": "Passionfruit"}, + {"category": "Vegetables", "price": "$2", "stocked": True, "name": "Spinach"}, + {"category": "Vegetables", "price": "$4", "stocked": False, "name": "Pumpkin"}, + {"category": "Vegetables", "price": "$1", "stocked": True, "name": "Peas"}, +] + + +@component +def app(): + return filterable_product_table(PRODUCTS) + + +# end +if __name__ == "__main__": + from reactpy import run + from reactpy.utils import _read_docs_css + + @component + def styled_app(): + return html._(html.style(_read_docs_css()), app()) + + run(styled_app) diff --git a/docs/examples/python/thinking_in_react/use_state.py b/docs/examples/python/thinking_in_react/use_state.py new file mode 100644 index 000000000..437554974 --- /dev/null +++ b/docs/examples/python/thinking_in_react/use_state.py @@ -0,0 +1,8 @@ +from reactpy import component, use_state + + +# start +@component +def filterable_product_table(products): + filter_text, set_filter_text = use_state("") + in_stock_only, set_in_stock_only = use_state(False) diff --git a/docs/examples/python/thinking_in_react/use_state_with_components.py b/docs/examples/python/thinking_in_react/use_state_with_components.py new file mode 100644 index 000000000..2964929ea --- /dev/null +++ b/docs/examples/python/thinking_in_react/use_state_with_components.py @@ -0,0 +1,17 @@ +from reactpy import html + +filter_text = "" +in_stock_only = False +products = () + +def search_bar(**_kw): + ... + +def product_table(**_kw): + ... + +# start +html.div( + search_bar(filter_text=filter_text, in_stock_only=in_stock_only), + product_table(products=products, filter_text=filter_text, in_stock_only=in_stock_only), +) diff --git a/docs/src/learn/thinking-in-react.md b/docs/src/learn/thinking-in-react.md index 770a45944..c95f46fbd 100644 --- a/docs/src/learn/thinking-in-react.md +++ b/docs/src/learn/thinking-in-react.md @@ -142,7 +142,7 @@ After identifying your app’s minimal state data, you need to identify which co For each piece of state in your application: 1. Identify _every_ component that renders something based on that state. -2. Find their closest common parent component--a component above them all in the hierarchy. +2. Find their closest common parent component—a component above them all in the hierarchy. 3. Decide where the state should live: 1. Often, you can put the state directly into their common parent. 2. You can also put the state into some component above their common parent. @@ -160,170 +160,44 @@ Now let's run through our strategy for them: So the state values will live in `filterable_product_table`. -Add state to the component with the [`useState()` Hook.](/reference/react/useState) Hooks are special functions that let you "hook into" React. Add two state variables at the top of `filterable_product_table` and specify their initial state: +Add state to the component with the [`use_state()` Hook.](../reference/use-state.md) Hooks are special functions that let you "hook into" React. Add two state variables at the top of `filterable_product_table` and specify their initial state: -```js -function filterable_product_table({ products }) { - const [filterText, setFilterText] = useState(''); - const [inStockOnly, setInStockOnly] = useState(false); +```python linenums="0" +{% include "../../examples/python/thinking_in_react/use_state.py" start="# start" %} ``` -Then, pass `filterText` and `inStockOnly` to `product_table` and `search_bar` as props: +Then, pass `filter_text` and `in_stock_only` to `product_table` and `search_bar` as props: -```js -<div> - <search_bar filterText={filterText} inStockOnly={inStockOnly} /> - <product_table - products={products} - filterText={filterText} - inStockOnly={inStockOnly} - /> -</div> +```python linenums="0" +{% include "../../examples/python/thinking_in_react/use_state_with_components.py" start="# start" %} ``` -You can start seeing how your application will behave. Edit the `filterText` initial value from `useState('')` to `useState('fruit')` in the sandbox code below. You'll see both the search input text and the table update: - -```jsx -import { useState } from "react"; - -function filterable_product_table({ products }) { - const [filterText, setFilterText] = useState(""); - const [inStockOnly, setInStockOnly] = useState(false); - - return ( - <div> - <search_bar filterText={filterText} inStockOnly={inStockOnly} /> - <product_table - products={products} - filterText={filterText} - inStockOnly={inStockOnly} - /> - </div> - ); -} - -function product_category_row({ category }) { - return ( - <tr> - <th colSpan="2">{category}</th> - </tr> - ); -} +You can start seeing how your application will behave. Edit the `filter_text` initial value from `use_state('')` to `use_state('fruit')` in the sandbox code below. You'll see both the search input text and the table update: -function product_row({ product }) { - const name = product.stocked ? ( - product.name - ) : ( - <span style={{ color: "red" }}>{product.name}</span> - ); - - return ( - <tr> - <td>{name}</td> - <td>{product.price}</td> - </tr> - ); -} - -function product_table({ products, filterText, inStockOnly }) { - const rows = []; - let lastCategory = null; - - products.forEach((product) => { - if ( - product.name.toLowerCase().indexOf(filterText.toLowerCase()) === -1 - ) { - return; - } - if (inStockOnly && !product.stocked) { - return; - } - if (product.category !== lastCategory) { - rows.push( - <product_category_row - category={product.category} - key={product.category} - /> - ); - } - rows.push(<product_row product={product} key={product.name} />); - lastCategory = product.category; - }); - - return ( - <table> - <thead> - <tr> - <th>Name</th> - <th>Price</th> - </tr> - </thead> - <tbody>{rows}</tbody> - </table> - ); -} - -function search_bar({ filterText, inStockOnly }) { - return ( - <form> - <input type="text" value={filterText} placeholder="Search..." /> - <label> - <input type="checkbox" checked={inStockOnly} /> Only show - products in stock - </label> - </form> - ); -} - -const PRODUCTS = [ - { category: "Fruits", price: "$1", stocked: true, name: "Apple" }, - { category: "Fruits", price: "$1", stocked: true, name: "Dragonfruit" }, - { category: "Fruits", price: "$2", stocked: false, name: "Passionfruit" }, - { category: "Vegetables", price: "$2", stocked: true, name: "Spinach" }, - { category: "Vegetables", price: "$4", stocked: false, name: "Pumpkin" }, - { category: "Vegetables", price: "$1", stocked: true, name: "Peas" }, -]; +=== "app.py" -export default function App() { - return <filterable_product_table products={PRODUCTS} />; -} -``` + ```python + {% include "../../examples/python/thinking_in_react/identify_where_your_state_should_live.py" start="# start" end="# end" %} + ``` -```css -body { - padding: 5px; -} -label { - display: block; - margin-top: 5px; - margin-bottom: 5px; -} -th { - padding-top: 5px; -} -td { - padding: 2px; -} -``` +=== "styles.css" -Notice that editing the form doesn't work yet. There is a console error in the sandbox above explaining why: + ```css + {% include "../../examples/css/thinking_in_react/identify_where_your_state_should_live.css" %} + ``` -<ConsoleBlock level="error"> +=== ":material-play: Run" -You provided a \`value\` prop to a form field without an \`onChange\` handler. This will render a read-only field. + ```python + # TODO + ``` -</ConsoleBlock> +Notice that editing the form doesn't work yet. -In the sandbox above, `product_table` and `search_bar` read the `filterText` and `inStockOnly` props to render the table, the input, and the checkbox. For example, here is how `search_bar` populates the input value: +In the code above, `product_table` and `search_bar` read the `filter_text` and `in_stock_only` props to render the table, the input, and the checkbox. For example, here is how `search_bar` populates the input value: -```js -function search_bar({ filterText, inStockOnly }) { - return ( - <form> - <input - type="text" - value={filterText} - placeholder="Search..."/> +```python linenums="0" hl_lines="2 7" +{% include "../../examples/python/thinking_in_react/error_example.py" start="# start" %} ``` However, you haven't added any code to respond to the user actions like typing yet. This will be your final step. @@ -332,22 +206,22 @@ However, you haven't added any code to respond to the user actions like typing y Currently your app renders correctly with props and state flowing down the hierarchy. But to change the state according to user input, you will need to support data flowing the other way: the form components deep in the hierarchy need to update the state in `filterable_product_table`. -React makes this data flow explicit, but it requires a little more typing than two-way data binding. If you try to type or check the box in the example above, you'll see that React ignores your input. This is intentional. By writing `<input value={filterText} />`, you've set the `value` prop of the `input` to always be equal to the `filterText` state passed in from `filterable_product_table`. Since `filterText` state is never set, the input never changes. +React makes this data flow explicit, but it requires a little more typing than two-way data binding. If you try to type or check the box in the example above, you'll see that React ignores your input. This is intentional. By writing `<input value={filter_text} />`, you've set the `value` prop of the `input` to always be equal to the `filter_text` state passed in from `filterable_product_table`. Since `filter_text` state is never set, the input never changes. -You want to make it so whenever the user changes the form inputs, the state updates to reflect those changes. The state is owned by `filterable_product_table`, so only it can call `setFilterText` and `setInStockOnly`. To let `search_bar` update the `filterable_product_table`'s state, you need to pass these functions down to `search_bar`: +You want to make it so whenever the user changes the form inputs, the state updates to reflect those changes. The state is owned by `filterable_product_table`, so only it can call `set_filter_text` and `set_in_stock_only`. To let `search_bar` update the `filterable_product_table`'s state, you need to pass these functions down to `search_bar`: ```js function filterable_product_table({ products }) { - const [filterText, setFilterText] = useState(''); - const [inStockOnly, setInStockOnly] = useState(false); + const [filter_text, set_filter_text] = use_state(''); + const [in_stock_only, set_in_stock_only] = use_state(false); return ( <div> <search_bar - filterText={filterText} - inStockOnly={inStockOnly} - onFilterTextChange={setFilterText} - onInStockOnlyChange={setInStockOnly} /> + filter_text={filter_text} + in_stock_only={in_stock_only} + onfilter_textChange={set_filter_text} + onin_stock_onlyChange={set_in_stock_only} /> ``` Inside the `search_bar`, you will add the `onChange` event handlers and set the parent state from them: @@ -355,33 +229,33 @@ Inside the `search_bar`, you will add the `onChange` event handlers and set the ```js <input type="text" - value={filterText} + value={filter_text} placeholder="Search..." - onChange={(e) => onFilterTextChange(e.target.value)} + onChange={(e) => onfilter_textChange(e.target.value)} /> ``` Now the application fully works! ```jsx -import { useState } from "react"; +import { use_state } from "react"; function filterable_product_table({ products }) { - const [filterText, setFilterText] = useState(""); - const [inStockOnly, setInStockOnly] = useState(false); + const [filter_text, set_filter_text] = use_state(""); + const [in_stock_only, set_in_stock_only] = use_state(false); return ( <div> <search_bar - filterText={filterText} - inStockOnly={inStockOnly} - onFilterTextChange={setFilterText} - onInStockOnlyChange={setInStockOnly} + filter_text={filter_text} + in_stock_only={in_stock_only} + onfilter_textChange={set_filter_text} + onin_stock_onlyChange={set_in_stock_only} /> <product_table products={products} - filterText={filterText} - inStockOnly={inStockOnly} + filter_text={filter_text} + in_stock_only={in_stock_only} /> </div> ); @@ -410,17 +284,17 @@ function product_row({ product }) { ); } -function product_table({ products, filterText, inStockOnly }) { +function product_table({ products, filter_text, in_stock_only }) { const rows = []; let lastCategory = null; products.forEach((product) => { if ( - product.name.toLowerCase().indexOf(filterText.toLowerCase()) === -1 + product.name.toLowerCase().indexOf(filter_text.toLowerCase()) === -1 ) { return; } - if (inStockOnly && !product.stocked) { + if (in_stock_only && !product.stocked) { return; } if (product.category !== lastCategory) { @@ -449,24 +323,24 @@ function product_table({ products, filterText, inStockOnly }) { } function search_bar({ - filterText, - inStockOnly, - onFilterTextChange, - onInStockOnlyChange, + filter_text, + in_stock_only, + onfilter_textChange, + onin_stock_onlyChange, }) { return ( <form> <input type="text" - value={filterText} + value={filter_text} placeholder="Search..." - onChange={(e) => onFilterTextChange(e.target.value)} + onChange={(e) => onfilter_textChange(e.target.value)} /> <label> <input type="checkbox" - checked={inStockOnly} - onChange={(e) => onInStockOnlyChange(e.target.checked)} + checked={in_stock_only} + onChange={(e) => onin_stock_onlyChange(e.target.checked)} />{" "} Only show products in stock </label> From 3a0d107b749a49272cae6a42e3b816bc14d0c81a Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Mon, 19 Jun 2023 02:11:52 -0700 Subject: [PATCH 20/49] Thinking in React --- .../add_inverse_data_flow.css | 14 ++ .../add_inverse_data_flow.py | 121 ++++++++++ .../thinking_in_react/event_handlers.py | 18 ++ .../thinking_in_react/set_state_props.py | 32 +++ docs/src/learn/thinking-in-react.md | 209 +++--------------- 5 files changed, 221 insertions(+), 173 deletions(-) create mode 100644 docs/examples/css/thinking_in_react/add_inverse_data_flow.css create mode 100644 docs/examples/python/thinking_in_react/add_inverse_data_flow.py create mode 100644 docs/examples/python/thinking_in_react/event_handlers.py create mode 100644 docs/examples/python/thinking_in_react/set_state_props.py diff --git a/docs/examples/css/thinking_in_react/add_inverse_data_flow.css b/docs/examples/css/thinking_in_react/add_inverse_data_flow.css new file mode 100644 index 000000000..4be625123 --- /dev/null +++ b/docs/examples/css/thinking_in_react/add_inverse_data_flow.css @@ -0,0 +1,14 @@ +body { + padding: 5px; +} +label { + display: block; + margin-top: 5px; + margin-bottom: 5px; +} +th { + padding: 4px; +} +td { + padding: 2px; +} diff --git a/docs/examples/python/thinking_in_react/add_inverse_data_flow.py b/docs/examples/python/thinking_in_react/add_inverse_data_flow.py new file mode 100644 index 000000000..e899cf913 --- /dev/null +++ b/docs/examples/python/thinking_in_react/add_inverse_data_flow.py @@ -0,0 +1,121 @@ +from reactpy import component, html, use_state + + +# start +@component +def filterable_product_table(products): + filter_text, set_filter_text = use_state("") + in_stock_only, set_in_stock_only = use_state(False) + + return html.div( + search_bar( + filter_text=filter_text, + in_stock_only=in_stock_only, + set_filter_text=set_filter_text, + set_in_stock_only=set_in_stock_only, + ), + product_table( + products=products, filter_text=filter_text, in_stock_only=in_stock_only + ), + ) + + +@component +def product_category_row(category): + return html.tr( + html.th({"colspan": 2}, category), + ) + + +@component +def product_row(product): + if product["stocked"]: + name = product["name"] + else: + name = html.span({"style": {"color": "red"}}, product["name"]) + + return html.tr( + html.td(name), + html.td(product["price"]), + ) + + +@component +def product_table(products, filter_text, in_stock_only): + rows = [] + last_category = None + + for product in products: + if filter_text.lower() not in product["name"].lower(): + continue + if in_stock_only and not product["stocked"]: + continue + if product["category"] != last_category: + rows.append( + product_category_row(product["category"], key=product["category"]) + ) + rows.append(product_row(product, key=product["name"])) + last_category = product["category"] + + return html.table( + html.thead( + html.tr( + html.th("Name"), + html.th("Price"), + ), + ), + html.tbody(rows), + ) + + +@component +def search_bar(filter_text, in_stock_only, set_filter_text, set_in_stock_only): + return html.form( + html.input( + { + "type": "text", + "value": filter_text, + "placeholder": "Search...", + "on_change": lambda event: set_filter_text(event["target"]["value"]), + } + ), + html.label( + html.input( + { + "type": "checkbox", + "checked": in_stock_only, + "on_change": lambda event: set_in_stock_only( + event["target"]["checked"] + ), + } + ), + "Only show products in stock", + ), + ) + + +PRODUCTS = [ + {"category": "Fruits", "price": "$1", "stocked": True, "name": "Apple"}, + {"category": "Fruits", "price": "$1", "stocked": True, "name": "Dragonfruit"}, + {"category": "Fruits", "price": "$2", "stocked": False, "name": "Passionfruit"}, + {"category": "Vegetables", "price": "$2", "stocked": True, "name": "Spinach"}, + {"category": "Vegetables", "price": "$4", "stocked": False, "name": "Pumpkin"}, + {"category": "Vegetables", "price": "$1", "stocked": True, "name": "Peas"}, +] + + +@component +def app(): + return filterable_product_table(PRODUCTS) + + +# end +if __name__ == "__main__": + from reactpy import run + from reactpy.utils import _read_docs_css + + @component + def styled_app(): + return html._(html.style(_read_docs_css()), app()) + + run(styled_app) diff --git a/docs/examples/python/thinking_in_react/event_handlers.py b/docs/examples/python/thinking_in_react/event_handlers.py new file mode 100644 index 000000000..a97358c10 --- /dev/null +++ b/docs/examples/python/thinking_in_react/event_handlers.py @@ -0,0 +1,18 @@ +from reactpy import html + +filter_text = "" + + +def set_filter_text(value): + ... + + +# start +html.input( + { + "type": "text", + "value": filter_text, + "placeholder": "Search...", + "on_change": lambda event: set_filter_text(event["target"]["value"]), + } +) diff --git a/docs/examples/python/thinking_in_react/set_state_props.py b/docs/examples/python/thinking_in_react/set_state_props.py new file mode 100644 index 000000000..bbd601416 --- /dev/null +++ b/docs/examples/python/thinking_in_react/set_state_props.py @@ -0,0 +1,32 @@ +# function filterable_product_table({ products }) { +# const [filter_text, set_filter_text] = use_state(''); +# const [in_stock_only, set_in_stock_only] = use_state(false); + +# return ( +# <div> +# <search_bar +# filter_text={filter_text} +# in_stock_only={in_stock_only} +# on_filter_text_change={set_filter_text} +# on_in_stock_only_change={set_in_stock_only} /> + +from reactpy import component, hooks, html + + +def search_bar(**_kws): + ... + +# start +@component +def filterable_product_table(products): + filter_text, set_filter_text = hooks.use_state("") + in_stock_only, set_in_stock_only = hooks.use_state(False) + + return html.div( + search_bar( + filter_text=filter_text, + in_stock_only=in_stock_only, + set_filter_text=set_filter_text, + set_in_stock_only=set_in_stock_only + ) + ) diff --git a/docs/src/learn/thinking-in-react.md b/docs/src/learn/thinking-in-react.md index c95f46fbd..66bc5a581 100644 --- a/docs/src/learn/thinking-in-react.md +++ b/docs/src/learn/thinking-in-react.md @@ -1,5 +1,5 @@ --- -title: Thinking in React 🚧 +title: Thinking in React --- ## Overview @@ -128,12 +128,12 @@ This means only the search text and the value of the checkbox are state! Nicely <font size="4">**Props vs State**</font> - There are two types of "model" data in React: props and state. The two are very different: + There are two types of "model" data in React: props and state. The two are very different: - - [**Props** are like arguments you pass](../learn/passing-props-to-a-component.md) to a function. They let a parent component pass data to a child component and customize its appearance. For example, a `html.form` can pass a `color` prop to a `html.button`. - - [**State** is like a component’s memory.](../learn/state-a-components-memory.md) It lets a component keep track of some information and change it in response to interactions. For example, a `html.button` might keep track of `is_hovered` state. + - [**Props** are like arguments you pass](../learn/passing-props-to-a-component.md) to a function. They let a parent component pass data to a child component and customize its appearance. For example, a `html.form` can pass a `color` prop to a `html.button`. + - [**State** is like a component’s memory.](../learn/state-a-components-memory.md) It lets a component keep track of some information and change it in response to interactions. For example, a `html.button` might keep track of `is_hovered` state. - Props and state are different, but they work together. A parent component will often keep some information in state (so that it can change it), and _pass it down_ to child components as their props. It's okay if the difference still feels fuzzy on the first read. It takes a bit of practice for it to really stick! + Props and state are different, but they work together. A parent component will often keep some information in state (so that it can change it), and _pass it down_ to child components as their props. It's okay if the difference still feels fuzzy on the first read. It takes a bit of practice for it to really stick! ## Step 4: Identify where your state should live @@ -176,15 +176,15 @@ You can start seeing how your application will behave. Edit the `filter_text` in === "app.py" - ```python - {% include "../../examples/python/thinking_in_react/identify_where_your_state_should_live.py" start="# start" end="# end" %} - ``` + ```python + {% include "../../examples/python/thinking_in_react/identify_where_your_state_should_live.py" start="# start" end="# end" %} + ``` === "styles.css" - ```css - {% include "../../examples/css/thinking_in_react/identify_where_your_state_should_live.css" %} - ``` + ```css + {% include "../../examples/css/thinking_in_react/identify_where_your_state_should_live.css" %} + ``` === ":material-play: Run" @@ -210,177 +210,40 @@ React makes this data flow explicit, but it requires a little more typing than t You want to make it so whenever the user changes the form inputs, the state updates to reflect those changes. The state is owned by `filterable_product_table`, so only it can call `set_filter_text` and `set_in_stock_only`. To let `search_bar` update the `filterable_product_table`'s state, you need to pass these functions down to `search_bar`: -```js -function filterable_product_table({ products }) { - const [filter_text, set_filter_text] = use_state(''); - const [in_stock_only, set_in_stock_only] = use_state(false); - - return ( - <div> - <search_bar - filter_text={filter_text} - in_stock_only={in_stock_only} - onfilter_textChange={set_filter_text} - onin_stock_onlyChange={set_in_stock_only} /> +```python linenums="0" hl_lines="3-4 10-11" +{% include "../../examples/python/thinking_in_react/set_state_props.py" start="# start" %} ``` -Inside the `search_bar`, you will add the `onChange` event handlers and set the parent state from them: +Inside the `search_bar`, you will add the `on_change` event handlers and set the parent state from them: -```js -<input - type="text" - value={filter_text} - placeholder="Search..." - onChange={(e) => onfilter_textChange(e.target.value)} -/> +```python linenums="0" hl_lines="6" +{% include "../../examples/python/thinking_in_react/event_handlers.py" start="# start" %} ``` Now the application fully works! -```jsx -import { use_state } from "react"; - -function filterable_product_table({ products }) { - const [filter_text, set_filter_text] = use_state(""); - const [in_stock_only, set_in_stock_only] = use_state(false); - - return ( - <div> - <search_bar - filter_text={filter_text} - in_stock_only={in_stock_only} - onfilter_textChange={set_filter_text} - onin_stock_onlyChange={set_in_stock_only} - /> - <product_table - products={products} - filter_text={filter_text} - in_stock_only={in_stock_only} - /> - </div> - ); -} - -function product_category_row({ category }) { - return ( - <tr> - <th colSpan="2">{category}</th> - </tr> - ); -} - -function product_row({ product }) { - const name = product.stocked ? ( - product.name - ) : ( - <span style={{ color: "red" }}>{product.name}</span> - ); - - return ( - <tr> - <td>{name}</td> - <td>{product.price}</td> - </tr> - ); -} - -function product_table({ products, filter_text, in_stock_only }) { - const rows = []; - let lastCategory = null; - - products.forEach((product) => { - if ( - product.name.toLowerCase().indexOf(filter_text.toLowerCase()) === -1 - ) { - return; - } - if (in_stock_only && !product.stocked) { - return; - } - if (product.category !== lastCategory) { - rows.push( - <product_category_row - category={product.category} - key={product.category} - /> - ); - } - rows.push(<product_row product={product} key={product.name} />); - lastCategory = product.category; - }); - - return ( - <table> - <thead> - <tr> - <th>Name</th> - <th>Price</th> - </tr> - </thead> - <tbody>{rows}</tbody> - </table> - ); -} - -function search_bar({ - filter_text, - in_stock_only, - onfilter_textChange, - onin_stock_onlyChange, -}) { - return ( - <form> - <input - type="text" - value={filter_text} - placeholder="Search..." - onChange={(e) => onfilter_textChange(e.target.value)} - /> - <label> - <input - type="checkbox" - checked={in_stock_only} - onChange={(e) => onin_stock_onlyChange(e.target.checked)} - />{" "} - Only show products in stock - </label> - </form> - ); -} - -const PRODUCTS = [ - { category: "Fruits", price: "$1", stocked: true, name: "Apple" }, - { category: "Fruits", price: "$1", stocked: true, name: "Dragonfruit" }, - { category: "Fruits", price: "$2", stocked: false, name: "Passionfruit" }, - { category: "Vegetables", price: "$2", stocked: true, name: "Spinach" }, - { category: "Vegetables", price: "$4", stocked: false, name: "Pumpkin" }, - { category: "Vegetables", price: "$1", stocked: true, name: "Peas" }, -]; - -export default function App() { - return <filterable_product_table products={PRODUCTS} />; -} -``` +=== "app.py" -```css -body { - padding: 5px; -} -label { - display: block; - margin-top: 5px; - margin-bottom: 5px; -} -th { - padding: 4px; -} -td { - padding: 2px; -} -``` + <!-- FIXME: Click event on the checkbox is broken. `event["target"]["checked"]` doesn't exist --> + + ```python + {% include "../../examples/python/thinking_in_react/add_inverse_data_flow.py" start="# start" end="# end" %} + ``` + +=== "styles.css" + + ```css + {% include "../../examples/css/thinking_in_react/add_inverse_data_flow.css" %} + ``` + +=== ":material-play: Run" + + ```python + # TODO + ``` -You can learn all about handling events and updating state in the [Adding Interactivity](/learn/adding-interactivity) section. +You can learn all about handling events and updating state in the [Adding Interactivity](../learn/responding-to-events.md) section. ## Where to go from here -This was a very brief introduction to how to think about building components and applications with React. You can [start a React project](/learn/installation) right now or [dive deeper on all the syntax](/learn/describing-the-ui) used in this tutorial. +This was a very brief introduction to how to think about building components and applications with React. You can [start a React project](../learn/start-a-new-react-project.md) right now or [dive deeper on all the syntax](../learn/your-first-component.md) used in this tutorial. From 865c18fd9bcf943c62dde0148b4442665714ce06 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Mon, 19 Jun 2023 02:29:24 -0700 Subject: [PATCH 21/49] Add fixme --- docs/src/learn/tutorial-tic-tac-toe.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/src/learn/tutorial-tic-tac-toe.md b/docs/src/learn/tutorial-tic-tac-toe.md index 8b696a61c..197b73bfb 100644 --- a/docs/src/learn/tutorial-tic-tac-toe.md +++ b/docs/src/learn/tutorial-tic-tac-toe.md @@ -29,6 +29,8 @@ You can see what it will look like when you're finished here: === "app.py" + <!-- FIXME: Currently this example uses empty string instead of None, due to a bug with ReactPy --> + ```python {% include "../../examples/python/tutorial_tic_tac_toe/tic_tac_toe.py" end="# end" %} ``` From 61950500cef56dcdc661acb5fb76f0835aaf344c Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Mon, 19 Jun 2023 04:41:14 -0700 Subject: [PATCH 22/49] start a new react project --- README.md | 3 +- .../configure_example.py | 6 + .../learn/add-react-to-an-existing-project.md | 7 +- docs/src/learn/start-a-new-react-project.md | 167 ++++++++++-------- docs/src/learn/tutorial-tic-tac-toe.md | 32 ++-- docs/src/static/css/extra.css | 20 +++ 6 files changed, 144 insertions(+), 91 deletions(-) create mode 100644 docs/examples/python/start_a_new_react_project/configure_example.py diff --git a/README.md b/README.md index db3e94484..d24c250a4 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ In order to set up an environment to develop these docs... 7. Follow the on-screen prompts to view the documentation in your browser 8. You can now edit the markdown files located within `docs/src/` and see the changes in real time -All unfinished tabs are marked via a construction symbol ( 🚧 ). +🚧 : Unfinished tab +🚫 : Tab is blocked from being started due to external factors Feel free to PR this branch with any changes you make to the documentation. If you have any questions, feel free to ask in the [Discord server](https://discord.gg/uNb5P4hA9X). diff --git a/docs/examples/python/start_a_new_react_project/configure_example.py b/docs/examples/python/start_a_new_react_project/configure_example.py new file mode 100644 index 000000000..c04a0e54d --- /dev/null +++ b/docs/examples/python/start_a_new_react_project/configure_example.py @@ -0,0 +1,6 @@ +from fastapi import FastAPI + +from reactpy.backend.fastapi import configure + +asgi_app = FastAPI() +configure(asgi_app) diff --git a/docs/src/learn/add-react-to-an-existing-project.md b/docs/src/learn/add-react-to-an-existing-project.md index 73a3b0bc1..4a57ef769 100644 --- a/docs/src/learn/add-react-to-an-existing-project.md +++ b/docs/src/learn/add-react-to-an-existing-project.md @@ -1,7 +1,12 @@ --- -title: Add React to an Existing Project 🚧 +title: Add React to an Existing Project 🚫 --- +<!-- +TODO: Template tag is needed to complete this tab +https://github.com/reactive-python/reactpy/issues/653 +--> + ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/start-a-new-react-project.md b/docs/src/learn/start-a-new-react-project.md index dbe1ad06a..0196b1943 100644 --- a/docs/src/learn/start-a-new-react-project.md +++ b/docs/src/learn/start-a-new-react-project.md @@ -1,133 +1,154 @@ --- -title: Start a New React Project 🚧 +title: Start a New React Project --- ## Overview <p class="intro" markdown> -If you want to build a new app or a new website fully with React, we recommend picking one of the React-powered frameworks popular in the community. Frameworks provide features that most apps and sites eventually need, including routing, data fetching, and generating HTML. +If you want to build a new app or a new website fully with ReactPy, we recommend picking one of the ReactPy-compatible backends popular in the community. These backend frameworks provide features that most apps and sites eventually need, including routing, data fetching, and session management. </p> -<Note> -**You need to install [Node.js](https://nodejs.org/en/) for local development.** You can _also_ choose to use Node.js in production, but you don't have to. Many React frameworks support export to a static HTML/CSS/JS folder. +## Built-in Backends -</Note> +<!-- FIXME: This is reliant on https://github.com/reactive-python/reactpy/issues/1071 --> -## Production-grade React frameworks +!!! note -### Next.js + Some of our frameworks are considered _built-in_, meaning that compatibility for these backends are contained within `reactpy.backend.*`. -**[Next.js](https://nextjs.org/) is a full-stack React framework.** It's versatile and lets you create React apps of any size--from a mostly static blog to a complex dynamic application. To create a new Next.js project, run in your terminal: + In order to run ReactPy with these frameworks, you will need to run `reactpy.backend.*.configure(...)` on your ASGI application. This command will configure the necessary settings and routes for ReactPy to work properly. -<TerminalBlock> -npx create-next-app -</TerminalBlock> + For example, this is how you would configure ReactPy for FastAPI: -If you're new to Next.js, check out the [Next.js tutorial.](https://nextjs.org/learn/foundations/about-nextjs) + ```python linenums="0" + {% include "../../examples/python/start_a_new_react_project/configure_example.py" %} + ``` -Next.js is maintained by [Vercel](https://vercel.com/). You can [deploy a Next.js app](https://nextjs.org/docs/deployment) to any Node.js or serverless hosting, or to your own server. [Fully static Next.js apps](https://nextjs.org/docs/advanced-features/static-html-export) can be deployed to any static hosting. +### FastAPI -### Remix +FastAPI is a high-performance web framework that is designed for speed and efficiency. It is built on top of the asyncio library and uses a number of optimizations to achieve its performance. FastAPI is a good choice for web applications that need to be fast and scalable. -**[Remix](https://remix.run/) is a full-stack React framework with nested routing.** It lets you break your app into nested parts that can load data in parallel and refresh in response to the user actions. To create a new Remix project, run: +!!! example "Terminal" -<TerminalBlock> -npx create-remix -</TerminalBlock> + ```bash linenums="0" + pip install reactpy[fastapi] + ``` -If you're new to Remix, check out the Remix [blog tutorial](https://remix.run/docs/en/main/tutorials/blog) (short) and [app tutorial](https://remix.run/docs/en/main/tutorials/jokes) (long). +If you're new to FastAPI, check out the [FastAPI tutorial](https://fastapi.tiangolo.com/tutorial/). -Remix is maintained by [Shopify](https://www.shopify.com/). When you create a Remix project, you need to [pick your deployment target](https://remix.run/docs/en/main/guides/deployment). You can deploy a Remix app to any Node.js or serverless hosting by using or writing an [adapter](https://remix.run/docs/en/main/other-api/adapter). +You will need to [configure FastAPI](#built-in-backends) in order to use it with ReactPy. -### Gatsby +### Flask -**[Gatsby](https://www.gatsbyjs.com/) is a React framework for fast CMS-backed websites.** Its rich plugin ecosystem and its GraphQL data layer simplify integrating content, APIs, and services into one website. To create a new Gatsby project, run: +Flask is a microframework that is lightweight and easy to use. It is a good choice for small and simple web applications. Flask does not include many features out of the box, but it is highly customizable and can be extended with a variety of third-party libraries. -<TerminalBlock> -npx create-gatsby -</TerminalBlock> +!!! example "Terminal" -If you're new to Gatsby, check out the [Gatsby tutorial.](https://www.gatsbyjs.com/docs/tutorial/) + ```bash linenums="0" + pip install reactpy[flask] + ``` -Gatsby is maintained by [Netlify](https://www.netlify.com/). You can [deploy a fully static Gatsby site](https://www.gatsbyjs.com/docs/how-to/previews-deploys-hosting) to any static hosting. If you opt into using server-only features, make sure your hosting provider supports them for Gatsby. +If you're new to Flask, check out the [Flask tutorial](https://flask.palletsprojects.com/en/latest/tutorial/). -### Expo (for native apps) +You will need to [configure Flask](#built-in-backends) in order to use it with ReactPy. -**[Expo](https://expo.dev/) is a React framework that lets you create universal Android, iOS, and web apps with truly native UIs.** It provides an SDK for [React Native](https://reactnative.dev/) that makes the native parts easier to use. To create a new Expo project, run: +### Sanic -<TerminalBlock> -npx create-expo-app -</TerminalBlock> +Sanic is a microframework that is designed for speed and performance. It is built on top of the asyncio library and uses a number of optimizations to achieve its performance. Sanic is a good choice for web applications that need to be fast and scalable. -If you're new to Expo, check out the [Expo tutorial](https://docs.expo.dev/tutorial/introduction/). +!!! example "Terminal" -Expo is maintained by [Expo (the company)](https://expo.dev/about). Building apps with Expo is free, and you can submit them to the Google and Apple app stores without restrictions. Expo additionally provides opt-in paid cloud services. + ```bash linenums="0" + pip install reactpy[sanic] + ``` -<DeepDive> +If you're new to Sanic, check out the [Sanic tutorial](https://sanicframework.org/en/guide/). -#### Can I use React without a framework? +You will need to [configure Sanic](#built-in-backends) in order to use it with ReactPy. -You can definitely use React without a framework--that's how you'd [use React for a part of your page.](/learn/add-react-to-an-existing-project#using-react-for-a-part-of-your-existing-page) **However, if you're building a new app or a site fully with React, we recommend using a framework.** +### Starlette -Here's why. +Starlette is a lightweight framework that is designed for simplicity and flexibility. It is built on top of the ASGI standard and is very easy to extend. Starlette is a good choice for web applications that need to be simple and flexible. -Even if you don't need routing or data fetching at first, you'll likely want to add some libraries for them. As your JavaScript bundle grows with every new feature, you might have to figure out how to split code for every route individually. As your data fetching needs get more complex, you are likely to encounter server-client network waterfalls that make your app feel very slow. As your audience includes more users with poor network conditions and low-end devices, you might need to generate HTML from your components to display content early--either on the server, or during the build time. Changing your setup to run some of your code on the server or during the build can be very tricky. +!!! example "Terminal" -**These problems are not React-specific. This is why Svelte has SvelteKit, Vue has Nuxt, and so on.** To solve these problems on your own, you'll need to integrate your bundler with your router and with your data fetching library. It's not hard to get an initial setup working, but there are a lot of subtleties involved in making an app that loads quickly even as it grows over time. You'll want to send down the minimal amount of app code but do so in a single client–server roundtrip, in parallel with any data required for the page. You'll likely want the page to be interactive before your JavaScript code even runs, to support progressive enhancement. You may want to generate a folder of fully static HTML files for your marketing pages that can be hosted anywhere and still work with JavaScript disabled. Building these capabilities yourself takes real work. + ```bash linenums="0" + pip install reactpy[starlette] + ``` -**React frameworks on this page solve problems like these by default, with no extra work from your side.** They let you start very lean and then scale your app with your needs. Each React framework has a community, so finding answers to questions and upgrading tooling is easier. Frameworks also give structure to your code, helping you and others retain context and skills between different projects. Conversely, with a custom setup it's easier to get stuck on unsupported dependency versions, and you'll essentially end up creating your own framework—albeit one with no community or upgrade path (and if it's anything like the ones we've made in the past, more haphazardly designed). +If you're new to Starlette, check out the [Starlette tutorial](https://www.starlette.io/tutorial/). -If you're still not convinced, or your app has unusual constraints not served well by these frameworks and you'd like to roll your own custom setup, we can't stop you--go for it! Grab `react` and `react-dom` from npm, set up your custom build process with a bundler like [Vite](https://vitejs.dev/) or [Parcel](https://parceljs.org/), and add other tools as you need them for routing, static generation or server-side rendering, and more. </DeepDive> +You will need to [configure Starlette](#built-in-backends) in order to use it with ReactPy. -## Bleeding-edge React frameworks +### Tornado -As we've explored how to continue improving React, we realized that integrating React more closely with frameworks (specifically, with routing, bundling, and server technologies) is our biggest opportunity to help React users build better apps. The Next.js team has agreed to collaborate with us in researching, developing, integrating, and testing framework-agnostic bleeding-edge React features like [React Server Components.](/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-server-components) +Tornado is a scalable web framework that is designed for high-traffic applications. It is built on top of the asyncio library and uses a number of optimizations to achieve its scalability. Tornado is a good choice for web applications that need to handle a lot of traffic. -These features are getting closer to being production-ready every day, and we've been in talks with other bundler and framework developers about integrating them. Our hope is that in a year or two, all frameworks listed on this page will have full support for these features. (If you're a framework author interested in partnering with us to experiment with these features, please let us know!) +!!! example "Terminal" -### Next.js (App Router) + ```bash linenums="0" + pip install reactpy[tornado] + ``` -**[Next.js's App Router](https://beta.nextjs.org/docs/getting-started) is a redesign of the Next.js APIs aiming to fulfill the React team’s full-stack architecture vision.** It lets you fetch data in asynchronous components that run on the server or even during the build. +If you're new to Tornado, check out the [Tornado tutorial](https://www.tornadoweb.org/en/stable/guide/). -Next.js is maintained by [Vercel](https://vercel.com/). You can [deploy a Next.js app](https://nextjs.org/docs/deployment) to any Node.js or serverless hosting, or to your own server. Next.js also supports [static export](https://beta.nextjs.org/docs/configuring/static-export) which doesn't require a server. <Pitfall> +You will need to [configure Tornado](#built-in-backends) in order to use it with ReactPy. -Next.js's App Router is **currently in beta and is not yet recommended for production** (as of Mar 2023). To experiment with it in an existing Next.js project, [follow this incremental migration guide](https://beta.nextjs.org/docs/upgrade-guide#migrating-from-pages-to-app). +## External Backends -</Pitfall> +### Django -<DeepDive> +[Django](https://www.djangoproject.com/) is a full-featured web framework that provides a batteries-included approach to web development. It includes features such as ORM, templating, authentication, and authorization. Django is a good choice for large and complex web applications. -#### Which features make up the React team’s full-stack architecture vision? +!!! example "Terminal" -Next.js's App Router bundler fully implements the official [React Server Components specification](https://github.com/reactjs/rfcs/blob/main/text/0188-server-components.md). This lets you mix build-time, server-only, and interactive components in a single React tree. + ```bash linenums="0" + pip install reactpy-django + ``` -For example, you can write a server-only React component as an `async` function that reads from a database or from a file. Then you can pass data down from it to your interactive components: +If you're new to Django, check out the [Django tutorial](https://docs.djangoproject.com/en/dev/intro/tutorial01/). -```js -// This component runs *only* on the server (or during the build). -async function Talks({ confId }) { - // 1. You're on the server, so you can talk to your data layer. API endpoint not required. - const talks = await db.Talks.findAll({ confId }); +You will need to [configure Django](https://reactive-python.github.io/reactpy-django/get-started/installation/) in order to use it with ReactPy. - // 2. Add any amount of rendering logic. It won't make your JavaScript bundle larger. - const videos = talks.map((talk) => talk.video); +### Jupyter - // 3. Pass the data down to the components that will run in the browser. - return <SearchableVideoList videos={videos} />; -} -``` +Jupyter is an interactive computing environment that is used for data science and machine learning. It allows users to run code, visualize data, and collaborate with others in a live environment. Jupyter is a powerful tool for data scientists and machine learning engineers. -Next.js's App Router also integrates [data fetching with Suspense](/blog/2022/03/29/react-v18#suspense-in-data-frameworks). This lets you specify a loading state (like a skeleton placeholder) for different parts of your user interface directly in your React tree: +!!! example "Terminal" -```js -<Suspense fallback={<TalksLoading />}> - <Talks confId={conf.id} /> -</Suspense> -``` + ```bash linenums="0" + pip install reactpy-jupyter + ``` -Server Components and Suspense are React features rather than Next.js features. However, adopting them at the framework level requires buy-in and non-trivial implementation work. At the moment, the Next.js App Router is the most complete implementation. The React team is working with bundler developers to make these features easier to implement in the next generation of frameworks. +If you're new to Jupyter, check out the [Jupyter tutorial](https://jupyter.org/try). -</DeepDive> +You will need to [configure Jupyter](https://github.com/reactive-python/reactpy-jupyter#readme) in order to use it with ReactPy. + +### Plotly Dash + +Plotly Dash is a web application framework that is used to create interactive dashboards. It allows users to create dashboards that can be used to visualize data and interact with it in real time. Plotly Dash is a good choice for creating dashboards that need to be interactive and informative. + +!!! example "Terminal" + + ```bash linenums="0" + pip install reactpy-dash + ``` + +If you're new to Plotly Dash, check out the [Plotly Dash tutorial](https://dash.plotly.com/installation). + +You will need to [configure Plotly Dash](https://github.com/reactive-python/reactpy-dash#readme) in order to use it with ReactPy. + +!!! info "Deep Dive" + + <font size="4">**Can I use ReactPy without a backend framework?**</font> + + You can not ReactPy without a backend—this project was designed to be built on-top of existing web frameworks. + + Here's why. + + You can think of ReactPy as ReactJS server side rendering, but with a Python server. We rely on Python web frameworks and webservers in order to process ReactPy traffic. **This means that you can [use any Python web framework](../learn/creating-backends.md) as a ReactPy backend, as long as it supports the ASGI standard.** As your project grows with every new feature, you may want to switch backends in the future. As a result, we recommend keeping all backend-related logic within hook functions in order to make the "points of integration" between ReactPy and your backend as small as possible. + + **If you're building a new app or a site fully with ReactPy, we recommend using your favorite backend combined with [`reactpy-router`](https://github.com/reactive-python/reactpy-router) to create a Single Page Application (SPA).** diff --git a/docs/src/learn/tutorial-tic-tac-toe.md b/docs/src/learn/tutorial-tic-tac-toe.md index 197b73bfb..317ca0c8c 100644 --- a/docs/src/learn/tutorial-tic-tac-toe.md +++ b/docs/src/learn/tutorial-tic-tac-toe.md @@ -29,7 +29,7 @@ You can see what it will look like when you're finished here: === "app.py" - <!-- FIXME: Currently this example uses empty string instead of None, due to a bug with ReactPy --> + <!-- FIXME: Currently this example uses empty string instead of None, due to a bug with ReactPy --> ```python {% include "../../examples/python/tutorial_tic_tac_toe/tic_tac_toe.py" end="# end" %} @@ -57,18 +57,17 @@ Once you've played around with the finished tic-tac-toe game, keep scrolling. Yo In the code example below, click **Run** to open the editor in a new tab using the website Jupyter. Jupyter lets you write code in your browser and preview how your users will see the app you've created. The new tab should display an empty square and the starter code for this tutorial. - === "app.py" - ```python - {% include "../../examples/python/tutorial_tic_tac_toe/setup_for_the_tutorial.py" start="# start" %} - ``` + ```python + {% include "../../examples/python/tutorial_tic_tac_toe/setup_for_the_tutorial.py" start="# start" %} + ``` === "styles.css" - ```css - {% include "../../examples/css/tutorial_tic_tac_toe/setup_for_the_tutorial.css" %} - ``` + ```css + {% include "../../examples/css/tutorial_tic_tac_toe/setup_for_the_tutorial.css" %} + ``` === ":material-play: Run" @@ -78,16 +77,15 @@ In the code example below, click **Run** to open the editor in a new tab using t !!! note - You can also follow this tutorial using your local development environment. To do this, you need to: - - 1. Install [Python](https://www.python.org/downloads/) - 2. Copy the example above into a file called `app.py` - 3. Install ReactPy for your [backend](../reference/fastapi.md), for example `pip install reactpy[fastapi]` - 4. Add `reactpy.run(...)` to the end of your Python file - 5. Run `python app.py` to start a local server and follow the prompts to view the code running in a browser + You can also follow this tutorial using your local development environment. To do this, you need to: - If you get stuck, don't let this stop you! Follow along online instead and try a local setup again later. + 1. Install [Python](https://www.python.org/downloads/) + 2. Copy the example above into a file called `app.py` + 3. Install ReactPy for your [backend](../reference/fastapi.md), for example `pip install reactpy[fastapi]` + 4. Add `reactpy.run(...)` to the end of your Python file + 5. Run `python app.py` to start a local server and follow the prompts to view the code running in a browser + If you get stuck, don't let this stop you! Follow along online instead and try a local setup again later. ## Overview @@ -98,6 +96,7 @@ Now that you're set up, let's get an overview of React! In Jupyter you'll see three main sections: <!-- TODO: Add screenshot --> + ![TODO: screenshot of Jupyter]() 1. The _Files_ section with a list of files like `tic-tac-toe.ipynb` @@ -113,6 +112,7 @@ The `tic-tac-toe.ipynb` file should be selected in the _Files_ section. Click on After clicking the _run button_ the notebook should be displaying a square with a X in it like this: <!-- TODO: Add screenshot --> + ![TODO: x-filled square]() Now let's have a look at the files in the starter code. diff --git a/docs/src/static/css/extra.css b/docs/src/static/css/extra.css index b049a15cd..4e060a39d 100644 --- a/docs/src/static/css/extra.css +++ b/docs/src/static/css/extra.css @@ -121,6 +121,26 @@ background-color: rgb(136 145 236); } +/* Colors for "example" admonition */ +[data-md-color-scheme="slate"] .md-typeset .admonition.example { + background: rgb(94 104 126); + border-radius: 0.4rem; +} + +[data-md-color-scheme="slate"] .md-typeset .example .admonition-title { + background: rgb(78 87 105); + color: rgb(246 247 249); +} + +[data-md-color-scheme="slate"] .md-typeset .example .admonition-title:before { + background-color: rgb(246 247 249); +} + +[data-md-color-scheme="slate"] .md-typeset .admonition.example code { + background: transparent; + color: #FFF; +} + /* Move the sidebars to the edges of the page */ .md-main__inner.md-grid { margin-left: 0; From fa4b1df00aed5fa1258b9efb93655f118b55e820 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Mon, 19 Jun 2023 05:05:15 -0700 Subject: [PATCH 23/49] Add in progress warnings --- .../learn/add-react-to-an-existing-project.md | 18 +++++++++++------- docs/src/learn/editor-setup.md | 2 +- docs/src/learn/react-developer-tools.md | 16 ++++++++++++---- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/docs/src/learn/add-react-to-an-existing-project.md b/docs/src/learn/add-react-to-an-existing-project.md index 4a57ef769..e39ab5310 100644 --- a/docs/src/learn/add-react-to-an-existing-project.md +++ b/docs/src/learn/add-react-to-an-existing-project.md @@ -2,11 +2,6 @@ title: Add React to an Existing Project 🚫 --- -<!-- -TODO: Template tag is needed to complete this tab -https://github.com/reactive-python/reactpy/issues/653 ---> - ## Overview <p class="intro" markdown> @@ -15,6 +10,13 @@ If you want to add some interactivity to your existing project, you don't have t </p> +!!! warning "In Progress" + + This feature is planned, but not yet developed. + + See [this issue](https://github.com/reactive-python/reactpy/issues/653) for more details. + +<!-- <Note> **You need to install [Node.js](https://nodejs.org/en/) for local development.** Although you can [try React](/learn/installation#try-react) online or with a simple HTML page, realistically most JavaScript tooling you'll want to use for development requires Node.js. @@ -70,7 +72,9 @@ Then add these lines of code at the top of your main JavaScript file (it might b </head> <body> <!-- Your existing page content (in this example, it gets replaced) --> - </body> + + </body> + </html> ``` @@ -155,4 +159,4 @@ When you adopt React in an existing project, it's common to start with small int ## Using React Native in an existing native mobile app -[React Native](https://reactnative.dev/) can also be integrated into existing native apps incrementally. If you have an existing native app for Android (Java or Kotlin) or iOS (Objective-C or Swift), [follow this guide](https://reactnative.dev/docs/integration-with-existing-apps) to add a React Native screen to it. +[React Native](https://reactnative.dev/) can also be integrated into existing native apps incrementally. If you have an existing native app for Android (Java or Kotlin) or iOS (Objective-C or Swift), [follow this guide](https://reactnative.dev/docs/integration-with-existing-apps) to add a React Native screen to it. --> diff --git a/docs/src/learn/editor-setup.md b/docs/src/learn/editor-setup.md index 25ebbed3e..7bebda0e8 100644 --- a/docs/src/learn/editor-setup.md +++ b/docs/src/learn/editor-setup.md @@ -22,7 +22,7 @@ A properly configured editor can make code clearer to read and faster to write. Other popular text editors used in the React community include: - [WebStorm](https://www.jetbrains.com/webstorm/) is an integrated development environment designed specifically for JavaScript. -- [Sublime Text](https://www.sublimetext.com/) has support for JSX and TypeScript, [syntax highlighting](https://stackoverflow.com/a/70960574/458193) and autocomplete built in. +- [Sublime Text](https://www.sublimetext.com/) has support for [syntax highlighting](https://stackoverflow.com/a/70960574/458193) and autocomplete built in. - [Vim](https://www.vim.org/) is a highly configurable text editor built to make creating and changing any kind of text very efficient. It is included as "vi" with most UNIX systems and with Apple OS X. ## Recommended text editor features diff --git a/docs/src/learn/react-developer-tools.md b/docs/src/learn/react-developer-tools.md index d951fae3c..c5fcd1241 100644 --- a/docs/src/learn/react-developer-tools.md +++ b/docs/src/learn/react-developer-tools.md @@ -1,19 +1,27 @@ --- -title: React Developer Tools 🚧 +title: React Developer Tools 🚫 --- ## Overview <p class="intro" markdown> -Use React Developer Tools to inspect React [components](/learn/your-first-component), edit [props](/learn/passing-props-to-a-component) and [state](/learn/state-a-components-memory), and identify performance problems. +Use React Developer Tools to inspect React [components](../learn/your-first-component.md), edit [props](../learn/passing-props-to-a-component.md) and [state](../learn/state-a-components-memory.md), and identify performance problems. </p> !!! summary "You Will Learn" - - How to install React Developer Tools + - How to install ReactPy Developer Tools + +!!! warning "In Progress" + + This feature is planned, but not yet developed. + + See [this issue](https://github.com/reactive-python/reactpy/issues/1072) for more details. + +<!-- ## Browser extension The easiest way to debug websites built with React is to install the React Developer Tools browser extension. It is available for several popular browsers: @@ -82,4 +90,4 @@ It should connect to any local React Native app that's running. > Try reloading the app if developer tools doesn't connect after a few seconds. -[Learn more about debugging React Native.](https://reactnative.dev/docs/debugging) +[Learn more about debugging React Native.](https://reactnative.dev/docs/debugging) --> From 3c0b07101964b955aec5c56d6279c8a3ad9fcb91 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Mon, 19 Jun 2023 05:16:37 -0700 Subject: [PATCH 24/49] Add more in progress warnings --- docs/src/learn/tutorial-material-ui.md | 9 ++++++++- docs/src/learn/tutorial-react-bootstrap.md | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/src/learn/tutorial-material-ui.md b/docs/src/learn/tutorial-material-ui.md index 30e56fbc7..b57bba07f 100644 --- a/docs/src/learn/tutorial-material-ui.md +++ b/docs/src/learn/tutorial-material-ui.md @@ -1,3 +1,10 @@ --- -title: "Tutorial: Material UI 🚧" +title: "Tutorial: Material UI 🚫" --- + + +!!! warning "In Progress" + + This tutorial is planned, but is missing a key feature before this page can be written. + + See [this issue](https://github.com/reactive-python/reactpy/issues/786) for more details. diff --git a/docs/src/learn/tutorial-react-bootstrap.md b/docs/src/learn/tutorial-react-bootstrap.md index 79abb885c..8d77dbe1d 100644 --- a/docs/src/learn/tutorial-react-bootstrap.md +++ b/docs/src/learn/tutorial-react-bootstrap.md @@ -1,3 +1,9 @@ --- -title: "Tutorial: React Bootstrap 🚧" +title: "Tutorial: React Bootstrap 🚫" --- + +!!! warning "In Progress" + + This tutorial is planned, but is missing a key feature before this page can be written. + + See [this issue](https://github.com/reactive-python/reactpy/issues/786) for more details. From ce60b29d8301574a9a79537d6364178a9b30472a Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Mon, 19 Jun 2023 17:29:22 -0700 Subject: [PATCH 25/49] a little bit of the "responding to events" section --- .../simple_button_event.css | 3 ++ .../responding_to_events/simple_button.py | 7 +++ .../simple_button_event.py | 22 ++++++++ docs/src/learn/responding-to-events.md | 54 +++++++++++-------- 4 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 docs/examples/css/responding_to_events/simple_button_event.css create mode 100644 docs/examples/python/responding_to_events/simple_button.py create mode 100644 docs/examples/python/responding_to_events/simple_button_event.py diff --git a/docs/examples/css/responding_to_events/simple_button_event.css b/docs/examples/css/responding_to_events/simple_button_event.css new file mode 100644 index 000000000..4fc2d52a0 --- /dev/null +++ b/docs/examples/css/responding_to_events/simple_button_event.css @@ -0,0 +1,3 @@ +button { + margin-right: 10px; +} diff --git a/docs/examples/python/responding_to_events/simple_button.py b/docs/examples/python/responding_to_events/simple_button.py new file mode 100644 index 000000000..7753b4a70 --- /dev/null +++ b/docs/examples/python/responding_to_events/simple_button.py @@ -0,0 +1,7 @@ +from reactpy import component, html + + +# start +@component +def button(): + return html.button("I don't do anything") diff --git a/docs/examples/python/responding_to_events/simple_button_event.py b/docs/examples/python/responding_to_events/simple_button_event.py new file mode 100644 index 000000000..292f3531c --- /dev/null +++ b/docs/examples/python/responding_to_events/simple_button_event.py @@ -0,0 +1,22 @@ +from reactpy import component, html + + +@component +def button(): + def handle_click(event): + print("You clicked me!") + + return html.button({"on_click": handle_click}, "Click me") + + + +# end +if __name__ == "__main__": + from reactpy import run + from reactpy.utils import _read_docs_css + + @component + def styled_app(): + return html._(html.style(_read_docs_css()), button()) + + run(styled_app) diff --git a/docs/src/learn/responding-to-events.md b/docs/src/learn/responding-to-events.md index 2e5385bd1..76d6402aa 100644 --- a/docs/src/learn/responding-to-events.md +++ b/docs/src/learn/responding-to-events.md @@ -6,7 +6,7 @@ title: Responding to Events 🚧 <p class="intro" markdown> -React lets you add _event handlers_ to your JSX. Event handlers are your own functions that will be triggered in response to interactions like clicking, hovering, focusing form inputs, and so on. +React lets you add _event handlers_ to your PSX. Event handlers are your own functions that will be triggered in response to interactions like clicking, hovering, focusing form inputs, and so on. </p> @@ -18,35 +18,43 @@ React lets you add _event handlers_ to your JSX. Event handlers are your own fun ## Adding event handlers -To add an event handler, you will first define a function and then [pass it as a prop](/learn/passing-props-to-a-component) to the appropriate JSX tag. For example, here is a button that doesn't do anything yet: +To add an event handler, you will first define a function and then [pass it as a prop](../learn/passing-props-to-a-component.md) to the appropriate PSX tag. For example, here is a button that doesn't do anything yet: -```js -export default function Button() { - return <button>I don't do anything</button>; -} -``` +=== "app.py" + + ```python + {% include "../../examples/python/responding_to_events/simple_button.py" start="# start" %} + ``` + +=== ":material-play: Run" + + ```python + # TODO + ``` You can make it show a message when a user clicks by following these three steps: -1. Declare a function called `handleClick` _inside_ your `Button` component. -2. Implement the logic inside that function (use `alert` to show the message). -3. Add `on_click={handleClick}` to the `<button>` JSX. +1. Declare a function called `handle_click` _inside_ your `#!python def button():` component. +2. Implement the logic inside that function (use `print` to show the message). +3. Add `on_click=handle_click` to the `html.button` PSX. -```js -export default function Button() { - function handleClick() { - alert("You clicked me!"); - } +=== "app.py" - return <button on_click={handleClick}>Click me</button>; -} -``` + ```python + {% include "../../examples/python/responding_to_events/simple_button_event.py" end="# end" %} + ``` -```css -button { - margin-right: 10px; -} -``` +=== "styles.css" + + ```css + {% include "../../examples/css/responding_to_events/simple_button_event.css" %} + ``` + +=== ":material-play: Run" + + ```python + # TODO + ``` You defined the `handleClick` function and then [passed it as a prop](/learn/passing-props-to-a-component) to `<button>`. `handleClick` is an **event handler.** Event handler functions: From 656623ac46df6aace26beff6c4e3834fcdbd81ce Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Mon, 19 Jun 2023 17:29:47 -0700 Subject: [PATCH 26/49] remove start from the runnable examples --- .../python/thinking_in_react/add_inverse_data_flow.py | 1 - .../thinking_in_react/build_a_static_version_in_react.py | 1 - .../identify_where_your_state_should_live.py | 1 - docs/src/learn/thinking-in-react.md | 6 +++--- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/examples/python/thinking_in_react/add_inverse_data_flow.py b/docs/examples/python/thinking_in_react/add_inverse_data_flow.py index e899cf913..fdb7c79ad 100644 --- a/docs/examples/python/thinking_in_react/add_inverse_data_flow.py +++ b/docs/examples/python/thinking_in_react/add_inverse_data_flow.py @@ -1,7 +1,6 @@ from reactpy import component, html, use_state -# start @component def filterable_product_table(products): filter_text, set_filter_text = use_state("") diff --git a/docs/examples/python/thinking_in_react/build_a_static_version_in_react.py b/docs/examples/python/thinking_in_react/build_a_static_version_in_react.py index c8c05b64e..428406707 100644 --- a/docs/examples/python/thinking_in_react/build_a_static_version_in_react.py +++ b/docs/examples/python/thinking_in_react/build_a_static_version_in_react.py @@ -1,7 +1,6 @@ from reactpy import component, html -# start @component def product_category_row(category): return html.tr(html.th({"colSpan": "2"}, category)) diff --git a/docs/examples/python/thinking_in_react/identify_where_your_state_should_live.py b/docs/examples/python/thinking_in_react/identify_where_your_state_should_live.py index c8d897cbc..c201b6742 100644 --- a/docs/examples/python/thinking_in_react/identify_where_your_state_should_live.py +++ b/docs/examples/python/thinking_in_react/identify_where_your_state_should_live.py @@ -1,7 +1,6 @@ from reactpy import component, html, use_state -# start @component def filterable_product_table(products): filter_text, set_filter_text = use_state("") diff --git a/docs/src/learn/thinking-in-react.md b/docs/src/learn/thinking-in-react.md index 66bc5a581..d66531517 100644 --- a/docs/src/learn/thinking-in-react.md +++ b/docs/src/learn/thinking-in-react.md @@ -71,7 +71,7 @@ You can either build "top down" by starting with building the components higher === "app.py" ```python - {% include "../../examples/python/thinking_in_react/build_a_static_version_in_react.py" start="# start" end="# end" %} + {% include "../../examples/python/thinking_in_react/build_a_static_version_in_react.py" end="# end" %} ``` === "styles.css" @@ -177,7 +177,7 @@ You can start seeing how your application will behave. Edit the `filter_text` in === "app.py" ```python - {% include "../../examples/python/thinking_in_react/identify_where_your_state_should_live.py" start="# start" end="# end" %} + {% include "../../examples/python/thinking_in_react/identify_where_your_state_should_live.py" end="# end" %} ``` === "styles.css" @@ -227,7 +227,7 @@ Now the application fully works! <!-- FIXME: Click event on the checkbox is broken. `event["target"]["checked"]` doesn't exist --> ```python - {% include "../../examples/python/thinking_in_react/add_inverse_data_flow.py" start="# start" end="# end" %} + {% include "../../examples/python/thinking_in_react/add_inverse_data_flow.py" end="# end" %} ``` === "styles.css" From 3c644cc3a50f96e0051a4e2e97c2662ccdc8563b Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Mon, 19 Jun 2023 21:42:46 -0700 Subject: [PATCH 27/49] more in progress warnings --- .../learn/add-react-to-an-existing-project.md | 12 ++--- .../learn/python-in-psx-with-curly-braces.md | 11 +++- docs/src/learn/react-developer-tools.md | 13 +++-- docs/src/learn/writing-markup-with-psx.md | 54 ++++++++++--------- 4 files changed, 50 insertions(+), 40 deletions(-) diff --git a/docs/src/learn/add-react-to-an-existing-project.md b/docs/src/learn/add-react-to-an-existing-project.md index e39ab5310..bdc4a0d3d 100644 --- a/docs/src/learn/add-react-to-an-existing-project.md +++ b/docs/src/learn/add-react-to-an-existing-project.md @@ -2,6 +2,12 @@ title: Add React to an Existing Project 🚫 --- +!!! warning "In Progress" + + This feature is planned, but not yet developed. + + See [this issue](https://github.com/reactive-python/reactpy/issues/653) for more details. + ## Overview <p class="intro" markdown> @@ -10,12 +16,6 @@ If you want to add some interactivity to your existing project, you don't have t </p> -!!! warning "In Progress" - - This feature is planned, but not yet developed. - - See [this issue](https://github.com/reactive-python/reactpy/issues/653) for more details. - <!-- <Note> diff --git a/docs/src/learn/python-in-psx-with-curly-braces.md b/docs/src/learn/python-in-psx-with-curly-braces.md index fcc8f0923..87be20beb 100644 --- a/docs/src/learn/python-in-psx-with-curly-braces.md +++ b/docs/src/learn/python-in-psx-with-curly-braces.md @@ -1,7 +1,13 @@ --- -title: Python in PSX with Curly Braces 🚧 +title: Python in PSX with Curly Braces 🚫 --- +!!! warning "In Progress" + + This feature is planned, but not yet developed. + + See [this issue](https://github.com/reactive-python/reactpy/issues/918) for more details. + ## Overview <p class="intro" markdown> @@ -17,6 +23,7 @@ JSX lets you write HTML-like markup inside a JavaScript file, keeping rendering - How to call a JavaScript function inside JSX with curly braces - How to use a JavaScript object inside JSX with curly braces +<!-- ## Passing strings with quotes When you want to pass a string attribute to JSX, you put it in single or double quotes: @@ -588,4 +595,4 @@ Variables and functions can help you keep the markup simple! </Solution> -</Challenges> +</Challenges> --> diff --git a/docs/src/learn/react-developer-tools.md b/docs/src/learn/react-developer-tools.md index c5fcd1241..464083ec8 100644 --- a/docs/src/learn/react-developer-tools.md +++ b/docs/src/learn/react-developer-tools.md @@ -2,6 +2,12 @@ title: React Developer Tools 🚫 --- +!!! warning "In Progress" + + This feature is planned, but not yet developed. + + See [this issue](https://github.com/reactive-python/reactpy/issues/1072) for more details. + ## Overview <p class="intro" markdown> @@ -14,13 +20,6 @@ Use React Developer Tools to inspect React [components](../learn/your-first-comp - How to install ReactPy Developer Tools - -!!! warning "In Progress" - - This feature is planned, but not yet developed. - - See [this issue](https://github.com/reactive-python/reactpy/issues/1072) for more details. - <!-- ## Browser extension diff --git a/docs/src/learn/writing-markup-with-psx.md b/docs/src/learn/writing-markup-with-psx.md index 829a83725..b4b9396e7 100644 --- a/docs/src/learn/writing-markup-with-psx.md +++ b/docs/src/learn/writing-markup-with-psx.md @@ -1,42 +1,46 @@ --- -title: Writing Markup with PSX 🚧 +title: Writing Markup with PSX 🚫 --- +!!! warning "In Progress" + + This feature is planned, but not yet developed. + + See [this issue](https://github.com/reactive-python/reactpy/issues/918) for more details. + ## Overview <p class="intro" markdown> -_JSX_ is a syntax extension for JavaScript that lets you write HTML-like markup inside a JavaScript file. Although there are other ways to write components, most React developers prefer the conciseness of JSX, and most codebases use it. +_PSX_ is a syntax extension for JavaScript that lets you write HTML-like markup inside a JavaScript file. Although there are other ways to write components, most React developers prefer the conciseness of PSX, and most codebases use it. </p> !!! summary "You Will Learn" - Why React mixes markup with rendering logic - - How JSX is different from HTML - - How to display information with JSX + - How PSX is different from HTML + - How to display information with PSX -## JSX: Putting markup into JavaScript +## PSX: Putting markup into Python The Web has been built on HTML, CSS, and JavaScript. For many years, web developers kept content in HTML, design in CSS, and logic in JavaScript—often in separate files! Content was marked up inside HTML while the page's logic lived separately in JavaScript: <!-- TODO: Diagram --> -But as the Web became more interactive, logic increasingly determined content. JavaScript was in charge of the HTML! This is why **in React, rendering logic and markup live together in the same place—components.** +But as the Web became more interactive, logic increasingly determined content. Scripting languages are now in charge of the HTML! This is why **in React, rendering logic and markup live together in the same place—components.** <!-- TODO: Diagram --> Keeping a button's rendering logic and markup together ensures that they stay in sync with each other on every edit. Conversely, details that are unrelated, such as the button's markup and a sidebar's markup, are isolated from each other, making it safer to change either of them on their own. -Each React component is a JavaScript function that may contain some markup that React renders into the browser. React components use a syntax extension called JSX to represent that markup. JSX looks a lot like HTML, but it is a bit stricter and can display dynamic information. The best way to understand this is to convert some HTML markup to JSX markup. +Each React component is a JavaScript function that may contain some markup that React renders into the browser. React components use a syntax extension called PSX to represent that markup. PSX looks a lot like HTML, but it is a bit stricter and can display dynamic information. The best way to understand this is to convert some HTML markup to PSX markup. -<Note> - -JSX and React are two separate things. They're often used together, but you _can_ [use them independently](https://reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html#whats-a-jsx-transform) of each other. JSX is a syntax extension, while React is a JavaScript library. +!!! note -</Note> + PSX and ReactPy are two separate things. They're often used together, but you _can_ use them independently of each other. PSX is a syntax extension, while ReactPy is a Python library. -## Converting HTML to JSX +<!-- ## Converting HTML to PSX Suppose that you have some (perfectly valid) HTML: @@ -87,7 +91,7 @@ img { } ``` -This is because JSX is stricter and has a few more rules than HTML! If you read the error messages above, they'll guide you to fix the markup, or you can follow the guide below. +This is because PSX is stricter and has a few more rules than HTML! If you read the error messages above, they'll guide you to fix the markup, or you can follow the guide below. <Note> @@ -95,7 +99,7 @@ Most of the time, React's on-screen error messages will help you find where the </Note> -## The Rules of JSX +## The Rules of PSX ### 1. Return a single root element @@ -137,15 +141,15 @@ This empty tag is called a _[Fragment.](/reference/react/Fragment)_ Fragments le <DeepDive> -#### Why do multiple JSX tags need to be wrapped? +#### Why do multiple PSX tags need to be wrapped? -JSX looks like HTML, but under the hood it is transformed into plain JavaScript objects. You can't return two objects from a function without wrapping them into an array. This explains why you also can't return two JSX tags without wrapping them into another tag or a Fragment. +PSX looks like HTML, but under the hood it is transformed into plain JavaScript objects. You can't return two objects from a function without wrapping them into an array. This explains why you also can't return two PSX tags without wrapping them into another tag or a Fragment. </DeepDive> ### 2. Close all the tags -JSX requires tags to be explicitly closed: self-closing tags like `<img>` must become `<img />`, and wrapping tags like `<li>oranges` must be written as `<li>oranges</li>`. +PSX requires tags to be explicitly closed: self-closing tags like `<img>` must become `<img />`, and wrapping tags like `<li>oranges` must be written as `<li>oranges</li>`. This is how Hedy Lamarr's image and list items look closed: @@ -166,7 +170,7 @@ This is how Hedy Lamarr's image and list items look closed: ### 3. camelCase <s>all</s> most of the things! -JSX turns into JavaScript and attributes written in JSX become keys of JavaScript objects. In your own components, you will often want to read those attributes into variables. But JavaScript has limitations on variable names. For example, their names can't contain dashes or be reserved words like `class`. +PSX turns into JavaScript and attributes written in PSX become keys of JavaScript objects. In your own components, you will often want to read those attributes into variables. But JavaScript has limitations on variable names. For example, their names can't contain dashes or be reserved words like `class`. This is why, in React, many HTML and SVG attributes are written in camelCase. For example, instead of `stroke-width` you use `strokeWidth`. Since `class` is a reserved word, in React you write `className` instead, named after the [corresponding DOM property](https://developer.mozilla.org/en-US/docs/Web/API/Element/className): @@ -186,9 +190,9 @@ For historical reasons, [`aria-*`](https://developer.mozilla.org/docs/Web/Access </Pitfall> -### Pro-tip: Use a JSX Converter +### Pro-tip: Use a PSX Converter -Converting all these attributes in existing markup can be tedious! We recommend using a [converter](https://transform.tools/html-to-jsx) to translate your existing HTML and SVG to JSX. Converters are very useful in practice, but it's still worth understanding what is going on so that you can comfortably write JSX on your own. +Converting all these attributes in existing markup can be tedious! We recommend using a [converter](https://transform.tools/html-to-psx) to translate your existing HTML and SVG to PSX. Converters are very useful in practice, but it's still worth understanding what is going on so that you can comfortably write PSX on your own. Here is your final result: @@ -220,19 +224,19 @@ img { <Recap> -Now you know why JSX exists and how to use it in components: +Now you know why PSX exists and how to use it in components: - React components group rendering logic together with markup because they are related. -- JSX is similar to HTML, with a few differences. You can use a [converter](https://transform.tools/html-to-jsx) if you need to. +- PSX is similar to HTML, with a few differences. You can use a [converter](https://transform.tools/html-to-psx) if you need to. - Error messages will often point you in the right direction to fixing your markup. </Recap> <Challenges> -#### Convert some HTML to JSX +#### Convert some HTML to PSX -This HTML was pasted into a component, but it's not valid JSX. Fix it: +This HTML was pasted into a component, but it's not valid PSX. Fix it: ```js export default function Bio() { @@ -323,4 +327,4 @@ export default function Bio() { </Solution> -</Challenges> +</Challenges> --> From fe45c54e6670f3f1031104b8afa451a0121a442a Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Tue, 20 Jun 2023 03:44:20 -0700 Subject: [PATCH 28/49] add stub docs for hooks --- docs/src/reference/common-events.md | 3 - docs/src/reference/common-props.md | 217 +++ docs/src/reference/common-types.md | 3 - docs/src/reference/use-callback.md | 949 +++++++++++++ docs/src/reference/use-context.md | 1322 ++++++++++++++++++ docs/src/reference/use-debug-value.md | 119 ++ docs/src/reference/use-effect.md | 1861 +++++++++++++++++++++++++ docs/src/reference/use-id.md | 286 ++++ docs/src/reference/use-memo.md | 1285 +++++++++++++++++ docs/src/reference/use-reducer.md | 1090 +++++++++++++++ docs/src/reference/use-ref.md | 531 +++++++ docs/src/reference/use-state.md | 1231 ++++++++++++++++ mkdocs.yml | 3 +- 13 files changed, 8892 insertions(+), 8 deletions(-) delete mode 100644 docs/src/reference/common-events.md delete mode 100644 docs/src/reference/common-types.md create mode 100644 docs/src/reference/use-id.md diff --git a/docs/src/reference/common-events.md b/docs/src/reference/common-events.md deleted file mode 100644 index 573da7afc..000000000 --- a/docs/src/reference/common-events.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Common Events 🚧 ---- diff --git a/docs/src/reference/common-props.md b/docs/src/reference/common-props.md index 1c53918ff..4fd73bf9d 100644 --- a/docs/src/reference/common-props.md +++ b/docs/src/reference/common-props.md @@ -1,3 +1,220 @@ --- title: Common Props 🚧 --- + +#### Props + +These special React props are supported for all built-in components: + +- `children`: A React node (an element, a string, a number, [a portal,](/reference/react-dom/createPortal) an empty node like `null`, `undefined` and booleans, or an array of other React nodes). Specifies the content inside the component. When you use JSX, you will usually specify the `children` prop implicitly by nesting tags like `<div><span /></div>`. + +- `dangerouslySetInnerHTML`: An object of the form `{ __html: '<p>some html</p>' }` with a raw HTML string inside. Overrides the [`innerHTML`](https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML) property of the DOM node and displays the passed HTML inside. This should be used with extreme caution! If the HTML inside isn't trusted (for example, if it's based on user data), you risk introducing an [XSS](https://en.wikipedia.org/wiki/Cross-site_scripting) vulnerability. [Read more about using `dangerouslySetInnerHTML`.](#dangerously-setting-the-inner-html) + +- `ref`: A ref object from [`useRef`](/reference/react/useRef) or [`createRef`](/reference/react/createRef), or a [`ref` callback function,](#ref-callback) or a string for [legacy refs.](https://reactjs.org/docs/refs-and-the-dom.html#legacy-api-string-refs) Your ref will be filled with the DOM element for this node. [Read more about manipulating the DOM with refs.](#manipulating-a-dom-node-with-a-ref) + +- `suppressContentEditableWarning`: A boolean. If `true`, suppresses the warning that React shows for elements that both have `children` and `contentEditable={true}` (which normally do not work together). Use this if you're building a text input library that manages the `contentEditable` content manually. + +- `suppressHydrationWarning`: A boolean. If you use [server rendering,](/reference/react-dom/server) normally there is a warning when the server and the client render different content. In some rare cases (like timestamps), it is very hard or impossible to guarantee an exact match. If you set `suppressHydrationWarning` to `true`, React will not warn you about mismatches in the attributes and the content of that element. It only works one level deep, and is intended to be used as an escape hatch. Don't overuse it. [Read about suppressing hydration errors.](/reference/react-dom/client/hydrateRoot#suppressing-unavoidable-hydration-mismatch-errors) + +- `style`: An object with CSS styles, for example `{ fontWeight: 'bold', margin: 20 }`. Similarly to the DOM [`style`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style) property, the CSS property names need to be written as `camelCase`, for example `fontWeight` instead of `font-weight`. You can pass strings or numbers as values. If you pass a number, like `width: 100`, React will automatically append `px` ("pixels") to the value unless it's a [unitless property.](https://github.com/facebook/react/blob/81d4ee9ca5c405dce62f64e61506b8e155f38d8d/packages/react-dom-bindings/src/shared/CSSProperty.js#L8-L57) We recommend using `style` only for dynamic styles where you don't know the style values ahead of time. In other cases, applying plain CSS classes with `className` is more efficient. [Read more about `className` and `style`.](#applying-css-styles) + +These standard DOM props are also supported for all built-in components: + +- [`accessKey`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/accesskey): A string. Specifies a keyboard shortcut for the element. [Not generally recommended.](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/accesskey#accessibility_concerns) +- [`aria-*`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes): ARIA attributes let you specify the accessibility tree information for this element. See [ARIA attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes) for a complete reference. In React, all ARIA attribute names are exactly the same as in HTML. +- [`autoCapitalize`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/autocapitalize): A string. Specifies whether and how the user input should be capitalized. +- [`className`](https://developer.mozilla.org/en-US/docs/Web/API/Element/className): A string. Specifies the element's CSS class name. [Read more about applying CSS styles.](#applying-css-styles) +- [`contentEditable`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/contenteditable): A boolean. If `true`, the browser lets the user edit the rendered element directly. This is used to implement rich text input libraries like [Lexical.](https://lexical.dev/) React warns if you try to pass React children to an element with `contentEditable={true}` because React will not be able to update its content after user edits. +- [`data-*`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/data-*): Data attributes let you attach some string data to the element, for example `data-fruit="banana"`. In React, they are not commonly used because you would usually read data from props or state instead. +- [`dir`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir): Either `'ltr'` or `'rtl'`. Specifies the text direction of the element. +- [`draggable`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/draggable): A boolean. Specifies whether the element is draggable. Part of [HTML Drag and Drop API.](https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API) +- [`enterKeyHint`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/enterKeyHint): A string. Specifies which action to present for the enter key on virtual keyboards. +- [`htmlFor`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/htmlFor): A string. For [`<label>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label) and [`<output>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/output), lets you [associate the label with some control.](/reference/react-dom/components/input#providing-a-label-for-an-input) Same as [`for` HTML attribute.](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/for) React uses the standard DOM property names (`htmlFor`) instead of HTML attribute names. +- [`hidden`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/hidden): A boolean or a string. Specifies whether the element should be hidden. +- [`id`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id): A string. Specifies a unique identifier for this element, which can be used to find it later or connect it with other elements. Generate it with [`useId`](/reference/react/useId) to avoid clashes between multiple instances of the same component. +- [`is`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/is): A string. If specified, the component will behave like a [custom element.](/reference/react-dom/components#custom-html-elements) +- [`inputMode`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inputmode): A string. Specifies what kind of keyboard to display (for example, text, number or telephone). +- [`itemProp`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/itemprop): A string. Specifies which property the element represents for structured data crawlers. +- [`lang`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang): A string. Specifies the language of the element. +- [`onAnimationEnd`](https://developer.mozilla.org/en-US/docs/Web/API/Element/animationend_event): An [`AnimationEvent` handler](#animationevent-handler) function. Fires when a CSS animation completes. +- `onAnimationEndCapture`: A version of `onAnimationEnd` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onAnimationIteration`](https://developer.mozilla.org/en-US/docs/Web/API/Element/animationiteration_event): An [`AnimationEvent` handler](#animationevent-handler) function. Fires when an iteration of a CSS animation ends, and another one begins. +- `onAnimationIterationCapture`: A version of `onAnimationIteration` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onAnimationStart`](https://developer.mozilla.org/en-US/docs/Web/API/Element/animationstart_event): An [`AnimationEvent` handler](#animationevent-handler) function. Fires when a CSS animation starts. +- `onAnimationStartCapture`: `onAnimationStart`, but fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onAuxClick`](https://developer.mozilla.org/en-US/docs/Web/API/Element/auxclick_event): A [`MouseEvent` handler](#mouseevent-handler) function. Fires when a non-primary pointer button was clicked. +- `onAuxClickCapture`: A version of `onAuxClick` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- `onBeforeInput`: An [`InputEvent` handler](#inputevent-handler) function. Fires before the value of an editable element is modified. React does _not_ yet use the native [`beforeinput`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/beforeinput_event) event, and instead attempts to polyfill it using other events. +- `onBeforeInputCapture`: A version of `onBeforeInput` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- `onBlur`: A [`FocusEvent` handler](#focusevent-handler) function. Fires when an element lost focus. Unlike the built-in browser [`blur`](https://developer.mozilla.org/en-US/docs/Web/API/Element/blur_event) event, in React the `onBlur` event bubbles. +- `onBlurCapture`: A version of `onBlur` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onClick`](https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event): A [`MouseEvent` handler](#mouseevent-handler) function. Fires when the primary button was clicked on the pointing device. +- `onClickCapture`: A version of `onClick` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onCompositionStart`](https://developer.mozilla.org/en-US/docs/Web/API/Element/compositionstart_event): A [`CompositionEvent` handler](#compositionevent-handler) function. Fires when an [input method editor](https://developer.mozilla.org/en-US/docs/Glossary/Input_method_editor) starts a new composition session. +- `onCompositionStartCapture`: A version of `onCompositionStart` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onCompositionEnd`](https://developer.mozilla.org/en-US/docs/Web/API/Element/compositionend_event): A [`CompositionEvent` handler](#compositionevent-handler) function. Fires when an [input method editor](https://developer.mozilla.org/en-US/docs/Glossary/Input_method_editor) completes or cancels a composition session. +- `onCompositionEndCapture`: A version of `onCompositionEnd` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onCompositionUpdate`](https://developer.mozilla.org/en-US/docs/Web/API/Element/compositionupdate_event): A [`CompositionEvent` handler](#compositionevent-handler) function. Fires when an [input method editor](https://developer.mozilla.org/en-US/docs/Glossary/Input_method_editor) receives a new character. +- `onCompositionUpdateCapture`: A version of `onCompositionUpdate` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onContextMenu`](https://developer.mozilla.org/en-US/docs/Web/API/Element/contextmenu_event): A [`MouseEvent` handler](#mouseevent-handler) function. Fires when the user tries to open a context menu. +- `onContextMenuCapture`: A version of `onContextMenu` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onCopy`](https://developer.mozilla.org/en-US/docs/Web/API/Element/copy_event): A [`ClipboardEvent` handler](#clipboardevent-handler) function. Fires when the user tries to copy something into the clipboard. +- `onCopyCapture`: A version of `onCopy` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onCut`](https://developer.mozilla.org/en-US/docs/Web/API/Element/cut_event): A [`ClipboardEvent` handler](#clipboardevent-handler) function. Fires when the user tries to cut something into the clipboard. +- `onCutCapture`: A version of `onCut` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- `onDoubleClick`: A [`MouseEvent` handler](#mouseevent-handler) function. Fires when the user clicks twice. Corresponds to the browser [`dblclick` event.](https://developer.mozilla.org/en-US/docs/Web/API/Element/dblclick_event) +- `onDoubleClickCapture`: A version of `onDoubleClick` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onDrag`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/drag_event): A [`DragEvent` handler](#dragevent-handler) function. Fires while the user is dragging something. +- `onDragCapture`: A version of `onDrag` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onDragEnd`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragend_event): A [`DragEvent` handler](#dragevent-handler) function. Fires when the user stops dragging something. +- `onDragEndCapture`: A version of `onDragEnd` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onDragEnter`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragenter_event): A [`DragEvent` handler](#dragevent-handler) function. Fires when the dragged content enters a valid drop target. +- `onDragEnterCapture`: A version of `onDragEnter` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onDragOver`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragover_event): A [`DragEvent` handler](#dragevent-handler) function. Fires on a valid drop target while the dragged content is dragged over it. You must call `e.preventDefault()` here to allow dropping. +- `onDragOverCapture`: A version of `onDragOver` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onDragStart`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dragstart_event): A [`DragEvent` handler](#dragevent-handler) function. Fires when the user starts dragging an element. +- `onDragStartCapture`: A version of `onDragStart` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onDrop`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/drop_event): A [`DragEvent` handler](#dragevent-handler) function. Fires when something is dropped on a valid drop target. +- `onDropCapture`: A version of `onDrop` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- `onFocus`: A [`FocusEvent` handler](#focusevent-handler) function. Fires when an element lost focus. Unlike the built-in browser [`focus`](https://developer.mozilla.org/en-US/docs/Web/API/Element/focus_event) event, in React the `onFocus` event bubbles. +- `onFocusCapture`: A version of `onFocus` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onGotPointerCapture`](https://developer.mozilla.org/en-US/docs/Web/API/Element/gotpointercapture_event): A [`PointerEvent` handler](#pointerevent-handler) function. Fires when an element programmatically captures a pointer. +- `onGotPointerCaptureCapture`: A version of `onGotPointerCapture` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onKeyDown`](https://developer.mozilla.org/en-US/docs/Web/API/Element/keydown_event): A [`KeyboardEvent` handler](#pointerevent-handler) function. Fires when a key is pressed. +- `onKeyDownCapture`: A version of `onKeyDown` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onKeyPress`](https://developer.mozilla.org/en-US/docs/Web/API/Element/keypress_event): A [`KeyboardEvent` handler](#pointerevent-handler) function. Deprecated. Use `onKeyDown` or `onBeforeInput` instead. +- `onKeyPressCapture`: A version of `onKeyPress` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onKeyUp`](https://developer.mozilla.org/en-US/docs/Web/API/Element/keyup_event): A [`KeyboardEvent` handler](#pointerevent-handler) function. Fires when a key is released. +- `onKeyUpCapture`: A version of `onKeyUp` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onLostPointerCapture`](https://developer.mozilla.org/en-US/docs/Web/API/Element/lostpointercapture_event): A [`PointerEvent` handler](#pointerevent-handler) function. Fires when an element stops capturing a pointer. +- `onLostPointerCaptureCapture`: A version of `onLostPointerCapture` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onMouseDown`](https://developer.mozilla.org/en-US/docs/Web/API/Element/mousedown_event): A [`MouseEvent` handler](#mouseevent-handler) function. Fires when the pointer is pressed down. +- `onMouseDownCapture`: A version of `onMouseDown` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onMouseEnter`](https://developer.mozilla.org/en-US/docs/Web/API/Element/mouseenter_event): A [`MouseEvent` handler](#mouseevent-handler) function. Fires when the pointer moves inside an element. Does not have a capture phase. Instead, `onMouseLeave` and `onMouseEnter` propagate from the element being left to the one being entered. +- [`onMouseLeave`](https://developer.mozilla.org/en-US/docs/Web/API/Element/mouseleave_event): A [`MouseEvent` handler](#mouseevent-handler) function. Fires when the pointer moves outside an element. Does not have a capture phase. Instead, `onMouseLeave` and `onMouseEnter` propagate from the element being left to the one being entered. +- [`onMouseMove`](https://developer.mozilla.org/en-US/docs/Web/API/Element/mousemove_event): A [`MouseEvent` handler](#mouseevent-handler) function. Fires when the pointer changes coordinates. +- `onMouseMoveCapture`: A version of `onMouseMove` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onMouseOut`](https://developer.mozilla.org/en-US/docs/Web/API/Element/mouseout_event): A [`MouseEvent` handler](#mouseevent-handler) function. Fires when the pointer moves outside an element, or if it moves into a child element. +- `onMouseOutCapture`: A version of `onMouseOut` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onMouseUp`](https://developer.mozilla.org/en-US/docs/Web/API/Element/mouseup_event): A [`MouseEvent` handler](#mouseevent-handler) function. Fires when the pointer is released. +- `onMouseUpCapture`: A version of `onMouseUp` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onPointerCancel`](https://developer.mozilla.org/en-US/docs/Web/API/Element/pointercancel_event): A [`PointerEvent` handler](#pointerevent-handler) function. Fires when the browser cancels a pointer interaction. +- `onPointerCancelCapture`: A version of `onPointerCancel` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onPointerDown`](https://developer.mozilla.org/en-US/docs/Web/API/Element/pointerdown_event): A [`PointerEvent` handler](#pointerevent-handler) function. Fires when a pointer becomes active. +- `onPointerDownCapture`: A version of `onPointerDown` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onPointerEnter`](https://developer.mozilla.org/en-US/docs/Web/API/Element/pointerenter_event): A [`PointerEvent` handler](#pointerevent-handler) function. Fires when a pointer moves inside an element. Does not have a capture phase. Instead, `onPointerLeave` and `onPointerEnter` propagate from the element being left to the one being entered. +- [`onPointerLeave`](https://developer.mozilla.org/en-US/docs/Web/API/Element/pointerleave_event): A [`PointerEvent` handler](#pointerevent-handler) function. Fires when a pointer moves outside an element. Does not have a capture phase. Instead, `onPointerLeave` and `onPointerEnter` propagate from the element being left to the one being entered. +- [`onPointerMove`](https://developer.mozilla.org/en-US/docs/Web/API/Element/pointermove_event): A [`PointerEvent` handler](#pointerevent-handler) function. Fires when a pointer changes coordinates. +- `onPointerMoveCapture`: A version of `onPointerMove` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onPointerOut`](https://developer.mozilla.org/en-US/docs/Web/API/Element/pointerout_event): A [`PointerEvent` handler](#pointerevent-handler) function. Fires when a pointer moves outside an element, if the pointer interaction is cancelled, and [a few other reasons.](https://developer.mozilla.org/en-US/docs/Web/API/Element/pointerout_event) +- `onPointerOutCapture`: A version of `onPointerOut` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onPointerUp`](https://developer.mozilla.org/en-US/docs/Web/API/Element/pointerup_event): A [`PointerEvent` handler](#pointerevent-handler) function. Fires when a pointer is no longer active. +- `onPointerUpCapture`: A version of `onPointerUp` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onPaste`](https://developer.mozilla.org/en-US/docs/Web/API/Element/paste_event): A [`ClipboardEvent` handler](#clipboardevent-handler) function. Fires when the user tries to paste something from the clipboard. +- `onPasteCapture`: A version of `onPaste` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onScroll`](https://developer.mozilla.org/en-US/docs/Web/API/Element/scroll_event): An [`Event` handler](#event-handler) function. Fires when an element has been scrolled. This event does not bubble. +- `onScrollCapture`: A version of `onScroll` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onSelect`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/select_event): An [`Event` handler](#event-handler) function. Fires after the selection inside an editable element like an input changes. React extends the `onSelect` event to work for `contentEditable={true}` elements as well. In addition, React extends it to fire for empty selection and on edits (which may affect the selection). +- `onSelectCapture`: A version of `onSelect` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onTouchCancel`](https://developer.mozilla.org/en-US/docs/Web/API/Element/touchcancel_event): A [`TouchEvent` handler](#touchevent-handler) function. Fires when the browser cancels a touch interaction. +- `onTouchCancelCapture`: A version of `onTouchCancel` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onTouchEnd`](https://developer.mozilla.org/en-US/docs/Web/API/Element/touchend_event): A [`TouchEvent` handler](#touchevent-handler) function. Fires when one or more touch points are removed. +- `onTouchEndCapture`: A version of `onTouchEnd` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onTouchMove`](https://developer.mozilla.org/en-US/docs/Web/API/Element/touchmove_event): A [`TouchEvent` handler](#touchevent-handler) function. Fires one or more touch points are moved. +- `onTouchMoveCapture`: A version of `onTouchMove` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onTouchStart`](https://developer.mozilla.org/en-US/docs/Web/API/Element/touchstart_event): A [`TouchEvent` handler](#touchevent-handler) function. Fires when one or more touch points are placed. +- `onTouchStartCapture`: A version of `onTouchStart` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onTransitionEnd`](https://developer.mozilla.org/en-US/docs/Web/API/Element/transitionend_event): A [`TransitionEvent` handler](#transitionevent-handler) function. Fires when a CSS transition completes. +- `onTransitionEndCapture`: A version of `onTransitionEnd` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onWheel`](https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event): A [`WheelEvent` handler](#wheelevent-handler) function. Fires when the user rotates a wheel button. +- `onWheelCapture`: A version of `onWheel` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`role`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles): A string. Specifies the element role explicitly for assistive technologies. nt. +- [`slot`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles): A string. Specifies the slot name when using shadow DOM. In React, an equivalent pattern is typically achieved by passing JSX as props, for example `<Layout left={<Sidebar />} right={<Content />} />`. +- [`spellCheck`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/spellcheck): A boolean or null. If explicitly set to `true` or `false`, enables or disables spellchecking. +- [`tabIndex`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex): A number. Overrides the default Tab button behavior. [Avoid using values other than `-1` and `0`.](https://www.tpgi.com/using-the-tabindex-attribute/) +- [`title`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/title): A string. Specifies the tooltip text for the element. +- [`translate`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/translate): Either `'yes'` or `'no'`. Passing `'no'` excludes the element content from being translated. + +You can also pass custom attributes as props, for example `mycustomprop="someValue"`. This can be useful when integrating with third-party libraries. The custom attribute name must be lowercase and must not start with `on`. The value will be converted to a string. If you pass `null` or `undefined`, the custom attribute will be removed. + +These events fire only for the [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form) elements: + +- [`onReset`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/reset_event): An [`Event` handler](#event-handler) function. Fires when a form gets reset. +- `onResetCapture`: A version of `onReset` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onSubmit`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit_event): An [`Event` handler](#event-handler) function. Fires when a form gets submitted. +- `onSubmitCapture`: A version of `onSubmit` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) + +These events fire only for the [`<dialog>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog) elements. Unlike browser events, they bubble in React: + +- [`onCancel`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/cancel_event): An [`Event` handler](#event-handler) function. Fires when the user tries to dismiss the dialog. +- `onCancelCapture`: A version of `onCancel` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) capture-phase-events) +- [`onClose`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/close_event): An [`Event` handler](#event-handler) function. Fires when a dialog has been closed. +- `onCloseCapture`: A version of `onClose` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) + +These events fire only for the [`<details>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details) elements. Unlike browser events, they bubble in React: + +- [`onToggle`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDetailsElement/toggle_event): An [`Event` handler](#event-handler) function. Fires when the user toggles the details. +- `onToggleCapture`: A version of `onToggle` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) capture-phase-events) + +These events fire for [`<img>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img), [`<iframe>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe), [`<object>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object), [`<embed>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/embed), [`<link>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link), and [SVG `<image>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/SVG_Image_Tag) elements. Unlike browser events, they bubble in React: + +- `onLoad`: An [`Event` handler](#event-handler) function. Fires when the resource has loaded. +- `onLoadCapture`: A version of `onLoad` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onError`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/error_event): An [`Event` handler](#event-handler) function. Fires when the resource could not be loaded. +- `onErrorCapture`: A version of `onError` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) + +These events fire for resources like [`<audio>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio) and [`<video>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video). Unlike browser events, they bubble in React: + +- [`onAbort`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/abort_event): An [`Event` handler](#event-handler) function. Fires when the resource has not fully loaded, but not due to an error. +- `onAbortCapture`: A version of `onAbort` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onCanPlay`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/canplay_event): An [`Event` handler](#event-handler) function. Fires when there's enough data to start playing, but not enough to play to the end without buffering. +- `onCanPlayCapture`: A version of `onCanPlay` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onCanPlayThrough`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/canplaythrough_event): An [`Event` handler](#event-handler) function. Fires when there's enough data that it's likely possible to start playing without buffering until the end. +- `onCanPlayThroughCapture`: A version of `onCanPlayThrough` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onDurationChange`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/durationchange_event): An [`Event` handler](#event-handler) function. Fires when the media duration has updated. +- `onDurationChangeCapture`: A version of `onDurationChange` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onEmptied`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/emptied_event): An [`Event` handler](#event-handler) function. Fires when the media has become empty. +- `onEmptiedCapture`: A version of `onEmptied` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onEncrypted`](https://w3c.github.io/encrypted-media/#dom-evt-encrypted): An [`Event` handler](#event-handler) function. Fires when the browser encounters encrypted media. +- `onEncryptedCapture`: A version of `onEncrypted` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onEnded`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/ended_event): An [`Event` handler](#event-handler) function. Fires when the playback stops because there's nothing left to play. +- `onEndedCapture`: A version of `onEnded` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onError`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/error_event): An [`Event` handler](#event-handler) function. Fires when the resource could not be loaded. +- `onErrorCapture`: A version of `onError` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onLoadedData`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/loadeddata_event): An [`Event` handler](#event-handler) function. Fires when the current playback frame has loaded. +- `onLoadedDataCapture`: A version of `onLoadedData` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onLoadedMetadata`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/loadedmetadata_event): An [`Event` handler](#event-handler) function. Fires when metadata has loaded. +- `onLoadedMetadataCapture`: A version of `onLoadedMetadata` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onLoadStart`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/loadstart_event): An [`Event` handler](#event-handler) function. Fires when the browser started loading the resource. +- `onLoadStartCapture`: A version of `onLoadStart` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onPause`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause_event): An [`Event` handler](#event-handler) function. Fires when the media was paused. +- `onPauseCapture`: A version of `onPause` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onPlay`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play_event): An [`Event` handler](#event-handler) function. Fires when the media is no longer paused. +- `onPlayCapture`: A version of `onPlay` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onPlaying`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/playing_event): An [`Event` handler](#event-handler) function. Fires when the media starts or restarts playing. +- `onPlayingCapture`: A version of `onPlaying` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onProgress`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/progress_event): An [`Event` handler](#event-handler) function. Fires periodically while the resource is loading. +- `onProgressCapture`: A version of `onProgress` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onRateChange`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/ratechange_event): An [`Event` handler](#event-handler) function. Fires when playback rate changes. +- `onRateChangeCapture`: A version of `onRateChange` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- `onResize`: An [`Event` handler](#event-handler) function. Fires when video changes size. +- `onResizeCapture`: A version of `onResize` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onSeeked`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seeked_event): An [`Event` handler](#event-handler) function. Fires when a seek operation completes. +- `onSeekedCapture`: A version of `onSeeked` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onSeeking`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seeking_event): An [`Event` handler](#event-handler) function. Fires when a seek operation starts. +- `onSeekingCapture`: A version of `onSeeking` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onStalled`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/stalled_event): An [`Event` handler](#event-handler) function. Fires when the browser is waiting for data but it keeps not loading. +- `onStalledCapture`: A version of `onStalled` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onSuspend`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/suspend_event): An [`Event` handler](#event-handler) function. Fires when loading the resource was suspended. +- `onSuspendCapture`: A version of `onSuspend` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onTimeUpdate`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/timeupdate_event): An [`Event` handler](#event-handler) function. Fires when the current playback time updates. +- `onTimeUpdateCapture`: A version of `onTimeUpdate` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onVolumeChange`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/volumechange_event): An [`Event` handler](#event-handler) function. Fires when the volume has changed. +- `onVolumeChangeCapture`: A version of `onVolumeChange` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) +- [`onWaiting`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/waiting_event): An [`Event` handler](#event-handler) function. Fires when the playback stopped due to temporary lack of data. +- `onWaitingCapture`: A version of `onWaiting` that fires in the [capture phase.](/learn/responding-to-events#capture-phase-events) + +#### Caveats + +- You cannot pass both `children` and `dangerouslySetInnerHTML` at the same time. +- Some events (like `onAbort` and `onLoad`) don't bubble in the browser, but bubble in React. diff --git a/docs/src/reference/common-types.md b/docs/src/reference/common-types.md deleted file mode 100644 index 950107e6f..000000000 --- a/docs/src/reference/common-types.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Common Types 🚧 ---- diff --git a/docs/src/reference/use-callback.md b/docs/src/reference/use-callback.md index 0eb38f4a4..c4978fb23 100644 --- a/docs/src/reference/use-callback.md +++ b/docs/src/reference/use-callback.md @@ -1,3 +1,952 @@ --- title: Use Callback 🚧 --- + +## Overview + +<p class="intro" markdown> + +`useCallback` is a React Hook that lets you cache a function definition between re-renders. + +```js +const cachedFn = useCallback(fn, dependencies); +``` + +</p> + +--- + +## Reference + +### `useCallback(fn, dependencies)` + +Call `useCallback` at the top level of your component to cache a function definition between re-renders: + +```js +import { useCallback } from 'react'; + +export default function ProductPage({ productId, referrer, theme }) { + const handleSubmit = useCallback((orderDetails) => { + post('/product/' + productId + '/buy', { + referrer, + orderDetails, + }); + }, [productId, referrer]); +``` + +[See more examples below.](#usage) + +#### Parameters + +- `fn`: The function value that you want to cache. It can take any arguments and return any values. React will return (not call!) your function back to you during the initial render. On next renders, React will give you the same function again if the `dependencies` have not changed since the last render. Otherwise, it will give you the function that you have passed during the current render, and store it in case it can be reused later. React will not call your function. The function is returned to you so you can decide when and whether to call it. + +- `dependencies`: The list of all reactive values referenced inside of the `fn` code. Reactive values include props, state, and all the variables and functions declared directly inside your component body. If your linter is [configured for React](/learn/editor-setup#linting), it will verify that every reactive value is correctly specified as a dependency. The list of dependencies must have a constant number of items and be written inline like `[dep1, dep2, dep3]`. React will compare each dependency with its previous value using the [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison algorithm. + +#### Returns + +On the initial render, `useCallback` returns the `fn` function you have passed. + +During subsequent renders, it will either return an already stored `fn` function from the last render (if the dependencies haven't changed), or return the `fn` function you have passed during this render. + +#### Caveats + +- `useCallback` is a Hook, so you can only call it **at the top level of your component** or your own Hooks. You can't call it inside loops or conditions. If you need that, extract a new component and move the state into it. +- React **will not throw away the cached function unless there is a specific reason to do that.** For example, in development, React throws away the cache when you edit the file of your component. Both in development and in production, React will throw away the cache if your component suspends during the initial mount. In the future, React may add more features that take advantage of throwing away the cache--for example, if React adds built-in support for virtualized lists in the future, it would make sense to throw away the cache for items that scroll out of the virtualized table viewport. This should match your expectations if you rely on `useCallback` as a performance optimization. Otherwise, a [state variable](/reference/react/useState#im-trying-to-set-state-to-a-function-but-it-gets-called-instead) or a [ref](/reference/react/useRef#avoiding-recreating-the-ref-contents) may be more appropriate. + +--- + +## Usage + +### Skipping re-rendering of components + +When you optimize rendering performance, you will sometimes need to cache the functions that you pass to child components. Let's first look at the syntax for how to do this, and then see in which cases it's useful. + +To cache a function between re-renders of your component, wrap its definition into the `useCallback` Hook: + +```js +import { useCallback } from 'react'; + +function ProductPage({ productId, referrer, theme }) { + const handleSubmit = useCallback((orderDetails) => { + post('/product/' + productId + '/buy', { + referrer, + orderDetails, + }); + }, [productId, referrer]); + // ... +``` + +You need to pass two things to `useCallback`: + +1. A function definition that you want to cache between re-renders. +2. A <CodeStep step={2}>list of dependencies</CodeStep> including every value within your component that's used inside your function. + +On the initial render, the <CodeStep step={3}>returned function</CodeStep> you'll get from `useCallback` will be the function you passed. + +On the following renders, React will compare the <CodeStep step={2}>dependencies</CodeStep> with the dependencies you passed during the previous render. If none of the dependencies have changed (compared with [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is)), `useCallback` will return the same function as before. Otherwise, `useCallback` will return the function you passed on _this_ render. + +In other words, `useCallback` caches a function between re-renders until its dependencies change. + +**Let's walk through an example to see when this is useful.** + +Say you're passing a `handleSubmit` function down from the `ProductPage` to the `ShippingForm` component: + +```js +function ProductPage({ productId, referrer, theme }) { + // ... + return ( + <div className={theme}> + <ShippingForm onSubmit={handleSubmit} /> + </div> + ); +``` + +You've noticed that toggling the `theme` prop freezes the app for a moment, but if you remove `<ShippingForm />` from your JSX, it feels fast. This tells you that it's worth trying to optimize the `ShippingForm` component. + +**By default, when a component re-renders, React re-renders all of its children recursively.** This is why, when `ProductPage` re-renders with a different `theme`, the `ShippingForm` component _also_ re-renders. This is fine for components that don't require much calculation to re-render. But if you verified a re-render is slow, you can tell `ShippingForm` to skip re-rendering when its props are the same as on last render by wrapping it in [`memo`:](/reference/react/memo) + +```js +import { memo } from "react"; + +const ShippingForm = memo(function ShippingForm({ onSubmit }) { + // ... +}); +``` + +**With this change, `ShippingForm` will skip re-rendering if all of its props are the _same_ as on the last render.** This is when caching a function becomes important! Let's say you defined `handleSubmit` without `useCallback`: + +```js +function ProductPage({ productId, referrer, theme }) { + // Every time the theme changes, this will be a different function... + function handleSubmit(orderDetails) { + post("/product/" + productId + "/buy", { + referrer, + orderDetails, + }); + } + + return ( + <div className={theme}> + {/* ... so ShippingForm's props will never be the same, and it will re-render every time */} + <ShippingForm onSubmit={handleSubmit} /> + </div> + ); +} +``` + +**In JavaScript, a `function () {}` or `() => {}` always creates a _different_ function,** similar to how the `{}` object literal always creates a new object. Normally, this wouldn't be a problem, but it means that `ShippingForm` props will never be the same, and your [`memo`](/reference/react/memo) optimization won't work. This is where `useCallback` comes in handy: + +```js +function ProductPage({ productId, referrer, theme }) { + // Tell React to cache your function between re-renders... + const handleSubmit = useCallback( + (orderDetails) => { + post("/product/" + productId + "/buy", { + referrer, + orderDetails, + }); + }, + [productId, referrer] + ); // ...so as long as these dependencies don't change... + + return ( + <div className={theme}> + {/* ...ShippingForm will receive the same props and can skip re-rendering */} + <ShippingForm onSubmit={handleSubmit} /> + </div> + ); +} +``` + +**By wrapping `handleSubmit` in `useCallback`, you ensure that it's the _same_ function between the re-renders** (until dependencies change). You don't _have to_ wrap a function in `useCallback` unless you do it for some specific reason. In this example, the reason is that you pass it to a component wrapped in [`memo`,](/reference/react/memo) and this lets it skip re-rendering. There are other reasons you might need `useCallback` which are described further on this page. + +<Note> + +**You should only rely on `useCallback` as a performance optimization.** If your code doesn't work without it, find the underlying problem and fix it first. Then you may add `useCallback` back. + +</Note> + +<DeepDive> + +#### How is useCallback related to useMemo? + +You will often see [`useMemo`](/reference/react/useMemo) alongside `useCallback`. They are both useful when you're trying to optimize a child component. They let you [memoize](https://en.wikipedia.org/wiki/Memoization) (or, in other words, cache) something you're passing down: + +```js +import { useMemo, useCallback } from "react"; + +function ProductPage({ productId, referrer }) { + const product = useData("/product/" + productId); + + const requirements = useMemo(() => { + // Calls your function and caches its result + return computeRequirements(product); + }, [product]); + + const handleSubmit = useCallback( + (orderDetails) => { + // Caches your function itself + post("/product/" + productId + "/buy", { + referrer, + orderDetails, + }); + }, + [productId, referrer] + ); + + return ( + <div className={theme}> + <ShippingForm requirements={requirements} onSubmit={handleSubmit} /> + </div> + ); +} +``` + +The difference is in _what_ they're letting you cache: + +- **[`useMemo`](/reference/react/useMemo) caches the _result_ of calling your function.** In this example, it caches the result of calling `computeRequirements(product)` so that it doesn't change unless `product` has changed. This lets you pass the `requirements` object down without unnecessarily re-rendering `ShippingForm`. When necessary, React will call the function you've passed during rendering to calculate the result. +- **`useCallback` caches _the function itself._** Unlike `useMemo`, it does not call the function you provide. Instead, it caches the function you provided so that `handleSubmit` _itself_ doesn't change unless `productId` or `referrer` has changed. This lets you pass the `handleSubmit` function down without unnecessarily re-rendering `ShippingForm`. Your code won't run until the user submits the form. + +If you're already familiar with [`useMemo`,](/reference/react/useMemo) you might find it helpful to think of `useCallback` as this: + +```js +// Simplified implementation (inside React) +function useCallback(fn, dependencies) { + return useMemo(() => fn, dependencies); +} +``` + +[Read more about the difference between `useMemo` and `useCallback`.](/reference/react/useMemo#memoizing-a-function) + +</DeepDive> + +<DeepDive> + +#### Should you add useCallback everywhere? + +If your app is like this site, and most interactions are coarse (like replacing a page or an entire section), memoization is usually unnecessary. On the other hand, if your app is more like a drawing editor, and most interactions are granular (like moving shapes), then you might find memoization very helpful. + +Caching a function with `useCallback` is only valuable in a few cases: + +- You pass it as a prop to a component wrapped in [`memo`.](/reference/react/memo) You want to skip re-rendering if the value hasn't changed. Memoization lets your component re-render only if dependencies changed. +- The function you're passing is later used as a dependency of some Hook. For example, another function wrapped in `useCallback` depends on it, or you depend on this function from [`useEffect.`](/reference/react/useEffect) + +There is no benefit to wrapping a function in `useCallback` in other cases. There is no significant harm to doing that either, so some teams choose to not think about individual cases, and memoize as much as possible. The downside is that code becomes less readable. Also, not all memoization is effective: a single value that's "always new" is enough to break memoization for an entire component. + +Note that `useCallback` does not prevent _creating_ the function. You're always creating a function (and that's fine!), but React ignores it and gives you back a cached function if nothing changed. + +**In practice, you can make a lot of memoization unnecessary by following a few principles:** + +1. When a component visually wraps other components, let it [accept JSX as children.](/learn/passing-props-to-a-component#passing-jsx-as-children) Then, if the wrapper component updates its own state, React knows that its children don't need to re-render. +1. Prefer local state and don't [lift state up](/learn/sharing-state-between-components) any further than necessary. Don't keep transient state like forms and whether an item is hovered at the top of your tree or in a global state library. +1. Keep your [rendering logic pure.](/learn/keeping-components-pure) If re-rendering a component causes a problem or produces some noticeable visual artifact, it's a bug in your component! Fix the bug instead of adding memoization. +1. Avoid [unnecessary Effects that update state.](/learn/you-might-not-need-an-effect) Most performance problems in React apps are caused by chains of updates originating from Effects that cause your components to render over and over. +1. Try to [remove unnecessary dependencies from your Effects.](/learn/removing-effect-dependencies) For example, instead of memoization, it's often simpler to move some object or a function inside an Effect or outside the component. + +If a specific interaction still feels laggy, [use the React Developer Tools profiler](https://legacy.reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html) to see which components benefit the most from memoization, and add memoization where needed. These principles make your components easier to debug and understand, so it's good to follow them in any case. In long term, we're researching [doing memoization automatically](https://www.youtube.com/watch?v=lGEMwh32soc) to solve this once and for all. + +</DeepDive> + +<Recipes titleText="The difference between useCallback and declaring a function directly" titleId="examples-rerendering"> + +#### Skipping re-rendering with `useCallback` and `memo` + +In this example, the `ShippingForm` component is **artificially slowed down** so that you can see what happens when a React component you're rendering is genuinely slow. Try incrementing the counter and toggling the theme. + +Incrementing the counter feels slow because it forces the slowed down `ShippingForm` to re-render. That's expected because the counter has changed, and so you need to reflect the user's new choice on the screen. + +Next, try toggling the theme. **Thanks to `useCallback` together with [`memo`](/reference/react/memo), it’s fast despite the artificial slowdown!** `ShippingForm` skipped re-rendering because the `handleSubmit` function has not changed. The `handleSubmit` function has not changed because both `productId` and `referrer` (your `useCallback` dependencies) haven't changed since last render. + +```js +import { useState } from "react"; +import ProductPage from "./ProductPage.js"; + +export default function App() { + const [isDark, setIsDark] = useState(false); + return ( + <> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Dark mode + </label> + <hr /> + <ProductPage + referrerId="wizard_of_oz" + productId={123} + theme={isDark ? "dark" : "light"} + /> + </> + ); +} +``` + +```js +import { useCallback } from "react"; +import ShippingForm from "./ShippingForm.js"; + +export default function ProductPage({ productId, referrer, theme }) { + const handleSubmit = useCallback( + (orderDetails) => { + post("/product/" + productId + "/buy", { + referrer, + orderDetails, + }); + }, + [productId, referrer] + ); + + return ( + <div className={theme}> + <ShippingForm onSubmit={handleSubmit} /> + </div> + ); +} + +function post(url, data) { + // Imagine this sends a request... + console.log("POST /" + url); + console.log(data); +} +``` + +```js +import { memo, useState } from "react"; + +const ShippingForm = memo(function ShippingForm({ onSubmit }) { + const [count, setCount] = useState(1); + + console.log("[ARTIFICIALLY SLOW] Rendering <ShippingForm />"); + let startTime = performance.now(); + while (performance.now() - startTime < 500) { + // Do nothing for 500 ms to emulate extremely slow code + } + + function handleSubmit(e) { + e.preventDefault(); + const formData = new FormData(e.target); + const orderDetails = { + ...Object.fromEntries(formData), + count, + }; + onSubmit(orderDetails); + } + + return ( + <form onSubmit={handleSubmit}> + <p> + <b> + Note: <code>ShippingForm</code> is artificially slowed down! + </b> + </p> + <label> + Number of items: + <button type="button" onClick={() => setCount(count - 1)}> + – + </button> + {count} + <button type="button" onClick={() => setCount(count + 1)}> + + + </button> + </label> + <label> + Street: + <input name="street" /> + </label> + <label> + City: + <input name="city" /> + </label> + <label> + Postal code: + <input name="zipCode" /> + </label> + <button type="submit">Submit</button> + </form> + ); +}); + +export default ShippingForm; +``` + +```css +label { + display: block; + margin-top: 10px; +} + +input { + margin-left: 5px; +} + +button[type="button"] { + margin: 5px; +} + +.dark { + background-color: black; + color: white; +} + +.light { + background-color: white; + color: black; +} +``` + +#### Always re-rendering a component + +In this example, the `ShippingForm` implementation is also **artificially slowed down** so that you can see what happens when some React component you're rendering is genuinely slow. Try incrementing the counter and toggling the theme. + +Unlike in the previous example, toggling the theme is also slow now! This is because **there is no `useCallback` call in this version,** so `handleSubmit` is always a new function, and the slowed down `ShippingForm` component can't skip re-rendering. + +```js +import { useState } from "react"; +import ProductPage from "./ProductPage.js"; + +export default function App() { + const [isDark, setIsDark] = useState(false); + return ( + <> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Dark mode + </label> + <hr /> + <ProductPage + referrerId="wizard_of_oz" + productId={123} + theme={isDark ? "dark" : "light"} + /> + </> + ); +} +``` + +```js +import ShippingForm from "./ShippingForm.js"; + +export default function ProductPage({ productId, referrer, theme }) { + function handleSubmit(orderDetails) { + post("/product/" + productId + "/buy", { + referrer, + orderDetails, + }); + } + + return ( + <div className={theme}> + <ShippingForm onSubmit={handleSubmit} /> + </div> + ); +} + +function post(url, data) { + // Imagine this sends a request... + console.log("POST /" + url); + console.log(data); +} +``` + +```js +import { memo, useState } from "react"; + +const ShippingForm = memo(function ShippingForm({ onSubmit }) { + const [count, setCount] = useState(1); + + console.log("[ARTIFICIALLY SLOW] Rendering <ShippingForm />"); + let startTime = performance.now(); + while (performance.now() - startTime < 500) { + // Do nothing for 500 ms to emulate extremely slow code + } + + function handleSubmit(e) { + e.preventDefault(); + const formData = new FormData(e.target); + const orderDetails = { + ...Object.fromEntries(formData), + count, + }; + onSubmit(orderDetails); + } + + return ( + <form onSubmit={handleSubmit}> + <p> + <b> + Note: <code>ShippingForm</code> is artificially slowed down! + </b> + </p> + <label> + Number of items: + <button type="button" onClick={() => setCount(count - 1)}> + – + </button> + {count} + <button type="button" onClick={() => setCount(count + 1)}> + + + </button> + </label> + <label> + Street: + <input name="street" /> + </label> + <label> + City: + <input name="city" /> + </label> + <label> + Postal code: + <input name="zipCode" /> + </label> + <button type="submit">Submit</button> + </form> + ); +}); + +export default ShippingForm; +``` + +```css +label { + display: block; + margin-top: 10px; +} + +input { + margin-left: 5px; +} + +button[type="button"] { + margin: 5px; +} + +.dark { + background-color: black; + color: white; +} + +.light { + background-color: white; + color: black; +} +``` + +However, here is the same code **with the artificial slowdown removed.** Does the lack of `useCallback` feel noticeable or not? + +```js +import { useState } from "react"; +import ProductPage from "./ProductPage.js"; + +export default function App() { + const [isDark, setIsDark] = useState(false); + return ( + <> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Dark mode + </label> + <hr /> + <ProductPage + referrerId="wizard_of_oz" + productId={123} + theme={isDark ? "dark" : "light"} + /> + </> + ); +} +``` + +```js +import ShippingForm from "./ShippingForm.js"; + +export default function ProductPage({ productId, referrer, theme }) { + function handleSubmit(orderDetails) { + post("/product/" + productId + "/buy", { + referrer, + orderDetails, + }); + } + + return ( + <div className={theme}> + <ShippingForm onSubmit={handleSubmit} /> + </div> + ); +} + +function post(url, data) { + // Imagine this sends a request... + console.log("POST /" + url); + console.log(data); +} +``` + +```js +import { memo, useState } from "react"; + +const ShippingForm = memo(function ShippingForm({ onSubmit }) { + const [count, setCount] = useState(1); + + console.log("Rendering <ShippingForm />"); + + function handleSubmit(e) { + e.preventDefault(); + const formData = new FormData(e.target); + const orderDetails = { + ...Object.fromEntries(formData), + count, + }; + onSubmit(orderDetails); + } + + return ( + <form onSubmit={handleSubmit}> + <label> + Number of items: + <button type="button" onClick={() => setCount(count - 1)}> + – + </button> + {count} + <button type="button" onClick={() => setCount(count + 1)}> + + + </button> + </label> + <label> + Street: + <input name="street" /> + </label> + <label> + City: + <input name="city" /> + </label> + <label> + Postal code: + <input name="zipCode" /> + </label> + <button type="submit">Submit</button> + </form> + ); +}); + +export default ShippingForm; +``` + +```css +label { + display: block; + margin-top: 10px; +} + +input { + margin-left: 5px; +} + +button[type="button"] { + margin: 5px; +} + +.dark { + background-color: black; + color: white; +} + +.light { + background-color: white; + color: black; +} +``` + +Quite often, code without memoization works fine. If your interactions are fast enough, you don't need memoization. + +Keep in mind that you need to run React in production mode, disable [React Developer Tools](/learn/react-developer-tools), and use devices similar to the ones your app's users have in order to get a realistic sense of what's actually slowing down your app. + +</Recipes> + +--- + +### Updating state from a memoized callback + +Sometimes, you might need to update state based on previous state from a memoized callback. + +This `handleAddTodo` function specifies `todos` as a dependency because it computes the next todos from it: + +```js +function TodoList() { + const [todos, setTodos] = useState([]); + + const handleAddTodo = useCallback((text) => { + const newTodo = { id: nextId++, text }; + setTodos([...todos, newTodo]); + }, [todos]); + // ... +``` + +You'll usually want memoized functions to have as few dependencies as possible. When you read some state only to calculate the next state, you can remove that dependency by passing an [updater function](/reference/react/useState#updating-state-based-on-the-previous-state) instead: + +```js +function TodoList() { + const [todos, setTodos] = useState([]); + + const handleAddTodo = useCallback((text) => { + const newTodo = { id: nextId++, text }; + setTodos(todos => [...todos, newTodo]); + }, []); // ✅ No need for the todos dependency + // ... +``` + +Here, instead of making `todos` a dependency and reading it inside, you pass an instruction about _how_ to update the state (`todos => [...todos, newTodo]`) to React. [Read more about updater functions.](/reference/react/useState#updating-state-based-on-the-previous-state) + +--- + +### Preventing an Effect from firing too often + +Sometimes, you might want to call a function from inside an [Effect:](/learn/synchronizing-with-effects) + +```js +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(''); + + function createOptions() { + return { + serverUrl: 'https://localhost:1234', + roomId: roomId + }; + } + + useEffect(() => { + const options = createOptions(); + const connection = createConnection(); + connection.connect(); + // ... +``` + +This creates a problem. [Every reactive value must be declared as a dependency of your Effect.](/learn/lifecycle-of-reactive-effects#react-verifies-that-you-specified-every-reactive-value-as-a-dependency) However, if you declare `createOptions` as a dependency, it will cause your Effect to constantly reconnect to the chat room: + +```js +useEffect(() => { + const options = createOptions(); + const connection = createConnection(); + connection.connect(); + return () => connection.disconnect(); +}, [createOptions]); // 🔴 Problem: This dependency changes on every render +// ... +``` + +To solve this, you can wrap the function you need to call from an Effect into `useCallback`: + +```js +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(''); + + const createOptions = useCallback(() => { + return { + serverUrl: 'https://localhost:1234', + roomId: roomId + }; + }, [roomId]); // ✅ Only changes when roomId changes + + useEffect(() => { + const options = createOptions(); + const connection = createConnection(); + connection.connect(); + return () => connection.disconnect(); + }, [createOptions]); // ✅ Only changes when createOptions changes + // ... +``` + +This ensures that the `createOptions` function is the same between re-renders if the `roomId` is the same. **However, it's even better to remove the need for a function dependency.** Move your function _inside_ the Effect: + +```js +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(''); + + useEffect(() => { + function createOptions() { // ✅ No need for useCallback or function dependencies! + return { + serverUrl: 'https://localhost:1234', + roomId: roomId + }; + } + + const options = createOptions(); + const connection = createConnection(); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); // ✅ Only changes when roomId changes + // ... +``` + +Now your code is simpler and doesn't need `useCallback`. [Learn more about removing Effect dependencies.](/learn/removing-effect-dependencies#move-dynamic-objects-and-functions-inside-your-effect) + +--- + +### Optimizing a custom Hook + +If you're writing a [custom Hook,](/learn/reusing-logic-with-custom-hooks) it's recommended to wrap any functions that it returns into `useCallback`: + +```js +function useRouter() { + const { dispatch } = useContext(RouterStateContext); + + const navigate = useCallback( + (url) => { + dispatch({ type: "navigate", url }); + }, + [dispatch] + ); + + const goBack = useCallback(() => { + dispatch({ type: "back" }); + }, [dispatch]); + + return { + navigate, + goBack, + }; +} +``` + +This ensures that the consumers of your Hook can optimize their own code when needed. + +--- + +## Troubleshooting + +### Every time my component renders, `useCallback` returns a different function + +Make sure you've specified the dependency array as a second argument! + +If you forget the dependency array, `useCallback` will return a new function every time: + +```js +function ProductPage({ productId, referrer }) { + const handleSubmit = useCallback((orderDetails) => { + post('/product/' + productId + '/buy', { + referrer, + orderDetails, + }); + }); // 🔴 Returns a new function every time: no dependency array + // ... +``` + +This is the corrected version passing the dependency array as a second argument: + +```js +function ProductPage({ productId, referrer }) { + const handleSubmit = useCallback((orderDetails) => { + post('/product/' + productId + '/buy', { + referrer, + orderDetails, + }); + }, [productId, referrer]); // ✅ Does not return a new function unnecessarily + // ... +``` + +If this doesn't help, then the problem is that at least one of your dependencies is different from the previous render. You can debug this problem by manually logging your dependencies to the console: + +```js +const handleSubmit = useCallback( + (orderDetails) => { + // .. + }, + [productId, referrer] +); + +console.log([productId, referrer]); +``` + +You can then right-click on the arrays from different re-renders in the console and select "Store as a global variable" for both of them. Assuming the first one got saved as `temp1` and the second one got saved as `temp2`, you can then use the browser console to check whether each dependency in both arrays is the same: + +```js +Object.is(temp1[0], temp2[0]); // Is the first dependency the same between the arrays? +Object.is(temp1[1], temp2[1]); // Is the second dependency the same between the arrays? +Object.is(temp1[2], temp2[2]); // ... and so on for every dependency ... +``` + +When you find which dependency is breaking memoization, either find a way to remove it, or [memoize it as well.](/reference/react/useMemo#memoizing-a-dependency-of-another-hook) + +--- + +### I need to call `useCallback` for each list item in a loop, but it's not allowed + +Suppose the `Chart` component is wrapped in [`memo`](/reference/react/memo). You want to skip re-rendering every `Chart` in the list when the `ReportList` component re-renders. However, you can't call `useCallback` in a loop: + +```js +function ReportList({ items }) { + return ( + <article> + {items.map((item) => { + // 🔴 You can't call useCallback in a loop like this: + const handleClick = useCallback(() => { + sendReport(item); + }, [item]); + + return ( + <figure key={item.id}> + <Chart onClick={handleClick} /> + </figure> + ); + })} + </article> + ); +} +``` + +Instead, extract a component for an individual item, and put `useCallback` there: + +```js +function ReportList({ items }) { + return ( + <article> + {items.map((item) => ( + <Report key={item.id} item={item} /> + ))} + </article> + ); +} + +function Report({ item }) { + // ✅ Call useCallback at the top level: + const handleClick = useCallback(() => { + sendReport(item); + }, [item]); + + return ( + <figure> + <Chart onClick={handleClick} /> + </figure> + ); +} +``` + +Alternatively, you could remove `useCallback` in the last snippet and instead wrap `Report` itself in [`memo`.](/reference/react/memo) If the `item` prop does not change, `Report` will skip re-rendering, so `Chart` will skip re-rendering too: + +```js +function ReportList({ items }) { + // ... +} + +const Report = memo(function Report({ item }) { + function handleClick() { + sendReport(item); + } + + return ( + <figure> + <Chart onClick={handleClick} /> + </figure> + ); +}); +``` diff --git a/docs/src/reference/use-context.md b/docs/src/reference/use-context.md index f9843a78e..165e8e4bf 100644 --- a/docs/src/reference/use-context.md +++ b/docs/src/reference/use-context.md @@ -1,3 +1,1325 @@ --- title: Use Context 🚧 --- + +## Overview + +<p class="intro" markdown> + +`useContext` is a React Hook that lets you read and subscribe to [context](/learn/passing-data-deeply-with-context) from your component. + +```js +const value = useContext(SomeContext); +``` + +</p> + +--- + +## Reference + +### `useContext(SomeContext)` + +Call `useContext` at the top level of your component to read and subscribe to [context.](/learn/passing-data-deeply-with-context) + +```js +import { useContext } from 'react'; + +function MyComponent() { + const theme = useContext(ThemeContext); + // ... +``` + +[See more examples below.](#usage) + +#### Parameters + +- `SomeContext`: The context that you've previously created with [`createContext`](/reference/react/createContext). The context itself does not hold the information, it only represents the kind of information you can provide or read from components. + +#### Returns + +`useContext` returns the context value for the calling component. It is determined as the `value` passed to the closest `SomeContext.Provider` above the calling component in the tree. If there is no such provider, then the returned value will be the `defaultValue` you have passed to [`createContext`](/reference/react/createContext) for that context. The returned value is always up-to-date. React automatically re-renders components that read some context if it changes. + +#### Caveats + +- `useContext()` call in a component is not affected by providers returned from the _same_ component. The corresponding `<Context.Provider>` **needs to be _above_** the component doing the `useContext()` call. +- React **automatically re-renders** all the children that use a particular context starting from the provider that receives a different `value`. The previous and the next values are compared with the [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison. Skipping re-renders with [`memo`](/reference/react/memo) does not prevent the children receiving fresh context values. +- If your build system produces duplicates modules in the output (which can happen with symlinks), this can break context. Passing something via context only works if `SomeContext` that you use to provide context and `SomeContext` that you use to read it are **_exactly_ the same object**, as determined by a `===` comparison. + +--- + +## Usage + +### Passing data deeply into the tree + +Call `useContext` at the top level of your component to read and subscribe to [context.](/learn/passing-data-deeply-with-context) + +```js +import { useContext } from 'react'; + +function Button() { + const theme = useContext(ThemeContext); + // ... +``` + +`useContext` returns the <CodeStep step={2}>context value</CodeStep> for the <CodeStep step={1}>context</CodeStep> you passed. To determine the context value, React searches the component tree and finds **the closest context provider above** for that particular context. + +To pass context to a `Button`, wrap it or one of its parent components into the corresponding context provider: + +```js +function MyPage() { + return ( + <ThemeContext.Provider value="dark"> + <Form /> + </ThemeContext.Provider> + ); +} + +function Form() { + // ... renders buttons inside ... +} +``` + +It doesn't matter how many layers of components there are between the provider and the `Button`. When a `Button` _anywhere_ inside of `Form` calls `useContext(ThemeContext)`, it will receive `"dark"` as the value. + +<Pitfall> + +`useContext()` always looks for the closest provider _above_ the component that calls it. It searches upwards and **does not** consider providers in the component from which you're calling `useContext()`. + +</Pitfall> + +```js +import { createContext, useContext } from "react"; + +const ThemeContext = createContext(null); + +export default function MyApp() { + return ( + <ThemeContext.Provider value="dark"> + <Form /> + </ThemeContext.Provider> + ); +} + +function Form() { + return ( + <Panel title="Welcome"> + <Button>Sign up</Button> + <Button>Log in</Button> + </Panel> + ); +} + +function Panel({ title, children }) { + const theme = useContext(ThemeContext); + const className = "panel-" + theme; + return ( + <section className={className}> + <h1>{title}</h1> + {children} + </section> + ); +} + +function Button({ children }) { + const theme = useContext(ThemeContext); + const className = "button-" + theme; + return <button className={className}>{children}</button>; +} +``` + +```css +.panel-light, +.panel-dark { + border: 1px solid black; + border-radius: 4px; + padding: 20px; +} +.panel-light { + color: #222; + background: #fff; +} + +.panel-dark { + color: #fff; + background: rgb(23, 32, 42); +} + +.button-light, +.button-dark { + border: 1px solid #777; + padding: 5px; + margin-right: 10px; + margin-top: 10px; +} + +.button-dark { + background: #222; + color: #fff; +} + +.button-light { + background: #fff; + color: #222; +} +``` + +--- + +### Updating data passed via context + +Often, you'll want the context to change over time. To update context, combine it with [state.](/reference/react/useState) Declare a state variable in the parent component, and pass the current state down as the <CodeStep step={2}>context value</CodeStep> to the provider. + +```js +function MyPage() { + const [theme, setTheme] = useState("dark"); + return ( + <ThemeContext.Provider value={theme}> + <Form /> + <Button + onClick={() => { + setTheme("light"); + }} + > + Switch to light theme + </Button> + </ThemeContext.Provider> + ); +} +``` + +Now any `Button` inside of the provider will receive the current `theme` value. If you call `setTheme` to update the `theme` value that you pass to the provider, all `Button` components will re-render with the new `'light'` value. + +<Recipes titleText="Examples of updating context" titleId="examples-basic"> + +#### Updating a value via context + +In this example, the `MyApp` component holds a state variable which is then passed to the `ThemeContext` provider. Checking the "Dark mode" checkbox updates the state. Changing the provided value re-renders all the components using that context. + +```js +import { createContext, useContext, useState } from "react"; + +const ThemeContext = createContext(null); + +export default function MyApp() { + const [theme, setTheme] = useState("light"); + return ( + <ThemeContext.Provider value={theme}> + <Form /> + <label> + <input + type="checkbox" + checked={theme === "dark"} + onChange={(e) => { + setTheme(e.target.checked ? "dark" : "light"); + }} + /> + Use dark mode + </label> + </ThemeContext.Provider> + ); +} + +function Form({ children }) { + return ( + <Panel title="Welcome"> + <Button>Sign up</Button> + <Button>Log in</Button> + </Panel> + ); +} + +function Panel({ title, children }) { + const theme = useContext(ThemeContext); + const className = "panel-" + theme; + return ( + <section className={className}> + <h1>{title}</h1> + {children} + </section> + ); +} + +function Button({ children }) { + const theme = useContext(ThemeContext); + const className = "button-" + theme; + return <button className={className}>{children}</button>; +} +``` + +```css +.panel-light, +.panel-dark { + border: 1px solid black; + border-radius: 4px; + padding: 20px; + margin-bottom: 10px; +} +.panel-light { + color: #222; + background: #fff; +} + +.panel-dark { + color: #fff; + background: rgb(23, 32, 42); +} + +.button-light, +.button-dark { + border: 1px solid #777; + padding: 5px; + margin-right: 10px; + margin-top: 10px; +} + +.button-dark { + background: #222; + color: #fff; +} + +.button-light { + background: #fff; + color: #222; +} +``` + +Note that `value="dark"` passes the `"dark"` string, but `value={theme}` passes the value of the JavaScript `theme` variable with [JSX curly braces.](/learn/javascript-in-jsx-with-curly-braces) Curly braces also let you pass context values that aren't strings. + +#### Updating an object via context + +In this example, there is a `currentUser` state variable which holds an object. You combine `{ currentUser, setCurrentUser }` into a single object and pass it down through the context inside the `value={}`. This lets any component below, such as `LoginButton`, read both `currentUser` and `setCurrentUser`, and then call `setCurrentUser` when needed. + +```js +import { createContext, useContext, useState } from "react"; + +const CurrentUserContext = createContext(null); + +export default function MyApp() { + const [currentUser, setCurrentUser] = useState(null); + return ( + <CurrentUserContext.Provider + value={{ + currentUser, + setCurrentUser, + }} + > + <Form /> + </CurrentUserContext.Provider> + ); +} + +function Form({ children }) { + return ( + <Panel title="Welcome"> + <LoginButton /> + </Panel> + ); +} + +function LoginButton() { + const { currentUser, setCurrentUser } = useContext(CurrentUserContext); + + if (currentUser !== null) { + return <p>You logged in as {currentUser.name}.</p>; + } + + return ( + <Button + onClick={() => { + setCurrentUser({ name: "Advika" }); + }} + > + Log in as Advika + </Button> + ); +} + +function Panel({ title, children }) { + return ( + <section className="panel"> + <h1>{title}</h1> + {children} + </section> + ); +} + +function Button({ children, onClick }) { + return ( + <button className="button" onClick={onClick}> + {children} + </button> + ); +} +``` + +```css +label { + display: block; +} + +.panel { + border: 1px solid black; + border-radius: 4px; + padding: 20px; + margin-bottom: 10px; +} + +.button { + border: 1px solid #777; + padding: 5px; + margin-right: 10px; + margin-top: 10px; +} +``` + +#### Multiple contexts + +In this example, there are two independent contexts. `ThemeContext` provides the current theme, which is a string, while `CurrentUserContext` holds the object representing the current user. + +```js +import { createContext, useContext, useState } from "react"; + +const ThemeContext = createContext(null); +const CurrentUserContext = createContext(null); + +export default function MyApp() { + const [theme, setTheme] = useState("light"); + const [currentUser, setCurrentUser] = useState(null); + return ( + <ThemeContext.Provider value={theme}> + <CurrentUserContext.Provider + value={{ + currentUser, + setCurrentUser, + }} + > + <WelcomePanel /> + <label> + <input + type="checkbox" + checked={theme === "dark"} + onChange={(e) => { + setTheme(e.target.checked ? "dark" : "light"); + }} + /> + Use dark mode + </label> + </CurrentUserContext.Provider> + </ThemeContext.Provider> + ); +} + +function WelcomePanel({ children }) { + const { currentUser } = useContext(CurrentUserContext); + return ( + <Panel title="Welcome"> + {currentUser !== null ? <Greeting /> : <LoginForm />} + </Panel> + ); +} + +function Greeting() { + const { currentUser } = useContext(CurrentUserContext); + return <p>You logged in as {currentUser.name}.</p>; +} + +function LoginForm() { + const { setCurrentUser } = useContext(CurrentUserContext); + const [firstName, setFirstName] = useState(""); + const [lastName, setLastName] = useState(""); + const canLogin = firstName !== "" && lastName !== ""; + return ( + <> + <label> + First name{": "} + <input + required + value={firstName} + onChange={(e) => setFirstName(e.target.value)} + /> + </label> + <label> + Last name{": "} + <input + required + value={lastName} + onChange={(e) => setLastName(e.target.value)} + /> + </label> + <Button + disabled={!canLogin} + onClick={() => { + setCurrentUser({ + name: firstName + " " + lastName, + }); + }} + > + Log in + </Button> + {!canLogin && <i>Fill in both fields.</i>} + </> + ); +} + +function Panel({ title, children }) { + const theme = useContext(ThemeContext); + const className = "panel-" + theme; + return ( + <section className={className}> + <h1>{title}</h1> + {children} + </section> + ); +} + +function Button({ children, disabled, onClick }) { + const theme = useContext(ThemeContext); + const className = "button-" + theme; + return ( + <button className={className} disabled={disabled} onClick={onClick}> + {children} + </button> + ); +} +``` + +```css +label { + display: block; +} + +.panel-light, +.panel-dark { + border: 1px solid black; + border-radius: 4px; + padding: 20px; + margin-bottom: 10px; +} +.panel-light { + color: #222; + background: #fff; +} + +.panel-dark { + color: #fff; + background: rgb(23, 32, 42); +} + +.button-light, +.button-dark { + border: 1px solid #777; + padding: 5px; + margin-right: 10px; + margin-top: 10px; +} + +.button-dark { + background: #222; + color: #fff; +} + +.button-light { + background: #fff; + color: #222; +} +``` + +#### Extracting providers to a component + +As your app grows, it is expected that you'll have a "pyramid" of contexts closer to the root of your app. There is nothing wrong with that. However, if you dislike the nesting aesthetically, you can extract the providers into a single component. In this example, `MyProviders` hides the "plumbing" and renders the children passed to it inside the necessary providers. Note that the `theme` and `setTheme` state is needed in `MyApp` itself, so `MyApp` still owns that piece of the state. + +```js +import { createContext, useContext, useState } from "react"; + +const ThemeContext = createContext(null); +const CurrentUserContext = createContext(null); + +export default function MyApp() { + const [theme, setTheme] = useState("light"); + return ( + <MyProviders theme={theme} setTheme={setTheme}> + <WelcomePanel /> + <label> + <input + type="checkbox" + checked={theme === "dark"} + onChange={(e) => { + setTheme(e.target.checked ? "dark" : "light"); + }} + /> + Use dark mode + </label> + </MyProviders> + ); +} + +function MyProviders({ children, theme, setTheme }) { + const [currentUser, setCurrentUser] = useState(null); + return ( + <ThemeContext.Provider value={theme}> + <CurrentUserContext.Provider + value={{ + currentUser, + setCurrentUser, + }} + > + {children} + </CurrentUserContext.Provider> + </ThemeContext.Provider> + ); +} + +function WelcomePanel({ children }) { + const { currentUser } = useContext(CurrentUserContext); + return ( + <Panel title="Welcome"> + {currentUser !== null ? <Greeting /> : <LoginForm />} + </Panel> + ); +} + +function Greeting() { + const { currentUser } = useContext(CurrentUserContext); + return <p>You logged in as {currentUser.name}.</p>; +} + +function LoginForm() { + const { setCurrentUser } = useContext(CurrentUserContext); + const [firstName, setFirstName] = useState(""); + const [lastName, setLastName] = useState(""); + const canLogin = firstName !== "" && lastName !== ""; + return ( + <> + <label> + First name{": "} + <input + required + value={firstName} + onChange={(e) => setFirstName(e.target.value)} + /> + </label> + <label> + Last name{": "} + <input + required + value={lastName} + onChange={(e) => setLastName(e.target.value)} + /> + </label> + <Button + disabled={!canLogin} + onClick={() => { + setCurrentUser({ + name: firstName + " " + lastName, + }); + }} + > + Log in + </Button> + {!canLogin && <i>Fill in both fields.</i>} + </> + ); +} + +function Panel({ title, children }) { + const theme = useContext(ThemeContext); + const className = "panel-" + theme; + return ( + <section className={className}> + <h1>{title}</h1> + {children} + </section> + ); +} + +function Button({ children, disabled, onClick }) { + const theme = useContext(ThemeContext); + const className = "button-" + theme; + return ( + <button className={className} disabled={disabled} onClick={onClick}> + {children} + </button> + ); +} +``` + +```css +label { + display: block; +} + +.panel-light, +.panel-dark { + border: 1px solid black; + border-radius: 4px; + padding: 20px; + margin-bottom: 10px; +} +.panel-light { + color: #222; + background: #fff; +} + +.panel-dark { + color: #fff; + background: rgb(23, 32, 42); +} + +.button-light, +.button-dark { + border: 1px solid #777; + padding: 5px; + margin-right: 10px; + margin-top: 10px; +} + +.button-dark { + background: #222; + color: #fff; +} + +.button-light { + background: #fff; + color: #222; +} +``` + +#### Scaling up with context and a reducer + +In larger apps, it is common to combine context with a [reducer](/reference/react/useReducer) to extract the logic related to some state out of components. In this example, all the "wiring" is hidden in the `TasksContext.js`, which contains a reducer and two separate contexts. + +Read a [full walkthrough](/learn/scaling-up-with-reducer-and-context) of this example. + +```js +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; +import { TasksProvider } from "./TasksContext.js"; + +export default function TaskApp() { + return ( + <TasksProvider> + <h1>Day off in Kyoto</h1> + <AddTask /> + <TaskList /> + </TasksProvider> + ); +} +``` + +```js +import { createContext, useContext, useReducer } from "react"; + +const TasksContext = createContext(null); + +const TasksDispatchContext = createContext(null); + +export function TasksProvider({ children }) { + const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); + + return ( + <TasksContext.Provider value={tasks}> + <TasksDispatchContext.Provider value={dispatch}> + {children} + </TasksDispatchContext.Provider> + </TasksContext.Provider> + ); +} + +export function useTasks() { + return useContext(TasksContext); +} + +export function useTasksDispatch() { + return useContext(TasksDispatchContext); +} + +function tasksReducer(tasks, action) { + switch (action.type) { + case "added": { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } + case "changed": { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } + case "deleted": { + return tasks.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} + +const initialTasks = [ + { id: 0, text: "Philosopher’s Path", done: true }, + { id: 1, text: "Visit the temple", done: false }, + { id: 2, text: "Drink matcha", done: false }, +]; +``` + +```js +import { useState, useContext } from "react"; +import { useTasksDispatch } from "./TasksContext.js"; + +export default function AddTask() { + const [text, setText] = useState(""); + const dispatch = useTasksDispatch(); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + onClick={() => { + setText(""); + dispatch({ + type: "added", + id: nextId++, + text: text, + }); + }} + > + Add + </button> + </> + ); +} + +let nextId = 3; +``` + +```js +import { useState, useContext } from "react"; +import { useTasks, useTasksDispatch } from "./TasksContext.js"; + +export default function TaskList() { + const tasks = useTasks(); + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task task={task} /> + </li> + ))} + </ul> + ); +} + +function Task({ task }) { + const [isEditing, setIsEditing] = useState(false); + const dispatch = useTasksDispatch(); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + dispatch({ + type: "changed", + task: { + ...task, + text: e.target.value, + }, + }); + }} + /> + <button onClick={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button onClick={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + dispatch({ + type: "changed", + task: { + ...task, + done: e.target.checked, + }, + }); + }} + /> + {taskContent} + <button + onClick={() => { + dispatch({ + type: "deleted", + id: task.id, + }); + }} + > + Delete + </button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +</Recipes> + +--- + +### Specifying a fallback default value + +If React can't find any providers of that particular <CodeStep step={1}>context</CodeStep> in the parent tree, the context value returned by `useContext()` will be equal to the <CodeStep step={3}>default value</CodeStep> that you specified when you [created that context](/reference/react/createContext): + +```js +const ThemeContext = createContext(null); +``` + +The default value **never changes**. If you want to update context, use it with state as [described above.](#updating-data-passed-via-context) + +Often, instead of `null`, there is some more meaningful value you can use as a default, for example: + +```js +const ThemeContext = createContext("light"); +``` + +This way, if you accidentally render some component without a corresponding provider, it won't break. This also helps your components work well in a test environment without setting up a lot of providers in the tests. + +In the example below, the "Toggle theme" button is always light because it's **outside any theme context provider** and the default context theme value is `'light'`. Try editing the default theme to be `'dark'`. + +```js +import { createContext, useContext, useState } from "react"; + +const ThemeContext = createContext("light"); + +export default function MyApp() { + const [theme, setTheme] = useState("light"); + return ( + <> + <ThemeContext.Provider value={theme}> + <Form /> + </ThemeContext.Provider> + <Button + onClick={() => { + setTheme(theme === "dark" ? "light" : "dark"); + }} + > + Toggle theme + </Button> + </> + ); +} + +function Form({ children }) { + return ( + <Panel title="Welcome"> + <Button>Sign up</Button> + <Button>Log in</Button> + </Panel> + ); +} + +function Panel({ title, children }) { + const theme = useContext(ThemeContext); + const className = "panel-" + theme; + return ( + <section className={className}> + <h1>{title}</h1> + {children} + </section> + ); +} + +function Button({ children, onClick }) { + const theme = useContext(ThemeContext); + const className = "button-" + theme; + return ( + <button className={className} onClick={onClick}> + {children} + </button> + ); +} +``` + +```css +.panel-light, +.panel-dark { + border: 1px solid black; + border-radius: 4px; + padding: 20px; + margin-bottom: 10px; +} +.panel-light { + color: #222; + background: #fff; +} + +.panel-dark { + color: #fff; + background: rgb(23, 32, 42); +} + +.button-light, +.button-dark { + border: 1px solid #777; + padding: 5px; + margin-right: 10px; + margin-top: 10px; +} + +.button-dark { + background: #222; + color: #fff; +} + +.button-light { + background: #fff; + color: #222; +} +``` + +--- + +### Overriding context for a part of the tree + +You can override the context for a part of the tree by wrapping that part in a provider with a different value. + +```js +<ThemeContext.Provider value="dark"> + ... + <ThemeContext.Provider value="light"> + <Footer /> + </ThemeContext.Provider> + ... +</ThemeContext.Provider> +``` + +You can nest and override providers as many times as you need. + +<Recipes title="Examples of overriding context"> + +#### Overriding a theme + +Here, the button _inside_ the `Footer` receives a different context value (`"light"`) than the buttons outside (`"dark"`). + +```js +import { createContext, useContext } from "react"; + +const ThemeContext = createContext(null); + +export default function MyApp() { + return ( + <ThemeContext.Provider value="dark"> + <Form /> + </ThemeContext.Provider> + ); +} + +function Form() { + return ( + <Panel title="Welcome"> + <Button>Sign up</Button> + <Button>Log in</Button> + <ThemeContext.Provider value="light"> + <Footer /> + </ThemeContext.Provider> + </Panel> + ); +} + +function Footer() { + return ( + <footer> + <Button>Settings</Button> + </footer> + ); +} + +function Panel({ title, children }) { + const theme = useContext(ThemeContext); + const className = "panel-" + theme; + return ( + <section className={className}> + {title && <h1>{title}</h1>} + {children} + </section> + ); +} + +function Button({ children }) { + const theme = useContext(ThemeContext); + const className = "button-" + theme; + return <button className={className}>{children}</button>; +} +``` + +```css +footer { + margin-top: 20px; + border-top: 1px solid #aaa; +} + +.panel-light, +.panel-dark { + border: 1px solid black; + border-radius: 4px; + padding: 20px; +} +.panel-light { + color: #222; + background: #fff; +} + +.panel-dark { + color: #fff; + background: rgb(23, 32, 42); +} + +.button-light, +.button-dark { + border: 1px solid #777; + padding: 5px; + margin-right: 10px; + margin-top: 10px; +} + +.button-dark { + background: #222; + color: #fff; +} + +.button-light { + background: #fff; + color: #222; +} +``` + +#### Automatically nested headings + +You can "accumulate" information when you nest context providers. In this example, the `Section` component keeps track of the `LevelContext` which specifies the depth of the section nesting. It reads the `LevelContext` from the parent section, and provides the `LevelContext` number increased by one to its children. As a result, the `Heading` component can automatically decide which of the `<h1>`, `<h2>`, `<h3>`, ..., tags to use based on how many `Section` components it is nested inside of. + +Read a [detailed walkthrough](/learn/passing-data-deeply-with-context) of this example. + +```js +import Heading from "./Heading.js"; +import Section from "./Section.js"; + +export default function Page() { + return ( + <Section> + <Heading>Title</Heading> + <Section> + <Heading>Heading</Heading> + <Heading>Heading</Heading> + <Heading>Heading</Heading> + <Section> + <Heading>Sub-heading</Heading> + <Heading>Sub-heading</Heading> + <Heading>Sub-heading</Heading> + <Section> + <Heading>Sub-sub-heading</Heading> + <Heading>Sub-sub-heading</Heading> + <Heading>Sub-sub-heading</Heading> + </Section> + </Section> + </Section> + </Section> + ); +} +``` + +```js +import { useContext } from "react"; +import { LevelContext } from "./LevelContext.js"; + +export default function Section({ children }) { + const level = useContext(LevelContext); + return ( + <section className="section"> + <LevelContext.Provider value={level + 1}> + {children} + </LevelContext.Provider> + </section> + ); +} +``` + +```js +import { useContext } from "react"; +import { LevelContext } from "./LevelContext.js"; + +export default function Heading({ children }) { + const level = useContext(LevelContext); + switch (level) { + case 0: + throw Error("Heading must be inside a Section!"); + case 1: + return <h1>{children}</h1>; + case 2: + return <h2>{children}</h2>; + case 3: + return <h3>{children}</h3>; + case 4: + return <h4>{children}</h4>; + case 5: + return <h5>{children}</h5>; + case 6: + return <h6>{children}</h6>; + default: + throw Error("Unknown level: " + level); + } +} +``` + +```js +import { createContext } from "react"; + +export const LevelContext = createContext(0); +``` + +```css +.section { + padding: 10px; + margin: 5px; + border-radius: 5px; + border: 1px solid #aaa; +} +``` + +</Recipes> + +--- + +### Optimizing re-renders when passing objects and functions + +You can pass any values via context, including objects and functions. + +```js +function MyApp() { + const [currentUser, setCurrentUser] = useState(null); + + function login(response) { + storeCredentials(response.credentials); + setCurrentUser(response.user); + } + + return ( + <AuthContext.Provider value={{ currentUser, login }}> + <Page /> + </AuthContext.Provider> + ); +} +``` + +Here, the <CodeStep step={2}>context value</CodeStep> is a JavaScript object with two properties, one of which is a function. Whenever `MyApp` re-renders (for example, on a route update), this will be a _different_ object pointing at a _different_ function, so React will also have to re-render all components deep in the tree that call `useContext(AuthContext)`. + +In smaller apps, this is not a problem. However, there is no need to re-render them if the underlying data, like `currentUser`, has not changed. To help React take advantage of that fact, you may wrap the `login` function with [`useCallback`](/reference/react/useCallback) and wrap the object creation into [`useMemo`](/reference/react/useMemo). This is a performance optimization: + +```js +import { useCallback, useMemo } from "react"; + +function MyApp() { + const [currentUser, setCurrentUser] = useState(null); + + const login = useCallback((response) => { + storeCredentials(response.credentials); + setCurrentUser(response.user); + }, []); + + const contextValue = useMemo( + () => ({ + currentUser, + login, + }), + [currentUser, login] + ); + + return ( + <AuthContext.Provider value={contextValue}> + <Page /> + </AuthContext.Provider> + ); +} +``` + +As a result of this change, even if `MyApp` needs to re-render, the components calling `useContext(AuthContext)` won't need to re-render unless `currentUser` has changed. + +Read more about [`useMemo`](/reference/react/useMemo#skipping-re-rendering-of-components) and [`useCallback`.](/reference/react/useCallback#skipping-re-rendering-of-components) + +--- + +## Troubleshooting + +### My component doesn't see the value from my provider + +There are a few common ways that this can happen: + +1. You're rendering `<SomeContext.Provider>` in the same component (or below) as where you're calling `useContext()`. Move `<SomeContext.Provider>` _above and outside_ the component calling `useContext()`. +2. You may have forgotten to wrap your component with `<SomeContext.Provider>`, or you might have put it in a different part of the tree than you thought. Check whether the hierarchy is right using [React DevTools.](/learn/react-developer-tools) +3. You might be running into some build issue with your tooling that causes `SomeContext` as seen from the providing component and `SomeContext` as seen by the reading component to be two different objects. This can happen if you use symlinks, for example. You can verify this by assigning them to globals like `window.SomeContext1` and `window.SomeContext2` and then checking whether `window.SomeContext1 === window.SomeContext2` in the console. If they're not the same, fix that issue on the build tool level. + +### I am always getting `undefined` from my context although the default value is different + +You might have a provider without a `value` in the tree: + +```js +// 🚩 Doesn't work: no value prop +<ThemeContext.Provider> + <Button /> +</ThemeContext.Provider> +``` + +If you forget to specify `value`, it's like passing `value={undefined}`. + +You may have also mistakingly used a different prop name by mistake: + +```js +// 🚩 Doesn't work: prop should be called "value" +<ThemeContext.Provider theme={theme}> + <Button /> +</ThemeContext.Provider> +``` + +In both of these cases you should see a warning from React in the console. To fix them, call the prop `value`: + +```js +// ✅ Passing the value prop +<ThemeContext.Provider value={theme}> + <Button /> +</ThemeContext.Provider> +``` + +Note that the [default value from your `createContext(defaultValue)` call](#specifying-a-fallback-default-value) is only used **if there is no matching provider above at all.** If there is a `<SomeContext.Provider value={undefined}>` component somewhere in the parent tree, the component calling `useContext(SomeContext)` _will_ receive `undefined` as the context value. diff --git a/docs/src/reference/use-debug-value.md b/docs/src/reference/use-debug-value.md index a2685d9af..5bbdacf42 100644 --- a/docs/src/reference/use-debug-value.md +++ b/docs/src/reference/use-debug-value.md @@ -1,3 +1,122 @@ --- title: Use Debug Value 🚧 --- + +## Overview + +<p class="intro" markdown> + +`useDebugValue` is a React Hook that lets you add a label to a custom Hook in [React DevTools.](/learn/react-developer-tools) + +```js +useDebugValue(value, format?) +``` + +</p> + +--- + +## Reference + +### `useDebugValue(value, format?)` + +Call `useDebugValue` at the top level of your [custom Hook](/learn/reusing-logic-with-custom-hooks) to display a readable debug value: + +```js +import { useDebugValue } from "react"; + +function useOnlineStatus() { + // ... + useDebugValue(isOnline ? "Online" : "Offline"); + // ... +} +``` + +[See more examples below.](#usage) + +#### Parameters + +- `value`: The value you want to display in React DevTools. It can have any type. +- **optional** `format`: A formatting function. When the component is inspected, React DevTools will call the formatting function with the `value` as the argument, and then display the returned formatted value (which may have any type). If you don't specify the formatting function, the original `value` itself will be displayed. + +#### Returns + +`useDebugValue` does not return anything. + +## Usage + +### Adding a label to a custom Hook + +Call `useDebugValue` at the top level of your [custom Hook](/learn/reusing-logic-with-custom-hooks) to display a readable <CodeStep step={1}>debug value</CodeStep> for [React DevTools.](/learn/react-developer-tools) + +```js +import { useDebugValue } from "react"; + +function useOnlineStatus() { + // ... + useDebugValue(isOnline ? "Online" : "Offline"); + // ... +} +``` + +This gives components calling `useOnlineStatus` a label like `OnlineStatus: "Online"` when you inspect them: + + + +Without the `useDebugValue` call, only the underlying data (in this example, `true`) would be displayed. + +```js +import { useOnlineStatus } from "./useOnlineStatus.js"; + +function StatusBar() { + const isOnline = useOnlineStatus(); + return <h1>{isOnline ? "✅ Online" : "❌ Disconnected"}</h1>; +} + +export default function App() { + return <StatusBar />; +} +``` + +```js +import { useSyncExternalStore, useDebugValue } from "react"; + +export function useOnlineStatus() { + const isOnline = useSyncExternalStore( + subscribe, + () => navigator.onLine, + () => true + ); + useDebugValue(isOnline ? "Online" : "Offline"); + return isOnline; +} + +function subscribe(callback) { + window.addEventListener("online", callback); + window.addEventListener("offline", callback); + return () => { + window.removeEventListener("online", callback); + window.removeEventListener("offline", callback); + }; +} +``` + +<Note> + +Don't add debug values to every custom Hook. It's most valuable for custom Hooks that are part of shared libraries and that have a complex internal data structure that's difficult to inspect. + +</Note> + +--- + +### Deferring formatting of a debug value + +You can also pass a formatting function as the second argument to `useDebugValue`: + +```js +useDebugValue(date, (date) => date.toDateString()); +``` + +Your formatting function will receive the <CodeStep step={1}>debug value</CodeStep> as a parameter and should return a <CodeStep step={2}>formatted display value</CodeStep>. When your component is inspected, React DevTools will call this function and display its result. + +This lets you avoid running potentially expensive formatting logic unless the component is actually inspected. For example, if `date` is a Date value, this avoids calling `toDateString()` on it for every render. diff --git a/docs/src/reference/use-effect.md b/docs/src/reference/use-effect.md index 9b28b65e7..7a73905bb 100644 --- a/docs/src/reference/use-effect.md +++ b/docs/src/reference/use-effect.md @@ -1,3 +1,1864 @@ --- title: Use Effect 🚧 --- + +## Overview + +<p class="intro" markdown> + +`useEffect` is a React Hook that lets you [synchronize a component with an external system.](/learn/synchronizing-with-effects) + +```js +useEffect(setup, dependencies?) +``` + +</p> + +--- + +## Reference + +### `useEffect(setup, dependencies?)` + +Call `useEffect` at the top level of your component to declare an Effect: + +```js +import { useEffect } from "react"; +import { createConnection } from "./chat.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [serverUrl, roomId]); + // ... +} +``` + +[See more examples below.](#usage) + +#### Parameters + +- `setup`: The function with your Effect's logic. Your setup function may also optionally return a _cleanup_ function. When your component is added to the DOM, React will run your setup function. After every re-render with changed dependencies, React will first run the cleanup function (if you provided it) with the old values, and then run your setup function with the new values. After your component is removed from the DOM, React will run your cleanup function. + +- **optional** `dependencies`: The list of all reactive values referenced inside of the `setup` code. Reactive values include props, state, and all the variables and functions declared directly inside your component body. If your linter is [configured for React](/learn/editor-setup#linting), it will verify that every reactive value is correctly specified as a dependency. The list of dependencies must have a constant number of items and be written inline like `[dep1, dep2, dep3]`. React will compare each dependency with its previous value using the [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison. If you omit this argument, your Effect will re-run after every re-render of the component. [See the difference between passing an array of dependencies, an empty array, and no dependencies at all.](#examples-dependencies) + +#### Returns + +`useEffect` returns `undefined`. + +#### Caveats + +- `useEffect` is a Hook, so you can only call it **at the top level of your component** or your own Hooks. You can't call it inside loops or conditions. If you need that, extract a new component and move the state into it. + +- If you're **not trying to synchronize with some external system,** [you probably don't need an Effect.](/learn/you-might-not-need-an-effect) + +- When Strict Mode is on, React will **run one extra development-only setup+cleanup cycle** before the first real setup. This is a stress-test that ensures that your cleanup logic "mirrors" your setup logic and that it stops or undoes whatever the setup is doing. If this causes a problem, [implement the cleanup function.](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development) + +- If some of your dependencies are objects or functions defined inside the component, there is a risk that they will **cause the Effect to re-run more often than needed.** To fix this, remove unnecessary [object](#removing-unnecessary-object-dependencies) and [function](#removing-unnecessary-function-dependencies) dependencies. You can also [extract state updates](#updating-state-based-on-previous-state-from-an-effect) and [non-reactive logic](#reading-the-latest-props-and-state-from-an-effect) outside of your Effect. + +- If your Effect wasn't caused by an interaction (like a click), React will let the browser **paint the updated screen first before running your Effect.** If your Effect is doing something visual (for example, positioning a tooltip), and the delay is noticeable (for example, it flickers), replace `useEffect` with [`useLayoutEffect`.](/reference/react/useLayoutEffect) + +- Even if your Effect was caused by an interaction (like a click), **the browser may repaint the screen before processing the state updates inside your Effect.** Usually, that's what you want. However, if you must block the browser from repainting the screen, you need to replace `useEffect` with [`useLayoutEffect`.](/reference/react/useLayoutEffect) + +- Effects **only run on the client.** They don't run during server rendering. + +--- + +## Usage + +### Connecting to an external system + +Some components need to stay connected to the network, some browser API, or a third-party library, while they are displayed on the page. These systems aren't controlled by React, so they are called _external._ + +To [connect your component to some external system,](/learn/synchronizing-with-effects) call `useEffect` at the top level of your component: + +```js +import { useEffect } from "react"; +import { createConnection } from "./chat.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [serverUrl, roomId]); + // ... +} +``` + +You need to pass two arguments to `useEffect`: + +1. A _setup function_ with <CodeStep step={1}>setup code</CodeStep> that connects to that system. + - It should return a _cleanup function_ with <CodeStep step={2}>cleanup code</CodeStep> that disconnects from that system. +2. A <CodeStep step={3}>list of dependencies</CodeStep> including every value from your component used inside of those functions. + +**React calls your setup and cleanup functions whenever it's necessary, which may happen multiple times:** + +1. Your <CodeStep step={1}>setup code</CodeStep> runs when your component is added to the page _(mounts)_. +2. After every re-render of your component where the <CodeStep step={3}>dependencies</CodeStep> have changed: + - First, your <CodeStep step={2}>cleanup code</CodeStep> runs with the old props and state. + - Then, your <CodeStep step={1}>setup code</CodeStep> runs with the new props and state. +3. Your <CodeStep step={2}>cleanup code</CodeStep> runs one final time after your component is removed from the page _(unmounts)._ + +**Let's illustrate this sequence for the example above.** + +When the `ChatRoom` component above gets added to the page, it will connect to the chat room with the initial `serverUrl` and `roomId`. If either `serverUrl` or `roomId` change as a result of a re-render (say, if the user picks a different chat room in a dropdown), your Effect will _disconnect from the previous room, and connect to the next one._ When the `ChatRoom` component is removed from the page, your Effect will disconnect one last time. + +**To [help you find bugs,](/learn/synchronizing-with-effects#step-3-add-cleanup-if-needed) in development React runs <CodeStep step={1}>setup</CodeStep> and <CodeStep step={2}>cleanup</CodeStep> one extra time before the <CodeStep step={1}>setup</CodeStep>.** This is a stress-test that verifies your Effect's logic is implemented correctly. If this causes visible issues, your cleanup function is missing some logic. The cleanup function should stop or undo whatever the setup function was doing. The rule of thumb is that the user shouldn't be able to distinguish between the setup being called once (as in production) and a _setup_ → _cleanup_ → _setup_ sequence (as in development). [See common solutions.](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development) + +**Try to [write every Effect as an independent process](/learn/lifecycle-of-reactive-effects#each-effect-represents-a-separate-synchronization-process) and [think about a single setup/cleanup cycle at a time.](/learn/lifecycle-of-reactive-effects#thinking-from-the-effects-perspective)** It shouldn't matter whether your component is mounting, updating, or unmounting. When your cleanup logic correctly "mirrors" the setup logic, your Effect is resilient to running setup and cleanup as often as needed. + +<Note> + +An Effect lets you [keep your component synchronized](/learn/synchronizing-with-effects) with some external system (like a chat service). Here, _external system_ means any piece of code that's not controlled by React, such as: + +- A timer managed with <CodeStep step={1}>[`setInterval()`](https://developer.mozilla.org/en-US/docs/Web/API/setInterval)</CodeStep> and <CodeStep step={2}>[`clearInterval()`](https://developer.mozilla.org/en-US/docs/Web/API/clearInterval)</CodeStep>. +- An event subscription using <CodeStep step={1}>[`window.addEventListener()`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)</CodeStep> and <CodeStep step={2}>[`window.removeEventListener()`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener)</CodeStep>. +- A third-party animation library with an API like <CodeStep step={1}>`animation.start()`</CodeStep> and <CodeStep step={2}>`animation.reset()`</CodeStep>. + +**If you're not connecting to any external system, [you probably don't need an Effect.](/learn/you-might-not-need-an-effect)** + +</Note> + +<Recipes titleText="Examples of connecting to an external system" titleId="examples-connecting"> + +#### Connecting to a chat server + +In this example, the `ChatRoom` component uses an Effect to stay connected to an external system defined in `chat.js`. Press "Open chat" to make the `ChatRoom` component appear. This sandbox runs in development mode, so there is an extra connect-and-disconnect cycle, as [explained here.](/learn/synchronizing-with-effects#step-3-add-cleanup-if-needed) Try changing the `roomId` and `serverUrl` using the dropdown and the input, and see how the Effect re-connects to the chat. Press "Close chat" to see the Effect disconnect one last time. + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [roomId, serverUrl]); + + return ( + <> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [show, setShow] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <button onClick={() => setShow(!show)}> + {show ? "Close chat" : "Open chat"} + </button> + {show && <hr />} + {show && <ChatRoom roomId={roomId} />} + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +#### Listening to a global browser event + +In this example, the external system is the browser DOM itself. Normally, you'd specify event listeners with JSX, but you can't listen to the global [`window`](https://developer.mozilla.org/en-US/docs/Web/API/Window) object this way. An Effect lets you connect to the `window` object and listen to its events. Listening to the `pointermove` event lets you track the cursor (or finger) position and update the red dot to move with it. + +```js +import { useState, useEffect } from "react"; + +export default function App() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + + useEffect(() => { + function handleMove(e) { + setPosition({ x: e.clientX, y: e.clientY }); + } + window.addEventListener("pointermove", handleMove); + return () => { + window.removeEventListener("pointermove", handleMove); + }; + }, []); + + return ( + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity: 0.6, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + ); +} +``` + +```css +body { + min-height: 300px; +} +``` + +#### Triggering an animation + +In this example, the external system is the animation library in `animation.js`. It provides a JavaScript class called `FadeInAnimation` that takes a DOM node as an argument and exposes `start()` and `stop()` methods to control the animation. This component [uses a ref](/learn/manipulating-the-dom-with-refs) to access the underlying DOM node. The Effect reads the DOM node from the ref and automatically starts the animation for that node when the component appears. + +```js +import { useState, useEffect, useRef } from "react"; +import { FadeInAnimation } from "./animation.js"; + +function Welcome() { + const ref = useRef(null); + + useEffect(() => { + const animation = new FadeInAnimation(ref.current); + animation.start(1000); + return () => { + animation.stop(); + }; + }, []); + + return ( + <h1 + ref={ref} + style={{ + opacity: 0, + color: "white", + padding: 50, + textAlign: "center", + fontSize: 50, + backgroundImage: + "radial-gradient(circle, rgba(63,94,251,1) 0%, rgba(252,70,107,1) 100%)", + }} + > + Welcome + </h1> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button onClick={() => setShow(!show)}> + {show ? "Remove" : "Show"} + </button> + <hr /> + {show && <Welcome />} + </> + ); +} +``` + +```js +export class FadeInAnimation { + constructor(node) { + this.node = node; + } + start(duration) { + this.duration = duration; + if (this.duration === 0) { + // Jump to end immediately + this.onProgress(1); + } else { + this.onProgress(0); + // Start animating + this.startTime = performance.now(); + this.frameId = requestAnimationFrame(() => this.onFrame()); + } + } + onFrame() { + const timePassed = performance.now() - this.startTime; + const progress = Math.min(timePassed / this.duration, 1); + this.onProgress(progress); + if (progress < 1) { + // We still have more frames to paint + this.frameId = requestAnimationFrame(() => this.onFrame()); + } + } + onProgress(progress) { + this.node.style.opacity = progress; + } + stop() { + cancelAnimationFrame(this.frameId); + this.startTime = null; + this.frameId = null; + this.duration = 0; + } +} +``` + +```css +label, +button { + display: block; + margin-bottom: 20px; +} +html, +body { + min-height: 300px; +} +``` + +#### Controlling a modal dialog + +In this example, the external system is the browser DOM. The `ModalDialog` component renders a [`<dialog>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog) element. It uses an Effect to synchronize the `isOpen` prop to the [`showModal()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/showModal) and [`close()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/close) method calls. + +```js +import { useState } from "react"; +import ModalDialog from "./ModalDialog.js"; + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button onClick={() => setShow(true)}>Open dialog</button> + <ModalDialog isOpen={show}> + Hello there! + <br /> + <button + onClick={() => { + setShow(false); + }} + > + Close + </button> + </ModalDialog> + </> + ); +} +``` + +```js +import { useEffect, useRef } from "react"; + +export default function ModalDialog({ isOpen, children }) { + const ref = useRef(); + + useEffect(() => { + if (!isOpen) { + return; + } + const dialog = ref.current; + dialog.showModal(); + return () => { + dialog.close(); + }; + }, [isOpen]); + + return <dialog ref={ref}>{children}</dialog>; +} +``` + +```css +body { + min-height: 300px; +} +``` + +#### Tracking element visibility + +In this example, the external system is again the browser DOM. The `App` component displays a long list, then a `Box` component, and then another long list. Scroll the list down. Notice that when the `Box` component appears in the viewport, the background color changes to black. To implement this, the `Box` component uses an Effect to manage an [`IntersectionObserver`](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API). This browser API notifies you when the DOM element is visible in the viewport. + +```js +import Box from "./Box.js"; + +export default function App() { + return ( + <> + <LongSection /> + <Box /> + <LongSection /> + <Box /> + <LongSection /> + </> + ); +} + +function LongSection() { + const items = []; + for (let i = 0; i < 50; i++) { + items.push(<li key={i}>Item #{i} (keep scrolling)</li>); + } + return <ul>{items}</ul>; +} +``` + +```js +import { useRef, useEffect } from "react"; + +export default function Box() { + const ref = useRef(null); + + useEffect(() => { + const div = ref.current; + const observer = new IntersectionObserver((entries) => { + const entry = entries[0]; + if (entry.isIntersecting) { + document.body.style.backgroundColor = "black"; + document.body.style.color = "white"; + } else { + document.body.style.backgroundColor = "white"; + document.body.style.color = "black"; + } + }); + observer.observe(div, { + threshold: 1.0, + }); + return () => { + observer.disconnect(); + }; + }, []); + + return ( + <div + ref={ref} + style={{ + margin: 20, + height: 100, + width: 100, + border: "2px solid black", + backgroundColor: "blue", + }} + /> + ); +} +``` + +</Recipes> + +--- + +### Wrapping Effects in custom Hooks + +Effects are an ["escape hatch":](/learn/escape-hatches) you use them when you need to "step outside React" and when there is no better built-in solution for your use case. If you find yourself often needing to manually write Effects, it's usually a sign that you need to extract some [custom Hooks](/learn/reusing-logic-with-custom-hooks) for common behaviors your components rely on. + +For example, this `useChatRoom` custom Hook "hides" the logic of your Effect behind a more declarative API: + +```js +function useChatRoom({ serverUrl, roomId }) { + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, serverUrl]); +} +``` + +Then you can use it from any component like this: + +```js +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState('https://localhost:1234'); + + useChatRoom({ + roomId: roomId, + serverUrl: serverUrl + }); + // ... +``` + +There are also many excellent custom Hooks for every purpose available in the React ecosystem. + +[Learn more about wrapping Effects in custom Hooks.](/learn/reusing-logic-with-custom-hooks) + +<Recipes titleText="Examples of wrapping Effects in custom Hooks" titleId="examples-custom-hooks"> + +#### Custom `useChatRoom` Hook + +This example is identical to one of the [earlier examples,](#examples-connecting) but the logic is extracted to a custom Hook. + +```js +import { useState } from "react"; +import { useChatRoom } from "./useChatRoom.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useChatRoom({ + roomId: roomId, + serverUrl: serverUrl, + }); + + return ( + <> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [show, setShow] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <button onClick={() => setShow(!show)}> + {show ? "Close chat" : "Open chat"} + </button> + {show && <hr />} + {show && <ChatRoom roomId={roomId} />} + </> + ); +} +``` + +```js +import { useEffect } from "react"; +import { createConnection } from "./chat.js"; + +export function useChatRoom({ serverUrl, roomId }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [roomId, serverUrl]); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +#### Custom `useWindowListener` Hook + +This example is identical to one of the [earlier examples,](#examples-connecting) but the logic is extracted to a custom Hook. + +```js +import { useState } from "react"; +import { useWindowListener } from "./useWindowListener.js"; + +export default function App() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + + useWindowListener("pointermove", (e) => { + setPosition({ x: e.clientX, y: e.clientY }); + }); + + return ( + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity: 0.6, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export function useWindowListener(eventType, listener) { + useEffect(() => { + window.addEventListener(eventType, listener); + return () => { + window.removeEventListener(eventType, listener); + }; + }, [eventType, listener]); +} +``` + +```css +body { + min-height: 300px; +} +``` + +#### Custom `useIntersectionObserver` Hook + +This example is identical to one of the [earlier examples,](#examples-connecting) but the logic is partially extracted to a custom Hook. + +```js +import Box from "./Box.js"; + +export default function App() { + return ( + <> + <LongSection /> + <Box /> + <LongSection /> + <Box /> + <LongSection /> + </> + ); +} + +function LongSection() { + const items = []; + for (let i = 0; i < 50; i++) { + items.push(<li key={i}>Item #{i} (keep scrolling)</li>); + } + return <ul>{items}</ul>; +} +``` + +```js +import { useRef, useEffect } from "react"; +import { useIntersectionObserver } from "./useIntersectionObserver.js"; + +export default function Box() { + const ref = useRef(null); + const isIntersecting = useIntersectionObserver(ref); + + useEffect(() => { + if (isIntersecting) { + document.body.style.backgroundColor = "black"; + document.body.style.color = "white"; + } else { + document.body.style.backgroundColor = "white"; + document.body.style.color = "black"; + } + }, [isIntersecting]); + + return ( + <div + ref={ref} + style={{ + margin: 20, + height: 100, + width: 100, + border: "2px solid black", + backgroundColor: "blue", + }} + /> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export function useIntersectionObserver(ref) { + const [isIntersecting, setIsIntersecting] = useState(false); + + useEffect(() => { + const div = ref.current; + const observer = new IntersectionObserver((entries) => { + const entry = entries[0]; + setIsIntersecting(entry.isIntersecting); + }); + observer.observe(div, { + threshold: 1.0, + }); + return () => { + observer.disconnect(); + }; + }, [ref]); + + return isIntersecting; +} +``` + +</Recipes> + +--- + +### Controlling a non-React widget + +Sometimes, you want to keep an external system synchronized to some prop or state of your component. + +For example, if you have a third-party map widget or a video player component written without React, you can use an Effect to call methods on it that make its state match the current state of your React component. This Effect creates an instance of a `MapWidget` class defined in `map-widget.js`. When you change the `zoomLevel` prop of the `Map` component, the Effect calls the `setZoom()` on the class instance to keep it synchronized: + +```json package.json hidden +{ + "dependencies": { + "leaflet": "1.9.1", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "remarkable": "2.0.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState } from "react"; +import Map from "./Map.js"; + +export default function App() { + const [zoomLevel, setZoomLevel] = useState(0); + return ( + <> + Zoom level: {zoomLevel}x + <button onClick={() => setZoomLevel(zoomLevel + 1)}>+</button> + <button onClick={() => setZoomLevel(zoomLevel - 1)}>-</button> + <hr /> + <Map zoomLevel={zoomLevel} /> + </> + ); +} +``` + +```js +import { useRef, useEffect } from "react"; +import { MapWidget } from "./map-widget.js"; + +export default function Map({ zoomLevel }) { + const containerRef = useRef(null); + const mapRef = useRef(null); + + useEffect(() => { + if (mapRef.current === null) { + mapRef.current = new MapWidget(containerRef.current); + } + + const map = mapRef.current; + map.setZoom(zoomLevel); + }, [zoomLevel]); + + return <div style={{ width: 200, height: 200 }} ref={containerRef} />; +} +``` + +```js +import "leaflet/dist/leaflet.css"; +import * as L from "leaflet"; + +export class MapWidget { + constructor(domNode) { + this.map = L.map(domNode, { + zoomControl: false, + doubleClickZoom: false, + boxZoom: false, + keyboard: false, + scrollWheelZoom: false, + zoomAnimation: false, + touchZoom: false, + zoomSnap: 0.1, + }); + L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", { + maxZoom: 19, + attribution: "© OpenStreetMap", + }).addTo(this.map); + this.map.setView([0, 0], 0); + } + setZoom(level) { + this.map.setZoom(level); + } +} +``` + +```css +button { + margin: 5px; +} +``` + +In this example, a cleanup function is not needed because the `MapWidget` class manages only the DOM node that was passed to it. After the `Map` React component is removed from the tree, both the DOM node and the `MapWidget` class instance will be automatically garbage-collected by the browser JavaScript engine. + +--- + +### Fetching data with Effects + +You can use an Effect to fetch data for your component. Note that [if you use a framework,](/learn/start-a-new-react-project#production-grade-react-frameworks) using your framework's data fetching mechanism will be a lot more efficient than writing Effects manually. + +If you want to fetch data from an Effect manually, your code might look like this: + +```js +import { useState, useEffect } from 'react'; +import { fetchBio } from './api.js'; + +export default function Page() { + const [person, setPerson] = useState('Alice'); + const [bio, setBio] = useState(null); + + useEffect(() => { + let ignore = false; + setBio(null); + fetchBio(person).then(result => { + if (!ignore) { + setBio(result); + } + }); + return () => { + ignore = true; + }; + }, [person]); + + // ... +``` + +Note the `ignore` variable which is initialized to `false`, and is set to `true` during cleanup. This ensures [your code doesn't suffer from "race conditions":](https://maxrozen.com/race-conditions-fetching-data-react-with-useeffect) network responses may arrive in a different order than you sent them. + +```js +import { useState, useEffect } from "react"; +import { fetchBio } from "./api.js"; + +export default function Page() { + const [person, setPerson] = useState("Alice"); + const [bio, setBio] = useState(null); + useEffect(() => { + let ignore = false; + setBio(null); + fetchBio(person).then((result) => { + if (!ignore) { + setBio(result); + } + }); + return () => { + ignore = true; + }; + }, [person]); + + return ( + <> + <select + value={person} + onChange={(e) => { + setPerson(e.target.value); + }} + > + <option value="Alice">Alice</option> + <option value="Bob">Bob</option> + <option value="Taylor">Taylor</option> + </select> + <hr /> + <p> + <i>{bio ?? "Loading..."}</i> + </p> + </> + ); +} +``` + +```js +export async function fetchBio(person) { + const delay = person === "Bob" ? 2000 : 200; + return new Promise((resolve) => { + setTimeout(() => { + resolve("This is " + person + "’s bio."); + }, delay); + }); +} +``` + +You can also rewrite using the [`async` / `await`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function) syntax, but you still need to provide a cleanup function: + +```js +import { useState, useEffect } from "react"; +import { fetchBio } from "./api.js"; + +export default function Page() { + const [person, setPerson] = useState("Alice"); + const [bio, setBio] = useState(null); + useEffect(() => { + async function startFetching() { + setBio(null); + const result = await fetchBio(person); + if (!ignore) { + setBio(result); + } + } + + let ignore = false; + startFetching(); + return () => { + ignore = true; + }; + }, [person]); + + return ( + <> + <select + value={person} + onChange={(e) => { + setPerson(e.target.value); + }} + > + <option value="Alice">Alice</option> + <option value="Bob">Bob</option> + <option value="Taylor">Taylor</option> + </select> + <hr /> + <p> + <i>{bio ?? "Loading..."}</i> + </p> + </> + ); +} +``` + +```js +export async function fetchBio(person) { + const delay = person === "Bob" ? 2000 : 200; + return new Promise((resolve) => { + setTimeout(() => { + resolve("This is " + person + "’s bio."); + }, delay); + }); +} +``` + +Writing data fetching directly in Effects gets repetitive and makes it difficult to add optimizations like caching and server rendering later. [It's easier to use a custom Hook--either your own or maintained by the community.](/learn/reusing-logic-with-custom-hooks#when-to-use-custom-hooks) + +<DeepDive> + +#### What are good alternatives to data fetching in Effects? + +Writing `fetch` calls inside Effects is a [popular way to fetch data](https://www.robinwieruch.de/react-hooks-fetch-data/), especially in fully client-side apps. This is, however, a very manual approach and it has significant downsides: + +- **Effects don't run on the server.** This means that the initial server-rendered HTML will only include a loading state with no data. The client computer will have to download all JavaScript and render your app only to discover that now it needs to load the data. This is not very efficient. +- **Fetching directly in Effects makes it easy to create "network waterfalls".** You render the parent component, it fetches some data, renders the child components, and then they start fetching their data. If the network is not very fast, this is significantly slower than fetching all data in parallel. +- **Fetching directly in Effects usually means you don't preload or cache data.** For example, if the component unmounts and then mounts again, it would have to fetch the data again. +- **It's not very ergonomic.** There's quite a bit of boilerplate code involved when writing `fetch` calls in a way that doesn't suffer from bugs like [race conditions.](https://maxrozen.com/race-conditions-fetching-data-react-with-useeffect) + +This list of downsides is not specific to React. It applies to fetching data on mount with any library. Like with routing, data fetching is not trivial to do well, so we recommend the following approaches: + +- **If you use a [framework](/learn/start-a-new-react-project#production-grade-react-frameworks), use its built-in data fetching mechanism.** Modern React frameworks have integrated data fetching mechanisms that are efficient and don't suffer from the above pitfalls. +- **Otherwise, consider using or building a client-side cache.** Popular open source solutions include [React Query](https://react-query.tanstack.com/), [useSWR](https://swr.vercel.app/), and [React Router 6.4+.](https://beta.reactrouter.com/en/main/start/overview) You can build your own solution too, in which case you would use Effects under the hood but also add logic for deduplicating requests, caching responses, and avoiding network waterfalls (by preloading data or hoisting data requirements to routes). + +You can continue fetching data directly in Effects if neither of these approaches suit you. + +</DeepDive> + +--- + +### Specifying reactive dependencies + +**Notice that you can't "choose" the dependencies of your Effect.** Every <CodeStep step={2}>reactive value</CodeStep> used by your Effect's code must be declared as a dependency. Your Effect's dependency list is determined by the surrounding code: + +```js +function ChatRoom({ roomId }) { + // This is a reactive value + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); // This is a reactive value too + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); // This Effect reads these reactive values + connection.connect(); + return () => connection.disconnect(); + }, [serverUrl, roomId]); // ✅ So you must specify them as dependencies of your Effect + // ... +} +``` + +If either `serverUrl` or `roomId` change, your Effect will reconnect to the chat using the new values. + +**[Reactive values](/learn/lifecycle-of-reactive-effects#effects-react-to-reactive-values) include props and all variables and functions declared directly inside of your component.** Since `roomId` and `serverUrl` are reactive values, you can't remove them from the dependencies. If you try to omit them and [your linter is correctly configured for React,](/learn/editor-setup#linting) the linter will flag this as a mistake you need to fix: + +```js +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, []); // 🔴 React Hook useEffect has missing dependencies: 'roomId' and 'serverUrl' + // ... +} +``` + +**To remove a dependency, you need to ["prove" to the linter that it _doesn't need_ to be a dependency.](/learn/removing-effect-dependencies#removing-unnecessary-dependencies)** For example, you can move `serverUrl` out of your component to prove that it's not reactive and won't change on re-renders: + +```js +const serverUrl = "https://localhost:1234"; // Not a reactive value anymore + +function ChatRoom({ roomId }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); // ✅ All dependencies declared + // ... +} +``` + +Now that `serverUrl` is not a reactive value (and can't change on a re-render), it doesn't need to be a dependency. **If your Effect's code doesn't use any reactive values, its dependency list should be empty (`[]`):** + +```js +const serverUrl = "https://localhost:1234"; // Not a reactive value anymore +const roomId = "music"; // Not a reactive value anymore + +function ChatRoom() { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, []); // ✅ All dependencies declared + // ... +} +``` + +[An Effect with empty dependencies](/learn/lifecycle-of-reactive-effects#what-an-effect-with-empty-dependencies-means) doesn't re-run when any of your component's props or state change. + +<Pitfall> + +If you have an existing codebase, you might have some Effects that suppress the linter like this: + +```js +useEffect(() => { + // ... + // 🔴 Avoid suppressing the linter like this: + // eslint-ignore-next-line react-hooks/exhaustive-deps +}, []); +``` + +**When dependencies don't match the code, there is a high risk of introducing bugs.** By suppressing the linter, you "lie" to React about the values your Effect depends on. [Instead, prove they're unnecessary.](/learn/removing-effect-dependencies#removing-unnecessary-dependencies) + +</Pitfall> + +<Recipes titleText="Examples of passing reactive dependencies" titleId="examples-dependencies"> + +#### Passing a dependency array + +If you specify the dependencies, your Effect runs **after the initial render _and_ after re-renders with changed dependencies.** + +```js +useEffect(() => { + // ... +}, [a, b]); // Runs again if a or b are different +``` + +In the below example, `serverUrl` and `roomId` are [reactive values,](/learn/lifecycle-of-reactive-effects#effects-react-to-reactive-values) so they both must be specified as dependencies. As a result, selecting a different room in the dropdown or editing the server URL input causes the chat to re-connect. However, since `message` isn't used in the Effect (and so it isn't a dependency), editing the message doesn't re-connect to the chat. + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + const [message, setMessage] = useState(""); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [serverUrl, roomId]); + + return ( + <> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + <label> + Your message:{" "} + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </label> + </> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + <button onClick={() => setShow(!show)}>{show ? "Close chat" : "Open chat"}</button> + </label> + {show && <hr />} + {show && <ChatRoom roomId={roomId} />} + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + margin-bottom: 10px; +} +button { + margin-left: 5px; +} +``` + +#### Passing an empty dependency array + +If your Effect truly doesn't use any reactive values, it will only run **after the initial render.** + +```js +useEffect(() => { + // ... +}, []); // Does not run again (except once in development) +``` + +**Even with empty dependencies, setup and cleanup will [run one extra time in development](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development) to help you find bugs.** + +In this example, both `serverUrl` and `roomId` are hardcoded. Since they're declared outside the component, they are not reactive values, and so they aren't dependencies. The dependency list is empty, so the Effect doesn't re-run on re-renders. + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; +const roomId = "music"; + +function ChatRoom() { + const [message, setMessage] = useState(""); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, []); + + return ( + <> + <h1>Welcome to the {roomId} room!</h1> + <label> + Your message:{" "} + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </label> + </> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button onClick={() => setShow(!show)}> + {show ? "Close chat" : "Open chat"} + </button> + {show && <hr />} + {show && <ChatRoom />} + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +#### Passing no dependency array at all + +If you pass no dependency array at all, your Effect runs **after every single render (and re-render)** of your component. + +```js +useEffect(() => { + // ... +}); // Always runs again +``` + +In this example, the Effect re-runs when you change `serverUrl` and `roomId`, which is sensible. However, it _also_ re-runs when you change the `message`, which is probably undesirable. This is why usually you'll specify the dependency array. + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + const [message, setMessage] = useState(""); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }); // No dependency array at all + + return ( + <> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + <label> + Your message:{" "} + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </label> + </> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + <button onClick={() => setShow(!show)}>{show ? "Close chat" : "Open chat"}</button> + </label> + {show && <hr />} + {show && <ChatRoom roomId={roomId} />} + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + margin-bottom: 10px; +} +button { + margin-left: 5px; +} +``` + +</Recipes> + +--- + +### Updating state based on previous state from an Effect + +When you want to update state based on previous state from an Effect, you might run into a problem: + +```js +function Counter() { + const [count, setCount] = useState(0); + + useEffect(() => { + const intervalId = setInterval(() => { + setCount(count + 1); // You want to increment the counter every second... + }, 1000); + return () => clearInterval(intervalId); + }, [count]); // 🚩 ... but specifying `count` as a dependency always resets the interval. + // ... +} +``` + +Since `count` is a reactive value, it must be specified in the list of dependencies. However, that causes the Effect to cleanup and setup again every time the `count` changes. This is not ideal. + +To fix this, [pass the `c => c + 1` state updater](/reference/react/useState#updating-state-based-on-the-previous-state) to `setCount`: + +```js +import { useState, useEffect } from "react"; + +export default function Counter() { + const [count, setCount] = useState(0); + + useEffect(() => { + const intervalId = setInterval(() => { + setCount((c) => c + 1); // ✅ Pass a state updater + }, 1000); + return () => clearInterval(intervalId); + }, []); // ✅ Now count is not a dependency + + return <h1>{count}</h1>; +} +``` + +```css +label { + display: block; + margin-top: 20px; + margin-bottom: 20px; +} + +body { + min-height: 150px; +} +``` + +Now that you're passing `c => c + 1` instead of `count + 1`, [your Effect no longer needs to depend on `count`.](/learn/removing-effect-dependencies#are-you-reading-some-state-to-calculate-the-next-state) As a result of this fix, it won't need to cleanup and setup the interval again every time the `count` changes. + +--- + +### Removing unnecessary object dependencies + +If your Effect depends on an object or a function created during rendering, it might run too often. For example, this Effect re-connects after every render because the `options` object is [different for every render:](/learn/removing-effect-dependencies#does-some-reactive-value-change-unintentionally) + +```js +const serverUrl = 'https://localhost:1234'; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(''); + + const options = { // 🚩 This object is created from scratch on every re-render + serverUrl: serverUrl, + roomId: roomId + }; + + useEffect(() => { + const connection = createConnection(options); // It's used inside the Effect + connection.connect(); + return () => connection.disconnect(); + }, [options]); // 🚩 As a result, these dependencies are always different on a re-render + // ... +``` + +Avoid using an object created during rendering as a dependency. Instead, create the object inside the Effect: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(""); + + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + + return ( + <> + <h1>Welcome to the {roomId} room!</h1> + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +export function createConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +Now that you create the `options` object inside the Effect, the Effect itself only depends on the `roomId` string. + +With this fix, typing into the input doesn't reconnect the chat. Unlike an object which gets re-created, a string like `roomId` doesn't change unless you set it to another value. [Read more about removing dependencies.](/learn/removing-effect-dependencies) + +--- + +### Removing unnecessary function dependencies + +If your Effect depends on an object or a function created during rendering, it might run too often. For example, this Effect re-connects after every render because the `createOptions` function is [different for every render:](/learn/removing-effect-dependencies#does-some-reactive-value-change-unintentionally) + +```js +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(''); + + function createOptions() { // 🚩 This function is created from scratch on every re-render + return { + serverUrl: serverUrl, + roomId: roomId + }; + } + + useEffect(() => { + const options = createOptions(); // It's used inside the Effect + const connection = createConnection(); + connection.connect(); + return () => connection.disconnect(); + }, [createOptions]); // 🚩 As a result, these dependencies are always different on a re-render + // ... +``` + +By itself, creating a function from scratch on every re-render is not a problem. You don't need to optimize that. However, if you use it as a dependency of your Effect, it will cause your Effect to re-run after every re-render. + +Avoid using a function created during rendering as a dependency. Instead, declare it inside the Effect: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(""); + + useEffect(() => { + function createOptions() { + return { + serverUrl: serverUrl, + roomId: roomId, + }; + } + + const options = createOptions(); + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + + return ( + <> + <h1>Welcome to the {roomId} room!</h1> + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +export function createConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +Now that you define the `createOptions` function inside the Effect, the Effect itself only depends on the `roomId` string. With this fix, typing into the input doesn't reconnect the chat. Unlike a function which gets re-created, a string like `roomId` doesn't change unless you set it to another value. [Read more about removing dependencies.](/learn/removing-effect-dependencies) + +--- + +### Reading the latest props and state from an Effect + +<Wip> + +This section describes an **experimental API that has not yet been released** in a stable version of React. + +</Wip> + +By default, when you read a reactive value from an Effect, you have to add it as a dependency. This ensures that your Effect "reacts" to every change of that value. For most dependencies, that's the behavior you want. + +**However, sometimes you'll want to read the _latest_ props and state from an Effect without "reacting" to them.** For example, imagine you want to log the number of the items in the shopping cart for every page visit: + +```js +function Page({ url, shoppingCart }) { + useEffect(() => { + logVisit(url, shoppingCart.length); + }, [url, shoppingCart]); // ✅ All dependencies declared + // ... +} +``` + +**What if you want to log a new page visit after every `url` change, but _not_ if only the `shoppingCart` changes?** You can't exclude `shoppingCart` from dependencies without breaking the [reactivity rules.](#specifying-reactive-dependencies) However, you can express that you _don't want_ a piece of code to "react" to changes even though it is called from inside an Effect. [Declare an _Effect Event_](/learn/separating-events-from-effects#declaring-an-effect-event) with the [`useEffectEvent`](/reference/react/experimental_useEffectEvent) Hook, and move the code reading `shoppingCart` inside of it: + +```js +function Page({ url, shoppingCart }) { + const onVisit = useEffectEvent((visitedUrl) => { + logVisit(visitedUrl, shoppingCart.length); + }); + + useEffect(() => { + onVisit(url); + }, [url]); // ✅ All dependencies declared + // ... +} +``` + +**Effect Events are not reactive and must always be omitted from dependencies of your Effect.** This is what lets you put non-reactive code (where you can read the latest value of some props and state) inside of them. By reading `shoppingCart` inside of `onVisit`, you ensure that `shoppingCart` won't re-run your Effect. + +[Read more about how Effect Events let you separate reactive and non-reactive code.](/learn/separating-events-from-effects#reading-latest-props-and-state-with-effect-events) + +--- + +### Displaying different content on the server and the client + +If your app uses server rendering (either [directly](/reference/react-dom/server) or via a [framework](/learn/start-a-new-react-project#production-grade-react-frameworks)), your component will render in two different environments. On the server, it will render to produce the initial HTML. On the client, React will run the rendering code again so that it can attach your event handlers to that HTML. This is why, for [hydration](/reference/react-dom/client/hydrateRoot#hydrating-server-rendered-html) to work, your initial render output must be identical on the client and the server. + +In rare cases, you might need to display different content on the client. For example, if your app reads some data from [`localStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage), it can't possibly do that on the server. Here is how you could implement this: + +```js +function MyComponent() { + const [didMount, setDidMount] = useState(false); + + useEffect(() => { + setDidMount(true); + }, []); + + if (didMount) { + // ... return client-only JSX ... + } else { + // ... return initial JSX ... + } +} +``` + +While the app is loading, the user will see the initial render output. Then, when it's loaded and hydrated, your Effect will run and set `didMount` to `true`, triggering a re-render. This will switch to the client-only render output. Effects don't run on the server, so this is why `didMount` was `false` during the initial server render. + +Use this pattern sparingly. Keep in mind that users with a slow connection will see the initial content for quite a bit of time--potentially, many seconds--so you don't want to make jarring changes to your component's appearance. In many cases, you can avoid the need for this by conditionally showing different things with CSS. + +--- + +## Troubleshooting + +### My Effect runs twice when the component mounts + +When Strict Mode is on, in development, React runs setup and cleanup one extra time before the actual setup. + +This is a stress-test that verifies your Effect’s logic is implemented correctly. If this causes visible issues, your cleanup function is missing some logic. The cleanup function should stop or undo whatever the setup function was doing. The rule of thumb is that the user shouldn’t be able to distinguish between the setup being called once (as in production) and a setup → cleanup → setup sequence (as in development). + +Read more about [how this helps find bugs](/learn/synchronizing-with-effects#step-3-add-cleanup-if-needed) and [how to fix your logic.](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development) + +--- + +### My Effect runs after every re-render + +First, check that you haven't forgotten to specify the dependency array: + +```js +useEffect(() => { + // ... +}); // 🚩 No dependency array: re-runs after every render! +``` + +If you've specified the dependency array but your Effect still re-runs in a loop, it's because one of your dependencies is different on every re-render. + +You can debug this problem by manually logging your dependencies to the console: + +```js +useEffect(() => { + // .. +}, [serverUrl, roomId]); + +console.log([serverUrl, roomId]); +``` + +You can then right-click on the arrays from different re-renders in the console and select "Store as a global variable" for both of them. Assuming the first one got saved as `temp1` and the second one got saved as `temp2`, you can then use the browser console to check whether each dependency in both arrays is the same: + +```js +Object.is(temp1[0], temp2[0]); // Is the first dependency the same between the arrays? +Object.is(temp1[1], temp2[1]); // Is the second dependency the same between the arrays? +Object.is(temp1[2], temp2[2]); // ... and so on for every dependency ... +``` + +When you find the dependency that is different on every re-render, you can usually fix it in one of these ways: + +- [Updating state based on previous state from an Effect](#updating-state-based-on-previous-state-from-an-effect) +- [Removing unnecessary object dependencies](#removing-unnecessary-object-dependencies) +- [Removing unnecessary function dependencies](#removing-unnecessary-function-dependencies) +- [Reading the latest props and state from an Effect](#reading-the-latest-props-and-state-from-an-effect) + +As a last resort (if these methods didn't help), wrap its creation with [`useMemo`](/reference/react/useMemo#memoizing-a-dependency-of-another-hook) or [`useCallback`](/reference/react/useCallback#preventing-an-effect-from-firing-too-often) (for functions). + +--- + +### My Effect keeps re-running in an infinite cycle + +If your Effect runs in an infinite cycle, these two things must be true: + +- Your Effect is updating some state. +- That state leads to a re-render, which causes the Effect's dependencies to change. + +Before you start fixing the problem, ask yourself whether your Effect is connecting to some external system (like DOM, network, a third-party widget, and so on). Why does your Effect need to set state? Does it synchronize with that external system? Or are you trying to manage your application's data flow with it? + +If there is no external system, consider whether [removing the Effect altogether](/learn/you-might-not-need-an-effect) would simplify your logic. + +If you're genuinely synchronizing with some external system, think about why and under what conditions your Effect should update the state. Has something changed that affects your component's visual output? If you need to keep track of some data that isn't used by rendering, a [ref](/reference/react/useRef#referencing-a-value-with-a-ref) (which doesn't trigger re-renders) might be more appropriate. Verify your Effect doesn't update the state (and trigger re-renders) more than needed. + +Finally, if your Effect is updating the state at the right time, but there is still a loop, it's because that state update leads to one of the Effect's dependencies changing. [Read how to debug dependency changes.](/reference/react/useEffect#my-effect-runs-after-every-re-render) + +--- + +### My cleanup logic runs even though my component didn't unmount + +The cleanup function runs not only during unmount, but before every re-render with changed dependencies. Additionally, in development, React [runs setup+cleanup one extra time immediately after component mounts.](#my-effect-runs-twice-when-the-component-mounts) + +If you have cleanup code without corresponding setup code, it's usually a code smell: + +```js +useEffect(() => { + // 🔴 Avoid: Cleanup logic without corresponding setup logic + return () => { + doSomething(); + }; +}, []); +``` + +Your cleanup logic should be "symmetrical" to the setup logic, and should stop or undo whatever setup did: + +```js +useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; +}, [serverUrl, roomId]); +``` + +[Learn how the Effect lifecycle is different from the component's lifecycle.](/learn/lifecycle-of-reactive-effects#the-lifecycle-of-an-effect) + +--- + +### My Effect does something visual, and I see a flicker before it runs + +If your Effect must block the browser from [painting the screen,](/learn/render-and-commit#epilogue-browser-paint) replace `useEffect` with [`useLayoutEffect`](/reference/react/useLayoutEffect). Note that **this shouldn't be needed for the vast majority of Effects.** You'll only need this if it's crucial to run your Effect before the browser paint: for example, to measure and position a tooltip before the user sees it. diff --git a/docs/src/reference/use-id.md b/docs/src/reference/use-id.md new file mode 100644 index 000000000..804738e7c --- /dev/null +++ b/docs/src/reference/use-id.md @@ -0,0 +1,286 @@ +--- +title: Use ID 🚫 +--- + +## Overview + +<p class="intro" markdown> + +`useId` is a React Hook for generating unique IDs that can be passed to accessibility attributes. + +```js +const id = useId(); +``` + +</p> + +--- + +## Reference + +### `useId()` + +Call `useId` at the top level of your component to generate a unique ID: + +```js +import { useId } from 'react'; + +function PasswordField() { + const passwordHintId = useId(); + // ... +``` + +[See more examples below.](#usage) + +#### Parameters + +`useId` does not take any parameters. + +#### Returns + +`useId` returns a unique ID string associated with this particular `useId` call in this particular component. + +#### Caveats + +- `useId` is a Hook, so you can only call it **at the top level of your component** or your own Hooks. You can't call it inside loops or conditions. If you need that, extract a new component and move the state into it. + +- `useId` **should not be used to generate keys** in a list. [Keys should be generated from your data.](/learn/rendering-lists#where-to-get-your-key) + +--- + +## Usage + +<Pitfall> + +**Do not call `useId` to generate keys in a list.** [Keys should be generated from your data.](/learn/rendering-lists#where-to-get-your-key) + +</Pitfall> + +### Generating unique IDs for accessibility attributes + +Call `useId` at the top level of your component to generate a unique ID: + +```js +import { useId } from 'react'; + +function PasswordField() { + const passwordHintId = useId(); + // ... +``` + +You can then pass the <CodeStep step={1}>generated ID</CodeStep> to different attributes: + +```js +<> + <input type="password" aria-describedby={passwordHintId} /> + <p id={passwordHintId}> +</> +``` + +**Let's walk through an example to see when this is useful.** + +[HTML accessibility attributes](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) like [`aria-describedby`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-describedby) let you specify that two tags are related to each other. For example, you can specify that an element (like an input) is described by another element (like a paragraph). + +In regular HTML, you would write it like this: + +```html {5,8} +<label> + Password: + <input type="password" aria-describedby="password-hint" /> +</label> +<p id="password-hint">The password should contain at least 18 characters</p> +``` + +However, hardcoding IDs like this is not a good practice in React. A component may be rendered more than once on the page--but IDs have to be unique! Instead of hardcoding an ID, generate a unique ID with `useId`: + +```js +import { useId } from "react"; + +function PasswordField() { + const passwordHintId = useId(); + return ( + <> + <label> + Password: + <input type="password" aria-describedby={passwordHintId} /> + </label> + <p id={passwordHintId}> + The password should contain at least 18 characters + </p> + </> + ); +} +``` + +Now, even if `PasswordField` appears multiple times on the screen, the generated IDs won't clash. + +```js +import { useId } from "react"; + +function PasswordField() { + const passwordHintId = useId(); + return ( + <> + <label> + Password: + <input type="password" aria-describedby={passwordHintId} /> + </label> + <p id={passwordHintId}> + The password should contain at least 18 characters + </p> + </> + ); +} + +export default function App() { + return ( + <> + <h2>Choose password</h2> + <PasswordField /> + <h2>Confirm password</h2> + <PasswordField /> + </> + ); +} +``` + +```css +input { + margin: 5px; +} +``` + +[Watch this video](https://www.youtube.com/watch?v=0dNzNcuEuOo) to see the difference in the user experience with assistive technologies. + +<Pitfall> + +With [server rendering](/reference/react-dom/server), **`useId` requires an identical component tree on the server and the client**. If the trees you render on the server and the client don't match exactly, the generated IDs won't match. + +</Pitfall> + +<DeepDive> + +#### Why is useId better than an incrementing counter? + +You might be wondering why `useId` is better than incrementing a global variable like `nextId++`. + +The primary benefit of `useId` is that React ensures that it works with [server rendering.](/reference/react-dom/server) During server rendering, your components generate HTML output. Later, on the client, [hydration](/reference/react-dom/client/hydrateRoot) attaches your event handlers to the generated HTML. For hydration to work, the client output must match the server HTML. + +This is very difficult to guarantee with an incrementing counter because the order in which the client components are hydrated may not match the order in which the server HTML was emitted. By calling `useId`, you ensure that hydration will work, and the output will match between the server and the client. + +Inside React, `useId` is generated from the "parent path" of the calling component. This is why, if the client and the server tree are the same, the "parent path" will match up regardless of rendering order. + +</DeepDive> + +--- + +### Generating IDs for several related elements + +If you need to give IDs to multiple related elements, you can call `useId` to generate a shared prefix for them: + +```js +import { useId } from "react"; + +export default function Form() { + const id = useId(); + return ( + <form> + <label htmlFor={id + "-firstName"}>First Name:</label> + <input id={id + "-firstName"} type="text" /> + <hr /> + <label htmlFor={id + "-lastName"}>Last Name:</label> + <input id={id + "-lastName"} type="text" /> + </form> + ); +} +``` + +```css +input { + margin: 5px; +} +``` + +This lets you avoid calling `useId` for every single element that needs a unique ID. + +--- + +### Specifying a shared prefix for all generated IDs + +If you render multiple independent React applications on a single page, pass `identifierPrefix` as an option to your [`createRoot`](/reference/react-dom/client/createRoot#parameters) or [`hydrateRoot`](/reference/react-dom/client/hydrateRoot) calls. This ensures that the IDs generated by the two different apps never clash because every identifier generated with `useId` will start with the distinct prefix you've specified. + +```html index.html +<!DOCTYPE html> +<html> + <head> + <title>My app</title> + </head> + <body> + <div id="root1"></div> + <div id="root2"></div> + </body> +</html> +``` + +```js +import { useId } from "react"; + +function PasswordField() { + const passwordHintId = useId(); + console.log("Generated identifier:", passwordHintId); + return ( + <> + <label> + Password: + <input type="password" aria-describedby={passwordHintId} /> + </label> + <p id={passwordHintId}> + The password should contain at least 18 characters + </p> + </> + ); +} + +export default function App() { + return ( + <> + <h2>Choose password</h2> + <PasswordField /> + </> + ); +} +``` + +```js +import { createRoot } from "react-dom/client"; +import App from "./App.js"; +import "./styles.css"; + +const root1 = createRoot(document.getElementById("root1"), { + identifierPrefix: "my-first-app-", +}); +root1.render(<App />); + +const root2 = createRoot(document.getElementById("root2"), { + identifierPrefix: "my-second-app-", +}); +root2.render(<App />); +``` + +```css +#root1 { + border: 5px solid blue; + padding: 10px; + margin: 5px; +} + +#root2 { + border: 5px solid green; + padding: 10px; + margin: 5px; +} + +input { + margin: 5px; +} +``` diff --git a/docs/src/reference/use-memo.md b/docs/src/reference/use-memo.md index 3daffe622..4a9f3143a 100644 --- a/docs/src/reference/use-memo.md +++ b/docs/src/reference/use-memo.md @@ -1,3 +1,1288 @@ --- title: Use Memo 🚧 --- + +## Overview + +<p class="intro" markdown> + +`useMemo` is a React Hook that lets you cache the result of a calculation between re-renders. + +```js +const cachedValue = useMemo(calculateValue, dependencies); +``` + +</p> + +--- + +## Reference + +### `useMemo(calculateValue, dependencies)` + +Call `useMemo` at the top level of your component to cache a calculation between re-renders: + +```js +import { useMemo } from "react"; + +function TodoList({ todos, tab }) { + const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]); + // ... +} +``` + +[See more examples below.](#usage) + +#### Parameters + +- `calculateValue`: The function calculating the value that you want to cache. It should be pure, should take no arguments, and should return a value of any type. React will call your function during the initial render. On next renders, React will return the same value again if the `dependencies` have not changed since the last render. Otherwise, it will call `calculateValue`, return its result, and store it so it can be reused later. + +- `dependencies`: The list of all reactive values referenced inside of the `calculateValue` code. Reactive values include props, state, and all the variables and functions declared directly inside your component body. If your linter is [configured for React](/learn/editor-setup#linting), it will verify that every reactive value is correctly specified as a dependency. The list of dependencies must have a constant number of items and be written inline like `[dep1, dep2, dep3]`. React will compare each dependency with its previous value using the [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison. + +#### Returns + +On the initial render, `useMemo` returns the result of calling `calculateValue` with no arguments. + +During next renders, it will either return an already stored value from the last render (if the dependencies haven't changed), or call `calculateValue` again, and return the result that `calculateValue` has returned. + +#### Caveats + +- `useMemo` is a Hook, so you can only call it **at the top level of your component** or your own Hooks. You can't call it inside loops or conditions. If you need that, extract a new component and move the state into it. +- In Strict Mode, React will **call your calculation function twice** in order to [help you find accidental impurities.](#my-calculation-runs-twice-on-every-re-render) This is development-only behavior and does not affect production. If your calculation function is pure (as it should be), this should not affect your logic. The result from one of the calls will be ignored. +- React **will not throw away the cached value unless there is a specific reason to do that.** For example, in development, React throws away the cache when you edit the file of your component. Both in development and in production, React will throw away the cache if your component suspends during the initial mount. In the future, React may add more features that take advantage of throwing away the cache--for example, if React adds built-in support for virtualized lists in the future, it would make sense to throw away the cache for items that scroll out of the virtualized table viewport. This should be fine if you rely on `useMemo` solely as a performance optimization. Otherwise, a [state variable](/reference/react/useState#avoiding-recreating-the-initial-state) or a [ref](/reference/react/useRef#avoiding-recreating-the-ref-contents) may be more appropriate. + +<Note> + +Caching return values like this is also known as [_memoization_,](https://en.wikipedia.org/wiki/Memoization) which is why this Hook is called `useMemo`. + +</Note> + +--- + +## Usage + +### Skipping expensive recalculations + +To cache a calculation between re-renders, wrap it in a `useMemo` call at the top level of your component: + +```js +import { useMemo } from "react"; + +function TodoList({ todos, tab, theme }) { + const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]); + // ... +} +``` + +You need to pass two things to `useMemo`: + +1. A <CodeStep step={1}>calculation function</CodeStep> that takes no arguments, like `() =>`, and returns what you wanted to calculate. +2. A <CodeStep step={2}>list of dependencies</CodeStep> including every value within your component that's used inside your calculation. + +On the initial render, the <CodeStep step={3}>value</CodeStep> you'll get from `useMemo` will be the result of calling your <CodeStep step={1}>calculation</CodeStep>. + +On every subsequent render, React will compare the <CodeStep step={2}>dependencies</CodeStep> with the dependencies you passed during the last render. If none of the dependencies have changed (compared with [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is)), `useMemo` will return the value you already calculated before. Otherwise, React will re-run your calculation and return the new value. + +In other words, `useMemo` caches a calculation result between re-renders until its dependencies change. + +**Let's walk through an example to see when this is useful.** + +By default, React will re-run the entire body of your component every time that it re-renders. For example, if this `TodoList` updates its state or receives new props from its parent, the `filterTodos` function will re-run: + +```js +function TodoList({ todos, tab, theme }) { + const visibleTodos = filterTodos(todos, tab); + // ... +} +``` + +Usually, this isn't a problem because most calculations are very fast. However, if you're filtering or transforming a large array, or doing some expensive computation, you might want to skip doing it again if data hasn't changed. If both `todos` and `tab` are the same as they were during the last render, wrapping the calculation in `useMemo` like earlier lets you reuse `visibleTodos` you've already calculated before. + +This type of caching is called _[memoization.](https://en.wikipedia.org/wiki/Memoization)_ + +<Note> + +**You should only rely on `useMemo` as a performance optimization.** If your code doesn't work without it, find the underlying problem and fix it first. Then you may add `useMemo` to improve performance. + +</Note> + +<DeepDive> + +#### How to tell if a calculation is expensive? + +In general, unless you're creating or looping over thousands of objects, it's probably not expensive. If you want to get more confidence, you can add a console log to measure the time spent in a piece of code: + +```js +console.time("filter array"); +const visibleTodos = filterTodos(todos, tab); +console.timeEnd("filter array"); +``` + +Perform the interaction you're measuring (for example, typing into the input). You will then see logs like `filter array: 0.15ms` in your console. If the overall logged time adds up to a significant amount (say, `1ms` or more), it might make sense to memoize that calculation. As an experiment, you can then wrap the calculation in `useMemo` to verify whether the total logged time has decreased for that interaction or not: + +```js +console.time("filter array"); +const visibleTodos = useMemo(() => { + return filterTodos(todos, tab); // Skipped if todos and tab haven't changed +}, [todos, tab]); +console.timeEnd("filter array"); +``` + +`useMemo` won't make the _first_ render faster. It only helps you skip unnecessary work on updates. + +Keep in mind that your machine is probably faster than your users' so it's a good idea to test the performance with an artificial slowdown. For example, Chrome offers a [CPU Throttling](https://developer.chrome.com/blog/new-in-devtools-61/#throttling) option for this. + +Also note that measuring performance in development will not give you the most accurate results. (For example, when [Strict Mode](/reference/react/StrictMode) is on, you will see each component render twice rather than once.) To get the most accurate timings, build your app for production and test it on a device like your users have. + +</DeepDive> + +<DeepDive> + +#### Should you add useMemo everywhere? + +If your app is like this site, and most interactions are coarse (like replacing a page or an entire section), memoization is usually unnecessary. On the other hand, if your app is more like a drawing editor, and most interactions are granular (like moving shapes), then you might find memoization very helpful. + +Optimizing with `useMemo` is only valuable in a few cases: + +- The calculation you're putting in `useMemo` is noticeably slow, and its dependencies rarely change. +- You pass it as a prop to a component wrapped in [`memo`.](/reference/react/memo) You want to skip re-rendering if the value hasn't changed. Memoization lets your component re-render only when dependencies aren't the same. +- The value you're passing is later used as a dependency of some Hook. For example, maybe another `useMemo` calculation value depends on it. Or maybe you are depending on this value from [`useEffect.`](/reference/react/useEffect) + +There is no benefit to wrapping a calculation in `useMemo` in other cases. There is no significant harm to doing that either, so some teams choose to not think about individual cases, and memoize as much as possible. The downside of this approach is that code becomes less readable. Also, not all memoization is effective: a single value that's "always new" is enough to break memoization for an entire component. + +**In practice, you can make a lot of memoization unnecessary by following a few principles:** + +1. When a component visually wraps other components, let it [accept JSX as children.](/learn/passing-props-to-a-component#passing-jsx-as-children) This way, when the wrapper component updates its own state, React knows that its children don't need to re-render. +1. Prefer local state and don't [lift state up](/learn/sharing-state-between-components) any further than necessary. For example, don't keep transient state like forms and whether an item is hovered at the top of your tree or in a global state library. +1. Keep your [rendering logic pure.](/learn/keeping-components-pure) If re-rendering a component causes a problem or produces some noticeable visual artifact, it's a bug in your component! Fix the bug instead of adding memoization. +1. Avoid [unnecessary Effects that update state.](/learn/you-might-not-need-an-effect) Most performance problems in React apps are caused by chains of updates originating from Effects that cause your components to render over and over. +1. Try to [remove unnecessary dependencies from your Effects.](/learn/removing-effect-dependencies) For example, instead of memoization, it's often simpler to move some object or a function inside an Effect or outside the component. + +If a specific interaction still feels laggy, [use the React Developer Tools profiler](https://legacy.reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html) to see which components would benefit the most from memoization, and add memoization where needed. These principles make your components easier to debug and understand, so it's good to follow them in any case. In the long term, we're researching [doing granular memoization automatically](https://www.youtube.com/watch?v=lGEMwh32soc) to solve this once and for all. + +</DeepDive> + +<Recipes titleText="The difference between useMemo and calculating a value directly" titleId="examples-recalculation"> + +#### Skipping recalculation with `useMemo` + +In this example, the `filterTodos` implementation is **artificially slowed down** so that you can see what happens when some JavaScript function you're calling during rendering is genuinely slow. Try switching the tabs and toggling the theme. + +Switching the tabs feels slow because it forces the slowed down `filterTodos` to re-execute. That's expected because the `tab` has changed, and so the entire calculation _needs_ to re-run. (If you're curious why it runs twice, it's explained [here.](#my-calculation-runs-twice-on-every-re-render)) + +Toggle the theme. **Thanks to `useMemo`, it's fast despite the artificial slowdown!** The slow `filterTodos` call was skipped because both `todos` and `tab` (which you pass as dependencies to `useMemo`) haven't changed since the last render. + +```js +import { useState } from "react"; +import { createTodos } from "./utils.js"; +import TodoList from "./TodoList.js"; + +const todos = createTodos(); + +export default function App() { + const [tab, setTab] = useState("all"); + const [isDark, setIsDark] = useState(false); + return ( + <> + <button onClick={() => setTab("all")}>All</button> + <button onClick={() => setTab("active")}>Active</button> + <button onClick={() => setTab("completed")}>Completed</button> + <br /> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Dark mode + </label> + <hr /> + <TodoList + todos={todos} + tab={tab} + theme={isDark ? "dark" : "light"} + /> + </> + ); +} +``` + +```js +import { useMemo } from "react"; +import { filterTodos } from "./utils.js"; + +export default function TodoList({ todos, theme, tab }) { + const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]); + return ( + <div className={theme}> + <p> + <b> + Note: <code>filterTodos</code> is artificially slowed down! + </b> + </p> + <ul> + {visibleTodos.map((todo) => ( + <li key={todo.id}> + {todo.completed ? <s>{todo.text}</s> : todo.text} + </li> + ))} + </ul> + </div> + ); +} +``` + +```js +export function createTodos() { + const todos = []; + for (let i = 0; i < 50; i++) { + todos.push({ + id: i, + text: "Todo " + (i + 1), + completed: Math.random() > 0.5, + }); + } + return todos; +} + +export function filterTodos(todos, tab) { + console.log( + "[ARTIFICIALLY SLOW] Filtering " + + todos.length + + ' todos for "' + + tab + + '" tab.' + ); + let startTime = performance.now(); + while (performance.now() - startTime < 500) { + // Do nothing for 500 ms to emulate extremely slow code + } + + return todos.filter((todo) => { + if (tab === "all") { + return true; + } else if (tab === "active") { + return !todo.completed; + } else if (tab === "completed") { + return todo.completed; + } + }); +} +``` + +```css +label { + display: block; + margin-top: 10px; +} + +.dark { + background-color: black; + color: white; +} + +.light { + background-color: white; + color: black; +} +``` + +#### Always recalculating a value + +In this example, the `filterTodos` implementation is also **artificially slowed down** so that you can see what happens when some JavaScript function you're calling during rendering is genuinely slow. Try switching the tabs and toggling the theme. + +Unlike in the previous example, toggling the theme is also slow now! This is because **there is no `useMemo` call in this version,** so the artificially slowed down `filterTodos` gets called on every re-render. It is called even if only `theme` has changed. + +```js +import { useState } from "react"; +import { createTodos } from "./utils.js"; +import TodoList from "./TodoList.js"; + +const todos = createTodos(); + +export default function App() { + const [tab, setTab] = useState("all"); + const [isDark, setIsDark] = useState(false); + return ( + <> + <button onClick={() => setTab("all")}>All</button> + <button onClick={() => setTab("active")}>Active</button> + <button onClick={() => setTab("completed")}>Completed</button> + <br /> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Dark mode + </label> + <hr /> + <TodoList + todos={todos} + tab={tab} + theme={isDark ? "dark" : "light"} + /> + </> + ); +} +``` + +```js +import { filterTodos } from "./utils.js"; + +export default function TodoList({ todos, theme, tab }) { + const visibleTodos = filterTodos(todos, tab); + return ( + <div className={theme}> + <ul> + <p> + <b> + Note: <code>filterTodos</code> is artificially slowed + down! + </b> + </p> + {visibleTodos.map((todo) => ( + <li key={todo.id}> + {todo.completed ? <s>{todo.text}</s> : todo.text} + </li> + ))} + </ul> + </div> + ); +} +``` + +```js +export function createTodos() { + const todos = []; + for (let i = 0; i < 50; i++) { + todos.push({ + id: i, + text: "Todo " + (i + 1), + completed: Math.random() > 0.5, + }); + } + return todos; +} + +export function filterTodos(todos, tab) { + console.log( + "[ARTIFICIALLY SLOW] Filtering " + + todos.length + + ' todos for "' + + tab + + '" tab.' + ); + let startTime = performance.now(); + while (performance.now() - startTime < 500) { + // Do nothing for 500 ms to emulate extremely slow code + } + + return todos.filter((todo) => { + if (tab === "all") { + return true; + } else if (tab === "active") { + return !todo.completed; + } else if (tab === "completed") { + return todo.completed; + } + }); +} +``` + +```css +label { + display: block; + margin-top: 10px; +} + +.dark { + background-color: black; + color: white; +} + +.light { + background-color: white; + color: black; +} +``` + +However, here is the same code **with the artificial slowdown removed.** Does the lack of `useMemo` feel noticeable or not? + +```js +import { useState } from "react"; +import { createTodos } from "./utils.js"; +import TodoList from "./TodoList.js"; + +const todos = createTodos(); + +export default function App() { + const [tab, setTab] = useState("all"); + const [isDark, setIsDark] = useState(false); + return ( + <> + <button onClick={() => setTab("all")}>All</button> + <button onClick={() => setTab("active")}>Active</button> + <button onClick={() => setTab("completed")}>Completed</button> + <br /> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Dark mode + </label> + <hr /> + <TodoList + todos={todos} + tab={tab} + theme={isDark ? "dark" : "light"} + /> + </> + ); +} +``` + +```js +import { filterTodos } from "./utils.js"; + +export default function TodoList({ todos, theme, tab }) { + const visibleTodos = filterTodos(todos, tab); + return ( + <div className={theme}> + <ul> + {visibleTodos.map((todo) => ( + <li key={todo.id}> + {todo.completed ? <s>{todo.text}</s> : todo.text} + </li> + ))} + </ul> + </div> + ); +} +``` + +```js +export function createTodos() { + const todos = []; + for (let i = 0; i < 50; i++) { + todos.push({ + id: i, + text: "Todo " + (i + 1), + completed: Math.random() > 0.5, + }); + } + return todos; +} + +export function filterTodos(todos, tab) { + console.log("Filtering " + todos.length + ' todos for "' + tab + '" tab.'); + + return todos.filter((todo) => { + if (tab === "all") { + return true; + } else if (tab === "active") { + return !todo.completed; + } else if (tab === "completed") { + return todo.completed; + } + }); +} +``` + +```css +label { + display: block; + margin-top: 10px; +} + +.dark { + background-color: black; + color: white; +} + +.light { + background-color: white; + color: black; +} +``` + +Quite often, code without memoization works fine. If your interactions are fast enough, you might not need memoization. + +You can try increasing the number of todo items in `utils.js` and see how the behavior changes. This particular calculation wasn't very expensive to begin with, but if the number of todos grows significantly, most of the overhead will be in re-rendering rather than in the filtering. Keep reading below to see how you can optimize re-rendering with `useMemo`. + +</Recipes> + +--- + +### Skipping re-rendering of components + +In some cases, `useMemo` can also help you optimize performance of re-rendering child components. To illustrate this, let's say this `TodoList` component passes the `visibleTodos` as a prop to the child `List` component: + +```js +export default function TodoList({ todos, tab, theme }) { + // ... + return ( + <div className={theme}> + <List items={visibleTodos} /> + </div> + ); +} +``` + +You've noticed that toggling the `theme` prop freezes the app for a moment, but if you remove `<List />` from your JSX, it feels fast. This tells you that it's worth trying to optimize the `List` component. + +**By default, when a component re-renders, React re-renders all of its children recursively.** This is why, when `TodoList` re-renders with a different `theme`, the `List` component _also_ re-renders. This is fine for components that don't require much calculation to re-render. But if you've verified that a re-render is slow, you can tell `List` to skip re-rendering when its props are the same as on last render by wrapping it in [`memo`:](/reference/react/memo) + +```js +import { memo } from "react"; + +const List = memo(function List({ items }) { + // ... +}); +``` + +**With this change, `List` will skip re-rendering if all of its props are the _same_ as on the last render.** This is where caching the calculation becomes important! Imagine that you calculated `visibleTodos` without `useMemo`: + +```js +export default function TodoList({ todos, tab, theme }) { + // Every time the theme changes, this will be a different array... + const visibleTodos = filterTodos(todos, tab); + return ( + <div className={theme}> + {/* ... so List's props will never be the same, and it will re-render every time */} + <List items={visibleTodos} /> + </div> + ); +} +``` + +**In the above example, the `filterTodos` function always creates a _different_ array,** similar to how the `{}` object literal always creates a new object. Normally, this wouldn't be a problem, but it means that `List` props will never be the same, and your [`memo`](/reference/react/memo) optimization won't work. This is where `useMemo` comes in handy: + +```js +export default function TodoList({ todos, tab, theme }) { + // Tell React to cache your calculation between re-renders... + const visibleTodos = useMemo( + () => filterTodos(todos, tab), + [todos, tab] // ...so as long as these dependencies don't change... + ); + return ( + <div className={theme}> + {/* ...List will receive the same props and can skip re-rendering */} + <List items={visibleTodos} /> + </div> + ); +} +``` + +**By wrapping the `visibleTodos` calculation in `useMemo`, you ensure that it has the _same_ value between the re-renders** (until dependencies change). You don't _have to_ wrap a calculation in `useMemo` unless you do it for some specific reason. In this example, the reason is that you pass it to a component wrapped in [`memo`,](/reference/react/memo) and this lets it skip re-rendering. There are a few other reasons to add `useMemo` which are described further on this page. + +<DeepDive> + +#### Memoizing individual JSX nodes + +Instead of wrapping `List` in [`memo`](/reference/react/memo), you could wrap the `<List />` JSX node itself in `useMemo`: + +```js +export default function TodoList({ todos, tab, theme }) { + const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]); + const children = useMemo( + () => <List items={visibleTodos} />, + [visibleTodos] + ); + return <div className={theme}>{children}</div>; +} +``` + +The behavior would be the same. If the `visibleTodos` haven't changed, `List` won't be re-rendered. + +A JSX node like `<List items={visibleTodos} />` is an object like `{ type: List, props: { items: visibleTodos } }`. Creating this object is very cheap, but React doesn't know whether its contents is the same as last time or not. This is why by default, React will re-render the `List` component. + +However, if React sees the same exact JSX as during the previous render, it won't try to re-render your component. This is because JSX nodes are [immutable.](https://en.wikipedia.org/wiki/Immutable_object) A JSX node object could not have changed over time, so React knows it's safe to skip a re-render. However, for this to work, the node has to _actually be the same object_, not merely look the same in code. This is what `useMemo` does in this example. + +Manually wrapping JSX nodes into `useMemo` is not convenient. For example, you can't do this conditionally. This is usually why you would wrap components with [`memo`](/reference/react/memo) instead of wrapping JSX nodes. + +</DeepDive> + +<Recipes titleText="The difference between skipping re-renders and always re-rendering" titleId="examples-rerendering"> + +#### Skipping re-rendering with `useMemo` and `memo` + +In this example, the `List` component is **artificially slowed down** so that you can see what happens when a React component you're rendering is genuinely slow. Try switching the tabs and toggling the theme. + +Switching the tabs feels slow because it forces the slowed down `List` to re-render. That's expected because the `tab` has changed, and so you need to reflect the user's new choice on the screen. + +Next, try toggling the theme. **Thanks to `useMemo` together with [`memo`](/reference/react/memo), it’s fast despite the artificial slowdown!** The `List` skipped re-rendering because the `visibleItems` array has not changed since the last render. The `visibleItems` array has not changed because both `todos` and `tab` (which you pass as dependencies to `useMemo`) haven't changed since the last render. + +```js +import { useState } from "react"; +import { createTodos } from "./utils.js"; +import TodoList from "./TodoList.js"; + +const todos = createTodos(); + +export default function App() { + const [tab, setTab] = useState("all"); + const [isDark, setIsDark] = useState(false); + return ( + <> + <button onClick={() => setTab("all")}>All</button> + <button onClick={() => setTab("active")}>Active</button> + <button onClick={() => setTab("completed")}>Completed</button> + <br /> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Dark mode + </label> + <hr /> + <TodoList + todos={todos} + tab={tab} + theme={isDark ? "dark" : "light"} + /> + </> + ); +} +``` + +```js +import { useMemo } from "react"; +import List from "./List.js"; +import { filterTodos } from "./utils.js"; + +export default function TodoList({ todos, theme, tab }) { + const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]); + return ( + <div className={theme}> + <p> + <b> + Note: <code>List</code> is artificially slowed down! + </b> + </p> + <List items={visibleTodos} /> + </div> + ); +} +``` + +```js +import { memo } from "react"; + +const List = memo(function List({ items }) { + console.log( + "[ARTIFICIALLY SLOW] Rendering <List /> with " + items.length + " items" + ); + let startTime = performance.now(); + while (performance.now() - startTime < 500) { + // Do nothing for 500 ms to emulate extremely slow code + } + + return ( + <ul> + {items.map((item) => ( + <li key={item.id}> + {item.completed ? <s>{item.text}</s> : item.text} + </li> + ))} + </ul> + ); +}); + +export default List; +``` + +```js +export function createTodos() { + const todos = []; + for (let i = 0; i < 50; i++) { + todos.push({ + id: i, + text: "Todo " + (i + 1), + completed: Math.random() > 0.5, + }); + } + return todos; +} + +export function filterTodos(todos, tab) { + return todos.filter((todo) => { + if (tab === "all") { + return true; + } else if (tab === "active") { + return !todo.completed; + } else if (tab === "completed") { + return todo.completed; + } + }); +} +``` + +```css +label { + display: block; + margin-top: 10px; +} + +.dark { + background-color: black; + color: white; +} + +.light { + background-color: white; + color: black; +} +``` + +#### Always re-rendering a component + +In this example, the `List` implementation is also **artificially slowed down** so that you can see what happens when some React component you're rendering is genuinely slow. Try switching the tabs and toggling the theme. + +Unlike in the previous example, toggling the theme is also slow now! This is because **there is no `useMemo` call in this version,** so the `visibleTodos` is always a different array, and the slowed down `List` component can't skip re-rendering. + +```js +import { useState } from "react"; +import { createTodos } from "./utils.js"; +import TodoList from "./TodoList.js"; + +const todos = createTodos(); + +export default function App() { + const [tab, setTab] = useState("all"); + const [isDark, setIsDark] = useState(false); + return ( + <> + <button onClick={() => setTab("all")}>All</button> + <button onClick={() => setTab("active")}>Active</button> + <button onClick={() => setTab("completed")}>Completed</button> + <br /> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Dark mode + </label> + <hr /> + <TodoList + todos={todos} + tab={tab} + theme={isDark ? "dark" : "light"} + /> + </> + ); +} +``` + +```js +import List from "./List.js"; +import { filterTodos } from "./utils.js"; + +export default function TodoList({ todos, theme, tab }) { + const visibleTodos = filterTodos(todos, tab); + return ( + <div className={theme}> + <p> + <b> + Note: <code>List</code> is artificially slowed down! + </b> + </p> + <List items={visibleTodos} /> + </div> + ); +} +``` + +```js +import { memo } from "react"; + +const List = memo(function List({ items }) { + console.log( + "[ARTIFICIALLY SLOW] Rendering <List /> with " + items.length + " items" + ); + let startTime = performance.now(); + while (performance.now() - startTime < 500) { + // Do nothing for 500 ms to emulate extremely slow code + } + + return ( + <ul> + {items.map((item) => ( + <li key={item.id}> + {item.completed ? <s>{item.text}</s> : item.text} + </li> + ))} + </ul> + ); +}); + +export default List; +``` + +```js +export function createTodos() { + const todos = []; + for (let i = 0; i < 50; i++) { + todos.push({ + id: i, + text: "Todo " + (i + 1), + completed: Math.random() > 0.5, + }); + } + return todos; +} + +export function filterTodos(todos, tab) { + return todos.filter((todo) => { + if (tab === "all") { + return true; + } else if (tab === "active") { + return !todo.completed; + } else if (tab === "completed") { + return todo.completed; + } + }); +} +``` + +```css +label { + display: block; + margin-top: 10px; +} + +.dark { + background-color: black; + color: white; +} + +.light { + background-color: white; + color: black; +} +``` + +However, here is the same code **with the artificial slowdown removed.** Does the lack of `useMemo` feel noticeable or not? + +```js +import { useState } from "react"; +import { createTodos } from "./utils.js"; +import TodoList from "./TodoList.js"; + +const todos = createTodos(); + +export default function App() { + const [tab, setTab] = useState("all"); + const [isDark, setIsDark] = useState(false); + return ( + <> + <button onClick={() => setTab("all")}>All</button> + <button onClick={() => setTab("active")}>Active</button> + <button onClick={() => setTab("completed")}>Completed</button> + <br /> + <label> + <input + type="checkbox" + checked={isDark} + onChange={(e) => setIsDark(e.target.checked)} + /> + Dark mode + </label> + <hr /> + <TodoList + todos={todos} + tab={tab} + theme={isDark ? "dark" : "light"} + /> + </> + ); +} +``` + +```js +import List from "./List.js"; +import { filterTodos } from "./utils.js"; + +export default function TodoList({ todos, theme, tab }) { + const visibleTodos = filterTodos(todos, tab); + return ( + <div className={theme}> + <List items={visibleTodos} /> + </div> + ); +} +``` + +```js +import { memo } from "react"; + +function List({ items }) { + return ( + <ul> + {items.map((item) => ( + <li key={item.id}> + {item.completed ? <s>{item.text}</s> : item.text} + </li> + ))} + </ul> + ); +} + +export default memo(List); +``` + +```js +export function createTodos() { + const todos = []; + for (let i = 0; i < 50; i++) { + todos.push({ + id: i, + text: "Todo " + (i + 1), + completed: Math.random() > 0.5, + }); + } + return todos; +} + +export function filterTodos(todos, tab) { + return todos.filter((todo) => { + if (tab === "all") { + return true; + } else if (tab === "active") { + return !todo.completed; + } else if (tab === "completed") { + return todo.completed; + } + }); +} +``` + +```css +label { + display: block; + margin-top: 10px; +} + +.dark { + background-color: black; + color: white; +} + +.light { + background-color: white; + color: black; +} +``` + +Quite often, code without memoization works fine. If your interactions are fast enough, you don't need memoization. + +Keep in mind that you need to run React in production mode, disable [React Developer Tools](/learn/react-developer-tools), and use devices similar to the ones your app's users have in order to get a realistic sense of what's actually slowing down your app. + +</Recipes> + +--- + +### Memoizing a dependency of another Hook + +Suppose you have a calculation that depends on an object created directly in the component body: + +```js +function Dropdown({ allItems, text }) { + const searchOptions = { matchMode: 'whole-word', text }; + + const visibleItems = useMemo(() => { + return searchItems(allItems, searchOptions); + }, [allItems, searchOptions]); // 🚩 Caution: Dependency on an object created in the component body + // ... +``` + +Depending on an object like this defeats the point of memoization. When a component re-renders, all of the code directly inside the component body runs again. **The lines of code creating the `searchOptions` object will also run on every re-render.** Since `searchOptions` is a dependency of your `useMemo` call, and it's different every time, React knows the dependencies are different, and recalculate `searchItems` every time. + +To fix this, you could memoize the `searchOptions` object _itself_ before passing it as a dependency: + +```js +function Dropdown({ allItems, text }) { + const searchOptions = useMemo(() => { + return { matchMode: 'whole-word', text }; + }, [text]); // ✅ Only changes when text changes + + const visibleItems = useMemo(() => { + return searchItems(allItems, searchOptions); + }, [allItems, searchOptions]); // ✅ Only changes when allItems or searchOptions changes + // ... +``` + +In the example above, if the `text` did not change, the `searchOptions` object also won't change. However, an even better fix is to move the `searchOptions` object declaration _inside_ of the `useMemo` calculation function: + +```js +function Dropdown({ allItems, text }) { + const visibleItems = useMemo(() => { + const searchOptions = { matchMode: 'whole-word', text }; + return searchItems(allItems, searchOptions); + }, [allItems, text]); // ✅ Only changes when allItems or text changes + // ... +``` + +Now your calculation depends on `text` directly (which is a string and can't "accidentally" become different). + +--- + +### Memoizing a function + +Suppose the `Form` component is wrapped in [`memo`.](/reference/react/memo) You want to pass a function to it as a prop: + +```js +export default function ProductPage({ productId, referrer }) { + function handleSubmit(orderDetails) { + post("/product/" + productId + "/buy", { + referrer, + orderDetails, + }); + } + + return <Form onSubmit={handleSubmit} />; +} +``` + +Just as `{}` creates a different object, function declarations like `function() {}` and expressions like `() => {}` produce a _different_ function on every re-render. By itself, creating a new function is not a problem. This is not something to avoid! However, if the `Form` component is memoized, presumably you want to skip re-rendering it when no props have changed. A prop that is _always_ different would defeat the point of memoization. + +To memoize a function with `useMemo`, your calculation function would have to return another function: + +```js +export default function Page({ productId, referrer }) { + const handleSubmit = useMemo(() => { + return (orderDetails) => { + post("/product/" + productId + "/buy", { + referrer, + orderDetails, + }); + }; + }, [productId, referrer]); + + return <Form onSubmit={handleSubmit} />; +} +``` + +This looks clunky! **Memoizing functions is common enough that React has a built-in Hook specifically for that. Wrap your functions into [`useCallback`](/reference/react/useCallback) instead of `useMemo`** to avoid having to write an extra nested function: + +```js +export default function Page({ productId, referrer }) { + const handleSubmit = useCallback( + (orderDetails) => { + post("/product/" + productId + "/buy", { + referrer, + orderDetails, + }); + }, + [productId, referrer] + ); + + return <Form onSubmit={handleSubmit} />; +} +``` + +The two examples above are completely equivalent. The only benefit to `useCallback` is that it lets you avoid writing an extra nested function inside. It doesn't do anything else. [Read more about `useCallback`.](/reference/react/useCallback) + +--- + +## Troubleshooting + +### My calculation runs twice on every re-render + +In [Strict Mode](/reference/react/StrictMode), React will call some of your functions twice instead of once: + +```js +function TodoList({ todos, tab }) { + // This component function will run twice for every render. + + const visibleTodos = useMemo(() => { + // This calculation will run twice if any of the dependencies change. + return filterTodos(todos, tab); + }, [todos, tab]); + + // ... +``` + +This is expected and shouldn't break your code. + +This **development-only** behavior helps you [keep components pure.](/learn/keeping-components-pure) React uses the result of one of the calls, and ignores the result of the other call. As long as your component and calculation functions are pure, this shouldn't affect your logic. However, if they are accidentally impure, this helps you notice and fix the mistake. + +For example, this impure calculation function mutates an array you received as a prop: + +```js +const visibleTodos = useMemo(() => { + // 🚩 Mistake: mutating a prop + todos.push({ id: "last", text: "Go for a walk!" }); + const filtered = filterTodos(todos, tab); + return filtered; +}, [todos, tab]); +``` + +React calls your function twice, so you'd notice the todo is added twice. Your calculation shouldn't change any existing objects, but it's okay to change any _new_ objects you created during the calculation. For example, if the `filterTodos` function always returns a _different_ array, you can mutate _that_ array instead: + +```js +const visibleTodos = useMemo(() => { + const filtered = filterTodos(todos, tab); + // ✅ Correct: mutating an object you created during the calculation + filtered.push({ id: "last", text: "Go for a walk!" }); + return filtered; +}, [todos, tab]); +``` + +Read [keeping components pure](/learn/keeping-components-pure) to learn more about purity. + +Also, check out the guides on [updating objects](/learn/updating-objects-in-state) and [updating arrays](/learn/updating-arrays-in-state) without mutation. + +--- + +### My `useMemo` call is supposed to return an object, but returns undefined + +This code doesn't work: + +```js + // 🔴 You can't return an object from an arrow function with () => { + const searchOptions = useMemo(() => { + matchMode: 'whole-word', + text: text + }, [text]); +``` + +In JavaScript, `() => {` starts the arrow function body, so the `{` brace is not a part of your object. This is why it doesn't return an object, and leads to mistakes. You could fix it by adding parentheses like `({` and `})`: + +```js +// This works, but is easy for someone to break again +const searchOptions = useMemo( + () => ({ + matchMode: "whole-word", + text: text, + }), + [text] +); +``` + +However, this is still confusing and too easy for someone to break by removing the parentheses. + +To avoid this mistake, write a `return` statement explicitly: + +```js +// ✅ This works and is explicit +const searchOptions = useMemo(() => { + return { + matchMode: "whole-word", + text: text, + }; +}, [text]); +``` + +--- + +### Every time my component renders, the calculation in `useMemo` re-runs + +Make sure you've specified the dependency array as a second argument! + +If you forget the dependency array, `useMemo` will re-run the calculation every time: + +```js +function TodoList({ todos, tab }) { + // 🔴 Recalculates every time: no dependency array + const visibleTodos = useMemo(() => filterTodos(todos, tab)); + // ... +``` + +This is the corrected version passing the dependency array as a second argument: + +```js +function TodoList({ todos, tab }) { + // ✅ Does not recalculate unnecessarily + const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]); + // ... +``` + +If this doesn't help, then the problem is that at least one of your dependencies is different from the previous render. You can debug this problem by manually logging your dependencies to the console: + +```js +const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]); +console.log([todos, tab]); +``` + +You can then right-click on the arrays from different re-renders in the console and select "Store as a global variable" for both of them. Assuming the first one got saved as `temp1` and the second one got saved as `temp2`, you can then use the browser console to check whether each dependency in both arrays is the same: + +```js +Object.is(temp1[0], temp2[0]); // Is the first dependency the same between the arrays? +Object.is(temp1[1], temp2[1]); // Is the second dependency the same between the arrays? +Object.is(temp1[2], temp2[2]); // ... and so on for every dependency ... +``` + +When you find which dependency breaks memoization, either find a way to remove it, or [memoize it as well.](#memoizing-a-dependency-of-another-hook) + +--- + +### I need to call `useMemo` for each list item in a loop, but it's not allowed + +Suppose the `Chart` component is wrapped in [`memo`](/reference/react/memo). You want to skip re-rendering every `Chart` in the list when the `ReportList` component re-renders. However, you can't call `useMemo` in a loop: + +```js +function ReportList({ items }) { + return ( + <article> + {items.map((item) => { + // 🔴 You can't call useMemo in a loop like this: + const data = useMemo(() => calculateReport(item), [item]); + return ( + <figure key={item.id}> + <Chart data={data} /> + </figure> + ); + })} + </article> + ); +} +``` + +Instead, extract a component for each item and memoize data for individual items: + +```js +function ReportList({ items }) { + return ( + <article> + {items.map((item) => ( + <Report key={item.id} item={item} /> + ))} + </article> + ); +} + +function Report({ item }) { + // ✅ Call useMemo at the top level: + const data = useMemo(() => calculateReport(item), [item]); + return ( + <figure> + <Chart data={data} /> + </figure> + ); +} +``` + +Alternatively, you could remove `useMemo` and instead wrap `Report` itself in [`memo`.](/reference/react/memo) If the `item` prop does not change, `Report` will skip re-rendering, so `Chart` will skip re-rendering too: + +```js +function ReportList({ items }) { + // ... +} + +const Report = memo(function Report({ item }) { + const data = calculateReport(item); + return ( + <figure> + <Chart data={data} /> + </figure> + ); +}); +``` diff --git a/docs/src/reference/use-reducer.md b/docs/src/reference/use-reducer.md index eb732d01a..c397b41c7 100644 --- a/docs/src/reference/use-reducer.md +++ b/docs/src/reference/use-reducer.md @@ -1,3 +1,1093 @@ --- title: Use Reducer 🚧 --- + +## Overview + +<p class="intro" markdown> + +`useReducer` is a React Hook that lets you add a [reducer](/learn/extracting-state-logic-into-a-reducer) to your component. + +```js +const [state, dispatch] = useReducer(reducer, initialArg, init?) +``` + +</p> + +--- + +## Reference + +### `useReducer(reducer, initialArg, init?)` + +Call `useReducer` at the top level of your component to manage its state with a [reducer.](/learn/extracting-state-logic-into-a-reducer) + +```js +import { useReducer } from 'react'; + +function reducer(state, action) { + // ... +} + +function MyComponent() { + const [state, dispatch] = useReducer(reducer, { age: 42 }); + // ... +``` + +[See more examples below.](#usage) + +#### Parameters + +- `reducer`: The reducer function that specifies how the state gets updated. It must be pure, should take the state and action as arguments, and should return the next state. State and action can be of any types. +- `initialArg`: The value from which the initial state is calculated. It can be a value of any type. How the initial state is calculated from it depends on the next `init` argument. +- **optional** `init`: The initializer function that should return the initial state. If it's not specified, the initial state is set to `initialArg`. Otherwise, the initial state is set to the result of calling `init(initialArg)`. + +#### Returns + +`useReducer` returns an array with exactly two values: + +1. The current state. During the first render, it's set to `init(initialArg)` or `initialArg` (if there's no `init`). +2. The [`dispatch` function](#dispatch) that lets you update the state to a different value and trigger a re-render. + +#### Caveats + +- `useReducer` is a Hook, so you can only call it **at the top level of your component** or your own Hooks. You can't call it inside loops or conditions. If you need that, extract a new component and move the state into it. +- In Strict Mode, React will **call your reducer and initializer twice** in order to [help you find accidental impurities.](#my-reducer-or-initializer-function-runs-twice) This is development-only behavior and does not affect production. If your reducer and initializer are pure (as they should be), this should not affect your logic. The result from one of the calls is ignored. + +--- + +### `dispatch` function + +The `dispatch` function returned by `useReducer` lets you update the state to a different value and trigger a re-render. You need to pass the action as the only argument to the `dispatch` function: + +```js +const [state, dispatch] = useReducer(reducer, { age: 42 }); + +function handleClick() { + dispatch({ type: 'incremented_age' }); + // ... +``` + +React will set the next state to the result of calling the `reducer` function you've provided with the current `state` and the action you've passed to `dispatch`. + +#### Parameters + +- `action`: The action performed by the user. It can be a value of any type. By convention, an action is usually an object with a `type` property identifying it and, optionally, other properties with additional information. + +#### Returns + +`dispatch` functions do not have a return value. + +#### Caveats + +- The `dispatch` function **only updates the state variable for the _next_ render**. If you read the state variable after calling the `dispatch` function, [you will still get the old value](#ive-dispatched-an-action-but-logging-gives-me-the-old-state-value) that was on the screen before your call. + +- If the new value you provide is identical to the current `state`, as determined by an [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison, React will **skip re-rendering the component and its children.** This is an optimization. React may still need to call your component before ignoring the result, but it shouldn't affect your code. + +- React [batches state updates.](/learn/queueing-a-series-of-state-updates) It updates the screen **after all the event handlers have run** and have called their `set` functions. This prevents multiple re-renders during a single event. In the rare case that you need to force React to update the screen earlier, for example to access the DOM, you can use [`flushSync`.](/reference/react-dom/flushSync) + +--- + +## Usage + +### Adding a reducer to a component + +Call `useReducer` at the top level of your component to manage state with a [reducer.](/learn/extracting-state-logic-into-a-reducer) + +```js +import { useReducer } from 'react'; + +function reducer(state, action) { + // ... +} + +function MyComponent() { + const [state, dispatch] = useReducer(reducer, { age: 42 }); + // ... +``` + +`useReducer` returns an array with exactly two items: + +1. The <CodeStep step={1}>current state</CodeStep> of this state variable, initially set to the <CodeStep step={3}>initial state</CodeStep> you provided. +2. The <CodeStep step={2}>`dispatch` function</CodeStep> that lets you change it in response to interaction. + +To update what's on the screen, call <CodeStep step={2}>`dispatch`</CodeStep> with an object representing what the user did, called an _action_: + +```js +function handleClick() { + dispatch({ type: "incremented_age" }); +} +``` + +React will pass the current state and the action to your <CodeStep step={4}>reducer function</CodeStep>. Your reducer will calculate and return the next state. React will store that next state, render your component with it, and update the UI. + +```js +import { useReducer } from "react"; + +function reducer(state, action) { + if (action.type === "incremented_age") { + return { + age: state.age + 1, + }; + } + throw Error("Unknown action."); +} + +export default function Counter() { + const [state, dispatch] = useReducer(reducer, { age: 42 }); + + return ( + <> + <button + onClick={() => { + dispatch({ type: "incremented_age" }); + }} + > + Increment age + </button> + <p>Hello! You are {state.age}.</p> + </> + ); +} +``` + +```css +button { + display: block; + margin-top: 10px; +} +``` + +`useReducer` is very similar to [`useState`](/reference/react/useState), but it lets you move the state update logic from event handlers into a single function outside of your component. Read more about [choosing between `useState` and `useReducer`.](/learn/extracting-state-logic-into-a-reducer#comparing-usestate-and-usereducer) + +--- + +### Writing the reducer function + +A reducer function is declared like this: + +```js +function reducer(state, action) { + // ... +} +``` + +Then you need to fill in the code that will calculate and return the next state. By convention, it is common to write it as a [`switch` statement.](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch) For each `case` in the `switch`, calculate and return some next state. + +```js +function reducer(state, action) { + switch (action.type) { + case "incremented_age": { + return { + name: state.name, + age: state.age + 1, + }; + } + case "changed_name": { + return { + name: action.nextName, + age: state.age, + }; + } + } + throw Error("Unknown action: " + action.type); +} +``` + +Actions can have any shape. By convention, it's common to pass objects with a `type` property identifying the action. It should include the minimal necessary information that the reducer needs to compute the next state. + +```js +function Form() { + const [state, dispatch] = useReducer(reducer, { name: 'Taylor', age: 42 }); + + function handleButtonClick() { + dispatch({ type: 'incremented_age' }); + } + + function handleInputChange(e) { + dispatch({ + type: 'changed_name', + nextName: e.target.value + }); + } + // ... +``` + +The action type names are local to your component. [Each action describes a single interaction, even if that leads to multiple changes in data.](/learn/extracting-state-logic-into-a-reducer#writing-reducers-well) The shape of the state is arbitrary, but usually it'll be an object or an array. + +Read [extracting state logic into a reducer](/learn/extracting-state-logic-into-a-reducer) to learn more. + +<Pitfall> + +State is read-only. Don't modify any objects or arrays in state: + +```js +function reducer(state, action) { + switch (action.type) { + case 'incremented_age': { + // 🚩 Don't mutate an object in state like this: + state.age = state.age + 1; + return state; + } +``` + +Instead, always return new objects from your reducer: + +```js +function reducer(state, action) { + switch (action.type) { + case 'incremented_age': { + // ✅ Instead, return a new object + return { + ...state, + age: state.age + 1 + }; + } +``` + +Read [updating objects in state](/learn/updating-objects-in-state) and [updating arrays in state](/learn/updating-arrays-in-state) to learn more. + +</Pitfall> + +<Recipes titleText="Basic useReducer examples" titleId="examples-basic"> + +#### Form (object) + +In this example, the reducer manages a state object with two fields: `name` and `age`. + +```js +import { useReducer } from "react"; + +function reducer(state, action) { + switch (action.type) { + case "incremented_age": { + return { + name: state.name, + age: state.age + 1, + }; + } + case "changed_name": { + return { + name: action.nextName, + age: state.age, + }; + } + } + throw Error("Unknown action: " + action.type); +} + +const initialState = { name: "Taylor", age: 42 }; + +export default function Form() { + const [state, dispatch] = useReducer(reducer, initialState); + + function handleButtonClick() { + dispatch({ type: "incremented_age" }); + } + + function handleInputChange(e) { + dispatch({ + type: "changed_name", + nextName: e.target.value, + }); + } + + return ( + <> + <input value={state.name} onChange={handleInputChange} /> + <button onClick={handleButtonClick}>Increment age</button> + <p> + Hello, {state.name}. You are {state.age}. + </p> + </> + ); +} +``` + +```css +button { + display: block; + margin-top: 10px; +} +``` + +#### Todo list (array) + +In this example, the reducer manages an array of tasks. The array needs to be updated [without mutation.](/learn/updating-arrays-in-state) + +```js +import { useReducer } from "react"; +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; + +function tasksReducer(tasks, action) { + switch (action.type) { + case "added": { + return [ + ...tasks, + { + id: action.id, + text: action.text, + done: false, + }, + ]; + } + case "changed": { + return tasks.map((t) => { + if (t.id === action.task.id) { + return action.task; + } else { + return t; + } + }); + } + case "deleted": { + return tasks.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} + +export default function TaskApp() { + const [tasks, dispatch] = useReducer(tasksReducer, initialTasks); + + function handleAddTask(text) { + dispatch({ + type: "added", + id: nextId++, + text: text, + }); + } + + function handleChangeTask(task) { + dispatch({ + type: "changed", + task: task, + }); + } + + function handleDeleteTask(taskId) { + dispatch({ + type: "deleted", + id: taskId, + }); + } + + return ( + <> + <h1>Prague itinerary</h1> + <AddTask onAddTask={handleAddTask} /> + <TaskList + tasks={tasks} + onChangeTask={handleChangeTask} + onDeleteTask={handleDeleteTask} + /> + </> + ); +} + +let nextId = 3; +const initialTasks = [ + { id: 0, text: "Visit Kafka Museum", done: true }, + { id: 1, text: "Watch a puppet show", done: false }, + { id: 2, text: "Lennon Wall pic", done: false }, +]; +``` + +```js +import { useState } from "react"; + +export default function AddTask({ onAddTask }) { + const [text, setText] = useState(""); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + onClick={() => { + setText(""); + onAddTask(text); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ tasks, onChangeTask, onDeleteTask }) { + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task + task={task} + onChange={onChangeTask} + onDelete={onDeleteTask} + /> + </li> + ))} + </ul> + ); +} + +function Task({ task, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + onChange({ + ...task, + text: e.target.value, + }); + }} + /> + <button onClick={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button onClick={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + onChange({ + ...task, + done: e.target.checked, + }); + }} + /> + {taskContent} + <button onClick={() => onDelete(task.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +#### Writing concise update logic with Immer + +If updating arrays and objects without mutation feels tedious, you can use a library like [Immer](https://github.com/immerjs/use-immer#useimmerreducer) to reduce repetitive code. Immer lets you write concise code as if you were mutating objects, but under the hood it performs immutable updates: + +```js +import { useImmerReducer } from "use-immer"; +import AddTask from "./AddTask.js"; +import TaskList from "./TaskList.js"; + +function tasksReducer(draft, action) { + switch (action.type) { + case "added": { + draft.push({ + id: action.id, + text: action.text, + done: false, + }); + break; + } + case "changed": { + const index = draft.findIndex((t) => t.id === action.task.id); + draft[index] = action.task; + break; + } + case "deleted": { + return draft.filter((t) => t.id !== action.id); + } + default: { + throw Error("Unknown action: " + action.type); + } + } +} + +export default function TaskApp() { + const [tasks, dispatch] = useImmerReducer(tasksReducer, initialTasks); + + function handleAddTask(text) { + dispatch({ + type: "added", + id: nextId++, + text: text, + }); + } + + function handleChangeTask(task) { + dispatch({ + type: "changed", + task: task, + }); + } + + function handleDeleteTask(taskId) { + dispatch({ + type: "deleted", + id: taskId, + }); + } + + return ( + <> + <h1>Prague itinerary</h1> + <AddTask onAddTask={handleAddTask} /> + <TaskList + tasks={tasks} + onChangeTask={handleChangeTask} + onDeleteTask={handleDeleteTask} + /> + </> + ); +} + +let nextId = 3; +const initialTasks = [ + { id: 0, text: "Visit Kafka Museum", done: true }, + { id: 1, text: "Watch a puppet show", done: false }, + { id: 2, text: "Lennon Wall pic", done: false }, +]; +``` + +```js +import { useState } from "react"; + +export default function AddTask({ onAddTask }) { + const [text, setText] = useState(""); + return ( + <> + <input + placeholder="Add task" + value={text} + onChange={(e) => setText(e.target.value)} + /> + <button + onClick={() => { + setText(""); + onAddTask(text); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ tasks, onChangeTask, onDeleteTask }) { + return ( + <ul> + {tasks.map((task) => ( + <li key={task.id}> + <Task + task={task} + onChange={onChangeTask} + onDelete={onDeleteTask} + /> + </li> + ))} + </ul> + ); +} + +function Task({ task, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let taskContent; + if (isEditing) { + taskContent = ( + <> + <input + value={task.text} + onChange={(e) => { + onChange({ + ...task, + text: e.target.value, + }); + }} + /> + <button onClick={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + taskContent = ( + <> + {task.text} + <button onClick={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={task.done} + onChange={(e) => { + onChange({ + ...task, + done: e.target.checked, + }); + }} + /> + {taskContent} + <button onClick={() => onDelete(task.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +```json package.json +{ + "dependencies": { + "immer": "1.7.3", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "use-immer": "0.5.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +</Recipes> + +--- + +### Avoiding recreating the initial state + +React saves the initial state once and ignores it on the next renders. + +```js +function createInitialState(username) { + // ... +} + +function TodoList({ username }) { + const [state, dispatch] = useReducer(reducer, createInitialState(username)); + // ... +``` + +Although the result of `createInitialState(username)` is only used for the initial render, you're still calling this function on every render. This can be wasteful if it's creating large arrays or performing expensive calculations. + +To solve this, you may **pass it as an _initializer_ function** to `useReducer` as the third argument instead: + +```js +function createInitialState(username) { + // ... +} + +function TodoList({ username }) { + const [state, dispatch] = useReducer(reducer, username, createInitialState); + // ... +``` + +Notice that you’re passing `createInitialState`, which is the _function itself_, and not `createInitialState()`, which is the result of calling it. This way, the initial state does not get re-created after initialization. + +In the above example, `createInitialState` takes a `username` argument. If your initializer doesn't need any information to compute the initial state, you may pass `null` as the second argument to `useReducer`. + +<Recipes titleText="The difference between passing an initializer and passing the initial state directly" titleId="examples-initializer"> + +#### Passing the initializer function + +This example passes the initializer function, so the `createInitialState` function only runs during initialization. It does not run when component re-renders, such as when you type into the input. + +```js +import TodoList from "./TodoList.js"; + +export default function App() { + return <TodoList username="Taylor" />; +} +``` + +```js +import { useReducer } from "react"; + +function createInitialState(username) { + const initialTodos = []; + for (let i = 0; i < 50; i++) { + initialTodos.push({ + id: i, + text: username + "'s task #" + (i + 1), + }); + } + return { + draft: "", + todos: initialTodos, + }; +} + +function reducer(state, action) { + switch (action.type) { + case "changed_draft": { + return { + draft: action.nextDraft, + todos: state.todos, + }; + } + case "added_todo": { + return { + draft: "", + todos: [ + { + id: state.todos.length, + text: state.draft, + }, + ...state.todos, + ], + }; + } + } + throw Error("Unknown action: " + action.type); +} + +export default function TodoList({ username }) { + const [state, dispatch] = useReducer(reducer, username, createInitialState); + return ( + <> + <input + value={state.draft} + onChange={(e) => { + dispatch({ + type: "changed_draft", + nextDraft: e.target.value, + }); + }} + /> + <button + onClick={() => { + dispatch({ type: "added_todo" }); + }} + > + Add + </button> + <ul> + {state.todos.map((item) => ( + <li key={item.id}>{item.text}</li> + ))} + </ul> + </> + ); +} +``` + +#### Passing the initial state directly + +This example **does not** pass the initializer function, so the `createInitialState` function runs on every render, such as when you type into the input. There is no observable difference in behavior, but this code is less efficient. + +```js +import TodoList from "./TodoList.js"; + +export default function App() { + return <TodoList username="Taylor" />; +} +``` + +```js +import { useReducer } from "react"; + +function createInitialState(username) { + const initialTodos = []; + for (let i = 0; i < 50; i++) { + initialTodos.push({ + id: i, + text: username + "'s task #" + (i + 1), + }); + } + return { + draft: "", + todos: initialTodos, + }; +} + +function reducer(state, action) { + switch (action.type) { + case "changed_draft": { + return { + draft: action.nextDraft, + todos: state.todos, + }; + } + case "added_todo": { + return { + draft: "", + todos: [ + { + id: state.todos.length, + text: state.draft, + }, + ...state.todos, + ], + }; + } + } + throw Error("Unknown action: " + action.type); +} + +export default function TodoList({ username }) { + const [state, dispatch] = useReducer(reducer, createInitialState(username)); + return ( + <> + <input + value={state.draft} + onChange={(e) => { + dispatch({ + type: "changed_draft", + nextDraft: e.target.value, + }); + }} + /> + <button + onClick={() => { + dispatch({ type: "added_todo" }); + }} + > + Add + </button> + <ul> + {state.todos.map((item) => ( + <li key={item.id}>{item.text}</li> + ))} + </ul> + </> + ); +} +``` + +</Recipes> + +--- + +## Troubleshooting + +### I've dispatched an action, but logging gives me the old state value + +Calling the `dispatch` function **does not change state in the running code**: + +```js +function handleClick() { + console.log(state.age); // 42 + + dispatch({ type: "incremented_age" }); // Request a re-render with 43 + console.log(state.age); // Still 42! + + setTimeout(() => { + console.log(state.age); // Also 42! + }, 5000); +} +``` + +This is because [states behaves like a snapshot.](/learn/state-as-a-snapshot) Updating state requests another render with the new state value, but does not affect the `state` JavaScript variable in your already-running event handler. + +If you need to guess the next state value, you can calculate it manually by calling the reducer yourself: + +```js +const action = { type: "incremented_age" }; +dispatch(action); + +const nextState = reducer(state, action); +console.log(state); // { age: 42 } +console.log(nextState); // { age: 43 } +``` + +--- + +### I've dispatched an action, but the screen doesn't update + +React will **ignore your update if the next state is equal to the previous state,** as determined by an [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison. This usually happens when you change an object or an array in state directly: + +```js +function reducer(state, action) { + switch (action.type) { + case "incremented_age": { + // 🚩 Wrong: mutating existing object + state.age++; + return state; + } + case "changed_name": { + // 🚩 Wrong: mutating existing object + state.name = action.nextName; + return state; + } + // ... + } +} +``` + +You mutated an existing `state` object and returned it, so React ignored the update. To fix this, you need to ensure that you're always [updating objects in state](/learn/updating-objects-in-state) and [updating arrays in state](/learn/updating-arrays-in-state) instead of mutating them: + +```js +function reducer(state, action) { + switch (action.type) { + case "incremented_age": { + // ✅ Correct: creating a new object + return { + ...state, + age: state.age + 1, + }; + } + case "changed_name": { + // ✅ Correct: creating a new object + return { + ...state, + name: action.nextName, + }; + } + // ... + } +} +``` + +--- + +### A part of my reducer state becomes undefined after dispatching + +Make sure that every `case` branch **copies all of the existing fields** when returning the new state: + +```js +function reducer(state, action) { + switch (action.type) { + case 'incremented_age': { + return { + ...state, // Don't forget this! + age: state.age + 1 + }; + } + // ... +``` + +Without `...state` above, the returned next state would only contain the `age` field and nothing else. + +--- + +### My entire reducer state becomes undefined after dispatching + +If your state unexpectedly becomes `undefined`, you're likely forgetting to `return` state in one of the cases, or your action type doesn't match any of the `case` statements. To find why, throw an error outside the `switch`: + +```js +function reducer(state, action) { + switch (action.type) { + case "incremented_age": { + // ... + } + case "edited_name": { + // ... + } + } + throw Error("Unknown action: " + action.type); +} +``` + +You can also use a static type checker like TypeScript to catch such mistakes. + +--- + +### I'm getting an error: "Too many re-renders" + +You might get an error that says: `Too many re-renders. React limits the number of renders to prevent an infinite loop.` Typically, this means that you're unconditionally dispatching an action _during render_, so your component enters a loop: render, dispatch (which causes a render), render, dispatch (which causes a render), and so on. Very often, this is caused by a mistake in specifying an event handler: + +```js +// 🚩 Wrong: calls the handler during render +return <button onClick={handleClick()}>Click me</button>; + +// ✅ Correct: passes down the event handler +return <button onClick={handleClick}>Click me</button>; + +// ✅ Correct: passes down an inline function +return <button onClick={(e) => handleClick(e)}>Click me</button>; +``` + +If you can't find the cause of this error, click on the arrow next to the error in the console and look through the JavaScript stack to find the specific `dispatch` function call responsible for the error. + +--- + +### My reducer or initializer function runs twice + +In [Strict Mode](/reference/react/StrictMode), React will call your reducer and initializer functions twice. This shouldn't break your code. + +This **development-only** behavior helps you [keep components pure.](/learn/keeping-components-pure) React uses the result of one of the calls, and ignores the result of the other call. As long as your component, initializer, and reducer functions are pure, this shouldn't affect your logic. However, if they are accidentally impure, this helps you notice the mistakes. + +For example, this impure reducer function mutates an array in state: + +```js +function reducer(state, action) { + switch (action.type) { + case "added_todo": { + // 🚩 Mistake: mutating state + state.todos.push({ id: nextId++, text: action.text }); + return state; + } + // ... + } +} +``` + +Because React calls your reducer function twice, you'll see the todo was added twice, so you'll know that there is a mistake. In this example, you can fix the mistake by [replacing the array instead of mutating it](/learn/updating-arrays-in-state#adding-to-an-array): + +```js +function reducer(state, action) { + switch (action.type) { + case "added_todo": { + // ✅ Correct: replacing with new state + return { + ...state, + todos: [...state.todos, { id: nextId++, text: action.text }], + }; + } + // ... + } +} +``` + +Now that this reducer function is pure, calling it an extra time doesn't make a difference in behavior. This is why React calling it twice helps you find mistakes. **Only component, initializer, and reducer functions need to be pure.** Event handlers don't need to be pure, so React will never call your event handlers twice. + +Read [keeping components pure](/learn/keeping-components-pure) to learn more. diff --git a/docs/src/reference/use-ref.md b/docs/src/reference/use-ref.md index fa1f25a02..1554ffc7e 100644 --- a/docs/src/reference/use-ref.md +++ b/docs/src/reference/use-ref.md @@ -1,3 +1,534 @@ --- title: Use Ref 🚧 --- + +## Overview + +<p class="intro" markdown> + +`useRef` is a React Hook that lets you reference a value that's not needed for rendering. + +```js +const ref = useRef(initialValue); +``` + +</p> + +--- + +## Reference + +### `useRef(initialValue)` + +Call `useRef` at the top level of your component to declare a [ref.](/learn/referencing-values-with-refs) + +```js +import { useRef } from 'react'; + +function MyComponent() { + const intervalRef = useRef(0); + const inputRef = useRef(null); + // ... +``` + +[See more examples below.](#usage) + +#### Parameters + +- `initialValue`: The value you want the ref object's `current` property to be initially. It can be a value of any type. This argument is ignored after the initial render. + +#### Returns + +`useRef` returns an object with a single property: + +- `current`: Initially, it's set to the `initialValue` you have passed. You can later set it to something else. If you pass the ref object to React as a `ref` attribute to a JSX node, React will set its `current` property. + +On the next renders, `useRef` will return the same object. + +#### Caveats + +- You can mutate the `ref.current` property. Unlike state, it is mutable. However, if it holds an object that is used for rendering (for example, a piece of your state), then you shouldn't mutate that object. +- When you change the `ref.current` property, React does not re-render your component. React is not aware of when you change it because a ref is a plain JavaScript object. +- Do not write _or read_ `ref.current` during rendering, except for [initialization.](#avoiding-recreating-the-ref-contents) This makes your component's behavior unpredictable. +- In Strict Mode, React will **call your component function twice** in order to [help you find accidental impurities.](#my-initializer-or-updater-function-runs-twice) This is development-only behavior and does not affect production. Each ref object will be created twice, but one of the versions will be discarded. If your component function is pure (as it should be), this should not affect the behavior. + +--- + +## Usage + +### Referencing a value with a ref + +Call `useRef` at the top level of your component to declare one or more [refs.](/learn/referencing-values-with-refs) + +```js +import { useRef } from 'react'; + +function Stopwatch() { + const intervalRef = useRef(0); + // ... +``` + +`useRef` returns a <CodeStep step={1}>ref object</CodeStep> with a single <CodeStep step={2}>`current` property</CodeStep> initially set to the <CodeStep step={3}>initial value</CodeStep> you provided. + +On the next renders, `useRef` will return the same object. You can change its `current` property to store information and read it later. This might remind you of [state](/reference/react/useState), but there is an important difference. + +**Changing a ref does not trigger a re-render.** This means refs are perfect for storing information that doesn't affect the visual output of your component. For example, if you need to store an [interval ID](https://developer.mozilla.org/en-US/docs/Web/API/setInterval) and retrieve it later, you can put it in a ref. To update the value inside the ref, you need to manually change its <CodeStep step={2}>`current` property</CodeStep>: + +```js +function handleStartClick() { + const intervalId = setInterval(() => { + // ... + }, 1000); + intervalRef.current = intervalId; +} +``` + +Later, you can read that interval ID from the ref so that you can call [clear that interval](https://developer.mozilla.org/en-US/docs/Web/API/clearInterval): + +```js +function handleStopClick() { + const intervalId = intervalRef.current; + clearInterval(intervalId); +} +``` + +By using a ref, you ensure that: + +- You can **store information** between re-renders (unlike regular variables, which reset on every render). +- Changing it **does not trigger a re-render** (unlike state variables, which trigger a re-render). +- The **information is local** to each copy of your component (unlike the variables outside, which are shared). + +Changing a ref does not trigger a re-render, so refs are not appropriate for storing information you want to display on the screen. Use state for that instead. Read more about [choosing between `useRef` and `useState`.](/learn/referencing-values-with-refs#differences-between-refs-and-state) + +<Recipes titleText="Examples of referencing a value with useRef" titleId="examples-value"> + +#### Click counter + +This component uses a ref to keep track of how many times the button was clicked. Note that it's okay to use a ref instead of state here because the click count is only read and written in an event handler. + +```js +import { useRef } from "react"; + +export default function Counter() { + let ref = useRef(0); + + function handleClick() { + ref.current = ref.current + 1; + alert("You clicked " + ref.current + " times!"); + } + + return <button onClick={handleClick}>Click me!</button>; +} +``` + +If you show `{ref.current}` in the JSX, the number won't update on click. This is because setting `ref.current` does not trigger a re-render. Information that's used for rendering should be state instead. + +#### A stopwatch + +This example uses a combination of state and refs. Both `startTime` and `now` are state variables because they are used for rendering. But we also need to hold an [interval ID](https://developer.mozilla.org/en-US/docs/Web/API/setInterval) so that we can stop the interval on button press. Since the interval ID is not used for rendering, it's appropriate to keep it in a ref, and manually update it. + +```js +import { useState, useRef } from "react"; + +export default function Stopwatch() { + const [startTime, setStartTime] = useState(null); + const [now, setNow] = useState(null); + const intervalRef = useRef(null); + + function handleStart() { + setStartTime(Date.now()); + setNow(Date.now()); + + clearInterval(intervalRef.current); + intervalRef.current = setInterval(() => { + setNow(Date.now()); + }, 10); + } + + function handleStop() { + clearInterval(intervalRef.current); + } + + let secondsPassed = 0; + if (startTime != null && now != null) { + secondsPassed = (now - startTime) / 1000; + } + + return ( + <> + <h1>Time passed: {secondsPassed.toFixed(3)}</h1> + <button onClick={handleStart}>Start</button> + <button onClick={handleStop}>Stop</button> + </> + ); +} +``` + +</Recipes> + +<Pitfall> + +**Do not write _or read_ `ref.current` during rendering.** + +React expects that the body of your component [behaves like a pure function](/learn/keeping-components-pure): + +- If the inputs ([props](/learn/passing-props-to-a-component), [state](/learn/state-a-components-memory), and [context](/learn/passing-data-deeply-with-context)) are the same, it should return exactly the same JSX. +- Calling it in a different order or with different arguments should not affect the results of other calls. + +Reading or writing a ref **during rendering** breaks these expectations. + +```js +function MyComponent() { + // ... + // 🚩 Don't write a ref during rendering + myRef.current = 123; + // ... + // 🚩 Don't read a ref during rendering + return <h1>{myOtherRef.current}</h1>; +} +``` + +You can read or write refs **from event handlers or effects instead**. + +```js +function MyComponent() { + // ... + useEffect(() => { + // ✅ You can read or write refs in effects + myRef.current = 123; + }); + // ... + function handleClick() { + // ✅ You can read or write refs in event handlers + doSomething(myOtherRef.current); + } + // ... +} +``` + +If you _have to_ read [or write](/reference/react/useState#storing-information-from-previous-renders) something during rendering, [use state](/reference/react/useState) instead. + +When you break these rules, your component might still work, but most of the newer features we're adding to React will rely on these expectations. Read more about [keeping your components pure.](/learn/keeping-components-pure#where-you-can-cause-side-effects) + +</Pitfall> + +--- + +### Manipulating the DOM with a ref + +It's particularly common to use a ref to manipulate the [DOM.](https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API) React has built-in support for this. + +First, declare a <CodeStep step={1}>ref object</CodeStep> with an <CodeStep step={3}>initial value</CodeStep> of `null`: + +```js +import { useRef } from 'react'; + +function MyComponent() { + const inputRef = useRef(null); + // ... +``` + +Then pass your ref object as the `ref` attribute to the JSX of the DOM node you want to manipulate: + +```js +// ... +return <input ref={inputRef} />; +``` + +After React creates the DOM node and puts it on the screen, React will set the <CodeStep step={2}>`current` property</CodeStep> of your ref object to that DOM node. Now you can access the `<input>`'s DOM node and call methods like [`focus()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus): + +```js +function handleClick() { + inputRef.current.focus(); +} +``` + +React will set the `current` property back to `null` when the node is removed from the screen. + +Read more about [manipulating the DOM with refs.](/learn/manipulating-the-dom-with-refs) + +<Recipes titleText="Examples of manipulating the DOM with useRef" titleId="examples-dom"> + +#### Focusing a text input + +In this example, clicking the button will focus the input: + +```js +import { useRef } from "react"; + +export default function Form() { + const inputRef = useRef(null); + + function handleClick() { + inputRef.current.focus(); + } + + return ( + <> + <input ref={inputRef} /> + <button onClick={handleClick}>Focus the input</button> + </> + ); +} +``` + +#### Scrolling an image into view + +In this example, clicking the button will scroll an image into view. It uses a ref to the list DOM node, and then calls DOM [`querySelectorAll`](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll) API to find the image we want to scroll to. + +```js +import { useRef } from "react"; + +export default function CatFriends() { + const listRef = useRef(null); + + function scrollToIndex(index) { + const listNode = listRef.current; + // This line assumes a particular DOM structure: + const imgNode = listNode.querySelectorAll("li > img")[index]; + imgNode.scrollIntoView({ + behavior: "smooth", + block: "nearest", + inline: "center", + }); + } + + return ( + <> + <nav> + <button onClick={() => scrollToIndex(0)}>Tom</button> + <button onClick={() => scrollToIndex(1)}>Maru</button> + <button onClick={() => scrollToIndex(2)}>Jellylorum</button> + </nav> + <div> + <ul ref={listRef}> + <li> + <img + src="https://placekitten.com/g/200/200" + alt="Tom" + /> + </li> + <li> + <img + src="https://placekitten.com/g/300/200" + alt="Maru" + /> + </li> + <li> + <img + src="https://placekitten.com/g/250/200" + alt="Jellylorum" + /> + </li> + </ul> + </div> + </> + ); +} +``` + +```css +div { + width: 100%; + overflow: hidden; +} + +nav { + text-align: center; +} + +button { + margin: 0.25rem; +} + +ul, +li { + list-style: none; + white-space: nowrap; +} + +li { + display: inline; + padding: 0.5rem; +} +``` + +#### Playing and pausing a video + +This example uses a ref to call [`play()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play) and [`pause()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause) on a `<video>` DOM node. + +```js +import { useState, useRef } from "react"; + +export default function VideoPlayer() { + const [isPlaying, setIsPlaying] = useState(false); + const ref = useRef(null); + + function handleClick() { + const nextIsPlaying = !isPlaying; + setIsPlaying(nextIsPlaying); + + if (nextIsPlaying) { + ref.current.play(); + } else { + ref.current.pause(); + } + } + + return ( + <> + <button onClick={handleClick}> + {isPlaying ? "Pause" : "Play"} + </button> + <video + width="250" + ref={ref} + onPlay={() => setIsPlaying(true)} + onPause={() => setIsPlaying(false)} + > + <source + src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4" + type="video/mp4" + /> + </video> + </> + ); +} +``` + +```css +button { + display: block; + margin-bottom: 20px; +} +``` + +#### Exposing a ref to your own component + +Sometimes, you may want to let the parent component manipulate the DOM inside of your component. For example, maybe you're writing a `MyInput` component, but you want the parent to be able to focus the input (which the parent has no access to). You can use a combination of `useRef` to hold the input and [`forwardRef`](/reference/react/forwardRef) to expose it to the parent component. Read a [detailed walkthrough](/learn/manipulating-the-dom-with-refs#accessing-another-components-dom-nodes) here. + +```js +import { forwardRef, useRef } from "react"; + +const MyInput = forwardRef((props, ref) => { + return <input {...props} ref={ref} />; +}); + +export default function Form() { + const inputRef = useRef(null); + + function handleClick() { + inputRef.current.focus(); + } + + return ( + <> + <MyInput ref={inputRef} /> + <button onClick={handleClick}>Focus the input</button> + </> + ); +} +``` + +</Recipes> + +--- + +### Avoiding recreating the ref contents + +React saves the initial ref value once and ignores it on the next renders. + +```js +function Video() { + const playerRef = useRef(new VideoPlayer()); + // ... +``` + +Although the result of `new VideoPlayer()` is only used for the initial render, you're still calling this function on every render. This can be wasteful if it's creating expensive objects. + +To solve it, you may initialize the ref like this instead: + +```js +function Video() { + const playerRef = useRef(null); + if (playerRef.current === null) { + playerRef.current = new VideoPlayer(); + } + // ... +``` + +Normally, writing or reading `ref.current` during render is not allowed. However, it's fine in this case because the result is always the same, and the condition only executes during initialization so it's fully predictable. + +<DeepDive> + +#### How to avoid null checks when initializing useRef later + +If you use a type checker and don't want to always check for `null`, you can try a pattern like this instead: + +```js +function Video() { + const playerRef = useRef(null); + + function getPlayer() { + if (playerRef.current !== null) { + return playerRef.current; + } + const player = new VideoPlayer(); + playerRef.current = player; + return player; + } + + // ... +``` + +Here, the `playerRef` itself is nullable. However, you should be able to convince your type checker that there is no case in which `getPlayer()` returns `null`. Then use `getPlayer()` in your event handlers. + +</DeepDive> + +--- + +## Troubleshooting + +### I can't get a ref to a custom component + +If you try to pass a `ref` to your own component like this: + +```js +const inputRef = useRef(null); + +return <MyInput ref={inputRef} />; +``` + +You might get an error in the console: + +<ConsoleBlock level="error"> + +Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()? + +</ConsoleBlock> + +By default, your own components don't expose refs to the DOM nodes inside them. + +To fix this, find the component that you want to get a ref to: + +```js +export default function MyInput({ value, onChange }) { + return <input value={value} onChange={onChange} />; +} +``` + +And then wrap it in [`forwardRef`](/reference/react/forwardRef) like this: + +```js +import { forwardRef } from "react"; + +const MyInput = forwardRef(({ value, onChange }, ref) => { + return <input value={value} onChange={onChange} ref={ref} />; +}); + +export default MyInput; +``` + +Then the parent component can get a ref to it. + +Read more about [accessing another component's DOM nodes.](/learn/manipulating-the-dom-with-refs#accessing-another-components-dom-nodes) diff --git a/docs/src/reference/use-state.md b/docs/src/reference/use-state.md index e60b34d64..c624bbd9e 100644 --- a/docs/src/reference/use-state.md +++ b/docs/src/reference/use-state.md @@ -1,3 +1,1234 @@ --- title: Use State 🚧 --- + +## Overview + +<p class="intro" markdown> + +`useState` is a React Hook that lets you add a [state variable](/learn/state-a-components-memory) to your component. + +```js +const [state, setState] = useState(initialState); +``` + +</p> + +--- + +## Reference + +### `useState(initialState)` + +Call `useState` at the top level of your component to declare a [state variable.](/learn/state-a-components-memory) + +```js +import { useState } from 'react'; + +function MyComponent() { + const [age, setAge] = useState(28); + const [name, setName] = useState('Taylor'); + const [todos, setTodos] = useState(() => createTodos()); + // ... +``` + +The convention is to name state variables like `[something, setSomething]` using [array destructuring.](https://javascript.info/destructuring-assignment) + +[See more examples below.](#usage) + +#### Parameters + +- `initialState`: The value you want the state to be initially. It can be a value of any type, but there is a special behavior for functions. This argument is ignored after the initial render. + - If you pass a function as `initialState`, it will be treated as an _initializer function_. It should be pure, should take no arguments, and should return a value of any type. React will call your initializer function when initializing the component, and store its return value as the initial state. [See an example below.](#avoiding-recreating-the-initial-state) + +#### Returns + +`useState` returns an array with exactly two values: + +1. The current state. During the first render, it will match the `initialState` you have passed. +2. The [`set` function](#setstate) that lets you update the state to a different value and trigger a re-render. + +#### Caveats + +- `useState` is a Hook, so you can only call it **at the top level of your component** or your own Hooks. You can't call it inside loops or conditions. If you need that, extract a new component and move the state into it. +- In Strict Mode, React will **call your initializer function twice** in order to [help you find accidental impurities.](#my-initializer-or-updater-function-runs-twice) This is development-only behavior and does not affect production. If your initializer function is pure (as it should be), this should not affect the behavior. The result from one of the calls will be ignored. + +--- + +### `set` functions, like `setSomething(nextState)` + +The `set` function returned by `useState` lets you update the state to a different value and trigger a re-render. You can pass the next state directly, or a function that calculates it from the previous state: + +```js +const [name, setName] = useState('Edward'); + +function handleClick() { + setName('Taylor'); + setAge(a => a + 1); + // ... +``` + +#### Parameters + +- `nextState`: The value that you want the state to be. It can be a value of any type, but there is a special behavior for functions. + - If you pass a function as `nextState`, it will be treated as an _updater function_. It must be pure, should take the pending state as its only argument, and should return the next state. React will put your updater function in a queue and re-render your component. During the next render, React will calculate the next state by applying all of the queued updaters to the previous state. [See an example below.](#updating-state-based-on-the-previous-state) + +#### Returns + +`set` functions do not have a return value. + +#### Caveats + +- The `set` function **only updates the state variable for the _next_ render**. If you read the state variable after calling the `set` function, [you will still get the old value](#ive-updated-the-state-but-logging-gives-me-the-old-value) that was on the screen before your call. + +- If the new value you provide is identical to the current `state`, as determined by an [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison, React will **skip re-rendering the component and its children.** This is an optimization. Although in some cases React may still need to call your component before skipping the children, it shouldn't affect your code. + +- React [batches state updates.](/learn/queueing-a-series-of-state-updates) It updates the screen **after all the event handlers have run** and have called their `set` functions. This prevents multiple re-renders during a single event. In the rare case that you need to force React to update the screen earlier, for example to access the DOM, you can use [`flushSync`.](/reference/react-dom/flushSync) + +- Calling the `set` function _during rendering_ is only allowed from within the currently rendering component. React will discard its output and immediately attempt to render it again with the new state. This pattern is rarely needed, but you can use it to **store information from the previous renders**. [See an example below.](#storing-information-from-previous-renders) + +- In Strict Mode, React will **call your updater function twice** in order to [help you find accidental impurities.](#my-initializer-or-updater-function-runs-twice) This is development-only behavior and does not affect production. If your updater function is pure (as it should be), this should not affect the behavior. The result from one of the calls will be ignored. + +--- + +## Usage + +### Adding state to a component + +Call `useState` at the top level of your component to declare one or more [state variables.](/learn/state-a-components-memory) + +```js +import { useState } from 'react'; + +function MyComponent() { + const [age, setAge] = useState(42); + const [name, setName] = useState('Taylor'); + // ... +``` + +The convention is to name state variables like `[something, setSomething]` using [array destructuring.](https://javascript.info/destructuring-assignment) + +`useState` returns an array with exactly two items: + +1. The <CodeStep step={1}>current state</CodeStep> of this state variable, initially set to the <CodeStep step={3}>initial state</CodeStep> you provided. +2. The <CodeStep step={2}>`set` function</CodeStep> that lets you change it to any other value in response to interaction. + +To update what’s on the screen, call the `set` function with some next state: + +```js +function handleClick() { + setName("Robin"); +} +``` + +React will store the next state, render your component again with the new values, and update the UI. + +<Pitfall> + +Calling the `set` function [**does not** change the current state in the already executing code](#ive-updated-the-state-but-logging-gives-me-the-old-value): + +```js +function handleClick() { + setName("Robin"); + console.log(name); // Still "Taylor"! +} +``` + +It only affects what `useState` will return starting from the _next_ render. + +</Pitfall> + +<Recipes titleText="Basic useState examples" titleId="examples-basic"> + +#### Counter (number) + +In this example, the `count` state variable holds a number. Clicking the button increments it. + +```js +import { useState } from "react"; + +export default function Counter() { + const [count, setCount] = useState(0); + + function handleClick() { + setCount(count + 1); + } + + return <button onClick={handleClick}>You pressed me {count} times</button>; +} +``` + +#### Text field (string) + +In this example, the `text` state variable holds a string. When you type, `handleChange` reads the latest input value from the browser input DOM element, and calls `setText` to update the state. This allows you to display the current `text` below. + +```js +import { useState } from "react"; + +export default function MyInput() { + const [text, setText] = useState("hello"); + + function handleChange(e) { + setText(e.target.value); + } + + return ( + <> + <input value={text} onChange={handleChange} /> + <p>You typed: {text}</p> + <button onClick={() => setText("hello")}>Reset</button> + </> + ); +} +``` + +#### Checkbox (boolean) + +In this example, the `liked` state variable holds a boolean. When you click the input, `setLiked` updates the `liked` state variable with whether the browser checkbox input is checked. The `liked` variable is used to render the text below the checkbox. + +```js +import { useState } from "react"; + +export default function MyCheckbox() { + const [liked, setLiked] = useState(true); + + function handleChange(e) { + setLiked(e.target.checked); + } + + return ( + <> + <label> + <input + type="checkbox" + checked={liked} + onChange={handleChange} + /> + I liked this + </label> + <p>You {liked ? "liked" : "did not like"} this.</p> + </> + ); +} +``` + +#### Form (two variables) + +You can declare more than one state variable in the same component. Each state variable is completely independent. + +```js +import { useState } from "react"; + +export default function Form() { + const [name, setName] = useState("Taylor"); + const [age, setAge] = useState(42); + + return ( + <> + <input value={name} onChange={(e) => setName(e.target.value)} /> + <button onClick={() => setAge(age + 1)}>Increment age</button> + <p> + Hello, {name}. You are {age}. + </p> + </> + ); +} +``` + +```css +button { + display: block; + margin-top: 10px; +} +``` + +</Recipes> + +--- + +### Updating state based on the previous state + +Suppose the `age` is `42`. This handler calls `setAge(age + 1)` three times: + +```js +function handleClick() { + setAge(age + 1); // setAge(42 + 1) + setAge(age + 1); // setAge(42 + 1) + setAge(age + 1); // setAge(42 + 1) +} +``` + +However, after one click, `age` will only be `43` rather than `45`! This is because calling the `set` function [does not update](/learn/state-as-a-snapshot) the `age` state variable in the already running code. So each `setAge(age + 1)` call becomes `setAge(43)`. + +To solve this problem, **you may pass an _updater function_** to `setAge` instead of the next state: + +```js +function handleClick() { + setAge((a) => a + 1); // setAge(42 => 43) + setAge((a) => a + 1); // setAge(43 => 44) + setAge((a) => a + 1); // setAge(44 => 45) +} +``` + +Here, `a => a + 1` is your updater function. It takes the <CodeStep step={1}>pending state</CodeStep> and calculates the <CodeStep step={2}>next state</CodeStep> from it. + +React puts your updater functions in a [queue.](/learn/queueing-a-series-of-state-updates) Then, during the next render, it will call them in the same order: + +1. `a => a + 1` will receive `42` as the pending state and return `43` as the next state. +1. `a => a + 1` will receive `43` as the pending state and return `44` as the next state. +1. `a => a + 1` will receive `44` as the pending state and return `45` as the next state. + +There are no other queued updates, so React will store `45` as the current state in the end. + +By convention, it's common to name the pending state argument for the first letter of the state variable name, like `a` for `age`. However, you may also call it like `prevAge` or something else that you find clearer. + +React may [call your updaters twice](#my-initializer-or-updater-function-runs-twice) in development to verify that they are [pure.](/learn/keeping-components-pure) + +<DeepDive> + +#### Is using an updater always preferred? + +You might hear a recommendation to always write code like `setAge(a => a + 1)` if the state you're setting is calculated from the previous state. There is no harm in it, but it is also not always necessary. + +In most cases, there is no difference between these two approaches. React always makes sure that for intentional user actions, like clicks, the `age` state variable would be updated before the next click. This means there is no risk of a click handler seeing a "stale" `age` at the beginning of the event handler. + +However, if you do multiple updates within the same event, updaters can be helpful. They're also helpful if accessing the state variable itself is inconvenient (you might run into this when optimizing re-renders). + +If you prefer consistency over slightly more verbose syntax, it's reasonable to always write an updater if the state you're setting is calculated from the previous state. If it's calculated from the previous state of some _other_ state variable, you might want to combine them into one object and [use a reducer.](/learn/extracting-state-logic-into-a-reducer) + +</DeepDive> + +<Recipes titleText="The difference between passing an updater and passing the next state directly" titleId="examples-updater"> + +#### Passing the updater function + +This example passes the updater function, so the "+3" button works. + +```js +import { useState } from "react"; + +export default function Counter() { + const [age, setAge] = useState(42); + + function increment() { + setAge((a) => a + 1); + } + + return ( + <> + <h1>Your age: {age}</h1> + <button + onClick={() => { + increment(); + increment(); + increment(); + }} + > + +3 + </button> + <button + onClick={() => { + increment(); + }} + > + +1 + </button> + </> + ); +} +``` + +```css +button { + display: block; + margin: 10px; + font-size: 20px; +} +h1 { + display: block; + margin: 10px; +} +``` + +#### Passing the next state directly + +This example **does not** pass the updater function, so the "+3" button **doesn't work as intended**. + +```js +import { useState } from "react"; + +export default function Counter() { + const [age, setAge] = useState(42); + + function increment() { + setAge(age + 1); + } + + return ( + <> + <h1>Your age: {age}</h1> + <button + onClick={() => { + increment(); + increment(); + increment(); + }} + > + +3 + </button> + <button + onClick={() => { + increment(); + }} + > + +1 + </button> + </> + ); +} +``` + +```css +button { + display: block; + margin: 10px; + font-size: 20px; +} +h1 { + display: block; + margin: 10px; +} +``` + +</Recipes> + +--- + +### Updating objects and arrays in state + +You can put objects and arrays into state. In React, state is considered read-only, so **you should _replace_ it rather than _mutate_ your existing objects**. For example, if you have a `form` object in state, don't mutate it: + +```js +// 🚩 Don't mutate an object in state like this: +form.firstName = "Taylor"; +``` + +Instead, replace the whole object by creating a new one: + +```js +// ✅ Replace state with a new object +setForm({ + ...form, + firstName: "Taylor", +}); +``` + +Read [updating objects in state](/learn/updating-objects-in-state) and [updating arrays in state](/learn/updating-arrays-in-state) to learn more. + +<Recipes titleText="Examples of objects and arrays in state" titleId="examples-objects"> + +#### Form (object) + +In this example, the `form` state variable holds an object. Each input has a change handler that calls `setForm` with the next state of the entire form. The `{ ...form }` spread syntax ensures that the state object is replaced rather than mutated. + +```js +import { useState } from "react"; + +export default function Form() { + const [form, setForm] = useState({ + firstName: "Barbara", + lastName: "Hepworth", + email: "bhepworth@sculpture.com", + }); + + return ( + <> + <label> + First name: + <input + value={form.firstName} + onChange={(e) => { + setForm({ + ...form, + firstName: e.target.value, + }); + }} + /> + </label> + <label> + Last name: + <input + value={form.lastName} + onChange={(e) => { + setForm({ + ...form, + lastName: e.target.value, + }); + }} + /> + </label> + <label> + Email: + <input + value={form.email} + onChange={(e) => { + setForm({ + ...form, + email: e.target.value, + }); + }} + /> + </label> + <p> + {form.firstName} {form.lastName} ({form.email}) + </p> + </> + ); +} +``` + +```css +label { + display: block; +} +input { + margin-left: 5px; +} +``` + +#### Form (nested object) + +In this example, the state is more nested. When you update nested state, you need to create a copy of the object you're updating, as well as any objects "containing" it on the way upwards. Read [updating a nested object](/learn/updating-objects-in-state#updating-a-nested-object) to learn more. + +```js +import { useState } from "react"; + +export default function Form() { + const [person, setPerson] = useState({ + name: "Niki de Saint Phalle", + artwork: { + title: "Blue Nana", + city: "Hamburg", + image: "https://i.imgur.com/Sd1AgUOm.jpg", + }, + }); + + function handleNameChange(e) { + setPerson({ + ...person, + name: e.target.value, + }); + } + + function handleTitleChange(e) { + setPerson({ + ...person, + artwork: { + ...person.artwork, + title: e.target.value, + }, + }); + } + + function handleCityChange(e) { + setPerson({ + ...person, + artwork: { + ...person.artwork, + city: e.target.value, + }, + }); + } + + function handleImageChange(e) { + setPerson({ + ...person, + artwork: { + ...person.artwork, + image: e.target.value, + }, + }); + } + + return ( + <> + <label> + Name: + <input value={person.name} onChange={handleNameChange} /> + </label> + <label> + Title: + <input + value={person.artwork.title} + onChange={handleTitleChange} + /> + </label> + <label> + City: + <input + value={person.artwork.city} + onChange={handleCityChange} + /> + </label> + <label> + Image: + <input + value={person.artwork.image} + onChange={handleImageChange} + /> + </label> + <p> + <i>{person.artwork.title}</i> + {" by "} + {person.name} + <br /> + (located in {person.artwork.city}) + </p> + <img src={person.artwork.image} alt={person.artwork.title} /> + </> + ); +} +``` + +```css +label { + display: block; +} +input { + margin-left: 5px; + margin-bottom: 5px; +} +img { + width: 200px; + height: 200px; +} +``` + +#### List (array) + +In this example, the `todos` state variable holds an array. Each button handler calls `setTodos` with the next version of that array. The `[...todos]` spread syntax, `todos.map()` and `todos.filter()` ensure the state array is replaced rather than mutated. + +```js +import { useState } from "react"; +import AddTodo from "./AddTodo.js"; +import TaskList from "./TaskList.js"; + +let nextId = 3; +const initialTodos = [ + { id: 0, title: "Buy milk", done: true }, + { id: 1, title: "Eat tacos", done: false }, + { id: 2, title: "Brew tea", done: false }, +]; + +export default function TaskApp() { + const [todos, setTodos] = useState(initialTodos); + + function handleAddTodo(title) { + setTodos([ + ...todos, + { + id: nextId++, + title: title, + done: false, + }, + ]); + } + + function handleChangeTodo(nextTodo) { + setTodos( + todos.map((t) => { + if (t.id === nextTodo.id) { + return nextTodo; + } else { + return t; + } + }) + ); + } + + function handleDeleteTodo(todoId) { + setTodos(todos.filter((t) => t.id !== todoId)); + } + + return ( + <> + <AddTodo onAddTodo={handleAddTodo} /> + <TaskList + todos={todos} + onChangeTodo={handleChangeTodo} + onDeleteTodo={handleDeleteTodo} + /> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function AddTodo({ onAddTodo }) { + const [title, setTitle] = useState(""); + return ( + <> + <input + placeholder="Add todo" + value={title} + onChange={(e) => setTitle(e.target.value)} + /> + <button + onClick={() => { + setTitle(""); + onAddTodo(title); + }} + > + Add + </button> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function TaskList({ todos, onChangeTodo, onDeleteTodo }) { + return ( + <ul> + {todos.map((todo) => ( + <li key={todo.id}> + <Task + todo={todo} + onChange={onChangeTodo} + onDelete={onDeleteTodo} + /> + </li> + ))} + </ul> + ); +} + +function Task({ todo, onChange, onDelete }) { + const [isEditing, setIsEditing] = useState(false); + let todoContent; + if (isEditing) { + todoContent = ( + <> + <input + value={todo.title} + onChange={(e) => { + onChange({ + ...todo, + title: e.target.value, + }); + }} + /> + <button onClick={() => setIsEditing(false)}>Save</button> + </> + ); + } else { + todoContent = ( + <> + {todo.title} + <button onClick={() => setIsEditing(true)}>Edit</button> + </> + ); + } + return ( + <label> + <input + type="checkbox" + checked={todo.done} + onChange={(e) => { + onChange({ + ...todo, + done: e.target.checked, + }); + }} + /> + {todoContent} + <button onClick={() => onDelete(todo.id)}>Delete</button> + </label> + ); +} +``` + +```css +button { + margin: 5px; +} +li { + list-style-type: none; +} +ul, +li { + margin: 0; + padding: 0; +} +``` + +#### Writing concise update logic with Immer + +If updating arrays and objects without mutation feels tedious, you can use a library like [Immer](https://github.com/immerjs/use-immer) to reduce repetitive code. Immer lets you write concise code as if you were mutating objects, but under the hood it performs immutable updates: + +```js +import { useState } from "react"; +import { useImmer } from "use-immer"; + +let nextId = 3; +const initialList = [ + { id: 0, title: "Big Bellies", seen: false }, + { id: 1, title: "Lunar Landscape", seen: false }, + { id: 2, title: "Terracotta Army", seen: true }, +]; + +export default function BucketList() { + const [list, updateList] = useImmer(initialList); + + function handleToggle(artworkId, nextSeen) { + updateList((draft) => { + const artwork = draft.find((a) => a.id === artworkId); + artwork.seen = nextSeen; + }); + } + + return ( + <> + <h1>Art Bucket List</h1> + <h2>My list of art to see:</h2> + <ItemList artworks={list} onToggle={handleToggle} /> + </> + ); +} + +function ItemList({ artworks, onToggle }) { + return ( + <ul> + {artworks.map((artwork) => ( + <li key={artwork.id}> + <label> + <input + type="checkbox" + checked={artwork.seen} + onChange={(e) => { + onToggle(artwork.id, e.target.checked); + }} + /> + {artwork.title} + </label> + </li> + ))} + </ul> + ); +} +``` + +```json package.json +{ + "dependencies": { + "immer": "1.7.3", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "use-immer": "0.5.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +</Recipes> + +--- + +### Avoiding recreating the initial state + +React saves the initial state once and ignores it on the next renders. + +```js +function TodoList() { + const [todos, setTodos] = useState(createInitialTodos()); + // ... +``` + +Although the result of `createInitialTodos()` is only used for the initial render, you're still calling this function on every render. This can be wasteful if it's creating large arrays or performing expensive calculations. + +To solve this, you may **pass it as an _initializer_ function** to `useState` instead: + +```js +function TodoList() { + const [todos, setTodos] = useState(createInitialTodos); + // ... +``` + +Notice that you’re passing `createInitialTodos`, which is the _function itself_, and not `createInitialTodos()`, which is the result of calling it. If you pass a function to `useState`, React will only call it during initialization. + +React may [call your initializers twice](#my-initializer-or-updater-function-runs-twice) in development to verify that they are [pure.](/learn/keeping-components-pure) + +<Recipes titleText="The difference between passing an initializer and passing the initial state directly" titleId="examples-initializer"> + +#### Passing the initializer function + +This example passes the initializer function, so the `createInitialTodos` function only runs during initialization. It does not run when component re-renders, such as when you type into the input. + +```js +import { useState } from "react"; + +function createInitialTodos() { + const initialTodos = []; + for (let i = 0; i < 50; i++) { + initialTodos.push({ + id: i, + text: "Item " + (i + 1), + }); + } + return initialTodos; +} + +export default function TodoList() { + const [todos, setTodos] = useState(createInitialTodos); + const [text, setText] = useState(""); + + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <button + onClick={() => { + setText(""); + setTodos([ + { + id: todos.length, + text: text, + }, + ...todos, + ]); + }} + > + Add + </button> + <ul> + {todos.map((item) => ( + <li key={item.id}>{item.text}</li> + ))} + </ul> + </> + ); +} +``` + +#### Passing the initial state directly + +This example **does not** pass the initializer function, so the `createInitialTodos` function runs on every render, such as when you type into the input. There is no observable difference in behavior, but this code is less efficient. + +```js +import { useState } from "react"; + +function createInitialTodos() { + const initialTodos = []; + for (let i = 0; i < 50; i++) { + initialTodos.push({ + id: i, + text: "Item " + (i + 1), + }); + } + return initialTodos; +} + +export default function TodoList() { + const [todos, setTodos] = useState(createInitialTodos()); + const [text, setText] = useState(""); + + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <button + onClick={() => { + setText(""); + setTodos([ + { + id: todos.length, + text: text, + }, + ...todos, + ]); + }} + > + Add + </button> + <ul> + {todos.map((item) => ( + <li key={item.id}>{item.text}</li> + ))} + </ul> + </> + ); +} +``` + +</Recipes> + +--- + +### Resetting state with a key + +You'll often encounter the `key` attribute when [rendering lists.](/learn/rendering-lists) However, it also serves another purpose. + +You can **reset a component's state by passing a different `key` to a component.** In this example, the Reset button changes the `version` state variable, which we pass as a `key` to the `Form`. When the `key` changes, React re-creates the `Form` component (and all of its children) from scratch, so its state gets reset. + +Read [preserving and resetting state](/learn/preserving-and-resetting-state) to learn more. + +```js +import { useState } from "react"; + +export default function App() { + const [version, setVersion] = useState(0); + + function handleReset() { + setVersion(version + 1); + } + + return ( + <> + <button onClick={handleReset}>Reset</button> + <Form key={version} /> + </> + ); +} + +function Form() { + const [name, setName] = useState("Taylor"); + + return ( + <> + <input value={name} onChange={(e) => setName(e.target.value)} /> + <p>Hello, {name}.</p> + </> + ); +} +``` + +```css +button { + display: block; + margin-bottom: 20px; +} +``` + +--- + +### Storing information from previous renders + +Usually, you will update state in event handlers. However, in rare cases you might want to adjust state in response to rendering -- for example, you might want to change a state variable when a prop changes. + +In most cases, you don't need this: + +- **If the value you need can be computed entirely from the current props or other state, [remove that redundant state altogether.](/learn/choosing-the-state-structure#avoid-redundant-state)** If you're worried about recomputing too often, the [`useMemo` Hook](/reference/react/useMemo) can help. +- If you want to reset the entire component tree's state, [pass a different `key` to your component.](#resetting-state-with-a-key) +- If you can, update all the relevant state in the event handlers. + +In the rare case that none of these apply, there is a pattern you can use to update state based on the values that have been rendered so far, by calling a `set` function while your component is rendering. + +Here's an example. This `CountLabel` component displays the `count` prop passed to it: + +```js +export default function CountLabel({ count }) { + return <h1>{count}</h1>; +} +``` + +Say you want to show whether the counter has _increased or decreased_ since the last change. The `count` prop doesn't tell you this -- you need to keep track of its previous value. Add the `prevCount` state variable to track it. Add another state variable called `trend` to hold whether the count has increased or decreased. Compare `prevCount` with `count`, and if they're not equal, update both `prevCount` and `trend`. Now you can show both the current count prop and _how it has changed since the last render_. + +```js +import { useState } from "react"; +import CountLabel from "./CountLabel.js"; + +export default function App() { + const [count, setCount] = useState(0); + return ( + <> + <button onClick={() => setCount(count + 1)}>Increment</button> + <button onClick={() => setCount(count - 1)}>Decrement</button> + <CountLabel count={count} /> + </> + ); +} +``` + +```js +import { useState } from "react"; + +export default function CountLabel({ count }) { + const [prevCount, setPrevCount] = useState(count); + const [trend, setTrend] = useState(null); + if (prevCount !== count) { + setPrevCount(count); + setTrend(count > prevCount ? "increasing" : "decreasing"); + } + return ( + <> + <h1>{count}</h1> + {trend && <p>The count is {trend}</p>} + </> + ); +} +``` + +```css +button { + margin-bottom: 10px; +} +``` + +Note that if you call a `set` function while rendering, it must be inside a condition like `prevCount !== count`, and there must be a call like `setPrevCount(count)` inside of the condition. Otherwise, your component would re-render in a loop until it crashes. Also, you can only update the state of the _currently rendering_ component like this. Calling the `set` function of _another_ component during rendering is an error. Finally, your `set` call should still [update state without mutation](#updating-objects-and-arrays-in-state) -- this doesn't mean you can break other rules of [pure functions.](/learn/keeping-components-pure) + +This pattern can be hard to understand and is usually best avoided. However, it's better than updating state in an effect. When you call the `set` function during render, React will re-render that component immediately after your component exits with a `return` statement, and before rendering the children. This way, children don't need to render twice. The rest of your component function will still execute (and the result will be thrown away). If your condition is below all the Hook calls, you may add an early `return;` to restart rendering earlier. + +--- + +## Troubleshooting + +### I've updated the state, but logging gives me the old value + +Calling the `set` function **does not change state in the running code**: + +```js +function handleClick() { + console.log(count); // 0 + + setCount(count + 1); // Request a re-render with 1 + console.log(count); // Still 0! + + setTimeout(() => { + console.log(count); // Also 0! + }, 5000); +} +``` + +This is because [states behaves like a snapshot.](/learn/state-as-a-snapshot) Updating state requests another render with the new state value, but does not affect the `count` JavaScript variable in your already-running event handler. + +If you need to use the next state, you can save it in a variable before passing it to the `set` function: + +```js +const nextCount = count + 1; +setCount(nextCount); + +console.log(count); // 0 +console.log(nextCount); // 1 +``` + +--- + +### I've updated the state, but the screen doesn't update + +React will **ignore your update if the next state is equal to the previous state,** as determined by an [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison. This usually happens when you change an object or an array in state directly: + +```js +obj.x = 10; // 🚩 Wrong: mutating existing object +setObj(obj); // 🚩 Doesn't do anything +``` + +You mutated an existing `obj` object and passed it back to `setObj`, so React ignored the update. To fix this, you need to ensure that you're always [_replacing_ objects and arrays in state instead of _mutating_ them](#updating-objects-and-arrays-in-state): + +```js +// ✅ Correct: creating a new object +setObj({ + ...obj, + x: 10, +}); +``` + +--- + +### I'm getting an error: "Too many re-renders" + +You might get an error that says: `Too many re-renders. React limits the number of renders to prevent an infinite loop.` Typically, this means that you're unconditionally setting state _during render_, so your component enters a loop: render, set state (which causes a render), render, set state (which causes a render), and so on. Very often, this is caused by a mistake in specifying an event handler: + +```js +// 🚩 Wrong: calls the handler during render +return <button onClick={handleClick()}>Click me</button>; + +// ✅ Correct: passes down the event handler +return <button onClick={handleClick}>Click me</button>; + +// ✅ Correct: passes down an inline function +return <button onClick={(e) => handleClick(e)}>Click me</button>; +``` + +If you can't find the cause of this error, click on the arrow next to the error in the console and look through the JavaScript stack to find the specific `set` function call responsible for the error. + +--- + +### My initializer or updater function runs twice + +In [Strict Mode](/reference/react/StrictMode), React will call some of your functions twice instead of once: + +```js +function TodoList() { + // This component function will run twice for every render. + + const [todos, setTodos] = useState(() => { + // This initializer function will run twice during initialization. + return createTodos(); + }); + + function handleClick() { + setTodos(prevTodos => { + // This updater function will run twice for every click. + return [...prevTodos, createTodo()]; + }); + } + // ... +``` + +This is expected and shouldn't break your code. + +This **development-only** behavior helps you [keep components pure.](/learn/keeping-components-pure) React uses the result of one of the calls, and ignores the result of the other call. As long as your component, initializer, and updater functions are pure, this shouldn't affect your logic. However, if they are accidentally impure, this helps you notice the mistakes. + +For example, this impure updater function mutates an array in state: + +```js +setTodos((prevTodos) => { + // 🚩 Mistake: mutating state + prevTodos.push(createTodo()); +}); +``` + +Because React calls your updater function twice, you'll see the todo was added twice, so you'll know that there is a mistake. In this example, you can fix the mistake by [replacing the array instead of mutating it](#updating-objects-and-arrays-in-state): + +```js +setTodos((prevTodos) => { + // ✅ Correct: replacing with new state + return [...prevTodos, createTodo()]; +}); +``` + +Now that this updater function is pure, calling it an extra time doesn't make a difference in behavior. This is why React calling it twice helps you find mistakes. **Only component, initializer, and updater functions need to be pure.** Event handlers don't need to be pure, so React will never call your event handlers twice. + +Read [keeping components pure](/learn/keeping-components-pure) to learn more. + +--- + +### I'm trying to set state to a function, but it gets called instead + +You can't put a function into state like this: + +```js +const [fn, setFn] = useState(someFunction); + +function handleClick() { + setFn(someOtherFunction); +} +``` + +Because you're passing a function, React assumes that `someFunction` is an [initializer function](#avoiding-recreating-the-initial-state), and that `someOtherFunction` is an [updater function](#updating-state-based-on-the-previous-state), so it tries to call them and store the result. To actually _store_ a function, you have to put `() =>` before them in both cases. Then React will store the functions you pass. + +```js +const [fn, setFn] = useState(() => someFunction); + +function handleClick() { + setFn(() => someOtherFunction); +} +``` diff --git a/mkdocs.yml b/mkdocs.yml index bb24bdaba..0ae9f2f49 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -69,10 +69,9 @@ nav: - reference/use-connection.md - reference/use-scope.md - reference/use-location.md + - reference/use-id.md - HTML Tags: - - reference/common-types.md - reference/common-props.md - - reference/common-events.md - reference/usage.md - Backends: - reference/fastapi.md From 3de3fd3fdee20c8599f748311bf3c77cae486265 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Tue, 20 Jun 2023 03:55:58 -0700 Subject: [PATCH 29/49] add use-id warning --- docs/src/reference/use-id.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/src/reference/use-id.md b/docs/src/reference/use-id.md index 804738e7c..2802254e8 100644 --- a/docs/src/reference/use-id.md +++ b/docs/src/reference/use-id.md @@ -2,6 +2,13 @@ title: Use ID 🚫 --- + +!!! warning "In Progress" + + This feature is planned, but not yet developed. + + See [this issue](https://github.com/reactive-python/reactpy/issues/985) for more details. + ## Overview <p class="intro" markdown> From 3aab58b3daba286630a9813bb7a51a1841ce834b Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Tue, 20 Jun 2023 16:19:23 -0700 Subject: [PATCH 30/49] Add undeveloped hooks --- docs/src/reference/use-deferred-value.md | 995 +++++++++++ docs/src/reference/use-imperative-handle.md | 297 +++ docs/src/reference/use-insertion-effect.md | 139 ++ docs/src/reference/use-layout-effect.md | 690 +++++++ docs/src/reference/use-sync-external-store.md | 429 +++++ docs/src/reference/use-transition.md | 1587 +++++++++++++++++ mkdocs.yml | 6 + 7 files changed, 4143 insertions(+) create mode 100644 docs/src/reference/use-deferred-value.md create mode 100644 docs/src/reference/use-imperative-handle.md create mode 100644 docs/src/reference/use-insertion-effect.md create mode 100644 docs/src/reference/use-layout-effect.md create mode 100644 docs/src/reference/use-sync-external-store.md create mode 100644 docs/src/reference/use-transition.md diff --git a/docs/src/reference/use-deferred-value.md b/docs/src/reference/use-deferred-value.md new file mode 100644 index 000000000..d7058b899 --- /dev/null +++ b/docs/src/reference/use-deferred-value.md @@ -0,0 +1,995 @@ +--- +title: Use Deferred Value 🚫 +--- + +## Overview + +<p class="intro" markdown> + +`useDeferredValue` is a React Hook that lets you defer updating a part of the UI. + +```js +const deferredValue = useDeferredValue(value); +``` + +</p> + +--- + +## Reference + +### `useDeferredValue(value)` + +Call `useDeferredValue` at the top level of your component to get a deferred version of that value. + +```js +import { useState, useDeferredValue } from "react"; + +function SearchPage() { + const [query, setQuery] = useState(""); + const deferredQuery = useDeferredValue(query); + // ... +} +``` + +[See more examples below.](#usage) + +#### Parameters + +- `value`: The value you want to defer. It can have any type. + +#### Returns + +During the initial render, the returned deferred value will be the same as the value you provided. During updates, React will first attempt a re-render with the old value (so it will return the old value), and then try another re-render in background with the new value (so it will return the updated value). + +#### Caveats + +- The values you pass to `useDeferredValue` should either be primitive values (like strings and numbers) or objects created outside of rendering. If you create a new object during rendering and immediately pass it to `useDeferredValue`, it will be different on every render, causing unnecessary background re-renders. + +- When `useDeferredValue` receives a different value (compared with [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is)), in addition to the current render (when it still uses the previous value), it schedules a re-render in the background with the new value. The background re-render is interruptible: if there's another update to the `value`, React will restart the background re-render from scratch. For example, if the user is typing into an input faster than a chart receiving its deferred value can re-render, the chart will only re-render after the user stops typing. + +- `useDeferredValue` is integrated with [`<Suspense>`.](/reference/react/Suspense) If the background update caused by a new value suspends the UI, the user will not see the fallback. They will see the old deferred value until the data loads. + +- `useDeferredValue` does not by itself prevent extra network requests. + +- There is no fixed delay caused by `useDeferredValue` itself. As soon as React finishes the original re-render, React will immediately start working on the background re-render with the new deferred value. Any updates caused by events (like typing) will interrupt the background re-render and get prioritized over it. + +- The background re-render caused by `useDeferredValue` does not fire Effects until it's committed to the screen. If the background re-render suspends, its Effects will run after the data loads and the UI updates. + +--- + +## Usage + +### Showing stale content while fresh content is loading + +Call `useDeferredValue` at the top level of your component to defer updating some part of your UI. + +```js +import { useState, useDeferredValue } from "react"; + +function SearchPage() { + const [query, setQuery] = useState(""); + const deferredQuery = useDeferredValue(query); + // ... +} +``` + +During the initial render, the <CodeStep step={2}>deferred value</CodeStep> will be the same as the <CodeStep step={1}>value</CodeStep> you provided. + +During updates, the <CodeStep step={2}>deferred value</CodeStep> will "lag behind" the latest <CodeStep step={1}>value</CodeStep>. In particular, React will first re-render _without_ updating the deferred value, and then try to re-render with the newly received value in background. + +**Let's walk through an example to see when this is useful.** + +<Note> + +This example assumes you use one of Suspense-enabled data sources: + +- Data fetching with Suspense-enabled frameworks like [Relay](https://relay.dev/docs/guided-tour/rendering/loading-states/) and [Next.js](https://nextjs.org/docs/getting-started/react-essentials) +- Lazy-loading component code with [`lazy`](/reference/react/lazy) + +[Learn more about Suspense and its limitations.](/reference/react/Suspense) + +</Note> + +In this example, the `SearchResults` component [suspends](/reference/react/Suspense#displaying-a-fallback-while-content-is-loading) while fetching the search results. Try typing `"a"`, waiting for the results, and then editing it to `"ab"`. The results for `"a"` get replaced by the loading fallback. + +```json package.json hidden +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { Suspense, useState } from "react"; +import SearchResults from "./SearchResults.js"; + +export default function App() { + const [query, setQuery] = useState(""); + return ( + <> + <label> + Search albums: + <input + value={query} + onChange={(e) => setQuery(e.target.value)} + /> + </label> + <Suspense fallback={<h2>Loading...</h2>}> + <SearchResults query={query} /> + </Suspense> + </> + ); +} +``` + +```js +import { fetchData } from "./data.js"; + +// Note: this component is written using an experimental API +// that's not yet available in stable versions of React. + +// For a realistic example you can follow today, try a framework +// that's integrated with Suspense, like Relay or Next.js. + +export default function SearchResults({ query }) { + if (query === "") { + return null; + } + const albums = use(fetchData(`/search?q=${query}`)); + if (albums.length === 0) { + return ( + <p> + No matches for <i>"{query}"</i> + </p> + ); + } + return ( + <ul> + {albums.map((album) => ( + <li key={album.id}> + {album.title} ({album.year}) + </li> + ))} + </ul> + ); +} + +// This is a workaround for a bug to get the demo running. +// TODO: replace with real implementation when the bug is fixed. +function use(promise) { + if (promise.status === "fulfilled") { + return promise.value; + } else if (promise.status === "rejected") { + throw promise.reason; + } else if (promise.status === "pending") { + throw promise; + } else { + promise.status = "pending"; + promise.then( + (result) => { + promise.status = "fulfilled"; + promise.value = result; + }, + (reason) => { + promise.status = "rejected"; + promise.reason = reason; + } + ); + throw promise; + } +} +``` + +```js +// Note: the way you would do data fetching depends on +// the framework that you use together with Suspense. +// Normally, the caching logic would be inside a framework. + +let cache = new Map(); + +export function fetchData(url) { + if (!cache.has(url)) { + cache.set(url, getData(url)); + } + return cache.get(url); +} + +async function getData(url) { + if (url.startsWith("/search?q=")) { + return await getSearchResults(url.slice("/search?q=".length)); + } else { + throw Error("Not implemented"); + } +} + +async function getSearchResults(query) { + // Add a fake delay to make waiting noticeable. + await new Promise((resolve) => { + setTimeout(resolve, 500); + }); + + const allAlbums = [ + { + id: 13, + title: "Let It Be", + year: 1970, + }, + { + id: 12, + title: "Abbey Road", + year: 1969, + }, + { + id: 11, + title: "Yellow Submarine", + year: 1969, + }, + { + id: 10, + title: "The Beatles", + year: 1968, + }, + { + id: 9, + title: "Magical Mystery Tour", + year: 1967, + }, + { + id: 8, + title: "Sgt. Pepper's Lonely Hearts Club Band", + year: 1967, + }, + { + id: 7, + title: "Revolver", + year: 1966, + }, + { + id: 6, + title: "Rubber Soul", + year: 1965, + }, + { + id: 5, + title: "Help!", + year: 1965, + }, + { + id: 4, + title: "Beatles For Sale", + year: 1964, + }, + { + id: 3, + title: "A Hard Day's Night", + year: 1964, + }, + { + id: 2, + title: "With The Beatles", + year: 1963, + }, + { + id: 1, + title: "Please Please Me", + year: 1963, + }, + ]; + + const lowerQuery = query.trim().toLowerCase(); + return allAlbums.filter((album) => { + const lowerTitle = album.title.toLowerCase(); + return ( + lowerTitle.startsWith(lowerQuery) || + lowerTitle.indexOf(" " + lowerQuery) !== -1 + ); + }); +} +``` + +```css +input { + margin: 10px; +} +``` + +A common alternative UI pattern is to _defer_ updating the list of results and to keep showing the previous results until the new results are ready. Call `useDeferredValue` to pass a deferred version of the query down: + +```js +export default function App() { + const [query, setQuery] = useState(""); + const deferredQuery = useDeferredValue(query); + return ( + <> + <label> + Search albums: + <input + value={query} + onChange={(e) => setQuery(e.target.value)} + /> + </label> + <Suspense fallback={<h2>Loading...</h2>}> + <SearchResults query={deferredQuery} /> + </Suspense> + </> + ); +} +``` + +The `query` will update immediately, so the input will display the new value. However, the `deferredQuery` will keep its previous value until the data has loaded, so `SearchResults` will show the stale results for a bit. + +Enter `"a"` in the example below, wait for the results to load, and then edit the input to `"ab"`. Notice how instead of the Suspense fallback, you now see the stale result list until the new results have loaded: + +```json package.json hidden +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { Suspense, useState, useDeferredValue } from "react"; +import SearchResults from "./SearchResults.js"; + +export default function App() { + const [query, setQuery] = useState(""); + const deferredQuery = useDeferredValue(query); + return ( + <> + <label> + Search albums: + <input + value={query} + onChange={(e) => setQuery(e.target.value)} + /> + </label> + <Suspense fallback={<h2>Loading...</h2>}> + <SearchResults query={deferredQuery} /> + </Suspense> + </> + ); +} +``` + +```js +import { fetchData } from "./data.js"; + +// Note: this component is written using an experimental API +// that's not yet available in stable versions of React. + +// For a realistic example you can follow today, try a framework +// that's integrated with Suspense, like Relay or Next.js. + +export default function SearchResults({ query }) { + if (query === "") { + return null; + } + const albums = use(fetchData(`/search?q=${query}`)); + if (albums.length === 0) { + return ( + <p> + No matches for <i>"{query}"</i> + </p> + ); + } + return ( + <ul> + {albums.map((album) => ( + <li key={album.id}> + {album.title} ({album.year}) + </li> + ))} + </ul> + ); +} + +// This is a workaround for a bug to get the demo running. +// TODO: replace with real implementation when the bug is fixed. +function use(promise) { + if (promise.status === "fulfilled") { + return promise.value; + } else if (promise.status === "rejected") { + throw promise.reason; + } else if (promise.status === "pending") { + throw promise; + } else { + promise.status = "pending"; + promise.then( + (result) => { + promise.status = "fulfilled"; + promise.value = result; + }, + (reason) => { + promise.status = "rejected"; + promise.reason = reason; + } + ); + throw promise; + } +} +``` + +```js +// Note: the way you would do data fetching depends on +// the framework that you use together with Suspense. +// Normally, the caching logic would be inside a framework. + +let cache = new Map(); + +export function fetchData(url) { + if (!cache.has(url)) { + cache.set(url, getData(url)); + } + return cache.get(url); +} + +async function getData(url) { + if (url.startsWith("/search?q=")) { + return await getSearchResults(url.slice("/search?q=".length)); + } else { + throw Error("Not implemented"); + } +} + +async function getSearchResults(query) { + // Add a fake delay to make waiting noticeable. + await new Promise((resolve) => { + setTimeout(resolve, 500); + }); + + const allAlbums = [ + { + id: 13, + title: "Let It Be", + year: 1970, + }, + { + id: 12, + title: "Abbey Road", + year: 1969, + }, + { + id: 11, + title: "Yellow Submarine", + year: 1969, + }, + { + id: 10, + title: "The Beatles", + year: 1968, + }, + { + id: 9, + title: "Magical Mystery Tour", + year: 1967, + }, + { + id: 8, + title: "Sgt. Pepper's Lonely Hearts Club Band", + year: 1967, + }, + { + id: 7, + title: "Revolver", + year: 1966, + }, + { + id: 6, + title: "Rubber Soul", + year: 1965, + }, + { + id: 5, + title: "Help!", + year: 1965, + }, + { + id: 4, + title: "Beatles For Sale", + year: 1964, + }, + { + id: 3, + title: "A Hard Day's Night", + year: 1964, + }, + { + id: 2, + title: "With The Beatles", + year: 1963, + }, + { + id: 1, + title: "Please Please Me", + year: 1963, + }, + ]; + + const lowerQuery = query.trim().toLowerCase(); + return allAlbums.filter((album) => { + const lowerTitle = album.title.toLowerCase(); + return ( + lowerTitle.startsWith(lowerQuery) || + lowerTitle.indexOf(" " + lowerQuery) !== -1 + ); + }); +} +``` + +```css +input { + margin: 10px; +} +``` + +<DeepDive> + +#### How does deferring a value work under the hood? + +You can think of it as happening in two steps: + +1. **First, React re-renders with the new `query` (`"ab"`) but with the old `deferredQuery` (still `"a")`.** The `deferredQuery` value, which you pass to the result list, is _deferred:_ it "lags behind" the `query` value. + +2. **In background, React tries to re-render with _both_ `query` and `deferredQuery` updated to `"ab"`.** If this re-render completes, React will show it on the screen. However, if it suspends (the results for `"ab"` have not loaded yet), React will abandon this rendering attempt, and retry this re-render again after the data has loaded. The user will keep seeing the stale deferred value until the data is ready. + +The deferred "background" rendering is interruptible. For example, if you type into the input again, React will abandon it and restart with the new value. React will always use the latest provided value. + +Note that there is still a network request per each keystroke. What's being deferred here is displaying results (until they're ready), not the network requests themselves. Even if the user continues typing, responses for each keystroke get cached, so pressing Backspace is instant and doesn't fetch again. + +</DeepDive> + +--- + +### Indicating that the content is stale + +In the example above, there is no indication that the result list for the latest query is still loading. This can be confusing to the user if the new results take a while to load. To make it more obvious to the user that the result list does not match the latest query, you can add a visual indication when the stale result list is displayed: + +```js +<div + style={{ + opacity: query !== deferredQuery ? 0.5 : 1, + }} +> + <SearchResults query={deferredQuery} /> +</div> +``` + +With this change, as soon as you start typing, the stale result list gets slightly dimmed until the new result list loads. You can also add a CSS transition to delay dimming so that it feels gradual, like in the example below: + +```json package.json hidden +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { Suspense, useState, useDeferredValue } from "react"; +import SearchResults from "./SearchResults.js"; + +export default function App() { + const [query, setQuery] = useState(""); + const deferredQuery = useDeferredValue(query); + const isStale = query !== deferredQuery; + return ( + <> + <label> + Search albums: + <input + value={query} + onChange={(e) => setQuery(e.target.value)} + /> + </label> + <Suspense fallback={<h2>Loading...</h2>}> + <div + style={{ + opacity: isStale ? 0.5 : 1, + transition: isStale + ? "opacity 0.2s 0.2s linear" + : "opacity 0s 0s linear", + }} + > + <SearchResults query={deferredQuery} /> + </div> + </Suspense> + </> + ); +} +``` + +```js +import { fetchData } from "./data.js"; + +// Note: this component is written using an experimental API +// that's not yet available in stable versions of React. + +// For a realistic example you can follow today, try a framework +// that's integrated with Suspense, like Relay or Next.js. + +export default function SearchResults({ query }) { + if (query === "") { + return null; + } + const albums = use(fetchData(`/search?q=${query}`)); + if (albums.length === 0) { + return ( + <p> + No matches for <i>"{query}"</i> + </p> + ); + } + return ( + <ul> + {albums.map((album) => ( + <li key={album.id}> + {album.title} ({album.year}) + </li> + ))} + </ul> + ); +} + +// This is a workaround for a bug to get the demo running. +// TODO: replace with real implementation when the bug is fixed. +function use(promise) { + if (promise.status === "fulfilled") { + return promise.value; + } else if (promise.status === "rejected") { + throw promise.reason; + } else if (promise.status === "pending") { + throw promise; + } else { + promise.status = "pending"; + promise.then( + (result) => { + promise.status = "fulfilled"; + promise.value = result; + }, + (reason) => { + promise.status = "rejected"; + promise.reason = reason; + } + ); + throw promise; + } +} +``` + +```js +// Note: the way you would do data fetching depends on +// the framework that you use together with Suspense. +// Normally, the caching logic would be inside a framework. + +let cache = new Map(); + +export function fetchData(url) { + if (!cache.has(url)) { + cache.set(url, getData(url)); + } + return cache.get(url); +} + +async function getData(url) { + if (url.startsWith("/search?q=")) { + return await getSearchResults(url.slice("/search?q=".length)); + } else { + throw Error("Not implemented"); + } +} + +async function getSearchResults(query) { + // Add a fake delay to make waiting noticeable. + await new Promise((resolve) => { + setTimeout(resolve, 500); + }); + + const allAlbums = [ + { + id: 13, + title: "Let It Be", + year: 1970, + }, + { + id: 12, + title: "Abbey Road", + year: 1969, + }, + { + id: 11, + title: "Yellow Submarine", + year: 1969, + }, + { + id: 10, + title: "The Beatles", + year: 1968, + }, + { + id: 9, + title: "Magical Mystery Tour", + year: 1967, + }, + { + id: 8, + title: "Sgt. Pepper's Lonely Hearts Club Band", + year: 1967, + }, + { + id: 7, + title: "Revolver", + year: 1966, + }, + { + id: 6, + title: "Rubber Soul", + year: 1965, + }, + { + id: 5, + title: "Help!", + year: 1965, + }, + { + id: 4, + title: "Beatles For Sale", + year: 1964, + }, + { + id: 3, + title: "A Hard Day's Night", + year: 1964, + }, + { + id: 2, + title: "With The Beatles", + year: 1963, + }, + { + id: 1, + title: "Please Please Me", + year: 1963, + }, + ]; + + const lowerQuery = query.trim().toLowerCase(); + return allAlbums.filter((album) => { + const lowerTitle = album.title.toLowerCase(); + return ( + lowerTitle.startsWith(lowerQuery) || + lowerTitle.indexOf(" " + lowerQuery) !== -1 + ); + }); +} +``` + +```css +input { + margin: 10px; +} +``` + +--- + +### Deferring re-rendering for a part of the UI + +You can also apply `useDeferredValue` as a performance optimization. It is useful when a part of your UI is slow to re-render, there's no easy way to optimize it, and you want to prevent it from blocking the rest of the UI. + +Imagine you have a text field and a component (like a chart or a long list) that re-renders on every keystroke: + +```js +function App() { + const [text, setText] = useState(""); + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <SlowList text={text} /> + </> + ); +} +``` + +First, optimize `SlowList` to skip re-rendering when its props are the same. To do this, [wrap it in `memo`:](/reference/react/memo#skipping-re-rendering-when-props-are-unchanged) + +```js +const SlowList = memo(function SlowList({ text }) { + // ... +}); +``` + +However, this only helps if the `SlowList` props are _the same_ as during the previous render. The problem you're facing now is that it's slow when they're _different,_ and when you actually need to show different visual output. + +Concretely, the main performance problem is that whenever you type into the input, the `SlowList` receives new props, and re-rendering its entire tree makes the typing feel janky. In this case, `useDeferredValue` lets you prioritize updating the input (which must be fast) over updating the result list (which is allowed to be slower): + +```js +function App() { + const [text, setText] = useState(""); + const deferredText = useDeferredValue(text); + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <SlowList text={deferredText} /> + </> + ); +} +``` + +This does not make re-rendering of the `SlowList` faster. However, it tells React that re-rendering the list can be deprioritized so that it doesn't block the keystrokes. The list will "lag behind" the input and then "catch up". Like before, React will attempt to update the list as soon as possible, but will not block the user from typing. + +<Recipes titleText="The difference between useDeferredValue and unoptimized re-rendering" titleId="examples"> + +#### Deferred re-rendering of the list + +In this example, each item in the `SlowList` component is **artificially slowed down** so that you can see how `useDeferredValue` lets you keep the input responsive. Type into the input and notice that typing feels snappy while the list "lags behind" it. + +```js +import { useState, useDeferredValue } from "react"; +import SlowList from "./SlowList.js"; + +export default function App() { + const [text, setText] = useState(""); + const deferredText = useDeferredValue(text); + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <SlowList text={deferredText} /> + </> + ); +} +``` + +```js +import { memo } from "react"; + +const SlowList = memo(function SlowList({ text }) { + // Log once. The actual slowdown is inside SlowItem. + console.log("[ARTIFICIALLY SLOW] Rendering 250 <SlowItem />"); + + let items = []; + for (let i = 0; i < 250; i++) { + items.push(<SlowItem key={i} text={text} />); + } + return <ul className="items">{items}</ul>; +}); + +function SlowItem({ text }) { + let startTime = performance.now(); + while (performance.now() - startTime < 1) { + // Do nothing for 1 ms per item to emulate extremely slow code + } + + return <li className="item">Text: {text}</li>; +} + +export default SlowList; +``` + +```css +.items { + padding: 0; +} + +.item { + list-style: none; + display: block; + height: 40px; + padding: 5px; + margin-top: 10px; + border-radius: 4px; + border: 1px solid #aaa; +} +``` + +#### Unoptimized re-rendering of the list + +In this example, each item in the `SlowList` component is **artificially slowed down**, but there is no `useDeferredValue`. + +Notice how typing into the input feels very janky. This is because without `useDeferredValue`, each keystroke forces the entire list to re-render immediately in a non-interruptible way. + +```js +import { useState } from "react"; +import SlowList from "./SlowList.js"; + +export default function App() { + const [text, setText] = useState(""); + return ( + <> + <input value={text} onChange={(e) => setText(e.target.value)} /> + <SlowList text={text} /> + </> + ); +} +``` + +```js +import { memo } from "react"; + +const SlowList = memo(function SlowList({ text }) { + // Log once. The actual slowdown is inside SlowItem. + console.log("[ARTIFICIALLY SLOW] Rendering 250 <SlowItem />"); + + let items = []; + for (let i = 0; i < 250; i++) { + items.push(<SlowItem key={i} text={text} />); + } + return <ul className="items">{items}</ul>; +}); + +function SlowItem({ text }) { + let startTime = performance.now(); + while (performance.now() - startTime < 1) { + // Do nothing for 1 ms per item to emulate extremely slow code + } + + return <li className="item">Text: {text}</li>; +} + +export default SlowList; +``` + +```css +.items { + padding: 0; +} + +.item { + list-style: none; + display: block; + height: 40px; + padding: 5px; + margin-top: 10px; + border-radius: 4px; + border: 1px solid #aaa; +} +``` + +</Recipes> + +<Pitfall> + +This optimization requires `SlowList` to be wrapped in [`memo`.](/reference/react/memo) This is because whenever the `text` changes, React needs to be able to re-render the parent component quickly. During that re-render, `deferredText` still has its previous value, so `SlowList` is able to skip re-rendering (its props have not changed). Without [`memo`,](/reference/react/memo) it would have to re-render anyway, defeating the point of the optimization. + +</Pitfall> + +<DeepDive> + +#### How is deferring a value different from debouncing and throttling? + +There are two common optimization techniques you might have used before in this scenario: + +- _Debouncing_ means you'd wait for the user to stop typing (e.g. for a second) before updating the list. +- _Throttling_ means you'd update the list every once in a while (e.g. at most once a second). + +While these techniques are helpful in some cases, `useDeferredValue` is better suited to optimizing rendering because it is deeply integrated with React itself and adapts to the user's device. + +Unlike debouncing or throttling, it doesn't require choosing any fixed delay. If the user's device is fast (e.g. powerful laptop), the deferred re-render would happen almost immediately and wouldn't be noticeable. If the user's device is slow, the list would "lag behind" the input proportionally to how slow the device is. + +Also, unlike with debouncing or throttling, deferred re-renders done by `useDeferredValue` are interruptible by default. This means that if React is in the middle of re-rendering a large list, but the user makes another keystroke, React will abandon that re-render, handle the keystroke, and then start rendering in background again. By contrast, debouncing and throttling still produce a janky experience because they're _blocking:_ they merely postpone the moment when rendering blocks the keystroke. + +If the work you're optimizing doesn't happen during rendering, debouncing and throttling are still useful. For example, they can let you fire fewer network requests. You can also use these techniques together. + +</DeepDive> diff --git a/docs/src/reference/use-imperative-handle.md b/docs/src/reference/use-imperative-handle.md new file mode 100644 index 000000000..8d5ca5994 --- /dev/null +++ b/docs/src/reference/use-imperative-handle.md @@ -0,0 +1,297 @@ +--- +title: Use Imperative Handle 🚫 +--- + +## Overview + +<p class="intro" markdown> + +`useImperativeHandle` is a React Hook that lets you customize the handle exposed as a [ref.](/learn/manipulating-the-dom-with-refs) + +```js +useImperativeHandle(ref, createHandle, dependencies?) +``` + +</p> + +--- + +## Reference + +### `useImperativeHandle(ref, createHandle, dependencies?)` + +Call `useImperativeHandle` at the top level of your component to customize the ref handle it exposes: + +```js +import { forwardRef, useImperativeHandle } from 'react'; + +const MyInput = forwardRef(function MyInput(props, ref) { + useImperativeHandle(ref, () => { + return { + // ... your methods ... + }; + }, []); + // ... +``` + +[See more examples below.](#usage) + +#### Parameters + +- `ref`: The `ref` you received as the second argument from the [`forwardRef` render function.](/reference/react/forwardRef#render-function) + +- `createHandle`: A function that takes no arguments and returns the ref handle you want to expose. That ref handle can have any type. Usually, you will return an object with the methods you want to expose. + +- **optional** `dependencies`: The list of all reactive values referenced inside of the `createHandle` code. Reactive values include props, state, and all the variables and functions declared directly inside your component body. If your linter is [configured for React](/learn/editor-setup#linting), it will verify that every reactive value is correctly specified as a dependency. The list of dependencies must have a constant number of items and be written inline like `[dep1, dep2, dep3]`. React will compare each dependency with its previous value using the [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison. If a re-render resulted in a change to some dependency, or if you omitted this argument, your `createHandle` function will re-execute, and the newly created handle will be assigned to the ref. + +#### Returns + +`useImperativeHandle` returns `undefined`. + +--- + +## Usage + +### Exposing a custom ref handle to the parent component + +By default, components don't expose their DOM nodes to parent components. For example, if you want the parent component of `MyInput` to [have access](/learn/manipulating-the-dom-with-refs) to the `<input>` DOM node, you have to opt in with [`forwardRef`:](/reference/react/forwardRef) + +```js +import { forwardRef } from "react"; + +const MyInput = forwardRef(function MyInput(props, ref) { + return <input {...props} ref={ref} />; +}); +``` + +With the code above, [a ref to `MyInput` will receive the `<input>` DOM node.](/reference/react/forwardRef#exposing-a-dom-node-to-the-parent-component) However, you can expose a custom value instead. To customize the exposed handle, call `useImperativeHandle` at the top level of your component: + +```js +import { forwardRef, useImperativeHandle } from "react"; + +const MyInput = forwardRef(function MyInput(props, ref) { + useImperativeHandle( + ref, + () => { + return { + // ... your methods ... + }; + }, + [] + ); + + return <input {...props} />; +}); +``` + +Note that in the code above, the `ref` is no longer forwarded to the `<input>`. + +For example, suppose you don't want to expose the entire `<input>` DOM node, but you want to expose two of its methods: `focus` and `scrollIntoView`. To do this, keep the real browser DOM in a separate ref. Then use `useImperativeHandle` to expose a handle with only the methods that you want the parent component to call: + +```js +import { forwardRef, useRef, useImperativeHandle } from "react"; + +const MyInput = forwardRef(function MyInput(props, ref) { + const inputRef = useRef(null); + + useImperativeHandle( + ref, + () => { + return { + focus() { + inputRef.current.focus(); + }, + scrollIntoView() { + inputRef.current.scrollIntoView(); + }, + }; + }, + [] + ); + + return <input {...props} ref={inputRef} />; +}); +``` + +Now, if the parent component gets a ref to `MyInput`, it will be able to call the `focus` and `scrollIntoView` methods on it. However, it will not have full access to the underlying `<input>` DOM node. + +```js +import { useRef } from "react"; +import MyInput from "./MyInput.js"; + +export default function Form() { + const ref = useRef(null); + + function handleClick() { + ref.current.focus(); + // This won't work because the DOM node isn't exposed: + // ref.current.style.opacity = 0.5; + } + + return ( + <form> + <MyInput label="Enter your name:" ref={ref} /> + <button type="button" onClick={handleClick}> + Edit + </button> + </form> + ); +} +``` + +```js +import { forwardRef, useRef, useImperativeHandle } from "react"; + +const MyInput = forwardRef(function MyInput(props, ref) { + const inputRef = useRef(null); + + useImperativeHandle( + ref, + () => { + return { + focus() { + inputRef.current.focus(); + }, + scrollIntoView() { + inputRef.current.scrollIntoView(); + }, + }; + }, + [] + ); + + return <input {...props} ref={inputRef} />; +}); + +export default MyInput; +``` + +```css +input { + margin: 5px; +} +``` + +--- + +### Exposing your own imperative methods + +The methods you expose via an imperative handle don't have to match the DOM methods exactly. For example, this `Post` component exposes a `scrollAndFocusAddComment` method via an imperative handle. This lets the parent `Page` scroll the list of comments _and_ focus the input field when you click the button: + +```js +import { useRef } from "react"; +import Post from "./Post.js"; + +export default function Page() { + const postRef = useRef(null); + + function handleClick() { + postRef.current.scrollAndFocusAddComment(); + } + + return ( + <> + <button onClick={handleClick}>Write a comment</button> + <Post ref={postRef} /> + </> + ); +} +``` + +```js +import { forwardRef, useRef, useImperativeHandle } from "react"; +import CommentList from "./CommentList.js"; +import AddComment from "./AddComment.js"; + +const Post = forwardRef((props, ref) => { + const commentsRef = useRef(null); + const addCommentRef = useRef(null); + + useImperativeHandle( + ref, + () => { + return { + scrollAndFocusAddComment() { + commentsRef.current.scrollToBottom(); + addCommentRef.current.focus(); + }, + }; + }, + [] + ); + + return ( + <> + <article> + <p>Welcome to my blog!</p> + </article> + <CommentList ref={commentsRef} /> + <AddComment ref={addCommentRef} /> + </> + ); +}); + +export default Post; +``` + +```js +import { forwardRef, useRef, useImperativeHandle } from "react"; + +const CommentList = forwardRef(function CommentList(props, ref) { + const divRef = useRef(null); + + useImperativeHandle( + ref, + () => { + return { + scrollToBottom() { + const node = divRef.current; + node.scrollTop = node.scrollHeight; + }, + }; + }, + [] + ); + + let comments = []; + for (let i = 0; i < 50; i++) { + comments.push(<p key={i}>Comment #{i}</p>); + } + + return ( + <div className="CommentList" ref={divRef}> + {comments} + </div> + ); +}); + +export default CommentList; +``` + +```js +import { forwardRef, useRef, useImperativeHandle } from "react"; + +const AddComment = forwardRef(function AddComment(props, ref) { + return <input placeholder="Add comment..." ref={ref} />; +}); + +export default AddComment; +``` + +```css +.CommentList { + height: 100px; + overflow: scroll; + border: 1px solid black; + margin-top: 20px; + margin-bottom: 20px; +} +``` + +<Pitfall> + +**Do not overuse refs.** You should only use refs for _imperative_ behaviors that you can't express as props: for example, scrolling to a node, focusing a node, triggering an animation, selecting text, and so on. + +**If you can express something as a prop, you should not use a ref.** For example, instead of exposing an imperative handle like `{ open, close }` from a `Modal` component, it is better to take `isOpen` as a prop like `<Modal isOpen={isOpen} />`. [Effects](/learn/synchronizing-with-effects) can help you expose imperative behaviors via props. + +</Pitfall> diff --git a/docs/src/reference/use-insertion-effect.md b/docs/src/reference/use-insertion-effect.md new file mode 100644 index 000000000..495959069 --- /dev/null +++ b/docs/src/reference/use-insertion-effect.md @@ -0,0 +1,139 @@ +--- +title: Use Insertion Effect 🚫 +--- + +<Pitfall> + +`useInsertionEffect` is for CSS-in-JS library authors. Unless you are working on a CSS-in-JS library and need a place to inject the styles, you probably want [`useEffect`](/reference/react/useEffect) or [`useLayoutEffect`](/reference/react/useLayoutEffect) instead. + +</Pitfall> + +## Overview + +<p class="intro" markdown> + +`useInsertionEffect` is a version of [`useEffect`](/reference/react/useEffect) that fires before any DOM mutations. + +```js +useInsertionEffect(setup, dependencies?) +``` + +</p> + +--- + +## Reference + +### `useInsertionEffect(setup, dependencies?)` + +Call `useInsertionEffect` to insert the styles before any DOM mutations: + +```js +import { useInsertionEffect } from "react"; + +// Inside your CSS-in-JS library +function useCSS(rule) { + useInsertionEffect(() => { + // ... inject <style> tags here ... + }); + return rule; +} +``` + +[See more examples below.](#usage) + +#### Parameters + +- `setup`: The function with your Effect's logic. Your setup function may also optionally return a _cleanup_ function. Before your component is added to the DOM, React will run your setup function. After every re-render with changed dependencies, React will first run the cleanup function (if you provided it) with the old values, and then run your setup function with the new values. Before your component is removed from the DOM, React will run your cleanup function. + +- **optional** `dependencies`: The list of all reactive values referenced inside of the `setup` code. Reactive values include props, state, and all the variables and functions declared directly inside your component body. If your linter is [configured for React](/learn/editor-setup#linting), it will verify that every reactive value is correctly specified as a dependency. The list of dependencies must have a constant number of items and be written inline like `[dep1, dep2, dep3]`. React will compare each dependency with its previous value using the [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison algorithm. If you don't specify the dependencies at all, your Effect will re-run after every re-render of the component. + +#### Returns + +`useInsertionEffect` returns `undefined`. + +#### Caveats + +- Effects only run on the client. They don't run during server rendering. +- You can't update state from inside `useInsertionEffect`. +- By the time `useInsertionEffect` runs, refs are not attached yet, and DOM is not yet updated. + +--- + +## Usage + +### Injecting dynamic styles from CSS-in-JS libraries + +Traditionally, you would style React components using plain CSS. + +```js +// In your JS file: +<button className="success" /> + +// In your CSS file: +.success { color: green; } +``` + +Some teams prefer to author styles directly in JavaScript code instead of writing CSS files. This usually requires using a CSS-in-JS library or a tool. There are three common approaches to CSS-in-JS: + +1. Static extraction to CSS files with a compiler +2. Inline styles, e.g. `<div style={{ opacity: 1 }}>` +3. Runtime injection of `<style>` tags + +If you use CSS-in-JS, we recommend a combination of the first two approaches (CSS files for static styles, inline styles for dynamic styles). **We don't recommend runtime `<style>` tag injection for two reasons:** + +1. Runtime injection forces the browser to recalculate the styles a lot more often. +2. Runtime injection can be very slow if it happens at the wrong time in the React lifecycle. + +The first problem is not solvable, but `useInsertionEffect` helps you solve the second problem. + +Call `useInsertionEffect` to insert the styles before any DOM mutations: + +```js +// Inside your CSS-in-JS library +let isInserted = new Set(); +function useCSS(rule) { + useInsertionEffect(() => { + // As explained earlier, we don't recommend runtime injection of <style> tags. + // But if you have to do it, then it's important to do in useInsertionEffect. + if (!isInserted.has(rule)) { + isInserted.add(rule); + document.head.appendChild(getStyleForRule(rule)); + } + }); + return rule; +} + +function Button() { + const className = useCSS("..."); + return <div className={className} />; +} +``` + +Similarly to `useEffect`, `useInsertionEffect` does not run on the server. If you need to collect which CSS rules have been used on the server, you can do it during rendering: + +```js +let collectedRulesSet = new Set(); + +function useCSS(rule) { + if (typeof window === "undefined") { + collectedRulesSet.add(rule); + } + useInsertionEffect(() => { + // ... + }); + return rule; +} +``` + +[Read more about upgrading CSS-in-JS libraries with runtime injection to `useInsertionEffect`.](https://github.com/reactwg/react-18/discussions/110) + +<DeepDive> + +#### How is this better than injecting styles during rendering or useLayoutEffect? + +If you insert styles during rendering and React is processing a [non-blocking update,](/reference/react/useTransition#marking-a-state-update-as-a-non-blocking-transition) the browser will recalculate the styles every single frame while rendering a component tree, which can be **extremely slow.** + +`useInsertionEffect` is better than inserting styles during [`useLayoutEffect`](/reference/react/useLayoutEffect) or [`useEffect`](/reference/react/useEffect) because it ensures that by the time other Effects run in your components, the `<style>` tags have already been inserted. Otherwise, layout calculations in regular Effects would be wrong due to outdated styles. + +</DeepDive> diff --git a/docs/src/reference/use-layout-effect.md b/docs/src/reference/use-layout-effect.md new file mode 100644 index 000000000..8ea42d8bc --- /dev/null +++ b/docs/src/reference/use-layout-effect.md @@ -0,0 +1,690 @@ +--- +title: Use Layout Effect 🚫 +--- + +<Pitfall> + +`useLayoutEffect` can hurt performance. Prefer [`useEffect`](/reference/react/useEffect) when possible. + +</Pitfall> + +## Overview + +<p class="intro" markdown> + +`useLayoutEffect` is a version of [`useEffect`](/reference/react/useEffect) that fires before the browser repaints the screen. + +```js +useLayoutEffect(setup, dependencies?) +``` + +</p> + +--- + +## Reference + +### `useLayoutEffect(setup, dependencies?)` + +Call `useLayoutEffect` to perform the layout measurements before the browser repaints the screen: + +```js +import { useState, useRef, useLayoutEffect } from 'react'; + +function Tooltip() { + const ref = useRef(null); + const [tooltipHeight, setTooltipHeight] = useState(0); + + useLayoutEffect(() => { + const { height } = ref.current.getBoundingClientRect(); + setTooltipHeight(height); + }, []); + // ... +``` + +[See more examples below.](#usage) + +#### Parameters + +- `setup`: The function with your Effect's logic. Your setup function may also optionally return a _cleanup_ function. Before your component is added to the DOM, React will run your setup function. After every re-render with changed dependencies, React will first run the cleanup function (if you provided it) with the old values, and then run your setup function with the new values. Before your component is removed from the DOM, React will run your cleanup function. + +- **optional** `dependencies`: The list of all reactive values referenced inside of the `setup` code. Reactive values include props, state, and all the variables and functions declared directly inside your component body. If your linter is [configured for React](/learn/editor-setup#linting), it will verify that every reactive value is correctly specified as a dependency. The list of dependencies must have a constant number of items and be written inline like `[dep1, dep2, dep3]`. React will compare each dependency with its previous value using the [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison. If you omit this argument, your Effect will re-run after every re-render of the component. + +#### Returns + +`useLayoutEffect` returns `undefined`. + +#### Caveats + +- `useLayoutEffect` is a Hook, so you can only call it **at the top level of your component** or your own Hooks. You can't call it inside loops or conditions. If you need that, extract a component and move the Effect there. + +- When Strict Mode is on, React will **run one extra development-only setup+cleanup cycle** before the first real setup. This is a stress-test that ensures that your cleanup logic "mirrors" your setup logic and that it stops or undoes whatever the setup is doing. If this causes a problem, [implement the cleanup function.](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development) + +- If some of your dependencies are objects or functions defined inside the component, there is a risk that they will **cause the Effect to re-run more often than needed.** To fix this, remove unnecessary [object](/reference/react/useEffect#removing-unnecessary-object-dependencies) and [function](/reference/react/useEffect#removing-unnecessary-function-dependencies) dependencies. You can also [extract state updates](/reference/react/useEffect#updating-state-based-on-previous-state-from-an-effect) and [non-reactive logic](/reference/react/useEffect#reading-the-latest-props-and-state-from-an-effect) outside of your Effect. + +- Effects **only run on the client.** They don't run during server rendering. + +- The code inside `useLayoutEffect` and all state updates scheduled from it **block the browser from repainting the screen.** When used excessively, this makes your app slow. When possible, prefer [`useEffect`.](/reference/react/useEffect) + +--- + +## Usage + +### Measuring layout before the browser repaints the screen + +Most components don't need to know their position and size on the screen to decide what to render. They only return some JSX. Then the browser calculates their _layout_ (position and size) and repaints the screen. + +Sometimes, that's not enough. Imagine a tooltip that appears next to some element on hover. If there's enough space, the tooltip should appear above the element, but if it doesn't fit, it should appear below. In order to render the tooltip at the right final position, you need to know its height (i.e. whether it fits at the top). + +To do this, you need to render in two passes: + +1. Render the tooltip anywhere (even with a wrong position). +2. Measure its height and decide where to place the tooltip. +3. Render the tooltip _again_ in the correct place. + +**All of this needs to happen before the browser repaints the screen.** You don't want the user to see the tooltip moving. Call `useLayoutEffect` to perform the layout measurements before the browser repaints the screen: + +```js +function Tooltip() { + const ref = useRef(null); + const [tooltipHeight, setTooltipHeight] = useState(0); // You don't know real height yet + + useLayoutEffect(() => { + const { height } = ref.current.getBoundingClientRect(); + setTooltipHeight(height); // Re-render now that you know the real height + }, []); + + // ...use tooltipHeight in the rendering logic below... +} +``` + +Here's how this works step by step: + +1. `Tooltip` renders with the initial `tooltipHeight = 0` (so the tooltip may be wrongly positioned). +2. React places it in the DOM and runs the code in `useLayoutEffect`. +3. Your `useLayoutEffect` [measures the height](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect) of the tooltip content and triggers an immediate re-render. +4. `Tooltip` renders again with the real `tooltipHeight` (so the tooltip is correctly positioned). +5. React updates it in the DOM, and the browser finally displays the tooltip. + +Hover over the buttons below and see how the tooltip adjusts its position depending on whether it fits: + +```js +import ButtonWithTooltip from "./ButtonWithTooltip.js"; + +export default function App() { + return ( + <div> + <ButtonWithTooltip + tooltipContent={ + <div> + This tooltip does not fit above the button. + <br /> + This is why it's displayed below instead! + </div> + } + > + Hover over me (tooltip above) + </ButtonWithTooltip> + <div style={{ height: 50 }} /> + <ButtonWithTooltip + tooltipContent={<div>This tooltip fits above the button</div>} + > + Hover over me (tooltip below) + </ButtonWithTooltip> + <div style={{ height: 50 }} /> + <ButtonWithTooltip + tooltipContent={<div>This tooltip fits above the button</div>} + > + Hover over me (tooltip below) + </ButtonWithTooltip> + </div> + ); +} +``` + +```js +import { useState, useRef } from "react"; +import Tooltip from "./Tooltip.js"; + +export default function ButtonWithTooltip({ tooltipContent, ...rest }) { + const [targetRect, setTargetRect] = useState(null); + const buttonRef = useRef(null); + return ( + <> + <button + {...rest} + ref={buttonRef} + onPointerEnter={() => { + const rect = buttonRef.current.getBoundingClientRect(); + setTargetRect({ + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + }); + }} + onPointerLeave={() => { + setTargetRect(null); + }} + /> + {targetRect !== null && ( + <Tooltip targetRect={targetRect}>{tooltipContent}</Tooltip> + )} + </> + ); +} +``` + +```js +import { useRef, useLayoutEffect, useState } from "react"; +import { createPortal } from "react-dom"; +import TooltipContainer from "./TooltipContainer.js"; + +export default function Tooltip({ children, targetRect }) { + const ref = useRef(null); + const [tooltipHeight, setTooltipHeight] = useState(0); + + useLayoutEffect(() => { + const { height } = ref.current.getBoundingClientRect(); + setTooltipHeight(height); + console.log("Measured tooltip height: " + height); + }, []); + + let tooltipX = 0; + let tooltipY = 0; + if (targetRect !== null) { + tooltipX = targetRect.left; + tooltipY = targetRect.top - tooltipHeight; + if (tooltipY < 0) { + // It doesn't fit above, so place below. + tooltipY = targetRect.bottom; + } + } + + return createPortal( + <TooltipContainer x={tooltipX} y={tooltipY} contentRef={ref}> + {children} + </TooltipContainer>, + document.body + ); +} +``` + +```js +export default function TooltipContainer({ children, x, y, contentRef }) { + return ( + <div + style={{ + position: "absolute", + pointerEvents: "none", + left: 0, + top: 0, + transform: `translate3d(${x}px, ${y}px, 0)`, + }} + > + <div ref={contentRef} className="tooltip"> + {children} + </div> + </div> + ); +} +``` + +```css +.tooltip { + color: white; + background: #222; + border-radius: 4px; + padding: 4px; +} +``` + +Notice that even though the `Tooltip` component has to render in two passes (first, with `tooltipHeight` initialized to `0` and then with the real measured height), you only see the final result. This is why you need `useLayoutEffect` instead of [`useEffect`](/reference/react/useEffect) for this example. Let's look at the difference in detail below. + +<Recipes titleText="useLayoutEffect vs useEffect" titleId="examples"> + +#### `useLayoutEffect` blocks the browser from repainting + +React guarantees that the code inside `useLayoutEffect` and any state updates scheduled inside it will be processed **before the browser repaints the screen.** This lets you render the tooltip, measure it, and re-render the tooltip again without the user noticing the first extra render. In other words, `useLayoutEffect` blocks the browser from painting. + +```js +import ButtonWithTooltip from "./ButtonWithTooltip.js"; + +export default function App() { + return ( + <div> + <ButtonWithTooltip + tooltipContent={ + <div> + This tooltip does not fit above the button. + <br /> + This is why it's displayed below instead! + </div> + } + > + Hover over me (tooltip above) + </ButtonWithTooltip> + <div style={{ height: 50 }} /> + <ButtonWithTooltip + tooltipContent={<div>This tooltip fits above the button</div>} + > + Hover over me (tooltip below) + </ButtonWithTooltip> + <div style={{ height: 50 }} /> + <ButtonWithTooltip + tooltipContent={<div>This tooltip fits above the button</div>} + > + Hover over me (tooltip below) + </ButtonWithTooltip> + </div> + ); +} +``` + +```js +import { useState, useRef } from "react"; +import Tooltip from "./Tooltip.js"; + +export default function ButtonWithTooltip({ tooltipContent, ...rest }) { + const [targetRect, setTargetRect] = useState(null); + const buttonRef = useRef(null); + return ( + <> + <button + {...rest} + ref={buttonRef} + onPointerEnter={() => { + const rect = buttonRef.current.getBoundingClientRect(); + setTargetRect({ + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + }); + }} + onPointerLeave={() => { + setTargetRect(null); + }} + /> + {targetRect !== null && ( + <Tooltip targetRect={targetRect}>{tooltipContent}</Tooltip> + )} + </> + ); +} +``` + +```js +import { useRef, useLayoutEffect, useState } from "react"; +import { createPortal } from "react-dom"; +import TooltipContainer from "./TooltipContainer.js"; + +export default function Tooltip({ children, targetRect }) { + const ref = useRef(null); + const [tooltipHeight, setTooltipHeight] = useState(0); + + useLayoutEffect(() => { + const { height } = ref.current.getBoundingClientRect(); + setTooltipHeight(height); + }, []); + + let tooltipX = 0; + let tooltipY = 0; + if (targetRect !== null) { + tooltipX = targetRect.left; + tooltipY = targetRect.top - tooltipHeight; + if (tooltipY < 0) { + // It doesn't fit above, so place below. + tooltipY = targetRect.bottom; + } + } + + return createPortal( + <TooltipContainer x={tooltipX} y={tooltipY} contentRef={ref}> + {children} + </TooltipContainer>, + document.body + ); +} +``` + +```js +export default function TooltipContainer({ children, x, y, contentRef }) { + return ( + <div + style={{ + position: "absolute", + pointerEvents: "none", + left: 0, + top: 0, + transform: `translate3d(${x}px, ${y}px, 0)`, + }} + > + <div ref={contentRef} className="tooltip"> + {children} + </div> + </div> + ); +} +``` + +```css +.tooltip { + color: white; + background: #222; + border-radius: 4px; + padding: 4px; +} +``` + +#### `useEffect` does not block the browser + +Here is the same example, but with [`useEffect`](/reference/react/useEffect) instead of `useLayoutEffect`. If you're on a slower device, you might notice that sometimes the tooltip "flickers" and you briefly see its initial position before the corrected position. + +```js +import ButtonWithTooltip from "./ButtonWithTooltip.js"; + +export default function App() { + return ( + <div> + <ButtonWithTooltip + tooltipContent={ + <div> + This tooltip does not fit above the button. + <br /> + This is why it's displayed below instead! + </div> + } + > + Hover over me (tooltip above) + </ButtonWithTooltip> + <div style={{ height: 50 }} /> + <ButtonWithTooltip + tooltipContent={<div>This tooltip fits above the button</div>} + > + Hover over me (tooltip below) + </ButtonWithTooltip> + <div style={{ height: 50 }} /> + <ButtonWithTooltip + tooltipContent={<div>This tooltip fits above the button</div>} + > + Hover over me (tooltip below) + </ButtonWithTooltip> + </div> + ); +} +``` + +```js +import { useState, useRef } from "react"; +import Tooltip from "./Tooltip.js"; + +export default function ButtonWithTooltip({ tooltipContent, ...rest }) { + const [targetRect, setTargetRect] = useState(null); + const buttonRef = useRef(null); + return ( + <> + <button + {...rest} + ref={buttonRef} + onPointerEnter={() => { + const rect = buttonRef.current.getBoundingClientRect(); + setTargetRect({ + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + }); + }} + onPointerLeave={() => { + setTargetRect(null); + }} + /> + {targetRect !== null && ( + <Tooltip targetRect={targetRect}>{tooltipContent}</Tooltip> + )} + </> + ); +} +``` + +```js +import { useRef, useEffect, useState } from "react"; +import { createPortal } from "react-dom"; +import TooltipContainer from "./TooltipContainer.js"; + +export default function Tooltip({ children, targetRect }) { + const ref = useRef(null); + const [tooltipHeight, setTooltipHeight] = useState(0); + + useEffect(() => { + const { height } = ref.current.getBoundingClientRect(); + setTooltipHeight(height); + }, []); + + let tooltipX = 0; + let tooltipY = 0; + if (targetRect !== null) { + tooltipX = targetRect.left; + tooltipY = targetRect.top - tooltipHeight; + if (tooltipY < 0) { + // It doesn't fit above, so place below. + tooltipY = targetRect.bottom; + } + } + + return createPortal( + <TooltipContainer x={tooltipX} y={tooltipY} contentRef={ref}> + {children} + </TooltipContainer>, + document.body + ); +} +``` + +```js +export default function TooltipContainer({ children, x, y, contentRef }) { + return ( + <div + style={{ + position: "absolute", + pointerEvents: "none", + left: 0, + top: 0, + transform: `translate3d(${x}px, ${y}px, 0)`, + }} + > + <div ref={contentRef} className="tooltip"> + {children} + </div> + </div> + ); +} +``` + +```css +.tooltip { + color: white; + background: #222; + border-radius: 4px; + padding: 4px; +} +``` + +To make the bug easier to reproduce, this version adds an artificial delay during rendering. React will let the browser paint the screen before it processes the state update inside `useEffect`. As a result, the tooltip flickers: + +```js +import ButtonWithTooltip from "./ButtonWithTooltip.js"; + +export default function App() { + return ( + <div> + <ButtonWithTooltip + tooltipContent={ + <div> + This tooltip does not fit above the button. + <br /> + This is why it's displayed below instead! + </div> + } + > + Hover over me (tooltip above) + </ButtonWithTooltip> + <div style={{ height: 50 }} /> + <ButtonWithTooltip + tooltipContent={<div>This tooltip fits above the button</div>} + > + Hover over me (tooltip below) + </ButtonWithTooltip> + <div style={{ height: 50 }} /> + <ButtonWithTooltip + tooltipContent={<div>This tooltip fits above the button</div>} + > + Hover over me (tooltip below) + </ButtonWithTooltip> + </div> + ); +} +``` + +```js +import { useState, useRef } from "react"; +import Tooltip from "./Tooltip.js"; + +export default function ButtonWithTooltip({ tooltipContent, ...rest }) { + const [targetRect, setTargetRect] = useState(null); + const buttonRef = useRef(null); + return ( + <> + <button + {...rest} + ref={buttonRef} + onPointerEnter={() => { + const rect = buttonRef.current.getBoundingClientRect(); + setTargetRect({ + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + }); + }} + onPointerLeave={() => { + setTargetRect(null); + }} + /> + {targetRect !== null && ( + <Tooltip targetRect={targetRect}>{tooltipContent}</Tooltip> + )} + </> + ); +} +``` + +```js +import { useRef, useEffect, useState } from "react"; +import { createPortal } from "react-dom"; +import TooltipContainer from "./TooltipContainer.js"; + +export default function Tooltip({ children, targetRect }) { + const ref = useRef(null); + const [tooltipHeight, setTooltipHeight] = useState(0); + + // This artificially slows down rendering + let now = performance.now(); + while (performance.now() - now < 100) { + // Do nothing for a bit... + } + + useEffect(() => { + const { height } = ref.current.getBoundingClientRect(); + setTooltipHeight(height); + }, []); + + let tooltipX = 0; + let tooltipY = 0; + if (targetRect !== null) { + tooltipX = targetRect.left; + tooltipY = targetRect.top - tooltipHeight; + if (tooltipY < 0) { + // It doesn't fit above, so place below. + tooltipY = targetRect.bottom; + } + } + + return createPortal( + <TooltipContainer x={tooltipX} y={tooltipY} contentRef={ref}> + {children} + </TooltipContainer>, + document.body + ); +} +``` + +```js +export default function TooltipContainer({ children, x, y, contentRef }) { + return ( + <div + style={{ + position: "absolute", + pointerEvents: "none", + left: 0, + top: 0, + transform: `translate3d(${x}px, ${y}px, 0)`, + }} + > + <div ref={contentRef} className="tooltip"> + {children} + </div> + </div> + ); +} +``` + +```css +.tooltip { + color: white; + background: #222; + border-radius: 4px; + padding: 4px; +} +``` + +Edit this example to `useLayoutEffect` and observe that it blocks the paint even if rendering is slowed down. + +</Recipes> + +<Note> + +Rendering in two passes and blocking the browser hurts performance. Try to avoid this when you can. + +</Note> + +--- + +## Troubleshooting + +### I'm getting an error: "`useLayoutEffect` does nothing on the server" + +The purpose of `useLayoutEffect` is to let your component [use layout information for rendering:](#measuring-layout-before-the-browser-repaints-the-screen) + +1. Render the initial content. +2. Measure the layout _before the browser repaints the screen._ +3. Render the final content using the layout information you've read. + +When you or your framework uses [server rendering](/reference/react-dom/server), your React app renders to HTML on the server for the initial render. This lets you show the initial HTML before the JavaScript code loads. + +The problem is that on the server, there is no layout information. + +In the [earlier example](#measuring-layout-before-the-browser-repaints-the-screen), the `useLayoutEffect` call in the `Tooltip` component lets it position itself correctly (either above or below content) depending on the content height. If you tried to render `Tooltip` as a part of the initial server HTML, this would be impossible to determine. On the server, there is no layout yet! So, even if you rendered it on the server, its position would "jump" on the client after the JavaScript loads and runs. + +Usually, components that rely on layout information don't need to render on the server anyway. For example, it probably doesn't make sense to show a `Tooltip` during the initial render. It is triggered by a client interaction. + +However, if you're running into this problem, you have a few different options: + +- Replace `useLayoutEffect` with [`useEffect`.](/reference/react/useEffect) This tells React that it's okay to display the initial render result without blocking the paint (because the original HTML will become visible before your Effect runs). + +- Alternatively, [mark your component as client-only.](/reference/react/Suspense#providing-a-fallback-for-server-errors-and-server-only-content) This tells React to replace its content up to the closest [`<Suspense>`](/reference/react/Suspense) boundary with a loading fallback (for example, a spinner or a glimmer) during server rendering. + +- Alternatively, you can render a component with `useLayoutEffect` only after hydration. Keep a boolean `isMounted` state that's initialized to `false`, and set it to `true` inside a `useEffect` call. Your rendering logic can then be like `return isMounted ? <RealContent /> : <FallbackContent />`. On the server and during the hydration, the user will see `FallbackContent` which should not call `useLayoutEffect`. Then React will replace it with `RealContent` which runs on the client only and can include `useLayoutEffect` calls. + +- If you synchronize your component with an external data store and rely on `useLayoutEffect` for different reasons than measuring layout, consider [`useSyncExternalStore`](/reference/react/useSyncExternalStore) instead which [supports server rendering.](/reference/react/useSyncExternalStore#adding-support-for-server-rendering) diff --git a/docs/src/reference/use-sync-external-store.md b/docs/src/reference/use-sync-external-store.md new file mode 100644 index 000000000..9d5425fd2 --- /dev/null +++ b/docs/src/reference/use-sync-external-store.md @@ -0,0 +1,429 @@ +--- +title: Use Sync External Store 🚫 +--- + +## Overview + +<p class="intro" markdown> + +`useSyncExternalStore` is a React Hook that lets you subscribe to an external store. + +```js +const snapshot = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot?) +``` + +</p> + +--- + +## Reference + +### `useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot?)` + +Call `useSyncExternalStore` at the top level of your component to read a value from an external data store. + +```js +import { useSyncExternalStore } from "react"; +import { todosStore } from "./todoStore.js"; + +function TodosApp() { + const todos = useSyncExternalStore( + todosStore.subscribe, + todosStore.getSnapshot + ); + // ... +} +``` + +It returns the snapshot of the data in the store. You need to pass two functions as arguments: + +1. The `subscribe` function should subscribe to the store and return a function that unsubscribes. +2. The `getSnapshot` function should read a snapshot of the data from the store. + +[See more examples below.](#usage) + +#### Parameters + +- `subscribe`: A function that takes a single `callback` argument and subscribes it to the store. When the store changes, it should invoke the provided `callback`. This will cause the component to re-render. The `subscribe` function should return a function that cleans up the subscription. + +- `getSnapshot`: A function that returns a snapshot of the data in the store that's needed by the component. While the store has not changed, repeated calls to `getSnapshot` must return the same value. If the store changes and the returned value is different (as compared by [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is)), React re-renders the component. + +- **optional** `getServerSnapshot`: A function that returns the initial snapshot of the data in the store. It will be used only during server rendering and during hydration of server-rendered content on the client. The server snapshot must be the same between the client and the server, and is usually serialized and passed from the server to the client. If you omit this argument, rendering the component on the server will throw an error. + +#### Returns + +The current snapshot of the store which you can use in your rendering logic. + +#### Caveats + +- The store snapshot returned by `getSnapshot` must be immutable. If the underlying store has mutable data, return a new immutable snapshot if the data has changed. Otherwise, return a cached last snapshot. + +- If a different `subscribe` function is passed during a re-render, React will re-subscribe to the store using the newly passed `subscribe` function. You can prevent this by declaring `subscribe` outside the component. + +--- + +## Usage + +### Subscribing to an external store + +Most of your React components will only read data from their [props,](/learn/passing-props-to-a-component) [state,](/reference/react/useState) and [context.](/reference/react/useContext) However, sometimes a component needs to read some data from some store outside of React that changes over time. This includes: + +- Third-party state management libraries that hold state outside of React. +- Browser APIs that expose a mutable value and events to subscribe to its changes. + +Call `useSyncExternalStore` at the top level of your component to read a value from an external data store. + +```js +import { useSyncExternalStore } from "react"; +import { todosStore } from "./todoStore.js"; + +function TodosApp() { + const todos = useSyncExternalStore( + todosStore.subscribe, + todosStore.getSnapshot + ); + // ... +} +``` + +It returns the <CodeStep step={3}>snapshot</CodeStep> of the data in the store. You need to pass two functions as arguments: + +1. The <CodeStep step={1}>`subscribe` function</CodeStep> should subscribe to the store and return a function that unsubscribes. +2. The <CodeStep step={2}>`getSnapshot` function</CodeStep> should read a snapshot of the data from the store. + +React will use these functions to keep your component subscribed to the store and re-render it on changes. + +For example, in the sandbox below, `todosStore` is implemented as an external store that stores data outside of React. The `TodosApp` component connects to that external store with the `useSyncExternalStore` Hook. + +```js +import { useSyncExternalStore } from "react"; +import { todosStore } from "./todoStore.js"; + +export default function TodosApp() { + const todos = useSyncExternalStore( + todosStore.subscribe, + todosStore.getSnapshot + ); + return ( + <> + <button onClick={() => todosStore.addTodo()}>Add todo</button> + <hr /> + <ul> + {todos.map((todo) => ( + <li key={todo.id}>{todo.text}</li> + ))} + </ul> + </> + ); +} +``` + +```js +// This is an example of a third-party store +// that you might need to integrate with React. + +// If your app is fully built with React, +// we recommend using React state instead. + +let nextId = 0; +let todos = [{ id: nextId++, text: "Todo #1" }]; +let listeners = []; + +export const todosStore = { + addTodo() { + todos = [...todos, { id: nextId++, text: "Todo #" + nextId }]; + emitChange(); + }, + subscribe(listener) { + listeners = [...listeners, listener]; + return () => { + listeners = listeners.filter((l) => l !== listener); + }; + }, + getSnapshot() { + return todos; + }, +}; + +function emitChange() { + for (let listener of listeners) { + listener(); + } +} +``` + +<Note> + +When possible, we recommend using built-in React state with [`useState`](/reference/react/useState) and [`useReducer`](/reference/react/useReducer) instead. The `useSyncExternalStore` API is mostly useful if you need to integrate with existing non-React code. + +</Note> + +--- + +### Subscribing to a browser API + +Another reason to add `useSyncExternalStore` is when you want to subscribe to some value exposed by the browser that changes over time. For example, suppose that you want your component to display whether the network connection is active. The browser exposes this information via a property called [`navigator.onLine`.](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/onLine) + +This value can change without React's knowledge, so you should read it with `useSyncExternalStore`. + +```js +import { useSyncExternalStore } from "react"; + +function ChatIndicator() { + const isOnline = useSyncExternalStore(subscribe, getSnapshot); + // ... +} +``` + +To implement the `getSnapshot` function, read the current value from the browser API: + +```js +function getSnapshot() { + return navigator.onLine; +} +``` + +Next, you need to implement the `subscribe` function. For example, when `navigator.onLine` changes, the browser fires the [`online`](https://developer.mozilla.org/en-US/docs/Web/API/Window/online_event) and [`offline`](https://developer.mozilla.org/en-US/docs/Web/API/Window/offline_event) events on the `window` object. You need to subscribe the `callback` argument to the corresponding events, and then return a function that cleans up the subscriptions: + +```js +function subscribe(callback) { + window.addEventListener("online", callback); + window.addEventListener("offline", callback); + return () => { + window.removeEventListener("online", callback); + window.removeEventListener("offline", callback); + }; +} +``` + +Now React knows how to read the value from the external `navigator.onLine` API and how to subscribe to its changes. Disconnect your device from the network and notice that the component re-renders in response: + +```js +import { useSyncExternalStore } from "react"; + +export default function ChatIndicator() { + const isOnline = useSyncExternalStore(subscribe, getSnapshot); + return <h1>{isOnline ? "✅ Online" : "❌ Disconnected"}</h1>; +} + +function getSnapshot() { + return navigator.onLine; +} + +function subscribe(callback) { + window.addEventListener("online", callback); + window.addEventListener("offline", callback); + return () => { + window.removeEventListener("online", callback); + window.removeEventListener("offline", callback); + }; +} +``` + +--- + +### Extracting the logic to a custom Hook + +Usually you won't write `useSyncExternalStore` directly in your components. Instead, you'll typically call it from your own custom Hook. This lets you use the same external store from different components. + +For example, this custom `useOnlineStatus` Hook tracks whether the network is online: + +```js +import { useSyncExternalStore } from "react"; + +export function useOnlineStatus() { + const isOnline = useSyncExternalStore(subscribe, getSnapshot); + return isOnline; +} + +function getSnapshot() { + // ... +} + +function subscribe(callback) { + // ... +} +``` + +Now different components can call `useOnlineStatus` without repeating the underlying implementation: + +```js +import { useOnlineStatus } from "./useOnlineStatus.js"; + +function StatusBar() { + const isOnline = useOnlineStatus(); + return <h1>{isOnline ? "✅ Online" : "❌ Disconnected"}</h1>; +} + +function SaveButton() { + const isOnline = useOnlineStatus(); + + function handleSaveClick() { + console.log("✅ Progress saved"); + } + + return ( + <button disabled={!isOnline} onClick={handleSaveClick}> + {isOnline ? "Save progress" : "Reconnecting..."} + </button> + ); +} + +export default function App() { + return ( + <> + <SaveButton /> + <StatusBar /> + </> + ); +} +``` + +```js +import { useSyncExternalStore } from "react"; + +export function useOnlineStatus() { + const isOnline = useSyncExternalStore(subscribe, getSnapshot); + return isOnline; +} + +function getSnapshot() { + return navigator.onLine; +} + +function subscribe(callback) { + window.addEventListener("online", callback); + window.addEventListener("offline", callback); + return () => { + window.removeEventListener("online", callback); + window.removeEventListener("offline", callback); + }; +} +``` + +--- + +### Adding support for server rendering + +If your React app uses [server rendering,](/reference/react-dom/server) your React components will also run outside the browser environment to generate the initial HTML. This creates a few challenges when connecting to an external store: + +- If you're connecting to a browser-only API, it won't work because it does not exist on the server. +- If you're connecting to a third-party data store, you'll need its data to match between the server and client. + +To solve these issues, pass a `getServerSnapshot` function as the third argument to `useSyncExternalStore`: + +```js +import { useSyncExternalStore } from "react"; + +export function useOnlineStatus() { + const isOnline = useSyncExternalStore( + subscribe, + getSnapshot, + getServerSnapshot + ); + return isOnline; +} + +function getSnapshot() { + return navigator.onLine; +} + +function getServerSnapshot() { + return true; // Always show "Online" for server-generated HTML +} + +function subscribe(callback) { + // ... +} +``` + +The `getServerSnapshot` function is similar to `getSnapshot`, but it runs only in two situations: + +- It runs on the server when generating the HTML. +- It runs on the client during [hydration](/reference/react-dom/client/hydrateRoot), i.e. when React takes the server HTML and makes it interactive. + +This lets you provide the initial snapshot value which will be used before the app becomes interactive. If there is no meaningful initial value for the server rendering, omit this argument to [force rendering on the client.](/reference/react/Suspense#providing-a-fallback-for-server-errors-and-server-only-content) + +<Note> + +Make sure that `getServerSnapshot` returns the same exact data on the initial client render as it returned on the server. For example, if `getServerSnapshot` returned some prepopulated store content on the server, you need to transfer this content to the client. One way to do this is to emit a `<script>` tag during server rendering that sets a global like `window.MY_STORE_DATA`, and read from that global on the client in `getServerSnapshot`. Your external store should provide instructions on how to do that. + +</Note> + +--- + +## Troubleshooting + +### I'm getting an error: "The result of `getSnapshot` should be cached" + +This error means your `getSnapshot` function returns a new object every time it's called, for example: + +```js +function getSnapshot() { + // 🔴 Do not return always different objects from getSnapshot + return { + todos: myStore.todos, + }; +} +``` + +React will re-render the component if `getSnapshot` return value is different from the last time. This is why, if you always return a different value, you will enter an infinite loop and get this error. + +Your `getSnapshot` object should only return a different object if something has actually changed. If your store contains immutable data, you can return that data directly: + +```js +function getSnapshot() { + // ✅ You can return immutable data + return myStore.todos; +} +``` + +If your store data is mutable, your `getSnapshot` function should return an immutable snapshot of it. This means it _does_ need to create new objects, but it shouldn't do this for every single call. Instead, it should store the last calculated snapshot, and return the same snapshot as the last time if the data in the store has not changed. How you determine whether mutable data has changed depends on your mutable store. + +--- + +### My `subscribe` function gets called after every re-render + +This `subscribe` function is defined _inside_ a component so it is different on every re-render: + +```js +function ChatIndicator() { + const isOnline = useSyncExternalStore(subscribe, getSnapshot); + + // 🚩 Always a different function, so React will resubscribe on every re-render + function subscribe() { + // ... + } + + // ... +} +``` + +React will resubscribe to your store if you pass a different `subscribe` function between re-renders. If this causes performance issues and you'd like to avoid resubscribing, move the `subscribe` function outside: + +```js +function ChatIndicator() { + const isOnline = useSyncExternalStore(subscribe, getSnapshot); + // ... +} + +// ✅ Always the same function, so React won't need to resubscribe +function subscribe() { + // ... +} +``` + +Alternatively, wrap `subscribe` into [`useCallback`](/reference/react/useCallback) to only resubscribe when some argument changes: + +```js +function ChatIndicator({ userId }) { + const isOnline = useSyncExternalStore(subscribe, getSnapshot); + + // ✅ Same function as long as userId doesn't change + const subscribe = useCallback(() => { + // ... + }, [userId]); + + // ... +} +``` diff --git a/docs/src/reference/use-transition.md b/docs/src/reference/use-transition.md new file mode 100644 index 000000000..8279f7afe --- /dev/null +++ b/docs/src/reference/use-transition.md @@ -0,0 +1,1587 @@ +--- +title: Use Transition 🚫 +--- + +## Overview + +<p class="intro" markdown> + +`useTransition` is a React Hook that lets you update the state without blocking the UI. + +```js +const [isPending, startTransition] = useTransition(); +``` + +</p> + +--- + +## Reference + +### `useTransition()` + +Call `useTransition` at the top level of your component to mark some state updates as transitions. + +```js +import { useTransition } from "react"; + +function TabContainer() { + const [isPending, startTransition] = useTransition(); + // ... +} +``` + +[See more examples below.](#usage) + +#### Parameters + +`useTransition` does not take any parameters. + +#### Returns + +`useTransition` returns an array with exactly two items: + +1. The `isPending` flag that tells you whether there is a pending transition. +2. The [`startTransition` function](#starttransition) that lets you mark a state update as a transition. + +--- + +### `startTransition` function + +The `startTransition` function returned by `useTransition` lets you mark a state update as a transition. + +```js +function TabContainer() { + const [isPending, startTransition] = useTransition(); + const [tab, setTab] = useState("about"); + + function selectTab(nextTab) { + startTransition(() => { + setTab(nextTab); + }); + } + // ... +} +``` + +#### Parameters + +- `scope`: A function that updates some state by calling one or more [`set` functions.](/reference/react/useState#setstate) React immediately calls `scope` with no parameters and marks all state updates scheduled synchronously during the `scope` function call as transitions. They will be [non-blocking](#marking-a-state-update-as-a-non-blocking-transition) and [will not display unwanted loading indicators.](#preventing-unwanted-loading-indicators) + +#### Returns + +`startTransition` does not return anything. + +#### Caveats + +- `useTransition` is a Hook, so it can only be called inside components or custom Hooks. If you need to start a transition somewhere else (for example, from a data library), call the standalone [`startTransition`](/reference/react/startTransition) instead. + +- You can wrap an update into a transition only if you have access to the `set` function of that state. If you want to start a transition in response to some prop or a custom Hook value, try [`useDeferredValue`](/reference/react/useDeferredValue) instead. + +- The function you pass to `startTransition` must be synchronous. React immediately executes this function, marking all state updates that happen while it executes as transitions. If you try to perform more state updates later (for example, in a timeout), they won't be marked as transitions. + +- A state update marked as a transition will be interrupted by other state updates. For example, if you update a chart component inside a transition, but then start typing into an input while the chart is in the middle of a re-render, React will restart the rendering work on the chart component after handling the input update. + +- Transition updates can't be used to control text inputs. + +- If there are multiple ongoing transitions, React currently batches them together. This is a limitation that will likely be removed in a future release. + +--- + +## Usage + +### Marking a state update as a non-blocking transition + +Call `useTransition` at the top level of your component to mark state updates as non-blocking _transitions_. + +```js +import { useState, useTransition } from "react"; + +function TabContainer() { + const [isPending, startTransition] = useTransition(); + // ... +} +``` + +`useTransition` returns an array with exactly two items: + +1. The <CodeStep step={1}>`isPending` flag</CodeStep> that tells you whether there is a pending transition. +2. The <CodeStep step={2}>`startTransition` function</CodeStep> that lets you mark a state update as a transition. + +You can then mark a state update as a transition like this: + +```js +function TabContainer() { + const [isPending, startTransition] = useTransition(); + const [tab, setTab] = useState("about"); + + function selectTab(nextTab) { + startTransition(() => { + setTab(nextTab); + }); + } + // ... +} +``` + +Transitions let you keep the user interface updates responsive even on slow devices. + +With a transition, your UI stays responsive in the middle of a re-render. For example, if the user clicks a tab but then change their mind and click another tab, they can do that without waiting for the first re-render to finish. + +<Recipes titleText="The difference between useTransition and regular state updates" titleId="examples"> + +#### Updating the current tab in a transition + +In this example, the "Posts" tab is **artificially slowed down** so that it takes at least a second to render. + +Click "Posts" and then immediately click "Contact". Notice that this interrupts the slow render of "Posts". The "Contact" tab shows immediately. Because this state update is marked as a transition, a slow re-render did not freeze the user interface. + +```js +import { useState, useTransition } from "react"; +import TabButton from "./TabButton.js"; +import AboutTab from "./AboutTab.js"; +import PostsTab from "./PostsTab.js"; +import ContactTab from "./ContactTab.js"; + +export default function TabContainer() { + const [isPending, startTransition] = useTransition(); + const [tab, setTab] = useState("about"); + + function selectTab(nextTab) { + startTransition(() => { + setTab(nextTab); + }); + } + + return ( + <> + <TabButton + isActive={tab === "about"} + onClick={() => selectTab("about")} + > + About + </TabButton> + <TabButton + isActive={tab === "posts"} + onClick={() => selectTab("posts")} + > + Posts (slow) + </TabButton> + <TabButton + isActive={tab === "contact"} + onClick={() => selectTab("contact")} + > + Contact + </TabButton> + <hr /> + {tab === "about" && <AboutTab />} + {tab === "posts" && <PostsTab />} + {tab === "contact" && <ContactTab />} + </> + ); +} +``` + +```js +import { useTransition } from "react"; + +export default function TabButton({ children, isActive, onClick }) { + if (isActive) { + return <b>{children}</b>; + } + return ( + <button + onClick={() => { + onClick(); + }} + > + {children} + </button> + ); +} +``` + +```js +export default function AboutTab() { + return <p>Welcome to my profile!</p>; +} +``` + +```js +import { memo } from "react"; + +const PostsTab = memo(function PostsTab() { + // Log once. The actual slowdown is inside SlowPost. + console.log("[ARTIFICIALLY SLOW] Rendering 500 <SlowPost />"); + + let items = []; + for (let i = 0; i < 500; i++) { + items.push(<SlowPost key={i} index={i} />); + } + return <ul className="items">{items}</ul>; +}); + +function SlowPost({ index }) { + let startTime = performance.now(); + while (performance.now() - startTime < 1) { + // Do nothing for 1 ms per item to emulate extremely slow code + } + + return <li className="item">Post #{index + 1}</li>; +} + +export default PostsTab; +``` + +```js +export default function ContactTab() { + return ( + <> + <p>You can find me online here:</p> + <ul> + <li>admin@mysite.com</li> + <li>+123456789</li> + </ul> + </> + ); +} +``` + +```css +button { + margin-right: 10px; +} +b { + display: inline-block; + margin-right: 10px; +} +``` + +#### Updating the current tab without a transition + +In this example, the "Posts" tab is also **artificially slowed down** so that it takes at least a second to render. Unlike in the previous example, this state update is **not a transition.** + +Click "Posts" and then immediately click "Contact". Notice that the app freezes while rendering the slowed down tab, and the UI becomes unresponsive. This state update is not a transition, so a slow re-render freezed the user interface. + +```js +import { useState } from "react"; +import TabButton from "./TabButton.js"; +import AboutTab from "./AboutTab.js"; +import PostsTab from "./PostsTab.js"; +import ContactTab from "./ContactTab.js"; + +export default function TabContainer() { + const [tab, setTab] = useState("about"); + + function selectTab(nextTab) { + setTab(nextTab); + } + + return ( + <> + <TabButton + isActive={tab === "about"} + onClick={() => selectTab("about")} + > + About + </TabButton> + <TabButton + isActive={tab === "posts"} + onClick={() => selectTab("posts")} + > + Posts (slow) + </TabButton> + <TabButton + isActive={tab === "contact"} + onClick={() => selectTab("contact")} + > + Contact + </TabButton> + <hr /> + {tab === "about" && <AboutTab />} + {tab === "posts" && <PostsTab />} + {tab === "contact" && <ContactTab />} + </> + ); +} +``` + +```js +import { useTransition } from "react"; + +export default function TabButton({ children, isActive, onClick }) { + if (isActive) { + return <b>{children}</b>; + } + return ( + <button + onClick={() => { + onClick(); + }} + > + {children} + </button> + ); +} +``` + +```js +export default function AboutTab() { + return <p>Welcome to my profile!</p>; +} +``` + +```js +import { memo } from "react"; + +const PostsTab = memo(function PostsTab() { + // Log once. The actual slowdown is inside SlowPost. + console.log("[ARTIFICIALLY SLOW] Rendering 500 <SlowPost />"); + + let items = []; + for (let i = 0; i < 500; i++) { + items.push(<SlowPost key={i} index={i} />); + } + return <ul className="items">{items}</ul>; +}); + +function SlowPost({ index }) { + let startTime = performance.now(); + while (performance.now() - startTime < 1) { + // Do nothing for 1 ms per item to emulate extremely slow code + } + + return <li className="item">Post #{index + 1}</li>; +} + +export default PostsTab; +``` + +```js +export default function ContactTab() { + return ( + <> + <p>You can find me online here:</p> + <ul> + <li>admin@mysite.com</li> + <li>+123456789</li> + </ul> + </> + ); +} +``` + +```css +button { + margin-right: 10px; +} +b { + display: inline-block; + margin-right: 10px; +} +``` + +</Recipes> + +--- + +### Updating the parent component in a transition + +You can update a parent component's state from the `useTransition` call, too. For example, this `TabButton` component wraps its `onClick` logic in a transition: + +```js +export default function TabButton({ children, isActive, onClick }) { + const [isPending, startTransition] = useTransition(); + if (isActive) { + return <b>{children}</b>; + } + return ( + <button + onClick={() => { + startTransition(() => { + onClick(); + }); + }} + > + {children} + </button> + ); +} +``` + +Because the parent component updates its state inside the `onClick` event handler, that state update gets marked as a transition. This is why, like in the earlier example, you can click on "Posts" and then immediately click "Contact". Updating the selected tab is marked as a transition, so it does not block user interactions. + +```js +import { useState } from "react"; +import TabButton from "./TabButton.js"; +import AboutTab from "./AboutTab.js"; +import PostsTab from "./PostsTab.js"; +import ContactTab from "./ContactTab.js"; + +export default function TabContainer() { + const [tab, setTab] = useState("about"); + return ( + <> + <TabButton + isActive={tab === "about"} + onClick={() => setTab("about")} + > + About + </TabButton> + <TabButton + isActive={tab === "posts"} + onClick={() => setTab("posts")} + > + Posts (slow) + </TabButton> + <TabButton + isActive={tab === "contact"} + onClick={() => setTab("contact")} + > + Contact + </TabButton> + <hr /> + {tab === "about" && <AboutTab />} + {tab === "posts" && <PostsTab />} + {tab === "contact" && <ContactTab />} + </> + ); +} +``` + +```js +import { useTransition } from "react"; + +export default function TabButton({ children, isActive, onClick }) { + const [isPending, startTransition] = useTransition(); + if (isActive) { + return <b>{children}</b>; + } + return ( + <button + onClick={() => { + startTransition(() => { + onClick(); + }); + }} + > + {children} + </button> + ); +} +``` + +```js +export default function AboutTab() { + return <p>Welcome to my profile!</p>; +} +``` + +```js +import { memo } from "react"; + +const PostsTab = memo(function PostsTab() { + // Log once. The actual slowdown is inside SlowPost. + console.log("[ARTIFICIALLY SLOW] Rendering 500 <SlowPost />"); + + let items = []; + for (let i = 0; i < 500; i++) { + items.push(<SlowPost key={i} index={i} />); + } + return <ul className="items">{items}</ul>; +}); + +function SlowPost({ index }) { + let startTime = performance.now(); + while (performance.now() - startTime < 1) { + // Do nothing for 1 ms per item to emulate extremely slow code + } + + return <li className="item">Post #{index + 1}</li>; +} + +export default PostsTab; +``` + +```js +export default function ContactTab() { + return ( + <> + <p>You can find me online here:</p> + <ul> + <li>admin@mysite.com</li> + <li>+123456789</li> + </ul> + </> + ); +} +``` + +```css +button { + margin-right: 10px; +} +b { + display: inline-block; + margin-right: 10px; +} +``` + +--- + +### Displaying a pending visual state during the transition + +You can use the `isPending` boolean value returned by `useTransition` to indicate to the user that a transition is in progress. For example, the tab button can have a special "pending" visual state: + +```js +function TabButton({ children, isActive, onClick }) { + const [isPending, startTransition] = useTransition(); + // ... + if (isPending) { + return <b className="pending">{children}</b>; + } + // ... +``` + +Notice how clicking "Posts" now feels more responsive because the tab button itself updates right away: + +```js +import { useState } from "react"; +import TabButton from "./TabButton.js"; +import AboutTab from "./AboutTab.js"; +import PostsTab from "./PostsTab.js"; +import ContactTab from "./ContactTab.js"; + +export default function TabContainer() { + const [tab, setTab] = useState("about"); + return ( + <> + <TabButton + isActive={tab === "about"} + onClick={() => setTab("about")} + > + About + </TabButton> + <TabButton + isActive={tab === "posts"} + onClick={() => setTab("posts")} + > + Posts (slow) + </TabButton> + <TabButton + isActive={tab === "contact"} + onClick={() => setTab("contact")} + > + Contact + </TabButton> + <hr /> + {tab === "about" && <AboutTab />} + {tab === "posts" && <PostsTab />} + {tab === "contact" && <ContactTab />} + </> + ); +} +``` + +```js +import { useTransition } from "react"; + +export default function TabButton({ children, isActive, onClick }) { + const [isPending, startTransition] = useTransition(); + if (isActive) { + return <b>{children}</b>; + } + if (isPending) { + return <b className="pending">{children}</b>; + } + return ( + <button + onClick={() => { + startTransition(() => { + onClick(); + }); + }} + > + {children} + </button> + ); +} +``` + +```js +export default function AboutTab() { + return <p>Welcome to my profile!</p>; +} +``` + +```js +import { memo } from "react"; + +const PostsTab = memo(function PostsTab() { + // Log once. The actual slowdown is inside SlowPost. + console.log("[ARTIFICIALLY SLOW] Rendering 500 <SlowPost />"); + + let items = []; + for (let i = 0; i < 500; i++) { + items.push(<SlowPost key={i} index={i} />); + } + return <ul className="items">{items}</ul>; +}); + +function SlowPost({ index }) { + let startTime = performance.now(); + while (performance.now() - startTime < 1) { + // Do nothing for 1 ms per item to emulate extremely slow code + } + + return <li className="item">Post #{index + 1}</li>; +} + +export default PostsTab; +``` + +```js +export default function ContactTab() { + return ( + <> + <p>You can find me online here:</p> + <ul> + <li>admin@mysite.com</li> + <li>+123456789</li> + </ul> + </> + ); +} +``` + +```css +button { + margin-right: 10px; +} +b { + display: inline-block; + margin-right: 10px; +} +.pending { + color: #777; +} +``` + +--- + +### Preventing unwanted loading indicators + +In this example, the `PostsTab` component fetches some data using a [Suspense-enabled](/reference/react/Suspense) data source. When you click the "Posts" tab, the `PostsTab` component _suspends_, causing the closest loading fallback to appear: + +```js +import { Suspense, useState } from "react"; +import TabButton from "./TabButton.js"; +import AboutTab from "./AboutTab.js"; +import PostsTab from "./PostsTab.js"; +import ContactTab from "./ContactTab.js"; + +export default function TabContainer() { + const [tab, setTab] = useState("about"); + return ( + <Suspense fallback={<h1>🌀 Loading...</h1>}> + <TabButton + isActive={tab === "about"} + onClick={() => setTab("about")} + > + About + </TabButton> + <TabButton + isActive={tab === "posts"} + onClick={() => setTab("posts")} + > + Posts + </TabButton> + <TabButton + isActive={tab === "contact"} + onClick={() => setTab("contact")} + > + Contact + </TabButton> + <hr /> + {tab === "about" && <AboutTab />} + {tab === "posts" && <PostsTab />} + {tab === "contact" && <ContactTab />} + </Suspense> + ); +} +``` + +```js +export default function TabButton({ children, isActive, onClick }) { + if (isActive) { + return <b>{children}</b>; + } + return ( + <button + onClick={() => { + onClick(); + }} + > + {children} + </button> + ); +} +``` + +```js +export default function AboutTab() { + return <p>Welcome to my profile!</p>; +} +``` + +```js +import { fetchData } from "./data.js"; + +// Note: this component is written using an experimental API +// that's not yet available in stable versions of React. + +// For a realistic example you can follow today, try a framework +// that's integrated with Suspense, like Relay or Next.js. + +function PostsTab() { + const posts = use(fetchData("/posts")); + return ( + <ul className="items"> + {posts.map((post) => ( + <Post key={post.id} title={post.title} /> + ))} + </ul> + ); +} + +function Post({ title }) { + return <li className="item">{title}</li>; +} + +export default PostsTab; + +// This is a workaround for a bug to get the demo running. +// TODO: replace with real implementation when the bug is fixed. +function use(promise) { + if (promise.status === "fulfilled") { + return promise.value; + } else if (promise.status === "rejected") { + throw promise.reason; + } else if (promise.status === "pending") { + throw promise; + } else { + promise.status = "pending"; + promise.then( + (result) => { + promise.status = "fulfilled"; + promise.value = result; + }, + (reason) => { + promise.status = "rejected"; + promise.reason = reason; + } + ); + throw promise; + } +} +``` + +```js +export default function ContactTab() { + return ( + <> + <p>You can find me online here:</p> + <ul> + <li>admin@mysite.com</li> + <li>+123456789</li> + </ul> + </> + ); +} +``` + +```js +// Note: the way you would do data fetching depends on +// the framework that you use together with Suspense. +// Normally, the caching logic would be inside a framework. + +let cache = new Map(); + +export function fetchData(url) { + if (!cache.has(url)) { + cache.set(url, getData(url)); + } + return cache.get(url); +} + +async function getData(url) { + if (url.startsWith("/posts")) { + return await getPosts(); + } else { + throw Error("Not implemented"); + } +} + +async function getPosts() { + // Add a fake delay to make waiting noticeable. + await new Promise((resolve) => { + setTimeout(resolve, 1000); + }); + let posts = []; + for (let i = 0; i < 500; i++) { + posts.push({ + id: i, + title: "Post #" + (i + 1), + }); + } + return posts; +} +``` + +```css +button { + margin-right: 10px; +} +b { + display: inline-block; + margin-right: 10px; +} +.pending { + color: #777; +} +``` + +Hiding the entire tab container to show a loading indicator leads to a jarring user experience. If you add `useTransition` to `TabButton`, you can instead indicate display the pending state in the tab button instead. + +Notice that clicking "Posts" no longer replaces the entire tab container with a spinner: + +```js +import { Suspense, useState } from "react"; +import TabButton from "./TabButton.js"; +import AboutTab from "./AboutTab.js"; +import PostsTab from "./PostsTab.js"; +import ContactTab from "./ContactTab.js"; + +export default function TabContainer() { + const [tab, setTab] = useState("about"); + return ( + <Suspense fallback={<h1>🌀 Loading...</h1>}> + <TabButton + isActive={tab === "about"} + onClick={() => setTab("about")} + > + About + </TabButton> + <TabButton + isActive={tab === "posts"} + onClick={() => setTab("posts")} + > + Posts + </TabButton> + <TabButton + isActive={tab === "contact"} + onClick={() => setTab("contact")} + > + Contact + </TabButton> + <hr /> + {tab === "about" && <AboutTab />} + {tab === "posts" && <PostsTab />} + {tab === "contact" && <ContactTab />} + </Suspense> + ); +} +``` + +```js +import { useTransition } from "react"; + +export default function TabButton({ children, isActive, onClick }) { + const [isPending, startTransition] = useTransition(); + if (isActive) { + return <b>{children}</b>; + } + if (isPending) { + return <b className="pending">{children}</b>; + } + return ( + <button + onClick={() => { + startTransition(() => { + onClick(); + }); + }} + > + {children} + </button> + ); +} +``` + +```js +export default function AboutTab() { + return <p>Welcome to my profile!</p>; +} +``` + +```js +import { fetchData } from "./data.js"; + +// Note: this component is written using an experimental API +// that's not yet available in stable versions of React. + +// For a realistic example you can follow today, try a framework +// that's integrated with Suspense, like Relay or Next.js. + +function PostsTab() { + const posts = use(fetchData("/posts")); + return ( + <ul className="items"> + {posts.map((post) => ( + <Post key={post.id} title={post.title} /> + ))} + </ul> + ); +} + +function Post({ title }) { + return <li className="item">{title}</li>; +} + +export default PostsTab; + +// This is a workaround for a bug to get the demo running. +// TODO: replace with real implementation when the bug is fixed. +function use(promise) { + if (promise.status === "fulfilled") { + return promise.value; + } else if (promise.status === "rejected") { + throw promise.reason; + } else if (promise.status === "pending") { + throw promise; + } else { + promise.status = "pending"; + promise.then( + (result) => { + promise.status = "fulfilled"; + promise.value = result; + }, + (reason) => { + promise.status = "rejected"; + promise.reason = reason; + } + ); + throw promise; + } +} +``` + +```js +export default function ContactTab() { + return ( + <> + <p>You can find me online here:</p> + <ul> + <li>admin@mysite.com</li> + <li>+123456789</li> + </ul> + </> + ); +} +``` + +```js +// Note: the way you would do data fetching depends on +// the framework that you use together with Suspense. +// Normally, the caching logic would be inside a framework. + +let cache = new Map(); + +export function fetchData(url) { + if (!cache.has(url)) { + cache.set(url, getData(url)); + } + return cache.get(url); +} + +async function getData(url) { + if (url.startsWith("/posts")) { + return await getPosts(); + } else { + throw Error("Not implemented"); + } +} + +async function getPosts() { + // Add a fake delay to make waiting noticeable. + await new Promise((resolve) => { + setTimeout(resolve, 1000); + }); + let posts = []; + for (let i = 0; i < 500; i++) { + posts.push({ + id: i, + title: "Post #" + (i + 1), + }); + } + return posts; +} +``` + +```css +button { + margin-right: 10px; +} +b { + display: inline-block; + margin-right: 10px; +} +.pending { + color: #777; +} +``` + +[Read more about using transitions with Suspense.](/reference/react/Suspense#preventing-already-revealed-content-from-hiding) + +<Note> + +Transitions will only "wait" long enough to avoid hiding _already revealed_ content (like the tab container). If the Posts tab had a [nested `<Suspense>` boundary,](/reference/react/Suspense#revealing-nested-content-as-it-loads) the transition would not "wait" for it. + +</Note> + +--- + +### Building a Suspense-enabled router + +If you're building a React framework or a router, we recommend marking page navigations as transitions. + +```js +function Router() { + const [page, setPage] = useState('/'); + const [isPending, startTransition] = useTransition(); + + function navigate(url) { + startTransition(() => { + setPage(url); + }); + } + // ... +``` + +This is recommended for two reasons: + +- [Transitions are interruptible,](#marking-a-state-update-as-a-non-blocking-transition) which lets the user click away without waiting for the re-render to complete. +- [Transitions prevent unwanted loading indicators,](#preventing-unwanted-loading-indicators) which lets the user avoid jarring jumps on navigation. + +Here is a tiny simplified router example using transitions for navigations. + +```json package.json hidden +{ + "dependencies": { + "react": "experimental", + "react-dom": "experimental" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { Suspense, useState, useTransition } from "react"; +import IndexPage from "./IndexPage.js"; +import ArtistPage from "./ArtistPage.js"; +import Layout from "./Layout.js"; + +export default function App() { + return ( + <Suspense fallback={<BigSpinner />}> + <Router /> + </Suspense> + ); +} + +function Router() { + const [page, setPage] = useState("/"); + const [isPending, startTransition] = useTransition(); + + function navigate(url) { + startTransition(() => { + setPage(url); + }); + } + + let content; + if (page === "/") { + content = <IndexPage navigate={navigate} />; + } else if (page === "/the-beatles") { + content = ( + <ArtistPage + artist={{ + id: "the-beatles", + name: "The Beatles", + }} + /> + ); + } + return <Layout isPending={isPending}>{content}</Layout>; +} + +function BigSpinner() { + return <h2>🌀 Loading...</h2>; +} +``` + +```js +export default function Layout({ children, isPending }) { + return ( + <div className="layout"> + <section + className="header" + style={{ + opacity: isPending ? 0.7 : 1, + }} + > + Music Browser + </section> + <main>{children}</main> + </div> + ); +} +``` + +```js +export default function IndexPage({ navigate }) { + return ( + <button onClick={() => navigate("/the-beatles")}> + Open The Beatles artist page + </button> + ); +} +``` + +```js +import { Suspense } from "react"; +import Albums from "./Albums.js"; +import Biography from "./Biography.js"; +import Panel from "./Panel.js"; + +export default function ArtistPage({ artist }) { + return ( + <> + <h1>{artist.name}</h1> + <Biography artistId={artist.id} /> + <Suspense fallback={<AlbumsGlimmer />}> + <Panel> + <Albums artistId={artist.id} /> + </Panel> + </Suspense> + </> + ); +} + +function AlbumsGlimmer() { + return ( + <div className="glimmer-panel"> + <div className="glimmer-line" /> + <div className="glimmer-line" /> + <div className="glimmer-line" /> + </div> + ); +} +``` + +```js +import { fetchData } from "./data.js"; + +// Note: this component is written using an experimental API +// that's not yet available in stable versions of React. + +// For a realistic example you can follow today, try a framework +// that's integrated with Suspense, like Relay or Next.js. + +export default function Albums({ artistId }) { + const albums = use(fetchData(`/${artistId}/albums`)); + return ( + <ul> + {albums.map((album) => ( + <li key={album.id}> + {album.title} ({album.year}) + </li> + ))} + </ul> + ); +} + +// This is a workaround for a bug to get the demo running. +// TODO: replace with real implementation when the bug is fixed. +function use(promise) { + if (promise.status === "fulfilled") { + return promise.value; + } else if (promise.status === "rejected") { + throw promise.reason; + } else if (promise.status === "pending") { + throw promise; + } else { + promise.status = "pending"; + promise.then( + (result) => { + promise.status = "fulfilled"; + promise.value = result; + }, + (reason) => { + promise.status = "rejected"; + promise.reason = reason; + } + ); + throw promise; + } +} +``` + +```js +import { fetchData } from "./data.js"; + +// Note: this component is written using an experimental API +// that's not yet available in stable versions of React. + +// For a realistic example you can follow today, try a framework +// that's integrated with Suspense, like Relay or Next.js. + +export default function Biography({ artistId }) { + const bio = use(fetchData(`/${artistId}/bio`)); + return ( + <section> + <p className="bio">{bio}</p> + </section> + ); +} + +// This is a workaround for a bug to get the demo running. +// TODO: replace with real implementation when the bug is fixed. +function use(promise) { + if (promise.status === "fulfilled") { + return promise.value; + } else if (promise.status === "rejected") { + throw promise.reason; + } else if (promise.status === "pending") { + throw promise; + } else { + promise.status = "pending"; + promise.then( + (result) => { + promise.status = "fulfilled"; + promise.value = result; + }, + (reason) => { + promise.status = "rejected"; + promise.reason = reason; + } + ); + throw promise; + } +} +``` + +```js +export default function Panel({ children }) { + return <section className="panel">{children}</section>; +} +``` + +```js +// Note: the way you would do data fetching depends on +// the framework that you use together with Suspense. +// Normally, the caching logic would be inside a framework. + +let cache = new Map(); + +export function fetchData(url) { + if (!cache.has(url)) { + cache.set(url, getData(url)); + } + return cache.get(url); +} + +async function getData(url) { + if (url === "/the-beatles/albums") { + return await getAlbums(); + } else if (url === "/the-beatles/bio") { + return await getBio(); + } else { + throw Error("Not implemented"); + } +} + +async function getBio() { + // Add a fake delay to make waiting noticeable. + await new Promise((resolve) => { + setTimeout(resolve, 500); + }); + + return `The Beatles were an English rock band, + formed in Liverpool in 1960, that comprised + John Lennon, Paul McCartney, George Harrison + and Ringo Starr.`; +} + +async function getAlbums() { + // Add a fake delay to make waiting noticeable. + await new Promise((resolve) => { + setTimeout(resolve, 3000); + }); + + return [ + { + id: 13, + title: "Let It Be", + year: 1970, + }, + { + id: 12, + title: "Abbey Road", + year: 1969, + }, + { + id: 11, + title: "Yellow Submarine", + year: 1969, + }, + { + id: 10, + title: "The Beatles", + year: 1968, + }, + { + id: 9, + title: "Magical Mystery Tour", + year: 1967, + }, + { + id: 8, + title: "Sgt. Pepper's Lonely Hearts Club Band", + year: 1967, + }, + { + id: 7, + title: "Revolver", + year: 1966, + }, + { + id: 6, + title: "Rubber Soul", + year: 1965, + }, + { + id: 5, + title: "Help!", + year: 1965, + }, + { + id: 4, + title: "Beatles For Sale", + year: 1964, + }, + { + id: 3, + title: "A Hard Day's Night", + year: 1964, + }, + { + id: 2, + title: "With The Beatles", + year: 1963, + }, + { + id: 1, + title: "Please Please Me", + year: 1963, + }, + ]; +} +``` + +```css +main { + min-height: 200px; + padding: 10px; +} + +.layout { + border: 1px solid black; +} + +.header { + background: #222; + padding: 10px; + text-align: center; + color: white; +} + +.bio { + font-style: italic; +} + +.panel { + border: 1px solid #aaa; + border-radius: 6px; + margin-top: 20px; + padding: 10px; +} + +.glimmer-panel { + border: 1px dashed #aaa; + background: linear-gradient( + 90deg, + rgba(221, 221, 221, 1) 0%, + rgba(255, 255, 255, 1) 100% + ); + border-radius: 6px; + margin-top: 20px; + padding: 10px; +} + +.glimmer-line { + display: block; + width: 60%; + height: 20px; + margin: 10px; + border-radius: 4px; + background: #f0f0f0; +} +``` + +<Note> + +[Suspense-enabled](/reference/react/Suspense) routers are expected to wrap the navigation updates into transitions by default. + +</Note> + +--- + +## Troubleshooting + +### Updating an input in a transition doesn't work + +You can't use a transition for a state variable that controls an input: + +```js +const [text, setText] = useState(""); +// ... +function handleChange(e) { + // ❌ Can't use transitions for controlled input state + startTransition(() => { + setText(e.target.value); + }); +} +// ... +return <input value={text} onChange={handleChange} />; +``` + +This is because transitions are non-blocking, but updating an input in response to the change event should happen synchronously. If you want to run a transition in response to typing, you have two options: + +1. You can declare two separate state variables: one for the input state (which always updates synchronously), and one that you will update in a transition. This lets you control the input using the synchronous state, and pass the transition state variable (which will "lag behind" the input) to the rest of your rendering logic. +2. Alternatively, you can have one state variable, and add [`useDeferredValue`](/reference/react/useDeferredValue) which will "lag behind" the real value. It will trigger non-blocking re-renders to "catch up" with the new value automatically. + +--- + +### React doesn't treat my state update as a transition + +When you wrap a state update in a transition, make sure that it happens _during_ the `startTransition` call: + +```js +startTransition(() => { + // ✅ Setting state *during* startTransition call + setPage("/about"); +}); +``` + +The function you pass to `startTransition` must be synchronous. + +You can't mark an update as a transition like this: + +```js +startTransition(() => { + // ❌ Setting state *after* startTransition call + setTimeout(() => { + setPage("/about"); + }, 1000); +}); +``` + +Instead, you could do this: + +```js +setTimeout(() => { + startTransition(() => { + // ✅ Setting state *during* startTransition call + setPage("/about"); + }); +}, 1000); +``` + +Similarly, you can't mark an update as a transition like this: + +```js +startTransition(async () => { + await someAsyncFunction(); + // ❌ Setting state *after* startTransition call + setPage("/about"); +}); +``` + +However, this works instead: + +```js +await someAsyncFunction(); +startTransition(() => { + // ✅ Setting state *during* startTransition call + setPage("/about"); +}); +``` + +--- + +### I want to call `useTransition` from outside a component + +You can't call `useTransition` outside a component because it's a Hook. In this case, use the standalone [`startTransition`](/reference/react/startTransition) method instead. It works the same way, but it doesn't provide the `isPending` indicator. + +--- + +### The function I pass to `startTransition` executes immediately + +If you run this code, it will print 1, 2, 3: + +```js +console.log(1); +startTransition(() => { + console.log(2); + setPage("/about"); +}); +console.log(3); +``` + +**It is expected to print 1, 2, 3.** The function you pass to `startTransition` does not get delayed. Unlike with the browser `setTimeout`, it does not run the callback later. React executes your function immediately, but any state updates scheduled _while it is running_ are marked as transitions. You can imagine that it works like this: + +```js +// A simplified version of how React works + +let isInsideTransition = false; + +function startTransition(scope) { + isInsideTransition = true; + scope(); + isInsideTransition = false; +} + +function setState() { + if (isInsideTransition) { + // ... schedule a transition state update ... + } else { + // ... schedule an urgent state update ... + } +} +``` diff --git a/mkdocs.yml b/mkdocs.yml index 0ae9f2f49..e64f52371 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -70,6 +70,12 @@ nav: - reference/use-scope.md - reference/use-location.md - reference/use-id.md + - reference/use-deferred-value.md + - reference/use-imperative-handle.md + - reference/use-insertion-effect.md + - reference/use-layout-effect.md + - reference/use-sync-external-store.md + - reference/use-transition.md - HTML Tags: - reference/common-props.md - reference/usage.md From 8f58f8c836f3a7d31a1a000273fe80b4765d7298 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Tue, 20 Jun 2023 17:23:28 -0700 Subject: [PATCH 31/49] mkdocs-section-index: Move titles to mkdocs.yml --- docs/requirements.txt | 1 + docs/src/about/code.md | 3 - docs/src/about/community.md | 3 - docs/src/about/docs.md | 3 - docs/src/about/running-tests.md | 3 - .../learn/add-react-to-an-existing-project.md | 3 - .../src/learn/choosing-the-state-structure.md | 3 - ...municate-data-between-server-and-client.md | 3 - docs/src/learn/conditional-rendering.md | 3 - .../learn/convert-between-vdom-and-html.md | 3 - docs/src/learn/creating-backends.md | 3 - docs/src/learn/creating-html-tags.md | 3 - .../src/learn/creating-vdom-event-handlers.md | 3 - docs/src/learn/editor-setup.md | 3 - .../extracting-state-logic-into-a-reducer.md | 3 - .../importing-and-exporting-components.md | 3 - docs/src/learn/keeping-components-pure.md | 3 - .../learn/lifecycle-of-reactive-effects.md | 3 - .../learn/manipulating-the-dom-with-refs.md | 3 - docs/src/learn/manually-register-a-client.md | 3 - .../learn/passing-data-deeply-with-context.md | 3 - .../src/learn/passing-props-to-a-component.md | 3 - .../learn/preserving-and-resetting-state.md | 3 - .../learn/python-in-psx-with-curly-braces.md | 3 - .../queueing-a-series-of-state-updates.md | 3 - .../learn/{get-started.md => quick-start.md} | 4 - docs/src/learn/react-developer-tools.md | 3 - .../src/learn/reacting-to-input-with-state.md | 3 - .../src/learn/referencing-values-with-refs.md | 3 - .../src/learn/removing-effect-dependencies.md | 3 - docs/src/learn/render-and-commit.md | 3 - docs/src/learn/rendering-lists.md | 3 - docs/src/learn/responding-to-events.md | 3 - .../learn/reusing-logic-with-custom-hooks.md | 3 - .../scaling-up-with-reducer-and-context.md | 3 - .../learn/separating-events-from-effects.md | 3 - .../learn/sharing-state-between-components.md | 3 - docs/src/learn/start-a-new-react-project.md | 3 - docs/src/learn/state-a-components-memory.md | 3 - docs/src/learn/state-as-a-snapshot.md | 3 - docs/src/learn/synchronizing-with-effects.md | 3 - docs/src/learn/thinking-in-react.md | 5 +- docs/src/learn/tutorial-material-ui.md | 3 - docs/src/learn/tutorial-react-bootstrap.md | 3 - docs/src/learn/tutorial-tic-tac-toe.md | 3 - docs/src/learn/updating-arrays-in-state.md | 3 - docs/src/learn/updating-objects-in-state.md | 3 - docs/src/learn/vdom-mutations.md | 3 - docs/src/learn/writing-markup-with-psx.md | 3 - .../src/learn/you-might-not-need-an-effect.md | 3 - docs/src/learn/your-first-component.md | 3 - docs/src/reference/client-api.md | 3 - docs/src/reference/common-props.md | 3 - docs/src/reference/django.md | 3 - docs/src/reference/fastapi.md | 3 - docs/src/reference/flask.md | 3 - docs/src/reference/jupyter.md | 3 - docs/src/reference/plotly-dash.md | 3 - docs/src/reference/protocol-structure.md | 3 - docs/src/reference/sanic.md | 3 - docs/src/reference/starlette.md | 3 - docs/src/reference/tornado.md | 3 - docs/src/reference/usage.md | 3 - docs/src/reference/use-callback.md | 3 - docs/src/reference/use-connection.md | 3 - docs/src/reference/use-context.md | 3 - docs/src/reference/use-debug-value.md | 3 - docs/src/reference/use-deferred-value.md | 3 - docs/src/reference/use-effect.md | 3 - docs/src/reference/use-id.md | 3 - docs/src/reference/use-imperative-handle.md | 3 - docs/src/reference/use-insertion-effect.md | 3 - docs/src/reference/use-layout-effect.md | 3 - docs/src/reference/use-location.md | 3 - docs/src/reference/use-memo.md | 3 - docs/src/reference/use-reducer.md | 3 - docs/src/reference/use-ref.md | 3 - docs/src/reference/use-scope.md | 3 - docs/src/reference/use-state.md | 3 - docs/src/reference/use-sync-external-store.md | 3 - docs/src/reference/use-transition.md | 3 - mkdocs.yml | 163 +++++++++--------- 82 files changed, 84 insertions(+), 323 deletions(-) rename docs/src/learn/{get-started.md => quick-start.md} (99%) diff --git a/docs/requirements.txt b/docs/requirements.txt index 9ae8fcf17..612b7fe7a 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -6,3 +6,4 @@ linkcheckmd mkdocs-spellcheck[all] mkdocs-git-authors-plugin mkdocs-minify-plugin +mkdocs-section-index diff --git a/docs/src/about/code.md b/docs/src/about/code.md index b62ac3725..e69de29bb 100644 --- a/docs/src/about/code.md +++ b/docs/src/about/code.md @@ -1,3 +0,0 @@ ---- -title: Contributing Code 🚧 ---- diff --git a/docs/src/about/community.md b/docs/src/about/community.md index a2aaf44d8..e69de29bb 100644 --- a/docs/src/about/community.md +++ b/docs/src/about/community.md @@ -1,3 +0,0 @@ ---- -title: Community 🚧 ---- diff --git a/docs/src/about/docs.md b/docs/src/about/docs.md index cf935525e..e69de29bb 100644 --- a/docs/src/about/docs.md +++ b/docs/src/about/docs.md @@ -1,3 +0,0 @@ ---- -title: Contributing Documentation 🚧 ---- diff --git a/docs/src/about/running-tests.md b/docs/src/about/running-tests.md index 714a7456c..e69de29bb 100644 --- a/docs/src/about/running-tests.md +++ b/docs/src/about/running-tests.md @@ -1,3 +0,0 @@ ---- -title: Running Tests 🚧 ---- diff --git a/docs/src/learn/add-react-to-an-existing-project.md b/docs/src/learn/add-react-to-an-existing-project.md index bdc4a0d3d..0a2c0c9c4 100644 --- a/docs/src/learn/add-react-to-an-existing-project.md +++ b/docs/src/learn/add-react-to-an-existing-project.md @@ -1,6 +1,3 @@ ---- -title: Add React to an Existing Project 🚫 ---- !!! warning "In Progress" diff --git a/docs/src/learn/choosing-the-state-structure.md b/docs/src/learn/choosing-the-state-structure.md index 2a40ef2d5..61205cd7d 100644 --- a/docs/src/learn/choosing-the-state-structure.md +++ b/docs/src/learn/choosing-the-state-structure.md @@ -1,6 +1,3 @@ ---- -title: Choosing the State Structure 🚧 ---- ## Overview diff --git a/docs/src/learn/communicate-data-between-server-and-client.md b/docs/src/learn/communicate-data-between-server-and-client.md index 01736cacd..e69de29bb 100644 --- a/docs/src/learn/communicate-data-between-server-and-client.md +++ b/docs/src/learn/communicate-data-between-server-and-client.md @@ -1,3 +0,0 @@ ---- -title: Communicating Data Between Server and Client 🚧 ---- diff --git a/docs/src/learn/conditional-rendering.md b/docs/src/learn/conditional-rendering.md index 87d031613..46a07a4bf 100644 --- a/docs/src/learn/conditional-rendering.md +++ b/docs/src/learn/conditional-rendering.md @@ -1,6 +1,3 @@ ---- -title: Conditional Rendering 🚧 ---- ## Overview diff --git a/docs/src/learn/convert-between-vdom-and-html.md b/docs/src/learn/convert-between-vdom-and-html.md index 6f3c2dba3..e69de29bb 100644 --- a/docs/src/learn/convert-between-vdom-and-html.md +++ b/docs/src/learn/convert-between-vdom-and-html.md @@ -1,3 +0,0 @@ ---- -title: Convert Between VDOM and HTML 🚧 ---- diff --git a/docs/src/learn/creating-backends.md b/docs/src/learn/creating-backends.md index 75bf0be65..e69de29bb 100644 --- a/docs/src/learn/creating-backends.md +++ b/docs/src/learn/creating-backends.md @@ -1,3 +0,0 @@ ---- -title: Creating Backends 🚧 ---- diff --git a/docs/src/learn/creating-html-tags.md b/docs/src/learn/creating-html-tags.md index 4742655e1..e69de29bb 100644 --- a/docs/src/learn/creating-html-tags.md +++ b/docs/src/learn/creating-html-tags.md @@ -1,3 +0,0 @@ ---- -title: Creating HTML Tags 🚧 ---- diff --git a/docs/src/learn/creating-vdom-event-handlers.md b/docs/src/learn/creating-vdom-event-handlers.md index f82b1f16d..e69de29bb 100644 --- a/docs/src/learn/creating-vdom-event-handlers.md +++ b/docs/src/learn/creating-vdom-event-handlers.md @@ -1,3 +0,0 @@ ---- -title: Creating VDOM Event Handlers 🚧 ---- diff --git a/docs/src/learn/editor-setup.md b/docs/src/learn/editor-setup.md index 7bebda0e8..3154124fb 100644 --- a/docs/src/learn/editor-setup.md +++ b/docs/src/learn/editor-setup.md @@ -1,6 +1,3 @@ ---- -title: Editor Setup 🚧 ---- ## Overview diff --git a/docs/src/learn/extracting-state-logic-into-a-reducer.md b/docs/src/learn/extracting-state-logic-into-a-reducer.md index d3368f238..ad6a6f986 100644 --- a/docs/src/learn/extracting-state-logic-into-a-reducer.md +++ b/docs/src/learn/extracting-state-logic-into-a-reducer.md @@ -1,6 +1,3 @@ ---- -title: Extracting State Logic into a Reducer 🚧 ---- ## Overview diff --git a/docs/src/learn/importing-and-exporting-components.md b/docs/src/learn/importing-and-exporting-components.md index 6e677d51d..3fa6723db 100644 --- a/docs/src/learn/importing-and-exporting-components.md +++ b/docs/src/learn/importing-and-exporting-components.md @@ -1,6 +1,3 @@ ---- -title: Importing and Exporting Components 🚧 ---- ## Overview diff --git a/docs/src/learn/keeping-components-pure.md b/docs/src/learn/keeping-components-pure.md index c1a9bc92d..c71267f2b 100644 --- a/docs/src/learn/keeping-components-pure.md +++ b/docs/src/learn/keeping-components-pure.md @@ -1,6 +1,3 @@ ---- -title: Keeping Components Pure 🚧 ---- ## Overview diff --git a/docs/src/learn/lifecycle-of-reactive-effects.md b/docs/src/learn/lifecycle-of-reactive-effects.md index 705158615..3d75b698b 100644 --- a/docs/src/learn/lifecycle-of-reactive-effects.md +++ b/docs/src/learn/lifecycle-of-reactive-effects.md @@ -1,6 +1,3 @@ ---- -title: "Lifecycle of Reactive Effects 🚧" ---- ## Overview diff --git a/docs/src/learn/manipulating-the-dom-with-refs.md b/docs/src/learn/manipulating-the-dom-with-refs.md index 5fcff0f42..6546b032d 100644 --- a/docs/src/learn/manipulating-the-dom-with-refs.md +++ b/docs/src/learn/manipulating-the-dom-with-refs.md @@ -1,6 +1,3 @@ ---- -title: "Manipulating the DOM with Refs 🚧" ---- ## Overview diff --git a/docs/src/learn/manually-register-a-client.md b/docs/src/learn/manually-register-a-client.md index 9ee55b31d..e69de29bb 100644 --- a/docs/src/learn/manually-register-a-client.md +++ b/docs/src/learn/manually-register-a-client.md @@ -1,3 +0,0 @@ ---- -title: Manually Register a Client 🚧 ---- diff --git a/docs/src/learn/passing-data-deeply-with-context.md b/docs/src/learn/passing-data-deeply-with-context.md index 84d2c0c73..eb86d3be3 100644 --- a/docs/src/learn/passing-data-deeply-with-context.md +++ b/docs/src/learn/passing-data-deeply-with-context.md @@ -1,6 +1,3 @@ ---- -title: Passing Data Deeply with Context 🚧 ---- ## Overview diff --git a/docs/src/learn/passing-props-to-a-component.md b/docs/src/learn/passing-props-to-a-component.md index a73f09ed2..7baf53498 100644 --- a/docs/src/learn/passing-props-to-a-component.md +++ b/docs/src/learn/passing-props-to-a-component.md @@ -1,6 +1,3 @@ ---- -title: Passing Props to a Component 🚧 ---- ## Overview diff --git a/docs/src/learn/preserving-and-resetting-state.md b/docs/src/learn/preserving-and-resetting-state.md index 23e5f64ca..bdb130dcd 100644 --- a/docs/src/learn/preserving-and-resetting-state.md +++ b/docs/src/learn/preserving-and-resetting-state.md @@ -1,6 +1,3 @@ ---- -title: Preserving and Resetting State 🚧 ---- ## Overview diff --git a/docs/src/learn/python-in-psx-with-curly-braces.md b/docs/src/learn/python-in-psx-with-curly-braces.md index 87be20beb..5c93883c1 100644 --- a/docs/src/learn/python-in-psx-with-curly-braces.md +++ b/docs/src/learn/python-in-psx-with-curly-braces.md @@ -1,6 +1,3 @@ ---- -title: Python in PSX with Curly Braces 🚫 ---- !!! warning "In Progress" diff --git a/docs/src/learn/queueing-a-series-of-state-updates.md b/docs/src/learn/queueing-a-series-of-state-updates.md index c2704d046..cd387a663 100644 --- a/docs/src/learn/queueing-a-series-of-state-updates.md +++ b/docs/src/learn/queueing-a-series-of-state-updates.md @@ -1,6 +1,3 @@ ---- -title: Queueing a Series of State Updates 🚧 ---- ## Overview diff --git a/docs/src/learn/get-started.md b/docs/src/learn/quick-start.md similarity index 99% rename from docs/src/learn/get-started.md rename to docs/src/learn/quick-start.md index 0e501bd96..a825d6b56 100644 --- a/docs/src/learn/get-started.md +++ b/docs/src/learn/quick-start.md @@ -1,7 +1,3 @@ ---- -title: "Get Started" ---- - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/react-developer-tools.md b/docs/src/learn/react-developer-tools.md index 464083ec8..a10caf229 100644 --- a/docs/src/learn/react-developer-tools.md +++ b/docs/src/learn/react-developer-tools.md @@ -1,6 +1,3 @@ ---- -title: React Developer Tools 🚫 ---- !!! warning "In Progress" diff --git a/docs/src/learn/reacting-to-input-with-state.md b/docs/src/learn/reacting-to-input-with-state.md index 2ad1390f9..6cb2f701c 100644 --- a/docs/src/learn/reacting-to-input-with-state.md +++ b/docs/src/learn/reacting-to-input-with-state.md @@ -1,6 +1,3 @@ ---- -title: Reacting to Input with State 🚧 ---- ## Overview diff --git a/docs/src/learn/referencing-values-with-refs.md b/docs/src/learn/referencing-values-with-refs.md index 3d1fd7d42..9b19c46be 100644 --- a/docs/src/learn/referencing-values-with-refs.md +++ b/docs/src/learn/referencing-values-with-refs.md @@ -1,6 +1,3 @@ ---- -title: "Referencing Values with Refs 🚧" ---- ## Overview diff --git a/docs/src/learn/removing-effect-dependencies.md b/docs/src/learn/removing-effect-dependencies.md index 55a983a27..161c1276b 100644 --- a/docs/src/learn/removing-effect-dependencies.md +++ b/docs/src/learn/removing-effect-dependencies.md @@ -1,6 +1,3 @@ ---- -title: "Removing Effect Dependencies 🚧" ---- ## Overview diff --git a/docs/src/learn/render-and-commit.md b/docs/src/learn/render-and-commit.md index 94238ca65..f64da2e29 100644 --- a/docs/src/learn/render-and-commit.md +++ b/docs/src/learn/render-and-commit.md @@ -1,6 +1,3 @@ ---- -title: Render and Commit 🚧 ---- ## Overview diff --git a/docs/src/learn/rendering-lists.md b/docs/src/learn/rendering-lists.md index d0b74c85b..a4072a188 100644 --- a/docs/src/learn/rendering-lists.md +++ b/docs/src/learn/rendering-lists.md @@ -1,6 +1,3 @@ ---- -title: Rendering Lists 🚧 ---- ## Overview diff --git a/docs/src/learn/responding-to-events.md b/docs/src/learn/responding-to-events.md index 76d6402aa..4c12bfbbc 100644 --- a/docs/src/learn/responding-to-events.md +++ b/docs/src/learn/responding-to-events.md @@ -1,6 +1,3 @@ ---- -title: Responding to Events 🚧 ---- ## Overview diff --git a/docs/src/learn/reusing-logic-with-custom-hooks.md b/docs/src/learn/reusing-logic-with-custom-hooks.md index a9c16248f..89b997add 100644 --- a/docs/src/learn/reusing-logic-with-custom-hooks.md +++ b/docs/src/learn/reusing-logic-with-custom-hooks.md @@ -1,6 +1,3 @@ ---- -title: "Reusing Logic with Custom Hooks 🚧" ---- ## Overview diff --git a/docs/src/learn/scaling-up-with-reducer-and-context.md b/docs/src/learn/scaling-up-with-reducer-and-context.md index 755a27e29..a8b137a58 100644 --- a/docs/src/learn/scaling-up-with-reducer-and-context.md +++ b/docs/src/learn/scaling-up-with-reducer-and-context.md @@ -1,6 +1,3 @@ ---- -title: Scaling Up with Reducer and Context 🚧 ---- ## Overview diff --git a/docs/src/learn/separating-events-from-effects.md b/docs/src/learn/separating-events-from-effects.md index aaeb9c30a..615043240 100644 --- a/docs/src/learn/separating-events-from-effects.md +++ b/docs/src/learn/separating-events-from-effects.md @@ -1,6 +1,3 @@ ---- -title: "Separating Events from Effects 🚧" ---- ## Overview diff --git a/docs/src/learn/sharing-state-between-components.md b/docs/src/learn/sharing-state-between-components.md index 543a56110..21cf532d5 100644 --- a/docs/src/learn/sharing-state-between-components.md +++ b/docs/src/learn/sharing-state-between-components.md @@ -1,6 +1,3 @@ ---- -title: Sharing State Between Components 🚧 ---- ## Overview diff --git a/docs/src/learn/start-a-new-react-project.md b/docs/src/learn/start-a-new-react-project.md index 0196b1943..99cd7a9e6 100644 --- a/docs/src/learn/start-a-new-react-project.md +++ b/docs/src/learn/start-a-new-react-project.md @@ -1,6 +1,3 @@ ---- -title: Start a New React Project ---- ## Overview diff --git a/docs/src/learn/state-a-components-memory.md b/docs/src/learn/state-a-components-memory.md index ce350c1f7..47f266d9e 100644 --- a/docs/src/learn/state-a-components-memory.md +++ b/docs/src/learn/state-a-components-memory.md @@ -1,6 +1,3 @@ ---- -title: "State: A Component's Memory 🚧" ---- ## Overview diff --git a/docs/src/learn/state-as-a-snapshot.md b/docs/src/learn/state-as-a-snapshot.md index 0fe725ed7..57561bcb6 100644 --- a/docs/src/learn/state-as-a-snapshot.md +++ b/docs/src/learn/state-as-a-snapshot.md @@ -1,6 +1,3 @@ ---- -title: State as a Snapshot 🚧 ---- ## Overview diff --git a/docs/src/learn/synchronizing-with-effects.md b/docs/src/learn/synchronizing-with-effects.md index 7ebfeb240..ef95da4cd 100644 --- a/docs/src/learn/synchronizing-with-effects.md +++ b/docs/src/learn/synchronizing-with-effects.md @@ -1,6 +1,3 @@ ---- -title: "Synchronizing with Effects 🚧" ---- ## Overview diff --git a/docs/src/learn/thinking-in-react.md b/docs/src/learn/thinking-in-react.md index d66531517..fed0ec5e9 100644 --- a/docs/src/learn/thinking-in-react.md +++ b/docs/src/learn/thinking-in-react.md @@ -1,6 +1,3 @@ ---- -title: Thinking in React ---- ## Overview @@ -86,7 +83,7 @@ You can either build "top down" by starting with building the components higher # TODO ``` -(If this code looks intimidating, go through the [Quick Start](../learn/get-started.md) first!) +(If this code looks intimidating, go through the [Quick Start](../learn/quick-start.md) first!) After building your components, you'll have a library of reusable components that render your data model. Because this is a static app, the components will only return non-interactive HTML. The component at the top of the hierarchy (`filterable_product_table`) will take your data model as a prop. This is called _one-way data flow_ because the data flows down from the top-level component to the ones at the bottom of the tree. diff --git a/docs/src/learn/tutorial-material-ui.md b/docs/src/learn/tutorial-material-ui.md index b57bba07f..044fce7aa 100644 --- a/docs/src/learn/tutorial-material-ui.md +++ b/docs/src/learn/tutorial-material-ui.md @@ -1,6 +1,3 @@ ---- -title: "Tutorial: Material UI 🚫" ---- !!! warning "In Progress" diff --git a/docs/src/learn/tutorial-react-bootstrap.md b/docs/src/learn/tutorial-react-bootstrap.md index 8d77dbe1d..3da9db181 100644 --- a/docs/src/learn/tutorial-react-bootstrap.md +++ b/docs/src/learn/tutorial-react-bootstrap.md @@ -1,6 +1,3 @@ ---- -title: "Tutorial: React Bootstrap 🚫" ---- !!! warning "In Progress" diff --git a/docs/src/learn/tutorial-tic-tac-toe.md b/docs/src/learn/tutorial-tic-tac-toe.md index 317ca0c8c..8c41fd0d8 100644 --- a/docs/src/learn/tutorial-tic-tac-toe.md +++ b/docs/src/learn/tutorial-tic-tac-toe.md @@ -1,6 +1,3 @@ ---- -title: "Tutorial: Tic-Tac-Toe 🚧" ---- ## Overview diff --git a/docs/src/learn/updating-arrays-in-state.md b/docs/src/learn/updating-arrays-in-state.md index ee031175d..abc1efc90 100644 --- a/docs/src/learn/updating-arrays-in-state.md +++ b/docs/src/learn/updating-arrays-in-state.md @@ -1,6 +1,3 @@ ---- -title: Updating Arrays in State 🚧 ---- ## Overview diff --git a/docs/src/learn/updating-objects-in-state.md b/docs/src/learn/updating-objects-in-state.md index ec6459955..631f2f137 100644 --- a/docs/src/learn/updating-objects-in-state.md +++ b/docs/src/learn/updating-objects-in-state.md @@ -1,6 +1,3 @@ ---- -title: Updating Objects in State 🚧 ---- ## Overview diff --git a/docs/src/learn/vdom-mutations.md b/docs/src/learn/vdom-mutations.md index 6015f6905..e69de29bb 100644 --- a/docs/src/learn/vdom-mutations.md +++ b/docs/src/learn/vdom-mutations.md @@ -1,3 +0,0 @@ ---- -title: VDOM Mutations 🚧 ---- diff --git a/docs/src/learn/writing-markup-with-psx.md b/docs/src/learn/writing-markup-with-psx.md index b4b9396e7..788630ff1 100644 --- a/docs/src/learn/writing-markup-with-psx.md +++ b/docs/src/learn/writing-markup-with-psx.md @@ -1,6 +1,3 @@ ---- -title: Writing Markup with PSX 🚫 ---- !!! warning "In Progress" diff --git a/docs/src/learn/you-might-not-need-an-effect.md b/docs/src/learn/you-might-not-need-an-effect.md index 712c5e946..18996927e 100644 --- a/docs/src/learn/you-might-not-need-an-effect.md +++ b/docs/src/learn/you-might-not-need-an-effect.md @@ -1,6 +1,3 @@ ---- -title: "You Might Not Need an Effect 🚧" ---- ## Overview diff --git a/docs/src/learn/your-first-component.md b/docs/src/learn/your-first-component.md index a22d43f9b..eb44b0f52 100644 --- a/docs/src/learn/your-first-component.md +++ b/docs/src/learn/your-first-component.md @@ -1,6 +1,3 @@ ---- -title: Your First Component 🚧 ---- ## Overview diff --git a/docs/src/reference/client-api.md b/docs/src/reference/client-api.md index 777830f09..e69de29bb 100644 --- a/docs/src/reference/client-api.md +++ b/docs/src/reference/client-api.md @@ -1,3 +0,0 @@ ---- -title: Client API 🚧 ---- diff --git a/docs/src/reference/common-props.md b/docs/src/reference/common-props.md index 4fd73bf9d..32bde6e5b 100644 --- a/docs/src/reference/common-props.md +++ b/docs/src/reference/common-props.md @@ -1,6 +1,3 @@ ---- -title: Common Props 🚧 ---- #### Props diff --git a/docs/src/reference/django.md b/docs/src/reference/django.md index 3cc86a05e..e69de29bb 100644 --- a/docs/src/reference/django.md +++ b/docs/src/reference/django.md @@ -1,3 +0,0 @@ ---- -title: Django 🚧 ---- diff --git a/docs/src/reference/fastapi.md b/docs/src/reference/fastapi.md index e62f39fd3..e69de29bb 100644 --- a/docs/src/reference/fastapi.md +++ b/docs/src/reference/fastapi.md @@ -1,3 +0,0 @@ ---- -title: FastAPI 🚧 ---- diff --git a/docs/src/reference/flask.md b/docs/src/reference/flask.md index a5fc59a07..e69de29bb 100644 --- a/docs/src/reference/flask.md +++ b/docs/src/reference/flask.md @@ -1,3 +0,0 @@ ---- -title: Flask 🚧 ---- diff --git a/docs/src/reference/jupyter.md b/docs/src/reference/jupyter.md index 5d0149420..e69de29bb 100644 --- a/docs/src/reference/jupyter.md +++ b/docs/src/reference/jupyter.md @@ -1,3 +0,0 @@ ---- -title: Jupyter 🚧 ---- diff --git a/docs/src/reference/plotly-dash.md b/docs/src/reference/plotly-dash.md index c050957e8..e69de29bb 100644 --- a/docs/src/reference/plotly-dash.md +++ b/docs/src/reference/plotly-dash.md @@ -1,3 +0,0 @@ ---- -title: Plotly Dash 🚧 ---- diff --git a/docs/src/reference/protocol-structure.md b/docs/src/reference/protocol-structure.md index cc48c47dc..e69de29bb 100644 --- a/docs/src/reference/protocol-structure.md +++ b/docs/src/reference/protocol-structure.md @@ -1,3 +0,0 @@ ---- -title: Protocol Structure 🚧 ---- diff --git a/docs/src/reference/sanic.md b/docs/src/reference/sanic.md index 4b941c71c..e69de29bb 100644 --- a/docs/src/reference/sanic.md +++ b/docs/src/reference/sanic.md @@ -1,3 +0,0 @@ ---- -title: Sanic 🚧 ---- diff --git a/docs/src/reference/starlette.md b/docs/src/reference/starlette.md index 1414d1327..e69de29bb 100644 --- a/docs/src/reference/starlette.md +++ b/docs/src/reference/starlette.md @@ -1,3 +0,0 @@ ---- -title: Starlette 🚧 ---- diff --git a/docs/src/reference/tornado.md b/docs/src/reference/tornado.md index 6f09d1bb8..e69de29bb 100644 --- a/docs/src/reference/tornado.md +++ b/docs/src/reference/tornado.md @@ -1,3 +0,0 @@ ---- -title: Tornado 🚧 ---- diff --git a/docs/src/reference/usage.md b/docs/src/reference/usage.md index 32d698308..e69de29bb 100644 --- a/docs/src/reference/usage.md +++ b/docs/src/reference/usage.md @@ -1,3 +0,0 @@ ---- -title: Usage 🚧 ---- diff --git a/docs/src/reference/use-callback.md b/docs/src/reference/use-callback.md index c4978fb23..ff4e6661b 100644 --- a/docs/src/reference/use-callback.md +++ b/docs/src/reference/use-callback.md @@ -1,6 +1,3 @@ ---- -title: Use Callback 🚧 ---- ## Overview diff --git a/docs/src/reference/use-connection.md b/docs/src/reference/use-connection.md index 582dd88c4..e69de29bb 100644 --- a/docs/src/reference/use-connection.md +++ b/docs/src/reference/use-connection.md @@ -1,3 +0,0 @@ ---- -title: Use Connection 🚧 ---- diff --git a/docs/src/reference/use-context.md b/docs/src/reference/use-context.md index 165e8e4bf..6a9e34827 100644 --- a/docs/src/reference/use-context.md +++ b/docs/src/reference/use-context.md @@ -1,6 +1,3 @@ ---- -title: Use Context 🚧 ---- ## Overview diff --git a/docs/src/reference/use-debug-value.md b/docs/src/reference/use-debug-value.md index 5bbdacf42..5b3335091 100644 --- a/docs/src/reference/use-debug-value.md +++ b/docs/src/reference/use-debug-value.md @@ -1,6 +1,3 @@ ---- -title: Use Debug Value 🚧 ---- ## Overview diff --git a/docs/src/reference/use-deferred-value.md b/docs/src/reference/use-deferred-value.md index d7058b899..82000489b 100644 --- a/docs/src/reference/use-deferred-value.md +++ b/docs/src/reference/use-deferred-value.md @@ -1,6 +1,3 @@ ---- -title: Use Deferred Value 🚫 ---- ## Overview diff --git a/docs/src/reference/use-effect.md b/docs/src/reference/use-effect.md index 7a73905bb..1a6802a40 100644 --- a/docs/src/reference/use-effect.md +++ b/docs/src/reference/use-effect.md @@ -1,6 +1,3 @@ ---- -title: Use Effect 🚧 ---- ## Overview diff --git a/docs/src/reference/use-id.md b/docs/src/reference/use-id.md index 2802254e8..f70cd7e55 100644 --- a/docs/src/reference/use-id.md +++ b/docs/src/reference/use-id.md @@ -1,6 +1,3 @@ ---- -title: Use ID 🚫 ---- !!! warning "In Progress" diff --git a/docs/src/reference/use-imperative-handle.md b/docs/src/reference/use-imperative-handle.md index 8d5ca5994..edfa59d83 100644 --- a/docs/src/reference/use-imperative-handle.md +++ b/docs/src/reference/use-imperative-handle.md @@ -1,6 +1,3 @@ ---- -title: Use Imperative Handle 🚫 ---- ## Overview diff --git a/docs/src/reference/use-insertion-effect.md b/docs/src/reference/use-insertion-effect.md index 495959069..373a7bf7b 100644 --- a/docs/src/reference/use-insertion-effect.md +++ b/docs/src/reference/use-insertion-effect.md @@ -1,6 +1,3 @@ ---- -title: Use Insertion Effect 🚫 ---- <Pitfall> diff --git a/docs/src/reference/use-layout-effect.md b/docs/src/reference/use-layout-effect.md index 8ea42d8bc..fde92f88f 100644 --- a/docs/src/reference/use-layout-effect.md +++ b/docs/src/reference/use-layout-effect.md @@ -1,6 +1,3 @@ ---- -title: Use Layout Effect 🚫 ---- <Pitfall> diff --git a/docs/src/reference/use-location.md b/docs/src/reference/use-location.md index 0d7ff700f..e69de29bb 100644 --- a/docs/src/reference/use-location.md +++ b/docs/src/reference/use-location.md @@ -1,3 +0,0 @@ ---- -title: Use Location 🚧 ---- diff --git a/docs/src/reference/use-memo.md b/docs/src/reference/use-memo.md index 4a9f3143a..7fd524555 100644 --- a/docs/src/reference/use-memo.md +++ b/docs/src/reference/use-memo.md @@ -1,6 +1,3 @@ ---- -title: Use Memo 🚧 ---- ## Overview diff --git a/docs/src/reference/use-reducer.md b/docs/src/reference/use-reducer.md index c397b41c7..b9739f497 100644 --- a/docs/src/reference/use-reducer.md +++ b/docs/src/reference/use-reducer.md @@ -1,6 +1,3 @@ ---- -title: Use Reducer 🚧 ---- ## Overview diff --git a/docs/src/reference/use-ref.md b/docs/src/reference/use-ref.md index 1554ffc7e..931cc21a3 100644 --- a/docs/src/reference/use-ref.md +++ b/docs/src/reference/use-ref.md @@ -1,6 +1,3 @@ ---- -title: Use Ref 🚧 ---- ## Overview diff --git a/docs/src/reference/use-scope.md b/docs/src/reference/use-scope.md index 080875017..e69de29bb 100644 --- a/docs/src/reference/use-scope.md +++ b/docs/src/reference/use-scope.md @@ -1,3 +0,0 @@ ---- -title: Use Scope 🚧 ---- diff --git a/docs/src/reference/use-state.md b/docs/src/reference/use-state.md index c624bbd9e..c66538623 100644 --- a/docs/src/reference/use-state.md +++ b/docs/src/reference/use-state.md @@ -1,6 +1,3 @@ ---- -title: Use State 🚧 ---- ## Overview diff --git a/docs/src/reference/use-sync-external-store.md b/docs/src/reference/use-sync-external-store.md index 9d5425fd2..bfcfbd0ae 100644 --- a/docs/src/reference/use-sync-external-store.md +++ b/docs/src/reference/use-sync-external-store.md @@ -1,6 +1,3 @@ ---- -title: Use Sync External Store 🚫 ---- ## Overview diff --git a/docs/src/reference/use-transition.md b/docs/src/reference/use-transition.md index 8279f7afe..a1faa0bcb 100644 --- a/docs/src/reference/use-transition.md +++ b/docs/src/reference/use-transition.md @@ -1,6 +1,3 @@ ---- -title: Use Transition 🚫 ---- ## Overview diff --git a/mkdocs.yml b/mkdocs.yml index e64f52371..f87293536 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,99 +3,99 @@ nav: - Home: index.md - Get Started: - Quick Start: - - learn/get-started.md - - learn/tutorial-tic-tac-toe.md - - learn/thinking-in-react.md + - learn/quick-start.md + - "Tutorial: Tic-Tac-Toe 🚧" : learn/tutorial-tic-tac-toe.md + - Thinking in React : learn/thinking-in-react.md - Installation: - - learn/start-a-new-react-project.md - - learn/add-react-to-an-existing-project.md - - learn/editor-setup.md - - learn/react-developer-tools.md + - Start a New React Project : learn/start-a-new-react-project.md + - Add React to an Existing Project 🚫 : learn/add-react-to-an-existing-project.md + - Editor Setup 🚧 : learn/editor-setup.md + - React Developer Tools 🚫 : learn/react-developer-tools.md - More Tutorials: - - learn/tutorial-react-bootstrap.md - - learn/tutorial-material-ui.md + - "Tutorial: React Bootstrap 🚫" : learn/tutorial-react-bootstrap.md + - "Tutorial: Material UI 🚫" : learn/tutorial-material-ui.md - Learn React: - Describing the UI: - - learn/your-first-component.md - - learn/importing-and-exporting-components.md - - learn/writing-markup-with-psx.md - - learn/python-in-psx-with-curly-braces.md - - learn/passing-props-to-a-component.md - - learn/conditional-rendering.md - - learn/rendering-lists.md - - learn/keeping-components-pure.md + - Your First Component 🚧 : learn/your-first-component.md + - Importing and Exporting Components 🚧 : learn/importing-and-exporting-components.md + - Writing Markup with PSX 🚫 : learn/writing-markup-with-psx.md + - Python in PSX with Curly Braces 🚫 : learn/python-in-psx-with-curly-braces.md + - Passing Props to a Component 🚧 : learn/passing-props-to-a-component.md + - Conditional Rendering 🚧 : learn/conditional-rendering.md + - Rendering Lists 🚧 : learn/rendering-lists.md + - Keeping Components Pure 🚧 : learn/keeping-components-pure.md - Adding Interactivity: - - learn/responding-to-events.md - - learn/state-a-components-memory.md - - learn/render-and-commit.md - - learn/state-as-a-snapshot.md - - learn/queueing-a-series-of-state-updates.md - - learn/updating-objects-in-state.md - - learn/updating-arrays-in-state.md + - Responding to Events 🚧 : learn/responding-to-events.md + - "State: A Component's Memory 🚧" : learn/state-a-components-memory.md + - Render and Commit 🚧 : learn/render-and-commit.md + - State as a Snapshot 🚧 : learn/state-as-a-snapshot.md + - Queueing a Series of State Updates 🚧 : learn/queueing-a-series-of-state-updates.md + - Updating Objects in State 🚧 : learn/updating-objects-in-state.md + - Updating Arrays in State 🚧 : learn/updating-arrays-in-state.md - Managing State: - - learn/reacting-to-input-with-state.md - - learn/choosing-the-state-structure.md - - learn/sharing-state-between-components.md - - learn/preserving-and-resetting-state.md - - learn/extracting-state-logic-into-a-reducer.md - - learn/passing-data-deeply-with-context.md - - learn/scaling-up-with-reducer-and-context.md + - Reacting to Input with State 🚧 : learn/reacting-to-input-with-state.md + - Choosing the State Structure 🚧 : learn/choosing-the-state-structure.md + - Sharing State Between Components 🚧 : learn/sharing-state-between-components.md + - Preserving and Resetting State 🚧 : learn/preserving-and-resetting-state.md + - Extracting State Logic into a Reducer 🚧 : learn/extracting-state-logic-into-a-reducer.md + - Passing Data Deeply with Context 🚧 : learn/passing-data-deeply-with-context.md + - Scaling Up with Reducer and Context 🚧 : learn/scaling-up-with-reducer-and-context.md - Escape Hatches: - - learn/referencing-values-with-refs.md - - learn/manipulating-the-dom-with-refs.md - - learn/synchronizing-with-effects.md - - learn/you-might-not-need-an-effect.md - - learn/lifecycle-of-reactive-effects.md - - learn/separating-events-from-effects.md - - learn/removing-effect-dependencies.md - - learn/reusing-logic-with-custom-hooks.md - - learn/communicate-data-between-server-and-client.md - - learn/convert-between-vdom-and-html.md - - learn/vdom-mutations.md - - learn/creating-vdom-event-handlers.md - - learn/creating-html-tags.md - - learn/creating-backends.md - - learn/manually-register-a-client.md + - Referencing Values with Refs 🚧 : learn/referencing-values-with-refs.md + - Manipulating the DOM with Refs 🚧 : learn/manipulating-the-dom-with-refs.md + - Synchronizing with Effects 🚧 : learn/synchronizing-with-effects.md + - You Might Not Need an Effect 🚧 : learn/you-might-not-need-an-effect.md + - Lifecycle of Reactive Effects 🚧 : learn/lifecycle-of-reactive-effects.md + - Separating Events from Effects 🚧 : learn/separating-events-from-effects.md + - Removing Effect Dependencies 🚧 : learn/removing-effect-dependencies.md + - Reusing Logic with Custom Hooks 🚧 : learn/reusing-logic-with-custom-hooks.md + - Communicating Data Between Server and Client 🚧 : learn/communicate-data-between-server-and-client.md + - Convert Between VDOM and HTML 🚧 : learn/convert-between-vdom-and-html.md + - VDOM Mutations 🚧 : learn/vdom-mutations.md + - Creating VDOM Event Handlers 🚧 : learn/creating-vdom-event-handlers.md + - Creating HTML Tags 🚧 : learn/creating-html-tags.md + - Creating Backends 🚧 : learn/creating-backends.md + - Manually Register a Client 🚧 : learn/manually-register-a-client.md - Reference: - Hooks: - - reference/use-state.md - - reference/use-effect.md - - reference/use-context.md - - reference/use-reducer.md - - reference/use-callback.md - - reference/use-memo.md - - reference/use-ref.md - - reference/use-debug-value.md - - reference/use-connection.md - - reference/use-scope.md - - reference/use-location.md - - reference/use-id.md - - reference/use-deferred-value.md - - reference/use-imperative-handle.md - - reference/use-insertion-effect.md - - reference/use-layout-effect.md - - reference/use-sync-external-store.md - - reference/use-transition.md + - Use State 🚧 : reference/use-state.md + - Use Effect 🚧 : reference/use-effect.md + - Use Context 🚧 : reference/use-context.md + - Use Reducer 🚧 : reference/use-reducer.md + - Use Callback 🚧 : reference/use-callback.md + - Use Memo 🚧 : reference/use-memo.md + - Use Ref 🚧 : reference/use-ref.md + - Use Debug Value 🚧 : reference/use-debug-value.md + - Use Connection 🚧 : reference/use-connection.md + - Use Scope 🚧 : reference/use-scope.md + - Use Location 🚧 : reference/use-location.md + - Use ID 🚫 : reference/use-id.md + - Use Deferred Value 🚫 : reference/use-deferred-value.md + - Use Imperative Handle 🚫 : reference/use-imperative-handle.md + - Use Insertion Effect 🚫 : reference/use-insertion-effect.md + - Use Layout Effect 🚫 : reference/use-layout-effect.md + - Use Sync External Store 🚫 : reference/use-sync-external-store.md + - Use Transition 🚫 : reference/use-transition.md - HTML Tags: - - reference/common-props.md - - reference/usage.md + - Common Props 🚧 : reference/common-props.md + - Usage 🚧 : reference/usage.md - Backends: - - reference/fastapi.md - - reference/flask.md - - reference/sanic.md - - reference/starlette.md - - reference/tornado.md - - reference/django.md - - reference/jupyter.md - - reference/plotly-dash.md - - reference/protocol-structure.md - - reference/client-api.md + - FastAPI 🚧 : reference/fastapi.md + - Flask 🚧 : reference/flask.md + - Sanic 🚧 : reference/sanic.md + - Starlette 🚧 : reference/starlette.md + - Tornado 🚧 : reference/tornado.md + - Django 🚧 : reference/django.md + - Jupyter 🚧 : reference/jupyter.md + - Plotly Dash 🚧 : reference/plotly-dash.md + - Protocol Structure 🚧 : reference/protocol-structure.md + - Client API 🚧 : reference/client-api.md - About ReactPy: - - about/changelog.md - - about/community.md - - about/running-tests.md - - about/code.md - - about/docs.md + - Changelog 🚧 : about/changelog.md + - Community 🚧 : about/community.md + - Running Tests 🚧 : about/running-tests.md + - Contributing Code 🚧 : about/code.md + - Contributing Documentation 🚧 : about/docs.md theme: name: material @@ -144,6 +144,7 @@ markdown_extensions: plugins: - search - include-markdown + - section-index # - git-authors # - minify: # minify_html: true From c2c028186d22dc5c6d249ef07aa6eae581820e6c Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Tue, 20 Jun 2023 20:10:42 -0700 Subject: [PATCH 32/49] verbiage on installation docs --- docs/src/learn/start-a-new-react-project.md | 30 ++++++++++++--------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/docs/src/learn/start-a-new-react-project.md b/docs/src/learn/start-a-new-react-project.md index 99cd7a9e6..23f9cb1d5 100644 --- a/docs/src/learn/start-a-new-react-project.md +++ b/docs/src/learn/start-a-new-react-project.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> @@ -7,22 +6,21 @@ If you want to build a new app or a new website fully with ReactPy, we recommend </p> - ## Built-in Backends <!-- FIXME: This is reliant on https://github.com/reactive-python/reactpy/issues/1071 --> !!! note - Some of our frameworks are considered _built-in_, meaning that compatibility for these backends are contained within `reactpy.backend.*`. + Some of our backend frameworks are considered _built-in_, meaning that compatibility for these backends are contained within `reactpy.backend.*`. - In order to run ReactPy with these frameworks, you will need to run `reactpy.backend.*.configure(...)` on your ASGI application. This command will configure the necessary settings and routes for ReactPy to work properly. + In order to use ReactPy with _built-in_ backend, you will need to run `reactpy.backend.*.configure(...)` on your ASGI application. This command will configure the necessary settings and routes for ReactPy to work properly. For example, this is how you would configure ReactPy for FastAPI: - ```python linenums="0" - {% include "../../examples/python/start_a_new_react_project/configure_example.py" %} - ``` + ```python linenums="0" + {% include "../../examples/python/start_a_new_react_project/configure_example.py" %} + ``` ### FastAPI @@ -96,6 +94,12 @@ You will need to [configure Tornado](#built-in-backends) in order to use it with ## External Backends +!!! warning "Pitfall" + + _External_ backends have ReactPy support, but have significantly different installation and configuration instructions than _built-in_ backends. + + Make sure to follow the configuration guide for your chosen _external_ backend. + ### Django [Django](https://www.djangoproject.com/) is a full-featured web framework that provides a batteries-included approach to web development. It includes features such as ORM, templating, authentication, and authorization. Django is a good choice for large and complex web applications. @@ -108,7 +112,7 @@ You will need to [configure Tornado](#built-in-backends) in order to use it with If you're new to Django, check out the [Django tutorial](https://docs.djangoproject.com/en/dev/intro/tutorial01/). -You will need to [configure Django](https://reactive-python.github.io/reactpy-django/get-started/installation/) in order to use it with ReactPy. +ReactPy has unique [configuration instructions](https://reactive-python.github.io/reactpy-django/get-started/installation/) to use Django. ### Jupyter @@ -122,7 +126,7 @@ Jupyter is an interactive computing environment that is used for data science an If you're new to Jupyter, check out the [Jupyter tutorial](https://jupyter.org/try). -You will need to [configure Jupyter](https://github.com/reactive-python/reactpy-jupyter#readme) in order to use it with ReactPy. +ReactPy has unique [configuration instructions](https://github.com/reactive-python/reactpy-jupyter#readme) to use Jupyter. ### Plotly Dash @@ -136,16 +140,16 @@ Plotly Dash is a web application framework that is used to create interactive da If you're new to Plotly Dash, check out the [Plotly Dash tutorial](https://dash.plotly.com/installation). -You will need to [configure Plotly Dash](https://github.com/reactive-python/reactpy-dash#readme) in order to use it with ReactPy. +ReactPy has unique [configuration instructions](https://github.com/reactive-python/reactpy-dash#readme) to use Plotly Dash. !!! info "Deep Dive" <font size="4">**Can I use ReactPy without a backend framework?**</font> - You can not ReactPy without a backend—this project was designed to be built on-top of existing web frameworks. + You can not ReactPy without a backend—this project was designed to be built on-top of existing web frameworks. Here's why. You can think of ReactPy as ReactJS server side rendering, but with a Python server. We rely on Python web frameworks and webservers in order to process ReactPy traffic. **This means that you can [use any Python web framework](../learn/creating-backends.md) as a ReactPy backend, as long as it supports the ASGI standard.** As your project grows with every new feature, you may want to switch backends in the future. As a result, we recommend keeping all backend-related logic within hook functions in order to make the "points of integration" between ReactPy and your backend as small as possible. - - **If you're building a new app or a site fully with ReactPy, we recommend using your favorite backend combined with [`reactpy-router`](https://github.com/reactive-python/reactpy-router) to create a Single Page Application (SPA).** + + **If you're building a new app or a site fully with ReactPy, we recommend using your favorite backend combined with [`reactpy-router`](https://github.com/reactive-python/reactpy-router) to create a Single Page Application (SPA).** From aec77d40818cabb9ce3c9f760256477df8126ce7 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Tue, 20 Jun 2023 20:59:23 -0700 Subject: [PATCH 33/49] add installation index page --- docs/src/learn/installation.md | 30 ++++++++++++++++++++++++++++++ mkdocs.yml | 1 + 2 files changed, 31 insertions(+) create mode 100644 docs/src/learn/installation.md diff --git a/docs/src/learn/installation.md b/docs/src/learn/installation.md new file mode 100644 index 000000000..53a403844 --- /dev/null +++ b/docs/src/learn/installation.md @@ -0,0 +1,30 @@ +## Overview + +<p class="intro" markdown> + +React has been designed from the start for gradual adoption. You can use as little or as much React as you need. Whether you want to get a taste of React, add some interactivity to an HTML page, or start a complex React-powered app, this section will help you get started. + +</p> + +!!! summary "You Will Learn" + + * [How to start a new React project](../learn/start-a-new-react-project.md) + * [How to add React to an existing project](../learn/add-react-to-an-existing-project.md) + * [How to set up your editor](../learn/editor-setup.md) + * [How to install React Developer Tools](../learn/react-developer-tools.md) + +## Try React + +You don't need to install anything to play with React. [Try ReactPy within Jupyter Notebooks](https://mybinder.org/v2/gh/reactive-python/reactpy-jupyter/main?urlpath=lab/tree/notebooks/introduction.ipynb)! + +## Start a new React project + +If you want to build an app or a website fully with React, [start a new React project.](../learn/start-a-new-react-project.md) + +## Add React to an existing project + +If want to try using React in your existing app or a website, [add React to an existing project.](../learn/add-react-to-an-existing-project.md) + +## Next steps + +Head to the [Quick Start](../learn/quick-start.md) guide for a tour of the most important React concepts you will encounter every day. diff --git a/mkdocs.yml b/mkdocs.yml index f87293536..f6b763326 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -7,6 +7,7 @@ nav: - "Tutorial: Tic-Tac-Toe 🚧" : learn/tutorial-tic-tac-toe.md - Thinking in React : learn/thinking-in-react.md - Installation: + - learn/installation.md - Start a New React Project : learn/start-a-new-react-project.md - Add React to an Existing Project 🚫 : learn/add-react-to-an-existing-project.md - Editor Setup 🚧 : learn/editor-setup.md From 7c68a4785617b25525b222e224155f575a7d3650 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Tue, 20 Jun 2023 21:20:24 -0700 Subject: [PATCH 34/49] editor setup --- docs/src/learn/editor-setup.md | 22 +++++++++++++++++----- mkdocs.yml | 3 ++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/docs/src/learn/editor-setup.md b/docs/src/learn/editor-setup.md index 3154124fb..93f7139cd 100644 --- a/docs/src/learn/editor-setup.md +++ b/docs/src/learn/editor-setup.md @@ -26,9 +26,19 @@ Other popular text editors used in the React community include: Some editors come with these features built in, but others might require adding an extension. Check to see what support your editor of choice provides to be sure! -### Linting +### Python Linting -Code linters find problems in your code as you write, helping you fix them early. [ESLint](https://eslint.org/) is a popular, open source linter for JavaScript. +Linting is the process of running a program that will analyse code for potential errors. [Flake8](https://flake8.pycqa.org/en/latest/) is a popular, open source linter for Python. + +- [Install Flake8](https://flake8.pycqa.org/en/latest/#installation) (be sure you have [Python installed!](https://www.python.org/downloads/)) +- [Integrate Flake8 in VSCode with the official extension](https://marketplace.visualstudio.com/items?itemName=ms-python.flake8) +- [Install Reactpy-Flake8](https://pypi.org/project/reactpy-flake8/) to lint your ReactPy code + +### JavaScript Linting + +You typically won't use much JavaScript alongside ReactPy, but there are still some cases where you might. For example, you might want to use JavaScript to fetch data from an API or to add some interactivity to your app. + +In these cases, it's helpful to have a linter that can catch common mistakes in your code as you write it. [ESLint](https://eslint.org/) is a popular, open source linter for JavaScript. - [Install ESLint with the recommended configuration for React](https://www.npmjs.com/package/eslint-config-react-app) (be sure you have [Node installed!](https://nodejs.org/en/download/current/)) - [Integrate ESLint in VSCode with the official extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) @@ -42,7 +52,7 @@ The last thing you want to do when sharing your code with another contributor is You can install the [Prettier extension in VSCode](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) by following these steps: 1. Launch VS Code -2. Use Quick Open (press Ctrl/Cmd+P) +2. Use Quick Open, press ++ctrl+p++ 3. Paste in `ext install esbenp.prettier-vscode` 4. Press Enter @@ -50,10 +60,12 @@ You can install the [Prettier extension in VSCode](https://marketplace.visualstu Ideally, you should format your code on every save. VS Code has settings for this! -1. In VS Code, press `CTRL/CMD + SHIFT + P`. +1. In VS Code, press ++ctrl+shift+p++ 2. Type "settings" 3. Hit Enter 4. In the search bar, type "format on save" 5. Be sure the "format on save" option is ticked! -> If your ESLint preset has formatting rules, they may conflict with Prettier. We recommend disabling all formatting rules in your ESLint preset using [`eslint-config-prettier`](https://github.com/prettier/eslint-config-prettier) so that ESLint is _only_ used for catching logical mistakes. If you want to enforce that files are formatted before a pull request is merged, use [`prettier --check`](https://prettier.io/docs/en/cli.html#--check) for your continuous integration. +!!! note + + If your ESLint preset has formatting rules, they may conflict with Prettier. We recommend disabling all formatting rules in your ESLint preset using [`eslint-config-prettier`](https://github.com/prettier/eslint-config-prettier) so that ESLint is _only_ used for catching logical mistakes. If you want to enforce that files are formatted before a pull request is merged, use [`prettier --check`](https://prettier.io/docs/en/cli.html#--check) for your continuous integration. diff --git a/mkdocs.yml b/mkdocs.yml index f6b763326..405b504a3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -10,7 +10,7 @@ nav: - learn/installation.md - Start a New React Project : learn/start-a-new-react-project.md - Add React to an Existing Project 🚫 : learn/add-react-to-an-existing-project.md - - Editor Setup 🚧 : learn/editor-setup.md + - Editor Setup : learn/editor-setup.md - React Developer Tools 🚫 : learn/react-developer-tools.md - More Tutorials: - "Tutorial: React Bootstrap 🚫" : learn/tutorial-react-bootstrap.md @@ -141,6 +141,7 @@ markdown_extensions: - admonition - attr_list - md_in_html + - pymdownx.keys plugins: - search From 302f1335ec4b216b534ed4a8c9036e19beb73b95 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Tue, 20 Jun 2023 21:21:04 -0700 Subject: [PATCH 35/49] remove unneeded space --- mkdocs.yml | 160 ++++++++++++++++++++++++++--------------------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index 405b504a3..bce2c9b32 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -4,99 +4,99 @@ nav: - Get Started: - Quick Start: - learn/quick-start.md - - "Tutorial: Tic-Tac-Toe 🚧" : learn/tutorial-tic-tac-toe.md - - Thinking in React : learn/thinking-in-react.md + - "Tutorial: Tic-Tac-Toe 🚧": learn/tutorial-tic-tac-toe.md + - Thinking in React: learn/thinking-in-react.md - Installation: - learn/installation.md - - Start a New React Project : learn/start-a-new-react-project.md - - Add React to an Existing Project 🚫 : learn/add-react-to-an-existing-project.md - - Editor Setup : learn/editor-setup.md - - React Developer Tools 🚫 : learn/react-developer-tools.md + - Start a New React Project: learn/start-a-new-react-project.md + - Add React to an Existing Project 🚫: learn/add-react-to-an-existing-project.md + - Editor Setup: learn/editor-setup.md + - React Developer Tools 🚫: learn/react-developer-tools.md - More Tutorials: - - "Tutorial: React Bootstrap 🚫" : learn/tutorial-react-bootstrap.md - - "Tutorial: Material UI 🚫" : learn/tutorial-material-ui.md + - "Tutorial: React Bootstrap 🚫": learn/tutorial-react-bootstrap.md + - "Tutorial: Material UI 🚫": learn/tutorial-material-ui.md - Learn React: - Describing the UI: - - Your First Component 🚧 : learn/your-first-component.md - - Importing and Exporting Components 🚧 : learn/importing-and-exporting-components.md - - Writing Markup with PSX 🚫 : learn/writing-markup-with-psx.md - - Python in PSX with Curly Braces 🚫 : learn/python-in-psx-with-curly-braces.md - - Passing Props to a Component 🚧 : learn/passing-props-to-a-component.md - - Conditional Rendering 🚧 : learn/conditional-rendering.md - - Rendering Lists 🚧 : learn/rendering-lists.md - - Keeping Components Pure 🚧 : learn/keeping-components-pure.md + - Your First Component 🚧: learn/your-first-component.md + - Importing and Exporting Components 🚧: learn/importing-and-exporting-components.md + - Writing Markup with PSX 🚫: learn/writing-markup-with-psx.md + - Python in PSX with Curly Braces 🚫: learn/python-in-psx-with-curly-braces.md + - Passing Props to a Component 🚧: learn/passing-props-to-a-component.md + - Conditional Rendering 🚧: learn/conditional-rendering.md + - Rendering Lists 🚧: learn/rendering-lists.md + - Keeping Components Pure 🚧: learn/keeping-components-pure.md - Adding Interactivity: - - Responding to Events 🚧 : learn/responding-to-events.md - - "State: A Component's Memory 🚧" : learn/state-a-components-memory.md - - Render and Commit 🚧 : learn/render-and-commit.md - - State as a Snapshot 🚧 : learn/state-as-a-snapshot.md - - Queueing a Series of State Updates 🚧 : learn/queueing-a-series-of-state-updates.md - - Updating Objects in State 🚧 : learn/updating-objects-in-state.md - - Updating Arrays in State 🚧 : learn/updating-arrays-in-state.md + - Responding to Events 🚧: learn/responding-to-events.md + - "State: A Component's Memory 🚧": learn/state-a-components-memory.md + - Render and Commit 🚧: learn/render-and-commit.md + - State as a Snapshot 🚧: learn/state-as-a-snapshot.md + - Queueing a Series of State Updates 🚧: learn/queueing-a-series-of-state-updates.md + - Updating Objects in State 🚧: learn/updating-objects-in-state.md + - Updating Arrays in State 🚧: learn/updating-arrays-in-state.md - Managing State: - - Reacting to Input with State 🚧 : learn/reacting-to-input-with-state.md - - Choosing the State Structure 🚧 : learn/choosing-the-state-structure.md - - Sharing State Between Components 🚧 : learn/sharing-state-between-components.md - - Preserving and Resetting State 🚧 : learn/preserving-and-resetting-state.md - - Extracting State Logic into a Reducer 🚧 : learn/extracting-state-logic-into-a-reducer.md - - Passing Data Deeply with Context 🚧 : learn/passing-data-deeply-with-context.md - - Scaling Up with Reducer and Context 🚧 : learn/scaling-up-with-reducer-and-context.md + - Reacting to Input with State 🚧: learn/reacting-to-input-with-state.md + - Choosing the State Structure 🚧: learn/choosing-the-state-structure.md + - Sharing State Between Components 🚧: learn/sharing-state-between-components.md + - Preserving and Resetting State 🚧: learn/preserving-and-resetting-state.md + - Extracting State Logic into a Reducer 🚧: learn/extracting-state-logic-into-a-reducer.md + - Passing Data Deeply with Context 🚧: learn/passing-data-deeply-with-context.md + - Scaling Up with Reducer and Context 🚧: learn/scaling-up-with-reducer-and-context.md - Escape Hatches: - - Referencing Values with Refs 🚧 : learn/referencing-values-with-refs.md - - Manipulating the DOM with Refs 🚧 : learn/manipulating-the-dom-with-refs.md - - Synchronizing with Effects 🚧 : learn/synchronizing-with-effects.md - - You Might Not Need an Effect 🚧 : learn/you-might-not-need-an-effect.md - - Lifecycle of Reactive Effects 🚧 : learn/lifecycle-of-reactive-effects.md - - Separating Events from Effects 🚧 : learn/separating-events-from-effects.md - - Removing Effect Dependencies 🚧 : learn/removing-effect-dependencies.md - - Reusing Logic with Custom Hooks 🚧 : learn/reusing-logic-with-custom-hooks.md - - Communicating Data Between Server and Client 🚧 : learn/communicate-data-between-server-and-client.md - - Convert Between VDOM and HTML 🚧 : learn/convert-between-vdom-and-html.md - - VDOM Mutations 🚧 : learn/vdom-mutations.md - - Creating VDOM Event Handlers 🚧 : learn/creating-vdom-event-handlers.md - - Creating HTML Tags 🚧 : learn/creating-html-tags.md - - Creating Backends 🚧 : learn/creating-backends.md - - Manually Register a Client 🚧 : learn/manually-register-a-client.md + - Referencing Values with Refs 🚧: learn/referencing-values-with-refs.md + - Manipulating the DOM with Refs 🚧: learn/manipulating-the-dom-with-refs.md + - Synchronizing with Effects 🚧: learn/synchronizing-with-effects.md + - You Might Not Need an Effect 🚧: learn/you-might-not-need-an-effect.md + - Lifecycle of Reactive Effects 🚧: learn/lifecycle-of-reactive-effects.md + - Separating Events from Effects 🚧: learn/separating-events-from-effects.md + - Removing Effect Dependencies 🚧: learn/removing-effect-dependencies.md + - Reusing Logic with Custom Hooks 🚧: learn/reusing-logic-with-custom-hooks.md + - Communicating Data Between Server and Client 🚧: learn/communicate-data-between-server-and-client.md + - Convert Between VDOM and HTML 🚧: learn/convert-between-vdom-and-html.md + - VDOM Mutations 🚧: learn/vdom-mutations.md + - Creating VDOM Event Handlers 🚧: learn/creating-vdom-event-handlers.md + - Creating HTML Tags 🚧: learn/creating-html-tags.md + - Creating Backends 🚧: learn/creating-backends.md + - Manually Register a Client 🚧: learn/manually-register-a-client.md - Reference: - Hooks: - - Use State 🚧 : reference/use-state.md - - Use Effect 🚧 : reference/use-effect.md - - Use Context 🚧 : reference/use-context.md - - Use Reducer 🚧 : reference/use-reducer.md - - Use Callback 🚧 : reference/use-callback.md - - Use Memo 🚧 : reference/use-memo.md - - Use Ref 🚧 : reference/use-ref.md - - Use Debug Value 🚧 : reference/use-debug-value.md - - Use Connection 🚧 : reference/use-connection.md - - Use Scope 🚧 : reference/use-scope.md - - Use Location 🚧 : reference/use-location.md - - Use ID 🚫 : reference/use-id.md - - Use Deferred Value 🚫 : reference/use-deferred-value.md - - Use Imperative Handle 🚫 : reference/use-imperative-handle.md - - Use Insertion Effect 🚫 : reference/use-insertion-effect.md - - Use Layout Effect 🚫 : reference/use-layout-effect.md - - Use Sync External Store 🚫 : reference/use-sync-external-store.md - - Use Transition 🚫 : reference/use-transition.md + - Use State 🚧: reference/use-state.md + - Use Effect 🚧: reference/use-effect.md + - Use Context 🚧: reference/use-context.md + - Use Reducer 🚧: reference/use-reducer.md + - Use Callback 🚧: reference/use-callback.md + - Use Memo 🚧: reference/use-memo.md + - Use Ref 🚧: reference/use-ref.md + - Use Debug Value 🚧: reference/use-debug-value.md + - Use Connection 🚧: reference/use-connection.md + - Use Scope 🚧: reference/use-scope.md + - Use Location 🚧: reference/use-location.md + - Use ID 🚫: reference/use-id.md + - Use Deferred Value 🚫: reference/use-deferred-value.md + - Use Imperative Handle 🚫: reference/use-imperative-handle.md + - Use Insertion Effect 🚫: reference/use-insertion-effect.md + - Use Layout Effect 🚫: reference/use-layout-effect.md + - Use Sync External Store 🚫: reference/use-sync-external-store.md + - Use Transition 🚫: reference/use-transition.md - HTML Tags: - - Common Props 🚧 : reference/common-props.md - - Usage 🚧 : reference/usage.md + - Common Props 🚧: reference/common-props.md + - Usage 🚧: reference/usage.md - Backends: - - FastAPI 🚧 : reference/fastapi.md - - Flask 🚧 : reference/flask.md - - Sanic 🚧 : reference/sanic.md - - Starlette 🚧 : reference/starlette.md - - Tornado 🚧 : reference/tornado.md - - Django 🚧 : reference/django.md - - Jupyter 🚧 : reference/jupyter.md - - Plotly Dash 🚧 : reference/plotly-dash.md - - Protocol Structure 🚧 : reference/protocol-structure.md - - Client API 🚧 : reference/client-api.md + - FastAPI 🚧: reference/fastapi.md + - Flask 🚧: reference/flask.md + - Sanic 🚧: reference/sanic.md + - Starlette 🚧: reference/starlette.md + - Tornado 🚧: reference/tornado.md + - Django 🚧: reference/django.md + - Jupyter 🚧: reference/jupyter.md + - Plotly Dash 🚧: reference/plotly-dash.md + - Protocol Structure 🚧: reference/protocol-structure.md + - Client API 🚧: reference/client-api.md - About ReactPy: - - Changelog 🚧 : about/changelog.md - - Community 🚧 : about/community.md - - Running Tests 🚧 : about/running-tests.md - - Contributing Code 🚧 : about/code.md - - Contributing Documentation 🚧 : about/docs.md + - Changelog 🚧: about/changelog.md + - Community 🚧: about/community.md + - Running Tests 🚧: about/running-tests.md + - Contributing Code 🚧: about/code.md + - Contributing Documentation 🚧: about/docs.md theme: name: material From 11aa58a5852ba84c1033073f1764cfc99634265a Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Tue, 20 Jun 2023 22:37:58 -0700 Subject: [PATCH 36/49] format everything --- docs/src/learn/add-react-to-an-existing-project.md | 1 - docs/src/learn/choosing-the-state-structure.md | 1 - docs/src/learn/conditional-rendering.md | 1 - docs/src/learn/editor-setup.md | 1 - docs/src/learn/extracting-state-logic-into-a-reducer.md | 1 - docs/src/learn/importing-and-exporting-components.md | 1 - docs/src/learn/keeping-components-pure.md | 1 - docs/src/learn/lifecycle-of-reactive-effects.md | 1 - docs/src/learn/manipulating-the-dom-with-refs.md | 1 - docs/src/learn/passing-data-deeply-with-context.md | 1 - docs/src/learn/passing-props-to-a-component.md | 1 - docs/src/learn/preserving-and-resetting-state.md | 1 - docs/src/learn/python-in-psx-with-curly-braces.md | 1 - docs/src/learn/queueing-a-series-of-state-updates.md | 1 - docs/src/learn/react-developer-tools.md | 1 - docs/src/learn/reacting-to-input-with-state.md | 1 - docs/src/learn/referencing-values-with-refs.md | 1 - docs/src/learn/removing-effect-dependencies.md | 1 - docs/src/learn/render-and-commit.md | 1 - docs/src/learn/rendering-lists.md | 1 - docs/src/learn/responding-to-events.md | 1 - docs/src/learn/reusing-logic-with-custom-hooks.md | 1 - docs/src/learn/scaling-up-with-reducer-and-context.md | 1 - docs/src/learn/separating-events-from-effects.md | 1 - docs/src/learn/sharing-state-between-components.md | 1 - docs/src/learn/state-a-components-memory.md | 1 - docs/src/learn/state-as-a-snapshot.md | 1 - docs/src/learn/synchronizing-with-effects.md | 1 - docs/src/learn/thinking-in-react.md | 1 - docs/src/learn/tutorial-material-ui.md | 2 -- docs/src/learn/tutorial-react-bootstrap.md | 1 - docs/src/learn/tutorial-tic-tac-toe.md | 1 - docs/src/learn/updating-arrays-in-state.md | 1 - docs/src/learn/updating-objects-in-state.md | 1 - docs/src/learn/writing-markup-with-psx.md | 1 - docs/src/learn/you-might-not-need-an-effect.md | 1 - docs/src/learn/your-first-component.md | 1 - docs/src/reference/common-props.md | 1 - docs/src/reference/use-callback.md | 1 - docs/src/reference/use-context.md | 1 - docs/src/reference/use-debug-value.md | 1 - docs/src/reference/use-deferred-value.md | 1 - docs/src/reference/use-effect.md | 1 - docs/src/reference/use-id.md | 2 -- docs/src/reference/use-imperative-handle.md | 1 - docs/src/reference/use-insertion-effect.md | 1 - docs/src/reference/use-layout-effect.md | 1 - docs/src/reference/use-memo.md | 1 - docs/src/reference/use-reducer.md | 1 - docs/src/reference/use-ref.md | 1 - docs/src/reference/use-state.md | 1 - docs/src/reference/use-sync-external-store.md | 1 - docs/src/reference/use-transition.md | 1 - docs/src/static/css/extra.css | 2 +- 54 files changed, 1 insertion(+), 56 deletions(-) diff --git a/docs/src/learn/add-react-to-an-existing-project.md b/docs/src/learn/add-react-to-an-existing-project.md index 0a2c0c9c4..39b8791ad 100644 --- a/docs/src/learn/add-react-to-an-existing-project.md +++ b/docs/src/learn/add-react-to-an-existing-project.md @@ -1,4 +1,3 @@ - !!! warning "In Progress" This feature is planned, but not yet developed. diff --git a/docs/src/learn/choosing-the-state-structure.md b/docs/src/learn/choosing-the-state-structure.md index 61205cd7d..dc0395c25 100644 --- a/docs/src/learn/choosing-the-state-structure.md +++ b/docs/src/learn/choosing-the-state-structure.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/conditional-rendering.md b/docs/src/learn/conditional-rendering.md index 46a07a4bf..f30951715 100644 --- a/docs/src/learn/conditional-rendering.md +++ b/docs/src/learn/conditional-rendering.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/editor-setup.md b/docs/src/learn/editor-setup.md index 93f7139cd..b02723431 100644 --- a/docs/src/learn/editor-setup.md +++ b/docs/src/learn/editor-setup.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/extracting-state-logic-into-a-reducer.md b/docs/src/learn/extracting-state-logic-into-a-reducer.md index ad6a6f986..7e07d6c82 100644 --- a/docs/src/learn/extracting-state-logic-into-a-reducer.md +++ b/docs/src/learn/extracting-state-logic-into-a-reducer.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/importing-and-exporting-components.md b/docs/src/learn/importing-and-exporting-components.md index 3fa6723db..ce43d8fb7 100644 --- a/docs/src/learn/importing-and-exporting-components.md +++ b/docs/src/learn/importing-and-exporting-components.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/keeping-components-pure.md b/docs/src/learn/keeping-components-pure.md index c71267f2b..2d0a7388e 100644 --- a/docs/src/learn/keeping-components-pure.md +++ b/docs/src/learn/keeping-components-pure.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/lifecycle-of-reactive-effects.md b/docs/src/learn/lifecycle-of-reactive-effects.md index 3d75b698b..3f7a171e2 100644 --- a/docs/src/learn/lifecycle-of-reactive-effects.md +++ b/docs/src/learn/lifecycle-of-reactive-effects.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/manipulating-the-dom-with-refs.md b/docs/src/learn/manipulating-the-dom-with-refs.md index 6546b032d..681a6d91e 100644 --- a/docs/src/learn/manipulating-the-dom-with-refs.md +++ b/docs/src/learn/manipulating-the-dom-with-refs.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/passing-data-deeply-with-context.md b/docs/src/learn/passing-data-deeply-with-context.md index eb86d3be3..d68be8040 100644 --- a/docs/src/learn/passing-data-deeply-with-context.md +++ b/docs/src/learn/passing-data-deeply-with-context.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/passing-props-to-a-component.md b/docs/src/learn/passing-props-to-a-component.md index 7baf53498..322d589fe 100644 --- a/docs/src/learn/passing-props-to-a-component.md +++ b/docs/src/learn/passing-props-to-a-component.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/preserving-and-resetting-state.md b/docs/src/learn/preserving-and-resetting-state.md index bdb130dcd..985dd5cfe 100644 --- a/docs/src/learn/preserving-and-resetting-state.md +++ b/docs/src/learn/preserving-and-resetting-state.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/python-in-psx-with-curly-braces.md b/docs/src/learn/python-in-psx-with-curly-braces.md index 5c93883c1..364a40404 100644 --- a/docs/src/learn/python-in-psx-with-curly-braces.md +++ b/docs/src/learn/python-in-psx-with-curly-braces.md @@ -1,4 +1,3 @@ - !!! warning "In Progress" This feature is planned, but not yet developed. diff --git a/docs/src/learn/queueing-a-series-of-state-updates.md b/docs/src/learn/queueing-a-series-of-state-updates.md index cd387a663..495695787 100644 --- a/docs/src/learn/queueing-a-series-of-state-updates.md +++ b/docs/src/learn/queueing-a-series-of-state-updates.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/react-developer-tools.md b/docs/src/learn/react-developer-tools.md index a10caf229..d6a1398af 100644 --- a/docs/src/learn/react-developer-tools.md +++ b/docs/src/learn/react-developer-tools.md @@ -1,4 +1,3 @@ - !!! warning "In Progress" This feature is planned, but not yet developed. diff --git a/docs/src/learn/reacting-to-input-with-state.md b/docs/src/learn/reacting-to-input-with-state.md index 6cb2f701c..ac04c1d98 100644 --- a/docs/src/learn/reacting-to-input-with-state.md +++ b/docs/src/learn/reacting-to-input-with-state.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/referencing-values-with-refs.md b/docs/src/learn/referencing-values-with-refs.md index 9b19c46be..260812d75 100644 --- a/docs/src/learn/referencing-values-with-refs.md +++ b/docs/src/learn/referencing-values-with-refs.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/removing-effect-dependencies.md b/docs/src/learn/removing-effect-dependencies.md index 161c1276b..e94ee1346 100644 --- a/docs/src/learn/removing-effect-dependencies.md +++ b/docs/src/learn/removing-effect-dependencies.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/render-and-commit.md b/docs/src/learn/render-and-commit.md index f64da2e29..1292c1251 100644 --- a/docs/src/learn/render-and-commit.md +++ b/docs/src/learn/render-and-commit.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/rendering-lists.md b/docs/src/learn/rendering-lists.md index a4072a188..e684f4ea3 100644 --- a/docs/src/learn/rendering-lists.md +++ b/docs/src/learn/rendering-lists.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/responding-to-events.md b/docs/src/learn/responding-to-events.md index 4c12bfbbc..38eb85d51 100644 --- a/docs/src/learn/responding-to-events.md +++ b/docs/src/learn/responding-to-events.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/reusing-logic-with-custom-hooks.md b/docs/src/learn/reusing-logic-with-custom-hooks.md index 89b997add..6931158ca 100644 --- a/docs/src/learn/reusing-logic-with-custom-hooks.md +++ b/docs/src/learn/reusing-logic-with-custom-hooks.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/scaling-up-with-reducer-and-context.md b/docs/src/learn/scaling-up-with-reducer-and-context.md index a8b137a58..21239a19f 100644 --- a/docs/src/learn/scaling-up-with-reducer-and-context.md +++ b/docs/src/learn/scaling-up-with-reducer-and-context.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/separating-events-from-effects.md b/docs/src/learn/separating-events-from-effects.md index 615043240..69e69bcb3 100644 --- a/docs/src/learn/separating-events-from-effects.md +++ b/docs/src/learn/separating-events-from-effects.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/sharing-state-between-components.md b/docs/src/learn/sharing-state-between-components.md index 21cf532d5..b252d7614 100644 --- a/docs/src/learn/sharing-state-between-components.md +++ b/docs/src/learn/sharing-state-between-components.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/state-a-components-memory.md b/docs/src/learn/state-a-components-memory.md index 47f266d9e..26810a449 100644 --- a/docs/src/learn/state-a-components-memory.md +++ b/docs/src/learn/state-a-components-memory.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/state-as-a-snapshot.md b/docs/src/learn/state-as-a-snapshot.md index 57561bcb6..30894c92b 100644 --- a/docs/src/learn/state-as-a-snapshot.md +++ b/docs/src/learn/state-as-a-snapshot.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/synchronizing-with-effects.md b/docs/src/learn/synchronizing-with-effects.md index ef95da4cd..0b0dd29fb 100644 --- a/docs/src/learn/synchronizing-with-effects.md +++ b/docs/src/learn/synchronizing-with-effects.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/thinking-in-react.md b/docs/src/learn/thinking-in-react.md index fed0ec5e9..0328ed5df 100644 --- a/docs/src/learn/thinking-in-react.md +++ b/docs/src/learn/thinking-in-react.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/tutorial-material-ui.md b/docs/src/learn/tutorial-material-ui.md index 044fce7aa..2cde1ff69 100644 --- a/docs/src/learn/tutorial-material-ui.md +++ b/docs/src/learn/tutorial-material-ui.md @@ -1,5 +1,3 @@ - - !!! warning "In Progress" This tutorial is planned, but is missing a key feature before this page can be written. diff --git a/docs/src/learn/tutorial-react-bootstrap.md b/docs/src/learn/tutorial-react-bootstrap.md index 3da9db181..2cde1ff69 100644 --- a/docs/src/learn/tutorial-react-bootstrap.md +++ b/docs/src/learn/tutorial-react-bootstrap.md @@ -1,4 +1,3 @@ - !!! warning "In Progress" This tutorial is planned, but is missing a key feature before this page can be written. diff --git a/docs/src/learn/tutorial-tic-tac-toe.md b/docs/src/learn/tutorial-tic-tac-toe.md index 8c41fd0d8..49495c08e 100644 --- a/docs/src/learn/tutorial-tic-tac-toe.md +++ b/docs/src/learn/tutorial-tic-tac-toe.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/updating-arrays-in-state.md b/docs/src/learn/updating-arrays-in-state.md index abc1efc90..fe76953a3 100644 --- a/docs/src/learn/updating-arrays-in-state.md +++ b/docs/src/learn/updating-arrays-in-state.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/updating-objects-in-state.md b/docs/src/learn/updating-objects-in-state.md index 631f2f137..48591a018 100644 --- a/docs/src/learn/updating-objects-in-state.md +++ b/docs/src/learn/updating-objects-in-state.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/writing-markup-with-psx.md b/docs/src/learn/writing-markup-with-psx.md index 788630ff1..743e69f30 100644 --- a/docs/src/learn/writing-markup-with-psx.md +++ b/docs/src/learn/writing-markup-with-psx.md @@ -1,4 +1,3 @@ - !!! warning "In Progress" This feature is planned, but not yet developed. diff --git a/docs/src/learn/you-might-not-need-an-effect.md b/docs/src/learn/you-might-not-need-an-effect.md index 18996927e..60eccbffb 100644 --- a/docs/src/learn/you-might-not-need-an-effect.md +++ b/docs/src/learn/you-might-not-need-an-effect.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/learn/your-first-component.md b/docs/src/learn/your-first-component.md index eb44b0f52..9a06e6f1c 100644 --- a/docs/src/learn/your-first-component.md +++ b/docs/src/learn/your-first-component.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/reference/common-props.md b/docs/src/reference/common-props.md index 32bde6e5b..41e9048d7 100644 --- a/docs/src/reference/common-props.md +++ b/docs/src/reference/common-props.md @@ -1,4 +1,3 @@ - #### Props These special React props are supported for all built-in components: diff --git a/docs/src/reference/use-callback.md b/docs/src/reference/use-callback.md index ff4e6661b..563a1089e 100644 --- a/docs/src/reference/use-callback.md +++ b/docs/src/reference/use-callback.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/reference/use-context.md b/docs/src/reference/use-context.md index 6a9e34827..02c4294d1 100644 --- a/docs/src/reference/use-context.md +++ b/docs/src/reference/use-context.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/reference/use-debug-value.md b/docs/src/reference/use-debug-value.md index 5b3335091..37adcc537 100644 --- a/docs/src/reference/use-debug-value.md +++ b/docs/src/reference/use-debug-value.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/reference/use-deferred-value.md b/docs/src/reference/use-deferred-value.md index 82000489b..9026564ba 100644 --- a/docs/src/reference/use-deferred-value.md +++ b/docs/src/reference/use-deferred-value.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/reference/use-effect.md b/docs/src/reference/use-effect.md index 1a6802a40..c11ea69cd 100644 --- a/docs/src/reference/use-effect.md +++ b/docs/src/reference/use-effect.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/reference/use-id.md b/docs/src/reference/use-id.md index f70cd7e55..1568a8fc5 100644 --- a/docs/src/reference/use-id.md +++ b/docs/src/reference/use-id.md @@ -1,5 +1,3 @@ - - !!! warning "In Progress" This feature is planned, but not yet developed. diff --git a/docs/src/reference/use-imperative-handle.md b/docs/src/reference/use-imperative-handle.md index edfa59d83..21ffdd5b0 100644 --- a/docs/src/reference/use-imperative-handle.md +++ b/docs/src/reference/use-imperative-handle.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/reference/use-insertion-effect.md b/docs/src/reference/use-insertion-effect.md index 373a7bf7b..730408621 100644 --- a/docs/src/reference/use-insertion-effect.md +++ b/docs/src/reference/use-insertion-effect.md @@ -1,4 +1,3 @@ - <Pitfall> `useInsertionEffect` is for CSS-in-JS library authors. Unless you are working on a CSS-in-JS library and need a place to inject the styles, you probably want [`useEffect`](/reference/react/useEffect) or [`useLayoutEffect`](/reference/react/useLayoutEffect) instead. diff --git a/docs/src/reference/use-layout-effect.md b/docs/src/reference/use-layout-effect.md index fde92f88f..bfd0c6cad 100644 --- a/docs/src/reference/use-layout-effect.md +++ b/docs/src/reference/use-layout-effect.md @@ -1,4 +1,3 @@ - <Pitfall> `useLayoutEffect` can hurt performance. Prefer [`useEffect`](/reference/react/useEffect) when possible. diff --git a/docs/src/reference/use-memo.md b/docs/src/reference/use-memo.md index 7fd524555..6bbd12a10 100644 --- a/docs/src/reference/use-memo.md +++ b/docs/src/reference/use-memo.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/reference/use-reducer.md b/docs/src/reference/use-reducer.md index b9739f497..00336376f 100644 --- a/docs/src/reference/use-reducer.md +++ b/docs/src/reference/use-reducer.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/reference/use-ref.md b/docs/src/reference/use-ref.md index 931cc21a3..4cac76685 100644 --- a/docs/src/reference/use-ref.md +++ b/docs/src/reference/use-ref.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/reference/use-state.md b/docs/src/reference/use-state.md index c66538623..adf75fb0c 100644 --- a/docs/src/reference/use-state.md +++ b/docs/src/reference/use-state.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/reference/use-sync-external-store.md b/docs/src/reference/use-sync-external-store.md index bfcfbd0ae..4e23591d1 100644 --- a/docs/src/reference/use-sync-external-store.md +++ b/docs/src/reference/use-sync-external-store.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/reference/use-transition.md b/docs/src/reference/use-transition.md index a1faa0bcb..1165fe8d9 100644 --- a/docs/src/reference/use-transition.md +++ b/docs/src/reference/use-transition.md @@ -1,4 +1,3 @@ - ## Overview <p class="intro" markdown> diff --git a/docs/src/static/css/extra.css b/docs/src/static/css/extra.css index 4e060a39d..5378862b0 100644 --- a/docs/src/static/css/extra.css +++ b/docs/src/static/css/extra.css @@ -138,7 +138,7 @@ [data-md-color-scheme="slate"] .md-typeset .admonition.example code { background: transparent; - color: #FFF; + color: #fff; } /* Move the sidebars to the edges of the page */ From ab653c5e952be1a1d5ef768ca605b72d8d14e1cc Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Tue, 27 Jun 2023 03:46:09 -0700 Subject: [PATCH 37/49] Add extras section --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index bce2c9b32..7963e1842 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -12,6 +12,7 @@ nav: - Add React to an Existing Project 🚫: learn/add-react-to-an-existing-project.md - Editor Setup: learn/editor-setup.md - React Developer Tools 🚫: learn/react-developer-tools.md + - Installable Extras: learn/installable-extras.md - More Tutorials: - "Tutorial: React Bootstrap 🚫": learn/tutorial-react-bootstrap.md - "Tutorial: Material UI 🚫": learn/tutorial-material-ui.md From 64432b23c4b47803fdde4db679e0a6dd4cc384ae Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:33:39 -0700 Subject: [PATCH 38/49] Cleanup blocked pages --- docs/src/learn/add-react-to-an-existing-project.md | 2 +- docs/src/learn/extra-tools-and-packages.md | 2 ++ docs/src/learn/python-in-psx-with-curly-braces.md | 2 +- docs/src/learn/react-developer-tools.md | 3 ++- docs/src/learn/writing-markup-with-psx.md | 9 +++++---- mkdocs.yml | 2 +- 6 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 docs/src/learn/extra-tools-and-packages.md diff --git a/docs/src/learn/add-react-to-an-existing-project.md b/docs/src/learn/add-react-to-an-existing-project.md index 39b8791ad..928a38c6f 100644 --- a/docs/src/learn/add-react-to-an-existing-project.md +++ b/docs/src/learn/add-react-to-an-existing-project.md @@ -4,6 +4,7 @@ See [this issue](https://github.com/reactive-python/reactpy/issues/653) for more details. +<!-- ## Overview <p class="intro" markdown> @@ -12,7 +13,6 @@ If you want to add some interactivity to your existing project, you don't have t </p> -<!-- <Note> **You need to install [Node.js](https://nodejs.org/en/) for local development.** Although you can [try React](/learn/installation#try-react) online or with a simple HTML page, realistically most JavaScript tooling you'll want to use for development requires Node.js. diff --git a/docs/src/learn/extra-tools-and-packages.md b/docs/src/learn/extra-tools-and-packages.md new file mode 100644 index 000000000..17a619944 --- /dev/null +++ b/docs/src/learn/extra-tools-and-packages.md @@ -0,0 +1,2 @@ +- ReactPy Router +- ReactPy Flake8 diff --git a/docs/src/learn/python-in-psx-with-curly-braces.md b/docs/src/learn/python-in-psx-with-curly-braces.md index 364a40404..cbdd65cee 100644 --- a/docs/src/learn/python-in-psx-with-curly-braces.md +++ b/docs/src/learn/python-in-psx-with-curly-braces.md @@ -4,6 +4,7 @@ See [this issue](https://github.com/reactive-python/reactpy/issues/918) for more details. +<!-- ## Overview <p class="intro" markdown> @@ -19,7 +20,6 @@ JSX lets you write HTML-like markup inside a JavaScript file, keeping rendering - How to call a JavaScript function inside JSX with curly braces - How to use a JavaScript object inside JSX with curly braces -<!-- ## Passing strings with quotes When you want to pass a string attribute to JSX, you put it in single or double quotes: diff --git a/docs/src/learn/react-developer-tools.md b/docs/src/learn/react-developer-tools.md index d6a1398af..c2c47c495 100644 --- a/docs/src/learn/react-developer-tools.md +++ b/docs/src/learn/react-developer-tools.md @@ -4,6 +4,7 @@ See [this issue](https://github.com/reactive-python/reactpy/issues/1072) for more details. +<!-- ## Overview <p class="intro" markdown> @@ -16,7 +17,7 @@ Use React Developer Tools to inspect React [components](../learn/your-first-comp - How to install ReactPy Developer Tools -<!-- + ## Browser extension The easiest way to debug websites built with React is to install the React Developer Tools browser extension. It is available for several popular browsers: diff --git a/docs/src/learn/writing-markup-with-psx.md b/docs/src/learn/writing-markup-with-psx.md index 743e69f30..7ab3f08e5 100644 --- a/docs/src/learn/writing-markup-with-psx.md +++ b/docs/src/learn/writing-markup-with-psx.md @@ -4,7 +4,7 @@ See [this issue](https://github.com/reactive-python/reactpy/issues/918) for more details. -## Overview +<!-- ## Overview <p class="intro" markdown> @@ -20,14 +20,15 @@ _PSX_ is a syntax extension for JavaScript that lets you write HTML-like markup ## PSX: Putting markup into Python -The Web has been built on HTML, CSS, and JavaScript. For many years, web developers kept content in HTML, design in CSS, and logic in JavaScript—often in separate files! Content was marked up inside HTML while the page's logic lived separately in JavaScript: +The Web has been built on HTML, CSS, and JavaScript. For many years, web developers kept content in HTML, design in CSS, and logic in JavaScript—often in separate files! Content was marked up inside HTML while the page's logic lived separately in JavaScript: --> <!-- TODO: Diagram --> -But as the Web became more interactive, logic increasingly determined content. Scripting languages are now in charge of the HTML! This is why **in React, rendering logic and markup live together in the same place—components.** +<!-- But as the Web became more interactive, logic increasingly determined content. Scripting languages are now in charge of the HTML! This is why **in React, rendering logic and markup live together in the same place—components.** --> <!-- TODO: Diagram --> +<!-- Keeping a button's rendering logic and markup together ensures that they stay in sync with each other on every edit. Conversely, details that are unrelated, such as the button's markup and a sidebar's markup, are isolated from each other, making it safer to change either of them on their own. Each React component is a JavaScript function that may contain some markup that React renders into the browser. React components use a syntax extension called PSX to represent that markup. PSX looks a lot like HTML, but it is a bit stricter and can display dynamic information. The best way to understand this is to convert some HTML markup to PSX markup. @@ -36,7 +37,7 @@ Each React component is a JavaScript function that may contain some markup that PSX and ReactPy are two separate things. They're often used together, but you _can_ use them independently of each other. PSX is a syntax extension, while ReactPy is a Python library. -<!-- ## Converting HTML to PSX + ## Converting HTML to PSX Suppose that you have some (perfectly valid) HTML: diff --git a/mkdocs.yml b/mkdocs.yml index 7963e1842..92e9ab831 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -12,7 +12,7 @@ nav: - Add React to an Existing Project 🚫: learn/add-react-to-an-existing-project.md - Editor Setup: learn/editor-setup.md - React Developer Tools 🚫: learn/react-developer-tools.md - - Installable Extras: learn/installable-extras.md + - Extra Tools and Packages 🚧: learn/extra-tools-and-packages.md - More Tutorials: - "Tutorial: React Bootstrap 🚫": learn/tutorial-react-bootstrap.md - "Tutorial: Material UI 🚫": learn/tutorial-material-ui.md From 260b5e5972b99773827f70bda4e77ea406f0f068 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:40:11 -0700 Subject: [PATCH 39/49] change undeveloped warning text --- docs/src/learn/add-react-to-an-existing-project.md | 2 +- docs/src/learn/python-in-psx-with-curly-braces.md | 2 +- docs/src/learn/react-developer-tools.md | 2 +- docs/src/learn/tutorial-material-ui.md | 2 +- docs/src/learn/tutorial-react-bootstrap.md | 2 +- docs/src/learn/writing-markup-with-psx.md | 2 +- docs/src/reference/use-deferred-value.md | 6 +++++- docs/src/reference/use-id.md | 6 +++--- docs/src/reference/use-imperative-handle.md | 8 ++++++-- docs/src/reference/use-insertion-effect.md | 6 +++++- docs/src/reference/use-layout-effect.md | 6 +++++- docs/src/reference/use-sync-external-store.md | 6 +++++- docs/src/reference/use-transition.md | 6 +++++- 13 files changed, 40 insertions(+), 16 deletions(-) diff --git a/docs/src/learn/add-react-to-an-existing-project.md b/docs/src/learn/add-react-to-an-existing-project.md index 928a38c6f..a2fdb0a3d 100644 --- a/docs/src/learn/add-react-to-an-existing-project.md +++ b/docs/src/learn/add-react-to-an-existing-project.md @@ -1,4 +1,4 @@ -!!! warning "In Progress" +!!! warning "Planned / Undeveloped" This feature is planned, but not yet developed. diff --git a/docs/src/learn/python-in-psx-with-curly-braces.md b/docs/src/learn/python-in-psx-with-curly-braces.md index cbdd65cee..aa1e92529 100644 --- a/docs/src/learn/python-in-psx-with-curly-braces.md +++ b/docs/src/learn/python-in-psx-with-curly-braces.md @@ -1,4 +1,4 @@ -!!! warning "In Progress" +!!! warning "Planned / Undeveloped" This feature is planned, but not yet developed. diff --git a/docs/src/learn/react-developer-tools.md b/docs/src/learn/react-developer-tools.md index c2c47c495..d7b075705 100644 --- a/docs/src/learn/react-developer-tools.md +++ b/docs/src/learn/react-developer-tools.md @@ -1,4 +1,4 @@ -!!! warning "In Progress" +!!! warning "Planned / Undeveloped" This feature is planned, but not yet developed. diff --git a/docs/src/learn/tutorial-material-ui.md b/docs/src/learn/tutorial-material-ui.md index 2cde1ff69..a1a5d86f9 100644 --- a/docs/src/learn/tutorial-material-ui.md +++ b/docs/src/learn/tutorial-material-ui.md @@ -1,4 +1,4 @@ -!!! warning "In Progress" +!!! warning "Planned / Undeveloped" This tutorial is planned, but is missing a key feature before this page can be written. diff --git a/docs/src/learn/tutorial-react-bootstrap.md b/docs/src/learn/tutorial-react-bootstrap.md index 2cde1ff69..a1a5d86f9 100644 --- a/docs/src/learn/tutorial-react-bootstrap.md +++ b/docs/src/learn/tutorial-react-bootstrap.md @@ -1,4 +1,4 @@ -!!! warning "In Progress" +!!! warning "Planned / Undeveloped" This tutorial is planned, but is missing a key feature before this page can be written. diff --git a/docs/src/learn/writing-markup-with-psx.md b/docs/src/learn/writing-markup-with-psx.md index 7ab3f08e5..6a96023ee 100644 --- a/docs/src/learn/writing-markup-with-psx.md +++ b/docs/src/learn/writing-markup-with-psx.md @@ -1,4 +1,4 @@ -!!! warning "In Progress" +!!! warning "Planned / Undeveloped" This feature is planned, but not yet developed. diff --git a/docs/src/reference/use-deferred-value.md b/docs/src/reference/use-deferred-value.md index 9026564ba..7110f7ddd 100644 --- a/docs/src/reference/use-deferred-value.md +++ b/docs/src/reference/use-deferred-value.md @@ -1,3 +1,7 @@ +!!! warning "Planned / Undeveloped" + + This feature is planned, but not yet developed. +<!-- ## Overview <p class="intro" markdown> @@ -988,4 +992,4 @@ Also, unlike with debouncing or throttling, deferred re-renders done by `useDefe If the work you're optimizing doesn't happen during rendering, debouncing and throttling are still useful. For example, they can let you fire fewer network requests. You can also use these techniques together. -</DeepDive> +</DeepDive> --> diff --git a/docs/src/reference/use-id.md b/docs/src/reference/use-id.md index 1568a8fc5..be721c721 100644 --- a/docs/src/reference/use-id.md +++ b/docs/src/reference/use-id.md @@ -1,9 +1,9 @@ -!!! warning "In Progress" +!!! warning "Planned / Undeveloped" This feature is planned, but not yet developed. See [this issue](https://github.com/reactive-python/reactpy/issues/985) for more details. - +<!-- ## Overview <p class="intro" markdown> @@ -285,4 +285,4 @@ root2.render(<App />); input { margin: 5px; } -``` +``` --> diff --git a/docs/src/reference/use-imperative-handle.md b/docs/src/reference/use-imperative-handle.md index 21ffdd5b0..f6c227fc2 100644 --- a/docs/src/reference/use-imperative-handle.md +++ b/docs/src/reference/use-imperative-handle.md @@ -1,4 +1,8 @@ -## Overview +!!! warning "Planned / Undeveloped" + + This feature is planned, but not yet developed. + +<!-- ## Overview <p class="intro" markdown> @@ -290,4 +294,4 @@ export default AddComment; **If you can express something as a prop, you should not use a ref.** For example, instead of exposing an imperative handle like `{ open, close }` from a `Modal` component, it is better to take `isOpen` as a prop like `<Modal isOpen={isOpen} />`. [Effects](/learn/synchronizing-with-effects) can help you expose imperative behaviors via props. -</Pitfall> +</Pitfall> --> diff --git a/docs/src/reference/use-insertion-effect.md b/docs/src/reference/use-insertion-effect.md index 730408621..edc9b2a93 100644 --- a/docs/src/reference/use-insertion-effect.md +++ b/docs/src/reference/use-insertion-effect.md @@ -1,3 +1,7 @@ +!!! warning "Planned / Undeveloped" + + This feature is planned, but not yet developed. +<!-- <Pitfall> `useInsertionEffect` is for CSS-in-JS library authors. Unless you are working on a CSS-in-JS library and need a place to inject the styles, you probably want [`useEffect`](/reference/react/useEffect) or [`useLayoutEffect`](/reference/react/useLayoutEffect) instead. @@ -132,4 +136,4 @@ If you insert styles during rendering and React is processing a [non-blocking up `useInsertionEffect` is better than inserting styles during [`useLayoutEffect`](/reference/react/useLayoutEffect) or [`useEffect`](/reference/react/useEffect) because it ensures that by the time other Effects run in your components, the `<style>` tags have already been inserted. Otherwise, layout calculations in regular Effects would be wrong due to outdated styles. -</DeepDive> +</DeepDive> --> diff --git a/docs/src/reference/use-layout-effect.md b/docs/src/reference/use-layout-effect.md index bfd0c6cad..ab6b44469 100644 --- a/docs/src/reference/use-layout-effect.md +++ b/docs/src/reference/use-layout-effect.md @@ -1,3 +1,7 @@ +!!! warning "Planned / Undeveloped" + + This feature is planned, but not yet developed. +<!-- <Pitfall> `useLayoutEffect` can hurt performance. Prefer [`useEffect`](/reference/react/useEffect) when possible. @@ -683,4 +687,4 @@ However, if you're running into this problem, you have a few different options: - Alternatively, you can render a component with `useLayoutEffect` only after hydration. Keep a boolean `isMounted` state that's initialized to `false`, and set it to `true` inside a `useEffect` call. Your rendering logic can then be like `return isMounted ? <RealContent /> : <FallbackContent />`. On the server and during the hydration, the user will see `FallbackContent` which should not call `useLayoutEffect`. Then React will replace it with `RealContent` which runs on the client only and can include `useLayoutEffect` calls. -- If you synchronize your component with an external data store and rely on `useLayoutEffect` for different reasons than measuring layout, consider [`useSyncExternalStore`](/reference/react/useSyncExternalStore) instead which [supports server rendering.](/reference/react/useSyncExternalStore#adding-support-for-server-rendering) +- If you synchronize your component with an external data store and rely on `useLayoutEffect` for different reasons than measuring layout, consider [`useSyncExternalStore`](/reference/react/useSyncExternalStore) instead which [supports server rendering.](/reference/react/useSyncExternalStore#adding-support-for-server-rendering) --> diff --git a/docs/src/reference/use-sync-external-store.md b/docs/src/reference/use-sync-external-store.md index 4e23591d1..3b24dbfe8 100644 --- a/docs/src/reference/use-sync-external-store.md +++ b/docs/src/reference/use-sync-external-store.md @@ -1,3 +1,7 @@ +!!! warning "Planned / Undeveloped" + + This feature is planned, but not yet developed. +<!-- ## Overview <p class="intro" markdown> @@ -422,4 +426,4 @@ function ChatIndicator({ userId }) { // ... } -``` +``` --> diff --git a/docs/src/reference/use-transition.md b/docs/src/reference/use-transition.md index 1165fe8d9..a0930af11 100644 --- a/docs/src/reference/use-transition.md +++ b/docs/src/reference/use-transition.md @@ -1,3 +1,7 @@ +!!! warning "Planned / Undeveloped" + + This feature is planned, but not yet developed. +<!-- ## Overview <p class="intro" markdown> @@ -1580,4 +1584,4 @@ function setState() { // ... schedule an urgent state update ... } } -``` +``` --> From 1ffc0d91cbb45a4ff8511c24d78967bee79cb26d Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Wed, 12 Jul 2023 22:57:52 -0700 Subject: [PATCH 40/49] add pyscript backend --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 92e9ab831..77faa37cd 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -90,6 +90,7 @@ nav: - Django 🚧: reference/django.md - Jupyter 🚧: reference/jupyter.md - Plotly Dash 🚧: reference/plotly-dash.md + - PyScript 🚫: reference/pyscript.md - Protocol Structure 🚧: reference/protocol-structure.md - Client API 🚧: reference/client-api.md - About ReactPy: From 106a128e47f61a10f0582d2066eaa6f6c1f3d97f Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sun, 27 Aug 2023 04:17:20 -0700 Subject: [PATCH 41/49] add mike --- docs/requirements.txt | 1 + mkdocs.yml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index 612b7fe7a..0e7af6eb3 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -7,3 +7,4 @@ mkdocs-spellcheck[all] mkdocs-git-authors-plugin mkdocs-minify-plugin mkdocs-section-index +mike diff --git a/mkdocs.yml b/mkdocs.yml index 77faa37cd..e7e36fc7b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -164,6 +164,8 @@ plugins: extra: generator: false + version: + provider: mike extra_javascript: - static/js/extra.js From b505d034552a131ee14de44c2f93eb75dbd1d734 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Sun, 27 Aug 2023 04:17:28 -0700 Subject: [PATCH 42/49] sync styles to django --- docs/src/static/css/extra.css | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/src/static/css/extra.css b/docs/src/static/css/extra.css index 5378862b0..d39676668 100644 --- a/docs/src/static/css/extra.css +++ b/docs/src/static/css/extra.css @@ -24,6 +24,7 @@ /* General admonition styling */ /* TODO: Write this in a way that supports the light theme */ +[data-md-color-scheme="slate"] .md-typeset details, [data-md-color-scheme="slate"] .md-typeset .admonition { border-color: transparent !important; } @@ -36,6 +37,11 @@ font-size: 0.7rem; } +.md-typeset .admonition:focus-within, +.md-typeset details:focus-within { + box-shadow: var(--md-shadow-z1) !important; +} + /* Colors for "summary" admonition */ [data-md-color-scheme="slate"] .md-typeset .admonition.summary { background: #353a45; @@ -227,6 +233,7 @@ margin: 0; border-radius: 0 10px 10px 0; font-weight: 600; + overflow: hidden; } .md-sidebar__scrollwrap { @@ -341,15 +348,15 @@ h2#overview { } .md-typeset .tabbed-block { - border-bottom-left-radius: 16px; - border-bottom-right-radius: 16px; - border-bottom: 20px solid var(--tabbed-labels-color); + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + overflow: hidden; } .js .md-typeset .tabbed-labels { background: var(--tabbed-labels-color); - border-top-left-radius: 16px; - border-top-right-radius: 16px; + border-top-left-radius: 8px; + border-top-right-radius: 8px; } .md-typeset .tabbed-labels > label { @@ -362,3 +369,8 @@ h2#overview { .md-typeset pre > code { max-height: var(--code-max-height); } + +/* Reduce height of outdated banner */ +.md-banner__inner { + margin: 0.45rem auto; +} From c9964f6c0c943293729a5c84ac3706850044c31c Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Mon, 28 Aug 2023 01:11:22 -0700 Subject: [PATCH 43/49] Change you will learn" capitalization --- docs/src/learn/choosing-the-state-structure.md | 2 +- docs/src/learn/conditional-rendering.md | 2 +- docs/src/learn/editor-setup.md | 2 +- docs/src/learn/extracting-state-logic-into-a-reducer.md | 2 +- docs/src/learn/importing-and-exporting-components.md | 2 +- docs/src/learn/installation.md | 2 +- docs/src/learn/keeping-components-pure.md | 2 +- docs/src/learn/lifecycle-of-reactive-effects.md | 2 +- docs/src/learn/manipulating-the-dom-with-refs.md | 2 +- docs/src/learn/passing-data-deeply-with-context.md | 2 +- docs/src/learn/passing-props-to-a-component.md | 2 +- docs/src/learn/preserving-and-resetting-state.md | 2 +- docs/src/learn/python-in-psx-with-curly-braces.md | 2 +- docs/src/learn/queueing-a-series-of-state-updates.md | 2 +- docs/src/learn/quick-start.md | 2 +- docs/src/learn/react-developer-tools.md | 2 +- docs/src/learn/reacting-to-input-with-state.md | 2 +- docs/src/learn/referencing-values-with-refs.md | 2 +- docs/src/learn/removing-effect-dependencies.md | 2 +- docs/src/learn/render-and-commit.md | 2 +- docs/src/learn/rendering-lists.md | 2 +- docs/src/learn/responding-to-events.md | 2 +- docs/src/learn/reusing-logic-with-custom-hooks.md | 2 +- docs/src/learn/scaling-up-with-reducer-and-context.md | 2 +- docs/src/learn/separating-events-from-effects.md | 2 +- docs/src/learn/sharing-state-between-components.md | 2 +- docs/src/learn/state-a-components-memory.md | 2 +- docs/src/learn/state-as-a-snapshot.md | 2 +- docs/src/learn/synchronizing-with-effects.md | 2 +- docs/src/learn/updating-arrays-in-state.md | 2 +- docs/src/learn/updating-objects-in-state.md | 2 +- docs/src/learn/writing-markup-with-psx.md | 2 +- docs/src/learn/you-might-not-need-an-effect.md | 2 +- docs/src/learn/your-first-component.md | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/docs/src/learn/choosing-the-state-structure.md b/docs/src/learn/choosing-the-state-structure.md index dc0395c25..c582becee 100644 --- a/docs/src/learn/choosing-the-state-structure.md +++ b/docs/src/learn/choosing-the-state-structure.md @@ -6,7 +6,7 @@ Structuring state well can make a difference between a component that is pleasan </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - When to use a single vs multiple state variables - What to avoid when organizing state diff --git a/docs/src/learn/conditional-rendering.md b/docs/src/learn/conditional-rendering.md index f30951715..47ac5b3ef 100644 --- a/docs/src/learn/conditional-rendering.md +++ b/docs/src/learn/conditional-rendering.md @@ -6,7 +6,7 @@ Your components will often need to display different things depending on differe </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to return different JSX depending on a condition - How to conditionally include or exclude a piece of JSX diff --git a/docs/src/learn/editor-setup.md b/docs/src/learn/editor-setup.md index b02723431..e7fe53731 100644 --- a/docs/src/learn/editor-setup.md +++ b/docs/src/learn/editor-setup.md @@ -6,7 +6,7 @@ A properly configured editor can make code clearer to read and faster to write. </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - What the most popular editors are - How to format your code automatically diff --git a/docs/src/learn/extracting-state-logic-into-a-reducer.md b/docs/src/learn/extracting-state-logic-into-a-reducer.md index 7e07d6c82..bf871ac88 100644 --- a/docs/src/learn/extracting-state-logic-into-a-reducer.md +++ b/docs/src/learn/extracting-state-logic-into-a-reducer.md @@ -6,7 +6,7 @@ Components with many state updates spread across many event handlers can get ove </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - What a reducer function is - How to refactor `useState` to `useReducer` diff --git a/docs/src/learn/importing-and-exporting-components.md b/docs/src/learn/importing-and-exporting-components.md index ce43d8fb7..e69853c7b 100644 --- a/docs/src/learn/importing-and-exporting-components.md +++ b/docs/src/learn/importing-and-exporting-components.md @@ -6,7 +6,7 @@ The magic of components lies in their reusability: you can create components tha </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - What a root component file is - How to import and export a component diff --git a/docs/src/learn/installation.md b/docs/src/learn/installation.md index 53a403844..7da6f960e 100644 --- a/docs/src/learn/installation.md +++ b/docs/src/learn/installation.md @@ -6,7 +6,7 @@ React has been designed from the start for gradual adoption. You can use as litt </p> -!!! summary "You Will Learn" +!!! summary "You will learn" * [How to start a new React project](../learn/start-a-new-react-project.md) * [How to add React to an existing project](../learn/add-react-to-an-existing-project.md) diff --git a/docs/src/learn/keeping-components-pure.md b/docs/src/learn/keeping-components-pure.md index 2d0a7388e..833527bdd 100644 --- a/docs/src/learn/keeping-components-pure.md +++ b/docs/src/learn/keeping-components-pure.md @@ -6,7 +6,7 @@ Some JavaScript functions are _pure._ Pure functions only perform a calculation </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - What purity is and how it helps you avoid bugs - How to keep components pure by keeping changes out of the render phase diff --git a/docs/src/learn/lifecycle-of-reactive-effects.md b/docs/src/learn/lifecycle-of-reactive-effects.md index 3f7a171e2..9192d6ad0 100644 --- a/docs/src/learn/lifecycle-of-reactive-effects.md +++ b/docs/src/learn/lifecycle-of-reactive-effects.md @@ -6,7 +6,7 @@ Effects have a different lifecycle from components. Components may mount, update </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How an Effect's lifecycle is different from a component's lifecycle - How to think about each individual Effect in isolation diff --git a/docs/src/learn/manipulating-the-dom-with-refs.md b/docs/src/learn/manipulating-the-dom-with-refs.md index 681a6d91e..a836cae1e 100644 --- a/docs/src/learn/manipulating-the-dom-with-refs.md +++ b/docs/src/learn/manipulating-the-dom-with-refs.md @@ -6,7 +6,7 @@ React automatically updates the [DOM](https://developer.mozilla.org/docs/Web/API </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to access a DOM node managed by React with the `ref` attribute - How the `ref` JSX attribute relates to the `useRef` Hook diff --git a/docs/src/learn/passing-data-deeply-with-context.md b/docs/src/learn/passing-data-deeply-with-context.md index d68be8040..202326622 100644 --- a/docs/src/learn/passing-data-deeply-with-context.md +++ b/docs/src/learn/passing-data-deeply-with-context.md @@ -6,7 +6,7 @@ Usually, you will pass information from a parent component to a child component </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - What "prop drilling" is - How to replace repetitive prop passing with context diff --git a/docs/src/learn/passing-props-to-a-component.md b/docs/src/learn/passing-props-to-a-component.md index 322d589fe..f9f633de2 100644 --- a/docs/src/learn/passing-props-to-a-component.md +++ b/docs/src/learn/passing-props-to-a-component.md @@ -6,7 +6,7 @@ React components use _props_ to communicate with each other. Every parent compon </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to pass props to a component - How to read props from a component diff --git a/docs/src/learn/preserving-and-resetting-state.md b/docs/src/learn/preserving-and-resetting-state.md index 985dd5cfe..4a85e980a 100644 --- a/docs/src/learn/preserving-and-resetting-state.md +++ b/docs/src/learn/preserving-and-resetting-state.md @@ -6,7 +6,7 @@ State is isolated between components. React keeps track of which state belongs t </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How React "sees" component structures - When React chooses to preserve or reset the state diff --git a/docs/src/learn/python-in-psx-with-curly-braces.md b/docs/src/learn/python-in-psx-with-curly-braces.md index aa1e92529..22ab27331 100644 --- a/docs/src/learn/python-in-psx-with-curly-braces.md +++ b/docs/src/learn/python-in-psx-with-curly-braces.md @@ -13,7 +13,7 @@ JSX lets you write HTML-like markup inside a JavaScript file, keeping rendering </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to pass strings with quotes - How to reference a JavaScript variable inside JSX with curly braces diff --git a/docs/src/learn/queueing-a-series-of-state-updates.md b/docs/src/learn/queueing-a-series-of-state-updates.md index 495695787..021429428 100644 --- a/docs/src/learn/queueing-a-series-of-state-updates.md +++ b/docs/src/learn/queueing-a-series-of-state-updates.md @@ -6,7 +6,7 @@ Setting a state variable will queue another render. But sometimes you might want </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - What "batching" is and how React uses it to process multiple state updates - How to apply several updates to the same state variable in a row diff --git a/docs/src/learn/quick-start.md b/docs/src/learn/quick-start.md index a825d6b56..91e4bcf3a 100644 --- a/docs/src/learn/quick-start.md +++ b/docs/src/learn/quick-start.md @@ -6,7 +6,7 @@ Welcome to the ReactPy documentation! This page will give you an introduction to </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to create and nest components - How to add markup and styles diff --git a/docs/src/learn/react-developer-tools.md b/docs/src/learn/react-developer-tools.md index d7b075705..9d1506b12 100644 --- a/docs/src/learn/react-developer-tools.md +++ b/docs/src/learn/react-developer-tools.md @@ -13,7 +13,7 @@ Use React Developer Tools to inspect React [components](../learn/your-first-comp </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to install ReactPy Developer Tools diff --git a/docs/src/learn/reacting-to-input-with-state.md b/docs/src/learn/reacting-to-input-with-state.md index ac04c1d98..4247a88d1 100644 --- a/docs/src/learn/reacting-to-input-with-state.md +++ b/docs/src/learn/reacting-to-input-with-state.md @@ -6,7 +6,7 @@ React provides a declarative way to manipulate the UI. Instead of manipulating i </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How declarative UI programming differs from imperative UI programming - How to enumerate the different visual states your component can be in diff --git a/docs/src/learn/referencing-values-with-refs.md b/docs/src/learn/referencing-values-with-refs.md index 260812d75..d51acd757 100644 --- a/docs/src/learn/referencing-values-with-refs.md +++ b/docs/src/learn/referencing-values-with-refs.md @@ -6,7 +6,7 @@ When you want a component to "remember" some information, but you don't want tha </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to add a ref to your component - How to update a ref's value diff --git a/docs/src/learn/removing-effect-dependencies.md b/docs/src/learn/removing-effect-dependencies.md index e94ee1346..4c3a6fcc3 100644 --- a/docs/src/learn/removing-effect-dependencies.md +++ b/docs/src/learn/removing-effect-dependencies.md @@ -6,7 +6,7 @@ When you write an Effect, the linter will verify that you've included every reac </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to fix infinite Effect dependency loops - What to do when you want to remove a dependency diff --git a/docs/src/learn/render-and-commit.md b/docs/src/learn/render-and-commit.md index 1292c1251..a4bedb8e4 100644 --- a/docs/src/learn/render-and-commit.md +++ b/docs/src/learn/render-and-commit.md @@ -6,7 +6,7 @@ Before your components are displayed on screen, they must be rendered by React. </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - What rendering means in React - When and why React renders a component diff --git a/docs/src/learn/rendering-lists.md b/docs/src/learn/rendering-lists.md index e684f4ea3..115c55fe3 100644 --- a/docs/src/learn/rendering-lists.md +++ b/docs/src/learn/rendering-lists.md @@ -6,7 +6,7 @@ You will often want to display multiple similar components from a collection of </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to render components from an array using JavaScript's `map()` - How to render only specific components using JavaScript's `filter()` diff --git a/docs/src/learn/responding-to-events.md b/docs/src/learn/responding-to-events.md index 38eb85d51..c9fcb24ae 100644 --- a/docs/src/learn/responding-to-events.md +++ b/docs/src/learn/responding-to-events.md @@ -6,7 +6,7 @@ React lets you add _event handlers_ to your PSX. Event handlers are your own fun </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - Different ways to write an event handler - How to pass event handling logic from a parent component diff --git a/docs/src/learn/reusing-logic-with-custom-hooks.md b/docs/src/learn/reusing-logic-with-custom-hooks.md index 6931158ca..068398d75 100644 --- a/docs/src/learn/reusing-logic-with-custom-hooks.md +++ b/docs/src/learn/reusing-logic-with-custom-hooks.md @@ -6,7 +6,7 @@ React comes with several built-in Hooks like `useState`, `useContext`, and `useE </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - What custom Hooks are, and how to write your own - How to reuse logic between components diff --git a/docs/src/learn/scaling-up-with-reducer-and-context.md b/docs/src/learn/scaling-up-with-reducer-and-context.md index 21239a19f..805ac7f12 100644 --- a/docs/src/learn/scaling-up-with-reducer-and-context.md +++ b/docs/src/learn/scaling-up-with-reducer-and-context.md @@ -6,7 +6,7 @@ Reducers let you consolidate a component's state update logic. Context lets you </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to combine a reducer with context - How to avoid passing state and dispatch through props diff --git a/docs/src/learn/separating-events-from-effects.md b/docs/src/learn/separating-events-from-effects.md index 69e69bcb3..c17fd5dbb 100644 --- a/docs/src/learn/separating-events-from-effects.md +++ b/docs/src/learn/separating-events-from-effects.md @@ -6,7 +6,7 @@ Event handlers only re-run when you perform the same interaction again. Unlike e </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to choose between an event handler and an Effect - Why Effects are reactive, and event handlers are not diff --git a/docs/src/learn/sharing-state-between-components.md b/docs/src/learn/sharing-state-between-components.md index b252d7614..c72320935 100644 --- a/docs/src/learn/sharing-state-between-components.md +++ b/docs/src/learn/sharing-state-between-components.md @@ -6,7 +6,7 @@ Sometimes, you want the state of two components to always change together. To do </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to share state between components by lifting it up - What are controlled and uncontrolled components diff --git a/docs/src/learn/state-a-components-memory.md b/docs/src/learn/state-a-components-memory.md index 26810a449..beafe6673 100644 --- a/docs/src/learn/state-a-components-memory.md +++ b/docs/src/learn/state-a-components-memory.md @@ -6,7 +6,7 @@ Components often need to change what's on the screen as a result of an interacti </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to add a state variable with the [`useState`](/reference/react/useState) Hook - What pair of values the `useState` Hook returns diff --git a/docs/src/learn/state-as-a-snapshot.md b/docs/src/learn/state-as-a-snapshot.md index 30894c92b..9cc8f7e63 100644 --- a/docs/src/learn/state-as-a-snapshot.md +++ b/docs/src/learn/state-as-a-snapshot.md @@ -6,7 +6,7 @@ State variables might look like regular JavaScript variables that you can read a </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How setting state triggers re-renders - When and how state updates diff --git a/docs/src/learn/synchronizing-with-effects.md b/docs/src/learn/synchronizing-with-effects.md index 0b0dd29fb..96f19f6c9 100644 --- a/docs/src/learn/synchronizing-with-effects.md +++ b/docs/src/learn/synchronizing-with-effects.md @@ -6,7 +6,7 @@ Some components need to synchronize with external systems. For example, you migh </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - What Effects are - How Effects are different from events diff --git a/docs/src/learn/updating-arrays-in-state.md b/docs/src/learn/updating-arrays-in-state.md index fe76953a3..234b8b879 100644 --- a/docs/src/learn/updating-arrays-in-state.md +++ b/docs/src/learn/updating-arrays-in-state.md @@ -6,7 +6,7 @@ Arrays are mutable in JavaScript, but you should treat them as immutable when yo </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to add, remove, or change items in an array in React state - How to update an object inside of an array diff --git a/docs/src/learn/updating-objects-in-state.md b/docs/src/learn/updating-objects-in-state.md index 48591a018..5603b50fa 100644 --- a/docs/src/learn/updating-objects-in-state.md +++ b/docs/src/learn/updating-objects-in-state.md @@ -6,7 +6,7 @@ State can hold any kind of JavaScript value, including objects. But you shouldn' </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - How to correctly update an object in React state - How to update a nested object without mutating it diff --git a/docs/src/learn/writing-markup-with-psx.md b/docs/src/learn/writing-markup-with-psx.md index 6a96023ee..92e4d4b9c 100644 --- a/docs/src/learn/writing-markup-with-psx.md +++ b/docs/src/learn/writing-markup-with-psx.md @@ -12,7 +12,7 @@ _PSX_ is a syntax extension for JavaScript that lets you write HTML-like markup </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - Why React mixes markup with rendering logic - How PSX is different from HTML diff --git a/docs/src/learn/you-might-not-need-an-effect.md b/docs/src/learn/you-might-not-need-an-effect.md index 60eccbffb..4652076d8 100644 --- a/docs/src/learn/you-might-not-need-an-effect.md +++ b/docs/src/learn/you-might-not-need-an-effect.md @@ -6,7 +6,7 @@ Effects are an escape hatch from the React paradigm. They let you "step outside" </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - Why and how to remove unnecessary Effects from your components - How to cache expensive computations without Effects diff --git a/docs/src/learn/your-first-component.md b/docs/src/learn/your-first-component.md index 9a06e6f1c..1ad627d16 100644 --- a/docs/src/learn/your-first-component.md +++ b/docs/src/learn/your-first-component.md @@ -6,7 +6,7 @@ _Components_ are one of the core concepts of React. They are the foundation upon </p> -!!! summary "You Will Learn" +!!! summary "You will learn" - What a component is - What role components play in a React application From 5ed1300fd05d81d9df650f77713a7aefce004b40 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 5 Jan 2024 01:55:55 -0800 Subject: [PATCH 44/49] Change note to abstract --- docs/src/learn/editor-setup.md | 2 +- docs/src/learn/start-a-new-react-project.md | 2 +- docs/src/learn/tutorial-tic-tac-toe.md | 4 ++-- docs/src/learn/writing-markup-with-psx.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/src/learn/editor-setup.md b/docs/src/learn/editor-setup.md index e7fe53731..052f16663 100644 --- a/docs/src/learn/editor-setup.md +++ b/docs/src/learn/editor-setup.md @@ -65,6 +65,6 @@ Ideally, you should format your code on every save. VS Code has settings for thi 4. In the search bar, type "format on save" 5. Be sure the "format on save" option is ticked! -!!! note +!!! abstract "Note" If your ESLint preset has formatting rules, they may conflict with Prettier. We recommend disabling all formatting rules in your ESLint preset using [`eslint-config-prettier`](https://github.com/prettier/eslint-config-prettier) so that ESLint is _only_ used for catching logical mistakes. If you want to enforce that files are formatted before a pull request is merged, use [`prettier --check`](https://prettier.io/docs/en/cli.html#--check) for your continuous integration. diff --git a/docs/src/learn/start-a-new-react-project.md b/docs/src/learn/start-a-new-react-project.md index 23f9cb1d5..490698fab 100644 --- a/docs/src/learn/start-a-new-react-project.md +++ b/docs/src/learn/start-a-new-react-project.md @@ -10,7 +10,7 @@ If you want to build a new app or a new website fully with ReactPy, we recommend <!-- FIXME: This is reliant on https://github.com/reactive-python/reactpy/issues/1071 --> -!!! note +!!! abstract "Note" Some of our backend frameworks are considered _built-in_, meaning that compatibility for these backends are contained within `reactpy.backend.*`. diff --git a/docs/src/learn/tutorial-tic-tac-toe.md b/docs/src/learn/tutorial-tic-tac-toe.md index 49495c08e..218fec5de 100644 --- a/docs/src/learn/tutorial-tic-tac-toe.md +++ b/docs/src/learn/tutorial-tic-tac-toe.md @@ -6,7 +6,7 @@ You will build a small tic-tac-toe game during this tutorial. This tutorial does </p> -!!! note +!!! abstract "Note" This tutorial is designed for people who prefer to **learn by doing** and want to quickly try making something tangible. If you prefer learning each concept step by step, start with [Describing the UI.](./your-first-component.md) @@ -71,7 +71,7 @@ In the code example below, click **Run** to open the editor in a new tab using t # TODO ``` -!!! note +!!! abstract "Note" You can also follow this tutorial using your local development environment. To do this, you need to: diff --git a/docs/src/learn/writing-markup-with-psx.md b/docs/src/learn/writing-markup-with-psx.md index 92e4d4b9c..292ba4c6c 100644 --- a/docs/src/learn/writing-markup-with-psx.md +++ b/docs/src/learn/writing-markup-with-psx.md @@ -33,7 +33,7 @@ Keeping a button's rendering logic and markup together ensures that they stay in Each React component is a JavaScript function that may contain some markup that React renders into the browser. React components use a syntax extension called PSX to represent that markup. PSX looks a lot like HTML, but it is a bit stricter and can display dynamic information. The best way to understand this is to convert some HTML markup to PSX markup. -!!! note +!!! abstract "Note" PSX and ReactPy are two separate things. They're often used together, but you _can_ use them independently of each other. PSX is a syntax extension, while ReactPy is a Python library. From 0a36534ee575214f91af5a72c52e6680d645b2f2 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 5 Jan 2024 01:56:33 -0800 Subject: [PATCH 45/49] html can now return none --- docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py b/docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py index 29781a321..eef970924 100644 --- a/docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py +++ b/docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py @@ -7,18 +7,19 @@ def square(value, on_square_click): return html.button( {"className": "square", "on_click": on_square_click}, - value or "", + value, ) @component def board(x_is_next, squares, on_play): - def handle_click(i): def handle_click_event(_event): - """Due to a quirk of Python, if your event handler needs args other than + """ + Due to a quirk of Python, if your event handler needs args other than `event`, you will need to create a wrapper function as seen above. - Ref: https://pylint.readthedocs.io/en/stable/user_guide/messages/warning/cell-var-from-loop.html""" + Ref: https://pylint.readthedocs.io/en/stable/user_guide/messages/warning/cell-var-from-loop.html + """ if calculate_winner(squares) or squares[i]: return From 2bef10db81e4080c985784bc3d9f26682abc56a5 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 14 Mar 2025 01:39:33 -0700 Subject: [PATCH 46/49] unbork large portions of the theme --- .editorconfig | 35 ++ .github/workflows/publish-docs.yml | 2 +- .gitignore | 12 +- CHANGELOG.md | 174 +------- LICENSE | 21 - LICENSE.md | 9 + mkdocs.yml => docs/mkdocs.yml | 87 ++-- docs/overrides/home.html | 135 +++++++ .../homepage_examples/add_interactivity.py | 29 ++ .../add_interactivity_demo.html | 172 ++++++++ .../homepage_examples/code_block.html | 7 + .../create_user_interfaces.py | 21 + .../create_user_interfaces_demo.html | 24 ++ .../write_components_with_python.py | 19 + .../write_components_with_python_demo.html | 65 +++ docs/overrides/main.html | 7 + docs/requirements.txt | 8 +- docs/src/about/changelog.md | 7 +- docs/src/assets/css/admonition.css | 160 ++++++++ docs/src/assets/css/banner.css | 15 + docs/src/assets/css/button.css | 41 ++ docs/src/assets/css/code.css | 111 ++++++ docs/src/assets/css/footer.css | 33 ++ docs/src/assets/css/home.css | 335 ++++++++++++++++ docs/src/assets/css/main.css | 85 ++++ docs/src/assets/css/navbar.css | 185 +++++++++ docs/src/assets/css/sidebar.css | 104 +++++ docs/src/assets/css/table-of-contents.css | 48 +++ docs/src/assets/images/add-interactivity.png | Bin 0 -> 22900 bytes .../assets/images/create-user-interfaces.png | Bin 0 -> 12427 bytes .../images/s_thinking-in-react_ui.png | Bin .../images/s_thinking-in-react_ui_outline.png | Bin .../images/write-components-with-python.png | Bin 0 -> 16519 bytes .../{static/js/extra.js => assets/js/main.js} | 0 docs/src/index.md | 53 +-- docs/src/static/css/extra.css | 376 ------------------ 36 files changed, 1723 insertions(+), 657 deletions(-) create mode 100644 .editorconfig delete mode 100644 LICENSE create mode 100644 LICENSE.md rename mkdocs.yml => docs/mkdocs.yml (77%) create mode 100644 docs/overrides/home.html create mode 100644 docs/overrides/homepage_examples/add_interactivity.py create mode 100644 docs/overrides/homepage_examples/add_interactivity_demo.html create mode 100644 docs/overrides/homepage_examples/code_block.html create mode 100644 docs/overrides/homepage_examples/create_user_interfaces.py create mode 100644 docs/overrides/homepage_examples/create_user_interfaces_demo.html create mode 100644 docs/overrides/homepage_examples/write_components_with_python.py create mode 100644 docs/overrides/homepage_examples/write_components_with_python_demo.html create mode 100644 docs/src/assets/css/admonition.css create mode 100644 docs/src/assets/css/banner.css create mode 100644 docs/src/assets/css/button.css create mode 100644 docs/src/assets/css/code.css create mode 100644 docs/src/assets/css/footer.css create mode 100644 docs/src/assets/css/home.css create mode 100644 docs/src/assets/css/main.css create mode 100644 docs/src/assets/css/navbar.css create mode 100644 docs/src/assets/css/sidebar.css create mode 100644 docs/src/assets/css/table-of-contents.css create mode 100644 docs/src/assets/images/add-interactivity.png create mode 100644 docs/src/assets/images/create-user-interfaces.png rename docs/src/{static => assets}/images/s_thinking-in-react_ui.png (100%) rename docs/src/{static => assets}/images/s_thinking-in-react_ui_outline.png (100%) create mode 100644 docs/src/assets/images/write-components-with-python.png rename docs/src/{static/js/extra.js => assets/js/main.js} (100%) delete mode 100644 docs/src/static/css/extra.css diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..094c32693 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,35 @@ +# http://editorconfig.org + +root = true + +[*] +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 +end_of_line = lf + +[*.py] +indent_size = 4 +max_line_length = 120 + +[*.md] +indent_size = 4 + +[*.yml] +indent_size = 4 + +[*.html] +max_line_length = off + +[*.js] +max_line_length = off + +[*.css] +indent_size = 4 +max_line_length = off + +# Tests can violate line width restrictions in the interest of clarity. +[**/test_*.py] +max_line_length = off diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 69342c994..199bc1766 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -14,4 +14,4 @@ jobs: with: python-version: 3.x - run: pip install -r docs/requirements.txt - - run: mkdocs gh-deploy --force + - run: cd docs && mkdocs gh-deploy --force diff --git a/.gitignore b/.gitignore index 20c041e11..788d5a329 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ +# --- Build Artifacts --- +src/reactpy/static/index.js* +src/reactpy/static/morphdom/ +src/reactpy/static/pyscript/ + # --- Jupyter --- *.ipynb_checkpoints *Untitled*.ipynb @@ -11,8 +16,9 @@ .jupyter # --- Python --- -.venv -venv +.hatch +.venv* +venv* MANIFEST build dist @@ -28,6 +34,7 @@ pip-wheel-metadata .python-version # -- Python Tests --- +.coverage.* *.coverage *.pytest_cache *.mypy_cache @@ -38,4 +45,3 @@ pip-wheel-metadata # --- JS --- node_modules - diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ae0eb0af..d7bd784cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,176 +24,4 @@ Using the following categories, list your changes in this order: - Nothing (yet) -## [2.2.0] - 2022-12-28 - -### Added - -- Add `options: QueryOptions` parameter to `use_query` to allow for configuration of this hook. - -### Changed - -- By default, `use_query` will recursively prefetch all many-to-many or many-to-one relationships to prevent `SynchronousOnlyOperation` exceptions. - -### Removed - -- `django_idom.hooks._fetch_lazy_fields` has been deleted. The equivalent replacement is `django_idom.utils.django_query_postprocessor`. - -## [2.1.0] - 2022-11-01 - -### Changed - -- Minimum `channels` version is now `4.0.0`. - -### Fixed - -- Change type hint on `view_to_component` callable to have `request` argument be optional. -- Change type hint on `view_to_component` to represent it as a decorator with parenthesis (such as `@view_to_component(compatibility=True)`) - -### Security - -- Add note to docs about potential information exposure via `view_to_component` when using `compatibility=True`. - -## [2.0.1] - 2022-10-18 - -### Fixed - -- Ability to use `key=...` parameter on all prefabricated components. - -## [2.0.0] - 2022-10-17 - -### Added - -- `use_origin` hook for returning the browser's `location.origin`. - -### Changed - -- `view_to_component` now returns a `Callable`, instead of directly returning a `Component`. Check the docs for new usage info. -- `use_mutation` and `use_query` will now log any query failures. - -### Fixed - -- Allow `use_mutation` to have `refetch=None`, as the docs suggest is possible. -- `use_query` will now prefetch all fields to prevent `SynchronousOnlyOperation` exceptions. -- `view_to_component`, `django_css`, and `django_js` type hints will now display like normal functions. -- IDOM preloader no longer attempts to parse commented out IDOM components. -- Tests are now fully functional on Windows - -## [1.2.0] - 2022-09-19 - -### Added - -- `auth_required` decorator to prevent your components from rendering to unauthenticated users. -- `use_query` hook for fetching database values. -- `use_mutation` hook for modifying database values. -- `view_to_component` utility to convert legacy Django views to IDOM components. - -### Changed - -- Bumped the minimum IDOM version to 0.40.2 -- Testing suite now uses `playwright` instead of `selenium` - -### Fixed - -- IDOM preloader is no longer sensitive to whitespace within template tags. - -## [1.1.0] - 2022-07-01 - -### Added - -- `django_css` and `django_js` components to defer loading CSS & JS files until needed. - -### Changed - -- Bumped the minimum IDOM version to 0.39.0 - -## [1.0.0] - 2022-05-22 - -### Added - -- Django-specific hooks! `use_websocket`, `use_scope`, and `use_location` are now available within the `django_idom.hooks` module. -- Documentation has been placed into a formal docs webpage. -- Logging for when a component fails to import, or if no components were found within Django. - -### Changed - -- `idom_component` template tag has been renamed to `component` -- Bumped the minimum IDOM version to 0.38.0 - -### Removed - -- `websocket` parameter for components has been removed. Functionally, it is replaced with `django_idom.hooks.use_websocket`. - -## [0.0.5] - 2022-04-04 - -### Changed - -- Bumped the minimum IDOM version to 0.37.2 - -### Fixed - -- ModuleNotFoundError: No module named `idom.core.proto` caused by IDOM 0.37.2 - -## [0.0.4] - 2022-03-05 - -### Changed - -- Bumped the minimum IDOM version to 0.37.1 - -## [0.0.3] - 2022-02-19 - -### Changed - -- Bumped the minimum IDOM version to 0.36.3 - -## [0.0.2] - 2022-01-30 - -### Added - -- Ability to declare the HTML class of the top-level component `div` -- `name = ...` parameter to IDOM HTTP paths for use with `django.urls.reverse()` -- Cache versioning to automatically invalidate old web module files from the cache back-end -- Automatic pre-population of the IDOM component registry -- Type hinting for `IdomWebsocket` - -### Changed - -- Fetching web modules from disk and/or cache is now fully async -- Static files are now contained within a `django_idom/` parent folder -- Upgraded IDOM to version `0.36.0` -- Minimum Django version required is now `4.0` -- Minimum Python version required is now `3.8` - -### Removed - -- `IDOM_WEB_MODULES_PATH` has been replaced with Django `include(...)` -- `IDOM_WS_MAX_RECONNECT_DELAY` has been renamed to `IDOM_WS_MAX_RECONNECT_TIMEOUT` -- `idom_web_modules` cache back-end has been renamed to `idom` - -### Fixed - -- Increase test timeout values to prevent false positives -- Windows compatibility for building Django-IDOM - -### Security - -- Fixed potential directory traversal attack on the IDOM web modules URL - -## [0.0.1] - 2021-08-18 - -### Added - -- Support for IDOM within the Django - -[unreleased]: https://github.com/idom-team/django-idom/compare/2.2.0...HEAD -[2.2.0]: https://github.com/idom-team/django-idom/compare/2.1.0...2.2.0 -[2.1.0]: https://github.com/idom-team/django-idom/compare/2.0.1...2.1.0 -[2.0.1]: https://github.com/idom-team/django-idom/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/idom-team/django-idom/compare/1.2.0...2.0.0 -[1.2.0]: https://github.com/idom-team/django-idom/compare/1.1.0...1.2.0 -[1.1.0]: https://github.com/idom-team/django-idom/compare/1.0.0...1.1.0 -[1.0.0]: https://github.com/idom-team/django-idom/compare/0.0.5...1.0.0 -[0.0.5]: https://github.com/idom-team/django-idom/compare/0.0.4...0.0.5 -[0.0.4]: https://github.com/idom-team/django-idom/compare/0.0.3...0.0.4 -[0.0.3]: https://github.com/idom-team/django-idom/compare/0.0.2...0.0.3 -[0.0.2]: https://github.com/idom-team/django-idom/compare/0.0.1...0.0.2 -[0.0.1]: https://github.com/idom-team/django-idom/releases/tag/0.0.1 +[unreleased]: https://github.com/reactive-python/reactpy/compare/1.0.0...HEAD diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 5caf76c93..000000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2019-2022 Ryan S. Morshead - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 000000000..f5423c3d3 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,9 @@ +## The MIT License (MIT) + +#### Copyright (c) Reactive Python and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/mkdocs.yml b/docs/mkdocs.yml similarity index 77% rename from mkdocs.yml rename to docs/mkdocs.yml index e7e36fc7b..082b77b01 100644 --- a/mkdocs.yml +++ b/docs/mkdocs.yml @@ -102,28 +102,33 @@ nav: theme: name: material - custom_dir: docs/overrides + custom_dir: overrides palette: - media: "(prefers-color-scheme: dark)" scheme: slate toggle: icon: material/white-balance-sunny name: Switch to light mode - primary: light blue - accent: light blue + primary: red # We use red to indicate that something is unthemed + accent: red - media: "(prefers-color-scheme: light)" scheme: default toggle: icon: material/weather-night name: Switch to dark mode - primary: black + primary: white + accent: red features: - navigation.instant - navigation.tabs + - navigation.tabs.sticky - navigation.top - content.code.copy + - search.highlight icon: repo: fontawesome/brands/github + admonition: + note: fontawesome/solid/note-sticky logo: https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg favicon: https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg @@ -131,8 +136,8 @@ markdown_extensions: - toc: permalink: true - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg - pymdownx.tabbed: alternate_style: true - pymdownx.highlight: @@ -148,19 +153,41 @@ markdown_extensions: plugins: - search - include-markdown - - section-index - # - git-authors - # - minify: - # minify_html: true - # minify_js: true - # minify_css: true - # cache_safe: true - # - git-revision-date-localized: - # fallback_to_build_date: true + - git-authors + # - section-index + - minify: + minify_html: true + minify_js: true + minify_css: true + cache_safe: true + - git-revision-date-localized: + fallback_to_build_date: true # - spellcheck: # known_words: dictionary.txt # allow_unicode: no - # ignore_code: yes + - mkdocstrings: + default_handler: python + handlers: + python: + paths: ["../"] + import: + - https://installer.readthedocs.io/en/stable/objects.inv + options: + signature_crossrefs: true + scoped_crossrefs: true + relative_crossrefs: true + modernize_annotations: true + unwrap_annotated: true + find_stubs_package: true + show_root_members_full_path: true + show_bases: false + show_source: false + show_root_toc_entry: false + show_labels: false + show_symbol_type_toc: true + show_symbol_type_heading: true + show_object_full_path: true + heading_level: 3 extra: generator: false @@ -168,23 +195,33 @@ extra: provider: mike extra_javascript: - - static/js/extra.js + - assets/js/main.js extra_css: - - static/css/extra.css + - assets/css/main.css + - assets/css/button.css + - assets/css/admonition.css + - assets/css/banner.css + - assets/css/sidebar.css + - assets/css/navbar.css + - assets/css/table-of-contents.css + - assets/css/code.css + - assets/css/footer.css + - assets/css/home.css watch: - - docs - - mkdocs.yml - - README.md - - CHANGELOG.md + - "../docs" + - ../README.md + - ../CHANGELOG.md + - ../LICENSE.md + - "../src" site_name: ReactPy site_author: Archmonger site_description: It's React, but in Python. -copyright: Copyright © 2023 Reactive Python +copyright: '©<div id="year"> </div> <script> document.getElementById("year").innerHTML = new Date().getFullYear(); </script>Reactive Python and affiliates.<div class="legal-footer-right">This project has no affiliation to ReactJS or Meta Platforms, Inc.</div>' repo_url: https://github.com/reactive-python/reactpy site_url: https://reactive-python.github.io/reactpy -repo_name: reactive-python/reactpy +repo_name: ReactPy edit_uri: edit/main/docs/src -docs_dir: docs/src +docs_dir: src diff --git a/docs/overrides/home.html b/docs/overrides/home.html new file mode 100644 index 000000000..1357184f1 --- /dev/null +++ b/docs/overrides/home.html @@ -0,0 +1,135 @@ +<!-- TODO: Use markdown code blocks whenever mkdocs starts supported markdown embeds --> +{% extends "main.html" %} + +<!-- Set the content block to empty --> +{% block content %}{% endblock %} + +<!-- Override the tabs block to create the homepage --> +{% block tabs %} +<style> + /* Variables */ + [data-md-color-scheme="slate"] { + --row-stripe-bg-color: conic-gradient(from 90deg at -10% 100%, + #2b303b 0deg, + #2b303b 90deg, + #16181d 1turn); + --row-bg-color: conic-gradient(from -90deg at 110% 100%, #2b303b 0deg, #16181d 90deg, #16181d 1turn); + --stripe-border-color: rgba(246, 247, 249, 0.1); + --code-block-filter: none; + --home-tabbed-set-bg-color: #1f1f1f; + } + + [data-md-color-scheme="default"] { + --row-stripe-bg-color: conic-gradient(from 90deg at -10% 100%, + #bcc1cd 0deg, + #bcc1cd 90deg, + #fff 1turn); + --row-bg-color: var(--row-stripe-bg-color); + --stripe-border-color: rgba(35, 39, 47, 0.1); + --code-block-filter: invert(1) contrast(1.3) hue-rotate(180deg) saturate(2); + --code-tab-color: rgb(246 247 249); + --home-tabbed-set-bg-color: #fff; + } + + /* Application header should be static for the landing page */ + .md-header { + position: initial; + } + + /* Hide markdown area */ + .md-main__inner { + margin: 0; + } + + .md-content { + display: none; + } +</style> +<section class="home md-typeset"> + <div class="row first"> + <img src="https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg" + alt="ReactPy Logo" class="home-logo"> + <h1>{{ config.site_name }}</h1> + <p>{{ config.site_description }}</p> + <div class="home-btns"> + <a href="{{ page.next_page.url | url }}" class="md-button md-button--primary"> + Get Started + </a> + <a href="{{ 'reference/components/' | url }}" class="md-button"> + API Reference + </a> + <a href="{{ 'about/changelog/' | url }}" class="md-button"> + Changelog + </a> + </div> + </div> + + <div class="row stripe"> + <h1>Create user interfaces from components</h1> + <p class="md-grid"> + ReactPy lets you build user interfaces out of individual pieces called components. Create your own ReactPy + components like <code>thumbnail</code>, <code>like_button</code>, and <code>video</code>. Then combine + them into entire screens, pages, and apps. + </p> + <div class="example-container"> + {% with image="create-user-interfaces.png", class="pop-left" %} + {% include "homepage_examples/code_block.html" %} + {% endwith %} + {% include "homepage_examples/create_user_interfaces_demo.html" %} + </div> + <p> + Whether you work on your own or with thousands of other developers, using React feels the same. It is + designed to let you seamlessly combine components written by independent people, teams, and + organizations. + </p> + </div> + + <div class="row"> + <h1>Write components with pure Python code</h1> + <p> + ReactPy components are Python functions. Want to show some content conditionally? Use an + <code>if</code> statement. Displaying a list? Try using + <a href="https://www.w3schools.com/python/python_lists_comprehension.asp">list comprehension</a>. + Learning ReactPy is learning programming. + </p> + <div class="example-container"> + {% with image="write-components-with-python.png", class="pop-left" %} + {% include "homepage_examples/code_block.html" %} + {% endwith %} + {% include "homepage_examples/write_components_with_python_demo.html" %} + + </div> + </div> + + <div class="row stripe"> + <h1>Add interactivity wherever you need it</h1> + <p> + ReactPy components receive data and return what should appear on the screen. You can pass them new data in + response to an interaction, like when the user types into an input. ReactPy will then update the screen to + match the new data. + </p> + <div class="example-container"> + {% with image="add-interactivity.png" %} + {% include "homepage_examples/code_block.html" %} + {% endwith %} + {% include "homepage_examples/add_interactivity_demo.html" %} + </div> + <p> + You don't have to build your whole page in ReactPy. Add React to your existing HTML page, and render + interactive ReactPy components anywhere on it. + </p> + </div> + + <div class="row"> + <h1>Go full-stack with a framework</h1> + <p> + ReactPy is a library. It lets you put components together, but it doesn't prescribe how to do routing and + data fetching. To build an entire app with ReactPy, we recommend a backend framework like + <a href="https://www.djangoproject.com/">Django</a> or <a href="https://fastapi.tiangolo.com/">FastAPI</a>. + </p> + <a href="{{ page.next_page.url | url }}" class="md-button md-button--primary"> + Get Started + </a> + </div> +</section> +{% endblock %} diff --git a/docs/overrides/homepage_examples/add_interactivity.py b/docs/overrides/homepage_examples/add_interactivity.py new file mode 100644 index 000000000..9a7bf76f1 --- /dev/null +++ b/docs/overrides/homepage_examples/add_interactivity.py @@ -0,0 +1,29 @@ +# ruff: noqa: INP001 +from reactpy import component, html, use_state + + +def filter_videos(*_, **__): + return [] + + +def search_input(*_, **__): ... + + +def video_list(*_, **__): ... + + +@component +def searchable_video_list(videos): + search_text, set_search_text = use_state("") + found_videos = filter_videos(videos, search_text) + + return html._( + search_input( + {"onChange": lambda event: set_search_text(event["target"]["value"])}, + value=search_text, + ), + video_list( + videos=found_videos, + empty_heading=f"No matches for “{search_text}”", + ), + ) diff --git a/docs/overrides/homepage_examples/add_interactivity_demo.html b/docs/overrides/homepage_examples/add_interactivity_demo.html new file mode 100644 index 000000000..ec8c1e4db --- /dev/null +++ b/docs/overrides/homepage_examples/add_interactivity_demo.html @@ -0,0 +1,172 @@ +<div class="demo pop-right"> + <div class="white-bg"> + + <div class="browser-navbar"> + <div class="browser-nav-url"> + <svg class="text-tertiary me-1 opacity-60" width="12" height="12" viewBox="0 0 44 44" fill="none" + xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M22 4C17.0294 4 13 8.0294 13 13V16H12.3103C10.5296 16 8.8601 16.8343 8.2855 18.5198C7.6489 20.387 7 23.4148 7 28C7 32.5852 7.6489 35.613 8.2855 37.4802C8.8601 39.1657 10.5296 40 12.3102 40H31.6897C33.4704 40 35.1399 39.1657 35.7145 37.4802C36.3511 35.613 37 32.5852 37 28C37 23.4148 36.3511 20.387 35.7145 18.5198C35.1399 16.8343 33.4704 16 31.6897 16H31V13C31 8.0294 26.9706 4 22 4ZM25 16V13C25 11.3431 23.6569 10 22 10C20.3431 10 19 11.3431 19 13V16H25Z" + fill="currentColor"></path> + </svg> + example.com/videos.html + </div> + </div> + + <div class="browser-viewport"> + <div class="search-header"> + <h1>Searchable Videos</h1> + <p>Type a search query below.</p> + <div class="search-bar"> + <svg width="1em" height="1em" viewBox="0 0 20 20" class="text-gray-30 w-4"> + <path + d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" + stroke="currentColor" fill="none" stroke-width="2" fill-rule="evenodd" stroke-linecap="round" + stroke-linejoin="round"></path> + </svg> + <input type="text" placeholder="Search"> + </div> + </div> + + <h2>5 Videos</h2> + + <div class="vid-row"> + <div class="vid-thumbnail"> + <svg width="36" height="36" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M36 69C54.2254 69 69 54.2254 69 36C69 17.7746 54.2254 3 36 3C17.7746 3 3 17.7746 3 36C3 54.2254 17.7746 69 36 69ZM52.1716 38.6337L28.4366 51.5801C26.4374 52.6705 24 51.2235 24 48.9464V23.0536C24 20.7764 26.4374 19.3295 28.4366 20.4199L52.1716 33.3663C54.2562 34.5034 54.2562 37.4966 52.1716 38.6337Z" + fill="rgb(123 123 123 / 50%)"></path> + </svg> + </div> + <div class="vid-text"> + <h3>ReactPy: The Documentary</h3> + <p>From web library to taco delivery service</p> + </div> + <button class="like-btn"> + <svg width="34" height="34" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path + d="m12 5.184-.808-.771-.004-.004C11.065 4.299 8.522 2.003 6 2.003c-3.736 0-6 2.558-6 6.677 0 4.47 5.471 9.848 10 13.079.602.43 1.187.82 1.74 1.167A.497.497 0 0 0 12 23v-.003c.09 0 .182-.026.26-.074C16.977 19.97 24 13.737 24 8.677 24 4.557 21.743 2 18 2c-2.569 0-5.166 2.387-5.192 2.413L12 5.184zm-.002 15.525c2.071-1.388 4.477-3.342 6.427-5.47C20.72 12.733 22 10.401 22 8.677c0-1.708-.466-2.855-1.087-3.55C20.316 4.459 19.392 4 18 4c-.726 0-1.63.364-2.5.9-.67.412-1.148.82-1.266.92-.03.025-.037.031-.019.014l-.013.013L12 7.949 9.832 5.88a10.08 10.08 0 0 0-1.33-.977C7.633 4.367 6.728 4.003 6 4.003c-1.388 0-2.312.459-2.91 1.128C2.466 5.826 2 6.974 2 8.68c0 1.726 1.28 4.058 3.575 6.563 1.948 2.127 4.352 4.078 6.423 5.466z" + fill="black" fill-rule="evenodd" clip-rule="evenodd" onclick="t"></path> + </svg> + </button> + </div> + + <div class="vid-row"> + <div class="vid-thumbnail"> + <svg width="36" height="36" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M36 69C54.2254 69 69 54.2254 69 36C69 17.7746 54.2254 3 36 3C17.7746 3 3 17.7746 3 36C3 54.2254 17.7746 69 36 69ZM52.1716 38.6337L28.4366 51.5801C26.4374 52.6705 24 51.2235 24 48.9464V23.0536C24 20.7764 26.4374 19.3295 28.4366 20.4199L52.1716 33.3663C54.2562 34.5034 54.2562 37.4966 52.1716 38.6337Z" + fill="rgb(123 123 123 / 50%)"></path> + </svg> + </div> + <div class="vid-text"> + <h3>Code using Worst Practices</h3> + <p>Harriet Potter (2013)</p> + </div> + <button class="like-btn"> + <svg width="34" height="34" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path + d="m12 5.184-.808-.771-.004-.004C11.065 4.299 8.522 2.003 6 2.003c-3.736 0-6 2.558-6 6.677 0 4.47 5.471 9.848 10 13.079.602.43 1.187.82 1.74 1.167A.497.497 0 0 0 12 23v-.003c.09 0 .182-.026.26-.074C16.977 19.97 24 13.737 24 8.677 24 4.557 21.743 2 18 2c-2.569 0-5.166 2.387-5.192 2.413L12 5.184zm-.002 15.525c2.071-1.388 4.477-3.342 6.427-5.47C20.72 12.733 22 10.401 22 8.677c0-1.708-.466-2.855-1.087-3.55C20.316 4.459 19.392 4 18 4c-.726 0-1.63.364-2.5.9-.67.412-1.148.82-1.266.92-.03.025-.037.031-.019.014l-.013.013L12 7.949 9.832 5.88a10.08 10.08 0 0 0-1.33-.977C7.633 4.367 6.728 4.003 6 4.003c-1.388 0-2.312.459-2.91 1.128C2.466 5.826 2 6.974 2 8.68c0 1.726 1.28 4.058 3.575 6.563 1.948 2.127 4.352 4.078 6.423 5.466z" + fill="black" fill-rule="evenodd" clip-rule="evenodd" onclick="t"></path> + </svg> + </button> + </div> + + <div class="vid-row"> + <div class="vid-thumbnail"> + <svg width="36" height="36" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M36 69C54.2254 69 69 54.2254 69 36C69 17.7746 54.2254 3 36 3C17.7746 3 3 17.7746 3 36C3 54.2254 17.7746 69 36 69ZM52.1716 38.6337L28.4366 51.5801C26.4374 52.6705 24 51.2235 24 48.9464V23.0536C24 20.7764 26.4374 19.3295 28.4366 20.4199L52.1716 33.3663C54.2562 34.5034 54.2562 37.4966 52.1716 38.6337Z" + fill="rgb(123 123 123 / 50%)"></path> + </svg> + </div> + <div class="vid-text"> + <h3>Introducing ReactPy Foriegn</h3> + <p>Tim Cooker (2015)</p> + </div> + <button class="like-btn"> + <svg width="34" height="34" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path + d="m12 5.184-.808-.771-.004-.004C11.065 4.299 8.522 2.003 6 2.003c-3.736 0-6 2.558-6 6.677 0 4.47 5.471 9.848 10 13.079.602.43 1.187.82 1.74 1.167A.497.497 0 0 0 12 23v-.003c.09 0 .182-.026.26-.074C16.977 19.97 24 13.737 24 8.677 24 4.557 21.743 2 18 2c-2.569 0-5.166 2.387-5.192 2.413L12 5.184zm-.002 15.525c2.071-1.388 4.477-3.342 6.427-5.47C20.72 12.733 22 10.401 22 8.677c0-1.708-.466-2.855-1.087-3.55C20.316 4.459 19.392 4 18 4c-.726 0-1.63.364-2.5.9-.67.412-1.148.82-1.266.92-.03.025-.037.031-.019.014l-.013.013L12 7.949 9.832 5.88a10.08 10.08 0 0 0-1.33-.977C7.633 4.367 6.728 4.003 6 4.003c-1.388 0-2.312.459-2.91 1.128C2.466 5.826 2 6.974 2 8.68c0 1.726 1.28 4.058 3.575 6.563 1.948 2.127 4.352 4.078 6.423 5.466z" + fill="black" fill-rule="evenodd" clip-rule="evenodd" onclick="t"></path> + </svg> + </button> + </div> + + <div class="vid-row"> + <div class="vid-thumbnail"> + <svg width="36" height="36" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M36 69C54.2254 69 69 54.2254 69 36C69 17.7746 54.2254 3 36 3C17.7746 3 3 17.7746 3 36C3 54.2254 17.7746 69 36 69ZM52.1716 38.6337L28.4366 51.5801C26.4374 52.6705 24 51.2235 24 48.9464V23.0536C24 20.7764 26.4374 19.3295 28.4366 20.4199L52.1716 33.3663C54.2562 34.5034 54.2562 37.4966 52.1716 38.6337Z" + fill="rgb(123 123 123 / 50%)"></path> + </svg> + </div> + <div class="vid-text"> + <h3>Introducing ReactPy Cooks</h3> + <p>Soap Boat and Dinosaur Dan (2018)</p> + </div> + <button class="like-btn"> + <svg width="34" height="34" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path + d="m12 5.184-.808-.771-.004-.004C11.065 4.299 8.522 2.003 6 2.003c-3.736 0-6 2.558-6 6.677 0 4.47 5.471 9.848 10 13.079.602.43 1.187.82 1.74 1.167A.497.497 0 0 0 12 23v-.003c.09 0 .182-.026.26-.074C16.977 19.97 24 13.737 24 8.677 24 4.557 21.743 2 18 2c-2.569 0-5.166 2.387-5.192 2.413L12 5.184zm-.002 15.525c2.071-1.388 4.477-3.342 6.427-5.47C20.72 12.733 22 10.401 22 8.677c0-1.708-.466-2.855-1.087-3.55C20.316 4.459 19.392 4 18 4c-.726 0-1.63.364-2.5.9-.67.412-1.148.82-1.266.92-.03.025-.037.031-.019.014l-.013.013L12 7.949 9.832 5.88a10.08 10.08 0 0 0-1.33-.977C7.633 4.367 6.728 4.003 6 4.003c-1.388 0-2.312.459-2.91 1.128C2.466 5.826 2 6.974 2 8.68c0 1.726 1.28 4.058 3.575 6.563 1.948 2.127 4.352 4.078 6.423 5.466z" + fill="black" fill-rule="evenodd" clip-rule="evenodd" onclick="t"></path> + </svg> + </button> + </div> + + <div class="vid-row"> + <div class="vid-thumbnail"> + <svg width="36" height="36" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M36 69C54.2254 69 69 54.2254 69 36C69 17.7746 54.2254 3 36 3C17.7746 3 3 17.7746 3 36C3 54.2254 17.7746 69 36 69ZM52.1716 38.6337L28.4366 51.5801C26.4374 52.6705 24 51.2235 24 48.9464V23.0536C24 20.7764 26.4374 19.3295 28.4366 20.4199L52.1716 33.3663C54.2562 34.5034 54.2562 37.4966 52.1716 38.6337Z" + fill="rgb(123 123 123 / 50%)"></path> + </svg> + </div> + <div class="vid-text"> + <h3>Introducing Quantum Components</h3> + <p>Isaac Asimov and Lauren-kun (2020)</p> + </div> + <button class="like-btn"> + <svg width="34" height="34" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path + d="m12 5.184-.808-.771-.004-.004C11.065 4.299 8.522 2.003 6 2.003c-3.736 0-6 2.558-6 6.677 0 4.47 5.471 9.848 10 13.079.602.43 1.187.82 1.74 1.167A.497.497 0 0 0 12 23v-.003c.09 0 .182-.026.26-.074C16.977 19.97 24 13.737 24 8.677 24 4.557 21.743 2 18 2c-2.569 0-5.166 2.387-5.192 2.413L12 5.184zm-.002 15.525c2.071-1.388 4.477-3.342 6.427-5.47C20.72 12.733 22 10.401 22 8.677c0-1.708-.466-2.855-1.087-3.55C20.316 4.459 19.392 4 18 4c-.726 0-1.63.364-2.5.9-.67.412-1.148.82-1.266.92-.03.025-.037.031-.019.014l-.013.013L12 7.949 9.832 5.88a10.08 10.08 0 0 0-1.33-.977C7.633 4.367 6.728 4.003 6 4.003c-1.388 0-2.312.459-2.91 1.128C2.466 5.826 2 6.974 2 8.68c0 1.726 1.28 4.058 3.575 6.563 1.948 2.127 4.352 4.078 6.423 5.466z" + fill="black" fill-rule="evenodd" clip-rule="evenodd" onclick="t"></path> + </svg> + </button> + </div> + <p class="no-match"></p> + </div> + + <script> + document + .querySelector(".search-bar input") + .addEventListener("keyup", function () { + let titles = document.querySelectorAll(".browser-viewport .vid-text"); + let search = this.value.toLowerCase(); + let numVids = 0; + for (let i = 0; i < titles.length; i++) { + let title = + titles[i].querySelector("h3").innerText.toLowerCase() + + titles[i].querySelector("p").innerText.toLowerCase(); + if (search.length == 0) { + titles[i].parentElement.style.display = ""; + numVids++; + } else if (title.indexOf(search) > -1) { + titles[i].parentElement.style.display = ""; + numVids++; + } else { + titles[i].parentElement.style.display = "none"; + } + } + document.querySelector(".browser-viewport h2").innerText = + numVids + " Videos"; + + if (search && numVids == 0) { + document.querySelector(".browser-viewport .no-match").innerText = `No matches for “${search}”`; + } else { + document.querySelector(".browser-viewport .no-match").innerText = ""; + } + }); + </script> + </div> +</div> diff --git a/docs/overrides/homepage_examples/code_block.html b/docs/overrides/homepage_examples/code_block.html new file mode 100644 index 000000000..27b362046 --- /dev/null +++ b/docs/overrides/homepage_examples/code_block.html @@ -0,0 +1,7 @@ +<div class="tabbed-set tabbed-alternate {{ class }}"> + <input checked="checked" type="radio" /> + <div class="tabbed-labels"><label>app.py</label></div> + <div class="tabbed-content"> + <img src="assets/images/{{ image }}"> + </div> +</div> diff --git a/docs/overrides/homepage_examples/create_user_interfaces.py b/docs/overrides/homepage_examples/create_user_interfaces.py new file mode 100644 index 000000000..7878aa6b5 --- /dev/null +++ b/docs/overrides/homepage_examples/create_user_interfaces.py @@ -0,0 +1,21 @@ +# ruff: noqa: INP001 +from reactpy import component, html + + +def thumbnail(*_, **__): ... + + +def like_button(*_, **__): ... + + +@component +def video(data): + return html.div( + thumbnail(data), + html.a( + {"href": data.url}, + html.h3(data.title), + html.p(data.description), + ), + like_button(data), + ) diff --git a/docs/overrides/homepage_examples/create_user_interfaces_demo.html b/docs/overrides/homepage_examples/create_user_interfaces_demo.html new file mode 100644 index 000000000..9ec25437e --- /dev/null +++ b/docs/overrides/homepage_examples/create_user_interfaces_demo.html @@ -0,0 +1,24 @@ +<div class="demo"> + <div class="white-bg"> + <div class="vid-row"> + <div class="vid-thumbnail"> + <svg width="36" height="36" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M36 69C54.2254 69 69 54.2254 69 36C69 17.7746 54.2254 3 36 3C17.7746 3 3 17.7746 3 36C3 54.2254 17.7746 69 36 69ZM52.1716 38.6337L28.4366 51.5801C26.4374 52.6705 24 51.2235 24 48.9464V23.0536C24 20.7764 26.4374 19.3295 28.4366 20.4199L52.1716 33.3663C54.2562 34.5034 54.2562 37.4966 52.1716 38.6337Z" + fill="rgb(123 123 123 / 50%)"></path> + </svg> + </div> + <div class="vid-text"> + <h3>My video</h3> + <p>Video description</p> + </div> + <button class="like-btn"> + <svg width="34" height="34" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path + d="m12 5.184-.808-.771-.004-.004C11.065 4.299 8.522 2.003 6 2.003c-3.736 0-6 2.558-6 6.677 0 4.47 5.471 9.848 10 13.079.602.43 1.187.82 1.74 1.167A.497.497 0 0 0 12 23v-.003c.09 0 .182-.026.26-.074C16.977 19.97 24 13.737 24 8.677 24 4.557 21.743 2 18 2c-2.569 0-5.166 2.387-5.192 2.413L12 5.184zm-.002 15.525c2.071-1.388 4.477-3.342 6.427-5.47C20.72 12.733 22 10.401 22 8.677c0-1.708-.466-2.855-1.087-3.55C20.316 4.459 19.392 4 18 4c-.726 0-1.63.364-2.5.9-.67.412-1.148.82-1.266.92-.03.025-.037.031-.019.014l-.013.013L12 7.949 9.832 5.88a10.08 10.08 0 0 0-1.33-.977C7.633 4.367 6.728 4.003 6 4.003c-1.388 0-2.312.459-2.91 1.128C2.466 5.826 2 6.974 2 8.68c0 1.726 1.28 4.058 3.575 6.563 1.948 2.127 4.352 4.078 6.423 5.466z" + fill="black" fill-rule="evenodd" clip-rule="evenodd" onclick="t"></path> + </svg> + </button> + </div> + </div> +</div> diff --git a/docs/overrides/homepage_examples/write_components_with_python.py b/docs/overrides/homepage_examples/write_components_with_python.py new file mode 100644 index 000000000..5993046c9 --- /dev/null +++ b/docs/overrides/homepage_examples/write_components_with_python.py @@ -0,0 +1,19 @@ +# ruff: noqa: INP001 +from reactpy import component, html + + +def video(*_, **__): ... + + +@component +def video_list(videos, empty_heading): + count = len(videos) + heading = empty_heading + if count > 0: + noun = "Videos" if count > 1 else "Video" + heading = f"{count} {noun}" + + return html.section( + html.h2(heading), + [video(x, key=x.id) for x in videos], + ) diff --git a/docs/overrides/homepage_examples/write_components_with_python_demo.html b/docs/overrides/homepage_examples/write_components_with_python_demo.html new file mode 100644 index 000000000..779f7abbe --- /dev/null +++ b/docs/overrides/homepage_examples/write_components_with_python_demo.html @@ -0,0 +1,65 @@ +<div class="demo pop-right"> + <div class="white-bg"> + <h2>3 Videos</h2> + <div class="vid-row"> + <div class="vid-thumbnail"> + <svg width="36" height="36" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M36 69C54.2254 69 69 54.2254 69 36C69 17.7746 54.2254 3 36 3C17.7746 3 3 17.7746 3 36C3 54.2254 17.7746 69 36 69ZM52.1716 38.6337L28.4366 51.5801C26.4374 52.6705 24 51.2235 24 48.9464V23.0536C24 20.7764 26.4374 19.3295 28.4366 20.4199L52.1716 33.3663C54.2562 34.5034 54.2562 37.4966 52.1716 38.6337Z" + fill="rgb(123 123 123 / 50%)"></path> + </svg> + </div> + <div class="vid-text"> + <h3>First video</h3> + <p>Video description</p> + </div> + <button class="like-btn"> + <svg width="34" height="34" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path + d="m12 5.184-.808-.771-.004-.004C11.065 4.299 8.522 2.003 6 2.003c-3.736 0-6 2.558-6 6.677 0 4.47 5.471 9.848 10 13.079.602.43 1.187.82 1.74 1.167A.497.497 0 0 0 12 23v-.003c.09 0 .182-.026.26-.074C16.977 19.97 24 13.737 24 8.677 24 4.557 21.743 2 18 2c-2.569 0-5.166 2.387-5.192 2.413L12 5.184zm-.002 15.525c2.071-1.388 4.477-3.342 6.427-5.47C20.72 12.733 22 10.401 22 8.677c0-1.708-.466-2.855-1.087-3.55C20.316 4.459 19.392 4 18 4c-.726 0-1.63.364-2.5.9-.67.412-1.148.82-1.266.92-.03.025-.037.031-.019.014l-.013.013L12 7.949 9.832 5.88a10.08 10.08 0 0 0-1.33-.977C7.633 4.367 6.728 4.003 6 4.003c-1.388 0-2.312.459-2.91 1.128C2.466 5.826 2 6.974 2 8.68c0 1.726 1.28 4.058 3.575 6.563 1.948 2.127 4.352 4.078 6.423 5.466z" + fill="black" fill-rule="evenodd" clip-rule="evenodd" onclick="t"></path> + </svg> + </button> + </div> + <div class="vid-row"> + <div class="vid-thumbnail"> + <svg width="36" height="36" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M36 69C54.2254 69 69 54.2254 69 36C69 17.7746 54.2254 3 36 3C17.7746 3 3 17.7746 3 36C3 54.2254 17.7746 69 36 69ZM52.1716 38.6337L28.4366 51.5801C26.4374 52.6705 24 51.2235 24 48.9464V23.0536C24 20.7764 26.4374 19.3295 28.4366 20.4199L52.1716 33.3663C54.2562 34.5034 54.2562 37.4966 52.1716 38.6337Z" + fill="rgb(123 123 123 / 50%)"></path> + </svg> + </div> + <div class="vid-text"> + <h3>Second video</h3> + <p>Video description</p> + </div> + <button class="like-btn"> + <svg width="34" height="34" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path + d="m12 5.184-.808-.771-.004-.004C11.065 4.299 8.522 2.003 6 2.003c-3.736 0-6 2.558-6 6.677 0 4.47 5.471 9.848 10 13.079.602.43 1.187.82 1.74 1.167A.497.497 0 0 0 12 23v-.003c.09 0 .182-.026.26-.074C16.977 19.97 24 13.737 24 8.677 24 4.557 21.743 2 18 2c-2.569 0-5.166 2.387-5.192 2.413L12 5.184zm-.002 15.525c2.071-1.388 4.477-3.342 6.427-5.47C20.72 12.733 22 10.401 22 8.677c0-1.708-.466-2.855-1.087-3.55C20.316 4.459 19.392 4 18 4c-.726 0-1.63.364-2.5.9-.67.412-1.148.82-1.266.92-.03.025-.037.031-.019.014l-.013.013L12 7.949 9.832 5.88a10.08 10.08 0 0 0-1.33-.977C7.633 4.367 6.728 4.003 6 4.003c-1.388 0-2.312.459-2.91 1.128C2.466 5.826 2 6.974 2 8.68c0 1.726 1.28 4.058 3.575 6.563 1.948 2.127 4.352 4.078 6.423 5.466z" + fill="black" fill-rule="evenodd" clip-rule="evenodd" onclick="t"></path> + </svg> + </button> + </div> + <div class="vid-row"> + <div class="vid-thumbnail"> + <svg width="36" height="36" viewBox="0 0 72 72" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M36 69C54.2254 69 69 54.2254 69 36C69 17.7746 54.2254 3 36 3C17.7746 3 3 17.7746 3 36C3 54.2254 17.7746 69 36 69ZM52.1716 38.6337L28.4366 51.5801C26.4374 52.6705 24 51.2235 24 48.9464V23.0536C24 20.7764 26.4374 19.3295 28.4366 20.4199L52.1716 33.3663C54.2562 34.5034 54.2562 37.4966 52.1716 38.6337Z" + fill="rgb(123 123 123 / 50%)"></path> + </svg> + </div> + <div class="vid-text"> + <h3>Third video</h3> + <p>Video description</p> + </div> + <button class="like-btn"> + <svg width="34" height="34" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path + d="m12 5.184-.808-.771-.004-.004C11.065 4.299 8.522 2.003 6 2.003c-3.736 0-6 2.558-6 6.677 0 4.47 5.471 9.848 10 13.079.602.43 1.187.82 1.74 1.167A.497.497 0 0 0 12 23v-.003c.09 0 .182-.026.26-.074C16.977 19.97 24 13.737 24 8.677 24 4.557 21.743 2 18 2c-2.569 0-5.166 2.387-5.192 2.413L12 5.184zm-.002 15.525c2.071-1.388 4.477-3.342 6.427-5.47C20.72 12.733 22 10.401 22 8.677c0-1.708-.466-2.855-1.087-3.55C20.316 4.459 19.392 4 18 4c-.726 0-1.63.364-2.5.9-.67.412-1.148.82-1.266.92-.03.025-.037.031-.019.014l-.013.013L12 7.949 9.832 5.88a10.08 10.08 0 0 0-1.33-.977C7.633 4.367 6.728 4.003 6 4.003c-1.388 0-2.312.459-2.91 1.128C2.466 5.826 2 6.974 2 8.68c0 1.726 1.28 4.058 3.575 6.563 1.948 2.127 4.352 4.078 6.423 5.466z" + fill="black" fill-rule="evenodd" clip-rule="evenodd" onclick="t"></path> + </svg> + </button> + </div> + </div> +</div> diff --git a/docs/overrides/main.html b/docs/overrides/main.html index e70aa10c8..c63ca9e71 100644 --- a/docs/overrides/main.html +++ b/docs/overrides/main.html @@ -11,3 +11,10 @@ </div> {% endif %} {% endblock %} + +{% block outdated %} +You're not viewing the latest release. +<a href="{{ '../' ~ base_url }}"> + <strong>Click here to go to latest.</strong> +</a> +{% endblock %} diff --git a/docs/requirements.txt b/docs/requirements.txt index 0e7af6eb3..28f64bf4d 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,10 +1,12 @@ mkdocs mkdocs-git-revision-date-localized-plugin -mkdocs-material +mkdocs-material==9.4.0 mkdocs-include-markdown-plugin -linkcheckmd mkdocs-spellcheck[all] mkdocs-git-authors-plugin mkdocs-minify-plugin -mkdocs-section-index mike +mkdocstrings[python] +black +linkcheckmd +mkdocs-section-index diff --git a/docs/src/about/changelog.md b/docs/src/about/changelog.md index 40c649d3e..e62f7dbe1 100644 --- a/docs/src/about/changelog.md +++ b/docs/src/about/changelog.md @@ -1,11 +1,12 @@ --- -title: Changelog hide: - toc --- -!!! note "Attribution" +<p class="intro" markdown> - {% include-markdown "../../../CHANGELOG.md" start="<!--attr-start-->" end="<!--attr-end-->" %} +{% include-markdown "../../../CHANGELOG.md" start="<!--attr-start-->" end="<!--attr-end-->" %} + +</p> {% include-markdown "../../../CHANGELOG.md" start="<!--changelog-start-->" %} diff --git a/docs/src/assets/css/admonition.css b/docs/src/assets/css/admonition.css new file mode 100644 index 000000000..8b3f06ef6 --- /dev/null +++ b/docs/src/assets/css/admonition.css @@ -0,0 +1,160 @@ +[data-md-color-scheme="slate"] { + --admonition-border-color: transparent; + --admonition-expanded-border-color: rgba(255, 255, 255, 0.1); + --note-bg-color: rgba(43, 110, 98, 0.2); + --terminal-bg-color: #0c0c0c; + --terminal-title-bg-color: #000; + --deep-dive-bg-color: rgba(43, 52, 145, 0.2); + --you-will-learn-bg-color: #353a45; + --pitfall-bg-color: rgba(182, 87, 0, 0.2); +} +[data-md-color-scheme="default"] { + --admonition-border-color: rgba(0, 0, 0, 0.08); + --admonition-expanded-border-color: var(--admonition-border-color); + --note-bg-color: rgb(244, 251, 249); + --terminal-bg-color: rgb(64, 71, 86); + --terminal-title-bg-color: rgb(35, 39, 47); + --deep-dive-bg-color: rgb(243, 244, 253); + --you-will-learn-bg-color: rgb(246, 247, 249); + --pitfall-bg-color: rgb(254, 245, 231); +} + +.md-typeset details, +.md-typeset .admonition { + border-color: var(--admonition-border-color) !important; + box-shadow: none; +} + +.md-typeset :is(.admonition, details) { + margin: 0.55em 0; +} + +.md-typeset .admonition { + font-size: 0.7rem; +} + +.md-typeset .admonition:focus-within, +.md-typeset details:focus-within { + box-shadow: none !important; +} + +.md-typeset details[open] { + border-color: var(--admonition-expanded-border-color) !important; +} + +/* +Admonition: "summary" +React Name: "You will learn" +*/ +.md-typeset .admonition.summary { + background: var(--you-will-learn-bg-color); + padding: 0.8rem 1.4rem; + border-radius: 0.8rem; +} + +.md-typeset .summary .admonition-title { + font-size: 1rem; + background: transparent; + padding-left: 0.6rem; + padding-bottom: 0; +} + +.md-typeset .summary .admonition-title:before { + display: none; +} + +.md-typeset .admonition.summary { + border-color: #ffffff17 !important; +} + +/* +Admonition: "abstract" +React Name: "Note" +*/ +.md-typeset .admonition.abstract { + background: var(--note-bg-color); + padding: 0.8rem 1.4rem; + border-radius: 0.8rem; +} + +.md-typeset .abstract .admonition-title { + font-size: 1rem; + background: transparent; + padding-bottom: 0; + color: rgb(68, 172, 153); +} + +.md-typeset .abstract .admonition-title:before { + font-size: 1.1rem; + background: rgb(68, 172, 153); +} + +/* +Admonition: "warning" +React Name: "Pitfall" +*/ +.md-typeset .admonition.warning { + background: var(--pitfall-bg-color); + padding: 0.8rem 1.4rem; + border-radius: 0.8rem; +} + +.md-typeset .warning .admonition-title { + font-size: 1rem; + background: transparent; + padding-bottom: 0; + color: rgb(219, 125, 39); +} + +.md-typeset .warning .admonition-title:before { + font-size: 1.1rem; + background: rgb(219, 125, 39); +} + +/* +Admonition: "info" +React Name: "Deep Dive" +*/ +.md-typeset .admonition.info { + background: var(--deep-dive-bg-color); + padding: 0.8rem 1.4rem; + border-radius: 0.8rem; +} + +.md-typeset .info .admonition-title { + font-size: 1rem; + background: transparent; + padding-bottom: 0; + color: rgb(136, 145, 236); +} + +.md-typeset .info .admonition-title:before { + font-size: 1.1rem; + background: rgb(136, 145, 236); +} + +/* +Admonition: "example" +React Name: "Terminal" +*/ +.md-typeset .admonition.example { + background: var(--terminal-bg-color); + border-radius: 0.4rem; + overflow: hidden; + border: none; +} + +.md-typeset .example .admonition-title { + background: var(--terminal-title-bg-color); + color: rgb(246, 247, 249); +} + +.md-typeset .example .admonition-title:before { + background: rgb(246, 247, 249); +} + +.md-typeset .admonition.example code { + background: transparent; + color: #fff; + box-shadow: none; +} diff --git a/docs/src/assets/css/banner.css b/docs/src/assets/css/banner.css new file mode 100644 index 000000000..3739a73c1 --- /dev/null +++ b/docs/src/assets/css/banner.css @@ -0,0 +1,15 @@ +body[data-md-color-scheme="slate"] { + --md-banner-bg-color: rgb(55, 81, 78); + --md-banner-font-color: #fff; +} + +body[data-md-color-scheme="default"] { + --md-banner-bg-color: #ff9; + --md-banner-font-color: #000; +} + +.md-banner--warning { + background-color: var(--md-banner-bg-color); + color: var(--md-banner-font-color); + text-align: center; +} diff --git a/docs/src/assets/css/button.css b/docs/src/assets/css/button.css new file mode 100644 index 000000000..8f71391aa --- /dev/null +++ b/docs/src/assets/css/button.css @@ -0,0 +1,41 @@ +[data-md-color-scheme="slate"] { + --md-button-font-color: #fff; + --md-button-border-color: #404756; +} + +[data-md-color-scheme="default"] { + --md-button-font-color: #000; + --md-button-border-color: #8d8d8d; +} + +.md-typeset .md-button { + border-width: 1px; + border-color: var(--md-button-border-color); + border-radius: 9999px; + color: var(--md-button-font-color); + transition: color 125ms, background 125ms, border-color 125ms, + transform 125ms; +} + +.md-typeset .md-button:focus, +.md-typeset .md-button:hover { + border-color: var(--md-button-border-color); + color: var(--md-button-font-color); + background: rgba(78, 87, 105, 0.05); +} + +.md-typeset .md-button.md-button--primary { + color: #fff; + border-color: transparent; + background: var(--reactpy-color-dark); +} + +.md-typeset .md-button.md-button--primary:focus, +.md-typeset .md-button.md-button--primary:hover { + border-color: transparent; + background: var(--reactpy-color-darker); +} + +.md-typeset .md-button:focus { + transform: scale(0.98); +} diff --git a/docs/src/assets/css/code.css b/docs/src/assets/css/code.css new file mode 100644 index 000000000..c54654980 --- /dev/null +++ b/docs/src/assets/css/code.css @@ -0,0 +1,111 @@ +:root { + --code-max-height: 17.25rem; + --md-code-backdrop: rgba(0, 0, 0, 0) 0px 0px 0px 0px, + rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.03) 0px 0.8px 2px 0px, + rgba(0, 0, 0, 0.047) 0px 2.7px 6.7px 0px, + rgba(0, 0, 0, 0.08) 0px 12px 30px 0px; +} +[data-md-color-scheme="slate"] { + --md-code-hl-color: #ffffcf1c; + --md-code-bg-color: #16181d; + --md-code-hl-comment-color: hsla(var(--md-hue), 75%, 90%, 0.43); + --code-tab-color: rgb(52, 58, 70); + --md-code-hl-name-color: #aadafc; + --md-code-hl-string-color: hsl(21 49% 63% / 1); + --md-code-hl-keyword-color: hsl(289.67deg 35% 60%); + --md-code-hl-constant-color: hsl(213.91deg 68% 61%); + --md-code-hl-number-color: #bfd9ab; + --func-and-decorator-color: #dcdcae; + --module-import-color: #60c4ac; +} +[data-md-color-scheme="default"] { + --md-code-hl-color: #ffffcf1c; + --md-code-bg-color: rgba(208, 211, 220, 0.4); + --md-code-fg-color: rgb(64, 71, 86); + --code-tab-color: #fff; + --func-and-decorator-color: var(--md-code-hl-function-color); + --module-import-color: #e153e5; +} +[data-md-color-scheme="default"] .md-typeset .highlight > pre > code, +[data-md-color-scheme="default"] .md-typeset .highlight > table.highlighttable { + --md-code-bg-color: #fff; +} + +/* All code blocks */ +.md-typeset pre > code { + max-height: var(--code-max-height); +} + +/* Code blocks with no line number */ +.md-typeset .highlight > pre > code { + border-radius: 16px; + max-height: var(--code-max-height); + box-shadow: var(--md-code-backdrop); +} + +/* Code blocks with line numbers */ +.md-typeset .highlighttable .linenos { + max-height: var(--code-max-height); + overflow: hidden; +} +.md-typeset .highlighttable { + box-shadow: var(--md-code-backdrop); + border-radius: 8px; + overflow: hidden; +} + +/* Tabbed code blocks */ +.md-typeset .tabbed-set { + box-shadow: var(--md-code-backdrop); + border-radius: 8px; + overflow: hidden; + border: 1px solid var(--md-default-fg-color--lightest); +} +.md-typeset .tabbed-set .tabbed-block { + overflow: hidden; +} +.js .md-typeset .tabbed-set .tabbed-labels { + background: var(--code-tab-color); + margin: 0; + padding-left: 0.8rem; +} +.md-typeset .tabbed-set .tabbed-labels > label { + font-weight: 400; + font-size: 0.7rem; + padding-top: 0.55em; + padding-bottom: 0.35em; +} +.md-typeset .tabbed-set .highlighttable { + border-radius: 0; +} + +/* Code hightlighting colors */ + +/* Module imports */ +.highlight .nc, +.highlight .ne, +.highlight .nn, +.highlight .nv { + color: var(--module-import-color); +} + +/* Function def name and decorator */ +.highlight .nd, +.highlight .nf { + color: var(--func-and-decorator-color); +} + +/* None type */ +.highlight .kc { + color: var(--md-code-hl-constant-color); +} + +/* Keywords such as def and return */ +.highlight .k { + color: var(--md-code-hl-constant-color); +} + +/* HTML tags */ +.highlight .nt { + color: var(--md-code-hl-constant-color); +} diff --git a/docs/src/assets/css/footer.css b/docs/src/assets/css/footer.css new file mode 100644 index 000000000..b3408286e --- /dev/null +++ b/docs/src/assets/css/footer.css @@ -0,0 +1,33 @@ +[data-md-color-scheme="slate"] { + --md-footer-bg-color: var(--md-default-bg-color); + --md-footer-bg-color--dark: var(--md-default-bg-color); + --md-footer-border-color: var(--md-header-border-color); +} + +[data-md-color-scheme="default"] { + --md-footer-fg-color: var(--md-typeset-color); + --md-footer-fg-color--light: var(--md-typeset-color); + --md-footer-bg-color: var(--md-default-bg-color); + --md-footer-bg-color--dark: var(--md-default-bg-color); + --md-footer-border-color: var(--md-header-border-color); +} + +.md-footer { + border-top: 1px solid var(--md-footer-border-color); +} + +.md-copyright { + width: 100%; +} + +.md-copyright__highlight { + width: 100%; +} + +.legal-footer-right { + float: right; +} + +.md-copyright__highlight div { + display: inline; +} diff --git a/docs/src/assets/css/home.css b/docs/src/assets/css/home.css new file mode 100644 index 000000000..c72e7093a --- /dev/null +++ b/docs/src/assets/css/home.css @@ -0,0 +1,335 @@ +img.home-logo { + height: 120px; +} + +.home .row { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + padding: 6rem 0.8rem; +} + +.home .row:not(.first, .stripe) { + background: var(--row-bg-color); +} + +.home .row.stripe { + background: var(--row-stripe-bg-color); + border: 0 solid var(--stripe-border-color); + border-top-width: 1px; + border-bottom-width: 1px; +} + +.home .row.first { + text-align: center; +} + +.home .row h1 { + max-width: 28rem; + line-height: 1.15; + font-weight: 500; + margin-bottom: 0.55rem; + margin-top: -1rem; +} + +.home .row.first h1 { + margin-top: 0.55rem; + margin-bottom: -0.75rem; +} + +.home .row > p { + max-width: 35rem; + line-height: 1.5; + font-weight: 400; +} + +.home .row.first > p { + font-size: 32px; + font-weight: 500; +} + +/* Code blocks */ +.home .row .tabbed-set { + background: var(--home-tabbed-set-bg-color); + margin: 0; +} + +.home .row .tabbed-content { + padding: 20px 18px; + overflow-x: auto; +} + +.home .row .tabbed-content img { + user-select: none; + -moz-user-select: none; + -webkit-user-drag: none; + -webkit-user-select: none; + -ms-user-select: none; + max-width: 580px; +} + +.home .row .tabbed-content { + -webkit-filter: var(--code-block-filter); + filter: var(--code-block-filter); +} + +/* Code examples */ +.home .example-container { + background: radial-gradient( + circle at 0% 100%, + rgb(41 84 147 / 11%) 0%, + rgb(22 89 189 / 4%) 70%, + rgb(48 99 175 / 0%) 80% + ), + radial-gradient( + circle at 100% 100%, + rgb(24 87 45 / 55%) 0%, + rgb(29 61 12 / 4%) 70%, + rgb(94 116 93 / 0%) 80% + ), + radial-gradient( + circle at 100% 0%, + rgba(54, 66, 84, 0.55) 0%, + rgb(102 111 125 / 4%) 70%, + rgba(54, 66, 84, 0) 80% + ), + radial-gradient( + circle at 0% 0%, + rgba(91, 114, 135, 0.55) 0%, + rgb(45 111 171 / 4%) 70%, + rgb(5 82 153 / 0%) 80% + ), + rgb(0, 0, 0) center center/cover no-repeat fixed; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + align-items: center; + border-radius: 16px; + margin: 30px 0; + max-width: 100%; + grid-column-gap: 20px; + padding-left: 20px; + padding-right: 20px; +} + +.home .demo .white-bg { + background: #fff; + border-radius: 16px; + display: flex; + flex-direction: column; + max-width: 590px; + min-width: -webkit-min-content; + min-width: -moz-min-content; + min-width: min-content; + row-gap: 1rem; + padding: 1rem; +} + +.home .demo .vid-row { + display: flex; + flex-direction: row; + -moz-column-gap: 12px; + column-gap: 12px; +} + +.home .demo { + color: #000; +} + +.home .demo .vid-thumbnail { + background: radial-gradient( + circle at 0% 100%, + rgb(41 84 147 / 55%) 0%, + rgb(22 89 189 / 4%) 70%, + rgb(48 99 175 / 0%) 80% + ), + radial-gradient( + circle at 100% 100%, + rgb(24 63 87 / 55%) 0%, + rgb(29 61 12 / 4%) 70%, + rgb(94 116 93 / 0%) 80% + ), + radial-gradient( + circle at 100% 0%, + rgba(54, 66, 84, 0.55) 0%, + rgb(102 111 125 / 4%) 70%, + rgba(54, 66, 84, 0) 80% + ), + radial-gradient( + circle at 0% 0%, + rgba(91, 114, 135, 0.55) 0%, + rgb(45 111 171 / 4%) 70%, + rgb(5 82 153 / 0%) 80% + ), + rgb(0, 0, 0) center center/cover no-repeat fixed; + width: 9rem; + aspect-ratio: 16 / 9; + border-radius: 8px; + display: flex; + justify-content: center; + align-items: center; +} + +.home .demo .vid-text { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + width: 100%; +} + +.home .demo h2 { + font-size: 18px; + line-height: 1.375; + margin: 0; + text-align: left; + font-weight: 700; +} + +.home .demo h3 { + font-size: 16px; + line-height: 1.25; + margin: 0; +} + +.home .demo p { + font-size: 14px; + line-height: 1.375; + margin: 0; +} + +.home .demo .browser-nav-url { + background: rgba(153, 161, 179, 0.2); + border-radius: 9999px; + font-size: 14px; + color: grey; + display: flex; + align-items: center; + justify-content: center; + -moz-column-gap: 5px; + column-gap: 5px; +} + +.home .demo .browser-navbar { + margin: -1rem; + margin-bottom: 0; + padding: 0.75rem 1rem; + border-bottom: 1px solid darkgrey; +} + +.home .demo .browser-viewport { + background: #fff; + border-radius: 16px; + display: flex; + flex-direction: column; + row-gap: 1rem; + height: 400px; + overflow-y: scroll; + margin: -1rem; + padding: 1rem; +} + +.home .demo .browser-viewport .search-header > h1 { + color: #000; + text-align: left; + font-size: 24px; + margin: 0; +} + +.home .demo .browser-viewport .search-header > p { + text-align: left; + font-size: 16px; + margin: 10px 0; +} + +.home .demo .search-bar input { + width: 100%; + background: rgba(153, 161, 179, 0.2); + border-radius: 9999px; + padding-left: 40px; + padding-right: 40px; + height: 40px; + color: #000; +} + +.home .demo .search-bar svg { + height: 40px; + position: absolute; + transform: translateX(75%); +} + +.home .demo .search-bar { + position: relative; +} + +/* Desktop Styling */ +@media screen and (min-width: 60em) { + .home .row { + text-align: center; + } + .home .row > p { + font-size: 21px; + } + .home .row > h1 { + font-size: 52px; + } + .home .row .pop-left { + margin-left: -20px; + margin-right: 0; + margin-top: -20px; + margin-bottom: -20px; + } + .home .row .pop-right { + margin-left: 0px; + margin-right: 0px; + margin-top: -20px; + margin-bottom: -20px; + } +} + +/* Mobile Styling */ +@media screen and (max-width: 60em) { + .home .row { + padding: 4rem 0.8rem; + } + .home .row > h1, + .home .row > p { + padding-left: 1rem; + padding-right: 1rem; + } + .home .row.first { + padding-top: 2rem; + } + .home-btns { + width: 100%; + display: grid; + grid-gap: 0.5rem; + gap: 0.5rem; + } + .home .example-container { + display: flex; + flex-direction: column; + row-gap: 20px; + width: 100%; + justify-content: center; + border-radius: 0; + padding: 1rem 0; + } + .home .row { + padding-left: 0; + padding-right: 0; + } + .home .tabbed-set { + width: 100%; + border-radius: 0; + } + .home .demo { + width: 100%; + display: flex; + justify-content: center; + } + .home .demo > .white-bg { + width: 80%; + max-width: 80%; + } +} diff --git a/docs/src/assets/css/main.css b/docs/src/assets/css/main.css new file mode 100644 index 000000000..6eefdf2f4 --- /dev/null +++ b/docs/src/assets/css/main.css @@ -0,0 +1,85 @@ +/* Variable overrides */ +:root { + --reactpy-color: #58b962; + --reactpy-color-dark: #42914a; + --reactpy-color-darker: #34743b; + --reactpy-color-opacity-10: rgba(88, 185, 98, 0.1); +} + +[data-md-color-accent="red"] { + --md-primary-fg-color--light: var(--reactpy-color); + --md-primary-fg-color--dark: var(--reactpy-color-dark); +} + +[data-md-color-scheme="slate"] { + --md-default-bg-color: rgb(35, 39, 47); + --md-default-bg-color--light: hsla(var(--md-hue), 15%, 16%, 0.54); + --md-default-bg-color--lighter: hsla(var(--md-hue), 15%, 16%, 0.26); + --md-default-bg-color--lightest: hsla(var(--md-hue), 15%, 16%, 0.07); + --md-primary-fg-color: var(--md-default-bg-color); + --md-default-fg-color: hsla(var(--md-hue), 75%, 95%, 1); + --md-default-fg-color--light: #fff; + --md-typeset-a-color: var(--reactpy-color); + --md-accent-fg-color: var(--reactpy-color-dark); +} + +[data-md-color-scheme="default"] { + --md-primary-fg-color: var(--md-default-bg-color); + --md-default-fg-color--light: #000; + --md-default-fg-color--lighter: #0000007e; + --md-default-fg-color--lightest: #00000029; + --md-typeset-color: rgb(35, 39, 47); + --md-typeset-a-color: var(--reactpy-color); + --md-accent-fg-color: var(--reactpy-color-dark); +} + +/* Font changes */ +.md-typeset { + font-weight: 300; +} + +.md-typeset h1 { + font-weight: 600; + margin: 0; + font-size: 2.5em; +} + +.md-typeset h2 { + font-weight: 500; +} + +.md-typeset h3 { + font-weight: 400; +} + +/* Intro section styling */ +p.intro { + font-size: 0.9rem; + font-weight: 500; +} + +/* Hide "Overview" jump selector */ +h2#overview { + visibility: hidden; + height: 0; + margin: 0; + padding: 0; +} + +/* Reduce size of the outdated banner */ +.md-banner__inner { + margin: 0.45rem auto; +} + +/* Desktop Styles */ +@media screen and (min-width: 60em) { + /* Remove max width on desktop */ + .md-grid { + max-width: none; + } +} + +/* Max size of page content */ +.md-content { + max-width: 56rem; +} diff --git a/docs/src/assets/css/navbar.css b/docs/src/assets/css/navbar.css new file mode 100644 index 000000000..33e8b14fd --- /dev/null +++ b/docs/src/assets/css/navbar.css @@ -0,0 +1,185 @@ +[data-md-color-scheme="slate"] { + --md-header-border-color: rgb(255 255 255 / 5%); + --md-version-bg-color: #ffffff0d; +} + +[data-md-color-scheme="default"] { + --md-header-border-color: rgb(0 0 0 / 7%); + --md-version-bg-color: #ae58ee2e; +} + +.md-header { + border: 0 solid transparent; + border-bottom-width: 1px; +} + +.md-header--shadow { + box-shadow: none; + border-color: var(--md-header-border-color); + transition: border-color 0.35s cubic-bezier(0.1, 0.7, 0.1, 1); +} + +/* Version selector */ +.md-header__topic .md-ellipsis, +.md-header__title [data-md-component="header-topic"] { + display: none; +} + +[dir="ltr"] .md-version__current { + margin: 0; +} + +.md-version__list { + margin: 0; + left: 0; + right: 0; + top: 2.5rem; +} + +.md-version { + background: var(--md-version-bg-color); + border-radius: 999px; + padding: 0 0.8rem; + margin: 0.3rem 0; + height: 1.8rem; + display: flex; + font-size: 0.7rem; +} + +/* Mobile Styling */ +@media screen and (max-width: 60em) { + label.md-header__button.md-icon[for="__drawer"] { + order: 1; + } + .md-header__button.md-logo { + display: initial; + order: 2; + margin-right: auto; + } + .md-header__title { + order: 3; + } + .md-header__button[for="__search"] { + order: 4; + } + .md-header__option[data-md-component="palette"] { + order: 5; + } + .md-header__source { + display: initial; + order: 6; + } + .md-header__source .md-source__repository { + display: none; + } +} + +/* Desktop Styling */ +@media screen and (min-width: 60em) { + /* Nav container */ + nav.md-header__inner { + display: contents; + } + header.md-header { + display: flex; + align-items: center; + } + + /* Logo */ + .md-header__button.md-logo { + order: 1; + padding-right: 0.4rem; + padding-top: 0; + padding-bottom: 0; + } + .md-header__button.md-logo img { + height: 2rem; + } + + /* Version selector */ + [dir="ltr"] .md-header__title { + order: 2; + margin: 0; + margin-right: 0.8rem; + margin-left: 0.2rem; + flex-grow: 0; + } + .md-header__topic { + position: relative; + } + .md-header__title--active .md-header__topic { + transform: none; + opacity: 1; + pointer-events: auto; + z-index: 4; + } + + /* Search */ + .md-search { + order: 3; + width: 100%; + margin-right: 0.6rem; + } + .md-search__inner { + width: 100%; + float: unset !important; + } + .md-search__form { + border-radius: 9999px; + } + [data-md-toggle="search"]:checked ~ .md-header .md-header__option { + max-width: unset; + opacity: unset; + transition: unset; + } + + /* Tabs */ + .md-tabs { + order: 4; + min-width: -webkit-fit-content; + min-width: -moz-fit-content; + min-width: fit-content; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + z-index: -1; + overflow: visible; + border: none !important; + } + li.md-tabs__item.md-tabs__item--active { + background: var(--reactpy-color-opacity-10); + border-radius: 9999px; + color: var(--md-typeset-a-color); + } + .md-tabs__link { + margin: 0; + } + .md-tabs__item { + height: 1.8rem; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + } + + /* Dark/Light Selector */ + .md-header__option[data-md-component="palette"] { + order: 5; + } + + /* GitHub info */ + .md-header__source { + order: 6; + margin-left: 0 !important; + } +} + +/* Ultrawide Desktop Styles */ +@media screen and (min-width: 1919px) { + .md-search { + order: 2; + width: 100%; + max-width: 34.4rem; + margin: 0 auto; + } +} diff --git a/docs/src/assets/css/sidebar.css b/docs/src/assets/css/sidebar.css new file mode 100644 index 000000000..b6507d963 --- /dev/null +++ b/docs/src/assets/css/sidebar.css @@ -0,0 +1,104 @@ +:root { + --sizebar-font-size: 0.62rem; +} + +.md-nav__link { + word-break: break-word; +} + +/* Desktop Styling */ +@media screen and (min-width: 76.1875em) { + /* Move the sidebar and TOC to the edge of the page */ + .md-main__inner.md-grid { + margin-left: 0; + margin-right: 0; + max-width: unset; + display: grid; + grid-template-columns: auto 1fr auto; + } + + .md-content { + justify-self: center; + width: 100%; + } + /* Made the sidebar buttons look React-like */ + .md-nav--lifted > .md-nav__list > .md-nav__item--active > .md-nav__link { + text-transform: uppercase; + } + + .md-nav__title[for="__toc"] { + text-transform: uppercase; + margin: 0.5rem; + } + + .md-nav--lifted > .md-nav__list > .md-nav__item--active > .md-nav__link { + color: rgb(133, 142, 159); + margin: 0.5rem; + } + + .md-nav__item .md-nav__link { + position: relative; + } + + .md-nav__link:is(:focus, :hover):not(.md-nav__link--active) { + color: unset; + } + + .md-nav__item + .md-nav__link:is(:focus, :hover):not(.md-nav__link--active):before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0.2; + z-index: -1; + background: grey; + } + + .md-nav__item .md-nav__link--active:before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: -1; + background: var(--reactpy-color-opacity-10); + } + + .md-nav__link { + padding: 0.5rem 0.5rem 0.5rem 1rem; + margin: 0; + border-radius: 0 10px 10px 0; + font-weight: 500; + overflow: hidden; + font-size: var(--sizebar-font-size); + } + + .md-sidebar__scrollwrap { + margin: 0; + } + + [dir="ltr"] + .md-nav--lifted + .md-nav[data-md-level="1"] + > .md-nav__list + > .md-nav__item { + padding: 0; + } + + .md-nav__item--nested .md-nav__item .md-nav__item { + padding: 0; + } + + .md-nav__item--nested .md-nav__item .md-nav__item .md-nav__link { + font-weight: 300; + } + + .md-nav__item--nested .md-nav__item .md-nav__item .md-nav__link { + font-weight: 400; + padding-left: 1.25rem; + } +} diff --git a/docs/src/assets/css/table-of-contents.css b/docs/src/assets/css/table-of-contents.css new file mode 100644 index 000000000..6c94f06ef --- /dev/null +++ b/docs/src/assets/css/table-of-contents.css @@ -0,0 +1,48 @@ +/* Table of Contents styling */ +@media screen and (min-width: 60em) { + [data-md-component="sidebar"] .md-nav__title[for="__toc"] { + text-transform: uppercase; + margin: 0.5rem; + margin-left: 0; + font-size: var(--sizebar-font-size); + } + + [data-md-component="toc"] .md-nav__item .md-nav__link--active { + position: relative; + } + + [data-md-component="toc"] .md-nav__item .md-nav__link--active:before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0.15; + z-index: -1; + background: var(--md-typeset-a-color); + } + + [data-md-component="toc"] .md-nav__link { + padding: 0.5rem 0.5rem; + margin: 0; + border-radius: 10px 0 0 10px; + font-weight: 400; + } + + [data-md-component="toc"] + .md-nav__item + .md-nav__list + .md-nav__item + .md-nav__link { + padding-left: 1.25rem; + } + + [dir="ltr"] .md-sidebar__inner { + padding: 0; + } + + .md-nav__item { + padding: 0; + } +} diff --git a/docs/src/assets/images/add-interactivity.png b/docs/src/assets/images/add-interactivity.png new file mode 100644 index 0000000000000000000000000000000000000000..c32431905252537a5387e25c4ec58a3f90f87f6c GIT binary patch literal 22900 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 LmSPFiBJ_U%+FQ}0 literal 0 HcmV?d00001 diff --git a/docs/src/assets/images/create-user-interfaces.png b/docs/src/assets/images/create-user-interfaces.png new file mode 100644 index 0000000000000000000000000000000000000000..06f6ea0cb6fdd4e17a6af5e374ced578cc0728f3 GIT binary patch literal 12427 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 CCnIM7 literal 0 HcmV?d00001 diff --git a/docs/src/static/images/s_thinking-in-react_ui.png b/docs/src/assets/images/s_thinking-in-react_ui.png similarity index 100% rename from docs/src/static/images/s_thinking-in-react_ui.png rename to docs/src/assets/images/s_thinking-in-react_ui.png diff --git a/docs/src/static/images/s_thinking-in-react_ui_outline.png b/docs/src/assets/images/s_thinking-in-react_ui_outline.png similarity index 100% rename from docs/src/static/images/s_thinking-in-react_ui_outline.png rename to docs/src/assets/images/s_thinking-in-react_ui_outline.png diff --git a/docs/src/assets/images/write-components-with-python.png b/docs/src/assets/images/write-components-with-python.png new file mode 100644 index 0000000000000000000000000000000000000000..380d2c3ada56fa9b6059df8f30d5e734749858a4 GIT binary patch literal 16519 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�wQwLK+5Z%JTb!YxBy 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 literal 0 HcmV?d00001 diff --git a/docs/src/static/js/extra.js b/docs/src/assets/js/main.js similarity index 100% rename from docs/src/static/js/extra.js rename to docs/src/assets/js/main.js diff --git a/docs/src/index.md b/docs/src/index.md index ae43c6a82..384ec5b6d 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -1,57 +1,6 @@ --- +template: home.html hide: - navigation - toc --- - -[ReactPy](https://reactpy.dev/) is a library for building user interfaces in Python without Javascript. ReactPy interfaces are made from components that look and behave similar to those found in [ReactJS](https://reactjs.org/). Designed with simplicity in mind, ReactPy can be used by those without web development experience while also being powerful enough to grow with your ambitions. - -<table align="center"> - <thead> - <tr> - <th colspan="2" style="text-align: center">Supported Backends</th> - <tr> - <th style="text-align: center">Built-in</th> - <th style="text-align: center">External</th> - </tr> - </thead> - <tbody> - <tr> - <td> - <a href="https://reactpy.dev/docs/guides/getting-started/installing-reactpy.html#officially-supported-servers"> - Flask, FastAPI, Sanic, Tornado - </a> - </td> - <td> - <a href="https://github.com/reactive-python/reactpy-django">Django</a>, - <a href="https://github.com/reactive-python/reactpy-jupyter">Jupyter</a>, - <a href="https://github.com/idom-team/idom-dash">Plotly-Dash</a> - </td> - </tr> - </tbody> -</table> - -# At a Glance - -To get a rough idea of how to write apps in ReactPy, take a look at this tiny _Hello World_ application. - -```python -from reactpy import component, html, run - -@component -def hello_world(): - return html.h1("Hello, World!") - -run(hello_world) -``` - -# Resources - -Follow the links below to find out more about this project. - -- [Try ReactPy (Jupyter Notebook)](https://mybinder.org/v2/gh/reactive-python/reactpy-jupyter/main?urlpath=lab/tree/notebooks/introduction.ipynb) -- [Documentation](https://reactpy.dev/) -- [GitHub Discussions](https://github.com/reactive-python/reactpy/discussions) -- [Discord](https://discord.gg/uNb5P4hA9X) -- [Contributor Guide](https://reactpy.dev/docs/about/contributor-guide.html) -- [Code of Conduct](https://github.com/reactive-python/reactpy/blob/main/CODE_OF_CONDUCT.md) diff --git a/docs/src/static/css/extra.css b/docs/src/static/css/extra.css deleted file mode 100644 index d39676668..000000000 --- a/docs/src/static/css/extra.css +++ /dev/null @@ -1,376 +0,0 @@ -/* Variable overrides */ -:root { - --code-max-height: 17.25rem; -} - -[data-md-color-scheme="slate"] { - --md-code-hl-color: #ffffcf1c; - --md-hue: 225; - --md-default-bg-color: hsla(var(--md-hue), 15%, 16%, 1); - --md-default-bg-color--light: hsla(var(--md-hue), 15%, 16%, 0.54); - --md-default-bg-color--lighter: hsla(var(--md-hue), 15%, 16%, 0.26); - --md-default-bg-color--lightest: hsla(var(--md-hue), 15%, 16%, 0.07); - --md-code-bg-color: #16181d; - --md-primary-fg-color: #2b3540; - --md-default-fg-color--light: #fff; - --md-typeset-a-color: #00b0f0; - --md-code-hl-comment-color: hsla(var(--md-hue), 75%, 90%, 0.43); - --tabbed-labels-color: rgb(52 58 70); -} - -[data-md-color-scheme="default"] { - --tabbed-labels-color: #7d829e26; -} - -/* General admonition styling */ -/* TODO: Write this in a way that supports the light theme */ -[data-md-color-scheme="slate"] .md-typeset details, -[data-md-color-scheme="slate"] .md-typeset .admonition { - border-color: transparent !important; -} - -.md-typeset :is(.admonition, details) { - margin: 0.55em 0; -} - -.md-typeset .admonition { - font-size: 0.7rem; -} - -.md-typeset .admonition:focus-within, -.md-typeset details:focus-within { - box-shadow: var(--md-shadow-z1) !important; -} - -/* Colors for "summary" admonition */ -[data-md-color-scheme="slate"] .md-typeset .admonition.summary { - background: #353a45; - padding: 0.8rem 1.4rem; - border-radius: 0.8rem; -} - -[data-md-color-scheme="slate"] .md-typeset .summary .admonition-title { - font-size: 1rem; - background: transparent; - padding-left: 0.6rem; - padding-bottom: 0; -} - -[data-md-color-scheme="slate"] .md-typeset .summary .admonition-title:before { - display: none; -} - -[data-md-color-scheme="slate"] .md-typeset .admonition.summary { - border-color: #ffffff17 !important; -} - -/* Colors for "note" admonition */ -[data-md-color-scheme="slate"] .md-typeset .admonition.note { - background: rgb(43 110 98/ 0.2); - padding: 0.8rem 1.4rem; - border-radius: 0.8rem; -} - -[data-md-color-scheme="slate"] .md-typeset .note .admonition-title { - font-size: 1rem; - background: transparent; - padding-bottom: 0; - color: rgb(68 172 153); -} - -[data-md-color-scheme="slate"] .md-typeset .note .admonition-title:before { - font-size: 1.1rem; - background-color: rgb(68 172 153); -} - -.md-typeset .note > .admonition-title:before, -.md-typeset .note > summary:before { - -webkit-mask-image: var(--md-admonition-icon--abstract); - mask-image: var(--md-admonition-icon--abstract); -} - -/* Colors for "warning" admonition */ -[data-md-color-scheme="slate"] .md-typeset .admonition.warning { - background: rgb(182 87 0 / 0.2); - padding: 0.8rem 1.4rem; - border-radius: 0.8rem; -} - -[data-md-color-scheme="slate"] .md-typeset .warning .admonition-title { - font-size: 1rem; - background: transparent; - padding-bottom: 0; - color: rgb(219 125 39); -} - -[data-md-color-scheme="slate"] .md-typeset .warning .admonition-title:before { - font-size: 1.1rem; - background-color: rgb(219 125 39); -} - -/* Colors for "info" admonition */ -[data-md-color-scheme="slate"] .md-typeset .admonition.info { - background: rgb(43 52 145 / 0.2); - padding: 0.8rem 1.4rem; - border-radius: 0.8rem; -} - -[data-md-color-scheme="slate"] .md-typeset .info .admonition-title { - font-size: 1rem; - background: transparent; - padding-bottom: 0; - color: rgb(136 145 236); -} - -[data-md-color-scheme="slate"] .md-typeset .info .admonition-title:before { - font-size: 1.1rem; - background-color: rgb(136 145 236); -} - -/* Colors for "example" admonition */ -[data-md-color-scheme="slate"] .md-typeset .admonition.example { - background: rgb(94 104 126); - border-radius: 0.4rem; -} - -[data-md-color-scheme="slate"] .md-typeset .example .admonition-title { - background: rgb(78 87 105); - color: rgb(246 247 249); -} - -[data-md-color-scheme="slate"] .md-typeset .example .admonition-title:before { - background-color: rgb(246 247 249); -} - -[data-md-color-scheme="slate"] .md-typeset .admonition.example code { - background: transparent; - color: #fff; -} - -/* Move the sidebars to the edges of the page */ -.md-main__inner.md-grid { - margin-left: 0; - margin-right: 0; - max-width: unset; - display: flex; - justify-content: center; -} - -.md-sidebar--primary { - margin-right: auto; -} - -.md-sidebar.md-sidebar--secondary { - margin-left: auto; -} - -.md-content { - max-width: 56rem; -} - -/* Maintain content positioning even if sidebars are disabled */ -@media screen and (min-width: 76.1875em) { - .md-sidebar { - display: block; - } - - .md-sidebar[hidden] { - visibility: hidden; - } -} - -/* Sidebar styling */ -@media screen and (min-width: 76.1875em) { - .md-nav--lifted > .md-nav__list > .md-nav__item--active > .md-nav__link { - text-transform: uppercase; - } - - .md-nav__title[for="__toc"] { - text-transform: uppercase; - margin: 0.5rem; - } - - .md-nav--lifted > .md-nav__list > .md-nav__item--active > .md-nav__link { - color: rgb(133 142 159); - margin: 0.5rem; - } - - .md-nav__item .md-nav__link { - position: relative; - } - - .md-nav__link:is(:focus, :hover):not(.md-nav__link--active) { - color: unset; - } - - .md-nav__item - .md-nav__link:is(:focus, :hover):not(.md-nav__link--active):before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - opacity: 0.2; - z-index: -1; - background-color: grey; - } - - .md-nav__item .md-nav__link--active:before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - opacity: 0.15; - z-index: -1; - background-color: var(--md-typeset-a-color); - } - - .md-nav__link { - padding: 0.5rem 0.5rem 0.5rem 1rem; - margin: 0; - border-radius: 0 10px 10px 0; - font-weight: 600; - overflow: hidden; - } - - .md-sidebar__scrollwrap { - margin: 0; - } - - [dir="ltr"] - .md-nav--lifted - .md-nav[data-md-level="1"] - > .md-nav__list - > .md-nav__item { - padding: 0; - } - - .md-nav__item--nested .md-nav__item .md-nav__item { - padding: 0; - } - - .md-nav__item--nested .md-nav__item .md-nav__item .md-nav__link { - font-weight: 300; - } - - .md-nav__item--nested .md-nav__item .md-nav__item .md-nav__link { - font-weight: 400; - padding-left: 1.25rem; - } -} - -/* Table of Contents styling */ -@media screen and (min-width: 60em) { - [data-md-component="sidebar"] .md-nav__title[for="__toc"] { - text-transform: uppercase; - margin: 0.5rem; - margin-left: 0; - } - - [data-md-component="toc"] .md-nav__item .md-nav__link--active { - position: relative; - } - - [data-md-component="toc"] .md-nav__item .md-nav__link--active:before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - opacity: 0.15; - z-index: -1; - background-color: var(--md-typeset-a-color); - } - - [data-md-component="toc"] .md-nav__link { - padding: 0.5rem 0.5rem; - margin: 0; - border-radius: 10px 0 0 10px; - } - [dir="ltr"] .md-sidebar__inner { - padding: 0; - } - - .md-nav__item { - padding: 0; - } -} - -/* Font changes */ -.md-typeset { - font-weight: 300; -} - -.md-typeset h1 { - font-weight: 500; - margin: 0; - font-size: 2.5em; -} - -.md-typeset h2 { - font-weight: 500; -} - -.md-typeset h3 { - font-weight: 600; -} - -/* Intro section styling */ -p.intro { - font-size: 0.9rem; - font-weight: 500; -} - -/* Hide invisible jump selectors */ -h2#overview { - visibility: hidden; - height: 0; - margin: 0; - padding: 0; -} - -/* Code blocks */ -.md-typeset pre > code { - border-radius: 16px; -} - -.md-typeset .highlighttable .linenos { - max-height: var(--code-max-height); - overflow: hidden; -} - -.md-typeset .tabbed-block .highlighttable code { - border-radius: 0; -} - -.md-typeset .tabbed-block { - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - overflow: hidden; -} - -.js .md-typeset .tabbed-labels { - background: var(--tabbed-labels-color); - border-top-left-radius: 8px; - border-top-right-radius: 8px; -} - -.md-typeset .tabbed-labels > label { - font-weight: 400; - font-size: 0.7rem; - padding-top: 0.55em; - padding-bottom: 0.35em; -} - -.md-typeset pre > code { - max-height: var(--code-max-height); -} - -/* Reduce height of outdated banner */ -.md-banner__inner { - margin: 0.45rem auto; -} From 169e33e5bcbc60e1f4e3a1c3524c8405d57af98e Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 14 Mar 2025 02:00:22 -0700 Subject: [PATCH 47/49] delete python src from this branch --- .../reactpy/reactpy/_console => }/__init__.py | 0 src/js/.eslintrc.json | 31 - src/js/.gitignore | 3 - src/js/README.md | 3 - src/js/app/.eslintrc.json | 19 - src/js/app/index.html | 15 - src/js/app/package-lock.json | 1189 ---- src/js/app/package.json | 28 - src/js/app/public/assets/reactpy-logo.ico | Bin 14916 -> 0 bytes src/js/app/src/index.ts | 12 - src/js/app/tsconfig.json | 14 - src/js/app/vite.config.js | 12 - src/js/package-lock.json | 6003 ----------------- src/js/package.json | 26 - src/js/packages/@reactpy/client/.gitignore | 8 - src/js/packages/@reactpy/client/README.md | 3 - src/js/packages/@reactpy/client/package.json | 34 - .../@reactpy/client/src/components.tsx | 227 - src/js/packages/@reactpy/client/src/index.ts | 5 - src/js/packages/@reactpy/client/src/logger.ts | 5 - .../packages/@reactpy/client/src/messages.ts | 17 - src/js/packages/@reactpy/client/src/mount.tsx | 8 - .../@reactpy/client/src/reactpy-client.ts | 264 - .../@reactpy/client/src/reactpy-vdom.tsx | 261 - src/js/packages/@reactpy/client/tsconfig.json | 14 - src/js/packages/event-to-object/package.json | 30 - src/js/packages/event-to-object/src/events.ts | 258 - src/js/packages/event-to-object/src/index.ts | 427 -- .../tests/event-to-object.test.ts | 381 -- .../event-to-object/tests/tooling/check.ts | 46 - .../event-to-object/tests/tooling/mock.ts | 61 - .../event-to-object/tests/tooling/setup.js | 22 - src/js/packages/event-to-object/tsconfig.json | 9 - .../event-to-object/tsconfig.tests.json | 16 - src/js/tsconfig.package.json | 22 - src/py/reactpy/.gitignore | 4 - src/py/reactpy/MANIFEST.in | 3 - src/py/reactpy/README.md | 23 - src/py/reactpy/pyproject.toml | 175 - src/py/reactpy/reactpy/__init__.py | 58 - src/py/reactpy/reactpy/__main__.py | 19 - src/py/reactpy/reactpy/_console/ast_utils.py | 186 - .../_console/rewrite_camel_case_props.py | 113 - .../reactpy/reactpy/_console/rewrite_keys.py | 112 - src/py/reactpy/reactpy/_option.py | 133 - src/py/reactpy/reactpy/_warnings.py | 36 - src/py/reactpy/reactpy/backend/__init__.py | 0 src/py/reactpy/reactpy/backend/_common.py | 146 - src/py/reactpy/reactpy/backend/default.py | 72 - src/py/reactpy/reactpy/backend/fastapi.py | 25 - src/py/reactpy/reactpy/backend/flask.py | 298 - src/py/reactpy/reactpy/backend/hooks.py | 29 - src/py/reactpy/reactpy/backend/sanic.py | 223 - src/py/reactpy/reactpy/backend/starlette.py | 172 - src/py/reactpy/reactpy/backend/tornado.py | 227 - src/py/reactpy/reactpy/backend/types.py | 76 - src/py/reactpy/reactpy/backend/utils.py | 98 - src/py/reactpy/reactpy/config.py | 61 - src/py/reactpy/reactpy/core/__init__.py | 0 src/py/reactpy/reactpy/core/_f_back.py | 24 - src/py/reactpy/reactpy/core/_thread_local.py | 21 - src/py/reactpy/reactpy/core/component.py | 66 - src/py/reactpy/reactpy/core/events.py | 220 - src/py/reactpy/reactpy/core/hooks.py | 750 -- src/py/reactpy/reactpy/core/layout.py | 698 -- src/py/reactpy/reactpy/core/serve.py | 63 - src/py/reactpy/reactpy/core/types.py | 235 - src/py/reactpy/reactpy/core/vdom.py | 355 - src/py/reactpy/reactpy/future.py | 0 src/py/reactpy/reactpy/html.py | 544 -- src/py/reactpy/reactpy/logging.py | 42 - src/py/reactpy/reactpy/py.typed | 1 - src/py/reactpy/reactpy/sample.py | 21 - src/py/reactpy/reactpy/svg.py | 139 - src/py/reactpy/reactpy/testing/__init__.py | 27 - src/py/reactpy/reactpy/testing/backend.py | 230 - src/py/reactpy/reactpy/testing/common.py | 212 - src/py/reactpy/reactpy/testing/display.py | 91 - src/py/reactpy/reactpy/testing/logs.py | 178 - src/py/reactpy/reactpy/types.py | 51 - src/py/reactpy/reactpy/utils.py | 322 - src/py/reactpy/reactpy/web/__init__.py | 15 - src/py/reactpy/reactpy/web/module.py | 390 -- src/py/reactpy/reactpy/web/templates/react.js | 60 - src/py/reactpy/reactpy/web/utils.py | 155 - src/py/reactpy/reactpy/widgets.py | 103 - src/py/reactpy/tests/__init__.py | 0 src/py/reactpy/tests/conftest.py | 80 - .../reactpy/tests/test__console/__init__.py | 0 .../test_rewrite_camel_case_props.py | 118 - .../tests/test__console/test_rewrite_keys.py | 237 - src/py/reactpy/tests/test__option.py | 111 - src/py/reactpy/tests/test_backend/__init__.py | 0 .../tests/test_backend/test__common.py | 70 - src/py/reactpy/tests/test_backend/test_all.py | 174 - .../reactpy/tests/test_backend/test_utils.py | 46 - src/py/reactpy/tests/test_client.py | 161 - src/py/reactpy/tests/test_config.py | 29 - src/py/reactpy/tests/test_core/__init__.py | 0 .../reactpy/tests/test_core/test_component.py | 73 - src/py/reactpy/tests/test_core/test_events.py | 223 - src/py/reactpy/tests/test_core/test_hooks.py | 1259 ---- src/py/reactpy/tests/test_core/test_layout.py | 1192 ---- src/py/reactpy/tests/test_core/test_serve.py | 139 - src/py/reactpy/tests/test_core/test_vdom.py | 307 - src/py/reactpy/tests/test_html.py | 160 - src/py/reactpy/tests/test_sample.py | 8 - src/py/reactpy/tests/test_testing.py | 218 - src/py/reactpy/tests/test_utils.py | 274 - src/py/reactpy/tests/test_web/__init__.py | 0 .../js_fixtures/component-can-have-child.js | 27 - .../js_fixtures/export-resolution/index.js | 2 - .../js_fixtures/export-resolution/one.js | 5 - .../js_fixtures/export-resolution/two.js | 2 - .../test_web/js_fixtures/exports-syntax.js | 23 - .../js_fixtures/exports-two-components.js | 20 - .../set-flag-when-unmount-is-called.js | 31 - .../test_web/js_fixtures/simple-button.js | 25 - src/py/reactpy/tests/test_web/test_module.py | 235 - src/py/reactpy/tests/test_web/test_utils.py | 152 - src/py/reactpy/tests/test_widgets.py | 141 - src/py/reactpy/tests/tooling/__init__.py | 0 src/py/reactpy/tests/tooling/asserts.py | 5 - src/py/reactpy/tests/tooling/common.py | 14 - src/py/reactpy/tests/tooling/hooks.py | 15 - src/py/reactpy/tests/tooling/loop.py | 91 - 126 files changed, 22442 deletions(-) rename src/{py/reactpy/reactpy/_console => }/__init__.py (100%) delete mode 100644 src/js/.eslintrc.json delete mode 100644 src/js/.gitignore delete mode 100644 src/js/README.md delete mode 100644 src/js/app/.eslintrc.json delete mode 100644 src/js/app/index.html delete mode 100644 src/js/app/package-lock.json delete mode 100644 src/js/app/package.json delete mode 100644 src/js/app/public/assets/reactpy-logo.ico delete mode 100644 src/js/app/src/index.ts delete mode 100644 src/js/app/tsconfig.json delete mode 100644 src/js/app/vite.config.js delete mode 100644 src/js/package-lock.json delete mode 100644 src/js/package.json delete mode 100644 src/js/packages/@reactpy/client/.gitignore delete mode 100644 src/js/packages/@reactpy/client/README.md delete mode 100644 src/js/packages/@reactpy/client/package.json delete mode 100644 src/js/packages/@reactpy/client/src/components.tsx delete mode 100644 src/js/packages/@reactpy/client/src/index.ts delete mode 100644 src/js/packages/@reactpy/client/src/logger.ts delete mode 100644 src/js/packages/@reactpy/client/src/messages.ts delete mode 100644 src/js/packages/@reactpy/client/src/mount.tsx delete mode 100644 src/js/packages/@reactpy/client/src/reactpy-client.ts delete mode 100644 src/js/packages/@reactpy/client/src/reactpy-vdom.tsx delete mode 100644 src/js/packages/@reactpy/client/tsconfig.json delete mode 100644 src/js/packages/event-to-object/package.json delete mode 100644 src/js/packages/event-to-object/src/events.ts delete mode 100644 src/js/packages/event-to-object/src/index.ts delete mode 100644 src/js/packages/event-to-object/tests/event-to-object.test.ts delete mode 100644 src/js/packages/event-to-object/tests/tooling/check.ts delete mode 100644 src/js/packages/event-to-object/tests/tooling/mock.ts delete mode 100644 src/js/packages/event-to-object/tests/tooling/setup.js delete mode 100644 src/js/packages/event-to-object/tsconfig.json delete mode 100644 src/js/packages/event-to-object/tsconfig.tests.json delete mode 100644 src/js/tsconfig.package.json delete mode 100644 src/py/reactpy/.gitignore delete mode 100644 src/py/reactpy/MANIFEST.in delete mode 100644 src/py/reactpy/README.md delete mode 100644 src/py/reactpy/pyproject.toml delete mode 100644 src/py/reactpy/reactpy/__init__.py delete mode 100644 src/py/reactpy/reactpy/__main__.py delete mode 100644 src/py/reactpy/reactpy/_console/ast_utils.py delete mode 100644 src/py/reactpy/reactpy/_console/rewrite_camel_case_props.py delete mode 100644 src/py/reactpy/reactpy/_console/rewrite_keys.py delete mode 100644 src/py/reactpy/reactpy/_option.py delete mode 100644 src/py/reactpy/reactpy/_warnings.py delete mode 100644 src/py/reactpy/reactpy/backend/__init__.py delete mode 100644 src/py/reactpy/reactpy/backend/_common.py delete mode 100644 src/py/reactpy/reactpy/backend/default.py delete mode 100644 src/py/reactpy/reactpy/backend/fastapi.py delete mode 100644 src/py/reactpy/reactpy/backend/flask.py delete mode 100644 src/py/reactpy/reactpy/backend/hooks.py delete mode 100644 src/py/reactpy/reactpy/backend/sanic.py delete mode 100644 src/py/reactpy/reactpy/backend/starlette.py delete mode 100644 src/py/reactpy/reactpy/backend/tornado.py delete mode 100644 src/py/reactpy/reactpy/backend/types.py delete mode 100644 src/py/reactpy/reactpy/backend/utils.py delete mode 100644 src/py/reactpy/reactpy/config.py delete mode 100644 src/py/reactpy/reactpy/core/__init__.py delete mode 100644 src/py/reactpy/reactpy/core/_f_back.py delete mode 100644 src/py/reactpy/reactpy/core/_thread_local.py delete mode 100644 src/py/reactpy/reactpy/core/component.py delete mode 100644 src/py/reactpy/reactpy/core/events.py delete mode 100644 src/py/reactpy/reactpy/core/hooks.py delete mode 100644 src/py/reactpy/reactpy/core/layout.py delete mode 100644 src/py/reactpy/reactpy/core/serve.py delete mode 100644 src/py/reactpy/reactpy/core/types.py delete mode 100644 src/py/reactpy/reactpy/core/vdom.py delete mode 100644 src/py/reactpy/reactpy/future.py delete mode 100644 src/py/reactpy/reactpy/html.py delete mode 100644 src/py/reactpy/reactpy/logging.py delete mode 100644 src/py/reactpy/reactpy/py.typed delete mode 100644 src/py/reactpy/reactpy/sample.py delete mode 100644 src/py/reactpy/reactpy/svg.py delete mode 100644 src/py/reactpy/reactpy/testing/__init__.py delete mode 100644 src/py/reactpy/reactpy/testing/backend.py delete mode 100644 src/py/reactpy/reactpy/testing/common.py delete mode 100644 src/py/reactpy/reactpy/testing/display.py delete mode 100644 src/py/reactpy/reactpy/testing/logs.py delete mode 100644 src/py/reactpy/reactpy/types.py delete mode 100644 src/py/reactpy/reactpy/utils.py delete mode 100644 src/py/reactpy/reactpy/web/__init__.py delete mode 100644 src/py/reactpy/reactpy/web/module.py delete mode 100644 src/py/reactpy/reactpy/web/templates/react.js delete mode 100644 src/py/reactpy/reactpy/web/utils.py delete mode 100644 src/py/reactpy/reactpy/widgets.py delete mode 100644 src/py/reactpy/tests/__init__.py delete mode 100644 src/py/reactpy/tests/conftest.py delete mode 100644 src/py/reactpy/tests/test__console/__init__.py delete mode 100644 src/py/reactpy/tests/test__console/test_rewrite_camel_case_props.py delete mode 100644 src/py/reactpy/tests/test__console/test_rewrite_keys.py delete mode 100644 src/py/reactpy/tests/test__option.py delete mode 100644 src/py/reactpy/tests/test_backend/__init__.py delete mode 100644 src/py/reactpy/tests/test_backend/test__common.py delete mode 100644 src/py/reactpy/tests/test_backend/test_all.py delete mode 100644 src/py/reactpy/tests/test_backend/test_utils.py delete mode 100644 src/py/reactpy/tests/test_client.py delete mode 100644 src/py/reactpy/tests/test_config.py delete mode 100644 src/py/reactpy/tests/test_core/__init__.py delete mode 100644 src/py/reactpy/tests/test_core/test_component.py delete mode 100644 src/py/reactpy/tests/test_core/test_events.py delete mode 100644 src/py/reactpy/tests/test_core/test_hooks.py delete mode 100644 src/py/reactpy/tests/test_core/test_layout.py delete mode 100644 src/py/reactpy/tests/test_core/test_serve.py delete mode 100644 src/py/reactpy/tests/test_core/test_vdom.py delete mode 100644 src/py/reactpy/tests/test_html.py delete mode 100644 src/py/reactpy/tests/test_sample.py delete mode 100644 src/py/reactpy/tests/test_testing.py delete mode 100644 src/py/reactpy/tests/test_utils.py delete mode 100644 src/py/reactpy/tests/test_web/__init__.py delete mode 100644 src/py/reactpy/tests/test_web/js_fixtures/component-can-have-child.js delete mode 100644 src/py/reactpy/tests/test_web/js_fixtures/export-resolution/index.js delete mode 100644 src/py/reactpy/tests/test_web/js_fixtures/export-resolution/one.js delete mode 100644 src/py/reactpy/tests/test_web/js_fixtures/export-resolution/two.js delete mode 100644 src/py/reactpy/tests/test_web/js_fixtures/exports-syntax.js delete mode 100644 src/py/reactpy/tests/test_web/js_fixtures/exports-two-components.js delete mode 100644 src/py/reactpy/tests/test_web/js_fixtures/set-flag-when-unmount-is-called.js delete mode 100644 src/py/reactpy/tests/test_web/js_fixtures/simple-button.js delete mode 100644 src/py/reactpy/tests/test_web/test_module.py delete mode 100644 src/py/reactpy/tests/test_web/test_utils.py delete mode 100644 src/py/reactpy/tests/test_widgets.py delete mode 100644 src/py/reactpy/tests/tooling/__init__.py delete mode 100644 src/py/reactpy/tests/tooling/asserts.py delete mode 100644 src/py/reactpy/tests/tooling/common.py delete mode 100644 src/py/reactpy/tests/tooling/hooks.py delete mode 100644 src/py/reactpy/tests/tooling/loop.py diff --git a/src/py/reactpy/reactpy/_console/__init__.py b/src/__init__.py similarity index 100% rename from src/py/reactpy/reactpy/_console/__init__.py rename to src/__init__.py diff --git a/src/js/.eslintrc.json b/src/js/.eslintrc.json deleted file mode 100644 index 8536da62b..000000000 --- a/src/js/.eslintrc.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "env": { - "browser": true, - "node": true, - "es2021": true - }, - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:@typescript-eslint/recommended" - ], - "overrides": [], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "plugins": ["react", "@typescript-eslint"], - "rules": { - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-empty-function": "off", - "react/prop-types": "off" - }, - "settings": { - "react": { - "version": "detect" - } - } -} diff --git a/src/js/.gitignore b/src/js/.gitignore deleted file mode 100644 index fedd7ea26..000000000 --- a/src/js/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -tsconfig.tsbuildinfo -packages/**/package-lock.json -dist diff --git a/src/js/README.md b/src/js/README.md deleted file mode 100644 index e99df49c0..000000000 --- a/src/js/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# ReactPy Client - -An ES6 Javascript client for ReactPy diff --git a/src/js/app/.eslintrc.json b/src/js/app/.eslintrc.json deleted file mode 100644 index 442025c3d..000000000 --- a/src/js/app/.eslintrc.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "env": { - "browser": true, - "es2021": true - }, - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:@typescript-eslint/recommended" - ], - "overrides": [], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "plugins": ["react", "@typescript-eslint"], - "rules": {} -} diff --git a/src/js/app/index.html b/src/js/app/index.html deleted file mode 100644 index e94280368..000000000 --- a/src/js/app/index.html +++ /dev/null @@ -1,15 +0,0 @@ -<!doctype html> -<html lang="en"> - <head> - <meta charset="utf-8" /> - <script type="module"> - import { app } from "./src/index"; - app(document.getElementById("app")); - </script> - <!-- we replace this with user-provided head elements --> - {__head__} - </head> - <body> - <div id="app"></div> - </body> -</html> diff --git a/src/js/app/package-lock.json b/src/js/app/package-lock.json deleted file mode 100644 index 9794c53d6..000000000 --- a/src/js/app/package-lock.json +++ /dev/null @@ -1,1189 +0,0 @@ -{ - "name": "ui", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "license": "MIT", - "dependencies": { - "@reactpy/client": "^0.2.0", - "preact": "^10.7.0" - }, - "devDependencies": { - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "typescript": "^4.9.5", - "vite": "^3.2.7" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@reactpy/client": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@reactpy/client/-/client-0.2.1.tgz", - "integrity": "sha512-9sgGH+pJ2BpLT+QSVe7FQLS2VQ9acHgPlO8X3qiTumGw43O0X82sm8pzya8H8dAew463SeGza/pZc0mpUBHmqA==", - "dependencies": { - "event-to-object": "^0.1.2", - "json-pointer": "^0.6.2" - }, - "peerDependencies": { - "react": ">=16 <18", - "react-dom": ">=16 <18" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "node_modules/@types/react": { - "version": "17.0.57", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.57.tgz", - "integrity": "sha512-e4msYpu5QDxzNrXDHunU/VPyv2M1XemGG/p7kfCjUiPtlLDCWLGQfgAMng6YyisWYxZ09mYdQlmMnyS0NfZdEg==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "17.0.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.19.tgz", - "integrity": "sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==", - "dev": true, - "dependencies": { - "@types/react": "^17" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/event-to-object": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/event-to-object/-/event-to-object-0.1.2.tgz", - "integrity": "sha512-+fUmp1XOCZiYomwe5Zxp4IlchuZZfdVdjFUk5MbgRT4M+V2TEWKc0jJwKLCX/nxlJ6xM5VUb/ylzERh7YDCRrg==", - "dependencies": { - "json-pointer": "^0.6.2" - } - }, - "node_modules/foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "peer": true - }, - "node_modules/json-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "dependencies": { - "foreach": "^2.0.4" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "peer": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/preact": { - "version": "10.13.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.13.2.tgz", - "integrity": "sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/vite": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", - "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==", - "dev": true, - "dependencies": { - "esbuild": "^0.15.9", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - } - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "dev": true, - "optional": true - }, - "@reactpy/client": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@reactpy/client/-/client-0.2.1.tgz", - "integrity": "sha512-9sgGH+pJ2BpLT+QSVe7FQLS2VQ9acHgPlO8X3qiTumGw43O0X82sm8pzya8H8dAew463SeGza/pZc0mpUBHmqA==", - "requires": { - "event-to-object": "^0.1.2", - "json-pointer": "^0.6.2" - } - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "@types/react": { - "version": "17.0.57", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.57.tgz", - "integrity": "sha512-e4msYpu5QDxzNrXDHunU/VPyv2M1XemGG/p7kfCjUiPtlLDCWLGQfgAMng6YyisWYxZ09mYdQlmMnyS0NfZdEg==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "17.0.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.19.tgz", - "integrity": "sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==", - "dev": true, - "requires": { - "@types/react": "^17" - } - }, - "@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true - }, - "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "dev": true, - "optional": true - }, - "event-to-object": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/event-to-object/-/event-to-object-0.1.2.tgz", - "integrity": "sha512-+fUmp1XOCZiYomwe5Zxp4IlchuZZfdVdjFUk5MbgRT4M+V2TEWKc0jJwKLCX/nxlJ6xM5VUb/ylzERh7YDCRrg==", - "requires": { - "json-pointer": "^0.6.2" - } - }, - "foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "peer": true - }, - "json-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "requires": { - "foreach": "^2.0.4" - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "peer": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "peer": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "preact": { - "version": "10.13.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.13.2.tgz", - "integrity": "sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==" - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true - }, - "vite": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", - "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==", - "dev": true, - "requires": { - "esbuild": "^0.15.9", - "fsevents": "~2.3.2", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" - } - } - } -} diff --git a/src/js/app/package.json b/src/js/app/package.json deleted file mode 100644 index 40ce94739..000000000 --- a/src/js/app/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "author": "Ryan Morshead", - "license": "MIT", - "main": "src/dist/index.js", - "types": "src/dist/index.d.ts", - "description": "A client application for ReactPy implemented in React", - "dependencies": { - "@reactpy/client": "^0.2.0", - "preact": "^10.7.0" - }, - "devDependencies": { - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "typescript": "^4.9.5", - "vite": "^3.2.7" - }, - "repository": { - "type": "git", - "url": "https://github.com/reactive-python/reactpy" - }, - "scripts": { - "build": "vite build", - "format": "prettier --write . && eslint --fix .", - "test": "npm run check:tests", - "check:tests": "echo 'no tests'", - "check:types": "tsc --noEmit" - } -} diff --git a/src/js/app/public/assets/reactpy-logo.ico b/src/js/app/public/assets/reactpy-logo.ico deleted file mode 100644 index 62be5f5ba7e159e3977d1ae42d4bea1734854c1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14916 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 C+JImH diff --git a/src/js/app/src/index.ts b/src/js/app/src/index.ts deleted file mode 100644 index 1f47853aa..000000000 --- a/src/js/app/src/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { mount, SimpleReactPyClient } from "@reactpy/client"; - -export function app(element: HTMLElement) { - const client = new SimpleReactPyClient({ - serverLocation: { - url: document.location.origin, - route: document.location.pathname, - query: document.location.search, - }, - }); - mount(element, client); -} diff --git a/src/js/app/tsconfig.json b/src/js/app/tsconfig.json deleted file mode 100644 index c736ab13d..000000000 --- a/src/js/app/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../tsconfig.package.json", - "compilerOptions": { - "outDir": "dist", - "rootDir": "src", - "composite": true - }, - "include": ["src"], - "references": [ - { - "path": "../packages/@reactpy/client" - } - ] -} diff --git a/src/js/app/vite.config.js b/src/js/app/vite.config.js deleted file mode 100644 index c97fb6dac..000000000 --- a/src/js/app/vite.config.js +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from "vite"; - -export default defineConfig({ - build: { emptyOutDir: true }, - resolve: { - alias: { - react: "preact/compat", - "react-dom": "preact/compat", - }, - }, - base: "/_reactpy/", -}); diff --git a/src/js/package-lock.json b/src/js/package-lock.json deleted file mode 100644 index 2edfdd260..000000000 --- a/src/js/package-lock.json +++ /dev/null @@ -1,6003 +0,0 @@ -{ - "name": "js", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "license": "MIT", - "workspaces": [ - "packages/event-to-object", - "packages/@reactpy/client", - "app" - ], - "devDependencies": { - "@typescript-eslint/eslint-plugin": "^5.58.0", - "@typescript-eslint/parser": "^5.58.0", - "eslint": "^8.38.0", - "eslint-plugin-react": "^7.32.2", - "prettier": "^3.0.0-alpha.6" - } - }, - "app": { - "license": "MIT", - "dependencies": { - "@reactpy/client": "^0.2.0", - "preact": "^10.7.0" - }, - "devDependencies": { - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "typescript": "^4.9.5", - "vite": "^3.1.8" - } - }, - "app/node_modules/@reactpy/client": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@reactpy/client/-/client-0.2.1.tgz", - "integrity": "sha512-9sgGH+pJ2BpLT+QSVe7FQLS2VQ9acHgPlO8X3qiTumGw43O0X82sm8pzya8H8dAew463SeGza/pZc0mpUBHmqA==", - "dependencies": { - "event-to-object": "^0.1.2", - "json-pointer": "^0.6.2" - }, - "peerDependencies": { - "react": ">=16 <18", - "react-dom": ">=16 <18" - } - }, - "app/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "apps/ui": { - "extraneous": true, - "license": "MIT", - "dependencies": { - "@reactpy/client": "^0.2.0", - "preact": "^10.7.0" - }, - "devDependencies": { - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "prettier": "^3.0.0-alpha.6", - "typescript": "^4.9.5", - "vite": "^3.1.8" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.1", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", - "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@reactpy/client": { - "resolved": "packages/@reactpy/client", - "link": true - }, - "node_modules/@types/json-pointer": { - "version": "1.0.31", - "resolved": "https://registry.npmjs.org/@types/json-pointer/-/json-pointer-1.0.31.tgz", - "integrity": "sha512-hTPul7Um6LqsHXHQpdkXTU7Oysjsf+9k4Yfmg6JhSKG/jj9QuQGyMUdj6trPH6WHiIdxw7nYSROgOxeFmCVK2w==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "node_modules/@types/react": { - "version": "17.0.53", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.53.tgz", - "integrity": "sha512-1yIpQR2zdYu1Z/dc1OxC+MA6GR240u3gcnP4l6mvj/PJiVaqHsQPmWttsvHsfnhfPbU2FuGmo0wSITPygjBmsw==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "17.0.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.19.tgz", - "integrity": "sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==", - "dev": true, - "dependencies": { - "@types/react": "^17" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz", - "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/type-utils": "5.58.0", - "@typescript-eslint/utils": "5.58.0", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", - "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz", - "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.58.0", - "@typescript-eslint/utils": "5.58.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz", - "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.58.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/app": { - "resolved": "app", - "link": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true - }, - "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", - "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.38.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-to-object": { - "resolved": "packages/event-to-object", - "link": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/happy-dom": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-8.9.0.tgz", - "integrity": "sha512-JZwJuGdR7ko8L61136YzmrLv7LgTh5b8XaEM3P709mLjyQuXJ3zHTDXvUtBBahRjGlcYW0zGjIiEWizoTUGKfA==", - "dev": true, - "dependencies": { - "css.escape": "^1.5.1", - "he": "^1.2.0", - "iconv-lite": "^0.6.3", - "node-fetch": "^2.x.x", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "dependencies": { - "foreach": "^2.0.4" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/preact": { - "version": "10.15.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", - "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0-alpha.6.tgz", - "integrity": "sha512-AdbQSZ6Oo+iy9Ekzmsgno05P1uX2vqPkjOMJqRfP8hTe+m6iDw4Nt7bPFpWZ/HYCU+3f0P5U0o2ghxQwwkLH7A==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/semver": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", - "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsm": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tsm/-/tsm-2.3.0.tgz", - "integrity": "sha512-++0HFnmmR+gMpDtKTnW3XJ4yv9kVGi20n+NfyQWB9qwJvTaIWY9kBmzek2YUQK5APTQ/1DTrXmm4QtFPmW9Rzw==", - "dev": true, - "dependencies": { - "esbuild": "^0.15.16" - }, - "bin": { - "tsm": "bin.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dev": true, - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/vite": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", - "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==", - "dev": true, - "dependencies": { - "esbuild": "^0.15.9", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/whatwg-url/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/@reactpy/client": { - "version": "0.3.1", - "license": "MIT", - "dependencies": { - "event-to-object": "^0.1.2", - "json-pointer": "^0.6.2" - }, - "devDependencies": { - "@types/json-pointer": "^1.0.31", - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "typescript": "^4.9.5" - }, - "peerDependencies": { - "react": ">=16 <18", - "react-dom": ">=16 <18" - } - }, - "packages/@reactpy/client/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "packages/app": { - "name": "@reactpy/app", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@reactpy/client": "^0.1.0", - "preact": "^10.7.0" - }, - "devDependencies": { - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "prettier": "^3.0.0-alpha.6", - "typescript": "^4.9.5", - "vite": "^3.1.8" - } - }, - "packages/client": { - "name": "@reactpy/client", - "version": "0.2.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "event-to-object": "^0.1.0", - "json-pointer": "^0.6.2" - }, - "devDependencies": { - "@types/json-pointer": "^1.0.31", - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "prettier": "^3.0.0-alpha.6", - "typescript": "^4.9.5" - }, - "peerDependencies": { - "react": ">=16 <18", - "react-dom": ">=16 <18" - } - }, - "packages/event-to-object": { - "version": "0.1.2", - "license": "MIT", - "dependencies": { - "json-pointer": "^0.6.2" - }, - "devDependencies": { - "happy-dom": "^8.9.0", - "lodash": "^4.17.21", - "tsm": "^2.0.0", - "typescript": "^4.9.5", - "uvu": "^0.5.1" - } - }, - "packages/event-to-object/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "packages/event-to-object/packages/event-to-object": { - "extraneous": true - }, - "ui": { - "extraneous": true, - "license": "MIT", - "dependencies": { - "@reactpy/client": "^0.2.0", - "preact": "^10.7.0" - }, - "devDependencies": { - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "typescript": "^4.9.5", - "vite": "^3.1.8" - } - } - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.1", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", - "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@reactpy/client": { - "version": "file:packages/@reactpy/client", - "requires": { - "@types/json-pointer": "^1.0.31", - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "event-to-object": "^0.1.2", - "json-pointer": "^0.6.2", - "typescript": "^4.9.5" - }, - "dependencies": { - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true - } - } - }, - "@types/json-pointer": { - "version": "1.0.31", - "resolved": "https://registry.npmjs.org/@types/json-pointer/-/json-pointer-1.0.31.tgz", - "integrity": "sha512-hTPul7Um6LqsHXHQpdkXTU7Oysjsf+9k4Yfmg6JhSKG/jj9QuQGyMUdj6trPH6WHiIdxw7nYSROgOxeFmCVK2w==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "@types/react": { - "version": "17.0.53", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.53.tgz", - "integrity": "sha512-1yIpQR2zdYu1Z/dc1OxC+MA6GR240u3gcnP4l6mvj/PJiVaqHsQPmWttsvHsfnhfPbU2FuGmo0wSITPygjBmsw==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "17.0.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.19.tgz", - "integrity": "sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==", - "dev": true, - "requires": { - "@types/react": "^17" - } - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true - }, - "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz", - "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/type-utils": "5.58.0", - "@typescript-eslint/utils": "5.58.0", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", - "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz", - "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.58.0", - "@typescript-eslint/utils": "5.58.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz", - "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.58.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "app": { - "version": "file:app", - "requires": { - "@reactpy/client": "^0.2.0", - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "preact": "^10.7.0", - "typescript": "^4.9.5", - "vite": "^3.1.8" - }, - "dependencies": { - "@reactpy/client": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@reactpy/client/-/client-0.2.1.tgz", - "integrity": "sha512-9sgGH+pJ2BpLT+QSVe7FQLS2VQ9acHgPlO8X3qiTumGw43O0X82sm8pzya8H8dAew463SeGza/pZc0mpUBHmqA==", - "requires": { - "event-to-object": "^0.1.2", - "json-pointer": "^0.6.2" - } - }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true - } - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true - }, - "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true - }, - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - } - }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "dev": true, - "optional": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", - "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.38.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - } - }, - "eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true - }, - "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-to-object": { - "version": "file:packages/event-to-object", - "requires": { - "happy-dom": "^8.9.0", - "json-pointer": "^0.6.2", - "lodash": "^4.17.21", - "tsm": "^2.0.0", - "typescript": "^4.9.5", - "uvu": "^0.5.1" - }, - "dependencies": { - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "happy-dom": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-8.9.0.tgz", - "integrity": "sha512-JZwJuGdR7ko8L61136YzmrLv7LgTh5b8XaEM3P709mLjyQuXJ3zHTDXvUtBBahRjGlcYW0zGjIiEWizoTUGKfA==", - "dev": true, - "requires": { - "css.escape": "^1.5.1", - "he": "^1.2.0", - "iconv-lite": "^0.6.3", - "node-fetch": "^2.x.x", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "requires": { - "foreach": "^2.0.4" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - } - }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "preact": { - "version": "10.15.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", - "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "3.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0-alpha.6.tgz", - "integrity": "sha512-AdbQSZ6Oo+iy9Ekzmsgno05P1uX2vqPkjOMJqRfP8hTe+m6iDw4Nt7bPFpWZ/HYCU+3f0P5U0o2ghxQwwkLH7A==", - "dev": true - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "requires": { - "mri": "^1.1.0" - } - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "semver": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", - "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsm": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tsm/-/tsm-2.3.0.tgz", - "integrity": "sha512-++0HFnmmR+gMpDtKTnW3XJ4yv9kVGi20n+NfyQWB9qwJvTaIWY9kBmzek2YUQK5APTQ/1DTrXmm4QtFPmW9Rzw==", - "dev": true, - "requires": { - "esbuild": "^0.15.16" - } - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "dev": true, - "peer": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dev": true, - "requires": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - } - }, - "vite": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", - "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==", - "dev": true, - "requires": { - "esbuild": "^0.15.9", - "fsevents": "~2.3.2", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "requires": { - "iconv-lite": "0.6.3" - } - }, - "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - } - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/src/js/package.json b/src/js/package.json deleted file mode 100644 index a9d84814b..000000000 --- a/src/js/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "license": "MIT", - "scripts": { - "publish": "npm --workspaces publish", - "test": "npm --workspaces test", - "build": "npm --workspaces run build", - "fix:format": "npm run prettier -- --write && npm run eslint -- --fix", - "check:format": "npm run prettier -- --check && npm run eslint", - "check:tests": "npm --workspaces run check:tests", - "check:types": "npm --workspaces run check:types", - "prettier": "prettier --ignore-path .gitignore .", - "eslint": "eslint --ignore-path .gitignore ." - }, - "workspaces": [ - "packages/event-to-object", - "packages/@reactpy/client", - "app" - ], - "devDependencies": { - "@typescript-eslint/eslint-plugin": "^5.58.0", - "@typescript-eslint/parser": "^5.58.0", - "eslint": "^8.38.0", - "eslint-plugin-react": "^7.32.2", - "prettier": "^3.0.0-alpha.6" - } -} diff --git a/src/js/packages/@reactpy/client/.gitignore b/src/js/packages/@reactpy/client/.gitignore deleted file mode 100644 index 787df98f6..000000000 --- a/src/js/packages/@reactpy/client/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Javascript -# ---------- -node_modules - -# IDE -# --- -.vscode -.idea diff --git a/src/js/packages/@reactpy/client/README.md b/src/js/packages/@reactpy/client/README.md deleted file mode 100644 index a01929943..000000000 --- a/src/js/packages/@reactpy/client/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @reactpy/client - -A client for ReactPy implemented in React diff --git a/src/js/packages/@reactpy/client/package.json b/src/js/packages/@reactpy/client/package.json deleted file mode 100644 index ab4bd34ad..000000000 --- a/src/js/packages/@reactpy/client/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "author": "Ryan Morshead", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "description": "A client for ReactPy implemented in React", - "license": "MIT", - "name": "@reactpy/client", - "type": "module", - "version": "0.3.1", - "dependencies": { - "event-to-object": "^0.1.2", - "json-pointer": "^0.6.2" - }, - "devDependencies": { - "@types/json-pointer": "^1.0.31", - "@types/react": "^17.0", - "@types/react-dom": "^17.0", - "typescript": "^4.9.5" - }, - "peerDependencies": { - "react": ">=16 <18", - "react-dom": ">=16 <18" - }, - "repository": { - "type": "git", - "url": "https://github.com/reactive-python/reactpy" - }, - "scripts": { - "build": "tsc -b", - "test": "npm run check:tests", - "check:tests": "echo 'no tests'", - "check:types": "tsc --noEmit" - } -} diff --git a/src/js/packages/@reactpy/client/src/components.tsx b/src/js/packages/@reactpy/client/src/components.tsx deleted file mode 100644 index 728c4cec7..000000000 --- a/src/js/packages/@reactpy/client/src/components.tsx +++ /dev/null @@ -1,227 +0,0 @@ -import React, { - createElement, - createContext, - useState, - useRef, - useContext, - useEffect, - Fragment, - MutableRefObject, - ChangeEvent, -} from "react"; -// @ts-ignore -import { set as setJsonPointer } from "json-pointer"; -import { - ReactPyVdom, - ReactPyComponent, - createChildren, - createAttributes, - loadImportSource, - ImportSourceBinding, -} from "./reactpy-vdom"; -import { ReactPyClient } from "./reactpy-client"; - -const ClientContext = createContext<ReactPyClient>(null as any); - -export function Layout(props: { client: ReactPyClient }): JSX.Element { - const currentModel: ReactPyVdom = useState({ tagName: "" })[0]; - const forceUpdate = useForceUpdate(); - - useEffect( - () => - props.client.onMessage("layout-update", ({ path, model }) => { - if (path === "") { - Object.assign(currentModel, model); - } else { - setJsonPointer(currentModel, path, model); - } - forceUpdate(); - }), - [currentModel, props.client], - ); - - return ( - <ClientContext.Provider value={props.client}> - <Element model={currentModel} /> - </ClientContext.Provider> - ); -} - -export function Element({ model }: { model: ReactPyVdom }): JSX.Element | null { - if (model.error !== undefined) { - if (model.error) { - return <pre>{model.error}</pre>; - } else { - return null; - } - } - - let SpecializedElement: ReactPyComponent; - if (model.tagName in SPECIAL_ELEMENTS) { - SpecializedElement = - SPECIAL_ELEMENTS[model.tagName as keyof typeof SPECIAL_ELEMENTS]; - } else if (model.importSource) { - SpecializedElement = ImportedElement; - } else { - SpecializedElement = StandardElement; - } - - return <SpecializedElement model={model} />; -} - -function StandardElement({ model }: { model: ReactPyVdom }) { - const client = React.useContext(ClientContext); - // Use createElement here to avoid warning about variable numbers of children not - // having keys. Warning about this must now be the responsibility of the client - // providing the models instead of the client rendering them. - return createElement( - model.tagName === "" ? Fragment : model.tagName, - createAttributes(model, client), - ...createChildren(model, (child) => { - return <Element model={child} key={child.key} />; - }), - ); -} - -function UserInputElement({ model }: { model: ReactPyVdom }): JSX.Element { - const client = useContext(ClientContext); - const props = createAttributes(model, client); - const [value, setValue] = React.useState(props.value); - - // honor changes to value from the client via props - React.useEffect(() => setValue(props.value), [props.value]); - - const givenOnChange = props.onChange; - if (typeof givenOnChange === "function") { - props.onChange = (event: ChangeEvent<any>) => { - // immediately update the value to give the user feedback - setValue(event.target.value); - // allow the client to respond (and possibly change the value) - givenOnChange(event); - }; - } - - // Use createElement here to avoid warning about variable numbers of children not - // having keys. Warning about this must now be the responsibility of the client - // providing the models instead of the client rendering them. - return createElement( - model.tagName, - // overwrite - { ...props, value }, - ...createChildren(model, (child) => ( - <Element model={child} key={child.key} /> - )), - ); -} - -function ScriptElement({ model }: { model: ReactPyVdom }) { - const ref = useRef<HTMLDivElement | null>(null); - - React.useEffect(() => { - if (!ref.current) { - return; - } - const scriptContent = model?.children?.filter( - (value): value is string => typeof value == "string", - )[0]; - - let scriptElement: HTMLScriptElement; - if (model.attributes) { - scriptElement = document.createElement("script"); - for (const [k, v] of Object.entries(model.attributes)) { - scriptElement.setAttribute(k, v); - } - if (scriptContent) { - scriptElement.appendChild(document.createTextNode(scriptContent)); - } - ref.current.appendChild(scriptElement); - } else if (scriptContent) { - const scriptResult = eval(scriptContent); - if (typeof scriptResult == "function") { - return scriptResult(); - } - } - }, [model.key, ref.current]); - - return <div ref={ref} />; -} - -function ImportedElement({ model }: { model: ReactPyVdom }) { - const importSourceVdom = model.importSource; - const importSourceRef = useImportSource(model); - - if (!importSourceVdom) { - return null; - } - - const importSourceFallback = importSourceVdom.fallback; - - if (!importSourceVdom) { - // display a fallback if one was given - if (!importSourceFallback) { - return null; - } else if (typeof importSourceFallback === "string") { - return <span>{importSourceFallback}</span>; - } else { - return <StandardElement model={importSourceFallback} />; - } - } else { - return <span ref={importSourceRef} />; - } -} - -function useForceUpdate() { - const [, setState] = useState(false); - return () => setState((old) => !old); -} - -function useImportSource(model: ReactPyVdom): MutableRefObject<any> { - const vdomImportSource = model.importSource; - - const mountPoint = useRef<HTMLElement>(null); - const client = React.useContext(ClientContext); - const [binding, setBinding] = useState<ImportSourceBinding | null>(null); - - React.useEffect(() => { - let unmounted = false; - - if (vdomImportSource) { - loadImportSource(vdomImportSource, client).then((bind) => { - if (!unmounted && mountPoint.current) { - setBinding(bind(mountPoint.current)); - } - }); - } - - return () => { - unmounted = true; - if ( - binding && - vdomImportSource && - !vdomImportSource.unmountBeforeUpdate - ) { - binding.unmount(); - } - }; - }, [client, vdomImportSource, setBinding, mountPoint.current]); - - // this effect must run every time in case the model has changed - useEffect(() => { - if (!(binding && vdomImportSource)) { - return; - } - binding.render(model); - if (vdomImportSource.unmountBeforeUpdate) { - return binding.unmount; - } - }); - - return mountPoint; -} - -const SPECIAL_ELEMENTS = { - input: UserInputElement, - script: ScriptElement, - select: UserInputElement, - textarea: UserInputElement, -}; diff --git a/src/js/packages/@reactpy/client/src/index.ts b/src/js/packages/@reactpy/client/src/index.ts deleted file mode 100644 index 548fcbfc7..000000000 --- a/src/js/packages/@reactpy/client/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./components"; -export * from "./messages"; -export * from "./mount"; -export * from "./reactpy-client"; -export * from "./reactpy-vdom"; diff --git a/src/js/packages/@reactpy/client/src/logger.ts b/src/js/packages/@reactpy/client/src/logger.ts deleted file mode 100644 index 4c4cdd264..000000000 --- a/src/js/packages/@reactpy/client/src/logger.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default { - log: (...args: any[]): void => console.log("[ReactPy]", ...args), - warn: (...args: any[]): void => console.warn("[ReactPy]", ...args), - error: (...args: any[]): void => console.error("[ReactPy]", ...args), -}; diff --git a/src/js/packages/@reactpy/client/src/messages.ts b/src/js/packages/@reactpy/client/src/messages.ts deleted file mode 100644 index 34001dcb0..000000000 --- a/src/js/packages/@reactpy/client/src/messages.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ReactPyVdom } from "./reactpy-vdom"; - -export type LayoutUpdateMessage = { - type: "layout-update"; - path: string; - model: ReactPyVdom; -}; - -export type LayoutEventMessage = { - type: "layout-event"; - target: string; - data: any; -}; - -export type IncomingMessage = LayoutUpdateMessage; -export type OutgoingMessage = LayoutEventMessage; -export type Message = IncomingMessage | OutgoingMessage; diff --git a/src/js/packages/@reactpy/client/src/mount.tsx b/src/js/packages/@reactpy/client/src/mount.tsx deleted file mode 100644 index 0b824a4ee..000000000 --- a/src/js/packages/@reactpy/client/src/mount.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import React from "react"; -import { render } from "react-dom"; -import { Layout } from "./components"; -import { ReactPyClient } from "./reactpy-client"; - -export function mount(element: HTMLElement, client: ReactPyClient): void { - render(<Layout client={client} />, element); -} diff --git a/src/js/packages/@reactpy/client/src/reactpy-client.ts b/src/js/packages/@reactpy/client/src/reactpy-client.ts deleted file mode 100644 index 6f37b55a1..000000000 --- a/src/js/packages/@reactpy/client/src/reactpy-client.ts +++ /dev/null @@ -1,264 +0,0 @@ -import { ReactPyModule } from "./reactpy-vdom"; -import logger from "./logger"; - -/** - * A client for communicating with a ReactPy server. - */ -export interface ReactPyClient { - /** - * Register a handler for a message type. - * - * The first time this is called, the client will be considered ready. - * - * @param type The type of message to handle. - * @param handler The handler to call when a message of the given type is received. - * @returns A function to unregister the handler. - */ - onMessage(type: string, handler: (message: any) => void): () => void; - - /** - * Send a message to the server. - * - * @param message The message to send. Messages must have a `type` property. - */ - sendMessage(message: any): void; - - /** - * Load a module from the server. - * @param moduleName The name of the module to load. - * @returns A promise that resolves to the module. - */ - loadModule(moduleName: string): Promise<ReactPyModule>; -} - -export abstract class BaseReactPyClient implements ReactPyClient { - private readonly handlers: { [key: string]: ((message: any) => void)[] } = {}; - protected readonly ready: Promise<void>; - private resolveReady: (value: undefined) => void; - - constructor() { - this.resolveReady = () => {}; - this.ready = new Promise((resolve) => (this.resolveReady = resolve)); - } - - onMessage(type: string, handler: (message: any) => void): () => void { - (this.handlers[type] || (this.handlers[type] = [])).push(handler); - this.resolveReady(undefined); - return () => { - this.handlers[type] = this.handlers[type].filter((h) => h !== handler); - }; - } - - abstract sendMessage(message: any): void; - abstract loadModule(moduleName: string): Promise<ReactPyModule>; - - /** - * Handle an incoming message. - * - * This should be called by subclasses when a message is received. - * - * @param message The message to handle. The message must have a `type` property. - */ - protected handleIncoming(message: any): void { - if (!message.type) { - logger.warn("Received message without type", message); - return; - } - - const messageHandlers: ((m: any) => void)[] | undefined = - this.handlers[message.type]; - if (!messageHandlers) { - logger.warn("Received message without handler", message); - return; - } - - messageHandlers.forEach((h) => h(message)); - } -} - -export type SimpleReactPyClientProps = { - serverLocation?: LocationProps; - reconnectOptions?: ReconnectProps; -}; - -/** - * The location of the server. - * - * This is used to determine the location of the server's API endpoints. All endpoints - * are expected to be found at the base URL, with the following paths: - * - * - `_reactpy/stream/${route}${query}`: The websocket endpoint for the stream. - * - `_reactpy/modules`: The directory containing the dynamically loaded modules. - * - `_reactpy/assets`: The directory containing the static assets. - */ -type LocationProps = { - /** - * The base URL of the server. - * - * @default - document.location.origin - */ - url: string; - /** - * The route to the page being rendered. - * - * @default - document.location.pathname - */ - route: string; - /** - * The query string of the page being rendered. - * - * @default - document.location.search - */ - query: string; -}; - -type ReconnectProps = { - maxInterval?: number; - maxRetries?: number; - backoffRate?: number; - intervalJitter?: number; -}; - -export class SimpleReactPyClient - extends BaseReactPyClient - implements ReactPyClient -{ - private readonly urls: ServerUrls; - private readonly socket: { current?: WebSocket }; - - constructor(props: SimpleReactPyClientProps) { - super(); - - this.urls = getServerUrls( - props.serverLocation || { - url: document.location.origin, - route: document.location.pathname, - query: document.location.search, - }, - ); - - this.socket = createReconnectingWebSocket({ - readyPromise: this.ready, - url: this.urls.stream, - onMessage: async ({ data }) => this.handleIncoming(JSON.parse(data)), - ...props.reconnectOptions, - }); - } - - sendMessage(message: any): void { - this.socket.current?.send(JSON.stringify(message)); - } - - loadModule(moduleName: string): Promise<ReactPyModule> { - return import(`${this.urls.modules}/${moduleName}`); - } -} - -type ServerUrls = { - base: URL; - stream: string; - modules: string; - assets: string; -}; - -function getServerUrls(props: LocationProps): ServerUrls { - const base = new URL(`${props.url || document.location.origin}/_reactpy`); - const modules = `${base}/modules`; - const assets = `${base}/assets`; - - const streamProtocol = `ws${base.protocol === "https:" ? "s" : ""}`; - const streamPath = rtrim(`${base.pathname}/stream${props.route || ""}`, "/"); - const stream = `${streamProtocol}://${base.host}${streamPath}${props.query}`; - - return { base, modules, assets, stream }; -} - -function createReconnectingWebSocket( - props: { - url: string; - readyPromise: Promise<void>; - onOpen?: () => void; - onMessage: (message: MessageEvent<any>) => void; - onClose?: () => void; - } & ReconnectProps, -) { - const { - maxInterval = 60000, - maxRetries = 50, - backoffRate = 1.1, - intervalJitter = 0.1, - } = props; - - const startInterval = 750; - let retries = 0; - let interval = startInterval; - const closed = false; - let everConnected = false; - const socket: { current?: WebSocket } = {}; - - const connect = () => { - if (closed) { - return; - } - socket.current = new WebSocket(props.url); - socket.current.onopen = () => { - everConnected = true; - logger.log("client connected"); - interval = startInterval; - retries = 0; - if (props.onOpen) { - props.onOpen(); - } - }; - socket.current.onmessage = props.onMessage; - socket.current.onclose = () => { - if (!everConnected) { - logger.log("failed to connect"); - return; - } - - logger.log("client disconnected"); - if (props.onClose) { - props.onClose(); - } - - if (retries >= maxRetries) { - return; - } - - const thisInterval = addJitter(interval, intervalJitter); - logger.log( - `reconnecting in ${(thisInterval / 1000).toPrecision(4)} seconds...`, - ); - setTimeout(connect, thisInterval); - interval = nextInterval(interval, backoffRate, maxInterval); - retries++; - }; - }; - - props.readyPromise.then(() => logger.log("starting client...")).then(connect); - - return socket; -} - -function nextInterval( - currentInterval: number, - backoffRate: number, - maxInterval: number, -): number { - return Math.min( - currentInterval * - // increase interval by backoff rate - backoffRate, - // don't exceed max interval - maxInterval, - ); -} - -function addJitter(interval: number, jitter: number): number { - return interval + (Math.random() * jitter * interval * 2 - jitter * interval); -} - -function rtrim(text: string, trim: string): string { - return text.replace(new RegExp(`${trim}+$`), ""); -} diff --git a/src/js/packages/@reactpy/client/src/reactpy-vdom.tsx b/src/js/packages/@reactpy/client/src/reactpy-vdom.tsx deleted file mode 100644 index 22fa3e61d..000000000 --- a/src/js/packages/@reactpy/client/src/reactpy-vdom.tsx +++ /dev/null @@ -1,261 +0,0 @@ -import React, { ComponentType } from "react"; -import { ReactPyClient } from "./reactpy-client"; -import serializeEvent from "event-to-object"; - -export async function loadImportSource( - vdomImportSource: ReactPyVdomImportSource, - client: ReactPyClient, -): Promise<BindImportSource> { - let module: ReactPyModule; - if (vdomImportSource.sourceType === "URL") { - module = await import(vdomImportSource.source); - } else { - module = await client.loadModule(vdomImportSource.source); - } - if (typeof module.bind !== "function") { - throw new Error( - `${vdomImportSource.source} did not export a function 'bind'`, - ); - } - - return (node: HTMLElement) => { - const binding = module.bind(node, { - sendMessage: client.sendMessage, - onMessage: client.onMessage, - }); - if ( - !( - typeof binding.create === "function" && - typeof binding.render === "function" && - typeof binding.unmount === "function" - ) - ) { - console.error(`${vdomImportSource.source} returned an impropper binding`); - return null; - } - - return { - render: (model) => - binding.render( - createImportSourceElement({ - client, - module, - binding, - model, - currentImportSource: vdomImportSource, - }), - ), - unmount: binding.unmount, - }; - }; -} - -function createImportSourceElement(props: { - client: ReactPyClient; - module: ReactPyModule; - binding: ReactPyModuleBinding; - model: ReactPyVdom; - currentImportSource: ReactPyVdomImportSource; -}): any { - let type: any; - if (props.model.importSource) { - if ( - !isImportSourceEqual(props.currentImportSource, props.model.importSource) - ) { - console.error( - "Parent element import source " + - stringifyImportSource(props.currentImportSource) + - " does not match child's import source " + - stringifyImportSource(props.model.importSource), - ); - return null; - } else if (!props.module[props.model.tagName]) { - console.error( - "Module from source " + - stringifyImportSource(props.currentImportSource) + - ` does not export ${props.model.tagName}`, - ); - return null; - } else { - type = props.module[props.model.tagName]; - } - } else { - type = props.model.tagName; - } - return props.binding.create( - type, - createAttributes(props.model, props.client), - createChildren(props.model, (child) => - createImportSourceElement({ - ...props, - model: child, - }), - ), - ); -} - -function isImportSourceEqual( - source1: ReactPyVdomImportSource, - source2: ReactPyVdomImportSource, -) { - return ( - source1.source === source2.source && - source1.sourceType === source2.sourceType - ); -} - -function stringifyImportSource(importSource: ReactPyVdomImportSource) { - return JSON.stringify({ - source: importSource.source, - sourceType: importSource.sourceType, - }); -} - -export function createChildren<Child>( - model: ReactPyVdom, - createChild: (child: ReactPyVdom) => Child, -): (Child | string)[] { - if (!model.children) { - return []; - } else { - return model.children.map((child) => { - switch (typeof child) { - case "object": - return createChild(child); - case "string": - return child; - } - }); - } -} - -export function createAttributes( - model: ReactPyVdom, - client: ReactPyClient, -): { [key: string]: any } { - return Object.fromEntries( - Object.entries({ - // Normal HTML attributes - ...model.attributes, - // Construct event handlers - ...Object.fromEntries( - Object.entries(model.eventHandlers || {}).map(([name, handler]) => - createEventHandler(client, name, handler), - ), - ), - // Convert snake_case to camelCase names - }).map(normalizeAttribute), - ); -} - -function createEventHandler( - client: ReactPyClient, - name: string, - { target, preventDefault, stopPropagation }: ReactPyVdomEventHandler, -): [string, () => void] { - return [ - name, - function (...args: any[]) { - const data = Array.from(args).map((value) => { - if (!(typeof value === "object" && value.nativeEvent)) { - return value; - } - const event = value as React.SyntheticEvent<any>; - if (preventDefault) { - event.preventDefault(); - } - if (stopPropagation) { - event.stopPropagation(); - } - return serializeEvent(event.nativeEvent); - }); - client.sendMessage({ type: "layout-event", data, target }); - }, - ]; -} - -function normalizeAttribute([key, value]: [string, any]): [string, any] { - let normKey = key; - let normValue = value; - - if (key === "style" && typeof value === "object") { - normValue = Object.fromEntries( - Object.entries(value).map(([k, v]) => [snakeToCamel(k), v]), - ); - } else if ( - key.startsWith("data_") || - key.startsWith("aria_") || - DASHED_HTML_ATTRS.includes(key) - ) { - normKey = key.split("_").join("-"); - } else { - normKey = snakeToCamel(key); - } - return [normKey, normValue]; -} - -function snakeToCamel(str: string): string { - return str.replace(/([_][a-z])/g, (group) => - group.toUpperCase().replace("_", ""), - ); -} - -// see list of HTML attributes with dashes in them: -// https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes#attribute_list -const DASHED_HTML_ATTRS = ["accept_charset", "http_equiv"]; - -export type ReactPyComponent = ComponentType<{ model: ReactPyVdom }>; - -export type ReactPyVdom = { - tagName: string; - key?: string; - attributes?: { [key: string]: string }; - children?: (ReactPyVdom | string)[]; - error?: string; - eventHandlers?: { [key: string]: ReactPyVdomEventHandler }; - importSource?: ReactPyVdomImportSource; -}; - -export type ReactPyVdomEventHandler = { - target: string; - preventDefault?: boolean; - stopPropagation?: boolean; -}; - -export type ReactPyVdomImportSource = { - source: string; - sourceType?: "URL" | "NAME"; - fallback?: string | ReactPyVdom; - unmountBeforeUpdate?: boolean; -}; - -export type ReactPyModule = { - bind: ( - node: HTMLElement, - context: ReactPyModuleBindingContext, - ) => ReactPyModuleBinding; -} & { [key: string]: any }; - -export type ReactPyModuleBindingContext = { - sendMessage: ReactPyClient["sendMessage"]; - onMessage: ReactPyClient["onMessage"]; -}; - -export type ReactPyModuleBinding = { - create: ( - type: any, - props?: any, - children?: (any | string | ReactPyVdom)[], - ) => any; - render: (element: any) => void; - unmount: () => void; -}; - -export type BindImportSource = ( - node: HTMLElement, -) => ImportSourceBinding | null; - -export type ImportSourceBinding = { - render: (model: ReactPyVdom) => void; - unmount: () => void; -}; diff --git a/src/js/packages/@reactpy/client/tsconfig.json b/src/js/packages/@reactpy/client/tsconfig.json deleted file mode 100644 index 2e1483e10..000000000 --- a/src/js/packages/@reactpy/client/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../../tsconfig.package.json", - "compilerOptions": { - "outDir": "dist", - "rootDir": "src", - "composite": true - }, - "include": ["src"], - "references": [ - { - "path": "../../event-to-object" - } - ] -} diff --git a/src/js/packages/event-to-object/package.json b/src/js/packages/event-to-object/package.json deleted file mode 100644 index eaeb99343..000000000 --- a/src/js/packages/event-to-object/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "author": "Ryan Morshead", - "license": "MIT", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "name": "event-to-object", - "description": "Convert native events to JSON serializable objects", - "type": "module", - "version": "0.1.2", - "dependencies": { - "json-pointer": "^0.6.2" - }, - "devDependencies": { - "happy-dom": "^8.9.0", - "lodash": "^4.17.21", - "tsm": "^2.0.0", - "typescript": "^4.9.5", - "uvu": "^0.5.1" - }, - "repository": { - "type": "git", - "url": "https://github.com/reactive-python/reactpy" - }, - "scripts": { - "build": "tsc -b", - "test": "npm run check:tests", - "check:tests": "uvu -r tsm tests", - "check:types": "tsc --noEmit" - } -} diff --git a/src/js/packages/event-to-object/src/events.ts b/src/js/packages/event-to-object/src/events.ts deleted file mode 100644 index cef37ff09..000000000 --- a/src/js/packages/event-to-object/src/events.ts +++ /dev/null @@ -1,258 +0,0 @@ -// TODO -type FileListObject = any; -type DataTransferItemListObject = any; - -export type EventToObjectMap = { - event: [Event, EventObject]; - animation: [AnimationEvent, AnimationEventObject]; - clipboard: [ClipboardEvent, ClipboardEventObject]; - composition: [CompositionEvent, CompositionEventObject]; - devicemotion: [DeviceMotionEvent, DeviceMotionEventObject]; - deviceorientation: [DeviceOrientationEvent, DeviceOrientationEventObject]; - drag: [DragEvent, DragEventObject]; - focus: [FocusEvent, FocusEventObject]; - formdata: [FormDataEvent, FormDataEventObject]; - gamepad: [GamepadEvent, GamepadEventObject]; - input: [InputEvent, InputEventObject]; - keyboard: [KeyboardEvent, KeyboardEventObject]; - mouse: [MouseEvent, MouseEventObject]; - pointer: [PointerEvent, PointerEventObject]; - submit: [SubmitEvent, SubmitEventObject]; - touch: [TouchEvent, TouchEventObject]; - transition: [TransitionEvent, TransitionEventObject]; - ui: [UIEvent, UIEventObject]; - wheel: [WheelEvent, WheelEventObject]; -}; - -export interface EventObject { - bubbles: boolean; - composed: boolean; - currentTarget: ElementObject | null; - defaultPrevented: boolean; - eventPhase: number; - isTrusted: boolean; - target: ElementObject | null; - timeStamp: DOMHighResTimeStamp; - type: string; - selection: SelectionObject | null; -} - -export interface SubmitEventObject extends EventObject { - submitter: ElementObject; -} - -export interface InputEventObject extends UIEventObject { - data: string | null; - dataTransfer: DataTransferObject | null; - isComposing: boolean; - inputType: string; -} - -export interface GamepadEventObject extends EventObject { - gamepad: GamepadObject; -} - -export interface GamepadObject { - axes: number[]; - buttons: GamepadButtonObject[]; - connected: boolean; - hapticActuators: GamepadHapticActuatorObject[]; - id: string; - index: number; - mapping: GamepadMappingType; - timestamp: DOMHighResTimeStamp; -} - -export interface GamepadButtonObject { - pressed: boolean; - touched: boolean; - value: number; -} -export interface GamepadHapticActuatorObject { - type: string; -} - -export interface DragEventObject extends MouseEventObject { - /** Returns the DataTransfer object for the event. */ - readonly dataTransfer: DataTransferObject | null; -} - -export interface DeviceMotionEventObject extends EventObject { - acceleration: DeviceAccelerationObject | null; - accelerationIncludingGravity: DeviceAccelerationObject | null; - interval: number; - rotationRate: DeviceRotationRateObject | null; -} - -export interface DeviceAccelerationObject { - x: number | null; - y: number | null; - z: number | null; -} - -export interface DeviceRotationRateObject { - alpha: number | null; - beta: number | null; - gamma: number | null; -} - -export interface DeviceOrientationEventObject extends EventObject { - absolute: boolean; - alpha: number | null; - beta: number | null; - gamma: number | null; -} - -export interface MouseEventObject extends EventObject { - altKey: boolean; - button: number; - buttons: number; - clientX: number; - clientY: number; - ctrlKey: boolean; - metaKey: boolean; - movementX: number; - movementY: number; - offsetX: number; - offsetY: number; - pageX: number; - pageY: number; - relatedTarget: ElementObject | null; - screenX: number; - screenY: number; - shiftKey: boolean; - x: number; - y: number; -} - -export interface FormDataEventObject extends EventObject { - formData: FormDataObject; -} - -export type FormDataObject = [string, string | FileObject][]; - -export interface AnimationEventObject extends EventObject { - animationName: string; - elapsedTime: number; - pseudoElement: string; -} - -export interface ClipboardEventObject extends EventObject { - clipboardData: DataTransferObject | null; -} - -export interface UIEventObject extends EventObject { - detail: number; -} - -/** The DOM CompositionEvent represents events that occur due to the user indirectly - * entering text. */ -export interface CompositionEventObject extends UIEventObject { - data: string; -} - -export interface KeyboardEventObject extends UIEventObject { - altKey: boolean; - code: string; - ctrlKey: boolean; - isComposing: boolean; - key: string; - location: number; - metaKey: boolean; - repeat: boolean; - shiftKey: boolean; -} - -export interface FocusEventObject extends UIEventObject { - relatedTarget: ElementObject | null; -} - -export interface TouchEventObject extends UIEventObject { - altKey: boolean; - changedTouches: TouchObject[]; - ctrlKey: boolean; - metaKey: boolean; - shiftKey: boolean; - targetTouches: TouchObject[]; - touches: TouchObject[]; -} - -export interface PointerEventObject extends MouseEventObject { - height: number; - isPrimary: boolean; - pointerId: number; - pointerType: string; - pressure: number; - tangentialPressure: number; - tiltX: number; - tiltY: number; - twist: number; - width: number; -} - -export interface TransitionEventObject extends EventObject { - elapsedTime: number; - propertyName: string; - pseudoElement: string; -} - -export interface WheelEventObject extends MouseEventObject { - readonly deltaMode: number; - readonly deltaX: number; - readonly deltaY: number; - readonly deltaZ: number; -} - -export interface TouchObject { - clientX: number; - clientY: number; - force: number; - identifier: number; - pageX: number; - pageY: number; - radiusX: number; - radiusY: number; - rotationAngle: number; - screenX: number; - screenY: number; - target: ElementObject; -} - -export interface DataTransferObject { - dropEffect: "none" | "copy" | "link" | "move"; - effectAllowed: - | "none" - | "copy" - | "copyLink" - | "copyMove" - | "link" - | "linkMove" - | "move" - | "all" - | "uninitialized"; - files: FileListObject; - items: DataTransferItemListObject; - types: string[]; -} - -export interface SelectionObject { - anchorNode: ElementObject | null; - anchorOffset: number; - focusNode: ElementObject | null; - focusOffset: number; - isCollapsed: boolean; - rangeCount: number; - type: string; - selectedText: string; -} - -export interface ElementObject { - value?: string; - textContent?: string; -} - -export interface FileObject { - name: string; - size: number; - type: string; -} diff --git a/src/js/packages/event-to-object/src/index.ts b/src/js/packages/event-to-object/src/index.ts deleted file mode 100644 index 9a40a2128..000000000 --- a/src/js/packages/event-to-object/src/index.ts +++ /dev/null @@ -1,427 +0,0 @@ -import * as e from "./events"; - -export default function convert<E extends Event>( - event: E, -): - | { - [K in keyof e.EventToObjectMap]: e.EventToObjectMap[K] extends [ - E, - infer P, - ] - ? P - : never; - }[keyof e.EventToObjectMap] - | null { - return event.type in eventConverters - ? eventConverters[event.type](event) - : convertEvent(event); -} - -const convertEvent = (event: Event): e.EventObject => ({ - /** Returns true or false depending on how event was initialized. True if event goes - * through its target's ancestors in reverse tree order, and false otherwise. */ - bubbles: event.bubbles, - composed: event.composed, - currentTarget: convertElement(event.currentTarget), - defaultPrevented: event.defaultPrevented, - eventPhase: event.eventPhase, - isTrusted: event.isTrusted, - target: convertElement(event.target), - timeStamp: event.timeStamp, - type: event.type, - selection: convertSelection(window.getSelection()), -}); - -const convertClipboardEvent = ( - event: ClipboardEvent, -): e.ClipboardEventObject => ({ - ...convertEvent(event), - clipboardData: convertDataTransferObject(event.clipboardData), -}); - -const convertCompositionEvent = ( - event: CompositionEvent, -): e.CompositionEventObject => ({ - ...convertUiEvent(event), - data: event.data, -}); - -const convertInputEvent = (event: InputEvent): e.InputEventObject => ({ - ...convertUiEvent(event), - data: event.data, - inputType: event.inputType, - dataTransfer: convertDataTransferObject(event.dataTransfer), - isComposing: event.isComposing, -}); - -const convertKeyboardEvent = (event: KeyboardEvent): e.KeyboardEventObject => ({ - ...convertUiEvent(event), - code: event.code, - isComposing: event.isComposing, - altKey: event.altKey, - ctrlKey: event.ctrlKey, - key: event.key, - location: event.location, - metaKey: event.metaKey, - repeat: event.repeat, - shiftKey: event.shiftKey, -}); - -const convertMouseEvent = (event: MouseEvent): e.MouseEventObject => ({ - ...convertEvent(event), - altKey: event.altKey, - button: event.button, - buttons: event.buttons, - clientX: event.clientX, - clientY: event.clientY, - ctrlKey: event.ctrlKey, - metaKey: event.metaKey, - pageX: event.pageX, - pageY: event.pageY, - screenX: event.screenX, - screenY: event.screenY, - shiftKey: event.shiftKey, - movementX: event.movementX, - movementY: event.movementY, - offsetX: event.offsetX, - offsetY: event.offsetY, - x: event.x, - y: event.y, - relatedTarget: convertElement(event.relatedTarget), -}); - -const convertTouchEvent = (event: TouchEvent): e.TouchEventObject => ({ - ...convertUiEvent(event), - altKey: event.altKey, - ctrlKey: event.ctrlKey, - metaKey: event.metaKey, - shiftKey: event.shiftKey, - touches: Array.from(event.touches).map(convertTouch), - changedTouches: Array.from(event.changedTouches).map(convertTouch), - targetTouches: Array.from(event.targetTouches).map(convertTouch), -}); - -const convertUiEvent = (event: UIEvent): e.UIEventObject => ({ - ...convertEvent(event), - detail: event.detail, -}); - -const convertAnimationEvent = ( - event: AnimationEvent, -): e.AnimationEventObject => ({ - ...convertEvent(event), - animationName: event.animationName, - pseudoElement: event.pseudoElement, - elapsedTime: event.elapsedTime, -}); - -const convertTransitionEvent = ( - event: TransitionEvent, -): e.TransitionEventObject => ({ - ...convertEvent(event), - propertyName: event.propertyName, - pseudoElement: event.pseudoElement, - elapsedTime: event.elapsedTime, -}); - -const convertFocusEvent = (event: FocusEvent): e.FocusEventObject => ({ - ...convertUiEvent(event), - relatedTarget: convertElement(event.relatedTarget), -}); - -const convertDeviceOrientationEvent = ( - event: DeviceOrientationEvent, -): e.DeviceOrientationEventObject => ({ - ...convertEvent(event), - absolute: event.absolute, - alpha: event.alpha, - beta: event.beta, - gamma: event.gamma, -}); - -const convertDragEvent = (event: DragEvent): e.DragEventObject => ({ - ...convertMouseEvent(event), - dataTransfer: convertDataTransferObject(event.dataTransfer), -}); - -const convertGamepadEvent = (event: GamepadEvent): e.GamepadEventObject => ({ - ...convertEvent(event), - gamepad: convertGamepad(event.gamepad), -}); - -const convertPointerEvent = (event: PointerEvent): e.PointerEventObject => ({ - ...convertMouseEvent(event), - pointerId: event.pointerId, - width: event.width, - height: event.height, - pressure: event.pressure, - tiltX: event.tiltX, - tiltY: event.tiltY, - pointerType: event.pointerType, - isPrimary: event.isPrimary, - tangentialPressure: event.tangentialPressure, - twist: event.twist, -}); - -const convertWheelEvent = (event: WheelEvent): e.WheelEventObject => ({ - ...convertMouseEvent(event), - deltaMode: event.deltaMode, - deltaX: event.deltaX, - deltaY: event.deltaY, - deltaZ: event.deltaZ, -}); - -const convertSubmitEvent = (event: SubmitEvent): e.SubmitEventObject => ({ - ...convertEvent(event), - submitter: convertElement(event.submitter), -}); - -const eventConverters: { [key: string]: (event: any) => any } = { - // animation events - animationcancel: convertAnimationEvent, - animationend: convertAnimationEvent, - animationiteration: convertAnimationEvent, - animationstart: convertAnimationEvent, - // input events - beforeinput: convertInputEvent, - // composition events - compositionend: convertCompositionEvent, - compositionstart: convertCompositionEvent, - compositionupdate: convertCompositionEvent, - // clipboard events - copy: convertClipboardEvent, - cut: convertClipboardEvent, - paste: convertClipboardEvent, - // device orientation events - deviceorientation: convertDeviceOrientationEvent, - // drag events - drag: convertDragEvent, - dragend: convertDragEvent, - dragenter: convertDragEvent, - dragleave: convertDragEvent, - dragover: convertDragEvent, - dragstart: convertDragEvent, - drop: convertDragEvent, - // ui events - error: convertUiEvent, - // focus events - blur: convertFocusEvent, - focus: convertFocusEvent, - focusin: convertFocusEvent, - focusout: convertFocusEvent, - // gamepad events - gamepadconnected: convertGamepadEvent, - gamepaddisconnected: convertGamepadEvent, - // keyboard events - keydown: convertKeyboardEvent, - keypress: convertKeyboardEvent, - keyup: convertKeyboardEvent, - // mouse events - auxclick: convertMouseEvent, - click: convertMouseEvent, - dblclick: convertMouseEvent, - contextmenu: convertMouseEvent, - mousedown: convertMouseEvent, - mouseenter: convertMouseEvent, - mouseleave: convertMouseEvent, - mousemove: convertMouseEvent, - mouseout: convertMouseEvent, - mouseover: convertMouseEvent, - mouseup: convertMouseEvent, - scroll: convertMouseEvent, - // pointer events - gotpointercapture: convertPointerEvent, - lostpointercapture: convertPointerEvent, - pointercancel: convertPointerEvent, - pointerdown: convertPointerEvent, - pointerenter: convertPointerEvent, - pointerleave: convertPointerEvent, - pointerlockchange: convertPointerEvent, - pointerlockerror: convertPointerEvent, - pointermove: convertPointerEvent, - pointerout: convertPointerEvent, - pointerover: convertPointerEvent, - pointerup: convertPointerEvent, - // submit events - submit: convertSubmitEvent, - // touch events - touchcancel: convertTouchEvent, - touchend: convertTouchEvent, - touchmove: convertTouchEvent, - touchstart: convertTouchEvent, - // transition events - transitioncancel: convertTransitionEvent, - transitionend: convertTransitionEvent, - transitionrun: convertTransitionEvent, - transitionstart: convertTransitionEvent, - // wheel events - wheel: convertWheelEvent, -}; - -function convertElement(element: EventTarget | HTMLElement | null): any { - if (!element || !("tagName" in element)) { - return null; - } - - const htmlElement = element as HTMLElement; - - return { - ...convertGenericElement(htmlElement), - ...(htmlElement.tagName in elementConverters - ? elementConverters[htmlElement.tagName](htmlElement) - : {}), - }; -} - -const convertGenericElement = (element: HTMLElement) => ({ - tagName: element.tagName, - boundingClientRect: { ...element.getBoundingClientRect() }, -}); - -const convertMediaElement = (element: HTMLMediaElement) => ({ - currentTime: element.currentTime, - duration: element.duration, - ended: element.ended, - error: element.error, - seeking: element.seeking, - volume: element.volume, -}); - -const elementConverters: { [key: string]: (element: any) => any } = { - AUDIO: convertMediaElement, - BUTTON: (element: HTMLButtonElement) => ({ value: element.value }), - DATA: (element: HTMLDataElement) => ({ value: element.value }), - DATALIST: (element: HTMLDataListElement) => ({ - options: Array.from(element.options).map(elementConverters["OPTION"]), - }), - DIALOG: (element: HTMLDialogElement) => ({ - returnValue: element.returnValue, - }), - FIELDSET: (element: HTMLFieldSetElement) => ({ - elements: Array.from(element.elements).map(convertElement), - }), - FORM: (element: HTMLFormElement) => ({ - elements: Array.from(element.elements).map(convertElement), - }), - INPUT: (element: HTMLInputElement) => ({ value: element.value }), - METER: (element: HTMLMeterElement) => ({ value: element.value }), - OPTION: (element: HTMLOptionElement) => ({ value: element.value }), - OUTPUT: (element: HTMLOutputElement) => ({ value: element.value }), - PROGRESS: (element: HTMLProgressElement) => ({ value: element.value }), - SELECT: (element: HTMLSelectElement) => ({ value: element.value }), - TEXTAREA: (element: HTMLTextAreaElement) => ({ value: element.value }), - VIDEO: convertMediaElement, -}; - -const convertGamepad = (gamepad: Gamepad): e.GamepadObject => ({ - axes: Array.from(gamepad.axes), - buttons: Array.from(gamepad.buttons).map(convertGamepadButton), - connected: gamepad.connected, - id: gamepad.id, - index: gamepad.index, - mapping: gamepad.mapping, - timestamp: gamepad.timestamp, - hapticActuators: Array.from(gamepad.hapticActuators).map( - convertGamepadHapticActuator, - ), -}); - -const convertGamepadButton = ( - button: GamepadButton, -): e.GamepadButtonObject => ({ - pressed: button.pressed, - touched: button.touched, - value: button.value, -}); - -const convertGamepadHapticActuator = ( - actuator: GamepadHapticActuator, -): e.GamepadHapticActuatorObject => ({ - type: actuator.type, -}); - -const convertFile = (file: File) => ({ - lastModified: file.lastModified, - name: file.name, - size: file.size, - type: file.type, -}); - -function convertDataTransferObject( - dataTransfer: DataTransfer | null, -): e.DataTransferObject | null { - if (!dataTransfer) { - return null; - } - const { dropEffect, effectAllowed, files, items, types } = dataTransfer; - return { - dropEffect, - effectAllowed, - files: Array.from(files).map(convertFile), - items: Array.from(items).map((item) => ({ - kind: item.kind, - type: item.type, - })), - types: Array.from(types), - }; -} - -function convertSelection( - selection: Selection | null, -): e.SelectionObject | null { - if (!selection) { - return null; - } - const { - type, - anchorNode, - anchorOffset, - focusNode, - focusOffset, - isCollapsed, - rangeCount, - } = selection; - if (type === "None") { - return null; - } - return { - type, - anchorNode: convertElement(anchorNode), - anchorOffset, - focusNode: convertElement(focusNode), - focusOffset, - isCollapsed, - rangeCount, - selectedText: selection.toString(), - }; -} - -function convertTouch({ - identifier, - pageX, - pageY, - screenX, - screenY, - clientX, - clientY, - force, - radiusX, - radiusY, - rotationAngle, - target, -}: Touch): e.TouchObject { - return { - identifier, - pageX, - pageY, - screenX, - screenY, - clientX, - clientY, - force, - radiusX, - radiusY, - rotationAngle, - target: convertElement(target), - }; -} diff --git a/src/js/packages/event-to-object/tests/event-to-object.test.ts b/src/js/packages/event-to-object/tests/event-to-object.test.ts deleted file mode 100644 index b7b8c68af..000000000 --- a/src/js/packages/event-to-object/tests/event-to-object.test.ts +++ /dev/null @@ -1,381 +0,0 @@ -// @ts-ignore -import { window } from "./tooling/setup"; -import { test } from "uvu"; -import { Event } from "happy-dom"; -import { checkEventConversion } from "./tooling/check"; -import { - mockElementObject, - mockGamepad, - mockTouch, - mockTouchObject, -} from "./tooling/mock"; - -type SimpleTestCase<E extends Event> = { - types: string[]; - description: string; - givenEventType: new (type: string) => E; - expectedConversion: any; - initGivenEvent?: (event: E) => void; -}; - -const simpleTestCases: SimpleTestCase<any>[] = [ - { - types: [ - "animationcancel", - "animationend", - "animationiteration", - "animationstart", - ], - description: "animation event", - givenEventType: window.AnimationEvent, - expectedConversion: { - animationName: "", - pseudoElement: "", - elapsedTime: 0, - }, - }, - { - types: ["beforeinput"], - description: "event", - givenEventType: window.InputEvent, - expectedConversion: { - detail: 0, - data: "", - inputType: "", - dataTransfer: null, - isComposing: false, - }, - }, - { - types: ["compositionend", "compositionstart", "compositionupdate"], - description: "composition event", - givenEventType: window.CompositionEvent, - expectedConversion: { - data: undefined, - detail: undefined, - }, - }, - { - types: ["copy", "cut", "paste"], - description: "clipboard event", - givenEventType: window.ClipboardEvent, - expectedConversion: { clipboardData: null }, - }, - { - types: [ - "drag", - "dragend", - "dragenter", - "dragleave", - "dragover", - "dragstart", - "drop", - ], - description: "drag event", - givenEventType: window.DragEvent, - expectedConversion: { - altKey: undefined, - button: undefined, - buttons: undefined, - clientX: undefined, - clientY: undefined, - ctrlKey: undefined, - dataTransfer: null, - metaKey: undefined, - movementX: undefined, - movementY: undefined, - offsetX: undefined, - offsetY: undefined, - pageX: undefined, - pageY: undefined, - relatedTarget: null, - screenX: undefined, - screenY: undefined, - shiftKey: undefined, - x: undefined, - y: undefined, - }, - }, - { - types: ["error"], - description: "event", - givenEventType: window.ErrorEvent, - expectedConversion: { detail: 0 }, - }, - { - types: ["blur", "focus", "focusin", "focusout"], - description: "focus event", - givenEventType: window.FocusEvent, - expectedConversion: { - relatedTarget: null, - detail: 0, - }, - }, - { - types: ["gamepadconnected", "gamepaddisconnected"], - description: "gamepad event", - givenEventType: window.GamepadEvent, - expectedConversion: { gamepad: mockGamepad }, - initGivenEvent: (event) => { - event.gamepad = mockGamepad; - }, - }, - { - types: ["keydown", "keypress", "keyup"], - description: "keyboard event", - givenEventType: window.KeyboardEvent, - expectedConversion: { - altKey: false, - code: "", - ctrlKey: false, - isComposing: false, - key: "", - location: 0, - metaKey: false, - repeat: false, - shiftKey: false, - detail: 0, - }, - }, - { - types: [ - "click", - "auxclick", - "dblclick", - "mousedown", - "mouseenter", - "mouseleave", - "mousemove", - "mouseout", - "mouseover", - "mouseup", - "scroll", - ], - description: "mouse event", - givenEventType: window.MouseEvent, - expectedConversion: { - altKey: false, - button: 0, - buttons: 0, - clientX: 0, - clientY: 0, - ctrlKey: false, - metaKey: false, - movementX: 0, - movementY: 0, - offsetX: 0, - offsetY: 0, - pageX: 0, - pageY: 0, - relatedTarget: null, - screenX: 0, - screenY: 0, - shiftKey: false, - x: undefined, - y: undefined, - }, - }, - { - types: [ - "auxclick", - "click", - "contextmenu", - "dblclick", - "mousedown", - "mouseenter", - "mouseleave", - "mousemove", - "mouseout", - "mouseover", - "mouseup", - ], - description: "mouse event", - givenEventType: window.MouseEvent, - expectedConversion: { - altKey: false, - button: 0, - buttons: 0, - clientX: 0, - clientY: 0, - ctrlKey: false, - metaKey: false, - movementX: 0, - movementY: 0, - offsetX: 0, - offsetY: 0, - pageX: 0, - pageY: 0, - relatedTarget: null, - screenX: 0, - screenY: 0, - shiftKey: false, - x: undefined, - y: undefined, - }, - }, - { - types: [ - "gotpointercapture", - "lostpointercapture", - "pointercancel", - "pointerdown", - "pointerenter", - "pointerleave", - "pointerlockchange", - "pointerlockerror", - "pointermove", - "pointerout", - "pointerover", - "pointerup", - ], - description: "pointer event", - givenEventType: window.PointerEvent, - expectedConversion: { - altKey: false, - button: 0, - buttons: 0, - clientX: 0, - clientY: 0, - ctrlKey: false, - metaKey: false, - movementX: 0, - movementY: 0, - offsetX: 0, - offsetY: 0, - pageX: 0, - pageY: 0, - relatedTarget: null, - screenX: 0, - screenY: 0, - shiftKey: false, - x: undefined, - y: undefined, - pointerId: 0, - pointerType: "", - pressure: 0, - tiltX: 0, - tiltY: 0, - width: 0, - height: 0, - isPrimary: false, - twist: 0, - tangentialPressure: 0, - }, - }, - { - types: ["submit"], - description: "event", - givenEventType: window.Event, - expectedConversion: { submitter: null }, - initGivenEvent: (event) => { - event.submitter = null; - }, - }, - { - types: ["touchcancel", "touchend", "touchmove", "touchstart"], - description: "touch event", - givenEventType: window.TouchEvent, - expectedConversion: { - altKey: undefined, - changedTouches: [mockTouchObject], - ctrlKey: undefined, - metaKey: undefined, - targetTouches: [mockTouchObject], - touches: [mockTouchObject], - detail: undefined, - shiftKey: undefined, - }, - initGivenEvent: (event) => { - event.changedTouches = [mockTouch]; - event.targetTouches = [mockTouch]; - event.touches = [mockTouch]; - }, - }, - { - types: [ - "transitioncancel", - "transitionend", - "transitionrun", - "transitionstart", - ], - description: "transition event", - givenEventType: window.TransitionEvent, - expectedConversion: { - propertyName: undefined, - elapsedTime: undefined, - pseudoElement: undefined, - }, - }, - { - types: ["wheel"], - description: "wheel event", - givenEventType: window.WheelEvent, - expectedConversion: { - altKey: undefined, - button: undefined, - buttons: undefined, - clientX: undefined, - clientY: undefined, - ctrlKey: undefined, - deltaMode: 0, - deltaX: 0, - deltaY: 0, - deltaZ: 0, - metaKey: undefined, - movementX: undefined, - movementY: undefined, - offsetX: undefined, - offsetY: undefined, - pageX: 0, - pageY: 0, - relatedTarget: null, - screenX: undefined, - screenY: undefined, - shiftKey: undefined, - x: undefined, - y: undefined, - }, - }, -]; - -simpleTestCases.forEach((testCase) => { - testCase.types.forEach((type) => { - test(`converts ${type} ${testCase.description}`, () => { - const event = new testCase.givenEventType(type); - if (testCase.initGivenEvent) { - testCase.initGivenEvent(event); - } - checkEventConversion(event, testCase.expectedConversion); - }); - }); -}); - -test("adds text of current selection", () => { - document.body.innerHTML = ` - <div> - <p id="start"><span>START</span></p> - <p>MIDDLE</p> - <p id="end"><span>END</span></p> - </div> - `; - const start = document.getElementById("start"); - const end = document.getElementById("end"); - window.getSelection()!.setBaseAndExtent(start!, 0, end!, 0); - checkEventConversion(new window.Event("fake"), { - type: "fake", - selection: { - type: "Range", - anchorNode: { ...mockElementObject, tagName: "P" }, - anchorOffset: 0, - focusNode: { ...mockElementObject, tagName: "P" }, - focusOffset: 0, - isCollapsed: false, - rangeCount: 1, - selectedText: "START\n MIDDLE\n ", - }, - eventPhase: undefined, - isTrusted: undefined, - }); -}); - -test.run(); diff --git a/src/js/packages/event-to-object/tests/tooling/check.ts b/src/js/packages/event-to-object/tests/tooling/check.ts deleted file mode 100644 index 33ff5ed5b..000000000 --- a/src/js/packages/event-to-object/tests/tooling/check.ts +++ /dev/null @@ -1,46 +0,0 @@ -import * as assert from "uvu/assert"; -import { Event } from "happy-dom"; -// @ts-ignore -import lodash from "lodash"; -import convert from "../../src/index"; - -export function checkEventConversion( - givenEvent: Event, - expectedConversion: any, -): void { - const actualSerializedEvent = convert( - // @ts-ignore - givenEvent, - ); - - if (!actualSerializedEvent) { - assert.equal(actualSerializedEvent, expectedConversion); - return; - } - - // too hard to compare - assert.equal(typeof actualSerializedEvent.timeStamp, "number"); - - assert.equal( - actualSerializedEvent, - lodash.merge( - { timeStamp: actualSerializedEvent.timeStamp, type: givenEvent.type }, - expectedConversionDefaults, - expectedConversion, - ), - ); - - // verify result is JSON serializable - JSON.stringify(actualSerializedEvent); -} - -const expectedConversionDefaults = { - target: null, - currentTarget: null, - bubbles: false, - composed: false, - defaultPrevented: false, - eventPhase: undefined, - isTrusted: undefined, - selection: null, -}; diff --git a/src/js/packages/event-to-object/tests/tooling/mock.ts b/src/js/packages/event-to-object/tests/tooling/mock.ts deleted file mode 100644 index 81e506500..000000000 --- a/src/js/packages/event-to-object/tests/tooling/mock.ts +++ /dev/null @@ -1,61 +0,0 @@ -export const mockBoundingRect = { - left: 0, - top: 0, - right: 0, - bottom: 0, - x: 0, - y: 0, - height: 0, - width: 0, -}; - -export const mockElementObject = { - tagName: null, - boundingClientRect: mockBoundingRect, -}; - -export const mockElement = { - tagName: null, - getBoundingClientRect: () => mockBoundingRect, -}; - -export const mockGamepad = { - id: "test", - index: 0, - connected: true, - mapping: "standard", - axes: [], - buttons: [ - { - pressed: false, - touched: false, - value: 0, - }, - ], - hapticActuators: [ - { - type: "vibration", - }, - ], - timestamp: undefined, -}; - -export const mockTouch = { - identifier: 0, - pageX: 0, - pageY: 0, - screenX: 0, - screenY: 0, - clientX: 0, - clientY: 0, - force: 0, - radiusX: 0, - radiusY: 0, - rotationAngle: 0, - target: mockElement, -}; - -export const mockTouchObject = { - ...mockTouch, - target: mockElementObject, -}; diff --git a/src/js/packages/event-to-object/tests/tooling/setup.js b/src/js/packages/event-to-object/tests/tooling/setup.js deleted file mode 100644 index 213578046..000000000 --- a/src/js/packages/event-to-object/tests/tooling/setup.js +++ /dev/null @@ -1,22 +0,0 @@ -import { test } from "uvu"; -import { Window } from "happy-dom"; - -export const window = new Window(); - -export function setup() { - global.window = window; - global.document = window.document; - global.navigator = window.navigator; - global.getComputedStyle = window.getComputedStyle; - global.requestAnimationFrame = null; -} - -export function reset() { - window.document.title = ""; - window.document.head.innerHTML = ""; - window.document.body.innerHTML = "<main></main>"; - window.getSelection().removeAllRanges(); -} - -test.before(setup); -test.before.each(reset); diff --git a/src/js/packages/event-to-object/tsconfig.json b/src/js/packages/event-to-object/tsconfig.json deleted file mode 100644 index b9a031fa9..000000000 --- a/src/js/packages/event-to-object/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.package.json", - "compilerOptions": { - "outDir": "dist", - "rootDir": "src", - "composite": true - }, - "include": ["src"] -} diff --git a/src/js/packages/event-to-object/tsconfig.tests.json b/src/js/packages/event-to-object/tsconfig.tests.json deleted file mode 100644 index 33be69a56..000000000 --- a/src/js/packages/event-to-object/tsconfig.tests.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "allowJs": false, - "skipLibCheck": false, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true - } -} diff --git a/src/js/tsconfig.package.json b/src/js/tsconfig.package.json deleted file mode 100644 index 9e7fe5f74..000000000 --- a/src/js/tsconfig.package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "allowJs": false, - "allowSyntheticDefaultImports": true, - "declaration": true, - "declarationMap": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true, - "jsx": "react", - "lib": ["DOM", "DOM.Iterable", "esnext"], - "module": "esnext", - "moduleResolution": "node", - "noEmitOnError": true, - "noUnusedLocals": true, - "resolveJsonModule": true, - "skipLibCheck": false, - "sourceMap": true, - "strict": true, - "target": "esnext" - } -} diff --git a/src/py/reactpy/.gitignore b/src/py/reactpy/.gitignore deleted file mode 100644 index 0499d7590..000000000 --- a/src/py/reactpy/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.coverage.* - -# --- Build Artifacts --- -reactpy/_static diff --git a/src/py/reactpy/MANIFEST.in b/src/py/reactpy/MANIFEST.in deleted file mode 100644 index b989938fa..000000000 --- a/src/py/reactpy/MANIFEST.in +++ /dev/null @@ -1,3 +0,0 @@ -recursive-include src/reactpy/_client * -recursive-include src/reactpy/web/templates * -include src/reactpy/py.typed diff --git a/src/py/reactpy/README.md b/src/py/reactpy/README.md deleted file mode 100644 index 910a573a5..000000000 --- a/src/py/reactpy/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# <img src="https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg" align="left" height="45"/> ReactPy - -<p> - <a href="https://github.com/reactive-python/reactpy/actions"> - <img src="https://github.com/reactive-python/reactpy/workflows/test/badge.svg?event=push"> - </a> - <a href="https://pypi.org/project/reactpy/"> - <img src="https://img.shields.io/pypi/v/reactpy.svg?label=PyPI"> - </a> - <a href="https://github.com/reactive-python/reactpy/blob/main/LICENSE"> - <img src="https://img.shields.io/badge/License-MIT-purple.svg"> - </a> - <a href="https://reactpy.dev/"> - <img src="https://img.shields.io/website?down_message=offline&label=Docs&logo=read-the-docs&logoColor=white&up_message=online&url=https%3A%2F%2Freactpy.dev%2Fdocs%2Findex.html"> - </a> - <a href="https://discord.gg/uNb5P4hA9X"> - <img src="https://img.shields.io/discord/1111078259854168116?label=Discord&logo=discord"> - </a> -</p> - ---- - -[ReactPy](https://reactpy.dev/) is a library for building user interfaces in Python without Javascript. ReactPy interfaces are made from components that look and behave similar to those found in [ReactJS](https://reactjs.org/). Designed with simplicity in mind, ReactPy can be used by those without web development experience while also being powerful enough to grow with your ambitions. diff --git a/src/py/reactpy/pyproject.toml b/src/py/reactpy/pyproject.toml deleted file mode 100644 index 659ddbf94..000000000 --- a/src/py/reactpy/pyproject.toml +++ /dev/null @@ -1,175 +0,0 @@ -[build-system] -requires = ["hatchling", "hatch-build-scripts>=0.0.4"] -build-backend = "hatchling.build" - -# --- Project -------------------------------------------------------------------------- - -[project] -name = "reactpy" -dynamic = ["version"] -description = 'Reactive user interfaces with pure Python' -readme = "README.md" -requires-python = ">=3.9" -license = "MIT" -keywords = ["react", "javascript", "reactpy", "component"] -authors = [ - { name = "Ryan Morshead", email = "ryan.morshead@gmail.com" }, -] -classifiers = [ - "Development Status :: 4 - Beta", - "Programming Language :: Python", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", -] -dependencies = [ - "typing-extensions >=3.10", - "mypy-extensions >=0.4.3", - "anyio >=3", - "jsonpatch >=1.32", - "fastjsonschema >=2.14.5", - "requests >=2", - "colorlog >=6", - "asgiref >=3", - "lxml >=4", -] -[project.optional-dependencies] -all = ["reactpy[starlette,sanic,fastapi,flask,tornado,testing]"] - -starlette = [ - "starlette >=0.13.6", - "uvicorn[standard] >=0.19.0", -] -sanic = [ - "sanic >=21", - "sanic-cors", - "uvicorn[standard] >=0.19.0", -] -fastapi = [ - "fastapi >=0.63.0", - "uvicorn[standard] >=0.19.0", -] -flask = [ - "flask", - "markupsafe>=1.1.1,<2.1", - "flask-cors", - "flask-sock", -] -tornado = [ - "tornado", -] -testing = [ - "playwright", -] - -[project.urls] -Source = "https://github.com/reactive-python/reactpy" -Documentation = "https://github.com/reactive-python/reactpy#readme" -Issues = "https://github.com/reactive-python/reactpy/discussions" - -# --- Hatch ---------------------------------------------------------------------------- - -[tool.hatch.version] -path = "reactpy/__init__.py" - -[tool.hatch.envs.default] -features = ["all"] -pre-install-command = "hatch build --hooks-only" -dependencies = [ - "coverage[toml]>=6.5", - "pytest", - "pytest-asyncio>=0.17", - "pytest-mock", - "pytest-rerunfailures", - "pytest-timeout", - "responses", - "playwright", - # I'm not quite sure why this needs to be installed for tests with Sanic to pass - "sanic-testing", - # Used to generate model changes from layout update messages - "jsonpointer", -] -[tool.hatch.envs.default.scripts] -test = "playwright install && pytest {args:tests}" -test-cov = "playwright install && coverage run -m pytest {args:tests}" -cov-report = [ - # "- coverage combine", - "coverage report", -] -cov = [ - "test-cov {args}", - "cov-report", -] - -[tool.hatch.envs.default.env-vars] -REACTPY_DEBUG_MODE="1" - -[tool.hatch.envs.lint] -features = ["all"] -dependencies = [ - "mypy>=1.0.0", - "types-click", - "types-tornado", - "types-pkg-resources", - "types-flask", - "types-requests", -] - -[tool.hatch.envs.lint.scripts] -types = "mypy --strict reactpy" -all = ["types"] - -[[tool.hatch.build.hooks.build-scripts.scripts]] -work_dir = "../../js" -out_dir = "reactpy/_static" -commands = [ - "npm ci", - "npm run build" -] -artifacts = [ - "app/dist/" -] - -# --- Pytest --------------------------------------------------------------------------- - -[tool.pytest.ini_options] -testpaths = "tests" -xfail_strict = true -python_files = "*asserts.py test_*.py" -asyncio_mode = "auto" - -# --- MyPy ----------------------------------------------------------------------------- - -[tool.mypy] -incremental = false -ignore_missing_imports = true -warn_unused_configs = true -warn_redundant_casts = true -warn_unused_ignores = true - -# --- Coverage ------------------------------------------------------------------------- - -[tool.coverage.run] -source_pkgs = ["reactpy"] -branch = false -parallel = false -omit = [ - "reactpy/__init__.py", -] - -[tool.coverage.report] -fail_under = 100 -show_missing = true -skip_covered = true -sort = "Name" -exclude_lines = [ - "no ?cov", - '\.\.\.', - "if __name__ == .__main__.:", - "if TYPE_CHECKING:", -] -omit = [ - "reactpy/__main__.py", -] diff --git a/src/py/reactpy/reactpy/__init__.py b/src/py/reactpy/reactpy/__init__.py deleted file mode 100644 index 996a984b2..000000000 --- a/src/py/reactpy/reactpy/__init__.py +++ /dev/null @@ -1,58 +0,0 @@ -from reactpy import backend, config, html, logging, sample, svg, types, web, widgets -from reactpy.backend.hooks import use_connection, use_location, use_scope -from reactpy.backend.utils import run -from reactpy.core import hooks -from reactpy.core.component import component -from reactpy.core.events import event -from reactpy.core.hooks import ( - create_context, - use_callback, - use_context, - use_debug_value, - use_effect, - use_memo, - use_reducer, - use_ref, - use_state, -) -from reactpy.core.layout import Layout -from reactpy.core.serve import Stop -from reactpy.core.vdom import vdom -from reactpy.utils import Ref, html_to_vdom, vdom_to_html - -__author__ = "The Reactive Python Team" -__version__ = "1.0.0" # DO NOT MODIFY - -__all__ = [ - "backend", - "component", - "config", - "create_context", - "event", - "hooks", - "html_to_vdom", - "html", - "Layout", - "logging", - "Ref", - "run", - "sample", - "Stop", - "svg", - "types", - "use_callback", - "use_connection", - "use_context", - "use_debug_value", - "use_effect", - "use_location", - "use_memo", - "use_reducer", - "use_ref", - "use_scope", - "use_state", - "vdom_to_html", - "vdom", - "web", - "widgets", -] diff --git a/src/py/reactpy/reactpy/__main__.py b/src/py/reactpy/reactpy/__main__.py deleted file mode 100644 index d70ddf684..000000000 --- a/src/py/reactpy/reactpy/__main__.py +++ /dev/null @@ -1,19 +0,0 @@ -import click - -import reactpy -from reactpy._console.rewrite_camel_case_props import rewrite_camel_case_props -from reactpy._console.rewrite_keys import rewrite_keys - - -@click.group() -@click.version_option(reactpy.__version__, prog_name=reactpy.__name__) -def app() -> None: - pass - - -app.add_command(rewrite_keys) -app.add_command(rewrite_camel_case_props) - - -if __name__ == "__main__": - app() diff --git a/src/py/reactpy/reactpy/_console/ast_utils.py b/src/py/reactpy/reactpy/_console/ast_utils.py deleted file mode 100644 index 220751119..000000000 --- a/src/py/reactpy/reactpy/_console/ast_utils.py +++ /dev/null @@ -1,186 +0,0 @@ -from __future__ import annotations - -import ast -from collections.abc import Iterator, Sequence -from dataclasses import dataclass -from pathlib import Path -from textwrap import indent -from tokenize import COMMENT as COMMENT_TOKEN -from tokenize import generate_tokens -from typing import Any - -import click - -from reactpy import html - - -def rewrite_changed_nodes( - file: Path, - source: str, - tree: ast.AST, - changed: list[ChangedNode], -) -> str: - ast.fix_missing_locations(tree) - - lines = source.split("\n") - - # find closest parent nodes that should be re-written - nodes_to_unparse: list[ast.AST] = [] - for change in changed: - node_lineage = [change.node, *change.parents] - for i in range(len(node_lineage) - 1): - current_node, next_node = node_lineage[i : i + 2] - if ( - not hasattr(next_node, "lineno") - or next_node.lineno < change.node.lineno - or isinstance(next_node, (ast.ClassDef, ast.FunctionDef)) - ): - nodes_to_unparse.append(current_node) - break - else: # nocov - msg = "Failed to change code" - raise RuntimeError(msg) - - # check if an nodes to rewrite contain each other, pick outermost nodes - current_outermost_node, *sorted_nodes_to_unparse = sorted( - nodes_to_unparse, key=lambda n: n.lineno - ) - outermost_nodes_to_unparse = [current_outermost_node] - for node in sorted_nodes_to_unparse: - if ( - not current_outermost_node.end_lineno - or node.lineno > current_outermost_node.end_lineno - ): - current_outermost_node = node - outermost_nodes_to_unparse.append(node) - - moved_comment_lines_from_end: list[int] = [] - # now actually rewrite these nodes (in reverse to avoid changes earlier in file) - for node in reversed(outermost_nodes_to_unparse): - # make a best effort to preserve any comments that we're going to overwrite - comments = _find_comments(lines[node.lineno - 1 : node.end_lineno]) - - # there may be some content just before and after the content we're re-writing - before_replacement = lines[node.lineno - 1][: node.col_offset].lstrip() - - after_replacement = ( - lines[node.end_lineno - 1][node.end_col_offset :].strip() - if node.end_lineno is not None and node.end_col_offset is not None - else "" - ) - - replacement = indent( - before_replacement - + "\n".join([*comments, ast.unparse(node)]) - + after_replacement, - " " * (node.col_offset - len(before_replacement)), - ) - - lines[node.lineno - 1 : node.end_lineno or node.lineno] = [replacement] - - if comments: - moved_comment_lines_from_end.append(len(lines) - node.lineno) - - for lineno_from_end in sorted(set(moved_comment_lines_from_end)): - click.echo(f"Moved comments to {file}:{len(lines) - lineno_from_end}") - - return "\n".join(lines) - - -@dataclass -class ChangedNode: - node: ast.AST - parents: Sequence[ast.AST] - - -def find_element_constructor_usages( - tree: ast.AST, add_props: bool = False -) -> Iterator[ElementConstructorInfo]: - changed: list[Sequence[ast.AST]] = [] - for parents, node in _walk_with_parent(tree): - if not (isinstance(node, ast.Call)): - continue - - func = node.func - if isinstance(func, ast.Attribute) and ( - (isinstance(func.value, ast.Name) and func.value.id == "html") - or (isinstance(func.value, ast.Attribute) and func.value.attr == "html") - ): - name = func.attr - elif isinstance(func, ast.Name): - name = func.id - else: - continue - - maybe_attr_dict_node: Any | None = None - - if name == "vdom": - if len(node.args) == 0: - continue - elif len(node.args) == 1: - maybe_attr_dict_node = ast.Dict(keys=[], values=[]) - if add_props: - node.args.append(maybe_attr_dict_node) - else: - continue - elif isinstance(node.args[1], (ast.Constant, ast.JoinedStr)): - maybe_attr_dict_node = ast.Dict(keys=[], values=[]) - if add_props: - node.args.insert(1, maybe_attr_dict_node) - else: - continue - elif len(node.args) >= 2: # noqa: PLR2004 - maybe_attr_dict_node = node.args[1] - elif hasattr(html, name): - if len(node.args) == 0: - maybe_attr_dict_node = ast.Dict(keys=[], values=[]) - if add_props: - node.args.append(maybe_attr_dict_node) - else: - continue - elif isinstance(node.args[0], (ast.Constant, ast.JoinedStr)): - maybe_attr_dict_node = ast.Dict(keys=[], values=[]) - if add_props: - node.args.insert(0, maybe_attr_dict_node) - else: - continue - else: - maybe_attr_dict_node = node.args[0] - - if not maybe_attr_dict_node: - continue - - if isinstance(maybe_attr_dict_node, ast.Dict) or ( - isinstance(maybe_attr_dict_node, ast.Call) - and isinstance(maybe_attr_dict_node.func, ast.Name) - and maybe_attr_dict_node.func.id == "dict" - and isinstance(maybe_attr_dict_node.func.ctx, ast.Load) - ): - yield ElementConstructorInfo(node, maybe_attr_dict_node, parents) - - return changed - - -@dataclass -class ElementConstructorInfo: - call: ast.Call - props: ast.Dict | ast.Call - parents: Sequence[ast.AST] - - -def _find_comments(lines: list[str]) -> list[str]: - iter_lines = iter(lines) - return [ - token - for token_type, token, _, _, _ in generate_tokens(lambda: next(iter_lines)) - if token_type == COMMENT_TOKEN - ] - - -def _walk_with_parent( - node: ast.AST, parents: tuple[ast.AST, ...] = () -) -> Iterator[tuple[tuple[ast.AST, ...], ast.AST]]: - parents = (node, *parents) - for child in ast.iter_child_nodes(node): - yield parents, child - yield from _walk_with_parent(child, parents) diff --git a/src/py/reactpy/reactpy/_console/rewrite_camel_case_props.py b/src/py/reactpy/reactpy/_console/rewrite_camel_case_props.py deleted file mode 100644 index e5d1860c2..000000000 --- a/src/py/reactpy/reactpy/_console/rewrite_camel_case_props.py +++ /dev/null @@ -1,113 +0,0 @@ -from __future__ import annotations - -import ast -import re -import sys -from copy import copy -from keyword import kwlist -from pathlib import Path -from typing import Callable - -import click - -from reactpy._console.ast_utils import ( - ChangedNode, - find_element_constructor_usages, - rewrite_changed_nodes, -) - -CAMEL_CASE_SUB_PATTERN = re.compile(r"(?<!^)(?=[A-Z])") - - -@click.command() -@click.argument("paths", nargs=-1, type=click.Path(exists=True)) -def rewrite_camel_case_props(paths: list[str]) -> None: - """Rewrite camelCase props to snake_case""" - if sys.version_info < (3, 9): # nocov - msg = "This command requires Python>=3.9" - raise RuntimeError(msg) - - for p in map(Path, paths): - for f in [p] if p.is_file() else p.rglob("*.py"): - result = generate_rewrite(file=f, source=f.read_text()) - if result is not None: - f.write_text(result) - - -def generate_rewrite(file: Path, source: str) -> str | None: - tree = ast.parse(source) - - changed = find_nodes_to_change(tree) - if not changed: - return None - - new = rewrite_changed_nodes(file, source, tree, changed) - return new - - -def find_nodes_to_change(tree: ast.AST) -> list[ChangedNode]: - changed: list[ChangedNode] = [] - for el_info in find_element_constructor_usages(tree): - if _rewrite_props(el_info.props, _construct_prop_item): - changed.append(ChangedNode(el_info.call, el_info.parents)) - return changed - - -def conv_attr_name(name: str) -> str: - new_name = CAMEL_CASE_SUB_PATTERN.sub("_", name).lower() - return f"{new_name}_" if new_name in kwlist else new_name - - -def _construct_prop_item(key: str, value: ast.expr) -> tuple[str, ast.expr]: - if key == "style" and isinstance(value, (ast.Dict, ast.Call)): - new_value = copy(value) - if _rewrite_props( - new_value, - lambda k, v: ( - (k, v) - # avoid infinite recursion - if k == "style" - else _construct_prop_item(k, v) - ), - ): - value = new_value - else: - key = conv_attr_name(key) - return key, value - - -def _rewrite_props( - props_node: ast.Dict | ast.Call, - constructor: Callable[[str, ast.expr], tuple[str, ast.expr]], -) -> bool: - if isinstance(props_node, ast.Dict): - did_change = False - keys: list[ast.expr | None] = [] - values: list[ast.expr] = [] - for k, v in zip(props_node.keys, props_node.values): - if isinstance(k, ast.Constant) and isinstance(k.value, str): - k_value, new_v = constructor(k.value, v) - if k_value != k.value or new_v is not v: - did_change = True - k = ast.Constant(value=k_value) - v = new_v - keys.append(k) - values.append(v) - if not did_change: - return False - props_node.keys = keys - props_node.values = values - else: - did_change = False - keywords: list[ast.keyword] = [] - for kw in props_node.keywords: - if kw.arg is not None: - kw_arg, kw_value = constructor(kw.arg, kw.value) - if kw_arg != kw.arg or kw_value is not kw.value: - did_change = True - kw = ast.keyword(arg=kw_arg, value=kw_value) - keywords.append(kw) - if not did_change: - return False - props_node.keywords = keywords - return True diff --git a/src/py/reactpy/reactpy/_console/rewrite_keys.py b/src/py/reactpy/reactpy/_console/rewrite_keys.py deleted file mode 100644 index 64ed42f33..000000000 --- a/src/py/reactpy/reactpy/_console/rewrite_keys.py +++ /dev/null @@ -1,112 +0,0 @@ -from __future__ import annotations - -import ast -import sys -from pathlib import Path - -import click - -from reactpy import html -from reactpy._console.ast_utils import ( - ChangedNode, - find_element_constructor_usages, - rewrite_changed_nodes, -) - - -@click.command() -@click.argument("paths", nargs=-1, type=click.Path(exists=True)) -def rewrite_keys(paths: list[str]) -> None: - """Rewrite files under the given paths using the new html element API. - - The old API required users to pass a dictionary of attributes to html element - constructor functions. For example: - - >>> html.div({"className": "x"}, "y") - {"tagName": "div", "attributes": {"className": "x"}, "children": ["y"]} - - The latest API though allows for attributes to be passed as snake_cased keyword - arguments instead. The above example would be rewritten as: - - >>> html.div("y", class_name="x") - {"tagName": "div", "attributes": {"class_name": "x"}, "children": ["y"]} - - All snake_case attributes are converted to camelCase by the client where necessary. - - ----- Notes ----- - - While this command does it's best to preserve as much of the original code as - possible, there are inevitably some limitations in doing this. As a result, we - recommend running your code formatter like Black against your code after executing - this command. - - Additionally, We are unable to preserve the location of comments that lie within any - rewritten code. This command will place the comments in the code it plans to rewrite - just above its changes. As such it requires manual intervention to put those - comments back in their original location. - """ - if sys.version_info < (3, 9): # nocov - msg = "This command requires Python>=3.9" - raise RuntimeError(msg) - - for p in map(Path, paths): - for f in [p] if p.is_file() else p.rglob("*.py"): - result = generate_rewrite(file=f, source=f.read_text()) - if result is not None: - f.write_text(result) - - -def generate_rewrite(file: Path, source: str) -> str | None: - tree = ast.parse(source) - - changed = find_nodes_to_change(tree) - if not changed: - log_could_not_rewrite(file, tree) - return None - - new = rewrite_changed_nodes(file, source, tree, changed) - log_could_not_rewrite(file, ast.parse(new)) - - return new - - -def find_nodes_to_change(tree: ast.AST) -> list[ChangedNode]: - changed: list[ChangedNode] = [] - for el_info in find_element_constructor_usages(tree, add_props=True): - for kw in list(el_info.call.keywords): - if kw.arg == "key": - break - else: - continue - - if isinstance(el_info.props, ast.Dict): - el_info.props.keys.append(ast.Constant("key")) - el_info.props.values.append(kw.value) - else: - el_info.props.keywords.append(ast.keyword(arg="key", value=kw.value)) - - el_info.call.keywords.remove(kw) - changed.append(ChangedNode(el_info.call, el_info.parents)) - - return changed - - -def log_could_not_rewrite(file: Path, tree: ast.AST) -> None: - for node in ast.walk(tree): - if not (isinstance(node, ast.Call) and node.keywords): - continue - - func = node.func - if isinstance(func, ast.Attribute): - name = func.attr - elif isinstance(func, ast.Name): - name = func.id - else: - continue - - if ( - name == "vdom" - or hasattr(html, name) - and any(kw.arg == "key" for kw in node.keywords) - ): - click.echo(f"Unable to rewrite usage at {file}:{node.lineno}") diff --git a/src/py/reactpy/reactpy/_option.py b/src/py/reactpy/reactpy/_option.py deleted file mode 100644 index 1421f33a3..000000000 --- a/src/py/reactpy/reactpy/_option.py +++ /dev/null @@ -1,133 +0,0 @@ -from __future__ import annotations - -import os -from logging import getLogger -from typing import Any, Callable, Generic, TypeVar, cast - -from reactpy._warnings import warn - -_O = TypeVar("_O") -logger = getLogger(__name__) - - -class Option(Generic[_O]): - """An option that can be set using an environment variable of the same name""" - - def __init__( - self, - name: str, - default: _O | Option[_O], - mutable: bool = True, - validator: Callable[[Any], _O] = lambda x: cast(_O, x), - ) -> None: - self._name = name - self._mutable = mutable - self._validator = validator - self._subscribers: list[Callable[[_O], None]] = [] - - if name in os.environ: - self._current = validator(os.environ[name]) - - self._default: _O - if isinstance(default, Option): - self._default = default.default - default.subscribe(lambda value: setattr(self, "_default", value)) - else: - self._default = default - - logger.debug(f"{self._name}={self.current}") - - @property - def name(self) -> str: - """The name of this option (used to load environment variables)""" - return self._name - - @property - def mutable(self) -> bool: - """Whether this option can be modified after being loaded""" - return self._mutable - - @property - def default(self) -> _O: - """This option's default value""" - return self._default - - @property - def current(self) -> _O: - try: - return self._current - except AttributeError: - return self._default - - @current.setter - def current(self, new: _O) -> None: - self.set_current(new) - - def subscribe(self, handler: Callable[[_O], None]) -> Callable[[_O], None]: - """Register a callback that will be triggered when this option changes""" - if not self.mutable: - msg = "Immutable options cannot be subscribed to." - raise TypeError(msg) - self._subscribers.append(handler) - handler(self.current) - return handler - - def is_set(self) -> bool: - """Whether this option has a value other than its default.""" - return hasattr(self, "_current") - - def set_current(self, new: Any) -> None: - """Set the value of this option - - Raises a ``TypeError`` if this option is not :attr:`Option.mutable`. - """ - if not self._mutable: - msg = f"{self} cannot be modified after initial load" - raise TypeError(msg) - old = self.current - new = self._current = self._validator(new) - logger.debug(f"{self._name}={self._current}") - if new != old: - for sub_func in self._subscribers: - sub_func(new) - - def set_default(self, new: _O) -> _O: - """Set the value of this option if not :meth:`Option.is_set` - - Returns the current value (a la :meth:`dict.set_default`) - """ - if not self.is_set(): - self.set_current(new) - return self._current - - def reload(self) -> None: - """Reload this option from its environment variable""" - self.set_current(os.environ.get(self._name, self._default)) - - def unset(self) -> None: - """Remove the current value, the default will be used until it is set again.""" - if not self._mutable: - msg = f"{self} cannot be modified after initial load" - raise TypeError(msg) - old = self.current - delattr(self, "_current") - if self.current != old: - for sub_func in self._subscribers: - sub_func(self.current) - - def __repr__(self) -> str: - return f"Option({self._name}={self.current!r})" - - -class DeprecatedOption(Option[_O]): # nocov - def __init__(self, message: str, *args: Any, **kwargs: Any) -> None: - self._deprecation_message = message - super().__init__(*args, **kwargs) - - @Option.current.getter # type: ignore - def current(self) -> _O: - warn( - self._deprecation_message, - DeprecationWarning, - ) - return super().current diff --git a/src/py/reactpy/reactpy/_warnings.py b/src/py/reactpy/reactpy/_warnings.py deleted file mode 100644 index c4520604d..000000000 --- a/src/py/reactpy/reactpy/_warnings.py +++ /dev/null @@ -1,36 +0,0 @@ -from collections.abc import Iterator -from functools import wraps -from inspect import currentframe -from types import FrameType -from typing import TYPE_CHECKING, Any -from warnings import warn as _warn - - -@wraps(_warn) -def warn(*args: Any, **kwargs: Any) -> Any: - # warn at call site outside of ReactPy - _warn(*args, stacklevel=_frame_depth_in_module() + 1, **kwargs) # type: ignore - - -if TYPE_CHECKING: - warn = _warn # noqa: F811 - - -def _frame_depth_in_module() -> int: - depth = 0 - for frame in _iter_frames(2): - module_name = frame.f_globals.get("__name__") - if not module_name or not module_name.startswith("reactpy."): - break - depth += 1 - return depth - - -def _iter_frames(index: int = 1) -> Iterator[FrameType]: - frame = currentframe() - while frame is not None: - if index == 0: - yield frame - else: - index -= 1 - frame = frame.f_back diff --git a/src/py/reactpy/reactpy/backend/__init__.py b/src/py/reactpy/reactpy/backend/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/py/reactpy/reactpy/backend/_common.py b/src/py/reactpy/reactpy/backend/_common.py deleted file mode 100644 index 80b4eeee1..000000000 --- a/src/py/reactpy/reactpy/backend/_common.py +++ /dev/null @@ -1,146 +0,0 @@ -from __future__ import annotations - -import asyncio -import os -from collections.abc import Awaitable, Sequence -from dataclasses import dataclass -from pathlib import Path, PurePosixPath -from typing import TYPE_CHECKING, Any, cast - -from reactpy import __file__ as _reactpy_file_path -from reactpy import html -from reactpy.config import REACTPY_WEB_MODULES_DIR -from reactpy.core.types import VdomDict -from reactpy.utils import vdom_to_html - -if TYPE_CHECKING: - from asgiref.typing import ASGIApplication - -PATH_PREFIX = PurePosixPath("/_reactpy") -MODULES_PATH = PATH_PREFIX / "modules" -ASSETS_PATH = PATH_PREFIX / "assets" -STREAM_PATH = PATH_PREFIX / "stream" - -CLIENT_BUILD_DIR = Path(_reactpy_file_path).parent / "_static" / "app" / "dist" - -try: - import uvicorn -except ImportError: # nocov - pass -else: - - async def serve_development_asgi( - app: ASGIApplication | Any, - host: str, - port: int, - started: asyncio.Event | None, - ) -> None: - """Run a development server for an ASGI application""" - server = uvicorn.Server( - uvicorn.Config( - app, - host=host, - port=port, - loop="asyncio", - reload=True, - ) - ) - server.config.setup_event_loop() - coros: list[Awaitable[Any]] = [server.serve()] - - # If a started event is provided, then use it signal based on `server.started` - if started: - coros.append(_check_if_started(server, started)) - - try: - await asyncio.gather(*coros) - finally: - # Since we aren't using the uvicorn's `run()` API, we can't guarantee uvicorn's - # order of operations. So we need to make sure `shutdown()` always has an initialized - # list of `self.servers` to use. - if not hasattr(server, "servers"): # nocov - server.servers = [] - await asyncio.wait_for(server.shutdown(), timeout=3) - - -async def _check_if_started(server: uvicorn.Server, started: asyncio.Event) -> None: - while not server.started: - await asyncio.sleep(0.2) - started.set() - - -def safe_client_build_dir_path(path: str) -> Path: - """Prevent path traversal out of :data:`CLIENT_BUILD_DIR`""" - return traversal_safe_path( - CLIENT_BUILD_DIR, - *("index.html" if path in ("", "/") else path).split("/"), - ) - - -def safe_web_modules_dir_path(path: str) -> Path: - """Prevent path traversal out of :data:`reactpy.config.REACTPY_WEB_MODULES_DIR`""" - return traversal_safe_path(REACTPY_WEB_MODULES_DIR.current, *path.split("/")) - - -def traversal_safe_path(root: str | Path, *unsafe: str | Path) -> Path: - """Raise a ``ValueError`` if the ``unsafe`` path resolves outside the root dir.""" - root = os.path.abspath(root) - - # Resolve relative paths but not symlinks - symlinks should be ok since their - # presence and where they point is under the control of the developer. - path = os.path.abspath(os.path.join(root, *unsafe)) - - if os.path.commonprefix([root, path]) != root: - # If the common prefix is not root directory we resolved outside the root dir - msg = "Unsafe path" - raise ValueError(msg) - - return Path(path) - - -def read_client_index_html(options: CommonOptions) -> str: - return ( - (CLIENT_BUILD_DIR / "index.html") - .read_text() - .format(__head__=vdom_head_elements_to_html(options.head)) - ) - - -def vdom_head_elements_to_html(head: Sequence[VdomDict] | VdomDict | str) -> str: - if isinstance(head, str): - return head - elif isinstance(head, dict): - if head.get("tagName") == "head": - head = cast(VdomDict, {**head, "tagName": ""}) - return vdom_to_html(head) - else: - return vdom_to_html(html._(head)) - - -@dataclass -class CommonOptions: - """Options for ReactPy's built-in backed server implementations""" - - head: Sequence[VdomDict] | VdomDict | str = ( - html.title("ReactPy"), - html.link( - { - "rel": "icon", - "href": "/_reactpy/assets/reactpy-logo.ico", - "type": "image/x-icon", - } - ), - ) - """Add elements to the ``<head>`` of the application. - - For example, this can be used to customize the title of the page, link extra - scripts, or load stylesheets. - """ - - url_prefix: str = "" - """The URL prefix where ReactPy resources will be served from""" - - def __post_init__(self) -> None: - if self.url_prefix and not self.url_prefix.startswith("/"): - msg = "Expected 'url_prefix' to start with '/'" - raise ValueError(msg) diff --git a/src/py/reactpy/reactpy/backend/default.py b/src/py/reactpy/reactpy/backend/default.py deleted file mode 100644 index 4ca192c1c..000000000 --- a/src/py/reactpy/reactpy/backend/default.py +++ /dev/null @@ -1,72 +0,0 @@ -from __future__ import annotations - -import asyncio -from logging import getLogger -from sys import exc_info -from typing import Any, NoReturn - -from reactpy.backend.types import BackendImplementation -from reactpy.backend.utils import SUPPORTED_PACKAGES, all_implementations -from reactpy.types import RootComponentConstructor - -logger = getLogger(__name__) - - -def configure( - app: Any, component: RootComponentConstructor, options: None = None -) -> None: - """Configure the given app instance to display the given component""" - if options is not None: # nocov - msg = "Default implementation cannot be configured with options" - raise ValueError(msg) - return _default_implementation().configure(app, component) - - -def create_development_app() -> Any: - """Create an application instance for development purposes""" - return _default_implementation().create_development_app() - - -def Options(*args: Any, **kwargs: Any) -> NoReturn: # nocov - """Create configuration options""" - msg = "Default implementation has no options." - raise ValueError(msg) - - -async def serve_development_app( - app: Any, - host: str, - port: int, - started: asyncio.Event | None = None, -) -> None: - """Run an application using a development server""" - return await _default_implementation().serve_development_app( - app, host, port, started - ) - - -_DEFAULT_IMPLEMENTATION: BackendImplementation[Any] | None = None - - -def _default_implementation() -> BackendImplementation[Any]: - """Get the first available server implementation""" - global _DEFAULT_IMPLEMENTATION # noqa: PLW0603 - - if _DEFAULT_IMPLEMENTATION is not None: - return _DEFAULT_IMPLEMENTATION - - try: - implementation = next(all_implementations()) - except StopIteration: # nocov - logger.debug("Backend implementation import failed", exc_info=exc_info()) - supported_backends = ", ".join(SUPPORTED_PACKAGES) - msg = ( - "It seems you haven't installed a backend. To resolve this issue, " - "you can install a backend by running:\n\n" - '\033[1mpip install "reactpy[starlette]"\033[0m\n\n' - f"Other supported backends include: {supported_backends}." - ) - raise RuntimeError(msg) from None - else: - _DEFAULT_IMPLEMENTATION = implementation - return implementation diff --git a/src/py/reactpy/reactpy/backend/fastapi.py b/src/py/reactpy/reactpy/backend/fastapi.py deleted file mode 100644 index 575fce1fe..000000000 --- a/src/py/reactpy/reactpy/backend/fastapi.py +++ /dev/null @@ -1,25 +0,0 @@ -from __future__ import annotations - -from fastapi import FastAPI - -from reactpy.backend import starlette - -serve_development_app = starlette.serve_development_app -"""Alias for :func:`reactpy.backend.starlette.serve_development_app`""" - -use_connection = starlette.use_connection -"""Alias for :func:`reactpy.backend.starlette.use_location`""" - -use_websocket = starlette.use_websocket -"""Alias for :func:`reactpy.backend.starlette.use_websocket`""" - -Options = starlette.Options -"""Alias for :class:`reactpy.backend.starlette.Options`""" - -configure = starlette.configure -"""Alias for :class:`reactpy.backend.starlette.configure`""" - - -def create_development_app() -> FastAPI: - """Create a development ``FastAPI`` application instance.""" - return FastAPI(debug=True) diff --git a/src/py/reactpy/reactpy/backend/flask.py b/src/py/reactpy/reactpy/backend/flask.py deleted file mode 100644 index 46aed3c46..000000000 --- a/src/py/reactpy/reactpy/backend/flask.py +++ /dev/null @@ -1,298 +0,0 @@ -from __future__ import annotations - -import asyncio -import json -import logging -import os -from asyncio import Queue as AsyncQueue -from dataclasses import dataclass -from queue import Queue as ThreadQueue -from threading import Event as ThreadEvent -from threading import Thread -from typing import Any, Callable, NamedTuple, NoReturn, cast - -from flask import ( - Blueprint, - Flask, - Request, - copy_current_request_context, - request, - send_file, -) -from flask_cors import CORS -from flask_sock import Sock -from simple_websocket import Server as WebSocket -from werkzeug.serving import BaseWSGIServer, make_server - -import reactpy -from reactpy.backend._common import ( - ASSETS_PATH, - MODULES_PATH, - PATH_PREFIX, - STREAM_PATH, - CommonOptions, - read_client_index_html, - safe_client_build_dir_path, - safe_web_modules_dir_path, -) -from reactpy.backend.hooks import ConnectionContext -from reactpy.backend.hooks import use_connection as _use_connection -from reactpy.backend.types import Connection, Location -from reactpy.core.serve import serve_layout -from reactpy.core.types import ComponentType, RootComponentConstructor -from reactpy.utils import Ref - -logger = logging.getLogger(__name__) - - -def configure( - app: Flask, component: RootComponentConstructor, options: Options | None = None -) -> None: - """Configure the necessary ReactPy routes on the given app. - - Parameters: - app: An application instance - component: A component constructor - options: Options for configuring server behavior - """ - options = options or Options() - - api_bp = Blueprint(f"reactpy_api_{id(app)}", __name__, url_prefix=str(PATH_PREFIX)) - spa_bp = Blueprint( - f"reactpy_spa_{id(app)}", __name__, url_prefix=options.url_prefix - ) - - _setup_single_view_dispatcher_route(api_bp, options, component) - _setup_common_routes(api_bp, spa_bp, options) - - app.register_blueprint(api_bp) - app.register_blueprint(spa_bp) - - -def create_development_app() -> Flask: - """Create an application instance for development purposes""" - os.environ["FLASK_DEBUG"] = "true" - app = Flask(__name__) - return app - - -async def serve_development_app( - app: Flask, - host: str, - port: int, - started: asyncio.Event | None = None, -) -> None: - """Run an application using a development server""" - loop = asyncio.get_running_loop() - stopped = asyncio.Event() - - server: Ref[BaseWSGIServer] = Ref() - - def run_server() -> None: - server.current = make_server(host, port, app, threaded=True) - if started: - loop.call_soon_threadsafe(started.set) - try: - server.current.serve_forever() # type: ignore - finally: - loop.call_soon_threadsafe(stopped.set) - - thread = Thread(target=run_server, daemon=True) - thread.start() - - if started: - await started.wait() - - try: - await stopped.wait() - finally: - # we may have exited because this task was cancelled - server.current.shutdown() - # the thread should eventually join - thread.join(timeout=3) - # just double check it happened - if thread.is_alive(): # nocov - msg = "Failed to shutdown server." - raise RuntimeError(msg) - - -def use_websocket() -> WebSocket: - """A handle to the current websocket""" - return use_connection().carrier.websocket - - -def use_request() -> Request: - """Get the current ``Request``""" - return use_connection().carrier.request - - -def use_connection() -> Connection[_FlaskCarrier]: - """Get the current :class:`Connection`""" - conn = _use_connection() - if not isinstance(conn.carrier, _FlaskCarrier): # nocov - msg = f"Connection has unexpected carrier {conn.carrier}. Are you running with a Flask server?" - raise TypeError(msg) - return conn - - -@dataclass -class Options(CommonOptions): - """Render server config for :func:`reactpy.backend.flask.configure`""" - - cors: bool | dict[str, Any] = False - """Enable or configure Cross Origin Resource Sharing (CORS) - - For more information see docs for ``flask_cors.CORS`` - """ - - -def _setup_common_routes( - api_blueprint: Blueprint, - spa_blueprint: Blueprint, - options: Options, -) -> None: - cors_options = options.cors - if cors_options: # nocov - cors_params = cors_options if isinstance(cors_options, dict) else {} - CORS(api_blueprint, **cors_params) - - @api_blueprint.route(f"/{ASSETS_PATH.name}/<path:path>") - def send_assets_dir(path: str = "") -> Any: - return send_file(safe_client_build_dir_path(f"assets/{path}")) - - @api_blueprint.route(f"/{MODULES_PATH.name}/<path:path>") - def send_modules_dir(path: str = "") -> Any: - return send_file(safe_web_modules_dir_path(path)) - - index_html = read_client_index_html(options) - - @spa_blueprint.route("/") - @spa_blueprint.route("/<path:_>") - def send_client_dir(_: str = "") -> Any: - return index_html - - -def _setup_single_view_dispatcher_route( - api_blueprint: Blueprint, options: Options, constructor: RootComponentConstructor -) -> None: - sock = Sock(api_blueprint) - - def model_stream(ws: WebSocket, path: str = "") -> None: - def send(value: Any) -> None: - ws.send(json.dumps(value)) - - def recv() -> Any: - return json.loads(ws.receive()) - - _dispatch_in_thread( - ws, - # remove any url prefix from path - path[len(options.url_prefix) :], - constructor(), - send, - recv, - ) - - sock.route(STREAM_PATH.name, endpoint="without_path")(model_stream) - sock.route(f"{STREAM_PATH.name}/<path:path>", endpoint="with_path")(model_stream) - - -def _dispatch_in_thread( - websocket: WebSocket, - path: str, - component: ComponentType, - send: Callable[[Any], None], - recv: Callable[[], Any | None], -) -> NoReturn: - dispatch_thread_info_created = ThreadEvent() - dispatch_thread_info_ref: reactpy.Ref[_DispatcherThreadInfo | None] = reactpy.Ref( - None - ) - - @copy_current_request_context - def run_dispatcher() -> None: - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - - thread_send_queue: ThreadQueue[Any] = ThreadQueue() - async_recv_queue: AsyncQueue[Any] = AsyncQueue() - - async def send_coro(value: Any) -> None: - thread_send_queue.put(value) - - async def main() -> None: - search = request.query_string.decode() - await serve_layout( - reactpy.Layout( - ConnectionContext( - component, - value=Connection( - scope=request.environ, - location=Location( - pathname=f"/{path}", - search=f"?{search}" if search else "", - ), - carrier=_FlaskCarrier(request, websocket), - ), - ), - ), - send_coro, - async_recv_queue.get, - ) - - main_future = asyncio.ensure_future(main(), loop=loop) - - dispatch_thread_info_ref.current = _DispatcherThreadInfo( - dispatch_loop=loop, - dispatch_future=main_future, - thread_send_queue=thread_send_queue, - async_recv_queue=async_recv_queue, - ) - dispatch_thread_info_created.set() - - loop.run_until_complete(main_future) - - Thread(target=run_dispatcher, daemon=True).start() - - dispatch_thread_info_created.wait() - dispatch_thread_info = cast(_DispatcherThreadInfo, dispatch_thread_info_ref.current) - - if dispatch_thread_info is None: - raise RuntimeError("Failed to create dispatcher thread") # nocov - - stop = ThreadEvent() - - def run_send() -> None: - while not stop.is_set(): - send(dispatch_thread_info.thread_send_queue.get()) - - Thread(target=run_send, daemon=True).start() - - try: - while True: - value = recv() - dispatch_thread_info.dispatch_loop.call_soon_threadsafe( - dispatch_thread_info.async_recv_queue.put_nowait, value - ) - finally: # nocov - dispatch_thread_info.dispatch_loop.call_soon_threadsafe( - dispatch_thread_info.dispatch_future.cancel - ) - - -class _DispatcherThreadInfo(NamedTuple): - dispatch_loop: asyncio.AbstractEventLoop - dispatch_future: asyncio.Future[Any] - thread_send_queue: ThreadQueue[Any] - async_recv_queue: AsyncQueue[Any] - - -@dataclass -class _FlaskCarrier: - """A simple wrapper for holding a Flask request and WebSocket""" - - request: Request - """The current request object""" - - websocket: WebSocket - """A handle to the current websocket""" diff --git a/src/py/reactpy/reactpy/backend/hooks.py b/src/py/reactpy/reactpy/backend/hooks.py deleted file mode 100644 index 19ad114ed..000000000 --- a/src/py/reactpy/reactpy/backend/hooks.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from collections.abc import MutableMapping -from typing import Any - -from reactpy.backend.types import Connection, Location -from reactpy.core.hooks import Context, create_context, use_context - -# backend implementations should establish this context at the root of an app -ConnectionContext: Context[Connection[Any] | None] = create_context(None) - - -def use_connection() -> Connection[Any]: - """Get the current :class:`~reactpy.backend.types.Connection`.""" - conn = use_context(ConnectionContext) - if conn is None: # nocov - msg = "No backend established a connection." - raise RuntimeError(msg) - return conn - - -def use_scope() -> MutableMapping[str, Any]: - """Get the current :class:`~reactpy.backend.types.Connection`'s scope.""" - return use_connection().scope - - -def use_location() -> Location: - """Get the current :class:`~reactpy.backend.types.Connection`'s location.""" - return use_connection().location diff --git a/src/py/reactpy/reactpy/backend/sanic.py b/src/py/reactpy/reactpy/backend/sanic.py deleted file mode 100644 index 53dd0ce68..000000000 --- a/src/py/reactpy/reactpy/backend/sanic.py +++ /dev/null @@ -1,223 +0,0 @@ -from __future__ import annotations - -import asyncio -import json -import logging -from dataclasses import dataclass -from typing import Any -from urllib import parse as urllib_parse -from uuid import uuid4 - -from sanic import Blueprint, Sanic, request, response -from sanic.config import Config -from sanic.server.websockets.connection import WebSocketConnection -from sanic_cors import CORS - -from reactpy.backend._common import ( - ASSETS_PATH, - MODULES_PATH, - PATH_PREFIX, - STREAM_PATH, - CommonOptions, - read_client_index_html, - safe_client_build_dir_path, - safe_web_modules_dir_path, - serve_development_asgi, -) -from reactpy.backend.hooks import ConnectionContext -from reactpy.backend.hooks import use_connection as _use_connection -from reactpy.backend.types import Connection, Location -from reactpy.core.layout import Layout -from reactpy.core.serve import RecvCoroutine, SendCoroutine, Stop, serve_layout -from reactpy.core.types import RootComponentConstructor - -logger = logging.getLogger(__name__) - - -def configure( - app: Sanic, component: RootComponentConstructor, options: Options | None = None -) -> None: - """Configure an application instance to display the given component""" - options = options or Options() - - spa_bp = Blueprint(f"reactpy_spa_{id(app)}", url_prefix=options.url_prefix) - api_bp = Blueprint(f"reactpy_api_{id(app)}", url_prefix=str(PATH_PREFIX)) - - _setup_common_routes(api_bp, spa_bp, options) - _setup_single_view_dispatcher_route(api_bp, component, options) - - app.blueprint([spa_bp, api_bp]) - - -def create_development_app() -> Sanic: - """Return a :class:`Sanic` app instance in test mode""" - Sanic.test_mode = True - logger.warning("Sanic.test_mode is now active") - app = Sanic(f"reactpy_development_app_{uuid4().hex}", Config()) - return app - - -async def serve_development_app( - app: Sanic, - host: str, - port: int, - started: asyncio.Event | None = None, -) -> None: - """Run a development server for :mod:`sanic`""" - await serve_development_asgi(app, host, port, started) - - -def use_request() -> request.Request: - """Get the current ``Request``""" - return use_connection().carrier.request - - -def use_websocket() -> WebSocketConnection: - """Get the current websocket""" - return use_connection().carrier.websocket - - -def use_connection() -> Connection[_SanicCarrier]: - """Get the current :class:`Connection`""" - conn = _use_connection() - if not isinstance(conn.carrier, _SanicCarrier): # nocov - msg = f"Connection has unexpected carrier {conn.carrier}. Are you running with a Sanic server?" - raise TypeError(msg) - return conn - - -@dataclass -class Options(CommonOptions): - """Render server config for :func:`reactpy.backend.sanic.configure`""" - - cors: bool | dict[str, Any] = False - """Enable or configure Cross Origin Resource Sharing (CORS) - - For more information see docs for ``sanic_cors.CORS`` - """ - - -def _setup_common_routes( - api_blueprint: Blueprint, - spa_blueprint: Blueprint, - options: Options, -) -> None: - cors_options = options.cors - if cors_options: # nocov - cors_params = cors_options if isinstance(cors_options, dict) else {} - CORS(api_blueprint, **cors_params) - - index_html = read_client_index_html(options) - - async def single_page_app_files( - request: request.Request, - _: str = "", - ) -> response.HTTPResponse: - return response.html(index_html) - - spa_blueprint.add_route( - single_page_app_files, - "/", - name="single_page_app_files_root", - ) - spa_blueprint.add_route( - single_page_app_files, - "/<_:path>", - name="single_page_app_files_path", - ) - - async def asset_files( - request: request.Request, - path: str = "", - ) -> response.HTTPResponse: - path = urllib_parse.unquote(path) - return await response.file(safe_client_build_dir_path(f"assets/{path}")) - - api_blueprint.add_route(asset_files, f"/{ASSETS_PATH.name}/<path:path>") - - async def web_module_files( - request: request.Request, - path: str, - _: str = "", # this is not used - ) -> response.HTTPResponse: - path = urllib_parse.unquote(path) - return await response.file( - safe_web_modules_dir_path(path), - mime_type="text/javascript", - ) - - api_blueprint.add_route(web_module_files, f"/{MODULES_PATH.name}/<path:path>") - - -def _setup_single_view_dispatcher_route( - api_blueprint: Blueprint, - constructor: RootComponentConstructor, - options: Options, -) -> None: - async def model_stream( - request: request.Request, socket: WebSocketConnection, path: str = "" - ) -> None: - asgi_app = getattr(request.app, "_asgi_app", None) - scope = asgi_app.transport.scope if asgi_app else {} - if not scope: # nocov - logger.warning("No scope. Sanic may not be running with an ASGI server") - - send, recv = _make_send_recv_callbacks(socket) - await serve_layout( - Layout( - ConnectionContext( - constructor(), - value=Connection( - scope=scope, - location=Location( - pathname=f"/{path[len(options.url_prefix):]}", - search=( - f"?{request.query_string}" - if request.query_string - else "" - ), - ), - carrier=_SanicCarrier(request, socket), - ), - ) - ), - send, - recv, - ) - - api_blueprint.add_websocket_route( - model_stream, - f"/{STREAM_PATH.name}", - name="model_stream_root", - ) - api_blueprint.add_websocket_route( - model_stream, - f"/{STREAM_PATH.name}/<path:path>/", - name="model_stream_path", - ) - - -def _make_send_recv_callbacks( - socket: WebSocketConnection, -) -> tuple[SendCoroutine, RecvCoroutine]: - async def sock_send(value: Any) -> None: - await socket.send(json.dumps(value)) - - async def sock_recv() -> Any: - data = await socket.recv() - if data is None: - raise Stop() - return json.loads(data) - - return sock_send, sock_recv - - -@dataclass -class _SanicCarrier: - """A simple wrapper for holding connection information""" - - request: request.Request - """The current request object""" - - websocket: WebSocketConnection - """A handle to the current websocket""" diff --git a/src/py/reactpy/reactpy/backend/starlette.py b/src/py/reactpy/reactpy/backend/starlette.py deleted file mode 100644 index 3a9695b33..000000000 --- a/src/py/reactpy/reactpy/backend/starlette.py +++ /dev/null @@ -1,172 +0,0 @@ -from __future__ import annotations - -import asyncio -import json -import logging -from collections.abc import Awaitable -from dataclasses import dataclass -from typing import Any, Callable - -from starlette.applications import Starlette -from starlette.middleware.cors import CORSMiddleware -from starlette.requests import Request -from starlette.responses import HTMLResponse -from starlette.staticfiles import StaticFiles -from starlette.websockets import WebSocket, WebSocketDisconnect - -from reactpy.backend._common import ( - ASSETS_PATH, - CLIENT_BUILD_DIR, - MODULES_PATH, - STREAM_PATH, - CommonOptions, - read_client_index_html, - serve_development_asgi, -) -from reactpy.backend.hooks import ConnectionContext -from reactpy.backend.hooks import use_connection as _use_connection -from reactpy.backend.types import Connection, Location -from reactpy.config import REACTPY_WEB_MODULES_DIR -from reactpy.core.layout import Layout -from reactpy.core.serve import RecvCoroutine, SendCoroutine, serve_layout -from reactpy.core.types import RootComponentConstructor - -logger = logging.getLogger(__name__) - - -def configure( - app: Starlette, - component: RootComponentConstructor, - options: Options | None = None, -) -> None: - """Configure the necessary ReactPy routes on the given app. - - Parameters: - app: An application instance - component: A component constructor - options: Options for configuring server behavior - """ - options = options or Options() - - # this route should take priority so set up it up first - _setup_single_view_dispatcher_route(options, app, component) - - _setup_common_routes(options, app) - - -def create_development_app() -> Starlette: - """Return a :class:`Starlette` app instance in debug mode""" - return Starlette(debug=True) - - -async def serve_development_app( - app: Starlette, - host: str, - port: int, - started: asyncio.Event | None = None, -) -> None: - """Run a development server for starlette""" - await serve_development_asgi(app, host, port, started) - - -def use_websocket() -> WebSocket: - """Get the current WebSocket object""" - return use_connection().carrier - - -def use_connection() -> Connection[WebSocket]: - conn = _use_connection() - if not isinstance(conn.carrier, WebSocket): # nocov - msg = f"Connection has unexpected carrier {conn.carrier}. Are you running with a Flask server?" - raise TypeError(msg) - return conn - - -@dataclass -class Options(CommonOptions): - """Render server config for :func:`reactpy.backend.starlette.configure`""" - - cors: bool | dict[str, Any] = False - """Enable or configure Cross Origin Resource Sharing (CORS) - - For more information see docs for ``starlette.middleware.cors.CORSMiddleware`` - """ - - -def _setup_common_routes(options: Options, app: Starlette) -> None: - cors_options = options.cors - if cors_options: # nocov - cors_params = ( - cors_options if isinstance(cors_options, dict) else {"allow_origins": ["*"]} - ) - app.add_middleware(CORSMiddleware, **cors_params) - - # This really should be added to the APIRouter, but there's a bug in Starlette - # BUG: https://github.com/tiangolo/fastapi/issues/1469 - url_prefix = options.url_prefix - - app.mount( - str(MODULES_PATH), - StaticFiles(directory=REACTPY_WEB_MODULES_DIR.current, check_dir=False), - ) - app.mount( - str(ASSETS_PATH), - StaticFiles(directory=CLIENT_BUILD_DIR / "assets", check_dir=False), - ) - # register this last so it takes least priority - index_route = _make_index_route(options) - app.add_route(url_prefix + "/", index_route) - app.add_route(url_prefix + "/{path:path}", index_route) - - -def _make_index_route(options: Options) -> Callable[[Request], Awaitable[HTMLResponse]]: - index_html = read_client_index_html(options) - - async def serve_index(request: Request) -> HTMLResponse: - return HTMLResponse(index_html) - - return serve_index - - -def _setup_single_view_dispatcher_route( - options: Options, app: Starlette, component: RootComponentConstructor -) -> None: - @app.websocket_route(str(STREAM_PATH)) - @app.websocket_route(f"{STREAM_PATH}/{{path:path}}") - async def model_stream(socket: WebSocket) -> None: - await socket.accept() - send, recv = _make_send_recv_callbacks(socket) - - pathname = "/" + socket.scope["path_params"].get("path", "") - pathname = pathname[len(options.url_prefix) :] or "/" - search = socket.scope["query_string"].decode() - - try: - await serve_layout( - Layout( - ConnectionContext( - component(), - value=Connection( - scope=socket.scope, - location=Location(pathname, f"?{search}" if search else ""), - carrier=socket, - ), - ) - ), - send, - recv, - ) - except WebSocketDisconnect as error: - logger.info(f"WebSocket disconnect: {error.code}") - - -def _make_send_recv_callbacks( - socket: WebSocket, -) -> tuple[SendCoroutine, RecvCoroutine]: - async def sock_send(value: Any) -> None: - await socket.send_text(json.dumps(value)) - - async def sock_recv() -> Any: - return json.loads(await socket.receive_text()) - - return sock_send, sock_recv diff --git a/src/py/reactpy/reactpy/backend/tornado.py b/src/py/reactpy/reactpy/backend/tornado.py deleted file mode 100644 index 5ec877532..000000000 --- a/src/py/reactpy/reactpy/backend/tornado.py +++ /dev/null @@ -1,227 +0,0 @@ -from __future__ import annotations - -import asyncio -import json -from asyncio import Queue as AsyncQueue -from asyncio.futures import Future -from typing import Any -from urllib.parse import urljoin - -from tornado.httpserver import HTTPServer -from tornado.httputil import HTTPServerRequest -from tornado.log import enable_pretty_logging -from tornado.platform.asyncio import AsyncIOMainLoop -from tornado.web import Application, RequestHandler, StaticFileHandler -from tornado.websocket import WebSocketHandler -from tornado.wsgi import WSGIContainer -from typing_extensions import TypeAlias - -from reactpy.backend._common import ( - ASSETS_PATH, - CLIENT_BUILD_DIR, - MODULES_PATH, - STREAM_PATH, - CommonOptions, - read_client_index_html, -) -from reactpy.backend.hooks import ConnectionContext -from reactpy.backend.hooks import use_connection as _use_connection -from reactpy.backend.types import Connection, Location -from reactpy.config import REACTPY_WEB_MODULES_DIR -from reactpy.core.layout import Layout -from reactpy.core.serve import serve_layout -from reactpy.core.types import ComponentConstructor - -Options = CommonOptions -"""Render server config for :func:`reactpy.backend.tornado.configure`""" - - -def configure( - app: Application, - component: ComponentConstructor, - options: CommonOptions | None = None, -) -> None: - """Configure the necessary ReactPy routes on the given app. - - Parameters: - app: An application instance - component: A component constructor - options: Options for configuring server behavior - """ - options = options or Options() - _add_handler( - app, - options, - ( - # this route should take priority so set up it up first - _setup_single_view_dispatcher_route(component, options) - + _setup_common_routes(options) - ), - ) - - -def create_development_app() -> Application: - return Application(debug=True) - - -async def serve_development_app( - app: Application, - host: str, - port: int, - started: asyncio.Event | None = None, -) -> None: - enable_pretty_logging() - - AsyncIOMainLoop.current().install() - - server = HTTPServer(app) - server.listen(port, host) - - if started: - # at this point the server is accepting connection - started.set() - - try: - # block forever - tornado has already set up its own background tasks - await asyncio.get_running_loop().create_future() - finally: - # stop accepting new connections - server.stop() - # wait for existing connections to complete - await server.close_all_connections() - - -def use_request() -> HTTPServerRequest: - """Get the current ``HTTPServerRequest``""" - return use_connection().carrier - - -def use_connection() -> Connection[HTTPServerRequest]: - conn = _use_connection() - if not isinstance(conn.carrier, HTTPServerRequest): # nocov - msg = f"Connection has unexpected carrier {conn.carrier}. Are you running with a Flask server?" - raise TypeError(msg) - return conn - - -_RouteHandlerSpecs: TypeAlias = "list[tuple[str, type[RequestHandler], Any]]" - - -def _setup_common_routes(options: Options) -> _RouteHandlerSpecs: - return [ - ( - rf"{MODULES_PATH}/(.*)", - StaticFileHandler, - {"path": str(REACTPY_WEB_MODULES_DIR.current)}, - ), - ( - rf"{ASSETS_PATH}/(.*)", - StaticFileHandler, - {"path": str(CLIENT_BUILD_DIR / "assets")}, - ), - ( - r"/(.*)", - IndexHandler, - {"index_html": read_client_index_html(options)}, - ), - ] - - -def _add_handler( - app: Application, options: Options, handlers: _RouteHandlerSpecs -) -> None: - prefixed_handlers: list[Any] = [ - (urljoin(options.url_prefix, route_pattern), *tuple(handler_info)) - for route_pattern, *handler_info in handlers - ] - app.add_handlers(r".*", prefixed_handlers) - - -def _setup_single_view_dispatcher_route( - constructor: ComponentConstructor, options: Options -) -> _RouteHandlerSpecs: - return [ - ( - rf"{STREAM_PATH}/(.*)", - ModelStreamHandler, - {"component_constructor": constructor, "url_prefix": options.url_prefix}, - ), - ( - str(STREAM_PATH), - ModelStreamHandler, - {"component_constructor": constructor, "url_prefix": options.url_prefix}, - ), - ] - - -class IndexHandler(RequestHandler): - _index_html: str - - def initialize(self, index_html: str) -> None: - self._index_html = index_html - - async def get(self, _: str) -> None: - self.finish(self._index_html) - - -class ModelStreamHandler(WebSocketHandler): - """A web-socket handler that serves up a new model stream to each new client""" - - _dispatch_future: Future[None] - _message_queue: AsyncQueue[str] - - def initialize( - self, component_constructor: ComponentConstructor, url_prefix: str - ) -> None: - self._component_constructor = component_constructor - self._url_prefix = url_prefix - - async def open(self, path: str = "", *args: Any, **kwargs: Any) -> None: - message_queue: AsyncQueue[str] = AsyncQueue() - - async def send(value: Any) -> None: - await self.write_message(json.dumps(value)) - - async def recv() -> Any: - return json.loads(await message_queue.get()) - - self._message_queue = message_queue - self._dispatch_future = asyncio.ensure_future( - serve_layout( - Layout( - ConnectionContext( - self._component_constructor(), - value=Connection( - scope=_FAKE_WSGI_CONTAINER.environ(self.request), - location=Location( - pathname=f"/{path[len(self._url_prefix):]}", - search=( - f"?{self.request.query}" - if self.request.query - else "" - ), - ), - carrier=self.request, - ), - ) - ), - send, - recv, - ) - ) - - async def on_message(self, message: str | bytes) -> None: - await self._message_queue.put( - message if isinstance(message, str) else message.decode() - ) - - def on_close(self) -> None: - if not self._dispatch_future.done(): - self._dispatch_future.cancel() - - -# The interface for WSGIContainer.environ changed in Tornado version 6.3 from -# a staticmethod to an instance method. Since we're not that concerned with -# the details of the WSGI app itself, we can just use a fake one. -# see: https://github.com/tornadoweb/tornado/pull/3231#issuecomment-1518957578 -_FAKE_WSGI_CONTAINER = WSGIContainer(lambda *a, **kw: iter([])) diff --git a/src/py/reactpy/reactpy/backend/types.py b/src/py/reactpy/reactpy/backend/types.py deleted file mode 100644 index fbc4addc0..000000000 --- a/src/py/reactpy/reactpy/backend/types.py +++ /dev/null @@ -1,76 +0,0 @@ -from __future__ import annotations - -import asyncio -from collections.abc import MutableMapping -from dataclasses import dataclass -from typing import Any, Callable, Generic, Protocol, TypeVar, runtime_checkable - -from reactpy.core.types import RootComponentConstructor - -_App = TypeVar("_App") - - -@runtime_checkable -class BackendImplementation(Protocol[_App]): - """Common interface for built-in web server/framework integrations""" - - Options: Callable[..., Any] - """A constructor for options passed to :meth:`BackendImplementation.configure`""" - - def configure( - self, - app: _App, - component: RootComponentConstructor, - options: Any | None = None, - ) -> None: - """Configure the given app instance to display the given component""" - - def create_development_app(self) -> _App: - """Create an application instance for development purposes""" - - async def serve_development_app( - self, - app: _App, - host: str, - port: int, - started: asyncio.Event | None = None, - ) -> None: - """Run an application using a development server""" - - -_Carrier = TypeVar("_Carrier") - - -@dataclass -class Connection(Generic[_Carrier]): - """Represents a connection with a client""" - - scope: MutableMapping[str, Any] - """An ASGI scope or WSGI environment dictionary""" - - location: Location - """The current location (URL)""" - - carrier: _Carrier - """How the connection is mediated. For example, a request or websocket. - - This typically depends on the backend implementation. - """ - - -@dataclass -class Location: - """Represents the current location (URL) - - Analogous to, but not necessarily identical to, the client-side - ``document.location`` object. - """ - - pathname: str - """the path of the URL for the location""" - - search: str - """A search or query string - a '?' followed by the parameters of the URL. - - If there are no search parameters this should be an empty string - """ diff --git a/src/py/reactpy/reactpy/backend/utils.py b/src/py/reactpy/reactpy/backend/utils.py deleted file mode 100644 index 3d9be13a4..000000000 --- a/src/py/reactpy/reactpy/backend/utils.py +++ /dev/null @@ -1,98 +0,0 @@ -from __future__ import annotations - -import asyncio -import logging -import socket -from collections.abc import Iterator -from contextlib import closing -from importlib import import_module -from typing import Any - -from reactpy.backend.types import BackendImplementation -from reactpy.types import RootComponentConstructor - -logger = logging.getLogger(__name__) - -SUPPORTED_PACKAGES = ( - "starlette", - "fastapi", - "sanic", - "tornado", - "flask", -) - - -def run( - component: RootComponentConstructor, - host: str = "127.0.0.1", - port: int | None = None, - implementation: BackendImplementation[Any] | None = None, -) -> None: - """Run a component with a development server""" - logger.warning(_DEVELOPMENT_RUN_FUNC_WARNING) - - implementation = implementation or import_module("reactpy.backend.default") - - app = implementation.create_development_app() - implementation.configure(app, component) - - host = host - port = port or find_available_port(host) - - app_cls = type(app) - logger.info( - f"Running with {app_cls.__module__}.{app_cls.__name__} at http://{host}:{port}" - ) - - asyncio.run(implementation.serve_development_app(app, host, port)) - - -def find_available_port( - host: str, - port_min: int = 8000, - port_max: int = 9000, - allow_reuse_waiting_ports: bool = True, -) -> int: - """Get a port that's available for the given host and port range""" - for port in range(port_min, port_max): - with closing(socket.socket()) as sock: - try: - if allow_reuse_waiting_ports: - # As per this answer: https://stackoverflow.com/a/19247688/3159288 - # setting can be somewhat unreliable because we allow the use of - # ports that are stuck in TIME_WAIT. However, not setting the option - # means we're overly cautious and almost always use a different addr - # even if it could have actually been used. - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - sock.bind((host, port)) - except OSError: - pass - else: - return port - msg = f"Host {host!r} has no available port in range {port_max}-{port_max}" - raise RuntimeError(msg) - - -def all_implementations() -> Iterator[BackendImplementation[Any]]: - """Yield all available server implementations""" - for name in SUPPORTED_PACKAGES: - try: - relative_import_name = f"{__name__.rsplit('.', 1)[0]}.{name}" - module = import_module(relative_import_name) - except ImportError: # nocov - logger.debug(f"Failed to import {name!r}", exc_info=True) - continue - - if not isinstance(module, BackendImplementation): # nocov - msg = f"{module.__name__!r} is an invalid implementation" - raise TypeError(msg) - - yield module - - -_DEVELOPMENT_RUN_FUNC_WARNING = f"""\ -The `run()` function is only intended for testing during development! To run in \ -production, consider selecting a supported backend and importing its associated \ -`configure()` function from `reactpy.backend.<package>` where `<package>` is one of \ -{list(SUPPORTED_PACKAGES)}. For details refer to the docs on how to run each package.\ -""" diff --git a/src/py/reactpy/reactpy/config.py b/src/py/reactpy/reactpy/config.py deleted file mode 100644 index 6dc29096c..000000000 --- a/src/py/reactpy/reactpy/config.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -ReactPy provides a series of configuration options that can be set using environment -variables or, for those which allow it, a programmatic interface. -""" - -from pathlib import Path -from tempfile import TemporaryDirectory - -from reactpy._option import Option as _Option - -REACTPY_DEBUG_MODE = _Option( - "REACTPY_DEBUG_MODE", - default=False, - validator=lambda x: bool(int(x)), -) -"""This immutable option turns on/off debug mode - -The string values ``1`` and ``0`` are mapped to ``True`` and ``False`` respectively. - -When debug is on, extra validation measures are applied that negatively impact -performance but can be used to catch bugs during development. Additionally, the default -log level for ReactPy is set to ``DEBUG``. -""" - -REACTPY_CHECK_VDOM_SPEC = _Option( - "REACTPY_CHECK_VDOM_SPEC", - default=REACTPY_DEBUG_MODE, - validator=lambda x: bool(int(x)), -) -"""This immutable option turns on/off checks which ensure VDOM is rendered to spec - -The string values ``1`` and ``0`` are mapped to ``True`` and ``False`` respectively. - -By default this check is off. When ``REACTPY_DEBUG_MODE=1`` this will be turned on but can -be manually disablled by setting ``REACTPY_CHECK_VDOM_SPEC=0`` in addition. - -For more info on the VDOM spec, see here: :ref:`VDOM JSON Schema` -""" - -# Because these web modules will be linked dynamically at runtime this can be temporary -_DEFAULT_WEB_MODULES_DIR = TemporaryDirectory() - -REACTPY_WEB_MODULES_DIR = _Option( - "REACTPY_WEB_MODULES_DIR", - default=Path(_DEFAULT_WEB_MODULES_DIR.name), - validator=Path, -) -"""The location ReactPy will use to store its client application - -This directory **MUST** be treated as a black box. Downstream applications **MUST NOT** -assume anything about the structure of this directory see :mod:`reactpy.web.module` for a -set of publicly available APIs for working with the client. -""" - -REACTPY_TESTING_DEFAULT_TIMEOUT = _Option( - "REACTPY_TESTING_DEFAULT_TIMEOUT", - 5.0, - mutable=False, - validator=float, -) -"""A default timeout for testing utilities in ReactPy""" diff --git a/src/py/reactpy/reactpy/core/__init__.py b/src/py/reactpy/reactpy/core/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/py/reactpy/reactpy/core/_f_back.py b/src/py/reactpy/reactpy/core/_f_back.py deleted file mode 100644 index fe1a6c10c..000000000 --- a/src/py/reactpy/reactpy/core/_f_back.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import annotations - -import inspect -from types import FrameType - - -def f_module_name(index: int = 0) -> str: - frame = f_back(index + 1) - if frame is None: - return "" # nocov - name = frame.f_globals.get("__name__", "") - if not isinstance(name, str): - raise TypeError("Expected module name to be a string") # nocov - return name - - -def f_back(index: int = 0) -> FrameType | None: - frame = inspect.currentframe() - while frame is not None: - if index < 0: - return frame - frame = frame.f_back - index -= 1 - return None # nocov diff --git a/src/py/reactpy/reactpy/core/_thread_local.py b/src/py/reactpy/reactpy/core/_thread_local.py deleted file mode 100644 index b3d6a14b0..000000000 --- a/src/py/reactpy/reactpy/core/_thread_local.py +++ /dev/null @@ -1,21 +0,0 @@ -from threading import Thread, current_thread -from typing import Callable, Generic, TypeVar -from weakref import WeakKeyDictionary - -_StateType = TypeVar("_StateType") - - -class ThreadLocal(Generic[_StateType]): - """Utility for managing per-thread state information""" - - def __init__(self, default: Callable[[], _StateType]): - self._default = default - self._state: WeakKeyDictionary[Thread, _StateType] = WeakKeyDictionary() - - def get(self) -> _StateType: - thread = current_thread() - if thread not in self._state: - state = self._state[thread] = self._default() - else: - state = self._state[thread] - return state diff --git a/src/py/reactpy/reactpy/core/component.py b/src/py/reactpy/reactpy/core/component.py deleted file mode 100644 index f825aac71..000000000 --- a/src/py/reactpy/reactpy/core/component.py +++ /dev/null @@ -1,66 +0,0 @@ -from __future__ import annotations - -import inspect -from functools import wraps -from typing import Any, Callable - -from reactpy.core.types import ComponentType, VdomDict - - -def component( - function: Callable[..., ComponentType | VdomDict | str | None] -) -> Callable[..., Component]: - """A decorator for defining a new component. - - Parameters: - function: The component's :meth:`reactpy.core.proto.ComponentType.render` function. - """ - sig = inspect.signature(function) - - if "key" in sig.parameters and sig.parameters["key"].kind in ( - inspect.Parameter.KEYWORD_ONLY, - inspect.Parameter.POSITIONAL_OR_KEYWORD, - ): - msg = f"Component render function {function} uses reserved parameter 'key'" - raise TypeError(msg) - - @wraps(function) - def constructor(*args: Any, key: Any | None = None, **kwargs: Any) -> Component: - return Component(function, key, args, kwargs, sig) - - return constructor - - -class Component: - """An object for rending component models.""" - - __slots__ = "__weakref__", "_func", "_args", "_kwargs", "_sig", "key", "type" - - def __init__( - self, - function: Callable[..., ComponentType | VdomDict | str | None], - key: Any | None, - args: tuple[Any, ...], - kwargs: dict[str, Any], - sig: inspect.Signature, - ) -> None: - self.key = key - self.type = function - self._args = args - self._kwargs = kwargs - self._sig = sig - - def render(self) -> ComponentType | VdomDict | str | None: - return self.type(*self._args, **self._kwargs) - - def __repr__(self) -> str: - try: - args = self._sig.bind(*self._args, **self._kwargs).arguments - except TypeError: - return f"{self.type.__name__}(...)" - else: - items = ", ".join(f"{k}={v!r}" for k, v in args.items()) - if items: - return f"{self.type.__name__}({id(self):02x}, {items})" - else: - return f"{self.type.__name__}({id(self):02x})" diff --git a/src/py/reactpy/reactpy/core/events.py b/src/py/reactpy/reactpy/core/events.py deleted file mode 100644 index acc2077b2..000000000 --- a/src/py/reactpy/reactpy/core/events.py +++ /dev/null @@ -1,220 +0,0 @@ -from __future__ import annotations - -import asyncio -from collections.abc import Sequence -from typing import Any, Callable, Literal, overload - -from anyio import create_task_group - -from reactpy.core.types import EventHandlerFunc, EventHandlerType - - -@overload -def event( - function: Callable[..., Any], - *, - stop_propagation: bool = ..., - prevent_default: bool = ..., -) -> EventHandler: - ... - - -@overload -def event( - function: Literal[None] = None, - *, - stop_propagation: bool = ..., - prevent_default: bool = ..., -) -> Callable[[Callable[..., Any]], EventHandler]: - ... - - -def event( - function: Callable[..., Any] | None = None, - *, - stop_propagation: bool = False, - prevent_default: bool = False, -) -> EventHandler | Callable[[Callable[..., Any]], EventHandler]: - """A decorator for constructing an :class:`EventHandler`. - - While you're always free to add callbacks by assigning them to an element's attributes - - .. code-block:: python - - element = reactpy.html.button({"onClick": my_callback}) - - You may want the ability to prevent the default action associated with the event - from taking place, or stopping the event from propagating up the DOM. This decorator - allows you to add that functionality to your callbacks. - - .. code-block:: python - - @event(stop_propagation=True, prevent_default=True) - def my_callback(*data): - ... - - element = reactpy.html.button({"onClick": my_callback}) - - Parameters: - function: - A function or coroutine responsible for handling the event. - stop_propagation: - Block the event from propagating further up the DOM. - prevent_default: - Stops the default actional associate with the event from taking place. - """ - - def setup(function: Callable[..., Any]) -> EventHandler: - return EventHandler( - to_event_handler_function(function, positional_args=True), - stop_propagation, - prevent_default, - ) - - if function is not None: - return setup(function) - else: - return setup - - -class EventHandler: - """Turn a function or coroutine into an event handler - - Parameters: - function: - The function or coroutine which handles the event. - stop_propagation: - Block the event from propagating further up the DOM. - prevent_default: - Stops the default action associate with the event from taking place. - target: - A unique identifier for this event handler (auto-generated by default) - """ - - __slots__ = ( - "__weakref__", - "function", - "prevent_default", - "stop_propagation", - "target", - ) - - def __init__( - self, - function: EventHandlerFunc, - stop_propagation: bool = False, - prevent_default: bool = False, - target: str | None = None, - ) -> None: - self.function = to_event_handler_function(function, positional_args=False) - self.prevent_default = prevent_default - self.stop_propagation = stop_propagation - self.target = target - - def __eq__(self, other: Any) -> bool: - undefined = object() - for attr in ( - "function", - "prevent_default", - "stop_propagation", - "target", - ): - if not attr.startswith("_"): - if not getattr(other, attr, undefined) == getattr(self, attr): - return False - return True - - def __repr__(self) -> str: - public_names = [name for name in self.__slots__ if not name.startswith("_")] - items = ", ".join([f"{n}={getattr(self, n)!r}" for n in public_names]) - return f"{type(self).__name__}({items})" - - -def to_event_handler_function( - function: Callable[..., Any], - positional_args: bool = True, -) -> EventHandlerFunc: - """Make a :data:`~reactpy.core.proto.EventHandlerFunc` from a function or coroutine - - Parameters: - function: - A function or coroutine accepting a number of positional arguments. - positional_args: - Whether to pass the event parameters a positional args or as a list. - """ - if positional_args: - if asyncio.iscoroutinefunction(function): - - async def wrapper(data: Sequence[Any]) -> None: - await function(*data) - - else: - - async def wrapper(data: Sequence[Any]) -> None: - function(*data) - - return wrapper - elif not asyncio.iscoroutinefunction(function): - - async def wrapper(data: Sequence[Any]) -> None: - function(data) - - return wrapper - else: - return function - - -def merge_event_handlers( - event_handlers: Sequence[EventHandlerType], -) -> EventHandlerType: - """Merge multiple event handlers into one - - Raises a ValueError if any handlers have conflicting - :attr:`~reactpy.core.proto.EventHandlerType.stop_propagation` or - :attr:`~reactpy.core.proto.EventHandlerType.prevent_default` attributes. - """ - if not event_handlers: - msg = "No event handlers to merge" - raise ValueError(msg) - elif len(event_handlers) == 1: - return event_handlers[0] - - first_handler = event_handlers[0] - - stop_propagation = first_handler.stop_propagation - prevent_default = first_handler.prevent_default - target = first_handler.target - - for handler in event_handlers: - if ( - handler.stop_propagation != stop_propagation - or handler.prevent_default != prevent_default - or handler.target != target - ): - msg = "Cannot merge handlers - 'stop_propagation', 'prevent_default' or 'target' mismatch." - raise ValueError(msg) - - return EventHandler( - merge_event_handler_funcs([h.function for h in event_handlers]), - stop_propagation, - prevent_default, - target, - ) - - -def merge_event_handler_funcs( - functions: Sequence[EventHandlerFunc], -) -> EventHandlerFunc: - """Make one event handler function from many""" - if not functions: - msg = "No event handler functions to merge" - raise ValueError(msg) - elif len(functions) == 1: - return functions[0] - - async def await_all_event_handlers(data: Sequence[Any]) -> None: - async with create_task_group() as group: - for func in functions: - group.start_soon(func, data) - - return await_all_event_handlers diff --git a/src/py/reactpy/reactpy/core/hooks.py b/src/py/reactpy/reactpy/core/hooks.py deleted file mode 100644 index a8334458b..000000000 --- a/src/py/reactpy/reactpy/core/hooks.py +++ /dev/null @@ -1,750 +0,0 @@ -from __future__ import annotations - -import asyncio -from collections.abc import Awaitable, Sequence -from logging import getLogger -from types import FunctionType -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Generic, - NewType, - Protocol, - TypeVar, - cast, - overload, -) - -from typing_extensions import TypeAlias - -from reactpy.config import REACTPY_DEBUG_MODE -from reactpy.core._thread_local import ThreadLocal -from reactpy.core.types import ComponentType, Key, State, VdomDict -from reactpy.utils import Ref - -if not TYPE_CHECKING: - # make flake8 think that this variable exists - ellipsis = type(...) - - -__all__ = [ - "use_state", - "use_effect", - "use_reducer", - "use_callback", - "use_ref", - "use_memo", -] - -logger = getLogger(__name__) - -_Type = TypeVar("_Type") - - -@overload -def use_state(initial_value: Callable[[], _Type]) -> State[_Type]: - ... - - -@overload -def use_state(initial_value: _Type) -> State[_Type]: - ... - - -def use_state(initial_value: _Type | Callable[[], _Type]) -> State[_Type]: - """See the full :ref:`Use State` docs for details - - Parameters: - initial_value: - Defines the initial value of the state. A callable (accepting no arguments) - can be used as a constructor function to avoid re-creating the initial value - on each render. - - Returns: - A tuple containing the current state and a function to update it. - """ - current_state = _use_const(lambda: _CurrentState(initial_value)) - return State(current_state.value, current_state.dispatch) - - -class _CurrentState(Generic[_Type]): - __slots__ = "value", "dispatch" - - def __init__( - self, - initial_value: _Type | Callable[[], _Type], - ) -> None: - if callable(initial_value): - self.value = initial_value() - else: - self.value = initial_value - - hook = current_hook() - - def dispatch(new: _Type | Callable[[_Type], _Type]) -> None: - if callable(new): - next_value = new(self.value) - else: - next_value = new - if not strictly_equal(next_value, self.value): - self.value = next_value - hook.schedule_render() - - self.dispatch = dispatch - - -_EffectCleanFunc: TypeAlias = "Callable[[], None]" -_SyncEffectFunc: TypeAlias = "Callable[[], _EffectCleanFunc | None]" -_AsyncEffectFunc: TypeAlias = "Callable[[], Awaitable[_EffectCleanFunc | None]]" -_EffectApplyFunc: TypeAlias = "_SyncEffectFunc | _AsyncEffectFunc" - - -@overload -def use_effect( - function: None = None, - dependencies: Sequence[Any] | ellipsis | None = ..., -) -> Callable[[_EffectApplyFunc], None]: - ... - - -@overload -def use_effect( - function: _EffectApplyFunc, - dependencies: Sequence[Any] | ellipsis | None = ..., -) -> None: - ... - - -def use_effect( - function: _EffectApplyFunc | None = None, - dependencies: Sequence[Any] | ellipsis | None = ..., -) -> Callable[[_EffectApplyFunc], None] | None: - """See the full :ref:`Use Effect` docs for details - - Parameters: - function: - Applies the effect and can return a clean-up function - dependencies: - Dependencies for the effect. The effect will only trigger if the identity - of any value in the given sequence changes (i.e. their :func:`id` is - different). By default these are inferred based on local variables that are - referenced by the given function. - - Returns: - If not function is provided, a decorator. Otherwise ``None``. - """ - hook = current_hook() - - dependencies = _try_to_infer_closure_values(function, dependencies) - memoize = use_memo(dependencies=dependencies) - last_clean_callback: Ref[_EffectCleanFunc | None] = use_ref(None) - - def add_effect(function: _EffectApplyFunc) -> None: - if not asyncio.iscoroutinefunction(function): - sync_function = cast(_SyncEffectFunc, function) - else: - async_function = cast(_AsyncEffectFunc, function) - - def sync_function() -> _EffectCleanFunc | None: - future = asyncio.ensure_future(async_function()) - - def clean_future() -> None: - if not future.cancel(): - clean = future.result() - if clean is not None: - clean() - - return clean_future - - def effect() -> None: - if last_clean_callback.current is not None: - last_clean_callback.current() - - clean = last_clean_callback.current = sync_function() - if clean is not None: - hook.add_effect(COMPONENT_WILL_UNMOUNT_EFFECT, clean) - - return memoize(lambda: hook.add_effect(LAYOUT_DID_RENDER_EFFECT, effect)) - - if function is not None: - add_effect(function) - return None - else: - return add_effect - - -def use_debug_value( - message: Any | Callable[[], Any], - dependencies: Sequence[Any] | ellipsis | None = ..., -) -> None: - """Log debug information when the given message changes. - - .. note:: - This hook only logs if :data:`~reactpy.config.REACTPY_DEBUG_MODE` is active. - - Unlike other hooks, a message is considered to have changed if the old and new - values are ``!=``. Because this comparison is performed on every render of the - component, it may be worth considering the performance cost in some situations. - - Parameters: - message: - The value to log or a memoized function for generating the value. - dependencies: - Dependencies for the memoized function. The message will only be recomputed - if the identity of any value in the given sequence changes (i.e. their - :func:`id` is different). By default these are inferred based on local - variables that are referenced by the given function. - """ - old: Ref[Any] = _use_const(lambda: Ref(object())) - memo_func = message if callable(message) else lambda: message - new = use_memo(memo_func, dependencies) - - if REACTPY_DEBUG_MODE.current and old.current != new: - old.current = new - logger.debug(f"{current_hook().component} {new}") - - -def create_context(default_value: _Type) -> Context[_Type]: - """Return a new context type for use in :func:`use_context`""" - - def context( - *children: Any, - value: _Type = default_value, - key: Key | None = None, - ) -> ContextProvider[_Type]: - return ContextProvider( - *children, - value=value, - key=key, - type=context, - ) - - context.__qualname__ = "context" - - return context - - -class Context(Protocol[_Type]): - """Returns a :class:`ContextProvider` component""" - - def __call__( - self, - *children: Any, - value: _Type = ..., - key: Key | None = ..., - ) -> ContextProvider[_Type]: - ... - - -def use_context(context: Context[_Type]) -> _Type: - """Get the current value for the given context type. - - See the full :ref:`Use Context` docs for more information. - """ - hook = current_hook() - provider = hook.get_context_provider(context) - - if provider is None: - # same assertions but with normal exceptions - if not isinstance(context, FunctionType): - raise TypeError(f"{context} is not a Context") # nocov - if context.__kwdefaults__ is None: - raise TypeError(f"{context} has no 'value' kwarg") # nocov - if "value" not in context.__kwdefaults__: - raise TypeError(f"{context} has no 'value' kwarg") # nocov - return cast(_Type, context.__kwdefaults__["value"]) - - return provider._value - - -class ContextProvider(Generic[_Type]): - def __init__( - self, - *children: Any, - value: _Type, - key: Key | None, - type: Context[_Type], - ) -> None: - self.children = children - self.key = key - self.type = type - self._value = value - - def render(self) -> VdomDict: - current_hook().set_context_provider(self) - return {"tagName": "", "children": self.children} - - def __repr__(self) -> str: - return f"{type(self).__name__}({self.type})" - - -_ActionType = TypeVar("_ActionType") - - -def use_reducer( - reducer: Callable[[_Type, _ActionType], _Type], - initial_value: _Type, -) -> tuple[_Type, Callable[[_ActionType], None]]: - """See the full :ref:`Use Reducer` docs for details - - Parameters: - reducer: - A function which applies an action to the current state in order to - produce the next state. - initial_value: - The initial state value (same as for :func:`use_state`) - - Returns: - A tuple containing the current state and a function to change it with an action - """ - state, set_state = use_state(initial_value) - return state, _use_const(lambda: _create_dispatcher(reducer, set_state)) - - -def _create_dispatcher( - reducer: Callable[[_Type, _ActionType], _Type], - set_state: Callable[[Callable[[_Type], _Type]], None], -) -> Callable[[_ActionType], None]: - def dispatch(action: _ActionType) -> None: - set_state(lambda last_state: reducer(last_state, action)) - - return dispatch - - -_CallbackFunc = TypeVar("_CallbackFunc", bound=Callable[..., Any]) - - -@overload -def use_callback( - function: None = None, - dependencies: Sequence[Any] | ellipsis | None = ..., -) -> Callable[[_CallbackFunc], _CallbackFunc]: - ... - - -@overload -def use_callback( - function: _CallbackFunc, - dependencies: Sequence[Any] | ellipsis | None = ..., -) -> _CallbackFunc: - ... - - -def use_callback( - function: _CallbackFunc | None = None, - dependencies: Sequence[Any] | ellipsis | None = ..., -) -> _CallbackFunc | Callable[[_CallbackFunc], _CallbackFunc]: - """See the full :ref:`Use Callback` docs for details - - Parameters: - function: - The function whose identity will be preserved - dependencies: - Dependencies of the callback. The identity the ``function`` will be updated - if the identity of any value in the given sequence changes (i.e. their - :func:`id` is different). By default these are inferred based on local - variables that are referenced by the given function. - - Returns: - The current function - """ - dependencies = _try_to_infer_closure_values(function, dependencies) - memoize = use_memo(dependencies=dependencies) - - def setup(function: _CallbackFunc) -> _CallbackFunc: - return memoize(lambda: function) - - if function is not None: - return setup(function) - else: - return setup - - -class _LambdaCaller(Protocol): - """MyPy doesn't know how to deal with TypeVars only used in function return""" - - def __call__(self, func: Callable[[], _Type]) -> _Type: - ... - - -@overload -def use_memo( - function: None = None, - dependencies: Sequence[Any] | ellipsis | None = ..., -) -> _LambdaCaller: - ... - - -@overload -def use_memo( - function: Callable[[], _Type], - dependencies: Sequence[Any] | ellipsis | None = ..., -) -> _Type: - ... - - -def use_memo( - function: Callable[[], _Type] | None = None, - dependencies: Sequence[Any] | ellipsis | None = ..., -) -> _Type | Callable[[Callable[[], _Type]], _Type]: - """See the full :ref:`Use Memo` docs for details - - Parameters: - function: - The function to be memoized. - dependencies: - Dependencies for the memoized function. The memo will only be recomputed if - the identity of any value in the given sequence changes (i.e. their - :func:`id` is different). By default these are inferred based on local - variables that are referenced by the given function. - - Returns: - The current state - """ - dependencies = _try_to_infer_closure_values(function, dependencies) - - memo: _Memo[_Type] = _use_const(_Memo) - - if memo.empty(): - # we need to initialize on the first run - changed = True - memo.deps = () if dependencies is None else dependencies - elif dependencies is None: - changed = True - memo.deps = () - elif ( - len(memo.deps) != len(dependencies) - # if deps are same length check identity for each item - or not all( - strictly_equal(current, new) - for current, new in zip(memo.deps, dependencies) - ) - ): - memo.deps = dependencies - changed = True - else: - changed = False - - setup: Callable[[Callable[[], _Type]], _Type] - - if changed: - - def setup(function: Callable[[], _Type]) -> _Type: - current_value = memo.value = function() - return current_value - - else: - - def setup(function: Callable[[], _Type]) -> _Type: - return memo.value - - if function is not None: - return setup(function) - else: - return setup - - -class _Memo(Generic[_Type]): - """Simple object for storing memoization data""" - - __slots__ = "value", "deps" - - value: _Type - deps: Sequence[Any] - - def empty(self) -> bool: - try: - self.value # noqa: B018 - except AttributeError: - return True - else: - return False - - -def use_ref(initial_value: _Type) -> Ref[_Type]: - """See the full :ref:`Use State` docs for details - - Parameters: - initial_value: The value initially assigned to the reference. - - Returns: - A :class:`Ref` object. - """ - return _use_const(lambda: Ref(initial_value)) - - -def _use_const(function: Callable[[], _Type]) -> _Type: - return current_hook().use_state(function) - - -def _try_to_infer_closure_values( - func: Callable[..., Any] | None, - values: Sequence[Any] | ellipsis | None, -) -> Sequence[Any] | None: - if values is ...: - if isinstance(func, FunctionType): - return ( - [cell.cell_contents for cell in func.__closure__] - if func.__closure__ - else [] - ) - else: - return None - else: - return values - - -def current_hook() -> LifeCycleHook: - """Get the current :class:`LifeCycleHook`""" - hook_stack = _hook_stack.get() - if not hook_stack: - msg = "No life cycle hook is active. Are you rendering in a layout?" - raise RuntimeError(msg) - return hook_stack[-1] - - -_hook_stack: ThreadLocal[list[LifeCycleHook]] = ThreadLocal(list) - - -EffectType = NewType("EffectType", str) -"""Used in :meth:`LifeCycleHook.add_effect` to indicate what effect should be saved""" - -COMPONENT_DID_RENDER_EFFECT = EffectType("COMPONENT_DID_RENDER") -"""An effect that will be triggered each time a component renders""" - -LAYOUT_DID_RENDER_EFFECT = EffectType("LAYOUT_DID_RENDER") -"""An effect that will be triggered each time a layout renders""" - -COMPONENT_WILL_UNMOUNT_EFFECT = EffectType("COMPONENT_WILL_UNMOUNT") -"""An effect that will be triggered just before the component is unmounted""" - - -class LifeCycleHook: - """Defines the life cycle of a layout component. - - Components can request access to their own life cycle events and state through hooks - while :class:`~reactpy.core.proto.LayoutType` objects drive drive the life cycle - forward by triggering events and rendering view changes. - - Example: - - If removed from the complexities of a layout, a very simplified full life cycle - for a single component with no child components would look a bit like this: - - .. testcode:: - - from reactpy.core.hooks import ( - current_hook, - LifeCycleHook, - COMPONENT_DID_RENDER_EFFECT, - ) - - - # this function will come from a layout implementation - schedule_render = lambda: ... - - # --- start life cycle --- - - hook = LifeCycleHook(schedule_render) - - # --- start render cycle --- - - hook.affect_component_will_render(...) - - hook.set_current() - - try: - # render the component - ... - - # the component may access the current hook - assert current_hook() is hook - - # and save state or add effects - current_hook().use_state(lambda: ...) - current_hook().add_effect(COMPONENT_DID_RENDER_EFFECT, lambda: ...) - finally: - hook.unset_current() - - hook.affect_component_did_render() - - # This should only be called after the full set of changes associated with a - # given render have been completed. - hook.affect_layout_did_render() - - # Typically an event occurs and a new render is scheduled, thus beginning - # the render cycle anew. - hook.schedule_render() - - - # --- end render cycle --- - - hook.affect_component_will_unmount() - del hook - - # --- end render cycle --- - """ - - __slots__ = ( - "__weakref__", - "_context_providers", - "_current_state_index", - "_event_effects", - "_is_rendering", - "_rendered_atleast_once", - "_schedule_render_callback", - "_schedule_render_later", - "_state", - "component", - ) - - component: ComponentType - - def __init__( - self, - schedule_render: Callable[[], None], - ) -> None: - self._context_providers: dict[Context[Any], ContextProvider[Any]] = {} - self._schedule_render_callback = schedule_render - self._schedule_render_later = False - self._is_rendering = False - self._rendered_atleast_once = False - self._current_state_index = 0 - self._state: tuple[Any, ...] = () - self._event_effects: dict[EffectType, list[Callable[[], None]]] = { - COMPONENT_DID_RENDER_EFFECT: [], - LAYOUT_DID_RENDER_EFFECT: [], - COMPONENT_WILL_UNMOUNT_EFFECT: [], - } - - def schedule_render(self) -> None: - if self._is_rendering: - self._schedule_render_later = True - else: - self._schedule_render() - - def use_state(self, function: Callable[[], _Type]) -> _Type: - if not self._rendered_atleast_once: - # since we're not initialized yet we're just appending state - result = function() - self._state += (result,) - else: - # once finalized we iterate over each succesively used piece of state - result = self._state[self._current_state_index] - self._current_state_index += 1 - return result - - def add_effect(self, effect_type: EffectType, function: Callable[[], None]) -> None: - """Trigger a function on the occurrence of the given effect type""" - self._event_effects[effect_type].append(function) - - def set_context_provider(self, provider: ContextProvider[Any]) -> None: - self._context_providers[provider.type] = provider - - def get_context_provider( - self, context: Context[_Type] - ) -> ContextProvider[_Type] | None: - return self._context_providers.get(context) - - def affect_component_will_render(self, component: ComponentType) -> None: - """The component is about to render""" - self.component = component - - self._is_rendering = True - self._event_effects[COMPONENT_WILL_UNMOUNT_EFFECT].clear() - - def affect_component_did_render(self) -> None: - """The component completed a render""" - del self.component - - component_did_render_effects = self._event_effects[COMPONENT_DID_RENDER_EFFECT] - for effect in component_did_render_effects: - try: - effect() - except Exception: - logger.exception(f"Component post-render effect {effect} failed") - component_did_render_effects.clear() - - self._is_rendering = False - self._rendered_atleast_once = True - self._current_state_index = 0 - - def affect_layout_did_render(self) -> None: - """The layout completed a render""" - layout_did_render_effects = self._event_effects[LAYOUT_DID_RENDER_EFFECT] - for effect in layout_did_render_effects: - try: - effect() - except Exception: - logger.exception(f"Layout post-render effect {effect} failed") - layout_did_render_effects.clear() - - if self._schedule_render_later: - self._schedule_render() - self._schedule_render_later = False - - def affect_component_will_unmount(self) -> None: - """The component is about to be removed from the layout""" - will_unmount_effects = self._event_effects[COMPONENT_WILL_UNMOUNT_EFFECT] - for effect in will_unmount_effects: - try: - effect() - except Exception: - logger.exception(f"Pre-unmount effect {effect} failed") - will_unmount_effects.clear() - - def set_current(self) -> None: - """Set this hook as the active hook in this thread - - This method is called by a layout before entering the render method - of this hook's associated component. - """ - hook_stack = _hook_stack.get() - if hook_stack: - parent = hook_stack[-1] - self._context_providers.update(parent._context_providers) - hook_stack.append(self) - - def unset_current(self) -> None: - """Unset this hook as the active hook in this thread""" - if _hook_stack.get().pop() is not self: - raise RuntimeError("Hook stack is in an invalid state") # nocov - - def _schedule_render(self) -> None: - try: - self._schedule_render_callback() - except Exception: - logger.exception( - f"Failed to schedule render via {self._schedule_render_callback}" - ) - - -def strictly_equal(x: Any, y: Any) -> bool: - """Check if two values are identical or, for a limited set or types, equal. - - Only the following types are checked for equality rather than identity: - - - ``int`` - - ``float`` - - ``complex`` - - ``str`` - - ``bytes`` - - ``bytearray`` - - ``memoryview`` - """ - return x is y or (type(x) in _NUMERIC_TEXT_BINARY_TYPES and x == y) - - -_NUMERIC_TEXT_BINARY_TYPES = { - # numeric - int, - float, - complex, - # text - str, - # binary types - bytes, - bytearray, - memoryview, -} diff --git a/src/py/reactpy/reactpy/core/layout.py b/src/py/reactpy/reactpy/core/layout.py deleted file mode 100644 index 7c24e5ef7..000000000 --- a/src/py/reactpy/reactpy/core/layout.py +++ /dev/null @@ -1,698 +0,0 @@ -from __future__ import annotations - -import abc -import asyncio -from collections import Counter -from collections.abc import Iterator -from contextlib import ExitStack -from logging import getLogger -from typing import ( - Any, - Callable, - Generic, - NamedTuple, - NewType, - TypeVar, - cast, -) -from uuid import uuid4 -from weakref import ref as weakref - -from reactpy.config import REACTPY_CHECK_VDOM_SPEC, REACTPY_DEBUG_MODE -from reactpy.core.hooks import LifeCycleHook -from reactpy.core.types import ( - ComponentType, - EventHandlerDict, - LayoutEventMessage, - LayoutUpdateMessage, - VdomDict, - VdomJson, -) -from reactpy.core.vdom import validate_vdom_json -from reactpy.utils import Ref - -logger = getLogger(__name__) - - -class Layout: - """Responsible for "rendering" components. That is, turning them into VDOM.""" - - __slots__ = [ - "root", - "_event_handlers", - "_rendering_queue", - "_root_life_cycle_state_id", - "_model_states_by_life_cycle_state_id", - ] - - if not hasattr(abc.ABC, "__weakref__"): # nocov - __slots__.append("__weakref__") - - def __init__(self, root: ComponentType) -> None: - super().__init__() - if not isinstance(root, ComponentType): - msg = f"Expected a ComponentType, not {type(root)!r}." - raise TypeError(msg) - self.root = root - - async def __aenter__(self) -> Layout: - # create attributes here to avoid access before entering context manager - self._event_handlers: EventHandlerDict = {} - - self._rendering_queue: _ThreadSafeQueue[_LifeCycleStateId] = _ThreadSafeQueue() - root_model_state = _new_root_model_state(self.root, self._rendering_queue.put) - - self._root_life_cycle_state_id = root_id = root_model_state.life_cycle_state.id - self._rendering_queue.put(root_id) - - self._model_states_by_life_cycle_state_id = {root_id: root_model_state} - - return self - - async def __aexit__(self, *exc: Any) -> None: - root_csid = self._root_life_cycle_state_id - root_model_state = self._model_states_by_life_cycle_state_id[root_csid] - self._unmount_model_states([root_model_state]) - - # delete attributes here to avoid access after exiting context manager - del self._event_handlers - del self._rendering_queue - del self._root_life_cycle_state_id - del self._model_states_by_life_cycle_state_id - - async def deliver(self, event: LayoutEventMessage) -> None: - """Dispatch an event to the targeted handler""" - # It is possible for an element in the frontend to produce an event - # associated with a backend model that has been deleted. We only handle - # events if the element and the handler exist in the backend. Otherwise - # we just ignore the event. - handler = self._event_handlers.get(event["target"]) - - if handler is not None: - try: - await handler.function(event["data"]) - except Exception: - logger.exception(f"Failed to execute event handler {handler}") - else: - logger.info( - f"Ignored event - handler {event['target']!r} " - "does not exist or its component unmounted" - ) - - async def render(self) -> LayoutUpdateMessage: - """Await the next available render. This will block until a component is updated""" - while True: - model_state_id = await self._rendering_queue.get() - try: - model_state = self._model_states_by_life_cycle_state_id[model_state_id] - except KeyError: - logger.debug( - "Did not render component with model state ID " - f"{model_state_id!r} - component already unmounted" - ) - else: - update = self._create_layout_update(model_state) - if REACTPY_CHECK_VDOM_SPEC.current: - root_id = self._root_life_cycle_state_id - root_model = self._model_states_by_life_cycle_state_id[root_id] - validate_vdom_json(root_model.model.current) - return update - - def _create_layout_update(self, old_state: _ModelState) -> LayoutUpdateMessage: - new_state = _copy_component_model_state(old_state) - component = new_state.life_cycle_state.component - - with ExitStack() as exit_stack: - self._render_component(exit_stack, old_state, new_state, component) - - return { - "type": "layout-update", - "path": new_state.patch_path, - "model": new_state.model.current, - } - - def _render_component( - self, - exit_stack: ExitStack, - old_state: _ModelState | None, - new_state: _ModelState, - component: ComponentType, - ) -> None: - life_cycle_state = new_state.life_cycle_state - life_cycle_hook = life_cycle_state.hook - - self._model_states_by_life_cycle_state_id[life_cycle_state.id] = new_state - - life_cycle_hook.affect_component_will_render(component) - exit_stack.callback(life_cycle_hook.affect_layout_did_render) - life_cycle_hook.set_current() - try: - raw_model = component.render() - # wrap the model in a fragment (i.e. tagName="") to ensure components have - # a separate node in the model state tree. This could be removed if this - # components are given a node in the tree some other way - wrapper_model: VdomDict = {"tagName": ""} - if raw_model is not None: - wrapper_model["children"] = [raw_model] - self._render_model(exit_stack, old_state, new_state, wrapper_model) - except Exception as error: - logger.exception(f"Failed to render {component}") - new_state.model.current = { - "tagName": "", - "error": ( - f"{type(error).__name__}: {error}" - if REACTPY_DEBUG_MODE.current - else "" - ), - } - finally: - life_cycle_hook.unset_current() - life_cycle_hook.affect_component_did_render() - - try: - parent = new_state.parent - except AttributeError: - pass # only happens for root component - else: - key, index = new_state.key, new_state.index - parent.children_by_key[key] = new_state - # need to add this model to parent's children without mutating parent model - old_parent_model = parent.model.current - old_parent_children = old_parent_model["children"] - parent.model.current = { - **old_parent_model, # type: ignore[misc] - "children": [ - *old_parent_children[:index], - new_state.model.current, - *old_parent_children[index + 1 :], - ], - } - - def _render_model( - self, - exit_stack: ExitStack, - old_state: _ModelState | None, - new_state: _ModelState, - raw_model: Any, - ) -> None: - try: - new_state.model.current = {"tagName": raw_model["tagName"]} - except Exception as e: # nocov - msg = f"Expected a VDOM element dict, not {raw_model}" - raise ValueError(msg) from e - if "key" in raw_model: - new_state.key = new_state.model.current["key"] = raw_model["key"] - if "importSource" in raw_model: - new_state.model.current["importSource"] = raw_model["importSource"] - self._render_model_attributes(old_state, new_state, raw_model) - self._render_model_children( - exit_stack, old_state, new_state, raw_model.get("children", []) - ) - - def _render_model_attributes( - self, - old_state: _ModelState | None, - new_state: _ModelState, - raw_model: dict[str, Any], - ) -> None: - # extract event handlers from 'eventHandlers' and 'attributes' - handlers_by_event: EventHandlerDict = raw_model.get("eventHandlers", {}) - - if "attributes" in raw_model: - attrs = raw_model["attributes"].copy() - new_state.model.current["attributes"] = attrs - - if old_state is None: - self._render_model_event_handlers_without_old_state( - new_state, handlers_by_event - ) - return None - - for old_event in set(old_state.targets_by_event).difference(handlers_by_event): - old_target = old_state.targets_by_event[old_event] - del self._event_handlers[old_target] - - if not handlers_by_event: - return None - - model_event_handlers = new_state.model.current["eventHandlers"] = {} - for event, handler in handlers_by_event.items(): - if event in old_state.targets_by_event: - target = old_state.targets_by_event[event] - else: - target = uuid4().hex if handler.target is None else handler.target - new_state.targets_by_event[event] = target - self._event_handlers[target] = handler - model_event_handlers[event] = { - "target": target, - "preventDefault": handler.prevent_default, - "stopPropagation": handler.stop_propagation, - } - - return None - - def _render_model_event_handlers_without_old_state( - self, - new_state: _ModelState, - handlers_by_event: EventHandlerDict, - ) -> None: - if not handlers_by_event: - return None - - model_event_handlers = new_state.model.current["eventHandlers"] = {} - for event, handler in handlers_by_event.items(): - target = uuid4().hex if handler.target is None else handler.target - new_state.targets_by_event[event] = target - self._event_handlers[target] = handler - model_event_handlers[event] = { - "target": target, - "preventDefault": handler.prevent_default, - "stopPropagation": handler.stop_propagation, - } - - return None - - def _render_model_children( - self, - exit_stack: ExitStack, - old_state: _ModelState | None, - new_state: _ModelState, - raw_children: Any, - ) -> None: - if not isinstance(raw_children, (list, tuple)): - raw_children = [raw_children] - - if old_state is None: - if raw_children: - self._render_model_children_without_old_state( - exit_stack, new_state, raw_children - ) - return None - elif not raw_children: - self._unmount_model_states(list(old_state.children_by_key.values())) - return None - - child_type_key_tuples = list(_process_child_type_and_key(raw_children)) - - new_keys = {item[2] for item in child_type_key_tuples} - if len(new_keys) != len(raw_children): - key_counter = Counter(item[2] for item in child_type_key_tuples) - duplicate_keys = [key for key, count in key_counter.items() if count > 1] - msg = f"Duplicate keys {duplicate_keys} at {new_state.patch_path or '/'!r}" - raise ValueError(msg) - - old_keys = set(old_state.children_by_key).difference(new_keys) - if old_keys: - self._unmount_model_states( - [old_state.children_by_key[key] for key in old_keys] - ) - - new_state.model.current["children"] = [] - for index, (child, child_type, key) in enumerate(child_type_key_tuples): - old_child_state = old_state.children_by_key.get(key) - if child_type is _DICT_TYPE: - old_child_state = old_state.children_by_key.get(key) - if old_child_state is None: - new_child_state = _make_element_model_state( - new_state, - index, - key, - ) - elif old_child_state.is_component_state: - self._unmount_model_states([old_child_state]) - new_child_state = _make_element_model_state( - new_state, - index, - key, - ) - old_child_state = None - else: - new_child_state = _update_element_model_state( - old_child_state, - new_state, - index, - ) - self._render_model(exit_stack, old_child_state, new_child_state, child) - new_state.append_child(new_child_state.model.current) - new_state.children_by_key[key] = new_child_state - elif child_type is _COMPONENT_TYPE: - child = cast(ComponentType, child) - old_child_state = old_state.children_by_key.get(key) - if old_child_state is None: - new_child_state = _make_component_model_state( - new_state, - index, - key, - child, - self._rendering_queue.put, - ) - elif old_child_state.is_component_state and ( - old_child_state.life_cycle_state.component.type != child.type - ): - self._unmount_model_states([old_child_state]) - old_child_state = None - new_child_state = _make_component_model_state( - new_state, - index, - key, - child, - self._rendering_queue.put, - ) - else: - new_child_state = _update_component_model_state( - old_child_state, - new_state, - index, - child, - self._rendering_queue.put, - ) - self._render_component( - exit_stack, old_child_state, new_child_state, child - ) - else: - old_child_state = old_state.children_by_key.get(key) - if old_child_state is not None: - self._unmount_model_states([old_child_state]) - new_state.append_child(child) - - def _render_model_children_without_old_state( - self, - exit_stack: ExitStack, - new_state: _ModelState, - raw_children: list[Any], - ) -> None: - child_type_key_tuples = list(_process_child_type_and_key(raw_children)) - - new_keys = {item[2] for item in child_type_key_tuples} - if len(new_keys) != len(raw_children): - key_counter = Counter(item[2] for item in child_type_key_tuples) - duplicate_keys = [key for key, count in key_counter.items() if count > 1] - msg = f"Duplicate keys {duplicate_keys} at {new_state.patch_path or '/'!r}" - raise ValueError(msg) - - new_state.model.current["children"] = [] - for index, (child, child_type, key) in enumerate(child_type_key_tuples): - if child_type is _DICT_TYPE: - child_state = _make_element_model_state(new_state, index, key) - self._render_model(exit_stack, None, child_state, child) - new_state.append_child(child_state.model.current) - new_state.children_by_key[key] = child_state - elif child_type is _COMPONENT_TYPE: - child_state = _make_component_model_state( - new_state, index, key, child, self._rendering_queue.put - ) - self._render_component(exit_stack, None, child_state, child) - else: - new_state.append_child(child) - - def _unmount_model_states(self, old_states: list[_ModelState]) -> None: - to_unmount = old_states[::-1] # unmount in reversed order of rendering - while to_unmount: - model_state = to_unmount.pop() - - for target in model_state.targets_by_event.values(): - del self._event_handlers[target] - - if model_state.is_component_state: - life_cycle_state = model_state.life_cycle_state - del self._model_states_by_life_cycle_state_id[life_cycle_state.id] - life_cycle_state.hook.affect_component_will_unmount() - - to_unmount.extend(model_state.children_by_key.values()) - - def __repr__(self) -> str: - return f"{type(self).__name__}({self.root})" - - -def _new_root_model_state( - component: ComponentType, schedule_render: Callable[[_LifeCycleStateId], None] -) -> _ModelState: - return _ModelState( - parent=None, - index=-1, - key=None, - model=Ref(), - patch_path="", - children_by_key={}, - targets_by_event={}, - life_cycle_state=_make_life_cycle_state(component, schedule_render), - ) - - -def _make_component_model_state( - parent: _ModelState, - index: int, - key: Any, - component: ComponentType, - schedule_render: Callable[[_LifeCycleStateId], None], -) -> _ModelState: - return _ModelState( - parent=parent, - index=index, - key=key, - model=Ref(), - patch_path=f"{parent.patch_path}/children/{index}", - children_by_key={}, - targets_by_event={}, - life_cycle_state=_make_life_cycle_state(component, schedule_render), - ) - - -def _copy_component_model_state(old_model_state: _ModelState) -> _ModelState: - # use try/except here because not having a parent is rare (only the root state) - try: - parent: _ModelState | None = old_model_state.parent - except AttributeError: - parent = None - - return _ModelState( - parent=parent, - index=old_model_state.index, - key=old_model_state.key, - model=Ref(), # does not copy the model - patch_path=old_model_state.patch_path, - children_by_key={}, - targets_by_event={}, - life_cycle_state=old_model_state.life_cycle_state, - ) - - -def _update_component_model_state( - old_model_state: _ModelState, - new_parent: _ModelState, - new_index: int, - new_component: ComponentType, - schedule_render: Callable[[_LifeCycleStateId], None], -) -> _ModelState: - return _ModelState( - parent=new_parent, - index=new_index, - key=old_model_state.key, - model=Ref(), # does not copy the model - patch_path=old_model_state.patch_path, - children_by_key={}, - targets_by_event={}, - life_cycle_state=( - _update_life_cycle_state(old_model_state.life_cycle_state, new_component) - if old_model_state.is_component_state - else _make_life_cycle_state(new_component, schedule_render) - ), - ) - - -def _make_element_model_state( - parent: _ModelState, - index: int, - key: Any, -) -> _ModelState: - return _ModelState( - parent=parent, - index=index, - key=key, - model=Ref(), - patch_path=f"{parent.patch_path}/children/{index}", - children_by_key={}, - targets_by_event={}, - ) - - -def _update_element_model_state( - old_model_state: _ModelState, - new_parent: _ModelState, - new_index: int, -) -> _ModelState: - return _ModelState( - parent=new_parent, - index=new_index, - key=old_model_state.key, - model=Ref(), # does not copy the model - patch_path=old_model_state.patch_path, - children_by_key={}, - targets_by_event={}, - ) - - -class _ModelState: - """State that is bound to a particular element within the layout""" - - __slots__ = ( - "__weakref__", - "_parent_ref", - "children_by_key", - "index", - "key", - "life_cycle_state", - "model", - "patch_path", - "targets_by_event", - ) - - def __init__( - self, - parent: _ModelState | None, - index: int, - key: Any, - model: Ref[VdomJson], - patch_path: str, - children_by_key: dict[str, _ModelState], - targets_by_event: dict[str, str], - life_cycle_state: _LifeCycleState | None = None, - ): - self.index = index - """The index of the element amongst its siblings""" - - self.key = key - """A key that uniquely identifies the element amongst its siblings""" - - self.model = model - """The actual model of the element""" - - self.patch_path = patch_path - """A "/" delimited path to the element within the greater layout""" - - self.children_by_key = children_by_key - """Child model states indexed by their unique keys""" - - self.targets_by_event = targets_by_event - """The element's event handler target strings indexed by their event name""" - - # === Conditionally Available Attributes === - # It's easier to conditionally assign than to force a null check on every usage - - if parent is not None: - self._parent_ref = weakref(parent) - """The parent model state""" - - if life_cycle_state is not None: - self.life_cycle_state = life_cycle_state - """The state for the element's component (if it has one)""" - - @property - def is_component_state(self) -> bool: - return hasattr(self, "life_cycle_state") - - @property - def parent(self) -> _ModelState: - parent = self._parent_ref() - if parent is None: - raise RuntimeError("detached model state") # nocov - return parent - - def append_child(self, child: Any) -> None: - self.model.current["children"].append(child) - - def __repr__(self) -> str: # nocov - return f"ModelState({ {s: getattr(self, s, None) for s in self.__slots__} })" - - -def _make_life_cycle_state( - component: ComponentType, - schedule_render: Callable[[_LifeCycleStateId], None], -) -> _LifeCycleState: - life_cycle_state_id = _LifeCycleStateId(uuid4().hex) - return _LifeCycleState( - life_cycle_state_id, - LifeCycleHook(lambda: schedule_render(life_cycle_state_id)), - component, - ) - - -def _update_life_cycle_state( - old_life_cycle_state: _LifeCycleState, - new_component: ComponentType, -) -> _LifeCycleState: - return _LifeCycleState( - old_life_cycle_state.id, - # the hook is preserved across renders because it holds the state - old_life_cycle_state.hook, - new_component, - ) - - -_LifeCycleStateId = NewType("_LifeCycleStateId", str) - - -class _LifeCycleState(NamedTuple): - """Component state for :class:`_ModelState`""" - - id: _LifeCycleStateId - """A unique identifier used in the :class:`~reactpy.core.hooks.LifeCycleHook` callback""" - - hook: LifeCycleHook - """The life cycle hook""" - - component: ComponentType - """The current component instance""" - - -_Type = TypeVar("_Type") - - -class _ThreadSafeQueue(Generic[_Type]): - __slots__ = "_loop", "_queue", "_pending" - - def __init__(self) -> None: - self._loop = asyncio.get_running_loop() - self._queue: asyncio.Queue[_Type] = asyncio.Queue() - self._pending: set[_Type] = set() - - def put(self, value: _Type) -> None: - if value not in self._pending: - self._pending.add(value) - self._loop.call_soon_threadsafe(self._queue.put_nowait, value) - - async def get(self) -> _Type: - while True: - value = await self._queue.get() - if value in self._pending: - break - self._pending.remove(value) - return value - - -def _process_child_type_and_key( - children: list[Any], -) -> Iterator[tuple[Any, _ElementType, Any]]: - for index, child in enumerate(children): - if isinstance(child, dict): - child_type = _DICT_TYPE - key = child.get("key") - elif isinstance(child, ComponentType): - child_type = _COMPONENT_TYPE - key = getattr(child, "key", None) - else: - child = f"{child}" - child_type = _STRING_TYPE - key = None - - if key is None: - key = index - - yield (child, child_type, key) - - -# used in _process_child_type_and_key -_ElementType = NewType("_ElementType", int) -_DICT_TYPE = _ElementType(1) -_COMPONENT_TYPE = _ElementType(2) -_STRING_TYPE = _ElementType(3) diff --git a/src/py/reactpy/reactpy/core/serve.py b/src/py/reactpy/reactpy/core/serve.py deleted file mode 100644 index 61a7e4ce6..000000000 --- a/src/py/reactpy/reactpy/core/serve.py +++ /dev/null @@ -1,63 +0,0 @@ -from __future__ import annotations - -from collections.abc import Awaitable -from logging import getLogger -from typing import Callable - -from anyio import create_task_group -from anyio.abc import TaskGroup - -from reactpy.core.types import LayoutEventMessage, LayoutType, LayoutUpdateMessage - -logger = getLogger(__name__) - - -SendCoroutine = Callable[[LayoutUpdateMessage], Awaitable[None]] -"""Send model patches given by a dispatcher""" - -RecvCoroutine = Callable[[], Awaitable[LayoutEventMessage]] -"""Called by a dispatcher to return a :class:`reactpy.core.layout.LayoutEventMessage` - -The event will then trigger an :class:`reactpy.core.proto.EventHandlerType` in a layout. -""" - - -class Stop(BaseException): - """Stop serving changes and events - - Raising this error will tell dispatchers to gracefully exit. Typically this is - called by code running inside a layout to tell it to stop rendering. - """ - - -async def serve_layout( - layout: LayoutType[LayoutUpdateMessage, LayoutEventMessage], - send: SendCoroutine, - recv: RecvCoroutine, -) -> None: - """Run a dispatch loop for a single view instance""" - async with layout: - try: - async with create_task_group() as task_group: - task_group.start_soon(_single_outgoing_loop, layout, send) - task_group.start_soon(_single_incoming_loop, task_group, layout, recv) - except Stop: - logger.info(f"Stopped serving {layout}") - - -async def _single_outgoing_loop( - layout: LayoutType[LayoutUpdateMessage, LayoutEventMessage], send: SendCoroutine -) -> None: - while True: - await send(await layout.render()) - - -async def _single_incoming_loop( - task_group: TaskGroup, - layout: LayoutType[LayoutUpdateMessage, LayoutEventMessage], - recv: RecvCoroutine, -) -> None: - while True: - # We need to fire and forget here so that we avoid waiting on the completion - # of this event handler before receiving and running the next one. - task_group.start_soon(layout.deliver, await recv()) diff --git a/src/py/reactpy/reactpy/core/types.py b/src/py/reactpy/reactpy/core/types.py deleted file mode 100644 index 45f300f4f..000000000 --- a/src/py/reactpy/reactpy/core/types.py +++ /dev/null @@ -1,235 +0,0 @@ -from __future__ import annotations - -import sys -from collections import namedtuple -from collections.abc import Mapping, Sequence -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Generic, - Literal, - NamedTuple, - Protocol, - TypeVar, - overload, - runtime_checkable, -) - -from typing_extensions import TypeAlias, TypedDict - -_Type = TypeVar("_Type") - - -if TYPE_CHECKING or sys.version_info < (3, 9) or sys.version_info >= (3, 11): - - class State(NamedTuple, Generic[_Type]): - value: _Type - set_value: Callable[[_Type | Callable[[_Type], _Type]], None] - -else: # nocov - State = namedtuple("State", ("value", "set_value")) - - -ComponentConstructor = Callable[..., "ComponentType"] -"""Simple function returning a new component""" - -RootComponentConstructor = Callable[[], "ComponentType"] -"""The root component should be constructed by a function accepting no arguments.""" - - -Key: TypeAlias = "str | int" - - -_OwnType = TypeVar("_OwnType") - - -@runtime_checkable -class ComponentType(Protocol): - """The expected interface for all component-like objects""" - - key: Key | None - """An identifier which is unique amongst a component's immediate siblings""" - - type: Any - """The function or class defining the behavior of this component - - This is used to see if two component instances share the same definition. - """ - - def render(self) -> VdomDict | ComponentType | str | None: - """Render the component's view model.""" - - -_Render = TypeVar("_Render", covariant=True) -_Event = TypeVar("_Event", contravariant=True) - - -@runtime_checkable -class LayoutType(Protocol[_Render, _Event]): - """Renders and delivers, updates to views and events to handlers, respectively""" - - async def render(self) -> _Render: - """Render an update to a view""" - - async def deliver(self, event: _Event) -> None: - """Relay an event to its respective handler""" - - async def __aenter__(self) -> LayoutType[_Render, _Event]: - """Prepare the layout for its first render""" - - async def __aexit__( - self, - exc_type: type[Exception], - exc_value: Exception, - traceback: TracebackType, - ) -> bool | None: - """Clean up the view after its final render""" - - -VdomAttributes = Mapping[str, Any] -"""Describes the attributes of a :class:`VdomDict`""" - -VdomChild: TypeAlias = "ComponentType | VdomDict | str" -"""A single child element of a :class:`VdomDict`""" - -VdomChildren: TypeAlias = "Sequence[VdomChild] | VdomChild" -"""Describes a series of :class:`VdomChild` elements""" - - -class _VdomDictOptional(TypedDict, total=False): - key: Key | None - children: Sequence[ - # recursive types are not allowed yet: - # https://github.com/python/mypy/issues/731 - ComponentType - | dict[str, Any] - | str - | Any - ] - attributes: VdomAttributes - eventHandlers: EventHandlerDict - importSource: ImportSourceDict - - -class _VdomDictRequired(TypedDict, total=True): - tagName: str - - -class VdomDict(_VdomDictRequired, _VdomDictOptional): - """A :ref:`VDOM` dictionary""" - - -class ImportSourceDict(TypedDict): - source: str - fallback: Any - sourceType: str - unmountBeforeUpdate: bool - - -class _OptionalVdomJson(TypedDict, total=False): - key: Key - error: str - children: list[Any] - attributes: dict[str, Any] - eventHandlers: dict[str, _JsonEventTarget] - importSource: _JsonImportSource - - -class _RequiredVdomJson(TypedDict, total=True): - tagName: str - - -class VdomJson(_RequiredVdomJson, _OptionalVdomJson): - """A JSON serializable form of :class:`VdomDict` matching the :data:`VDOM_JSON_SCHEMA`""" - - -class _JsonEventTarget(TypedDict): - target: str - preventDefault: bool - stopPropagation: bool - - -class _JsonImportSource(TypedDict): - source: str - fallback: Any - - -EventHandlerMapping = Mapping[str, "EventHandlerType"] -"""A generic mapping between event names to their handlers""" - -EventHandlerDict: TypeAlias = "dict[str, EventHandlerType]" -"""A dict mapping between event names to their handlers""" - - -class EventHandlerFunc(Protocol): - """A coroutine which can handle event data""" - - async def __call__(self, data: Sequence[Any]) -> None: - ... - - -@runtime_checkable -class EventHandlerType(Protocol): - """Defines a handler for some event""" - - prevent_default: bool - """Whether to block the event from propagating further up the DOM""" - - stop_propagation: bool - """Stops the default action associate with the event from taking place.""" - - function: EventHandlerFunc - """A coroutine which can respond to an event and its data""" - - target: str | None - """Typically left as ``None`` except when a static target is useful. - - When testing, it may be useful to specify a static target ID so events can be - triggered programmatically. - - .. note:: - - When ``None``, it is left to a :class:`LayoutType` to auto generate a unique ID. - """ - - -class VdomDictConstructor(Protocol): - """Standard function for constructing a :class:`VdomDict`""" - - @overload - def __call__(self, attributes: VdomAttributes, *children: VdomChildren) -> VdomDict: - ... - - @overload - def __call__(self, *children: VdomChildren) -> VdomDict: - ... - - @overload - def __call__( - self, *attributes_and_children: VdomAttributes | VdomChildren - ) -> VdomDict: - ... - - -class LayoutUpdateMessage(TypedDict): - """A message describing an update to a layout""" - - type: Literal["layout-update"] - """The type of message""" - path: str - """JSON Pointer path to the model element being updated""" - model: VdomJson - """The model to assign at the given JSON Pointer path""" - - -class LayoutEventMessage(TypedDict): - """Message describing an event originating from an element in the layout""" - - type: Literal["layout-event"] - """The type of message""" - target: str - """The ID of the event handler.""" - data: Sequence[Any] - """A list of event data passed to the event handler.""" diff --git a/src/py/reactpy/reactpy/core/vdom.py b/src/py/reactpy/reactpy/core/vdom.py deleted file mode 100644 index 0548c6afc..000000000 --- a/src/py/reactpy/reactpy/core/vdom.py +++ /dev/null @@ -1,355 +0,0 @@ -from __future__ import annotations - -import logging -from collections.abc import Mapping, Sequence -from functools import wraps -from typing import Any, Protocol, cast, overload - -from fastjsonschema import compile as compile_json_schema - -from reactpy._warnings import warn -from reactpy.config import REACTPY_DEBUG_MODE -from reactpy.core._f_back import f_module_name -from reactpy.core.events import EventHandler, to_event_handler_function -from reactpy.core.types import ( - ComponentType, - EventHandlerDict, - EventHandlerType, - ImportSourceDict, - Key, - VdomAttributes, - VdomChild, - VdomChildren, - VdomDict, - VdomDictConstructor, - VdomJson, -) - -logger = logging.getLogger() - - -VDOM_JSON_SCHEMA = { - "$schema": "http://json-schema.org/draft-07/schema", - "$ref": "#/definitions/element", - "definitions": { - "element": { - "type": "object", - "properties": { - "tagName": {"type": "string"}, - "key": {"type": ["string", "number", "null"]}, - "error": {"type": "string"}, - "children": {"$ref": "#/definitions/elementChildren"}, - "attributes": {"type": "object"}, - "eventHandlers": {"$ref": "#/definitions/elementEventHandlers"}, - "importSource": {"$ref": "#/definitions/importSource"}, - }, - # The 'tagName' is required because its presence is a useful indicator of - # whether a dictionary describes a VDOM model or not. - "required": ["tagName"], - "dependentSchemas": { - # When 'error' is given, the 'tagName' should be empty. - "error": {"properties": {"tagName": {"maxLength": 0}}} - }, - }, - "elementChildren": { - "type": "array", - "items": {"$ref": "#/definitions/elementOrString"}, - }, - "elementEventHandlers": { - "type": "object", - "patternProperties": { - ".*": {"$ref": "#/definitions/eventHandler"}, - }, - }, - "eventHandler": { - "type": "object", - "properties": { - "target": {"type": "string"}, - "preventDefault": {"type": "boolean"}, - "stopPropagation": {"type": "boolean"}, - }, - "required": ["target"], - }, - "importSource": { - "type": "object", - "properties": { - "source": {"type": "string"}, - "sourceType": {"enum": ["URL", "NAME"]}, - "fallback": { - "type": ["object", "string", "null"], - "if": {"not": {"type": "null"}}, - "then": {"$ref": "#/definitions/elementOrString"}, - }, - "unmountBeforeUpdate": {"type": "boolean"}, - }, - "required": ["source"], - }, - "elementOrString": { - "type": ["object", "string"], - "if": {"type": "object"}, - "then": {"$ref": "#/definitions/element"}, - }, - }, -} -"""JSON Schema describing serialized VDOM - see :ref:`VDOM` for more info""" - - -# we can't add a docstring to this because Sphinx doesn't know how to find its source -_COMPILED_VDOM_VALIDATOR = compile_json_schema(VDOM_JSON_SCHEMA) - - -def validate_vdom_json(value: Any) -> VdomJson: - """Validate serialized VDOM - see :attr:`VDOM_JSON_SCHEMA` for more info""" - _COMPILED_VDOM_VALIDATOR(value) - return cast(VdomJson, value) - - -def is_vdom(value: Any) -> bool: - """Return whether a value is a :class:`VdomDict` - - This employs a very simple heuristic - something is VDOM if: - - 1. It is a ``dict`` instance - 2. It contains the key ``"tagName"`` - 3. The value of the key ``"tagName"`` is a string - - .. note:: - - Performing an ``isinstance(value, VdomDict)`` check is too restrictive since the - user would be forced to import ``VdomDict`` every time they needed to declare a - VDOM element. Giving the user more flexibility, at the cost of this check's - accuracy, is worth it. - """ - return ( - isinstance(value, dict) - and "tagName" in value - and isinstance(value["tagName"], str) - ) - - -@overload -def vdom(tag: str, *children: VdomChildren) -> VdomDict: - ... - - -@overload -def vdom(tag: str, attributes: VdomAttributes, *children: VdomChildren) -> VdomDict: - ... - - -def vdom( - tag: str, - *attributes_and_children: Any, - **kwargs: Any, -) -> VdomDict: - """A helper function for creating VDOM elements. - - Parameters: - tag: - The type of element (e.g. 'div', 'h1', 'img') - attributes_and_children: - An optional attribute mapping followed by any number of children or - iterables of children. The attribute mapping **must** precede the children, - or children which will be merged into their respective parts of the model. - key: - A string indicating the identity of a particular element. This is significant - to preserve event handlers across updates - without a key, a re-render would - cause these handlers to be deleted, but with a key, they would be redirected - to any newly defined handlers. - event_handlers: - Maps event types to coroutines that are responsible for handling those events. - import_source: - (subject to change) specifies javascript that, when evaluated returns a - React component. - """ - if kwargs: # nocov - if "key" in kwargs: - if attributes_and_children: - maybe_attributes, *children = attributes_and_children - if _is_attributes(maybe_attributes): - attributes_and_children = ( - {**maybe_attributes, "key": kwargs.pop("key")}, - *children, - ) - else: - attributes_and_children = ( - {"key": kwargs.pop("key")}, - maybe_attributes, - *children, - ) - else: - attributes_and_children = ({"key": kwargs.pop("key")},) - warn( - "An element's 'key' must be declared in an attribute dict instead " - "of as a keyword argument. This will error in a future version.", - DeprecationWarning, - ) - - if kwargs: - msg = f"Extra keyword arguments {kwargs}" - raise ValueError(msg) - - model: VdomDict = {"tagName": tag} - - if not attributes_and_children: - return model - - attributes, children = separate_attributes_and_children(attributes_and_children) - key = attributes.pop("key", None) - attributes, event_handlers = separate_attributes_and_event_handlers(attributes) - - if attributes: - model["attributes"] = attributes - - if children: - model["children"] = children - - if key is not None: - model["key"] = key - - if event_handlers: - model["eventHandlers"] = event_handlers - - return model - - -def make_vdom_constructor( - tag: str, allow_children: bool = True, import_source: ImportSourceDict | None = None -) -> VdomDictConstructor: - """Return a constructor for VDOM dictionaries with the given tag name. - - The resulting callable will have the same interface as :func:`vdom` but without its - first ``tag`` argument. - """ - - def constructor(*attributes_and_children: Any, **kwargs: Any) -> VdomDict: - model = vdom(tag, *attributes_and_children, **kwargs) - if not allow_children and "children" in model: - msg = f"{tag!r} nodes cannot have children." - raise TypeError(msg) - if import_source: - model["importSource"] = import_source - return model - - # replicate common function attributes - constructor.__name__ = tag - constructor.__doc__ = ( - "Return a new " - f"`<{tag}> <https://developer.mozilla.org/en-US/docs/Web/HTML/Element/{tag}>`__ " - "element represented by a :class:`VdomDict`." - ) - - module_name = f_module_name(1) - if module_name: - constructor.__module__ = module_name - constructor.__qualname__ = f"{module_name}.{tag}" - - return cast(VdomDictConstructor, constructor) - - -def custom_vdom_constructor(func: _CustomVdomDictConstructor) -> VdomDictConstructor: - """Cast function to VdomDictConstructor""" - - @wraps(func) - def wrapper(*attributes_and_children: Any) -> VdomDict: - attributes, children = separate_attributes_and_children(attributes_and_children) - key = attributes.pop("key", None) - attributes, event_handlers = separate_attributes_and_event_handlers(attributes) - return func(attributes, children, key, event_handlers) - - return cast(VdomDictConstructor, wrapper) - - -def separate_attributes_and_children( - values: Sequence[Any], -) -> tuple[dict[str, Any], list[Any]]: - if not values: - return {}, [] - - attributes: dict[str, Any] - children_or_iterables: Sequence[Any] - if _is_attributes(values[0]): - attributes, *children_or_iterables = values - else: - attributes = {} - children_or_iterables = values - - children: list[Any] = [] - for child in children_or_iterables: - if _is_single_child(child): - children.append(child) - else: - children.extend(child) - - return attributes, children - - -def separate_attributes_and_event_handlers( - attributes: Mapping[str, Any] -) -> tuple[dict[str, Any], EventHandlerDict]: - separated_attributes = {} - separated_event_handlers: dict[str, EventHandlerType] = {} - - for k, v in attributes.items(): - handler: EventHandlerType - - if callable(v): - handler = EventHandler(to_event_handler_function(v)) - elif ( - # isinstance check on protocols is slow - use function attr pre-check as a - # quick filter before actually performing slow EventHandlerType type check - hasattr(v, "function") - and isinstance(v, EventHandlerType) - ): - handler = v - else: - separated_attributes[k] = v - continue - - separated_event_handlers[k] = handler - - return separated_attributes, dict(separated_event_handlers.items()) - - -def _is_attributes(value: Any) -> bool: - return isinstance(value, Mapping) and "tagName" not in value - - -def _is_single_child(value: Any) -> bool: - if isinstance(value, (str, Mapping)) or not hasattr(value, "__iter__"): - return True - if REACTPY_DEBUG_MODE.current: - _validate_child_key_integrity(value) - return False - - -def _validate_child_key_integrity(value: Any) -> None: - if hasattr(value, "__iter__") and not hasattr(value, "__len__"): - logger.error( - f"Did not verify key-path integrity of children in generator {value} " - "- pass a sequence (i.e. list of finite length) in order to verify" - ) - else: - for child in value: - if isinstance(child, ComponentType) and child.key is None: - logger.error(f"Key not specified for child in list {child}") - elif isinstance(child, Mapping) and "key" not in child: - # remove 'children' to reduce log spam - child_copy = {**child, "children": _EllipsisRepr()} - logger.error(f"Key not specified for child in list {child_copy}") - - -class _CustomVdomDictConstructor(Protocol): - def __call__( - self, - attributes: VdomAttributes, - children: Sequence[VdomChild], - key: Key | None, - event_handlers: EventHandlerDict, - ) -> VdomDict: - ... - - -class _EllipsisRepr: - def __repr__(self) -> str: - return "..." diff --git a/src/py/reactpy/reactpy/future.py b/src/py/reactpy/reactpy/future.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/py/reactpy/reactpy/html.py b/src/py/reactpy/reactpy/html.py deleted file mode 100644 index 22d318639..000000000 --- a/src/py/reactpy/reactpy/html.py +++ /dev/null @@ -1,544 +0,0 @@ -""" - -**Fragment** - -- :func:`_` - -**Document metadata** - -- :func:`base` -- :func:`head` -- :func:`link` -- :func:`meta` -- :func:`style` -- :func:`title` - -**Content sectioning** - -- :func:`address` -- :func:`article` -- :func:`aside` -- :func:`footer` -- :func:`header` -- :func:`h1` -- :func:`h2` -- :func:`h3` -- :func:`h4` -- :func:`h5` -- :func:`h6` -- :func:`main` -- :func:`nav` -- :func:`section` - -**Text content** - -- :func:`blockquote` -- :func:`dd` -- :func:`div` -- :func:`dl` -- :func:`dt` -- :func:`figcaption` -- :func:`figure` -- :func:`hr` -- :func:`li` -- :func:`ol` -- :func:`p` -- :func:`pre` -- :func:`ul` - -**Inline text semantics** - -- :func:`a` -- :func:`abbr` -- :func:`b` -- :func:`bdi` -- :func:`bdo` -- :func:`br` -- :func:`cite` -- :func:`code` -- :func:`data` -- :func:`em` -- :func:`i` -- :func:`kbd` -- :func:`mark` -- :func:`q` -- :func:`rp` -- :func:`rt` -- :func:`ruby` -- :func:`s` -- :func:`samp` -- :func:`small` -- :func:`span` -- :func:`strong` -- :func:`sub` -- :func:`sup` -- :func:`time` -- :func:`u` -- :func:`var` -- :func:`wbr` - -**Image and video** - -- :func:`area` -- :func:`audio` -- :func:`img` -- :func:`map` -- :func:`track` -- :func:`video` - -**Embedded content** - -- :func:`embed` -- :func:`iframe` -- :func:`object` -- :func:`param` -- :func:`picture` -- :func:`portal` -- :func:`source` - -**SVG and MathML** - -- :func:`svg` -- :func:`math` - -**Scripting** - -- :func:`canvas` -- :func:`noscript` -- :func:`script` - -**Demarcating edits** - -- :func:`del_` -- :func:`ins` - -**Table content** - -- :func:`caption` -- :func:`col` -- :func:`colgroup` -- :func:`table` -- :func:`tbody` -- :func:`td` -- :func:`tfoot` -- :func:`th` -- :func:`thead` -- :func:`tr` - -**Forms** - -- :func:`button` -- :func:`fieldset` -- :func:`form` -- :func:`input` -- :func:`label` -- :func:`legend` -- :func:`meter` -- :func:`option` -- :func:`output` -- :func:`progress` -- :func:`select` -- :func:`textarea` - -**Interactive elements** - -- :func:`details` -- :func:`dialog` -- :func:`menu` -- :func:`menuitem` -- :func:`summary` - -**Web components** - -- :func:`slot` -- :func:`template` - -.. autofunction:: _ -""" - -from __future__ import annotations - -from collections.abc import Sequence - -from reactpy.core.types import ( - EventHandlerDict, - Key, - VdomAttributes, - VdomChild, - VdomDict, -) -from reactpy.core.vdom import custom_vdom_constructor, make_vdom_constructor - -__all__ = ( - "_", - "a", - "abbr", - "address", - "area", - "article", - "aside", - "audio", - "b", - "base", - "bdi", - "bdo", - "blockquote", - "br", - "button", - "canvas", - "caption", - "cite", - "code", - "col", - "colgroup", - "data", - "dd", - "del_", - "details", - "dialog", - "div", - "dl", - "dt", - "em", - "embed", - "fieldset", - "figcaption", - "figure", - "footer", - "form", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "head", - "header", - "hr", - "i", - "iframe", - "img", - "input", - "ins", - "kbd", - "label", - "legend", - "li", - "link", - "main", - "map", - "mark", - "math", - "menu", - "menuitem", - "meta", - "meter", - "nav", - "noscript", - "object", - "ol", - "option", - "output", - "p", - "param", - "picture", - "portal", - "pre", - "progress", - "q", - "rp", - "rt", - "ruby", - "s", - "samp", - "script", - "section", - "select", - "slot", - "small", - "source", - "span", - "strong", - "style", - "sub", - "summary", - "sup", - "svg", - "table", - "tbody", - "td", - "template", - "textarea", - "tfoot", - "th", - "thead", - "time", - "title", - "tr", - "track", - "u", - "ul", - "var", - "video", - "wbr", -) - - -def _fragment( - attributes: VdomAttributes, - children: Sequence[VdomChild], - key: Key | None, - event_handlers: EventHandlerDict, -) -> VdomDict: - """An HTML fragment - this element will not appear in the DOM""" - if attributes or event_handlers: - msg = "Fragments cannot have attributes besides 'key'" - raise TypeError(msg) - model: VdomDict = {"tagName": ""} - - if children: - model["children"] = children - - if key is not None: - model["key"] = key - - return model - - -# FIXME: https://github.com/PyCQA/pylint/issues/5784 -_ = custom_vdom_constructor(_fragment) - - -# Document metadata -base = make_vdom_constructor("base") -head = make_vdom_constructor("head") -link = make_vdom_constructor("link") -meta = make_vdom_constructor("meta") -style = make_vdom_constructor("style") -title = make_vdom_constructor("title") - -# Content sectioning -address = make_vdom_constructor("address") -article = make_vdom_constructor("article") -aside = make_vdom_constructor("aside") -footer = make_vdom_constructor("footer") -header = make_vdom_constructor("header") -h1 = make_vdom_constructor("h1") -h2 = make_vdom_constructor("h2") -h3 = make_vdom_constructor("h3") -h4 = make_vdom_constructor("h4") -h5 = make_vdom_constructor("h5") -h6 = make_vdom_constructor("h6") -main = make_vdom_constructor("main") -nav = make_vdom_constructor("nav") -section = make_vdom_constructor("section") - -# Text content -blockquote = make_vdom_constructor("blockquote") -dd = make_vdom_constructor("dd") -div = make_vdom_constructor("div") -dl = make_vdom_constructor("dl") -dt = make_vdom_constructor("dt") -figcaption = make_vdom_constructor("figcaption") -figure = make_vdom_constructor("figure") -hr = make_vdom_constructor("hr", allow_children=False) -li = make_vdom_constructor("li") -ol = make_vdom_constructor("ol") -p = make_vdom_constructor("p") -pre = make_vdom_constructor("pre") -ul = make_vdom_constructor("ul") - -# Inline text semantics -a = make_vdom_constructor("a") -abbr = make_vdom_constructor("abbr") -b = make_vdom_constructor("b") -bdi = make_vdom_constructor("bdi") -bdo = make_vdom_constructor("bdo") -br = make_vdom_constructor("br", allow_children=False) -cite = make_vdom_constructor("cite") -code = make_vdom_constructor("code") -data = make_vdom_constructor("data") -em = make_vdom_constructor("em") -i = make_vdom_constructor("i") -kbd = make_vdom_constructor("kbd") -mark = make_vdom_constructor("mark") -q = make_vdom_constructor("q") -rp = make_vdom_constructor("rp") -rt = make_vdom_constructor("rt") -ruby = make_vdom_constructor("ruby") -s = make_vdom_constructor("s") -samp = make_vdom_constructor("samp") -small = make_vdom_constructor("small") -span = make_vdom_constructor("span") -strong = make_vdom_constructor("strong") -sub = make_vdom_constructor("sub") -sup = make_vdom_constructor("sup") -time = make_vdom_constructor("time") -u = make_vdom_constructor("u") -var = make_vdom_constructor("var") -wbr = make_vdom_constructor("wbr") - -# Image and video -area = make_vdom_constructor("area", allow_children=False) -audio = make_vdom_constructor("audio") -img = make_vdom_constructor("img", allow_children=False) -map = make_vdom_constructor("map") # noqa: A001 -track = make_vdom_constructor("track") -video = make_vdom_constructor("video") - -# Embedded content -embed = make_vdom_constructor("embed", allow_children=False) -iframe = make_vdom_constructor("iframe", allow_children=False) -object = make_vdom_constructor("object") # noqa: A001 -param = make_vdom_constructor("param") -picture = make_vdom_constructor("picture") -portal = make_vdom_constructor("portal", allow_children=False) -source = make_vdom_constructor("source", allow_children=False) - -# SVG and MathML -svg = make_vdom_constructor("svg") -math = make_vdom_constructor("math") - -# Scripting -canvas = make_vdom_constructor("canvas") -noscript = make_vdom_constructor("noscript") - - -def _script( - attributes: VdomAttributes, - children: Sequence[VdomChild], - key: Key | None, - event_handlers: EventHandlerDict, -) -> VdomDict: - """Create a new `<script> <https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script>`__ element. - - .. warning:: - - Be careful to sanitize data from untrusted sources before using it in a script. - See the "Notes" for more details - - This behaves slightly differently than a normal script element in that it may be run - multiple times if its key changes (depending on specific browser behaviors). If no - key is given, the key is inferred to be the content of the script or, lastly its - 'src' attribute if that is given. - - If no attributes are given, the content of the script may evaluate to a function. - This function will be called when the script is initially created or when the - content of the script changes. The function may itself optionally return a teardown - function that is called when the script element is removed from the tree, or when - the script content changes. - - Notes: - Do not use unsanitized data from untrusted sources anywhere in your script. - Doing so may allow for malicious code injection. Consider this **insecure** - code: - - .. code-block:: - - my_script = html.script(f"console.log('{user_bio}');") - - A clever attacker could construct ``user_bio`` such that they could escape the - string and execute arbitrary code to perform cross-site scripting - (`XSS <https://en.wikipedia.org/wiki/Cross-site_scripting>`__`). For example, - what if ``user_bio`` were of the form: - - .. code-block:: text - - '); attackerCodeHere(); (' - - This would allow the following Javascript code to be executed client-side: - - .. code-block:: js - - console.log(''); attackerCodeHere(); (''); - - One way to avoid this could be to escape ``user_bio`` so as to prevent the - injection of Javascript code. For example: - - .. code-block:: python - - import json - my_script = html.script(f"console.log({json.dumps(user_bio)});") - - This would prevent the injection of Javascript code by escaping the ``user_bio`` - string. In this case, the following client-side code would be executed instead: - - .. code-block:: js - - console.log("'); attackerCodeHere(); ('"); - - This is a very simple example, but it illustrates the point that you should - always be careful when using unsanitized data from untrusted sources. - """ - model: VdomDict = {"tagName": "script"} - - if event_handlers: - msg = "'script' elements do not support event handlers" - raise ValueError(msg) - - if children: - if len(children) > 1: - msg = "'script' nodes may have, at most, one child." - raise ValueError(msg) - elif not isinstance(children[0], str): - msg = "The child of a 'script' must be a string." - raise ValueError(msg) - else: - model["children"] = children - if key is None: - key = children[0] - - if attributes: - model["attributes"] = attributes - if key is None and not children and "src" in attributes: - key = attributes["src"] - - if key is not None: - model["key"] = key - - return model - - -# FIXME: https://github.com/PyCQA/pylint/issues/5784 -script = custom_vdom_constructor(_script) - -# Demarcating edits -del_ = make_vdom_constructor("del") -ins = make_vdom_constructor("ins") - -# Table content -caption = make_vdom_constructor("caption") -col = make_vdom_constructor("col") -colgroup = make_vdom_constructor("colgroup") -table = make_vdom_constructor("table") -tbody = make_vdom_constructor("tbody") -td = make_vdom_constructor("td") -tfoot = make_vdom_constructor("tfoot") -th = make_vdom_constructor("th") -thead = make_vdom_constructor("thead") -tr = make_vdom_constructor("tr") - -# Forms -button = make_vdom_constructor("button") -fieldset = make_vdom_constructor("fieldset") -form = make_vdom_constructor("form") -input = make_vdom_constructor("input", allow_children=False) # noqa: A001 -label = make_vdom_constructor("label") -legend = make_vdom_constructor("legend") -meter = make_vdom_constructor("meter") -option = make_vdom_constructor("option") -output = make_vdom_constructor("output") -progress = make_vdom_constructor("progress") -select = make_vdom_constructor("select") -textarea = make_vdom_constructor("textarea") - -# Interactive elements -details = make_vdom_constructor("details") -dialog = make_vdom_constructor("dialog") -menu = make_vdom_constructor("menu") -menuitem = make_vdom_constructor("menuitem") -summary = make_vdom_constructor("summary") - -# Web components -slot = make_vdom_constructor("slot") -template = make_vdom_constructor("template") diff --git a/src/py/reactpy/reactpy/logging.py b/src/py/reactpy/reactpy/logging.py deleted file mode 100644 index f10414cb6..000000000 --- a/src/py/reactpy/reactpy/logging.py +++ /dev/null @@ -1,42 +0,0 @@ -import logging -import sys -from logging.config import dictConfig - -from reactpy.config import REACTPY_DEBUG_MODE - -dictConfig( - { - "version": 1, - "disable_existing_loggers": False, - "loggers": { - "reactpy": {"handlers": ["console"]}, - }, - "handlers": { - "console": { - "class": "logging.StreamHandler", - "formatter": "generic", - "stream": sys.stdout, - } - }, - "formatters": { - "generic": { - "format": "%(asctime)s | %(log_color)s%(levelname)s%(reset)s | %(message)s", - "datefmt": r"%Y-%m-%dT%H:%M:%S%z", - "class": "colorlog.ColoredFormatter", - } - }, - } -) - - -ROOT_LOGGER = logging.getLogger("reactpy") -"""ReactPy's root logger instance""" - - -@REACTPY_DEBUG_MODE.subscribe -def _set_debug_level(debug: bool) -> None: - if debug: - ROOT_LOGGER.setLevel("DEBUG") - ROOT_LOGGER.debug("ReactPy is in debug mode") - else: - ROOT_LOGGER.setLevel("INFO") diff --git a/src/py/reactpy/reactpy/py.typed b/src/py/reactpy/reactpy/py.typed deleted file mode 100644 index 7632ecf77..000000000 --- a/src/py/reactpy/reactpy/py.typed +++ /dev/null @@ -1 +0,0 @@ -# Marker file for PEP 561 diff --git a/src/py/reactpy/reactpy/sample.py b/src/py/reactpy/reactpy/sample.py deleted file mode 100644 index 8509c773d..000000000 --- a/src/py/reactpy/reactpy/sample.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import annotations - -from reactpy import html -from reactpy.core.component import component -from reactpy.core.types import VdomDict - - -@component -def SampleApp() -> VdomDict: - return html.div( - {"id": "sample", "style": {"padding": "15px"}}, - html.h1("Sample Application"), - html.p( - "This is a basic application made with ReactPy. Click ", - html.a( - {"href": "https://pypi.org/project/reactpy/", "target": "_blank"}, - "here", - ), - " to learn more.", - ), - ) diff --git a/src/py/reactpy/reactpy/svg.py b/src/py/reactpy/reactpy/svg.py deleted file mode 100644 index ebfe58ee6..000000000 --- a/src/py/reactpy/reactpy/svg.py +++ /dev/null @@ -1,139 +0,0 @@ -from reactpy.core.vdom import make_vdom_constructor - -__all__ = ( - "a", - "animate", - "animate_motion", - "animate_transform", - "circle", - "clip_path", - "defs", - "desc", - "discard", - "ellipse", - "fe_blend", - "fe_color_matrix", - "fe_component_transfer", - "fe_composite", - "fe_convolve_matrix", - "fe_diffuse_lighting", - "fe_displacement_map", - "fe_distant_light", - "fe_drop_shadow", - "fe_flood", - "fe_func_a", - "fe_func_b", - "fe_func_g", - "fe_func_r", - "fe_gaussian_blur", - "fe_image", - "fe_merge", - "fe_merge_node", - "fe_morphology", - "fe_offset", - "fe_point_light", - "fe_specular_lighting", - "fe_spot_light", - "fe_tile", - "fe_turbulence", - "filter", - "foreign_object", - "g", - "hatch", - "hatchpath", - "image", - "line", - "linear_gradient", - "marker", - "mask", - "metadata", - "mpath", - "path", - "pattern", - "polygon", - "polyline", - "radial_gradient", - "rect", - "script", - "set", - "stop", - "style", - "svg", - "switch", - "symbol", - "text", - "text_path", - "title", - "tspan", - "use", - "view", -) - -a = make_vdom_constructor("a") -animate = make_vdom_constructor("animate", allow_children=False) -animate_motion = make_vdom_constructor("animateMotion", allow_children=False) -animate_transform = make_vdom_constructor("animateTransform", allow_children=False) -circle = make_vdom_constructor("circle", allow_children=False) -clip_path = make_vdom_constructor("clipPath") -defs = make_vdom_constructor("defs") -desc = make_vdom_constructor("desc", allow_children=False) -discard = make_vdom_constructor("discard", allow_children=False) -ellipse = make_vdom_constructor("ellipse", allow_children=False) -fe_blend = make_vdom_constructor("feBlend", allow_children=False) -fe_color_matrix = make_vdom_constructor("feColorMatrix", allow_children=False) -fe_component_transfer = make_vdom_constructor( - "feComponentTransfer", allow_children=False -) -fe_composite = make_vdom_constructor("feComposite", allow_children=False) -fe_convolve_matrix = make_vdom_constructor("feConvolveMatrix", allow_children=False) -fe_diffuse_lighting = make_vdom_constructor("feDiffuseLighting", allow_children=False) -fe_displacement_map = make_vdom_constructor("feDisplacementMap", allow_children=False) -fe_distant_light = make_vdom_constructor("feDistantLight", allow_children=False) -fe_drop_shadow = make_vdom_constructor("feDropShadow", allow_children=False) -fe_flood = make_vdom_constructor("feFlood", allow_children=False) -fe_func_a = make_vdom_constructor("feFuncA", allow_children=False) -fe_func_b = make_vdom_constructor("feFuncB", allow_children=False) -fe_func_g = make_vdom_constructor("feFuncG", allow_children=False) -fe_func_r = make_vdom_constructor("feFuncR", allow_children=False) -fe_gaussian_blur = make_vdom_constructor("feGaussianBlur", allow_children=False) -fe_image = make_vdom_constructor("feImage", allow_children=False) -fe_merge = make_vdom_constructor("feMerge", allow_children=False) -fe_merge_node = make_vdom_constructor("feMergeNode", allow_children=False) -fe_morphology = make_vdom_constructor("feMorphology", allow_children=False) -fe_offset = make_vdom_constructor("feOffset", allow_children=False) -fe_point_light = make_vdom_constructor("fePointLight", allow_children=False) -fe_specular_lighting = make_vdom_constructor("feSpecularLighting", allow_children=False) -fe_spot_light = make_vdom_constructor("feSpotLight", allow_children=False) -fe_tile = make_vdom_constructor("feTile", allow_children=False) -fe_turbulence = make_vdom_constructor("feTurbulence", allow_children=False) -filter = make_vdom_constructor("filter", allow_children=False) # noqa: A001 -foreign_object = make_vdom_constructor("foreignObject", allow_children=False) -g = make_vdom_constructor("g") -hatch = make_vdom_constructor("hatch", allow_children=False) -hatchpath = make_vdom_constructor("hatchpath", allow_children=False) -image = make_vdom_constructor("image", allow_children=False) -line = make_vdom_constructor("line", allow_children=False) -linear_gradient = make_vdom_constructor("linearGradient", allow_children=False) -marker = make_vdom_constructor("marker") -mask = make_vdom_constructor("mask") -metadata = make_vdom_constructor("metadata", allow_children=False) -mpath = make_vdom_constructor("mpath", allow_children=False) -path = make_vdom_constructor("path", allow_children=False) -pattern = make_vdom_constructor("pattern") -polygon = make_vdom_constructor("polygon", allow_children=False) -polyline = make_vdom_constructor("polyline", allow_children=False) -radial_gradient = make_vdom_constructor("radialGradient", allow_children=False) -rect = make_vdom_constructor("rect", allow_children=False) -script = make_vdom_constructor("script", allow_children=False) -set = make_vdom_constructor("set", allow_children=False) # noqa: A001 -stop = make_vdom_constructor("stop", allow_children=False) -style = make_vdom_constructor("style", allow_children=False) -svg = make_vdom_constructor("svg") -switch = make_vdom_constructor("switch") -symbol = make_vdom_constructor("symbol") -text = make_vdom_constructor("text", allow_children=False) -text_path = make_vdom_constructor("textPath", allow_children=False) -title = make_vdom_constructor("title", allow_children=False) -tspan = make_vdom_constructor("tspan", allow_children=False) -use = make_vdom_constructor("use", allow_children=False) -view = make_vdom_constructor("view", allow_children=False) diff --git a/src/py/reactpy/reactpy/testing/__init__.py b/src/py/reactpy/reactpy/testing/__init__.py deleted file mode 100644 index 9f61cec57..000000000 --- a/src/py/reactpy/reactpy/testing/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -from reactpy.testing.backend import BackendFixture -from reactpy.testing.common import ( - HookCatcher, - StaticEventHandler, - clear_reactpy_web_modules_dir, - poll, -) -from reactpy.testing.display import DisplayFixture -from reactpy.testing.logs import ( - LogAssertionError, - assert_reactpy_did_log, - assert_reactpy_did_not_log, - capture_reactpy_logs, -) - -__all__ = [ - "assert_reactpy_did_not_log", - "assert_reactpy_did_log", - "capture_reactpy_logs", - "clear_reactpy_web_modules_dir", - "DisplayFixture", - "HookCatcher", - "LogAssertionError", - "poll", - "BackendFixture", - "StaticEventHandler", -] diff --git a/src/py/reactpy/reactpy/testing/backend.py b/src/py/reactpy/reactpy/testing/backend.py deleted file mode 100644 index 549e16056..000000000 --- a/src/py/reactpy/reactpy/testing/backend.py +++ /dev/null @@ -1,230 +0,0 @@ -from __future__ import annotations - -import asyncio -import logging -from contextlib import AsyncExitStack -from types import TracebackType -from typing import Any, Callable -from urllib.parse import urlencode, urlunparse - -from reactpy.backend import default as default_server -from reactpy.backend.types import BackendImplementation -from reactpy.backend.utils import find_available_port -from reactpy.config import REACTPY_TESTING_DEFAULT_TIMEOUT -from reactpy.core.component import component -from reactpy.core.hooks import use_callback, use_effect, use_state -from reactpy.core.types import ComponentConstructor -from reactpy.testing.logs import ( - LogAssertionError, - capture_reactpy_logs, - list_logged_exceptions, -) -from reactpy.utils import Ref - - -class BackendFixture: - """A test fixture for running a server and imperatively displaying views - - This fixture is typically used alongside async web drivers like ``playwight``. - - Example: - .. code-block:: - - async with BackendFixture() as server: - server.mount(MyComponent) - """ - - _records: list[logging.LogRecord] - _server_future: asyncio.Task[Any] - _exit_stack = AsyncExitStack() - - def __init__( - self, - host: str = "127.0.0.1", - port: int | None = None, - app: Any | None = None, - implementation: BackendImplementation[Any] | None = None, - options: Any | None = None, - timeout: float | None = None, - ) -> None: - self.host = host - self.port = port or find_available_port(host, allow_reuse_waiting_ports=False) - self.mount, self._root_component = _hotswap() - self.timeout = ( - REACTPY_TESTING_DEFAULT_TIMEOUT.current if timeout is None else timeout - ) - - if app is not None: - if implementation is None: - msg = "If an application instance its corresponding server implementation must be provided too." - raise ValueError(msg) - - self._app = app - self.implementation = implementation or default_server - self._options = options - - @property - def log_records(self) -> list[logging.LogRecord]: - """A list of captured log records""" - return self._records - - def url(self, path: str = "", query: Any | None = None) -> str: - """Return a URL string pointing to the host and point of the server - - Args: - path: the path to a resource on the server - query: a dictionary or list of query parameters - """ - return urlunparse( - [ - "http", - f"{self.host}:{self.port}", - path, - "", - urlencode(query or ()), - "", - ] - ) - - def list_logged_exceptions( - self, - pattern: str = "", - types: type[Any] | tuple[type[Any], ...] = Exception, - log_level: int = logging.ERROR, - del_log_records: bool = True, - ) -> list[BaseException]: - """Return a list of logged exception matching the given criteria - - Args: - log_level: The level of log to check - exclude_exc_types: Any exception types to ignore - del_log_records: Whether to delete the log records for yielded exceptions - """ - return list_logged_exceptions( - self.log_records, - pattern, - types, - log_level, - del_log_records, - ) - - async def __aenter__(self) -> BackendFixture: - self._exit_stack = AsyncExitStack() - self._records = self._exit_stack.enter_context(capture_reactpy_logs()) - - app = self._app or self.implementation.create_development_app() - self.implementation.configure(app, self._root_component, self._options) - - started = asyncio.Event() - server_future = asyncio.create_task( - self.implementation.serve_development_app( - app, self.host, self.port, started - ) - ) - - async def stop_server() -> None: - server_future.cancel() - try: - await asyncio.wait_for(server_future, timeout=self.timeout) - except asyncio.CancelledError: - pass - - self._exit_stack.push_async_callback(stop_server) - - try: - await asyncio.wait_for(started.wait(), timeout=self.timeout) - except Exception: # nocov - # see if we can await the future for a more helpful error - await asyncio.wait_for(server_future, timeout=self.timeout) - raise - - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - traceback: TracebackType | None, - ) -> None: - await self._exit_stack.aclose() - - self.mount(None) # reset the view - - logged_errors = self.list_logged_exceptions(del_log_records=False) - if logged_errors: # nocov - msg = "Unexpected logged exception" - raise LogAssertionError(msg) from logged_errors[0] - - -_MountFunc = Callable[["Callable[[], Any] | None"], None] - - -def _hotswap(update_on_change: bool = False) -> tuple[_MountFunc, ComponentConstructor]: - """Swap out components from a layout on the fly. - - Since you can't change the component functions used to create a layout - in an imperative manner, you can use ``hotswap`` to do this so - long as you set things up ahead of time. - - Parameters: - update_on_change: Whether or not all views of the layout should be updated on a swap. - - Example: - .. code-block:: python - - import reactpy - - show, root = reactpy.hotswap() - PerClientStateServer(root).run_in_thread("localhost", 8765) - - @reactpy.component - def DivOne(self): - return {"tagName": "div", "children": [1]} - - show(DivOne) - - # displaying the output now will show DivOne - - @reactpy.component - def DivTwo(self): - return {"tagName": "div", "children": [2]} - - show(DivTwo) - - # displaying the output now will show DivTwo - """ - constructor_ref: Ref[Callable[[], Any]] = Ref(lambda: None) - - if update_on_change: - set_constructor_callbacks: set[Callable[[Callable[[], Any]], None]] = set() - - @component - def HotSwap() -> Any: - # new displays will adopt the latest constructor and arguments - constructor, _set_constructor = use_state(lambda: constructor_ref.current) - set_constructor = use_callback(lambda new: _set_constructor(lambda _: new)) - - def add_callback() -> Callable[[], None]: - set_constructor_callbacks.add(set_constructor) - return lambda: set_constructor_callbacks.remove(set_constructor) - - use_effect(add_callback) - - return constructor() - - def swap(constructor: Callable[[], Any] | None) -> None: - constructor = constructor_ref.current = constructor or (lambda: None) - - for set_constructor in set_constructor_callbacks: - set_constructor(constructor) - - else: - - @component - def HotSwap() -> Any: - return constructor_ref.current() - - def swap(constructor: Callable[[], Any] | None) -> None: - constructor_ref.current = constructor or (lambda: None) - - return swap, HotSwap diff --git a/src/py/reactpy/reactpy/testing/common.py b/src/py/reactpy/reactpy/testing/common.py deleted file mode 100644 index 945c1c31d..000000000 --- a/src/py/reactpy/reactpy/testing/common.py +++ /dev/null @@ -1,212 +0,0 @@ -from __future__ import annotations - -import asyncio -import inspect -import shutil -import time -from collections.abc import Awaitable -from functools import wraps -from typing import Any, Callable, Generic, TypeVar, cast -from uuid import uuid4 -from weakref import ref - -from typing_extensions import ParamSpec - -from reactpy.config import REACTPY_TESTING_DEFAULT_TIMEOUT, REACTPY_WEB_MODULES_DIR -from reactpy.core.events import EventHandler, to_event_handler_function -from reactpy.core.hooks import LifeCycleHook, current_hook - - -def clear_reactpy_web_modules_dir() -> None: - """Clear the directory where ReactPy stores registered web modules""" - for path in REACTPY_WEB_MODULES_DIR.current.iterdir(): - shutil.rmtree(path) if path.is_dir() else path.unlink() - - -_P = ParamSpec("_P") -_R = TypeVar("_R") -_RC = TypeVar("_RC", covariant=True) - - -_DEFAULT_POLL_DELAY = 0.1 - - -class poll(Generic[_R]): # noqa: N801 - """Wait until the result of an sync or async function meets some condition""" - - def __init__( - self, - function: Callable[_P, Awaitable[_R] | _R], - *args: _P.args, - **kwargs: _P.kwargs, - ) -> None: - coro: Callable[_P, Awaitable[_R]] - if not inspect.iscoroutinefunction(function): - - async def coro(*args: _P.args, **kwargs: _P.kwargs) -> _R: - return cast(_R, function(*args, **kwargs)) - - else: - coro = cast(Callable[_P, Awaitable[_R]], function) - self._func = coro - self._args = args - self._kwargs = kwargs - - async def until( - self, - condition: Callable[[_R], bool], - timeout: float = REACTPY_TESTING_DEFAULT_TIMEOUT.current, - delay: float = _DEFAULT_POLL_DELAY, - description: str = "condition to be true", - ) -> None: - """Check that the coroutines result meets a condition within the timeout""" - started_at = time.time() - while True: - await asyncio.sleep(delay) - result = await self._func(*self._args, **self._kwargs) - if condition(result): - break - elif (time.time() - started_at) > timeout: # nocov - msg = f"Expected {description} after {timeout} seconds - last value was {result!r}" - raise TimeoutError(msg) - - async def until_is( - self, - right: _R, - timeout: float = REACTPY_TESTING_DEFAULT_TIMEOUT.current, - delay: float = _DEFAULT_POLL_DELAY, - ) -> None: - """Wait until the result is identical to the given value""" - return await self.until( - lambda left: left is right, - timeout, - delay, - f"value to be identical to {right!r}", - ) - - async def until_equals( - self, - right: _R, - timeout: float = REACTPY_TESTING_DEFAULT_TIMEOUT.current, - delay: float = _DEFAULT_POLL_DELAY, - ) -> None: - """Wait until the result is equal to the given value""" - return await self.until( - lambda left: left == right, - timeout, - delay, - f"value to equal {right!r}", - ) - - -class HookCatcher: - """Utility for capturing a LifeCycleHook from a component - - Example: - .. code-block:: - - hooks = HookCatcher(index_by_kwarg="thing") - - @reactpy.component - @hooks.capture - def MyComponent(thing): - ... - - ... # render the component - - # grab the last render of where MyComponent(thing='something') - hooks.index["something"] - # or grab the hook from the component's last render - hooks.latest - - After the first render of ``MyComponent`` the ``HookCatcher`` will have - captured the component's ``LifeCycleHook``. - """ - - latest: LifeCycleHook - - def __init__(self, index_by_kwarg: str | None = None): - self.index_by_kwarg = index_by_kwarg - self.index: dict[Any, LifeCycleHook] = {} - - def capture(self, render_function: Callable[..., Any]) -> Callable[..., Any]: - """Decorator for capturing a ``LifeCycleHook`` on each render of a component""" - - # The render function holds a reference to `self` and, via the `LifeCycleHook`, - # the component. Some tests check whether components are garbage collected, thus - # we must use a `ref` here to ensure these checks pass once the catcher itself - # has been collected. - self_ref = ref(self) - - @wraps(render_function) - def wrapper(*args: Any, **kwargs: Any) -> Any: - self = self_ref() - if self is None: - raise RuntimeError("Hook catcher has been garbage collected") - - hook = current_hook() - if self.index_by_kwarg is not None: - self.index[kwargs[self.index_by_kwarg]] = hook - self.latest = hook - return render_function(*args, **kwargs) - - return wrapper - - -class StaticEventHandler: - """Utility for capturing the target of one event handler - - Example: - .. code-block:: - - static_handler = StaticEventHandler() - - @reactpy.component - def MyComponent(): - state, set_state = reactpy.hooks.use_state(0) - handler = static_handler.use(lambda event: set_state(state + 1)) - return reactpy.html.button({"onClick": handler}, "Click me!") - - # gives the target ID for onClick where from the last render of MyComponent - static_handlers.target - - If you need to capture event handlers from different instances of a component - the you should create multiple ``StaticEventHandler`` instances. - - .. code-block:: - - static_handlers_by_key = { - "first": StaticEventHandler(), - "second": StaticEventHandler(), - } - - @reactpy.component - def Parent(): - return reactpy.html.div(Child(key="first"), Child(key="second")) - - @reactpy.component - def Child(key): - state, set_state = reactpy.hooks.use_state(0) - handler = static_handlers_by_key[key].use(lambda event: set_state(state + 1)) - return reactpy.html.button({"onClick": handler}, "Click me!") - - # grab the individual targets for each instance above - first_target = static_handlers_by_key["first"].target - second_target = static_handlers_by_key["second"].target - """ - - def __init__(self) -> None: - self.target = uuid4().hex - - def use( - self, - function: Callable[..., Any], - stop_propagation: bool = False, - prevent_default: bool = False, - ) -> EventHandler: - return EventHandler( - to_event_handler_function(function), - stop_propagation, - prevent_default, - self.target, - ) diff --git a/src/py/reactpy/reactpy/testing/display.py b/src/py/reactpy/reactpy/testing/display.py deleted file mode 100644 index bb0d8351d..000000000 --- a/src/py/reactpy/reactpy/testing/display.py +++ /dev/null @@ -1,91 +0,0 @@ -from __future__ import annotations - -from contextlib import AsyncExitStack -from types import TracebackType -from typing import Any - -from playwright.async_api import ( - Browser, - BrowserContext, - ElementHandle, - Page, - async_playwright, -) - -from reactpy.config import REACTPY_TESTING_DEFAULT_TIMEOUT -from reactpy.testing.backend import BackendFixture -from reactpy.types import RootComponentConstructor - - -class DisplayFixture: - """A fixture for running web-based tests using ``playwright``""" - - _exit_stack: AsyncExitStack - - def __init__( - self, - backend: BackendFixture | None = None, - driver: Browser | BrowserContext | Page | None = None, - url_prefix: str = "", - ) -> None: - if backend is not None: - self.backend = backend - if driver is not None: - if isinstance(driver, Page): - self.page = driver - else: - self._browser = driver - self.url_prefix = url_prefix - - async def show( - self, - component: RootComponentConstructor, - ) -> None: - self.backend.mount(component) - await self.goto("/") - await self.root_element() # check that root element is attached - - async def goto( - self, path: str, query: Any | None = None, add_url_prefix: bool = True - ) -> None: - await self.page.goto( - self.backend.url( - f"{self.url_prefix}{path}" if add_url_prefix else path, query - ) - ) - - async def root_element(self) -> ElementHandle: - element = await self.page.wait_for_selector("#app", state="attached") - if element is None: # nocov - msg = "Root element not attached" - raise RuntimeError(msg) - return element - - async def __aenter__(self) -> DisplayFixture: - es = self._exit_stack = AsyncExitStack() - - browser: Browser | BrowserContext - if not hasattr(self, "page"): - if not hasattr(self, "_browser"): - pw = await es.enter_async_context(async_playwright()) - browser = await pw.chromium.launch() - else: - browser = self._browser - self.page = await browser.new_page() - - self.page.set_default_timeout(REACTPY_TESTING_DEFAULT_TIMEOUT.current * 1000) - - if not hasattr(self, "backend"): - self.backend = BackendFixture() - await es.enter_async_context(self.backend) - - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - traceback: TracebackType | None, - ) -> None: - self.backend.mount(None) - await self._exit_stack.aclose() diff --git a/src/py/reactpy/reactpy/testing/logs.py b/src/py/reactpy/reactpy/testing/logs.py deleted file mode 100644 index e9337b19c..000000000 --- a/src/py/reactpy/reactpy/testing/logs.py +++ /dev/null @@ -1,178 +0,0 @@ -from __future__ import annotations - -import logging -import re -from collections.abc import Iterator -from contextlib import contextmanager -from traceback import format_exception -from typing import Any, NoReturn - -from reactpy.logging import ROOT_LOGGER - - -class LogAssertionError(AssertionError): - """An assertion error raised in relation to log messages.""" - - -@contextmanager -def assert_reactpy_did_log( - match_message: str = "", - error_type: type[Exception] | None = None, - match_error: str = "", -) -> Iterator[None]: - """Assert that ReactPy produced a log matching the described message or error. - - Args: - match_message: Must match a logged message. - error_type: Checks the type of logged exceptions. - match_error: Must match an error message. - """ - message_pattern = re.compile(match_message) - error_pattern = re.compile(match_error) - - with capture_reactpy_logs() as log_records: - try: - yield None - except Exception: - raise - else: - for record in list(log_records): - if ( - # record message matches - message_pattern.findall(record.getMessage()) - # error type matches - and ( - error_type is None - or ( - record.exc_info is not None - and record.exc_info[0] is not None - and issubclass(record.exc_info[0], error_type) - ) - ) - # error message pattern matches - and ( - not match_error - or ( - record.exc_info is not None - and error_pattern.findall( - "".join(format_exception(*record.exc_info)) - ) - ) - ) - ): - break - else: # nocov - _raise_log_message_error( - "Could not find a log record matching the given", - match_message, - error_type, - match_error, - ) - - -@contextmanager -def assert_reactpy_did_not_log( - match_message: str = "", - error_type: type[Exception] | None = None, - match_error: str = "", -) -> Iterator[None]: - """Assert the inverse of :func:`assert_reactpy_logged`""" - try: - with assert_reactpy_did_log(match_message, error_type, match_error): - yield None - except LogAssertionError: - pass - else: - _raise_log_message_error( - "Did find a log record matching the given", - match_message, - error_type, - match_error, - ) - - -def list_logged_exceptions( - log_records: list[logging.LogRecord], - pattern: str = "", - types: type[Any] | tuple[type[Any], ...] = Exception, - log_level: int = logging.ERROR, - del_log_records: bool = True, -) -> list[BaseException]: - """Return a list of logged exception matching the given criteria - - Args: - log_level: The level of log to check - exclude_exc_types: Any exception types to ignore - del_log_records: Whether to delete the log records for yielded exceptions - """ - found: list[BaseException] = [] - compiled_pattern = re.compile(pattern) - for index, record in enumerate(log_records): - if record.levelno >= log_level and record.exc_info: - error = record.exc_info[1] - if ( - error is not None - and isinstance(error, types) - and compiled_pattern.search(str(error)) - ): - if del_log_records: - del log_records[index - len(found)] - found.append(error) - return found - - -@contextmanager -def capture_reactpy_logs() -> Iterator[list[logging.LogRecord]]: - """Capture logs from ReactPy - - Any logs produced in this context are cleared afterwards - """ - original_level = ROOT_LOGGER.level - ROOT_LOGGER.setLevel(logging.DEBUG) - try: - if _LOG_RECORD_CAPTOR in ROOT_LOGGER.handlers: - start_index = len(_LOG_RECORD_CAPTOR.records) - try: - yield _LOG_RECORD_CAPTOR.records - finally: - end_index = len(_LOG_RECORD_CAPTOR.records) - _LOG_RECORD_CAPTOR.records[start_index:end_index] = [] - return None - - ROOT_LOGGER.addHandler(_LOG_RECORD_CAPTOR) - try: - yield _LOG_RECORD_CAPTOR.records - finally: - ROOT_LOGGER.removeHandler(_LOG_RECORD_CAPTOR) - _LOG_RECORD_CAPTOR.records.clear() - finally: - ROOT_LOGGER.setLevel(original_level) - - -class _LogRecordCaptor(logging.NullHandler): - def __init__(self) -> None: - self.records: list[logging.LogRecord] = [] - super().__init__() - - def handle(self, record: logging.LogRecord) -> bool: - self.records.append(record) - return True - - -_LOG_RECORD_CAPTOR = _LogRecordCaptor() - - -def _raise_log_message_error( - prefix: str, - match_message: str = "", - error_type: type[Exception] | None = None, - match_error: str = "", -) -> NoReturn: - conditions = [] - if match_message: - conditions.append(f"log message pattern {match_message!r}") - if error_type: - conditions.append(f"exception type {error_type}") - if match_error: - conditions.append(f"error message pattern {match_error!r}") - raise LogAssertionError(prefix + " " + " and ".join(conditions)) diff --git a/src/py/reactpy/reactpy/types.py b/src/py/reactpy/reactpy/types.py deleted file mode 100644 index 715b66fff..000000000 --- a/src/py/reactpy/reactpy/types.py +++ /dev/null @@ -1,51 +0,0 @@ -"""Exports common types from: - -- :mod:`reactpy.core.types` -- :mod:`reactpy.backend.types` -""" - -from reactpy.backend.types import BackendImplementation, Connection, Location -from reactpy.core.component import Component -from reactpy.core.hooks import Context -from reactpy.core.types import ( - ComponentConstructor, - ComponentType, - EventHandlerDict, - EventHandlerFunc, - EventHandlerMapping, - EventHandlerType, - ImportSourceDict, - Key, - LayoutType, - RootComponentConstructor, - State, - VdomAttributes, - VdomChild, - VdomChildren, - VdomDict, - VdomJson, -) - -__all__ = [ - "BackendImplementation", - "Component", - "ComponentConstructor", - "ComponentType", - "Connection", - "Context", - "EventHandlerDict", - "EventHandlerFunc", - "EventHandlerMapping", - "EventHandlerType", - "ImportSourceDict", - "Key", - "LayoutType", - "Location", - "RootComponentConstructor", - "State", - "VdomAttributes", - "VdomChild", - "VdomChildren", - "VdomDict", - "VdomJson", -] diff --git a/src/py/reactpy/reactpy/utils.py b/src/py/reactpy/reactpy/utils.py deleted file mode 100644 index 0bfc604bf..000000000 --- a/src/py/reactpy/reactpy/utils.py +++ /dev/null @@ -1,322 +0,0 @@ -from __future__ import annotations - -import inspect -import os -import re -from collections.abc import Iterable -from itertools import chain -from typing import Any, Callable, Generic, TypeVar, cast - -from lxml import etree -from lxml.html import fromstring, tostring - -from reactpy.core.types import VdomDict -from reactpy.core.vdom import vdom - -_RefValue = TypeVar("_RefValue") -_ModelTransform = Callable[[VdomDict], Any] -_UNDEFINED: Any = object() - - -class Ref(Generic[_RefValue]): - """Hold a reference to a value - - This is used in imperative code to mutate the state of this object in order to - incur side effects. Generally refs should be avoided if possible, but sometimes - they are required. - - Notes: - You can compare the contents for two ``Ref`` objects using the ``==`` operator. - """ - - __slots__ = "current" - - def __init__(self, initial_value: _RefValue = _UNDEFINED) -> None: - if initial_value is not _UNDEFINED: - self.current = initial_value - """The present value""" - - def set_current(self, new: _RefValue) -> _RefValue: - """Set the current value and return what is now the old value - - This is nice to use in ``lambda`` functions. - """ - old = self.current - self.current = new - return old - - def __eq__(self, other: Any) -> bool: - try: - return isinstance(other, Ref) and (other.current == self.current) - except AttributeError: - # attribute error occurs for uninitialized refs - return False - - def __repr__(self) -> str: - try: - current = repr(self.current) - except AttributeError: - # attribute error occurs for uninitialized refs - current = "<undefined>" - return f"{type(self).__name__}({current})" - - -def vdom_to_html(vdom: VdomDict) -> str: - """Convert a VDOM dictionary into an HTML string - - Only the following keys are translated to HTML: - - - ``tagName`` - - ``attributes`` - - ``children`` (must be strings or more VDOM dicts) - - Parameters: - vdom: The VdomDict element to convert to HTML - """ - temp_root = etree.Element("__temp__") - _add_vdom_to_etree(temp_root, vdom) - html = cast(bytes, tostring(temp_root)).decode() - # strip out temp root <__temp__> element - return html[10:-11] - - -def html_to_vdom( - html: str, *transforms: _ModelTransform, strict: bool = True -) -> VdomDict: - """Transform HTML into a DOM model. Unique keys can be provided to HTML elements - using a ``key=...`` attribute within your HTML tag. - - Parameters: - html: - The raw HTML as a string - transforms: - Functions of the form ``transform(old) -> new`` where ``old`` is a VDOM - dictionary which will be replaced by ``new``. For example, you could use a - transform function to add highlighting to a ``<code/>`` block. - strict: - If ``True``, raise an exception if the HTML does not perfectly follow HTML5 - syntax. - """ - if not isinstance(html, str): # nocov - msg = f"Expected html to be a string, not {type(html).__name__}" - raise TypeError(msg) - - # If the user provided a string, convert it to a list of lxml.etree nodes - try: - root_node: etree._Element = fromstring( - html.strip(), - parser=etree.HTMLParser( - remove_comments=True, - remove_pis=True, - remove_blank_text=True, - recover=not strict, - ), - ) - except etree.XMLSyntaxError as e: - if not strict: - raise e # nocov - msg = "An error has occurred while parsing the HTML.\n\nThis HTML may be malformatted, or may not perfectly adhere to HTML5.\nIf you believe the exception above was due to something intentional, you can disable the strict parameter on html_to_vdom().\nOtherwise, repair your broken HTML and try again." - raise HTMLParseError(msg) from e - - return _etree_to_vdom(root_node, transforms) - - -class HTMLParseError(etree.LxmlSyntaxError): # type: ignore[misc] - """Raised when an HTML document cannot be parsed using strict parsing.""" - - -def _etree_to_vdom( - node: etree._Element, transforms: Iterable[_ModelTransform] -) -> VdomDict: - """Transform an lxml etree node into a DOM model - - Parameters: - node: - The ``lxml.etree._Element`` node - transforms: - Functions of the form ``transform(old) -> new`` where ``old`` is a VDOM - dictionary which will be replaced by ``new``. For example, you could use a - transform function to add highlighting to a ``<code/>`` block. - """ - if not isinstance(node, etree._Element): # nocov - msg = f"Expected node to be a etree._Element, not {type(node).__name__}" - raise TypeError(msg) - - # Recursively call _etree_to_vdom() on all children - children = _generate_vdom_children(node, transforms) - - # Convert the lxml node to a VDOM dict - el = vdom(node.tag, dict(node.items()), *children) - - # Perform any necessary mutations on the VDOM attributes to meet VDOM spec - _mutate_vdom(el) - - # Apply any provided transforms. - for transform in transforms: - el = transform(el) - - return el - - -def _add_vdom_to_etree(parent: etree._Element, vdom: VdomDict | dict[str, Any]) -> None: - try: - tag = vdom["tagName"] - except KeyError as e: - msg = f"Expected a VDOM dict, not {vdom}" - raise TypeError(msg) from e - else: - vdom = cast(VdomDict, vdom) - - if tag: - element = etree.SubElement(parent, tag) - element.attrib.update( - _vdom_attr_to_html_str(k, v) for k, v in vdom.get("attributes", {}).items() - ) - else: - element = parent - - for c in vdom.get("children", []): - if isinstance(c, dict): - _add_vdom_to_etree(element, c) - else: - """ - LXML handles string children by storing them under `text` and `tail` - attributes of Element objects. The `text` attribute, if present, effectively - becomes that element's first child. Then the `tail` attribute, if present, - becomes a sibling that follows that element. For example, consider the - following HTML: - - <p><a>hello</a>world</p> - - In this code sample, "hello" is the `text` attribute of the `<a>` element - and "world" is the `tail` attribute of that same `<a>` element. It's for - this reason that, depending on whether the element being constructed has - non-string a child element, we need to assign a `text` vs `tail` attribute - to that element or the last non-string child respectively. - """ - if len(element): - last_child = element[-1] - last_child.tail = f"{last_child.tail or ''}{c}" - else: - element.text = f"{element.text or ''}{c}" - - -def _mutate_vdom(vdom: VdomDict) -> None: - """Performs any necessary mutations on the VDOM attributes to meet VDOM spec. - - Currently, this function only transforms the ``style`` attribute into a dictionary whose keys are - camelCase so as to be renderable by React. - - This function may be extended in the future. - """ - # Determine if the style attribute needs to be converted to a dict - if ( - "attributes" in vdom - and "style" in vdom["attributes"] - and isinstance(vdom["attributes"]["style"], str) - ): - # Convince type checker that it's safe to mutate attributes - assert isinstance(vdom["attributes"], dict) # noqa: S101 - - # Convert style attribute from str -> dict with camelCase keys - vdom["attributes"]["style"] = { - key.strip().replace("-", "_"): value.strip() - for key, value in ( - part.split(":", 1) - for part in vdom["attributes"]["style"].split(";") - if ":" in part - ) - } - - -def _generate_vdom_children( - node: etree._Element, transforms: Iterable[_ModelTransform] -) -> list[VdomDict | str]: - """Generates a list of VDOM children from an lxml node. - - Inserts inner text and/or tail text in between VDOM children, if necessary. - """ - return ( # Get the inner text of the current node - [node.text] if node.text else [] - ) + list( - chain( - *( - # Recursively convert each child node to VDOM - [_etree_to_vdom(child, transforms)] - # Insert the tail text between each child node - + ([child.tail] if child.tail else []) - for child in node.iterchildren(None) - ) - ) - ) - - -def del_html_head_body_transform(vdom: VdomDict) -> VdomDict: - """Transform intended for use with `html_to_vdom`. - - Removes `<html>`, `<head>`, and `<body>` while preserving their children. - - Parameters: - vdom: - The VDOM dictionary to transform. - """ - if vdom["tagName"] in {"html", "body", "head"}: - return {"tagName": "", "children": vdom["children"]} - return vdom - - -def _vdom_attr_to_html_str(key: str, value: Any) -> tuple[str, str]: - if key == "style": - if isinstance(value, dict): - value = ";".join( - # We lower only to normalize - CSS is case-insensitive: - # https://www.w3.org/TR/css-fonts-3/#font-family-casing - f"{_CAMEL_CASE_SUB_PATTERN.sub('-', k).lower()}:{v}" - for k, v in value.items() - ) - elif ( - # camel to data-* attributes - key.startswith("data_") - # camel to aria-* attributes - or key.startswith("aria_") - # handle special cases - or key in DASHED_HTML_ATTRS - ): - key = key.replace("_", "-") - elif ( - # camel to data-* attributes - key.startswith("data") - # camel to aria-* attributes - or key.startswith("aria") - # handle special cases - or key in DASHED_HTML_ATTRS - ): - key = _CAMEL_CASE_SUB_PATTERN.sub("-", key) - - if callable(value): # nocov - raise TypeError(f"Cannot convert callable attribute {key}={value} to HTML") - - # Again, we lower the attribute name only to normalize - HTML is case-insensitive: - # http://w3c.github.io/html-reference/documents.html#case-insensitivity - return key.lower(), str(value) - - -# see list of HTML attributes with dashes in them: -# https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes#attribute_list -DASHED_HTML_ATTRS = {"accept_charset", "acceptCharset", "http_equiv", "httpEquiv"} - -# Pattern for delimitting camelCase names (e.g. camelCase to camel-case) -_CAMEL_CASE_SUB_PATTERN = re.compile(r"(?<!^)(?=[A-Z])") - - -def _read_docs_css(): - """Reads a CSS file in the docs with the same relative path.""" - py_path = os.path.abspath((inspect.stack()[1])[1]) - css_path = ( - py_path.replace("/python/", "/css/") - .replace("\\python\\", "\\css\\") - .replace(".py", ".css") - ) - - with open(css_path, encoding="UTF-8") as css_file: - return css_file.read() diff --git a/src/py/reactpy/reactpy/web/__init__.py b/src/py/reactpy/reactpy/web/__init__.py deleted file mode 100644 index 308429dbb..000000000 --- a/src/py/reactpy/reactpy/web/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from reactpy.web.module import ( - export, - module_from_file, - module_from_string, - module_from_template, - module_from_url, -) - -__all__ = [ - "module_from_file", - "module_from_string", - "module_from_template", - "module_from_url", - "export", -] diff --git a/src/py/reactpy/reactpy/web/module.py b/src/py/reactpy/reactpy/web/module.py deleted file mode 100644 index 48322fe24..000000000 --- a/src/py/reactpy/reactpy/web/module.py +++ /dev/null @@ -1,390 +0,0 @@ -from __future__ import annotations - -import filecmp -import logging -import shutil -from dataclasses import dataclass -from pathlib import Path -from string import Template -from typing import Any, NewType, overload -from urllib.parse import urlparse - -from reactpy._warnings import warn -from reactpy.config import REACTPY_DEBUG_MODE, REACTPY_WEB_MODULES_DIR -from reactpy.core.types import ImportSourceDict, VdomDictConstructor -from reactpy.core.vdom import make_vdom_constructor -from reactpy.web.utils import ( - module_name_suffix, - resolve_module_exports_from_file, - resolve_module_exports_from_url, -) - -logger = logging.getLogger(__name__) - -SourceType = NewType("SourceType", str) - -NAME_SOURCE = SourceType("NAME") -"""A named source - usually a Javascript package name""" - -URL_SOURCE = SourceType("URL") -"""A source loaded from a URL, usually a CDN""" - - -def module_from_url( - url: str, - fallback: Any | None = None, - resolve_exports: bool | None = None, - resolve_exports_depth: int = 5, - unmount_before_update: bool = False, -) -> WebModule: - """Load a :class:`WebModule` from a :data:`URL_SOURCE` - - Parameters: - url: - Where the javascript module will be loaded from which conforms to the - interface for :ref:`Custom Javascript Components` - fallback: - What to temporarily display while the module is being loaded. - resolve_imports: - Whether to try and find all the named exports of this module. - resolve_exports_depth: - How deeply to search for those exports. - unmount_before_update: - Cause the component to be unmounted before each update. This option should - only be used if the imported package fails to re-render when props change. - Using this option has negative performance consequences since all DOM - elements must be changed on each render. See :issue:`461` for more info. - """ - return WebModule( - source=url, - source_type=URL_SOURCE, - default_fallback=fallback, - file=None, - export_names=( - resolve_module_exports_from_url(url, resolve_exports_depth) - if ( - resolve_exports - if resolve_exports is not None - else REACTPY_DEBUG_MODE.current - ) - else None - ), - unmount_before_update=unmount_before_update, - ) - - -_FROM_TEMPLATE_DIR = "__from_template__" - - -def module_from_template( - template: str, - package: str, - cdn: str = "https://esm.sh", - fallback: Any | None = None, - resolve_exports: bool | None = None, - resolve_exports_depth: int = 5, - unmount_before_update: bool = False, -) -> WebModule: - """Create a :class:`WebModule` from a framework template - - This is useful for experimenting with component libraries that do not already - support ReactPy's :ref:`Custom Javascript Component` interface. - - .. warning:: - - This approach is not recommended for use in a production setting because the - framework templates may use unpinned dependencies that could change without - warning. It's best to author a module adhering to the - :ref:`Custom Javascript Component` interface instead. - - **Templates** - - - ``react``: for modules exporting React components - - Parameters: - template: - The name of the framework template to use with the given ``package``. - package: - The name of a package to load. May include a file extension (defaults to - ``.js`` if not given) - cdn: - Where the package should be loaded from. The CDN must distribute ESM modules - fallback: - What to temporarily display while the module is being loaded. - resolve_imports: - Whether to try and find all the named exports of this module. - resolve_exports_depth: - How deeply to search for those exports. - unmount_before_update: - Cause the component to be unmounted before each update. This option should - only be used if the imported package fails to re-render when props change. - Using this option has negative performance consequences since all DOM - elements must be changed on each render. See :issue:`461` for more info. - """ - warn( - "module_from_template() is deprecated due to instability - use the Javascript " - "Components API instead. This function will be removed in a future release.", - DeprecationWarning, - ) - template_name, _, template_version = template.partition("@") - template_version = "@" + template_version if template_version else "" - - # We do this since the package may be any valid URL path. Thus we may need to strip - # object parameters or query information so we save the resulting template under the - # correct file name. - package_name = urlparse(package).path - - # downstream code assumes no trailing slash - cdn = cdn.rstrip("/") - - template_file_name = template_name + module_name_suffix(package_name) - - template_file = Path(__file__).parent / "templates" / template_file_name - if not template_file.exists(): - msg = f"No template for {template_file_name!r} exists" - raise ValueError(msg) - - variables = {"PACKAGE": package, "CDN": cdn, "VERSION": template_version} - content = Template(template_file.read_text()).substitute(variables) - - return module_from_string( - _FROM_TEMPLATE_DIR + "/" + package_name, - content, - fallback, - resolve_exports, - resolve_exports_depth, - unmount_before_update=unmount_before_update, - ) - - -def module_from_file( - name: str, - file: str | Path, - fallback: Any | None = None, - resolve_exports: bool | None = None, - resolve_exports_depth: int = 5, - unmount_before_update: bool = False, - symlink: bool = False, -) -> WebModule: - """Load a :class:`WebModule` from a given ``file`` - - Parameters: - name: - The name of the package - file: - The file from which the content of the web module will be created. - fallback: - What to temporarily display while the module is being loaded. - resolve_imports: - Whether to try and find all the named exports of this module. - resolve_exports_depth: - How deeply to search for those exports. - unmount_before_update: - Cause the component to be unmounted before each update. This option should - only be used if the imported package fails to re-render when props change. - Using this option has negative performance consequences since all DOM - elements must be changed on each render. See :issue:`461` for more info. - symlink: - Whether the web module should be saved as a symlink to the given ``file``. - """ - name += module_name_suffix(name) - - source_file = Path(file).resolve() - target_file = _web_module_path(name) - if not source_file.exists(): - msg = f"Source file does not exist: {source_file}" - raise FileNotFoundError(msg) - - if not target_file.exists(): - _copy_file(target_file, source_file, symlink) - elif not _equal_files(source_file, target_file): - logger.info( - f"Existing web module {name!r} will " - f"be replaced with {target_file.resolve()}" - ) - target_file.unlink() - _copy_file(target_file, source_file, symlink) - - return WebModule( - source=name, - source_type=NAME_SOURCE, - default_fallback=fallback, - file=target_file, - export_names=( - resolve_module_exports_from_file(source_file, resolve_exports_depth) - if ( - resolve_exports - if resolve_exports is not None - else REACTPY_DEBUG_MODE.current - ) - else None - ), - unmount_before_update=unmount_before_update, - ) - - -def _equal_files(f1: Path, f2: Path) -> bool: - f1 = f1.resolve() - f2 = f2.resolve() - return ( - (f1.is_symlink() or f2.is_symlink()) and (f1.resolve() == f2.resolve()) - ) or filecmp.cmp(str(f1), str(f2), shallow=False) - - -def _copy_file(target: Path, source: Path, symlink: bool) -> None: - target.parent.mkdir(parents=True, exist_ok=True) - if symlink: - target.symlink_to(source) - else: - shutil.copy(source, target) - - -def module_from_string( - name: str, - content: str, - fallback: Any | None = None, - resolve_exports: bool | None = None, - resolve_exports_depth: int = 5, - unmount_before_update: bool = False, -) -> WebModule: - """Load a :class:`WebModule` whose ``content`` comes from a string. - - Parameters: - name: - The name of the package - content: - The contents of the web module - fallback: - What to temporarily display while the module is being loaded. - resolve_imports: - Whether to try and find all the named exports of this module. - resolve_exports_depth: - How deeply to search for those exports. - unmount_before_update: - Cause the component to be unmounted before each update. This option should - only be used if the imported package fails to re-render when props change. - Using this option has negative performance consequences since all DOM - elements must be changed on each render. See :issue:`461` for more info. - """ - name += module_name_suffix(name) - - target_file = _web_module_path(name) - - if target_file.exists() and target_file.read_text() != content: - logger.info( - f"Existing web module {name!r} will " - f"be replaced with {target_file.resolve()}" - ) - target_file.unlink() - - target_file.parent.mkdir(parents=True, exist_ok=True) - target_file.write_text(content) - - return WebModule( - source=name, - source_type=NAME_SOURCE, - default_fallback=fallback, - file=target_file, - export_names=( - resolve_module_exports_from_file(target_file, resolve_exports_depth) - if ( - resolve_exports - if resolve_exports is not None - else REACTPY_DEBUG_MODE.current - ) - else None - ), - unmount_before_update=unmount_before_update, - ) - - -@dataclass(frozen=True) -class WebModule: - source: str - source_type: SourceType - default_fallback: Any | None - export_names: set[str] | None - file: Path | None - unmount_before_update: bool - - -@overload -def export( - web_module: WebModule, - export_names: str, - fallback: Any | None = ..., - allow_children: bool = ..., -) -> VdomDictConstructor: - ... - - -@overload -def export( - web_module: WebModule, - export_names: list[str] | tuple[str, ...], - fallback: Any | None = ..., - allow_children: bool = ..., -) -> list[VdomDictConstructor]: - ... - - -def export( - web_module: WebModule, - export_names: str | list[str] | tuple[str, ...], - fallback: Any | None = None, - allow_children: bool = True, -) -> VdomDictConstructor | list[VdomDictConstructor]: - """Return one or more VDOM constructors from a :class:`WebModule` - - Parameters: - export_names: - One or more names to export. If given as a string, a single component - will be returned. If a list is given, then a list of components will be - returned. - fallback: - What to temporarily display while the module is being loaded. - allow_children: - Whether or not these components can have children. - """ - if isinstance(export_names, str): - if ( - web_module.export_names is not None - and export_names not in web_module.export_names - ): - msg = f"{web_module.source!r} does not export {export_names!r}" - raise ValueError(msg) - return _make_export(web_module, export_names, fallback, allow_children) - else: - if web_module.export_names is not None: - missing = sorted(set(export_names).difference(web_module.export_names)) - if missing: - msg = f"{web_module.source!r} does not export {missing!r}" - raise ValueError(msg) - return [ - _make_export(web_module, name, fallback, allow_children) - for name in export_names - ] - - -def _make_export( - web_module: WebModule, - name: str, - fallback: Any | None, - allow_children: bool, -) -> VdomDictConstructor: - return make_vdom_constructor( - name, - allow_children=allow_children, - import_source=ImportSourceDict( - source=web_module.source, - sourceType=web_module.source_type, - fallback=(fallback or web_module.default_fallback), - unmountBeforeUpdate=web_module.unmount_before_update, - ), - ) - - -def _web_module_path(name: str) -> Path: - directory = REACTPY_WEB_MODULES_DIR.current - path = directory.joinpath(*name.split("/")) - return path.with_suffix(path.suffix) diff --git a/src/py/reactpy/reactpy/web/templates/react.js b/src/py/reactpy/reactpy/web/templates/react.js deleted file mode 100644 index 5c6a45743..000000000 --- a/src/py/reactpy/reactpy/web/templates/react.js +++ /dev/null @@ -1,60 +0,0 @@ -export * from "$CDN/$PACKAGE"; - -import * as React from "$CDN/react$VERSION"; -import * as ReactDOM from "$CDN/react-dom$VERSION"; - -export default ({ children, ...props }) => { - const [{ component }, setComponent] = React.useState({}); - React.useEffect(() => { - import("$CDN/$PACKAGE").then((module) => { - // dynamically load the default export since we don't know if it's exported. - setComponent({ component: module.default }); - }); - }); - return component - ? React.createElement(component, props, ...(children || [])) - : null; -}; - -export function bind(node, config) { - return { - create: (component, props, children) => - React.createElement(component, wrapEventHandlers(props), ...children), - render: (element) => ReactDOM.render(element, node), - unmount: () => ReactDOM.unmountComponentAtNode(node), - }; -} - -function wrapEventHandlers(props) { - const newProps = Object.assign({}, props); - for (const [key, value] of Object.entries(props)) { - if (typeof value === "function") { - newProps[key] = makeJsonSafeEventHandler(value); - } - } - return newProps; -} - -function makeJsonSafeEventHandler(oldHandler) { - // Since we can't really know what the event handlers get passed we have to check if - // they are JSON serializable or not. We can allow normal synthetic events to pass - // through since the original handler already knows how to serialize those for us. - return function safeEventHandler() { - oldHandler( - ...Array.from(arguments).filter((value) => { - if (typeof value === "object" && value.nativeEvent) { - // this is probably a standard React synthetic event - return true; - } else { - try { - JSON.stringify(value); - } catch (err) { - console.error("Failed to serialize some event data"); - return false; - } - return true; - } - }), - ); - }; -} diff --git a/src/py/reactpy/reactpy/web/utils.py b/src/py/reactpy/reactpy/web/utils.py deleted file mode 100644 index cf8b8638b..000000000 --- a/src/py/reactpy/reactpy/web/utils.py +++ /dev/null @@ -1,155 +0,0 @@ -import logging -import re -from pathlib import Path, PurePosixPath -from urllib.parse import urlparse - -import requests - -logger = logging.getLogger(__name__) - - -def module_name_suffix(name: str) -> str: - if name.startswith("@"): - name = name[1:] - head, _, tail = name.partition("@") # handle version identifier - version, _, tail = tail.partition("/") # get section after version - return PurePosixPath(tail or head).suffix or ".js" - - -def resolve_module_exports_from_file( - file: Path, - max_depth: int, - is_re_export: bool = False, -) -> set[str]: - if max_depth == 0: - logger.warning(f"Did not resolve all exports for {file} - max depth reached") - return set() - elif not file.exists(): - logger.warning(f"Did not resolve exports for unknown file {file}") - return set() - - export_names, references = resolve_module_exports_from_source( - file.read_text(), exclude_default=is_re_export - ) - - for ref in references: - if urlparse(ref).scheme: # is an absolute URL - export_names.update( - resolve_module_exports_from_url(ref, max_depth - 1, is_re_export=True) - ) - else: - path = file.parent.joinpath(*ref.split("/")) - export_names.update( - resolve_module_exports_from_file(path, max_depth - 1, is_re_export=True) - ) - - return export_names - - -def resolve_module_exports_from_url( - url: str, - max_depth: int, - is_re_export: bool = False, -) -> set[str]: - if max_depth == 0: - logger.warning(f"Did not resolve all exports for {url} - max depth reached") - return set() - - try: - text = requests.get(url, timeout=5).text - except requests.exceptions.ConnectionError as error: - reason = "" if error is None else " - {error.errno}" - logger.warning("Did not resolve exports for url " + url + reason) - return set() - - export_names, references = resolve_module_exports_from_source( - text, exclude_default=is_re_export - ) - - for ref in references: - url = _resolve_relative_url(url, ref) - export_names.update( - resolve_module_exports_from_url(url, max_depth - 1, is_re_export=True) - ) - - return export_names - - -def resolve_module_exports_from_source( - content: str, exclude_default: bool -) -> tuple[set[str], set[str]]: - names: set[str] = set() - references: set[str] = set() - - if _JS_DEFAULT_EXPORT_PATTERN.search(content): - names.add("default") - - # Exporting functions and classes - names.update(_JS_FUNC_OR_CLS_EXPORT_PATTERN.findall(content)) - - for export in _JS_GENERAL_EXPORT_PATTERN.findall(content): - export = export.rstrip(";").strip() - # Exporting individual features - if export.startswith("let "): - names.update(let.split("=", 1)[0] for let in export[4:].split(",")) - # Renaming exports and export list - elif export.startswith("{") and export.endswith("}"): - names.update( - item.split(" as ", 1)[-1] for item in export.strip("{}").split(",") - ) - # Exporting destructured assignments with renaming - elif export.startswith("const "): - names.update( - item.split(":", 1)[0] - for item in export[6:].split("=", 1)[0].strip("{}").split(",") - ) - # Default exports - elif export.startswith("default "): - names.add("default") - # Aggregating modules - elif export.startswith("* as "): - names.add(export[5:].split(" from ", 1)[0]) - elif export.startswith("* "): - references.add(export[2:].split("from ", 1)[-1].strip("'\"")) - elif export.startswith("{") and " from " in export: - names.update( - item.split(" as ", 1)[-1] - for item in export.split(" from ")[0].strip("{}").split(",") - ) - elif not (export.startswith("function ") or export.startswith("class ")): - logger.warning(f"Unknown export type {export!r}") - - names = {n.strip() for n in names} - references = {r.strip() for r in references} - - if exclude_default and "default" in names: - names.remove("default") - - return names, references - - -def _resolve_relative_url(base_url: str, rel_url: str) -> str: - if not rel_url.startswith("."): - return rel_url - - base_url = base_url.rsplit("/", 1)[0] - - if rel_url.startswith("./"): - return base_url + rel_url[1:] - - while rel_url.startswith("../"): - base_url = base_url.rsplit("/", 1)[0] - rel_url = rel_url[3:] - - return f"{base_url}/{rel_url}" - - -_JS_DEFAULT_EXPORT_PATTERN = re.compile( - r";?\s*export\s+default\s", -) -_JS_FUNC_OR_CLS_EXPORT_PATTERN = re.compile( - r";?\s*export\s+(?:function|class)\s+([a-zA-Z_$][0-9a-zA-Z_$]*)" -) -_JS_GENERAL_EXPORT_PATTERN = re.compile( - r"(?:^|;|})\s*export(?=\s+|{)(.*?)(?=;|$)", re.MULTILINE -) diff --git a/src/py/reactpy/reactpy/widgets.py b/src/py/reactpy/reactpy/widgets.py deleted file mode 100644 index cc19be04d..000000000 --- a/src/py/reactpy/reactpy/widgets.py +++ /dev/null @@ -1,103 +0,0 @@ -from __future__ import annotations - -from base64 import b64encode -from collections.abc import Sequence -from typing import TYPE_CHECKING, Any, Callable, Protocol, TypeVar - -import reactpy -from reactpy import html -from reactpy._warnings import warn -from reactpy.core.types import ComponentConstructor, VdomDict - - -def image( - format: str, - value: str | bytes = "", - attributes: dict[str, Any] | None = None, -) -> VdomDict: - """Utility for constructing an image from a string or bytes - - The source value will automatically be encoded to base64 - """ - if format == "svg": - format = "svg+xml" # noqa: A001 - - if isinstance(value, str): - bytes_value = value.encode() - else: - bytes_value = value - - base64_value = b64encode(bytes_value).decode() - src = f"data:image/{format};base64,{base64_value}" - - return {"tagName": "img", "attributes": {"src": src, **(attributes or {})}} - - -_Value = TypeVar("_Value") - - -def use_linked_inputs( - attributes: Sequence[dict[str, Any]], - on_change: Callable[[_Value], None] = lambda value: None, - cast: _CastFunc[_Value] = lambda value: value, - initial_value: str = "", - ignore_empty: bool = True, -) -> list[VdomDict]: - """Return a list of linked inputs equal to the number of given attributes. - - Parameters: - attributes: - That attributes of each returned input element. If the number of generated - inputs is variable, you may need to assign each one a - :ref:`key <Organizing Items With Keys>` by including a ``"key"`` in each - attribute dictionary. - on_change: - A callback which is triggered when any input is changed. This callback need - not update the 'value' field in the attributes of the inputs since that is - handled automatically. - cast: - Cast the 'value' of changed inputs that is passed to ``on_change``. - initial_value: - Initialize the 'value' field of the inputs. - ignore_empty: - Do not trigger ``on_change`` if the 'value' is an empty string. - """ - value, set_value = reactpy.hooks.use_state(initial_value) - - def sync_inputs(event: dict[str, Any]) -> None: - new_value = event["target"]["value"] - set_value(new_value) - if not new_value and ignore_empty: - return None - on_change(cast(new_value)) - - inputs: list[VdomDict] = [] - for attrs in attributes: - inputs.append(html.input({**attrs, "on_change": sync_inputs, "value": value})) - - return inputs - - -_CastTo = TypeVar("_CastTo", covariant=True) - - -class _CastFunc(Protocol[_CastTo]): - def __call__(self, value: str) -> _CastTo: - ... - - -if TYPE_CHECKING: - from reactpy.testing.backend import _MountFunc - - -def hotswap( - update_on_change: bool = False, -) -> tuple[_MountFunc, ComponentConstructor]: # nocov - warn( - "The 'hotswap' function is deprecated and will be removed in a future release", - DeprecationWarning, - stacklevel=2, - ) - from reactpy.testing.backend import _hotswap - - return _hotswap(update_on_change) diff --git a/src/py/reactpy/tests/__init__.py b/src/py/reactpy/tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/py/reactpy/tests/conftest.py b/src/py/reactpy/tests/conftest.py deleted file mode 100644 index 21b23c12e..000000000 --- a/src/py/reactpy/tests/conftest.py +++ /dev/null @@ -1,80 +0,0 @@ -from __future__ import annotations - -import asyncio -import os - -import pytest -from _pytest.config import Config -from _pytest.config.argparsing import Parser -from playwright.async_api import async_playwright - -from reactpy.config import REACTPY_TESTING_DEFAULT_TIMEOUT -from reactpy.testing import ( - BackendFixture, - DisplayFixture, - capture_reactpy_logs, - clear_reactpy_web_modules_dir, -) -from tests.tooling.loop import open_event_loop - - -def pytest_addoption(parser: Parser) -> None: - parser.addoption( - "--headed", - dest="headed", - action="store_true", - help="Open a browser window when running web-based tests", - ) - - -@pytest.fixture -async def display(server, page): - async with DisplayFixture(server, page) as display: - yield display - - -@pytest.fixture(scope="session") -async def server(): - async with BackendFixture() as server: - yield server - - -@pytest.fixture(scope="session") -async def page(browser): - pg = await browser.new_page() - pg.set_default_timeout(REACTPY_TESTING_DEFAULT_TIMEOUT.current * 1000) - try: - yield pg - finally: - await pg.close() - - -@pytest.fixture(scope="session") -async def browser(pytestconfig: Config): - async with async_playwright() as pw: - yield await pw.chromium.launch(headless=not bool(pytestconfig.option.headed)) - - -@pytest.fixture(scope="session") -def event_loop(): - if os.name == "nt": # nocov - asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy()) - with open_event_loop() as loop: - yield loop - - -@pytest.fixture(autouse=True) -def clear_web_modules_dir_after_test(): - clear_reactpy_web_modules_dir() - - -@pytest.fixture(autouse=True) -def assert_no_logged_exceptions(): - with capture_reactpy_logs() as records: - yield - try: - for r in records: - if r.exc_info is not None: - raise r.exc_info[1] - finally: - records.clear() diff --git a/src/py/reactpy/tests/test__console/__init__.py b/src/py/reactpy/tests/test__console/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/py/reactpy/tests/test__console/test_rewrite_camel_case_props.py b/src/py/reactpy/tests/test__console/test_rewrite_camel_case_props.py deleted file mode 100644 index 47b8baabc..000000000 --- a/src/py/reactpy/tests/test__console/test_rewrite_camel_case_props.py +++ /dev/null @@ -1,118 +0,0 @@ -import sys -from pathlib import Path -from textwrap import dedent - -import pytest -from click.testing import CliRunner - -from reactpy._console.rewrite_camel_case_props import ( - generate_rewrite, - rewrite_camel_case_props, -) - -if sys.version_info < (3, 9): - pytestmark = pytest.mark.skip(reason="ast.unparse is Python>=3.9") - - -def test_rewrite_camel_case_props_declarations(tmp_path): - runner = CliRunner() - - tempfile: Path = tmp_path / "temp.py" - tempfile.write_text("html.div(dict(camelCase='test'))") - result = runner.invoke( - rewrite_camel_case_props, - args=[str(tmp_path)], - catch_exceptions=False, - ) - - assert result.exit_code == 0 - assert tempfile.read_text() == "html.div(dict(camel_case='test'))" - - -def test_rewrite_camel_case_props_declarations_no_files(): - runner = CliRunner() - - result = runner.invoke( - rewrite_camel_case_props, - args=["directory-does-no-exist"], - catch_exceptions=False, - ) - - assert result.exit_code != 0 - - -@pytest.mark.parametrize( - "source, expected", - [ - ( - "html.div(dict(camelCase='test'))", - "html.div(dict(camel_case='test'))", - ), - ( - "reactpy.html.button({'onClick': block_forever})", - "reactpy.html.button({'on_click': block_forever})", - ), - ( - "html.div(dict(style={'testThing': test}))", - "html.div(dict(style={'test_thing': test}))", - ), - ( - "html.div(dict(style=dict(testThing=test)))", - "html.div(dict(style=dict(test_thing=test)))", - ), - ( - "vdom('tag', dict(camelCase='test'))", - "vdom('tag', dict(camel_case='test'))", - ), - ( - "vdom('tag', dict(camelCase='test', **props))", - "vdom('tag', dict(camel_case='test', **props))", - ), - ( - "html.div({'camelCase': test, 'data-thing': test})", - "html.div({'camel_case': test, 'data-thing': test})", - ), - ( - "html.div({'camelCase': test, ignore: this})", - "html.div({'camel_case': test, ignore: this})", - ), - # no rewrite - ( - "html.div({'snake_case': test})", - None, - ), - ( - "html.div({'data-case': test})", - None, - ), - ( - "html.div(dict(snake_case='test'))", - None, - ), - ( - "html.div()", - None, - ), - ( - "vdom('tag')", - None, - ), - ( - "html.div('child')", - None, - ), - ( - "vdom('tag', 'child')", - None, - ), - ], - ids=lambda item: " ".join(map(str.strip, item.split())) - if isinstance(item, str) - else item, -) -def test_generate_rewrite(source, expected): - actual = generate_rewrite(Path("test.py"), dedent(source).strip()) - if isinstance(expected, str): - expected = dedent(expected).strip() - - assert actual == expected diff --git a/src/py/reactpy/tests/test__console/test_rewrite_keys.py b/src/py/reactpy/tests/test__console/test_rewrite_keys.py deleted file mode 100644 index da0b26c4f..000000000 --- a/src/py/reactpy/tests/test__console/test_rewrite_keys.py +++ /dev/null @@ -1,237 +0,0 @@ -import sys -from pathlib import Path -from textwrap import dedent - -import pytest -from click.testing import CliRunner - -from reactpy._console.rewrite_keys import generate_rewrite, rewrite_keys - -if sys.version_info < (3, 9): - pytestmark = pytest.mark.skip(reason="ast.unparse is Python>=3.9") - - -def test_rewrite_key_declarations(tmp_path): - runner = CliRunner() - - tempfile: Path = tmp_path / "temp.py" - tempfile.write_text("html.div(key='test')") - result = runner.invoke( - rewrite_keys, - args=[str(tmp_path)], - catch_exceptions=False, - ) - - assert result.exit_code == 0 - assert tempfile.read_text() == "html.div({'key': 'test'})" - - -def test_rewrite_key_declarations_no_files(): - runner = CliRunner() - - result = runner.invoke( - rewrite_keys, - args=["directory-does-no-exist"], - catch_exceptions=False, - ) - - assert result.exit_code != 0 - - -@pytest.mark.parametrize( - "source, expected", - [ - ( - "html.div(key='test')", - "html.div({'key': 'test'})", - ), - ( - "html.div('something', key='test')", - "html.div({'key': 'test'}, 'something')", - ), - ( - "html.div({'some_attr': 1}, child_1, child_2, key='test')", - "html.div({'some_attr': 1, 'key': 'test'}, child_1, child_2)", - ), - ( - "vdom('div', key='test')", - "vdom('div', {'key': 'test'})", - ), - ( - "vdom('div', 'something', key='test')", - "vdom('div', {'key': 'test'}, 'something')", - ), - ( - "vdom('div', {'some_attr': 1}, child_1, child_2, key='test')", - "vdom('div', {'some_attr': 1, 'key': 'test'}, child_1, child_2)", - ), - ( - "html.div(dict(some_attr=1), child_1, child_2, key='test')", - "html.div(dict(some_attr=1, key='test'), child_1, child_2)", - ), - ( - "vdom('div', dict(some_attr=1), child_1, child_2, key='test')", - "vdom('div', dict(some_attr=1, key='test'), child_1, child_2)", - ), - # avoid unnecessary changes - ( - """ - def my_function(): - x = 1 # some comment - return html.div(key='test') - """, - """ - def my_function(): - x = 1 # some comment - return html.div({'key': 'test'}) - """, - ), - ( - """ - if condition: - # some comment - dom = html.div(key='test') - """, - """ - if condition: - # some comment - dom = html.div({'key': 'test'}) - """, - ), - ( - """ - [ - html.div(key='test'), - html.div(key='test'), - ] - """, - """ - [ - html.div({'key': 'test'}), - html.div({'key': 'test'}), - ] - """, - ), - ( - """ - @deco( - html.div(key='test'), - html.div(key='test'), - ) - def func(): - # comment - x = [ - 1 - ] - """, - """ - @deco( - html.div({'key': 'test'}), - html.div({'key': 'test'}), - ) - def func(): - # comment - x = [ - 1 - ] - """, - ), - ( - """ - @deco(html.div(key='test'), html.div(key='test')) - def func(): - # comment - x = [ - 1 - ] - """, - """ - @deco(html.div({'key': 'test'}), html.div({'key': 'test'})) - def func(): - # comment - x = [ - 1 - ] - """, - ), - ( - """ - ( - result - if condition - else html.div(key='test') - ) - """, - """ - ( - result - if condition - else html.div({'key': 'test'}) - ) - """, - ), - # best effort to preserve comments - ( - """ - x = 1 - html.div( - "hello", - # comment 1 - html.div(key='test'), - # comment 2 - key='test', - ) - """, - """ - x = 1 - # comment 1 - # comment 2 - html.div({'key': 'test'}, 'hello', html.div({'key': 'test'})) - """, - ), - # no rewrites - ( - "html.no_an_element(key='test')", - None, - ), - ( - "not_html.div(key='test')", - None, - ), - ( - "html.div()", - None, - ), - ( - "html.div(not_key='something')", - None, - ), - ( - "vdom()", - None, - ), - ( - "(some + expr)(key='test')", - None, - ), - ("html.div()", None), - # too ambiguous to rewrite - ( - "html.div(child_1, child_2, key='test')", # unclear if child_1 is attr dict - None, - ), - ( - "vdom('div', child_1, child_2, key='test')", # unclear if child_1 is attr dict - None, - ), - ], - ids=lambda item: " ".join(map(str.strip, item.split())) - if isinstance(item, str) - else item, -) -def test_generate_rewrite(source, expected): - actual = generate_rewrite(Path("test.py"), dedent(source).strip()) - if isinstance(expected, str): - expected = dedent(expected).strip() - - assert actual == expected diff --git a/src/py/reactpy/tests/test__option.py b/src/py/reactpy/tests/test__option.py deleted file mode 100644 index 63f2fada8..000000000 --- a/src/py/reactpy/tests/test__option.py +++ /dev/null @@ -1,111 +0,0 @@ -import os -from unittest import mock - -import pytest - -from reactpy._option import DeprecatedOption, Option - - -def test_option_repr(): - opt = Option("A_FAKE_OPTION", "some-value") - assert opt.name == "A_FAKE_OPTION" - assert repr(opt) == "Option(A_FAKE_OPTION='some-value')" - - -@mock.patch.dict(os.environ, {"A_FAKE_OPTION": "value-from-environ"}) -def test_option_from_os_environ(): - opt = Option("A_FAKE_OPTION", "default-value") - assert opt.current == "value-from-environ" - - -def test_option_from_default(): - opt = Option("A_FAKE_OPTION", "default-value") - assert opt.current == "default-value" - assert opt.current is opt.default - - -@mock.patch.dict(os.environ, {"A_FAKE_OPTION": "1"}) -def test_option_validator(): - opt = Option("A_FAKE_OPTION", False, validator=lambda x: bool(int(x))) - - assert opt.current is True - - opt.current = "0" - assert opt.current is False - - with pytest.raises(ValueError, match="invalid literal for int"): - opt.current = "not-an-int" - - -def test_immutable_option(): - opt = Option("A_FAKE_OPTION", "default-value", mutable=False) - assert not opt.mutable - with pytest.raises(TypeError, match="cannot be modified after initial load"): - opt.current = "a-new-value" - with pytest.raises(TypeError, match="cannot be modified after initial load"): - opt.unset() - - -def test_option_reset(): - opt = Option("A_FAKE_OPTION", "default-value") - opt.current = "a-new-value" - opt.unset() - assert opt.current is opt.default - assert not opt.is_set() - - -@mock.patch.dict(os.environ, {"A_FAKE_OPTION": "value-from-environ"}) -def test_option_reload(): - opt = Option("A_FAKE_OPTION", "default-value") - opt.current = "some-other-value" - opt.reload() - assert opt.current == "value-from-environ" - - -def test_option_set(): - opt = Option("A_FAKE_OPTION", "default-value") - assert not opt.is_set() - opt.current = "a-new-value" - assert opt.is_set() - - -def test_option_set_default(): - opt = Option("A_FAKE_OPTION", "default-value") - assert not opt.is_set() - assert opt.set_default("new-value") == "new-value" - assert opt.is_set() - - -def test_cannot_subscribe_immutable_option(): - opt = Option("A_FAKE_OPTION", "default", mutable=False) - with pytest.raises(TypeError, match="Immutable options cannot be subscribed to"): - opt.subscribe(lambda value: None) - - -def test_option_subscribe(): - opt = Option("A_FAKE_OPTION", "default") - - calls = [] - opt.subscribe(calls.append) - assert calls == ["default"] - - opt.current = "default" - # value did not change, so no trigger - assert calls == ["default"] - - opt.current = "new-1" - opt.current = "new-2" - assert calls == ["default", "new-1", "new-2"] - - opt.unset() - assert calls == ["default", "new-1", "new-2", "default"] - - -def test_deprecated_option(): - opt = DeprecatedOption("is deprecated!", "A_FAKE_OPTION", None) - - with pytest.warns(DeprecationWarning, match="is deprecated!"): - assert opt.current is None - - with pytest.warns(DeprecationWarning, match="is deprecated!"): - opt.current = "something" diff --git a/src/py/reactpy/tests/test_backend/__init__.py b/src/py/reactpy/tests/test_backend/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/py/reactpy/tests/test_backend/test__common.py b/src/py/reactpy/tests/test_backend/test__common.py deleted file mode 100644 index 248bf9451..000000000 --- a/src/py/reactpy/tests/test_backend/test__common.py +++ /dev/null @@ -1,70 +0,0 @@ -import pytest - -from reactpy import html -from reactpy.backend._common import ( - CommonOptions, - traversal_safe_path, - vdom_head_elements_to_html, -) - - -def test_common_options_url_prefix_starts_with_slash(): - # no prefix specified - CommonOptions(url_prefix="") - - with pytest.raises(ValueError, match="start with '/'"): - CommonOptions(url_prefix="not-start-withslash") - - -@pytest.mark.parametrize( - "bad_path", - [ - "../escaped", - "ok/../../escaped", - "ok/ok-again/../../ok-yet-again/../../../escaped", - ], -) -def test_catch_unsafe_relative_path_traversal(tmp_path, bad_path): - with pytest.raises(ValueError, match="Unsafe path"): - traversal_safe_path(tmp_path, *bad_path.split("/")) - - -@pytest.mark.parametrize( - "vdom_in, html_out", - [ - ( - "<title>example</title>", - "<title>example</title>", - ), - ( - # We do not modify strings given by user. If given as VDOM we would have - # striped this head element, but since provided as string, we leav as-is. - "<head></head>", - "<head></head>", - ), - ( - html.head( - html.meta({"charset": "utf-8"}), - html.title("example"), - ), - # we strip the head element - '<meta charset="utf-8"><title>example</title>', - ), - ( - html._( - html.meta({"charset": "utf-8"}), - html.title("example"), - ), - '<meta charset="utf-8"><title>example</title>', - ), - ( - [ - html.meta({"charset": "utf-8"}), - html.title("example"), - ], - '<meta charset="utf-8"><title>example</title>', - ), - ], -) -def test_vdom_head_elements_to_html(vdom_in, html_out): - assert vdom_head_elements_to_html(vdom_in) == html_out diff --git a/src/py/reactpy/tests/test_backend/test_all.py b/src/py/reactpy/tests/test_backend/test_all.py deleted file mode 100644 index 11b9693a2..000000000 --- a/src/py/reactpy/tests/test_backend/test_all.py +++ /dev/null @@ -1,174 +0,0 @@ -from collections.abc import MutableMapping - -import pytest - -import reactpy -from reactpy import html -from reactpy.backend import default as default_implementation -from reactpy.backend._common import PATH_PREFIX -from reactpy.backend.types import BackendImplementation, Connection, Location -from reactpy.backend.utils import all_implementations -from reactpy.testing import BackendFixture, DisplayFixture, poll - - -@pytest.fixture( - params=[*list(all_implementations()), default_implementation], - ids=lambda imp: imp.__name__, - scope="module", -) -async def display(page, request): - imp: BackendImplementation = request.param - - # we do this to check that route priorities for each backend are correct - if imp is default_implementation: - url_prefix = "" - opts = None - else: - url_prefix = str(PATH_PREFIX) - opts = imp.Options(url_prefix=url_prefix) - - async with BackendFixture(implementation=imp, options=opts) as server: - async with DisplayFixture( - backend=server, - driver=page, - url_prefix=url_prefix, - ) as display: - yield display - - -async def test_display_simple_hello_world(display: DisplayFixture): - @reactpy.component - def Hello(): - return reactpy.html.p({"id": "hello"}, ["Hello World"]) - - await display.show(Hello) - - await display.page.wait_for_selector("#hello") - - # test that we can reconnect successfully - await display.page.reload() - - await display.page.wait_for_selector("#hello") - - -async def test_display_simple_click_counter(display: DisplayFixture): - @reactpy.component - def Counter(): - count, set_count = reactpy.hooks.use_state(0) - return reactpy.html.button( - { - "id": "counter", - "on_click": lambda event: set_count(lambda old_count: old_count + 1), - }, - f"Count: {count}", - ) - - await display.show(Counter) - - counter = await display.page.wait_for_selector("#counter") - - for i in range(5): - await poll(counter.text_content).until_equals(f"Count: {i}") - await counter.click() - - -async def test_module_from_template(display: DisplayFixture): - victory = reactpy.web.module_from_template("react", "victory-bar@35.4.0") - VictoryBar = reactpy.web.export(victory, "VictoryBar") - await display.show(VictoryBar) - await display.page.wait_for_selector(".VictoryContainer") - - -async def test_use_connection(display: DisplayFixture): - conn = reactpy.Ref() - - @reactpy.component - def ShowScope(): - conn.current = reactpy.use_connection() - return html.pre({"id": "scope"}, str(conn.current)) - - await display.show(ShowScope) - - await display.page.wait_for_selector("#scope") - assert isinstance(conn.current, Connection) - - -async def test_use_scope(display: DisplayFixture): - scope = reactpy.Ref() - - @reactpy.component - def ShowScope(): - scope.current = reactpy.use_scope() - return html.pre({"id": "scope"}, str(scope.current)) - - await display.show(ShowScope) - - await display.page.wait_for_selector("#scope") - assert isinstance(scope.current, MutableMapping) - - -async def test_use_location(display: DisplayFixture): - location = reactpy.Ref() - - @poll - async def poll_location(): - """This needs to be async to allow the server to respond""" - return location.current - - @reactpy.component - def ShowRoute(): - location.current = reactpy.use_location() - return html.pre(str(location.current)) - - await display.show(ShowRoute) - - await poll_location.until_equals(Location("/", "")) - - for loc in [ - Location("/something", ""), - Location("/something/file.txt", ""), - Location("/another/something", ""), - Location("/another/something/file.txt", ""), - Location("/another/something/file.txt", "?key=value"), - Location("/another/something/file.txt", "?key1=value1&key2=value2"), - ]: - await display.goto(loc.pathname + loc.search) - await poll_location.until_equals(loc) - - -@pytest.mark.parametrize("hook_name", ["use_request", "use_websocket"]) -async def test_use_request(display: DisplayFixture, hook_name): - hook = getattr(display.backend.implementation, hook_name, None) - if hook is None: - pytest.skip(f"{display.backend.implementation} has no '{hook_name}' hook") - - hook_val = reactpy.Ref() - - @reactpy.component - def ShowRoute(): - hook_val.current = hook() - return html.pre({"id": "hook"}, str(hook_val.current)) - - await display.show(ShowRoute) - - await display.page.wait_for_selector("#hook") - - # we can't easily narrow this check - assert hook_val.current is not None - - -@pytest.mark.parametrize("imp", all_implementations()) -async def test_customized_head(imp: BackendImplementation, page): - custom_title = f"Custom Title for {imp.__name__}" - - @reactpy.component - def sample(): - return html.h1(f"^ Page title is customized to: '{custom_title}'") - - async with BackendFixture( - implementation=imp, - options=imp.Options(head=html.title(custom_title)), - ) as server: - async with DisplayFixture(backend=server, driver=page) as display: - await display.show(sample) - assert (await display.page.title()) == custom_title diff --git a/src/py/reactpy/tests/test_backend/test_utils.py b/src/py/reactpy/tests/test_backend/test_utils.py deleted file mode 100644 index 2a58dc62a..000000000 --- a/src/py/reactpy/tests/test_backend/test_utils.py +++ /dev/null @@ -1,46 +0,0 @@ -import threading -import time -from contextlib import ExitStack - -import pytest -from playwright.async_api import Page - -from reactpy.backend import flask as flask_implementation -from reactpy.backend.utils import find_available_port -from reactpy.backend.utils import run as sync_run -from reactpy.sample import SampleApp - - -@pytest.fixture -def exit_stack(): - with ExitStack() as es: - yield es - - -def test_find_available_port(): - assert find_available_port("localhost", port_min=5000, port_max=6000) - with pytest.raises(RuntimeError, match="no available port"): - # check that if port range is exhausted we raise - find_available_port("localhost", port_min=0, port_max=0) - - -async def test_run(page: Page): - host = "127.0.0.1" - port = find_available_port(host) - url = f"http://{host}:{port}" - - threading.Thread( - target=lambda: sync_run( - SampleApp, - host, - port, - implementation=flask_implementation, - ), - daemon=True, - ).start() - - # give the server a moment to start - time.sleep(0.5) - - await page.goto(url) - await page.wait_for_selector("#sample") diff --git a/src/py/reactpy/tests/test_client.py b/src/py/reactpy/tests/test_client.py deleted file mode 100644 index 3c7250e48..000000000 --- a/src/py/reactpy/tests/test_client.py +++ /dev/null @@ -1,161 +0,0 @@ -import asyncio -from contextlib import AsyncExitStack -from pathlib import Path - -from playwright.async_api import Browser - -import reactpy -from reactpy.backend.utils import find_available_port -from reactpy.testing import BackendFixture, DisplayFixture, poll -from tests.tooling.common import DEFAULT_TYPE_DELAY -from tests.tooling.hooks import use_counter - -JS_DIR = Path(__file__).parent / "js" - - -async def test_automatic_reconnect(browser: Browser): - port = find_available_port("localhost") - page = await browser.new_page() - - # we need to wait longer here because the automatic reconnect is not instant - page.set_default_timeout(10000) - - @reactpy.component - def SomeComponent(): - count, incr_count = use_counter(0) - return reactpy.html._( - reactpy.html.p({"data_count": count, "id": "count"}, "count", count), - reactpy.html.button( - {"on_click": lambda e: incr_count(), "id": "incr"}, "incr" - ), - ) - - async with AsyncExitStack() as exit_stack: - server = await exit_stack.enter_async_context(BackendFixture(port=port)) - display = await exit_stack.enter_async_context( - DisplayFixture(server, driver=page) - ) - - await display.show(SomeComponent) - - count = await page.wait_for_selector("#count") - incr = await page.wait_for_selector("#incr") - - for i in range(3): - assert (await count.get_attribute("data-count")) == str(i) - await incr.click() - - # the server is disconnected but the last view state is still shown - await page.wait_for_selector("#count") - - async with AsyncExitStack() as exit_stack: - server = await exit_stack.enter_async_context(BackendFixture(port=port)) - display = await exit_stack.enter_async_context( - DisplayFixture(server, driver=page) - ) - - # use mount instead of show to avoid a page refresh - display.backend.mount(SomeComponent) - - async def get_count(): - # need to refetch element because may unmount on reconnect - count = await page.wait_for_selector("#count") - return await count.get_attribute("data-count") - - for i in range(3): - # it may take a moment for the websocket to reconnect so need to poll - await poll(get_count).until_equals(str(i)) - - # need to refetch element because may unmount on reconnect - incr = await page.wait_for_selector("#incr") - - await incr.click() - - -async def test_style_can_be_changed(display: DisplayFixture): - """This test was introduced to verify the client does not mutate the model - - A bug was introduced where the client-side model was mutated and React was relying - on the model to have been copied in order to determine if something had changed. - - See for more info: https://github.com/reactive-python/reactpy/issues/480 - """ - - @reactpy.component - def ButtonWithChangingColor(): - color_toggle, set_color_toggle = reactpy.hooks.use_state(True) - color = "red" if color_toggle else "blue" - return reactpy.html.button( - { - "id": "my-button", - "on_click": lambda event: set_color_toggle(not color_toggle), - "style": {"background_color": color, "color": "white"}, - }, - f"color: {color}", - ) - - await display.show(ButtonWithChangingColor) - - button = await display.page.wait_for_selector("#my-button") - - assert (await _get_style(button))["background-color"] == "red" - - for color in ["blue", "red"] * 2: - await button.click() - assert (await _get_style(button))["background-color"] == color - - -async def _get_style(element): - items = (await element.get_attribute("style")).split(";") - pairs = [item.split(":", 1) for item in map(str.strip, items) if item] - return {key.strip(): value.strip() for key, value in pairs} - - -async def test_slow_server_response_on_input_change(display: DisplayFixture): - """A delay server-side could cause input values to be overwritten. - - For more info see: https://github.com/reactive-python/reactpy/issues/684 - """ - - delay = 0.2 - - @reactpy.component - def SomeComponent(): - value, set_value = reactpy.hooks.use_state("") - - async def handle_change(event): - await asyncio.sleep(delay) - set_value(event["target"]["value"]) - - return reactpy.html.input({"on_change": handle_change, "id": "test-input"}) - - await display.show(SomeComponent) - - inp = await display.page.wait_for_selector("#test-input") - await inp.type("hello", delay=DEFAULT_TYPE_DELAY) - - assert (await inp.evaluate("node => node.value")) == "hello" - - -async def test_snake_case_attributes(display: DisplayFixture): - @reactpy.component - def SomeComponent(): - return reactpy.html.h1( - { - "id": "my-title", - "style": {"background_color": "blue"}, - "class_name": "hello", - "data_some_thing": "some-data", - "aria_some_thing": "some-aria", - }, - "title with some attributes", - ) - - await display.show(SomeComponent) - - title = await display.page.wait_for_selector("#my-title") - - assert await title.get_attribute("class") == "hello" - assert await title.get_attribute("style") == "background-color: blue;" - assert await title.get_attribute("data-some-thing") == "some-data" - assert await title.get_attribute("aria-some-thing") == "some-aria" diff --git a/src/py/reactpy/tests/test_config.py b/src/py/reactpy/tests/test_config.py deleted file mode 100644 index ecbbb998c..000000000 --- a/src/py/reactpy/tests/test_config.py +++ /dev/null @@ -1,29 +0,0 @@ -import pytest - -from reactpy import config -from reactpy._option import Option - - -@pytest.fixture(autouse=True) -def reset_options(): - options = [value for value in config.__dict__.values() if isinstance(value, Option)] - - should_unset = object() - original_values = [] - for opt in options: - original_values.append(opt.current if opt.is_set() else should_unset) - - yield - - for opt, val in zip(options, original_values): - if val is should_unset: - if opt.is_set(): - opt.unset() - else: - opt.current = val - - -def test_reactpy_debug_mode_toggle(): - # just check that nothing breaks - config.REACTPY_DEBUG_MODE.current = True - config.REACTPY_DEBUG_MODE.current = False diff --git a/src/py/reactpy/tests/test_core/__init__.py b/src/py/reactpy/tests/test_core/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/py/reactpy/tests/test_core/test_component.py b/src/py/reactpy/tests/test_core/test_component.py deleted file mode 100644 index aa8996d4e..000000000 --- a/src/py/reactpy/tests/test_core/test_component.py +++ /dev/null @@ -1,73 +0,0 @@ -import reactpy -from reactpy.testing import DisplayFixture - - -def test_component_repr(): - @reactpy.component - def MyComponent(a, *b, **c): - pass - - mc1 = MyComponent(1, 2, 3, x=4, y=5) - - expected = f"MyComponent({id(mc1):02x}, a=1, b=(2, 3), c={{'x': 4, 'y': 5}})" - assert repr(mc1) == expected - - # not enough args supplied to function - assert repr(MyComponent()) == "MyComponent(...)" - - -async def test_simple_component(): - @reactpy.component - def SimpleDiv(): - return reactpy.html.div() - - assert SimpleDiv().render() == {"tagName": "div"} - - -async def test_simple_parameterized_component(): - @reactpy.component - def SimpleParamComponent(tag): - return reactpy.vdom(tag) - - assert SimpleParamComponent("div").render() == {"tagName": "div"} - - -async def test_component_with_var_args(): - @reactpy.component - def ComponentWithVarArgsAndKwargs(*args, **kwargs): - return reactpy.html.div(kwargs, args) - - assert ComponentWithVarArgsAndKwargs("hello", "world", my_attr=1).render() == { - "tagName": "div", - "attributes": {"my_attr": 1}, - "children": ["hello", "world"], - } - - -async def test_display_simple_hello_world(display: DisplayFixture): - @reactpy.component - def Hello(): - return reactpy.html.p({"id": "hello"}, ["Hello World"]) - - await display.show(Hello) - - await display.page.wait_for_selector("#hello") - - -async def test_pre_tags_are_rendered_correctly(display: DisplayFixture): - @reactpy.component - def PreFormatted(): - return reactpy.html.pre( - {"id": "pre-form-test"}, - reactpy.html.span("this", reactpy.html.span("is"), "some"), - "pre-formatted", - " text", - ) - - await display.show(PreFormatted) - - pre = await display.page.wait_for_selector("#pre-form-test") - - assert ( - await pre.evaluate("node => node.innerHTML") - ) == "<span>this<span>is</span>some</span>pre-formatted text" diff --git a/src/py/reactpy/tests/test_core/test_events.py b/src/py/reactpy/tests/test_core/test_events.py deleted file mode 100644 index 237c9d4ed..000000000 --- a/src/py/reactpy/tests/test_core/test_events.py +++ /dev/null @@ -1,223 +0,0 @@ -import pytest - -import reactpy -from reactpy.core.events import ( - EventHandler, - merge_event_handler_funcs, - merge_event_handlers, - to_event_handler_function, -) -from reactpy.testing import DisplayFixture, poll -from tests.tooling.common import DEFAULT_TYPE_DELAY - - -def test_event_handler_repr(): - handler = EventHandler(lambda: None) - assert repr(handler) == ( - f"EventHandler(function={handler.function}, prevent_default=False, " - f"stop_propagation=False, target={handler.target!r})" - ) - - -def test_event_handler_props(): - handler_0 = EventHandler(lambda data: None) - assert handler_0.stop_propagation is False - assert handler_0.prevent_default is False - assert handler_0.target is None - - handler_1 = EventHandler(lambda data: None, prevent_default=True) - assert handler_1.stop_propagation is False - assert handler_1.prevent_default is True - assert handler_1.target is None - - handler_2 = EventHandler(lambda data: None, stop_propagation=True) - assert handler_2.stop_propagation is True - assert handler_2.prevent_default is False - assert handler_2.target is None - - handler_3 = EventHandler(lambda data: None, target="123") - assert handler_3.stop_propagation is False - assert handler_3.prevent_default is False - assert handler_3.target == "123" - - -def test_event_handler_equivalence(): - async def func(data): - return None - - assert EventHandler(func) == EventHandler(func) - - assert EventHandler(lambda data: None) != EventHandler(lambda data: None) - - assert EventHandler(func, stop_propagation=True) != EventHandler( - func, stop_propagation=False - ) - - assert EventHandler(func, prevent_default=True) != EventHandler( - func, prevent_default=False - ) - - assert EventHandler(func, target="123") != EventHandler(func, target="456") - - -async def test_to_event_handler_function(): - call_args = reactpy.Ref(None) - - async def coro(*args): - call_args.current = args - - def func(*args): - call_args.current = args - - await to_event_handler_function(coro, positional_args=True)([1, 2, 3]) - assert call_args.current == (1, 2, 3) - - await to_event_handler_function(func, positional_args=True)([1, 2, 3]) - assert call_args.current == (1, 2, 3) - - await to_event_handler_function(coro, positional_args=False)([1, 2, 3]) - assert call_args.current == ([1, 2, 3],) - - await to_event_handler_function(func, positional_args=False)([1, 2, 3]) - assert call_args.current == ([1, 2, 3],) - - -async def test_merge_event_handler_empty_list(): - with pytest.raises(ValueError, match="No event handlers to merge"): - merge_event_handlers([]) - - -@pytest.mark.parametrize( - "kwargs_1, kwargs_2", - [ - ({"stop_propagation": True}, {"stop_propagation": False}), - ({"prevent_default": True}, {"prevent_default": False}), - ({"target": "this"}, {"target": "that"}), - ], -) -async def test_merge_event_handlers_raises_on_mismatch(kwargs_1, kwargs_2): - def func(data): - return None - - with pytest.raises(ValueError, match="Cannot merge handlers"): - merge_event_handlers( - [ - EventHandler(func, **kwargs_1), - EventHandler(func, **kwargs_2), - ] - ) - - -async def test_merge_event_handlers(): - handler = EventHandler(lambda data: None) - assert merge_event_handlers([handler]) is handler - - calls = [] - merged_handler = merge_event_handlers( - [ - EventHandler(lambda data: calls.append("first")), - EventHandler(lambda data: calls.append("second")), - ] - ) - await merged_handler.function({}) - assert calls == ["first", "second"] - - -def test_merge_event_handler_funcs_empty_list(): - with pytest.raises(ValueError, match="No event handler functions to merge"): - merge_event_handler_funcs([]) - - -async def test_merge_event_handler_funcs(): - calls = [] - - async def some_func(data): - calls.append("some_func") - - async def some_other_func(data): - calls.append("some_other_func") - - assert merge_event_handler_funcs([some_func]) is some_func - - merged_handler = merge_event_handler_funcs([some_func, some_other_func]) - await merged_handler([]) - assert calls == ["some_func", "some_other_func"] - - -async def test_can_prevent_event_default_operation(display: DisplayFixture): - @reactpy.component - def Input(): - @reactpy.event(prevent_default=True) - async def on_key_down(value): - pass - - return reactpy.html.input({"on_key_down": on_key_down, "id": "input"}) - - await display.show(Input) - - inp = await display.page.wait_for_selector("#input") - await inp.type("hello", delay=DEFAULT_TYPE_DELAY) - # the default action of updating the element's value did not take place - assert (await inp.evaluate("node => node.value")) == "" - - -async def test_simple_click_event(display: DisplayFixture): - @reactpy.component - def Button(): - clicked, set_clicked = reactpy.hooks.use_state(False) - - async def on_click(event): - set_clicked(True) - - if not clicked: - return reactpy.html.button( - {"on_click": on_click, "id": "click"}, ["Click Me!"] - ) - else: - return reactpy.html.p({"id": "complete"}, ["Complete"]) - - await display.show(Button) - - button = await display.page.wait_for_selector("#click") - await button.click() - await display.page.wait_for_selector("#complete") - - -async def test_can_stop_event_propagation(display: DisplayFixture): - clicked = reactpy.Ref(False) - - @reactpy.component - def DivInDiv(): - @reactpy.event(stop_propagation=True) - def inner_click_no_op(event): - clicked.current = True - - def outer_click_is_not_triggered(event): - raise AssertionError() - - outer = reactpy.html.div( - { - "style": {"height": "35px", "width": "35px", "background_color": "red"}, - "on_click": outer_click_is_not_triggered, - "id": "outer", - }, - reactpy.html.div( - { - "style": { - "height": "30px", - "width": "30px", - "background_color": "blue", - }, - "on_click": inner_click_no_op, - "id": "inner", - } - ), - ) - return outer - - await display.show(DivInDiv) - - inner = await display.page.wait_for_selector("#inner") - await inner.click() - - await poll(lambda: clicked.current).until_is(True) diff --git a/src/py/reactpy/tests/test_core/test_hooks.py b/src/py/reactpy/tests/test_core/test_hooks.py deleted file mode 100644 index 453d07c99..000000000 --- a/src/py/reactpy/tests/test_core/test_hooks.py +++ /dev/null @@ -1,1259 +0,0 @@ -import asyncio - -import pytest - -import reactpy -from reactpy import html -from reactpy.config import REACTPY_DEBUG_MODE -from reactpy.core.hooks import ( - COMPONENT_DID_RENDER_EFFECT, - LifeCycleHook, - current_hook, - strictly_equal, -) -from reactpy.core.layout import Layout -from reactpy.testing import DisplayFixture, HookCatcher, assert_reactpy_did_log, poll -from reactpy.testing.logs import assert_reactpy_did_not_log -from reactpy.utils import Ref -from tests.tooling.common import DEFAULT_TYPE_DELAY, update_message - - -async def test_must_be_rendering_in_layout_to_use_hooks(): - @reactpy.component - def SimpleComponentWithHook(): - reactpy.hooks.use_state(None) - return reactpy.html.div() - - with pytest.raises(RuntimeError, match="No life cycle hook is active"): - await SimpleComponentWithHook().render() - - async with reactpy.Layout(SimpleComponentWithHook()) as layout: - await layout.render() - - -async def test_simple_stateful_component(): - @reactpy.component - def SimpleStatefulComponent(): - index, set_index = reactpy.hooks.use_state(0) - set_index(index + 1) - return reactpy.html.div(index) - - sse = SimpleStatefulComponent() - - async with reactpy.Layout(sse) as layout: - update_1 = await layout.render() - assert update_1 == update_message( - path="", - model={ - "tagName": "", - "children": [{"tagName": "div", "children": ["0"]}], - }, - ) - - update_2 = await layout.render() - assert update_2 == update_message( - path="", - model={ - "tagName": "", - "children": [{"tagName": "div", "children": ["1"]}], - }, - ) - - update_3 = await layout.render() - assert update_3 == update_message( - path="", - model={ - "tagName": "", - "children": [{"tagName": "div", "children": ["2"]}], - }, - ) - - -async def test_set_state_callback_identity_is_preserved(): - saved_set_state_hooks = [] - - @reactpy.component - def SimpleStatefulComponent(): - index, set_index = reactpy.hooks.use_state(0) - saved_set_state_hooks.append(set_index) - set_index(index + 1) - return reactpy.html.div(index) - - sse = SimpleStatefulComponent() - - async with reactpy.Layout(sse) as layout: - await layout.render() - await layout.render() - await layout.render() - await layout.render() - - first_hook = saved_set_state_hooks[0] - for h in saved_set_state_hooks[1:]: - assert first_hook is h - - -async def test_use_state_with_constructor(): - constructor_call_count = reactpy.Ref(0) - - set_outer_state = reactpy.Ref() - set_inner_key = reactpy.Ref() - set_inner_state = reactpy.Ref() - - def make_default(): - constructor_call_count.current += 1 - return 0 - - @reactpy.component - def Outer(): - state, set_outer_state.current = reactpy.use_state(0) - inner_key, set_inner_key.current = reactpy.use_state("first") - return reactpy.html.div(state, Inner(key=inner_key)) - - @reactpy.component - def Inner(): - state, set_inner_state.current = reactpy.use_state(make_default) - return reactpy.html.div(state) - - async with reactpy.Layout(Outer()) as layout: - await layout.render() - - assert constructor_call_count.current == 1 - - set_outer_state.current(1) - await layout.render() - - assert constructor_call_count.current == 1 - - set_inner_state.current(1) - await layout.render() - - assert constructor_call_count.current == 1 - - set_inner_key.current("second") - await layout.render() - - assert constructor_call_count.current == 2 - - -async def test_set_state_with_reducer_instead_of_value(): - count = reactpy.Ref() - set_count = reactpy.Ref() - - def increment(count): - return count + 1 - - @reactpy.component - def Counter(): - count.current, set_count.current = reactpy.hooks.use_state(0) - return reactpy.html.div(count.current) - - async with reactpy.Layout(Counter()) as layout: - await layout.render() - - for i in range(4): - assert count.current == i - set_count.current(increment) - await layout.render() - - -async def test_set_state_checks_identity_not_equality(display: DisplayFixture): - r_1 = reactpy.Ref("value") - r_2 = reactpy.Ref("value") - - # refs are equal but not identical - assert r_1 == r_2 - assert r_1 is not r_2 - - render_count = reactpy.Ref(0) - event_count = reactpy.Ref(0) - - def event_count_tracker(function): - def tracker(*args, **kwargs): - event_count.current += 1 - return function(*args, **kwargs) - - return tracker - - @reactpy.component - def TestComponent(): - state, set_state = reactpy.hooks.use_state(r_1) - - render_count.current += 1 - return reactpy.html.div( - reactpy.html.button( - { - "id": "r_1", - "on_click": event_count_tracker(lambda event: set_state(r_1)), - }, - "r_1", - ), - reactpy.html.button( - { - "id": "r_2", - "on_click": event_count_tracker(lambda event: set_state(r_2)), - }, - "r_2", - ), - f"Last state: {'r_1' if state is r_1 else 'r_2'}", - ) - - await display.show(TestComponent) - - client_r_1_button = await display.page.wait_for_selector("#r_1") - client_r_2_button = await display.page.wait_for_selector("#r_2") - - poll_event_count = poll(lambda: event_count.current) - poll_render_count = poll(lambda: render_count.current) - - assert render_count.current == 1 - assert event_count.current == 0 - - await client_r_1_button.click() - - await poll_event_count.until_equals(1) - await poll_render_count.until_equals(1) - - await client_r_2_button.click() - - await poll_event_count.until_equals(2) - await poll_render_count.until_equals(2) - - await client_r_2_button.click() - - await poll_event_count.until_equals(3) - await poll_render_count.until_equals(2) - - -async def test_simple_input_with_use_state(display: DisplayFixture): - message_ref = reactpy.Ref(None) - - @reactpy.component - def Input(message=None): - message, set_message = reactpy.hooks.use_state(message) - message_ref.current = message - - async def on_change(event): - if event["target"]["value"] == "this is a test": - set_message(event["target"]["value"]) - - if message is None: - return reactpy.html.input({"id": "input", "on_change": on_change}) - else: - return reactpy.html.p({"id": "complete"}, ["Complete"]) - - await display.show(Input) - - button = await display.page.wait_for_selector("#input") - await button.type("this is a test", delay=DEFAULT_TYPE_DELAY) - await display.page.wait_for_selector("#complete") - - assert message_ref.current == "this is a test" - - -async def test_double_set_state(display: DisplayFixture): - @reactpy.component - def SomeComponent(): - state_1, set_state_1 = reactpy.hooks.use_state(0) - state_2, set_state_2 = reactpy.hooks.use_state(0) - - def double_set_state(event): - set_state_1(state_1 + 1) - set_state_2(state_2 + 1) - - return reactpy.html.div( - reactpy.html.div( - {"id": "first", "data-value": state_1}, f"value is: {state_1}" - ), - reactpy.html.div( - {"id": "second", "data-value": state_2}, f"value is: {state_2}" - ), - reactpy.html.button( - {"id": "button", "on_click": double_set_state}, "click me" - ), - ) - - await display.show(SomeComponent) - - button = await display.page.wait_for_selector("#button") - first = await display.page.wait_for_selector("#first") - second = await display.page.wait_for_selector("#second") - - assert (await first.get_attribute("data-value")) == "0" - assert (await second.get_attribute("data-value")) == "0" - - await button.click() - - assert (await first.get_attribute("data-value")) == "1" - assert (await second.get_attribute("data-value")) == "1" - - await button.click() - - assert (await first.get_attribute("data-value")) == "2" - assert (await second.get_attribute("data-value")) == "2" - - -async def test_use_effect_callback_occurs_after_full_render_is_complete(): - effect_triggered = reactpy.Ref(False) - effect_triggers_after_final_render = reactpy.Ref(None) - - @reactpy.component - def OuterComponent(): - return reactpy.html.div( - ComponentWithEffect(), - CheckNoEffectYet(), - ) - - @reactpy.component - def ComponentWithEffect(): - @reactpy.hooks.use_effect - def effect(): - effect_triggered.current = True - - return reactpy.html.div() - - @reactpy.component - def CheckNoEffectYet(): - effect_triggers_after_final_render.current = not effect_triggered.current - return reactpy.html.div() - - async with reactpy.Layout(OuterComponent()) as layout: - await layout.render() - - assert effect_triggered.current - assert effect_triggers_after_final_render.current is not None - assert effect_triggers_after_final_render.current - - -async def test_use_effect_cleanup_occurs_before_next_effect(): - component_hook = HookCatcher() - cleanup_triggered = reactpy.Ref(False) - cleanup_triggered_before_next_effect = reactpy.Ref(False) - - @reactpy.component - @component_hook.capture - def ComponentWithEffect(): - @reactpy.hooks.use_effect(dependencies=None) - def effect(): - if cleanup_triggered.current: - cleanup_triggered_before_next_effect.current = True - - def cleanup(): - cleanup_triggered.current = True - - return cleanup - - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithEffect()) as layout: - await layout.render() - - assert not cleanup_triggered.current - - component_hook.latest.schedule_render() - await layout.render() - - assert cleanup_triggered.current - assert cleanup_triggered_before_next_effect.current - - -async def test_use_effect_cleanup_occurs_on_will_unmount(): - set_key = reactpy.Ref() - component_did_render = reactpy.Ref(False) - cleanup_triggered = reactpy.Ref(False) - cleanup_triggered_before_next_render = reactpy.Ref(False) - - @reactpy.component - def OuterComponent(): - key, set_key.current = reactpy.use_state("first") - return ComponentWithEffect(key=key) - - @reactpy.component - def ComponentWithEffect(): - if component_did_render.current and cleanup_triggered.current: - cleanup_triggered_before_next_render.current = True - - component_did_render.current = True - - @reactpy.hooks.use_effect - def effect(): - def cleanup(): - cleanup_triggered.current = True - - return cleanup - - return reactpy.html.div() - - async with reactpy.Layout(OuterComponent()) as layout: - await layout.render() - - assert not cleanup_triggered.current - - set_key.current("second") - await layout.render() - - assert cleanup_triggered.current - assert cleanup_triggered_before_next_render.current - - -async def test_memoized_effect_on_recreated_if_dependencies_change(): - component_hook = HookCatcher() - set_state_callback = reactpy.Ref(None) - effect_run_count = reactpy.Ref(0) - - first_value = 1 - second_value = 2 - - @reactpy.component - @component_hook.capture - def ComponentWithMemoizedEffect(): - state, set_state_callback.current = reactpy.hooks.use_state(first_value) - - @reactpy.hooks.use_effect(dependencies=[state]) - def effect(): - effect_run_count.current += 1 - - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithMemoizedEffect()) as layout: - await layout.render() - - assert effect_run_count.current == 1 - - component_hook.latest.schedule_render() - await layout.render() - - assert effect_run_count.current == 1 - - set_state_callback.current(second_value) - await layout.render() - - assert effect_run_count.current == 2 - - component_hook.latest.schedule_render() - await layout.render() - - assert effect_run_count.current == 2 - - -async def test_memoized_effect_cleanup_only_triggered_before_new_effect(): - component_hook = HookCatcher() - set_state_callback = reactpy.Ref(None) - cleanup_trigger_count = reactpy.Ref(0) - - first_value = 1 - second_value = 2 - - @reactpy.component - @component_hook.capture - def ComponentWithEffect(): - state, set_state_callback.current = reactpy.hooks.use_state(first_value) - - @reactpy.hooks.use_effect(dependencies=[state]) - def effect(): - def cleanup(): - cleanup_trigger_count.current += 1 - - return cleanup - - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithEffect()) as layout: - await layout.render() - - assert cleanup_trigger_count.current == 0 - - component_hook.latest.schedule_render() - await layout.render() - - assert cleanup_trigger_count.current == 0 - - set_state_callback.current(second_value) - await layout.render() - - assert cleanup_trigger_count.current == 1 - - -async def test_use_async_effect(): - effect_ran = asyncio.Event() - - @reactpy.component - def ComponentWithAsyncEffect(): - @reactpy.hooks.use_effect - async def effect(): - effect_ran.set() - - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithAsyncEffect()) as layout: - await layout.render() - await asyncio.wait_for(effect_ran.wait(), 1) - - -async def test_use_async_effect_cleanup(): - component_hook = HookCatcher() - effect_ran = asyncio.Event() - cleanup_ran = asyncio.Event() - - @reactpy.component - @component_hook.capture - def ComponentWithAsyncEffect(): - @reactpy.hooks.use_effect(dependencies=None) # force this to run every time - async def effect(): - effect_ran.set() - return cleanup_ran.set - - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithAsyncEffect()) as layout: - await layout.render() - - component_hook.latest.schedule_render() - - await layout.render() - - await asyncio.wait_for(cleanup_ran.wait(), 1) - - -async def test_use_async_effect_cancel(caplog): - component_hook = HookCatcher() - effect_ran = asyncio.Event() - effect_was_cancelled = asyncio.Event() - - event_that_never_occurs = asyncio.Event() - - @reactpy.component - @component_hook.capture - def ComponentWithLongWaitingEffect(): - @reactpy.hooks.use_effect(dependencies=None) # force this to run every time - async def effect(): - effect_ran.set() - try: - await event_that_never_occurs.wait() - except asyncio.CancelledError: - effect_was_cancelled.set() - raise - - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithLongWaitingEffect()) as layout: - await layout.render() - - await effect_ran.wait() - component_hook.latest.schedule_render() - - await layout.render() - - await asyncio.wait_for(effect_was_cancelled.wait(), 1) - - # So I know we said the event never occurs but... to ensure the effect's future is - # cancelled before the test is cleaned up we need to set the event. This is because - # the cancellation doesn't propagate before the test is resolved which causes - # delayed log messages that impact other tests. - event_that_never_occurs.set() - - -async def test_error_in_effect_is_gracefully_handled(caplog): - @reactpy.component - def ComponentWithEffect(): - @reactpy.hooks.use_effect - def bad_effect(): - msg = "Something went wong :(" - raise ValueError(msg) - - return reactpy.html.div() - - with assert_reactpy_did_log(match_message=r"Layout post-render effect .* failed"): - async with reactpy.Layout(ComponentWithEffect()) as layout: - await layout.render() # no error - - -async def test_error_in_effect_pre_unmount_cleanup_is_gracefully_handled(): - set_key = reactpy.Ref() - - @reactpy.component - def OuterComponent(): - key, set_key.current = reactpy.use_state("first") - return ComponentWithEffect(key=key) - - @reactpy.component - def ComponentWithEffect(): - @reactpy.hooks.use_effect - def ok_effect(): - def bad_cleanup(): - msg = "Something went wong :(" - raise ValueError(msg) - - return bad_cleanup - - return reactpy.html.div() - - with assert_reactpy_did_log( - match_message=r"Pre-unmount effect .*? failed", - error_type=ValueError, - ): - async with reactpy.Layout(OuterComponent()) as layout: - await layout.render() - set_key.current("second") - await layout.render() # no error - - -async def test_use_reducer(): - saved_count = reactpy.Ref(None) - saved_dispatch = reactpy.Ref(None) - - def reducer(count, action): - if action == "increment": - return count + 1 - elif action == "decrement": - return count - 1 - else: - msg = f"Unknown action '{action}'" - raise ValueError(msg) - - @reactpy.component - def Counter(initial_count): - saved_count.current, saved_dispatch.current = reactpy.hooks.use_reducer( - reducer, initial_count - ) - return reactpy.html.div() - - async with reactpy.Layout(Counter(0)) as layout: - await layout.render() - - assert saved_count.current == 0 - - saved_dispatch.current("increment") - await layout.render() - - assert saved_count.current == 1 - - saved_dispatch.current("decrement") - await layout.render() - - assert saved_count.current == 0 - - -async def test_use_reducer_dispatch_callback_identity_is_preserved(): - saved_dispatchers = [] - - def reducer(count, action): - if action == "increment": - return count + 1 - else: - msg = f"Unknown action '{action}'" - raise ValueError(msg) - - @reactpy.component - def ComponentWithUseReduce(): - saved_dispatchers.append(reactpy.hooks.use_reducer(reducer, 0)[1]) - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithUseReduce()) as layout: - for _ in range(3): - await layout.render() - saved_dispatchers[-1]("increment") - - first_dispatch = saved_dispatchers[0] - for d in saved_dispatchers[1:]: - assert first_dispatch is d - - -async def test_use_callback_identity(): - component_hook = HookCatcher() - used_callbacks = [] - - @reactpy.component - @component_hook.capture - def ComponentWithRef(): - used_callbacks.append(reactpy.hooks.use_callback(lambda: None)) - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithRef()) as layout: - await layout.render() - component_hook.latest.schedule_render() - await layout.render() - - assert used_callbacks[0] is used_callbacks[1] - assert len(used_callbacks) == 2 - - -async def test_use_callback_memoization(): - component_hook = HookCatcher() - set_state_hook = reactpy.Ref(None) - used_callbacks = [] - - @reactpy.component - @component_hook.capture - def ComponentWithRef(): - state, set_state_hook.current = reactpy.hooks.use_state(0) - - @reactpy.hooks.use_callback( - dependencies=[state] - ) # use the deco form for coverage - def cb(): - return None - - used_callbacks.append(cb) - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithRef()) as layout: - await layout.render() - set_state_hook.current(1) - await layout.render() - component_hook.latest.schedule_render() - await layout.render() - - assert used_callbacks[0] is not used_callbacks[1] - assert used_callbacks[1] is used_callbacks[2] - assert len(used_callbacks) == 3 - - -async def test_use_memo(): - component_hook = HookCatcher() - set_state_hook = reactpy.Ref(None) - used_values = [] - - @reactpy.component - @component_hook.capture - def ComponentWithMemo(): - state, set_state_hook.current = reactpy.hooks.use_state(0) - value = reactpy.hooks.use_memo( - lambda: reactpy.Ref( - state - ), # use a Ref here just to ensure it's a unique obj - [state], - ) - used_values.append(value) - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithMemo()) as layout: - await layout.render() - set_state_hook.current(1) - await layout.render() - component_hook.latest.schedule_render() - await layout.render() - - assert used_values[0] is not used_values[1] - assert used_values[1] is used_values[2] - assert len(used_values) == 3 - - -async def test_use_memo_always_runs_if_dependencies_are_none(): - component_hook = HookCatcher() - used_values = [] - - iter_values = iter([1, 2, 3]) - - @reactpy.component - @component_hook.capture - def ComponentWithMemo(): - value = reactpy.hooks.use_memo(lambda: next(iter_values), dependencies=None) - used_values.append(value) - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithMemo()) as layout: - await layout.render() - component_hook.latest.schedule_render() - await layout.render() - component_hook.latest.schedule_render() - await layout.render() - - assert used_values == [1, 2, 3] - - -async def test_use_memo_with_stored_deps_is_empty_tuple_after_deps_are_none(): - component_hook = HookCatcher() - used_values = [] - - iter_values = iter([1, 2, 3]) - deps_used_in_memo = reactpy.Ref(()) - - @reactpy.component - @component_hook.capture - def ComponentWithMemo(): - value = reactpy.hooks.use_memo( - lambda: next(iter_values), - deps_used_in_memo.current, - ) - used_values.append(value) - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithMemo()) as layout: - await layout.render() - component_hook.latest.schedule_render() - deps_used_in_memo.current = None - await layout.render() - component_hook.latest.schedule_render() - deps_used_in_memo.current = () - await layout.render() - - assert used_values == [1, 2, 2] - - -async def test_use_memo_never_runs_if_deps_is_empty_list(): - component_hook = HookCatcher() - used_values = [] - - iter_values = iter([1, 2, 3]) - - @reactpy.component - @component_hook.capture - def ComponentWithMemo(): - value = reactpy.hooks.use_memo(lambda: next(iter_values), ()) - used_values.append(value) - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithMemo()) as layout: - await layout.render() - component_hook.latest.schedule_render() - await layout.render() - component_hook.latest.schedule_render() - await layout.render() - - assert used_values == [1, 1, 1] - - -async def test_use_ref(): - component_hook = HookCatcher() - used_refs = [] - - @reactpy.component - @component_hook.capture - def ComponentWithRef(): - used_refs.append(reactpy.hooks.use_ref(1)) - return reactpy.html.div() - - async with reactpy.Layout(ComponentWithRef()) as layout: - await layout.render() - component_hook.latest.schedule_render() - await layout.render() - - assert used_refs[0] is used_refs[1] - assert len(used_refs) == 2 - - -def test_bad_schedule_render_callback(): - def bad_callback(): - msg = "something went wrong" - raise ValueError(msg) - - with assert_reactpy_did_log( - match_message=f"Failed to schedule render via {bad_callback}" - ): - LifeCycleHook(bad_callback).schedule_render() - - -async def test_use_effect_automatically_infers_closure_values(): - set_count = reactpy.Ref() - did_effect = asyncio.Event() - - @reactpy.component - def CounterWithEffect(): - count, set_count.current = reactpy.hooks.use_state(0) - - @reactpy.hooks.use_effect - def some_effect_that_uses_count(): - """should automatically trigger on count change""" - _ = count # use count in this closure - did_effect.set() - - return reactpy.html.div() - - async with reactpy.Layout(CounterWithEffect()) as layout: - await layout.render() - await did_effect.wait() - did_effect.clear() - - for i in range(1, 3): - set_count.current(i) - await layout.render() - await did_effect.wait() - did_effect.clear() - - -async def test_use_memo_automatically_infers_closure_values(): - set_count = reactpy.Ref() - did_memo = asyncio.Event() - - @reactpy.component - def CounterWithEffect(): - count, set_count.current = reactpy.hooks.use_state(0) - - @reactpy.hooks.use_memo - def some_memo_func_that_uses_count(): - """should automatically trigger on count change""" - _ = count # use count in this closure - did_memo.set() - - return reactpy.html.div() - - async with reactpy.Layout(CounterWithEffect()) as layout: - await layout.render() - await did_memo.wait() - did_memo.clear() - - for i in range(1, 3): - set_count.current(i) - await layout.render() - await did_memo.wait() - did_memo.clear() - - -async def test_use_context_default_value(): - Context = reactpy.create_context("something") - value = reactpy.Ref() - - @reactpy.component - def ComponentProvidesContext(): - return Context(ComponentUsesContext()) - - @reactpy.component - def ComponentUsesContext(): - value.current = reactpy.use_context(Context) - return html.div() - - async with reactpy.Layout(ComponentProvidesContext()) as layout: - await layout.render() - assert value.current == "something" - - @reactpy.component - def ComponentUsesContext2(): - value.current = reactpy.use_context(Context) - return html.div() - - async with reactpy.Layout(ComponentUsesContext2()) as layout: - await layout.render() - assert value.current == "something" - - -def test_context_repr(): - sample_context = reactpy.create_context(None) - assert repr(sample_context()) == f"ContextProvider({sample_context})" - - -async def test_use_context_updates_components_even_if_memoized(): - Context = reactpy.create_context(None) - - value = reactpy.Ref(None) - render_count = reactpy.Ref(0) - set_state = reactpy.Ref() - - @reactpy.component - def ComponentProvidesContext(): - state, set_state.current = reactpy.use_state(0) - return Context(ComponentInContext(), value=state) - - @reactpy.component - def ComponentInContext(): - return reactpy.use_memo(MemoizedComponentUsesContext) - - @reactpy.component - def MemoizedComponentUsesContext(): - value.current = reactpy.use_context(Context) - render_count.current += 1 - return html.div() - - async with reactpy.Layout(ComponentProvidesContext()) as layout: - await layout.render() - assert render_count.current == 1 - assert value.current == 0 - - set_state.current(1) - - await layout.render() - assert render_count.current == 2 - assert value.current == 1 - - set_state.current(2) - - await layout.render() - assert render_count.current == 3 - assert value.current == 2 - - -async def test_context_values_are_scoped(): - Context = reactpy.create_context(None) - - @reactpy.component - def Parent(): - return html._( - Context(Context(Child1(), value=1), value="something-else"), - Context(Child2(), value=2), - ) - - @reactpy.component - def Child1(): - assert reactpy.use_context(Context) == 1 - - @reactpy.component - def Child2(): - assert reactpy.use_context(Context) == 2 - - async with Layout(Parent()) as layout: - await layout.render() - - -async def test_error_in_layout_effect_cleanup_is_gracefully_handled(): - component_hook = HookCatcher() - - @reactpy.component - @component_hook.capture - def ComponentWithEffect(): - @reactpy.hooks.use_effect(dependencies=None) # always run - def bad_effect(): - msg = "The error message" - raise ValueError(msg) - - return reactpy.html.div() - - with assert_reactpy_did_log( - match_message=r"post-render effect .*? failed", - error_type=ValueError, - match_error="The error message", - ): - async with reactpy.Layout(ComponentWithEffect()) as layout: - await layout.render() - component_hook.latest.schedule_render() - await layout.render() # no error - - -async def test_set_state_during_render(): - render_count = Ref(0) - - @reactpy.component - def SetStateDuringRender(): - render_count.current += 1 - state, set_state = reactpy.use_state(0) - if not state: - set_state(state + 1) - return html.div(state) - - async with Layout(SetStateDuringRender()) as layout: - await layout.render() - assert render_count.current == 1 - await layout.render() - assert render_count.current == 2 - - # there should be no more renders to perform - with pytest.raises(asyncio.TimeoutError): - await asyncio.wait_for(layout.render(), timeout=0.1) - - -@pytest.mark.skipif(not REACTPY_DEBUG_MODE.current, reason="only logs in debug mode") -async def test_use_debug_mode(): - set_message = reactpy.Ref() - component_hook = HookCatcher() - - @reactpy.component - @component_hook.capture - def SomeComponent(): - message, set_message.current = reactpy.use_state("hello") - reactpy.use_debug_value(f"message is {message!r}") - return reactpy.html.div() - - async with reactpy.Layout(SomeComponent()) as layout: - with assert_reactpy_did_log(r"SomeComponent\(.*?\) message is 'hello'"): - await layout.render() - - set_message.current("bye") - - with assert_reactpy_did_log(r"SomeComponent\(.*?\) message is 'bye'"): - await layout.render() - - component_hook.latest.schedule_render() - - with assert_reactpy_did_not_log(r"SomeComponent\(.*?\) message is 'bye'"): - await layout.render() - - -@pytest.mark.skipif(not REACTPY_DEBUG_MODE.current, reason="only logs in debug mode") -async def test_use_debug_mode_with_factory(): - set_message = reactpy.Ref() - component_hook = HookCatcher() - - @reactpy.component - @component_hook.capture - def SomeComponent(): - message, set_message.current = reactpy.use_state("hello") - reactpy.use_debug_value(lambda: f"message is {message!r}") - return reactpy.html.div() - - async with reactpy.Layout(SomeComponent()) as layout: - with assert_reactpy_did_log(r"SomeComponent\(.*?\) message is 'hello'"): - await layout.render() - - set_message.current("bye") - - with assert_reactpy_did_log(r"SomeComponent\(.*?\) message is 'bye'"): - await layout.render() - - component_hook.latest.schedule_render() - - with assert_reactpy_did_not_log(r"SomeComponent\(.*?\) message is 'bye'"): - await layout.render() - - -@pytest.mark.skipif(REACTPY_DEBUG_MODE.current, reason="logs in debug mode") -async def test_use_debug_mode_does_not_log_if_not_in_debug_mode(): - set_message = reactpy.Ref() - - @reactpy.component - def SomeComponent(): - message, set_message.current = reactpy.use_state("hello") - reactpy.use_debug_value(lambda: f"message is {message!r}") - return reactpy.html.div() - - async with reactpy.Layout(SomeComponent()) as layout: - with assert_reactpy_did_not_log(r"SomeComponent\(.*?\) message is 'hello'"): - await layout.render() - - set_message.current("bye") - - with assert_reactpy_did_not_log(r"SomeComponent\(.*?\) message is 'bye'"): - await layout.render() - - -async def test_conditionally_rendered_components_can_use_context(): - set_state = reactpy.Ref() - used_context_values = [] - some_context = reactpy.create_context(None) - - @reactpy.component - def SomeComponent(): - state, set_state.current = reactpy.use_state(True) - if state: - return FirstCondition() - else: - return SecondCondition() - - @reactpy.component - def FirstCondition(): - used_context_values.append(reactpy.use_context(some_context) + "-1") - - @reactpy.component - def SecondCondition(): - used_context_values.append(reactpy.use_context(some_context) + "-2") - - async with reactpy.Layout( - some_context(SomeComponent(), value="the-value") - ) as layout: - await layout.render() - assert used_context_values == ["the-value-1"] - set_state.current(False) - await layout.render() - assert used_context_values == ["the-value-1", "the-value-2"] - - -@pytest.mark.parametrize( - "x, y, result", - [ - ("text", "text", True), - ("text", "not-text", False), - (b"text", b"text", True), - (b"text", b"not-text", False), - (bytearray([1, 2, 3]), bytearray([1, 2, 3]), True), - (bytearray([1, 2, 3]), bytearray([1, 2, 3, 4]), False), - (1.0, 1.0, True), - (1.0, 2.0, False), - (1j, 1j, True), - (1j, 2j, False), - # ints less than 5 and greater than 256 are always identical - (-100000, -100000, True), - (100000, 100000, True), - (123, 456, False), - ], -) -def test_strictly_equal(x, y, result): - assert strictly_equal(x, y) is result - - -STRICT_EQUALITY_VALUE_CONSTRUCTORS = [ - lambda: "string-text", - lambda: b"byte-text", - lambda: bytearray([1, 2, 3]), - lambda: bytearray([1, 2, 3]), - lambda: 1.0, - lambda: 10000000, - lambda: 1j, -] - - -@pytest.mark.parametrize("get_value", STRICT_EQUALITY_VALUE_CONSTRUCTORS) -async def test_use_state_compares_with_strict_equality(get_value): - render_count = reactpy.Ref(0) - set_state = reactpy.Ref() - - @reactpy.component - def SomeComponent(): - _, set_state.current = reactpy.use_state(get_value()) - render_count.current += 1 - - async with reactpy.Layout(SomeComponent()) as layout: - await layout.render() - assert render_count.current == 1 - set_state.current(get_value()) - with pytest.raises(asyncio.TimeoutError): - await asyncio.wait_for(layout.render(), timeout=0.1) - - -@pytest.mark.parametrize("get_value", STRICT_EQUALITY_VALUE_CONSTRUCTORS) -async def test_use_effect_compares_with_strict_equality(get_value): - effect_count = reactpy.Ref(0) - value = reactpy.Ref("string") - hook = HookCatcher() - - @reactpy.component - @hook.capture - def SomeComponent(): - @reactpy.use_effect(dependencies=[value.current]) - def incr_effect_count(): - effect_count.current += 1 - - async with reactpy.Layout(SomeComponent()) as layout: - await layout.render() - assert effect_count.current == 1 - value.current = "string" # new string instance but same value - hook.latest.schedule_render() - await layout.render() - # effect does not trigger - assert effect_count.current == 1 - - -async def test_use_state_named_tuple(): - state = reactpy.Ref() - - @reactpy.component - def some_component(): - state.current = reactpy.use_state(1) - - async with reactpy.Layout(some_component()) as layout: - await layout.render() - assert state.current.value == 1 - state.current.set_value(2) - await layout.render() - assert state.current.value == 2 - - -async def test_error_in_component_effect_cleanup_is_gracefully_handled(): - component_hook = HookCatcher() - - @reactpy.component - @component_hook.capture - def ComponentWithEffect(): - hook = current_hook() - - def bad_effect(): - raise ValueError("The error message") - - hook.add_effect(COMPONENT_DID_RENDER_EFFECT, bad_effect) - return reactpy.html.div() - - with assert_reactpy_did_log( - match_message="Component post-render effect .*? failed", - error_type=ValueError, - match_error="The error message", - ): - async with reactpy.Layout(ComponentWithEffect()) as layout: - await layout.render() - component_hook.latest.schedule_render() - await layout.render() # no error diff --git a/src/py/reactpy/tests/test_core/test_layout.py b/src/py/reactpy/tests/test_core/test_layout.py deleted file mode 100644 index d2e1a8099..000000000 --- a/src/py/reactpy/tests/test_core/test_layout.py +++ /dev/null @@ -1,1192 +0,0 @@ -import asyncio -import gc -import random -import re -from weakref import finalize -from weakref import ref as weakref - -import pytest - -import reactpy -from reactpy import html -from reactpy.config import REACTPY_DEBUG_MODE -from reactpy.core.component import component -from reactpy.core.hooks import use_effect, use_state -from reactpy.core.layout import Layout -from reactpy.testing import ( - HookCatcher, - StaticEventHandler, - assert_reactpy_did_log, - capture_reactpy_logs, -) -from reactpy.utils import Ref -from tests.tooling.common import event_message, update_message -from tests.tooling.hooks import use_force_render, use_toggle - - -@pytest.fixture(autouse=True) -def no_logged_errors(): - with capture_reactpy_logs() as logs: - yield - for record in logs: - if record.exc_info: - raise record.exc_info[1] - - -def test_layout_repr(): - @reactpy.component - def MyComponent(): - ... - - my_component = MyComponent() - layout = reactpy.Layout(my_component) - assert str(layout) == f"Layout(MyComponent({id(my_component):02x}))" - - -def test_layout_expects_abstract_component(): - with pytest.raises(TypeError, match="Expected a ComponentType"): - reactpy.Layout(None) - with pytest.raises(TypeError, match="Expected a ComponentType"): - reactpy.Layout(reactpy.html.div()) - - -async def test_layout_cannot_be_used_outside_context_manager(caplog): - @reactpy.component - def Component(): - ... - - component = Component() - layout = reactpy.Layout(component) - - with pytest.raises(AttributeError): - await layout.deliver(event_message("something")) - - with pytest.raises(AttributeError): - await layout.render() - - -async def test_simple_layout(): - set_state_hook = reactpy.Ref() - - @reactpy.component - def SimpleComponent(): - tag, set_state_hook.current = reactpy.hooks.use_state("div") - return reactpy.vdom(tag) - - async with reactpy.Layout(SimpleComponent()) as layout: - update_1 = await layout.render() - assert update_1 == update_message( - path="", - model={"tagName": "", "children": [{"tagName": "div"}]}, - ) - - set_state_hook.current("table") - - update_2 = await layout.render() - assert update_2 == update_message( - path="", - model={"tagName": "", "children": [{"tagName": "table"}]}, - ) - - -async def test_component_can_return_none(): - @reactpy.component - def SomeComponent(): - return None - - async with reactpy.Layout(SomeComponent()) as layout: - assert (await layout.render())["model"] == {"tagName": ""} - - -async def test_nested_component_layout(): - parent_set_state = reactpy.Ref(None) - child_set_state = reactpy.Ref(None) - - @reactpy.component - def Parent(): - state, parent_set_state.current = reactpy.hooks.use_state(0) - return reactpy.html.div(state, Child()) - - @reactpy.component - def Child(): - state, child_set_state.current = reactpy.hooks.use_state(0) - return reactpy.html.div(state) - - def make_parent_model(state, model): - return { - "tagName": "", - "children": [ - { - "tagName": "div", - "children": [str(state), model], - } - ], - } - - def make_child_model(state): - return { - "tagName": "", - "children": [{"tagName": "div", "children": [str(state)]}], - } - - async with reactpy.Layout(Parent()) as layout: - update_1 = await layout.render() - assert update_1 == update_message( - path="", - model=make_parent_model(0, make_child_model(0)), - ) - - parent_set_state.current(1) - - update_2 = await layout.render() - assert update_2 == update_message( - path="", - model=make_parent_model(1, make_child_model(0)), - ) - - child_set_state.current(1) - - update_3 = await layout.render() - assert update_3 == update_message( - path="/children/0/children/1", - model=make_child_model(1), - ) - - -@pytest.mark.skipif( - not REACTPY_DEBUG_MODE.current, - reason="errors only reported in debug mode", -) -async def test_layout_render_error_has_partial_update_with_error_message(): - @reactpy.component - def Main(): - return reactpy.html.div([OkChild(), BadChild(), OkChild()]) - - @reactpy.component - def OkChild(): - return reactpy.html.div(["hello"]) - - @reactpy.component - def BadChild(): - msg = "error from bad child" - raise ValueError(msg) - - with assert_reactpy_did_log(match_error="error from bad child"): - async with reactpy.Layout(Main()) as layout: - assert (await layout.render()) == update_message( - path="", - model={ - "tagName": "", - "children": [ - { - "tagName": "div", - "children": [ - { - "tagName": "", - "children": [ - {"tagName": "div", "children": ["hello"]} - ], - }, - { - "tagName": "", - "error": "ValueError: error from bad child", - }, - { - "tagName": "", - "children": [ - {"tagName": "div", "children": ["hello"]} - ], - }, - ], - } - ], - }, - ) - - -@pytest.mark.skipif( - REACTPY_DEBUG_MODE.current, - reason="errors only reported in debug mode", -) -async def test_layout_render_error_has_partial_update_without_error_message(): - @reactpy.component - def Main(): - return reactpy.html.div([OkChild(), BadChild(), OkChild()]) - - @reactpy.component - def OkChild(): - return reactpy.html.div(["hello"]) - - @reactpy.component - def BadChild(): - msg = "error from bad child" - raise ValueError(msg) - - with assert_reactpy_did_log(match_error="error from bad child"): - async with reactpy.Layout(Main()) as layout: - assert (await layout.render()) == update_message( - path="", - model={ - "tagName": "", - "children": [ - { - "children": [ - { - "children": [ - {"children": ["hello"], "tagName": "div"} - ], - "tagName": "", - }, - {"error": "", "tagName": ""}, - { - "children": [ - {"children": ["hello"], "tagName": "div"} - ], - "tagName": "", - }, - ], - "tagName": "div", - } - ], - }, - ) - - -async def test_render_raw_vdom_dict_with_single_component_object_as_children(): - @reactpy.component - def Main(): - return {"tagName": "div", "children": Child()} - - @reactpy.component - def Child(): - return {"tagName": "div", "children": {"tagName": "h1"}} - - async with reactpy.Layout(Main()) as layout: - assert (await layout.render()) == update_message( - path="", - model={ - "tagName": "", - "children": [ - { - "children": [ - { - "children": [ - { - "children": [{"tagName": "h1"}], - "tagName": "div", - } - ], - "tagName": "", - } - ], - "tagName": "div", - } - ], - }, - ) - - -async def test_components_are_garbage_collected(): - live_components = set() - outer_component_hook = HookCatcher() - - def add_to_live_components(constructor): - def wrapper(*args, **kwargs): - component = constructor(*args, **kwargs) - component_id = id(component) - live_components.add(component_id) - finalize(component, live_components.discard, component_id) - return component - - return wrapper - - @add_to_live_components - @reactpy.component - @outer_component_hook.capture - def Outer(): - return Inner() - - @add_to_live_components - @reactpy.component - def Inner(): - return reactpy.html.div() - - async with reactpy.Layout(Outer()) as layout: - await layout.render() - - assert len(live_components) == 2 - - last_live_components = live_components.copy() - # The existing `Outer` component rerenders. A new `Inner` component is created and - # the the old `Inner` component should be deleted. Thus there should be one - # changed component in the set of `live_components` the old `Inner` deleted and new - # `Inner` added. - outer_component_hook.latest.schedule_render() - await layout.render() - - assert len(live_components - last_live_components) == 1 - - # The layout still holds a reference to the root so that's - # only deleted once we release our reference to the layout. - del layout - # the hook also contains a reference to the root component - del outer_component_hook - - assert not live_components - - -async def test_root_component_life_cycle_hook_is_garbage_collected(): - live_hooks = set() - - def add_to_live_hooks(constructor): - def wrapper(*args, **kwargs): - result = constructor(*args, **kwargs) - hook = reactpy.hooks.current_hook() - hook_id = id(hook) - live_hooks.add(hook_id) - finalize(hook, live_hooks.discard, hook_id) - return result - - return wrapper - - @reactpy.component - @add_to_live_hooks - def Root(): - return reactpy.html.div() - - async with reactpy.Layout(Root()) as layout: - await layout.render() - - assert len(live_hooks) == 1 - - # The layout still holds a reference to the root so that's only deleted once we - # release our reference to the layout. - del layout - - assert not live_hooks - - -async def test_life_cycle_hooks_are_garbage_collected(): - live_hooks = set() - set_inner_component = None - - def add_to_live_hooks(constructor): - def wrapper(*args, **kwargs): - result = constructor(*args, **kwargs) - hook = reactpy.hooks.current_hook() - hook_id = id(hook) - live_hooks.add(hook_id) - finalize(hook, live_hooks.discard, hook_id) - return result - - return wrapper - - @reactpy.component - @add_to_live_hooks - def Outer(): - nonlocal set_inner_component - inner_component, set_inner_component = reactpy.hooks.use_state( - Inner(key="first") - ) - return inner_component - - @reactpy.component - @add_to_live_hooks - def Inner(): - return reactpy.html.div() - - async with reactpy.Layout(Outer()) as layout: - await layout.render() - - assert len(live_hooks) == 2 - last_live_hooks = live_hooks.copy() - - # We expect the hook for `InnerOne` to be garbage collected since the component - # will get replaced. - set_inner_component(Inner(key="second")) - await layout.render() - assert len(live_hooks - last_live_hooks) == 1 - - # The layout still holds a reference to the root so that's only deleted once we - # release our reference to the layout. - del layout - del set_inner_component - - # For some reason, holding `set_inner_component` outside the render context causes - # the associated hook to not be automatically garbage collected. After some - # empirical investigation, it seems that if we do not hold `set_inner_component` in - # this way, the call to `gc.collect()` isn't required. This is demonstrated in - # `test_root_component_life_cycle_hook_is_garbage_collected` - gc.collect() - - assert not live_hooks - - -async def test_double_updated_component_is_not_double_rendered(): - hook = HookCatcher() - run_count = reactpy.Ref(0) - - @reactpy.component - @hook.capture - def AnyComponent(): - run_count.current += 1 - return reactpy.html.div() - - async with reactpy.Layout(AnyComponent()) as layout: - await layout.render() - - assert run_count.current == 1 - - hook.latest.schedule_render() - hook.latest.schedule_render() - - await layout.render() - try: - await asyncio.wait_for( - layout.render(), - timeout=0.1, # this should have been plenty of time - ) - except asyncio.TimeoutError: - pass # the render should still be rendering since we only update once - - assert run_count.current == 2 - - -async def test_update_path_to_component_that_is_not_direct_child_is_correct(): - hook = HookCatcher() - - @reactpy.component - def Parent(): - return reactpy.html.div(reactpy.html.div(Child())) - - @reactpy.component - @hook.capture - def Child(): - return reactpy.html.div() - - async with reactpy.Layout(Parent()) as layout: - await layout.render() - - hook.latest.schedule_render() - - update = await layout.render() - assert update["path"] == "/children/0/children/0/children/0" - - -async def test_log_on_dispatch_to_missing_event_handler(caplog): - @reactpy.component - def SomeComponent(): - return reactpy.html.div() - - async with reactpy.Layout(SomeComponent()) as layout: - await layout.deliver(event_message("missing")) - - assert re.match( - "Ignored event - handler 'missing' does not exist or its component unmounted", - next(iter(caplog.records)).msg, - ) - - -async def test_model_key_preserves_callback_identity_for_common_elements(caplog): - called_good_trigger = reactpy.Ref(False) - good_handler = StaticEventHandler() - bad_handler = StaticEventHandler() - - @reactpy.component - def MyComponent(): - reverse_children, set_reverse_children = use_toggle() - - @good_handler.use - def good_trigger(): - called_good_trigger.current = True - set_reverse_children() - - @bad_handler.use - def bad_trigger(): - msg = "Called bad trigger" - raise ValueError(msg) - - children = [ - reactpy.html.button( - {"on_click": good_trigger, "id": "good", "key": "good"}, "good" - ), - reactpy.html.button( - {"on_click": bad_trigger, "id": "bad", "key": "bad"}, "bad" - ), - ] - - if reverse_children: - children.reverse() - - return reactpy.html.div(children) - - async with reactpy.Layout(MyComponent()) as layout: - await layout.render() - for _i in range(3): - event = event_message(good_handler.target) - await layout.deliver(event) - - assert called_good_trigger.current - # reset after checking - called_good_trigger.current = False - - await layout.render() - - assert not caplog.records - - -async def test_model_key_preserves_callback_identity_for_components(): - called_good_trigger = reactpy.Ref(False) - good_handler = StaticEventHandler() - bad_handler = StaticEventHandler() - - @reactpy.component - def RootComponent(): - reverse_children, set_reverse_children = use_toggle() - - children = [ - Trigger(set_reverse_children, name=name, key=name) - for name in ["good", "bad"] - ] - - if reverse_children: - children.reverse() - - return reactpy.html.div(children) - - @reactpy.component - def Trigger(set_reverse_children, name): - if name == "good": - - @good_handler.use - def callback(): - called_good_trigger.current = True - set_reverse_children() - - else: - - @bad_handler.use - def callback(): - msg = "Called bad trigger" - raise ValueError(msg) - - return reactpy.html.button({"on_click": callback, "id": "good"}, "good") - - async with reactpy.Layout(RootComponent()) as layout: - await layout.render() - for _ in range(3): - event = event_message(good_handler.target) - await layout.deliver(event) - - assert called_good_trigger.current - # reset after checking - called_good_trigger.current = False - - await layout.render() - - -async def test_component_can_return_another_component_directly(): - @reactpy.component - def Outer(): - return Inner() - - @reactpy.component - def Inner(): - return reactpy.html.div("hello") - - async with reactpy.Layout(Outer()) as layout: - assert (await layout.render()) == update_message( - path="", - model={ - "tagName": "", - "children": [ - { - "children": [{"children": ["hello"], "tagName": "div"}], - "tagName": "", - } - ], - }, - ) - - -async def test_hooks_for_keyed_components_get_garbage_collected(): - pop_item = reactpy.Ref(None) - garbage_collect_items = [] - registered_finalizers = set() - - @reactpy.component - def Outer(): - items, set_items = reactpy.hooks.use_state([1, 2, 3]) - pop_item.current = lambda: set_items(items[:-1]) - return reactpy.html.div(Inner(key=k, finalizer_id=k) for k in items) - - @reactpy.component - def Inner(finalizer_id): - if finalizer_id not in registered_finalizers: - hook = reactpy.hooks.current_hook() - finalize(hook, lambda: garbage_collect_items.append(finalizer_id)) - registered_finalizers.add(finalizer_id) - return reactpy.html.div(finalizer_id) - - async with reactpy.Layout(Outer()) as layout: - await layout.render() - - pop_item.current() - await layout.render() - assert garbage_collect_items == [3] - - pop_item.current() - await layout.render() - assert garbage_collect_items == [3, 2] - - pop_item.current() - await layout.render() - assert garbage_collect_items == [3, 2, 1] - - -async def test_event_handler_at_component_root_is_garbage_collected(): - event_handler = reactpy.Ref() - - @reactpy.component - def HasEventHandlerAtRoot(): - value, set_value = reactpy.hooks.use_state(False) - set_value(not value) # trigger renders forever - event_handler.current = weakref(set_value) - button = reactpy.html.button({"on_click": set_value}, "state is: ", value) - event_handler.current = weakref(button["eventHandlers"]["on_click"].function) - return button - - async with reactpy.Layout(HasEventHandlerAtRoot()) as layout: - await layout.render() - - for _i in range(3): - last_event_handler = event_handler.current - # after this render we should have release the reference to the last handler - await layout.render() - assert last_event_handler() is None - - -async def test_event_handler_deep_in_component_layout_is_garbage_collected(): - event_handler = reactpy.Ref() - - @reactpy.component - def HasNestedEventHandler(): - value, set_value = reactpy.hooks.use_state(False) - set_value(not value) # trigger renders forever - event_handler.current = weakref(set_value) - button = reactpy.html.button({"on_click": set_value}, "state is: ", value) - event_handler.current = weakref(button["eventHandlers"]["on_click"].function) - return reactpy.html.div(reactpy.html.div(button)) - - async with reactpy.Layout(HasNestedEventHandler()) as layout: - await layout.render() - - for _i in range(3): - last_event_handler = event_handler.current - # after this render we should have release the reference to the last handler - await layout.render() - assert last_event_handler() is None - - -async def test_duplicate_sibling_keys_causes_error(caplog): - hook = HookCatcher() - should_error = True - - @reactpy.component - @hook.capture - def ComponentReturnsDuplicateKeys(): - if should_error: - return reactpy.html.div( - reactpy.html.div({"key": "duplicate"}), - reactpy.html.div({"key": "duplicate"}), - ) - else: - return reactpy.html.div() - - async with reactpy.Layout(ComponentReturnsDuplicateKeys()) as layout: - with assert_reactpy_did_log( - error_type=ValueError, - match_error=r"Duplicate keys \['duplicate'\] at '/children/0'", - ): - await layout.render() - - hook.latest.schedule_render() - - should_error = False - await layout.render() - - should_error = True - hook.latest.schedule_render() - with assert_reactpy_did_log( - error_type=ValueError, - match_error=r"Duplicate keys \['duplicate'\] at '/children/0'", - ): - await layout.render() - - -async def test_keyed_components_preserve_hook_on_parent_update(): - outer_hook = HookCatcher() - inner_hook = HookCatcher() - - @reactpy.component - @outer_hook.capture - def Outer(): - return Inner(key=1) - - @reactpy.component - @inner_hook.capture - def Inner(): - return reactpy.html.div() - - async with reactpy.Layout(Outer()) as layout: - await layout.render() - old_inner_hook = inner_hook.latest - - outer_hook.latest.schedule_render() - await layout.render() - assert old_inner_hook is inner_hook.latest - - -async def test_log_error_on_bad_event_handler(): - bad_handler = StaticEventHandler() - - @reactpy.component - def ComponentWithBadEventHandler(): - @bad_handler.use - def raise_error(): - msg = "bad event handler" - raise Exception(msg) - - return reactpy.html.button({"on_click": raise_error}) - - with assert_reactpy_did_log(match_error="bad event handler"): - async with reactpy.Layout(ComponentWithBadEventHandler()) as layout: - await layout.render() - event = event_message(bad_handler.target) - await layout.deliver(event) - - -async def test_schedule_render_from_unmounted_hook(): - parent_set_state = reactpy.Ref() - - @reactpy.component - def Parent(): - state, parent_set_state.current = reactpy.hooks.use_state(1) - return Child(key=state, state=state) - - child_hook = HookCatcher() - - @reactpy.component - @child_hook.capture - def Child(state): - return reactpy.html.div(state) - - with assert_reactpy_did_log( - r"Did not render component with model state ID .*? - component already unmounted", - ): - async with reactpy.Layout(Parent()) as layout: - await layout.render() - - old_hook = child_hook.latest - - # cause initial child to be unmounted - parent_set_state.current(2) - await layout.render() - - # trigger render for hook that's been unmounted - old_hook.schedule_render() - - # schedule one more render just to make it so `layout.render()` doesn't hang - # when the scheduled render above gets skipped - parent_set_state.current(3) - - await layout.render() - - -async def test_elements_and_components_with_the_same_key_can_be_interchanged(): - set_toggle = reactpy.Ref() - effects = [] - - @reactpy.component - def Root(): - toggle, set_toggle.current = use_toggle(True) - if toggle: - return SomeComponent("x") - else: - return reactpy.html.div(SomeComponent("y")) - - @reactpy.component - def SomeComponent(name): - @use_effect - def some_effect(): - effects.append("mount " + name) - return lambda: effects.append("unmount " + name) - - return reactpy.html.div(name) - - async with reactpy.Layout(Root()) as layout: - await layout.render() - - assert effects == ["mount x"] - - set_toggle.current() - await layout.render() - - assert effects == ["mount x", "unmount x", "mount y"] - - set_toggle.current() - await layout.render() - - assert effects == ["mount x", "unmount x", "mount y", "unmount y", "mount x"] - - -async def test_layout_does_not_copy_element_children_by_key(): - # this is a regression test for a subtle bug: - # https://github.com/reactive-python/reactpy/issues/556 - - set_items = reactpy.Ref() - - @reactpy.component - def SomeComponent(): - items, set_items.current = reactpy.use_state([1, 2, 3]) - return reactpy.html.div( - [ - reactpy.html.div( - {"key": i}, - reactpy.html.input({"on_change": lambda event: None}), - ) - for i in items - ] - ) - - async with reactpy.Layout(SomeComponent()) as layout: - await layout.render() - - set_items.current([2, 3]) - - await layout.render() - - set_items.current([3]) - - await layout.render() - - set_items.current([]) - - await layout.render() - - -async def test_changing_key_of_parent_element_unmounts_children(): - random.seed(0) - - root_hook = HookCatcher() - state = reactpy.Ref(None) - - @reactpy.component - @root_hook.capture - def Root(): - return reactpy.html.div({"key": str(random.random())}, HasState()) - - @reactpy.component - def HasState(): - state.current = reactpy.hooks.use_state(random.random)[0] - return reactpy.html.div() - - async with reactpy.Layout(Root()) as layout: - await layout.render() - - for _i in range(5): - last_state = state.current - root_hook.latest.schedule_render() - await layout.render() - assert last_state != state.current - - -async def test_switching_node_type_with_event_handlers(): - toggle_type = reactpy.Ref() - element_static_handler = StaticEventHandler() - component_static_handler = StaticEventHandler() - - @reactpy.component - def Root(): - toggle, toggle_type.current = use_toggle(True) - handler = element_static_handler.use(lambda: None) - if toggle: - return html.div(html.button({"on_event": handler})) - else: - return html.div(SomeComponent()) - - @reactpy.component - def SomeComponent(): - handler = component_static_handler.use(lambda: None) - return html.button({"on_another_event": handler}) - - async with reactpy.Layout(Root()) as layout: - await layout.render() - - assert element_static_handler.target in layout._event_handlers - assert component_static_handler.target not in layout._event_handlers - - toggle_type.current() - await layout.render() - - assert element_static_handler.target not in layout._event_handlers - assert component_static_handler.target in layout._event_handlers - - toggle_type.current() - await layout.render() - - assert element_static_handler.target in layout._event_handlers - assert component_static_handler.target not in layout._event_handlers - - -async def test_switching_component_definition(): - toggle_component = reactpy.Ref() - first_used_state = reactpy.Ref(None) - second_used_state = reactpy.Ref(None) - - @reactpy.component - def Root(): - toggle, toggle_component.current = use_toggle(True) - if toggle: - return FirstComponent() - else: - return SecondComponent() - - @reactpy.component - def FirstComponent(): - first_used_state.current = use_state("first")[0] - # reset state after unmount - use_effect(lambda: lambda: first_used_state.set_current(None)) - return html.div() - - @reactpy.component - def SecondComponent(): - second_used_state.current = use_state("second")[0] - # reset state after unmount - use_effect(lambda: lambda: second_used_state.set_current(None)) - return html.div() - - async with reactpy.Layout(Root()) as layout: - await layout.render() - - assert first_used_state.current == "first" - assert second_used_state.current is None - - toggle_component.current() - await layout.render() - - assert first_used_state.current is None - assert second_used_state.current == "second" - - toggle_component.current() - await layout.render() - - assert first_used_state.current == "first" - assert second_used_state.current is None - - -async def test_element_keys_inside_components_do_not_reset_state_of_component(): - """This is a regression test for a bug. - - You would not expect that calling `set_child_key_num` would trigger state to be - reset in any `Child()` components but there was a bug where that happened. - """ - - effect_calls_without_state = set() - set_child_key_num = StaticEventHandler() - did_call_effect = asyncio.Event() - - @component - def Parent(): - state, set_state = use_state(0) - return html.div( - html.button( - {"on_click": set_child_key_num.use(lambda: set_state(state + 1))}, - "click me", - ), - Child("some-key"), - Child(f"key-{state}"), - ) - - @component - def Child(child_key): - state, set_state = use_state(0) - - @use_effect - async def record_if_state_is_reset(): - if state: - return - effect_calls_without_state.add(child_key) - set_state(1) - did_call_effect.set() - - return html.div({"key": child_key}, child_key) - - async with reactpy.Layout(Parent()) as layout: - await layout.render() - await did_call_effect.wait() - assert effect_calls_without_state == {"some-key", "key-0"} - did_call_effect.clear() - - for _i in range(1, 5): - await layout.deliver(event_message(set_child_key_num.target)) - await layout.render() - assert effect_calls_without_state == {"some-key", "key-0"} - did_call_effect.clear() - - -async def test_changing_key_of_component_resets_state(): - set_key = Ref() - did_init_state = Ref(0) - hook = HookCatcher() - - @component - @hook.capture - def Root(): - key, set_key.current = use_state("key-1") - return Child(key=key) - - @component - def Child(): - use_state(lambda: did_init_state.set_current(did_init_state.current + 1)) - - async with Layout(Root()) as layout: - await layout.render() - assert did_init_state.current == 1 - - set_key.current("key-2") - await layout.render() - assert did_init_state.current == 2 - - hook.latest.schedule_render() - await layout.render() - assert did_init_state.current == 2 - - -async def test_changing_event_handlers_in_the_next_render(): - set_event_name = Ref() - event_handler = StaticEventHandler() - did_trigger = Ref(False) - - @component - def Root(): - event_name, set_event_name.current = use_state("first") - return html.button( - {event_name: event_handler.use(lambda: did_trigger.set_current(True))} - ) - - async with Layout(Root()) as layout: - await layout.render() - await layout.deliver(event_message(event_handler.target)) - assert did_trigger.current - did_trigger.current = False - - set_event_name.current("second") - await layout.render() - await layout.deliver(event_message(event_handler.target)) - assert did_trigger.current - did_trigger.current = False - - -async def test_change_element_to_string_causes_unmount(): - set_toggle = Ref() - did_unmount = Ref(False) - - @component - def Root(): - toggle, set_toggle.current = use_toggle(True) - if toggle: - return html.div(Child()) - else: - return html.div("some-string") - - @component - def Child(): - use_effect(lambda: lambda: did_unmount.set_current(True)) - - async with Layout(Root()) as layout: - await layout.render() - - set_toggle.current() - - await layout.render() - - assert did_unmount.current - - -async def test_does_render_children_after_component(): - """Regression test for bug where layout was appending children to a stale ref - - The stale reference was created when a component got rendered. Thus, everything - after the component failed to display. - """ - - @reactpy.component - def Parent(): - return html.div( - html.p("first"), - Child(), - html.p("third"), - ) - - @reactpy.component - def Child(): - return html.p("second") - - async with reactpy.Layout(Parent()) as layout: - update = await layout.render() - assert update["model"] == { - "tagName": "", - "children": [ - { - "tagName": "div", - "children": [ - {"tagName": "p", "children": ["first"]}, - { - "tagName": "", - "children": [{"tagName": "p", "children": ["second"]}], - }, - {"tagName": "p", "children": ["third"]}, - ], - } - ], - } - - -async def test_render_removed_context_consumer(): - Context = reactpy.create_context(None) - toggle_remove_child = None - schedule_removed_child_render = None - - @component - def Parent(): - nonlocal toggle_remove_child - remove_child, toggle_remove_child = use_toggle() - return Context(html.div() if remove_child else Child(), value=None) - - @component - def Child(): - nonlocal schedule_removed_child_render - schedule_removed_child_render = use_force_render() - - async with reactpy.Layout(Parent()) as layout: - await layout.render() - - # If the context provider does not render its children then internally tracked - # state for the removed child component might not be cleaned up properly. This - # occurred in the past when the context provider implemented a should_render() - # method that returned False (and thus did not render its children) when the - # context value did not change. - toggle_remove_child() - await layout.render() - - # If this removed child component has state which has not been cleaned up - # correctly, scheduling a render for it might cause an error. - schedule_removed_child_render() - - # If things were cleaned up properly, the above scheduled render should not - # actually take place. Thus we expect the timeout to occur. - render_task = asyncio.create_task(layout.render()) - done, pending = await asyncio.wait([render_task], timeout=0.1) - assert not done and pending - render_task.cancel() diff --git a/src/py/reactpy/tests/test_core/test_serve.py b/src/py/reactpy/tests/test_core/test_serve.py deleted file mode 100644 index 64be0ec8b..000000000 --- a/src/py/reactpy/tests/test_core/test_serve.py +++ /dev/null @@ -1,139 +0,0 @@ -import asyncio -from collections.abc import Sequence -from typing import Any - -from jsonpointer import set_pointer - -import reactpy -from reactpy.core.layout import Layout -from reactpy.core.serve import serve_layout -from reactpy.core.types import LayoutUpdateMessage -from reactpy.testing import StaticEventHandler -from tests.tooling.common import event_message - -EVENT_NAME = "on_event" -STATIC_EVENT_HANDLER = StaticEventHandler() - - -def make_send_recv_callbacks(events_to_inject): - changes = [] - - # We need a semaphore here to simulate receiving an event after each update is sent. - # The effect is that the send() and recv() callbacks trade off control. If we did - # not do this, it would easy to determine when to halt because, while we might have - # received all the events, they might not have been sent since the two callbacks are - # executed in separate loops. - sem = asyncio.Semaphore(0) - - async def send(patch): - changes.append(patch) - sem.release() - if not events_to_inject: - raise reactpy.Stop() - - async def recv(): - await sem.acquire() - try: - return events_to_inject.pop(0) - except IndexError: - # wait forever - await asyncio.Event().wait() - - return changes, send, recv - - -def make_events_and_expected_model(): - events = [event_message(STATIC_EVENT_HANDLER.target)] * 4 - expected_model = { - "tagName": "", - "children": [ - { - "tagName": "div", - "attributes": {"count": 4}, - "eventHandlers": { - EVENT_NAME: { - "target": STATIC_EVENT_HANDLER.target, - "preventDefault": False, - "stopPropagation": False, - } - }, - } - ], - } - return events, expected_model - - -def assert_changes_produce_expected_model( - changes: Sequence[LayoutUpdateMessage], - expected_model: Any, -) -> None: - model_from_changes = {} - for update in changes: - if update["path"]: - model_from_changes = set_pointer( - model_from_changes, update["path"], update["model"] - ) - else: - model_from_changes.update(update["model"]) - assert model_from_changes == expected_model - - -@reactpy.component -def Counter(): - count, change_count = reactpy.hooks.use_reducer( - (lambda old_count, diff: old_count + diff), - initial_value=0, - ) - handler = STATIC_EVENT_HANDLER.use(lambda: change_count(1)) - return reactpy.html.div({EVENT_NAME: handler, "count": count}) - - -async def test_dispatch(): - events, expected_model = make_events_and_expected_model() - changes, send, recv = make_send_recv_callbacks(events) - await asyncio.wait_for(serve_layout(Layout(Counter()), send, recv), 1) - assert_changes_produce_expected_model(changes, expected_model) - - -async def test_dispatcher_handles_more_than_one_event_at_a_time(): - block_and_never_set = asyncio.Event() - will_block = asyncio.Event() - second_event_did_execute = asyncio.Event() - - blocked_handler = StaticEventHandler() - non_blocked_handler = StaticEventHandler() - - @reactpy.component - def ComponentWithTwoEventHandlers(): - @blocked_handler.use - async def block_forever(): - will_block.set() - await block_and_never_set.wait() - - @non_blocked_handler.use - async def handle_event(): - second_event_did_execute.set() - - return reactpy.html.div( - reactpy.html.button({"on_click": block_forever}), - reactpy.html.button({"on_click": handle_event}), - ) - - send_queue = asyncio.Queue() - recv_queue = asyncio.Queue() - - task = asyncio.create_task( - serve_layout( - reactpy.Layout(ComponentWithTwoEventHandlers()), - send_queue.put, - recv_queue.get, - ) - ) - - await recv_queue.put(event_message(blocked_handler.target)) - await will_block.wait() - - await recv_queue.put(event_message(non_blocked_handler.target)) - await second_event_did_execute.wait() - - task.cancel() diff --git a/src/py/reactpy/tests/test_core/test_vdom.py b/src/py/reactpy/tests/test_core/test_vdom.py deleted file mode 100644 index 76e26e46f..000000000 --- a/src/py/reactpy/tests/test_core/test_vdom.py +++ /dev/null @@ -1,307 +0,0 @@ -import sys - -import pytest -from fastjsonschema import JsonSchemaException - -import reactpy -from reactpy.config import REACTPY_DEBUG_MODE -from reactpy.core.events import EventHandler -from reactpy.core.types import VdomDict -from reactpy.core.vdom import is_vdom, make_vdom_constructor, validate_vdom_json - -FAKE_EVENT_HANDLER = EventHandler(lambda data: None) -FAKE_EVENT_HANDLER_DICT = {"on_event": FAKE_EVENT_HANDLER} - - -@pytest.mark.parametrize( - "result, value", - [ - (False, {}), - (False, {"tagName": None}), - (False, VdomDict()), - (True, {"tagName": ""}), - (True, VdomDict(tagName="")), - ], -) -def test_is_vdom(result, value): - assert is_vdom(value) == result - - -@pytest.mark.parametrize( - "actual, expected", - [ - ( - reactpy.vdom("div", [reactpy.vdom("div")]), - {"tagName": "div", "children": [{"tagName": "div"}]}, - ), - ( - reactpy.vdom("div", {"style": {"backgroundColor": "red"}}), - {"tagName": "div", "attributes": {"style": {"backgroundColor": "red"}}}, - ), - ( - # multiple iterables of children are merged - reactpy.vdom("div", [reactpy.vdom("div"), 1], (reactpy.vdom("div"), 2)), - { - "tagName": "div", - "children": [{"tagName": "div"}, 1, {"tagName": "div"}, 2], - }, - ), - ( - reactpy.vdom("div", {"on_event": FAKE_EVENT_HANDLER}), - {"tagName": "div", "eventHandlers": FAKE_EVENT_HANDLER_DICT}, - ), - ( - reactpy.vdom("div", reactpy.html.h1("hello"), reactpy.html.h2("world")), - { - "tagName": "div", - "children": [ - {"tagName": "h1", "children": ["hello"]}, - {"tagName": "h2", "children": ["world"]}, - ], - }, - ), - ( - reactpy.vdom("div", {"tagName": "div"}), - {"tagName": "div", "children": [{"tagName": "div"}]}, - ), - ( - reactpy.vdom("div", (i for i in range(3))), - {"tagName": "div", "children": [0, 1, 2]}, - ), - ( - reactpy.vdom("div", (x**2 for x in [1, 2, 3])), - {"tagName": "div", "children": [1, 4, 9]}, - ), - ], -) -def test_simple_node_construction(actual, expected): - assert actual == expected - - -async def test_callable_attributes_are_cast_to_event_handlers(): - params_from_calls = [] - - node = reactpy.vdom( - "div", {"on_event": lambda *args: params_from_calls.append(args)} - ) - - event_handlers = node.pop("eventHandlers") - assert node == {"tagName": "div"} - - handler = event_handlers["on_event"] - assert event_handlers == {"on_event": EventHandler(handler.function)} - - await handler.function([1, 2]) - await handler.function([3, 4, 5]) - assert params_from_calls == [(1, 2), (3, 4, 5)] - - -def test_make_vdom_constructor(): - elmt = make_vdom_constructor("some-tag") - - assert elmt({"data": 1}, [elmt()]) == { - "tagName": "some-tag", - "children": [{"tagName": "some-tag"}], - "attributes": {"data": 1}, - } - - no_children = make_vdom_constructor("no-children", allow_children=False) - - with pytest.raises(TypeError, match="cannot have children"): - no_children([1, 2, 3]) - - assert no_children() == {"tagName": "no-children"} - - -@pytest.mark.parametrize( - "value", - [ - { - "tagName": "div", - "children": [ - "Some text", - {"tagName": "div"}, - ], - }, - { - "tagName": "div", - "attributes": {"style": {"color": "blue"}}, - }, - { - "tagName": "div", - "eventHandler": {"target": "something"}, - }, - { - "tagName": "div", - "eventHandler": { - "target": "something", - "preventDefault": False, - "stopPropagation": True, - }, - }, - { - "tagName": "div", - "importSource": {"source": "something"}, - }, - { - "tagName": "div", - "importSource": {"source": "something", "fallback": None}, - }, - { - "tagName": "div", - "importSource": {"source": "something", "fallback": "loading..."}, - }, - { - "tagName": "div", - "importSource": {"source": "something", "fallback": {"tagName": "div"}}, - }, - { - "tagName": "div", - "children": [ - "Some text", - {"tagName": "div"}, - ], - "attributes": {"style": {"color": "blue"}}, - "eventHandler": { - "target": "something", - "preventDefault": False, - "stopPropagation": True, - }, - "importSource": { - "source": "something", - "fallback": {"tagName": "div"}, - }, - }, - ], -) -def test_valid_vdom(value): - validate_vdom_json(value) - - -@pytest.mark.skipif( - sys.version_info < (3, 10), reason="error messages are different in Python<3.10" -) -@pytest.mark.parametrize( - "value, error_message_pattern", - [ - ( - None, - r"data must be object", - ), - ( - {}, - r"data must contain \['tagName'\] properties", - ), - ( - {"tagName": 0}, - r"data\.tagName must be string", - ), - ( - {"tagName": "tag", "children": None}, - r"data\.children must be array", - ), - ( - {"tagName": "tag", "children": [None]}, - r"data\.children\[0\] must be object or string", - ), - ( - {"tagName": "tag", "children": [{"tagName": None}]}, - r"data\.children\[0\]\.tagName must be string", - ), - ( - {"tagName": "tag", "attributes": None}, - r"data\.attributes must be object", - ), - ( - {"tagName": "tag", "eventHandlers": None}, - r"data\.eventHandlers must be object", - ), - ( - {"tagName": "tag", "eventHandlers": {"on_event": None}}, - r"data\.eventHandlers\.on_event must be object", - ), - ( - { - "tagName": "tag", - "eventHandlers": {"on_event": {}}, - }, - r"data\.eventHandlers\.on_event\ must contain \['target'\] properties", - ), - ( - { - "tagName": "tag", - "eventHandlers": { - "on_event": { - "target": "something", - "preventDefault": None, - } - }, - }, - r"data\.eventHandlers\.on_event\.preventDefault must be boolean", - ), - ( - { - "tagName": "tag", - "eventHandlers": { - "on_event": { - "target": "something", - "stopPropagation": None, - } - }, - }, - r"data\.eventHandlers\.on_event\.stopPropagation must be boolean", - ), - ( - {"tagName": "tag", "importSource": None}, - r"data\.importSource must be object", - ), - ( - {"tagName": "tag", "importSource": {}}, - r"data\.importSource must contain \['source'\] properties", - ), - ( - { - "tagName": "tag", - "importSource": {"source": "something", "fallback": 0}, - }, - r"data\.importSource\.fallback must be object or string or null", - ), - ( - { - "tagName": "tag", - "importSource": {"source": "something", "fallback": {"tagName": None}}, - }, - r"data\.importSource\.fallback\.tagName must be string", - ), - ], -) -def test_invalid_vdom(value, error_message_pattern): - with pytest.raises(JsonSchemaException, match=error_message_pattern): - validate_vdom_json(value) - - -@pytest.mark.skipif(not REACTPY_DEBUG_MODE.current, reason="Only logs in debug mode") -def test_debug_log_cannot_verify_keypath_for_genereators(caplog): - reactpy.vdom("div", (1 for i in range(10))) - assert len(caplog.records) == 1 - assert caplog.records[0].message.startswith( - "Did not verify key-path integrity of children in generator" - ) - caplog.records.clear() - - -@pytest.mark.skipif(not REACTPY_DEBUG_MODE.current, reason="Only logs in debug mode") -def test_debug_log_dynamic_children_must_have_keys(caplog): - reactpy.vdom("div", [reactpy.vdom("div")]) - assert len(caplog.records) == 1 - assert caplog.records[0].message.startswith("Key not specified for child") - - caplog.records.clear() - - @reactpy.component - def MyComponent(): - return reactpy.vdom("div") - - reactpy.vdom("div", [MyComponent()]) - assert len(caplog.records) == 1 - assert caplog.records[0].message.startswith("Key not specified for child") diff --git a/src/py/reactpy/tests/test_html.py b/src/py/reactpy/tests/test_html.py deleted file mode 100644 index f16d1beed..000000000 --- a/src/py/reactpy/tests/test_html.py +++ /dev/null @@ -1,160 +0,0 @@ -import pytest - -from reactpy import component, config, html -from reactpy.testing import DisplayFixture, poll -from reactpy.utils import Ref -from tests.tooling.hooks import use_counter, use_toggle - - -async def test_script_mount_unmount(display: DisplayFixture): - toggle_is_mounted = Ref() - - @component - def Root(): - is_mounted, toggle_is_mounted.current = use_toggle(True) - return html.div( - html.div({"id": "mount-state", "data_value": False}), - HasScript() if is_mounted else html.div(), - ) - - @component - def HasScript(): - return html.script( - """() => { - const mapping = {"false": false, "true": true}; - const mountStateEl = document.getElementById("mount-state"); - mountStateEl.setAttribute( - "data-value", !mapping[mountStateEl.getAttribute("data-value")]); - return () => mountStateEl.setAttribute( - "data-value", !mapping[mountStateEl.getAttribute("data-value")]); - }""" - ) - - await display.show(Root) - - mount_state = await display.page.wait_for_selector("#mount-state", state="attached") - poll_mount_state = poll(mount_state.get_attribute, "data-value") - - await poll_mount_state.until_equals("true") - - toggle_is_mounted.current() - - await poll_mount_state.until_equals("false") - - toggle_is_mounted.current() - - await poll_mount_state.until_equals("true") - - -async def test_script_re_run_on_content_change(display: DisplayFixture): - incr_count = Ref() - - @component - def HasScript(): - count, incr_count.current = use_counter(1) - return html.div( - html.div({"id": "mount-count", "data_value": 0}), - html.div({"id": "unmount-count", "data_value": 0}), - html.script( - f"""() => {{ - const mountCountEl = document.getElementById("mount-count"); - const unmountCountEl = document.getElementById("unmount-count"); - mountCountEl.setAttribute("data-value", {count}); - return () => unmountCountEl.setAttribute("data-value", {count});; - }}""" - ), - ) - - await display.show(HasScript) - - mount_count = await display.page.wait_for_selector("#mount-count", state="attached") - poll_mount_count = poll(mount_count.get_attribute, "data-value") - - unmount_count = await display.page.wait_for_selector( - "#unmount-count", state="attached" - ) - poll_unmount_count = poll(unmount_count.get_attribute, "data-value") - - await poll_mount_count.until_equals("1") - await poll_unmount_count.until_equals("0") - - incr_count.current() - - await poll_mount_count.until_equals("2") - await poll_unmount_count.until_equals("1") - - incr_count.current() - - await poll_mount_count.until_equals("3") - await poll_unmount_count.until_equals("2") - - -async def test_script_from_src(display: DisplayFixture): - incr_src_id = Ref() - file_name_template = "__some_js_script_{src_id}__.js" - - @component - def HasScript(): - src_id, incr_src_id.current = use_counter(0) - if src_id == 0: - # on initial display we haven't added the file yet. - return html.div() - else: - return html.div( - html.div({"id": "run-count", "data_value": 0}), - html.script( - { - "src": f"/_reactpy/modules/{file_name_template.format(src_id=src_id)}" - } - ), - ) - - await display.show(HasScript) - - for i in range(1, 4): - script_file = ( - config.REACTPY_WEB_MODULES_DIR.current / file_name_template.format(src_id=i) - ) - script_file.write_text( - f""" - let runCountEl = document.getElementById("run-count"); - runCountEl.setAttribute("data-value", {i}); - """ - ) - - incr_src_id.current() - - run_count = await display.page.wait_for_selector("#run-count", state="attached") - poll_run_count = poll(run_count.get_attribute, "data-value") - await poll_run_count.until_equals("1") - - -def test_script_may_only_have_one_child(): - with pytest.raises(ValueError, match="'script' nodes may have, at most, one child"): - html.script("one child", "two child") - - -def test_child_of_script_must_be_string(): - with pytest.raises(ValueError, match="The child of a 'script' must be a string"): - html.script(1) - - -def test_script_has_no_event_handlers(): - with pytest.raises(ValueError, match="do not support event handlers"): - html.script({"on_event": lambda: None}) - - -def test_simple_fragment(): - assert html._() == {"tagName": ""} - assert html._(1, 2, 3) == {"tagName": "", "children": [1, 2, 3]} - assert html._({"key": "something"}) == {"tagName": "", "key": "something"} - assert html._({"key": "something"}, 1, 2, 3) == { - "tagName": "", - "key": "something", - "children": [1, 2, 3], - } - - -def test_fragment_can_have_no_attributes(): - with pytest.raises(TypeError, match="Fragments cannot have attributes"): - html._({"some_attribute": 1}) diff --git a/src/py/reactpy/tests/test_sample.py b/src/py/reactpy/tests/test_sample.py deleted file mode 100644 index b92e89789..000000000 --- a/src/py/reactpy/tests/test_sample.py +++ /dev/null @@ -1,8 +0,0 @@ -from reactpy.sample import SampleApp -from reactpy.testing import DisplayFixture - - -async def test_sample_app(display: DisplayFixture): - await display.show(SampleApp) - h1 = await display.page.wait_for_selector("h1") - assert (await h1.text_content()) == "Sample Application" diff --git a/src/py/reactpy/tests/test_testing.py b/src/py/reactpy/tests/test_testing.py deleted file mode 100644 index 68e36e7f6..000000000 --- a/src/py/reactpy/tests/test_testing.py +++ /dev/null @@ -1,218 +0,0 @@ -import logging -import os - -import pytest - -from reactpy import Ref, component, html, testing -from reactpy.backend import starlette as starlette_implementation -from reactpy.logging import ROOT_LOGGER -from reactpy.sample import SampleApp -from reactpy.testing.backend import _hotswap -from reactpy.testing.display import DisplayFixture - - -def test_assert_reactpy_logged_does_not_suppress_errors(): - with pytest.raises(RuntimeError, match="expected error"): - with testing.assert_reactpy_did_log(): - msg = "expected error" - raise RuntimeError(msg) - - -def test_assert_reactpy_logged_message(): - with testing.assert_reactpy_did_log(match_message="my message"): - ROOT_LOGGER.info("my message") - - with testing.assert_reactpy_did_log(match_message=r".*"): - ROOT_LOGGER.info("my message") - - -def test_assert_reactpy_logged_error(): - with testing.assert_reactpy_did_log( - match_message="log message", - error_type=ValueError, - match_error="my value error", - ): - try: - msg = "my value error" - raise ValueError(msg) - except ValueError: - ROOT_LOGGER.exception("log message") - - with pytest.raises( - AssertionError, - match=r"Could not find a log record matching the given", - ): - with testing.assert_reactpy_did_log( - match_message="log message", - error_type=ValueError, - match_error="my value error", - ): - try: - # change error type - msg = "my value error" - raise RuntimeError(msg) - except RuntimeError: - ROOT_LOGGER.exception("log message") - - with pytest.raises( - AssertionError, - match=r"Could not find a log record matching the given", - ): - with testing.assert_reactpy_did_log( - match_message="log message", - error_type=ValueError, - match_error="my value error", - ): - try: - # change error message - msg = "something else" - raise ValueError(msg) - except ValueError: - ROOT_LOGGER.exception("log message") - - with pytest.raises( - AssertionError, - match=r"Could not find a log record matching the given", - ): - with testing.assert_reactpy_did_log( - match_message="log message", - error_type=ValueError, - match_error="my value error", - ): - try: - # change error message - msg = "my error message" - raise ValueError(msg) - except ValueError: - ROOT_LOGGER.exception("something else") - - -def test_assert_reactpy_logged_assertion_error_message(): - with pytest.raises( - AssertionError, - match=r"Could not find a log record matching the given", - ): - with testing.assert_reactpy_did_log( - # put in all possible params full assertion error message - match_message=r".*", - error_type=Exception, - match_error=r".*", - ): - pass - - -def test_assert_reactpy_logged_ignores_level(): - original_level = ROOT_LOGGER.level - ROOT_LOGGER.setLevel(logging.INFO) - try: - with testing.assert_reactpy_did_log(match_message=r".*"): - # this log would normally be ignored - ROOT_LOGGER.debug("my message") - finally: - ROOT_LOGGER.setLevel(original_level) - - -def test_assert_reactpy_did_not_log(): - with testing.assert_reactpy_did_not_log(match_message="my message"): - pass - - with testing.assert_reactpy_did_not_log(match_message=r"something else"): - ROOT_LOGGER.info("my message") - - with pytest.raises( - AssertionError, - match=r"Did find a log record matching the given", - ): - with testing.assert_reactpy_did_not_log( - # put in all possible params full assertion error message - match_message=r".*", - error_type=Exception, - match_error=r".*", - ): - try: - msg = "something" - raise Exception(msg) - except Exception: - ROOT_LOGGER.exception("something") - - -async def test_simple_display_fixture(): - if os.name == "nt": - pytest.skip("Browser tests not supported on Windows") - async with testing.DisplayFixture() as display: - await display.show(SampleApp) - await display.page.wait_for_selector("#sample") - - -def test_if_app_is_given_implementation_must_be_too(): - with pytest.raises( - ValueError, - match=r"If an application instance its corresponding server implementation must be provided too", - ): - testing.BackendFixture(app=starlette_implementation.create_development_app()) - - testing.BackendFixture( - app=starlette_implementation.create_development_app(), - implementation=starlette_implementation, - ) - - -def test_list_logged_excptions(): - the_error = None - with testing.capture_reactpy_logs() as records: - ROOT_LOGGER.info("A non-error log message") - - try: - msg = "An error for testing" - raise ValueError(msg) - except Exception as error: - ROOT_LOGGER.exception("Log the error") - the_error = error - - logged_errors = testing.logs.list_logged_exceptions(records) - assert logged_errors == [the_error] - - -async def test_hostwap_update_on_change(display: DisplayFixture): - """Ensure shared hotswapping works - - This basically means that previously rendered views of a hotswap component get updated - when a new view is mounted, not just the next time it is re-displayed - - In this test we construct a scenario where clicking a button will cause a pre-existing - hotswap component to be updated - """ - - def make_next_count_constructor(count): - """We need to construct a new function so they're different when we set_state""" - - def constructor(): - count.current += 1 - return html.div({"id": f"hotswap-{count.current}"}, count.current) - - return constructor - - @component - def ButtonSwapsDivs(): - count = Ref(0) - - async def on_click(event): - mount(make_next_count_constructor(count)) - - incr = html.button({"on_click": on_click, "id": "incr-button"}, "incr") - - mount, make_hostswap = _hotswap(update_on_change=True) - mount(make_next_count_constructor(count)) - hotswap_view = make_hostswap() - - return html.div(incr, hotswap_view) - - await display.show(ButtonSwapsDivs) - - client_incr_button = await display.page.wait_for_selector("#incr-button") - - await display.page.wait_for_selector("#hotswap-1") - await client_incr_button.click() - await display.page.wait_for_selector("#hotswap-2") - await client_incr_button.click() - await display.page.wait_for_selector("#hotswap-3") diff --git a/src/py/reactpy/tests/test_utils.py b/src/py/reactpy/tests/test_utils.py deleted file mode 100644 index c71057f15..000000000 --- a/src/py/reactpy/tests/test_utils.py +++ /dev/null @@ -1,274 +0,0 @@ -from html import escape as html_escape - -import pytest - -import reactpy -from reactpy import html -from reactpy.utils import ( - HTMLParseError, - del_html_head_body_transform, - html_to_vdom, - vdom_to_html, -) - - -def test_basic_ref_behavior(): - r = reactpy.Ref(1) - assert r.current == 1 - - r.current = 2 - assert r.current == 2 - - assert r.set_current(3) == 2 - assert r.current == 3 - - r = reactpy.Ref() - with pytest.raises(AttributeError): - r.current # noqa: B018 - - r.current = 4 - assert r.current == 4 - - -def test_ref_equivalence(): - assert reactpy.Ref([1, 2, 3]) == reactpy.Ref([1, 2, 3]) - assert reactpy.Ref([1, 2, 3]) != reactpy.Ref([1, 2]) - assert reactpy.Ref([1, 2, 3]) != [1, 2, 3] - assert reactpy.Ref() != reactpy.Ref() - assert reactpy.Ref() != reactpy.Ref(1) - - -def test_ref_repr(): - assert repr(reactpy.Ref([1, 2, 3])) == "Ref([1, 2, 3])" - assert repr(reactpy.Ref()) == "Ref(<undefined>)" - - -@pytest.mark.parametrize( - "case", - [ - {"source": "<div/>", "model": {"tagName": "div"}}, - { - "source": "<div style='background-color:blue'/>", - "model": { - "tagName": "div", - "attributes": {"style": {"background_color": "blue"}}, - }, - }, - { - "source": "<div>Hello!</div>", - "model": {"tagName": "div", "children": ["Hello!"]}, - }, - { - "source": "<div>Hello!<p>World!</p></div>", - "model": { - "tagName": "div", - "children": ["Hello!", {"tagName": "p", "children": ["World!"]}], - }, - }, - ], -) -def test_html_to_vdom(case): - assert html_to_vdom(case["source"]) == case["model"] - - -def test_html_to_vdom_transform(): - source = "<p>hello <a>world</a> and <a>universe</a>lmao</p>" - - def make_links_blue(node): - if node["tagName"] == "a": - node["attributes"] = {"style": {"color": "blue"}} - return node - - expected = { - "tagName": "p", - "children": [ - "hello ", - { - "tagName": "a", - "children": ["world"], - "attributes": {"style": {"color": "blue"}}, - }, - " and ", - { - "tagName": "a", - "children": ["universe"], - "attributes": {"style": {"color": "blue"}}, - }, - "lmao", - ], - } - - assert html_to_vdom(source, make_links_blue) == expected - - -def test_non_html_tag_behavior(): - source = "<my-tag data-x=something><my-other-tag key=a-key /></my-tag>" - - expected = { - "tagName": "my-tag", - "attributes": {"data-x": "something"}, - "children": [ - {"tagName": "my-other-tag", "key": "a-key"}, - ], - } - - assert html_to_vdom(source, strict=False) == expected - - with pytest.raises(HTMLParseError): - html_to_vdom(source, strict=True) - - -def test_html_to_vdom_with_null_tag(): - source = "<p>hello<br>world</p>" - - expected = { - "tagName": "p", - "children": [ - "hello", - {"tagName": "br"}, - "world", - ], - } - - assert html_to_vdom(source) == expected - - -def test_html_to_vdom_with_style_attr(): - source = '<p style="color: red; background-color : green; ">Hello World.</p>' - - expected = { - "attributes": {"style": {"background_color": "green", "color": "red"}}, - "children": ["Hello World."], - "tagName": "p", - } - - assert html_to_vdom(source) == expected - - -def test_html_to_vdom_with_no_parent_node(): - source = "<p>Hello</p><div>World</div>" - - expected = { - "tagName": "div", - "children": [ - {"tagName": "p", "children": ["Hello"]}, - {"tagName": "div", "children": ["World"]}, - ], - } - - assert html_to_vdom(source) == expected - - -def test_del_html_body_transform(): - source = """ - <!DOCTYPE html> - <html lang="en"> - - <head> - <title>My Title</title> - </head> - - <body><h1>Hello World</h1></body> - - </html> - """ - - expected = { - "tagName": "", - "children": [ - { - "tagName": "", - "children": [{"tagName": "title", "children": ["My Title"]}], - }, - { - "tagName": "", - "children": [{"tagName": "h1", "children": ["Hello World"]}], - }, - ], - } - - assert html_to_vdom(source, del_html_head_body_transform) == expected - - -SOME_OBJECT = object() - - -@pytest.mark.parametrize( - "vdom_in, html_out", - [ - ( - html.div("hello"), - "<div>hello</div>", - ), - ( - html.div(SOME_OBJECT), - f"<div>{html_escape(str(SOME_OBJECT))}</div>", - ), - ( - html.div({"someAttribute": SOME_OBJECT}), - f'<div someattribute="{html_escape(str(SOME_OBJECT))}"></div>', - ), - ( - html.div( - "hello", html.a({"href": "https://example.com"}, "example"), "world" - ), - '<div>hello<a href="https://example.com">example</a>world</div>', - ), - ( - html.button({"on_click": lambda event: None}), - "<button></button>", - ), - ( - html._("hello ", html._("world")), - "hello world", - ), - ( - html._(html.div("hello"), html._("world")), - "<div>hello</div>world", - ), - ( - html.div({"style": {"backgroundColor": "blue", "marginLeft": "10px"}}), - '<div style="background-color:blue;margin-left:10px"></div>', - ), - ( - html.div({"style": "background-color:blue;margin-left:10px"}), - '<div style="background-color:blue;margin-left:10px"></div>', - ), - ( - html._( - html.div("hello"), - html.a({"href": "https://example.com"}, "example"), - ), - '<div>hello</div><a href="https://example.com">example</a>', - ), - ( - html.div( - html._( - html.div("hello"), - html.a({"href": "https://example.com"}, "example"), - ), - html.button(), - ), - '<div><div>hello</div><a href="https://example.com">example</a><button></button></div>', - ), - ( - html.div( - {"data_something": 1, "data_something_else": 2, "dataisnotdashed": 3} - ), - '<div data-something="1" data-something-else="2" dataisnotdashed="3"></div>', - ), - ( - html.div( - {"dataSomething": 1, "dataSomethingElse": 2, "dataisnotdashed": 3} - ), - '<div data-something="1" data-something-else="2" dataisnotdashed="3"></div>', - ), - ], -) -def test_vdom_to_html(vdom_in, html_out): - assert vdom_to_html(vdom_in) == html_out - - -def test_vdom_to_html_error(): - with pytest.raises(TypeError, match="Expected a VDOM dict"): - vdom_to_html({"notVdom": True}) diff --git a/src/py/reactpy/tests/test_web/__init__.py b/src/py/reactpy/tests/test_web/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/py/reactpy/tests/test_web/js_fixtures/component-can-have-child.js b/src/py/reactpy/tests/test_web/js_fixtures/component-can-have-child.js deleted file mode 100644 index fd443b164..000000000 --- a/src/py/reactpy/tests/test_web/js_fixtures/component-can-have-child.js +++ /dev/null @@ -1,27 +0,0 @@ -import { h, render } from "https://unpkg.com/preact?module"; -import htm from "https://unpkg.com/htm?module"; - -const html = htm.bind(h); - -export function bind(node, config) { - return { - create: (type, props, children) => h(type, props, ...children), - render: (element) => render(element, node), - unmount: () => render(null, node), - }; -} - -// The intention here is that Child components are passed in here so we check that the -// children of "the-parent" are "child-1" through "child-N" -export function Parent(props) { - return html` - <div> - <p>the parent</p> - <ul id="the-parent">${props.children}</div> - </div> - `; -} - -export function Child({ index }) { - return html`<li id="child-${index}">child ${index}</li>`; -} diff --git a/src/py/reactpy/tests/test_web/js_fixtures/export-resolution/index.js b/src/py/reactpy/tests/test_web/js_fixtures/export-resolution/index.js deleted file mode 100644 index 372f108bd..000000000 --- a/src/py/reactpy/tests/test_web/js_fixtures/export-resolution/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { index as Index }; -export * from "./one.js"; diff --git a/src/py/reactpy/tests/test_web/js_fixtures/export-resolution/one.js b/src/py/reactpy/tests/test_web/js_fixtures/export-resolution/one.js deleted file mode 100644 index ddea9d2cb..000000000 --- a/src/py/reactpy/tests/test_web/js_fixtures/export-resolution/one.js +++ /dev/null @@ -1,5 +0,0 @@ -export { one as One }; -// use ../ just to check that it works -export * from "../export-resolution/two.js"; -// this default should not be exported by the * re-export in index.js -export default 0; diff --git a/src/py/reactpy/tests/test_web/js_fixtures/export-resolution/two.js b/src/py/reactpy/tests/test_web/js_fixtures/export-resolution/two.js deleted file mode 100644 index f01389d2e..000000000 --- a/src/py/reactpy/tests/test_web/js_fixtures/export-resolution/two.js +++ /dev/null @@ -1,2 +0,0 @@ -export { two as Two }; -export * from "https://some.external.url"; diff --git a/src/py/reactpy/tests/test_web/js_fixtures/exports-syntax.js b/src/py/reactpy/tests/test_web/js_fixtures/exports-syntax.js deleted file mode 100644 index 8f9b0e612..000000000 --- a/src/py/reactpy/tests/test_web/js_fixtures/exports-syntax.js +++ /dev/null @@ -1,23 +0,0 @@ -// Copied from: https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export - -// Exporting individual features -export let name1, name2, name3; // also var, const -export let name4 = 4, name5 = 5, name6; // also var, const -export function functionName(){...} -export class ClassName {...} - -// Export list -export { name7, name8, name9 }; - -// Renaming exports -export { variable1 as name10, variable2 as name11, name12 }; - -// Exporting destructured assignments with renaming -export const { name13, name14: bar } = o; - -// Aggregating modules -export * from "https://source1.com"; // does not set the default export -export * from "https://source2.com"; // does not set the default export -export * as name15 from "https://source3.com"; // Draft ECMAScript® 2O21 -export { name16, name17 } from "https://source4.com"; -export { import1 as name18, import2 as name19, name20 } from "https://source5.com"; diff --git a/src/py/reactpy/tests/test_web/js_fixtures/exports-two-components.js b/src/py/reactpy/tests/test_web/js_fixtures/exports-two-components.js deleted file mode 100644 index 10aa7fdbe..000000000 --- a/src/py/reactpy/tests/test_web/js_fixtures/exports-two-components.js +++ /dev/null @@ -1,20 +0,0 @@ -import { h, render } from "https://unpkg.com/preact?module"; -import htm from "https://unpkg.com/htm?module"; - -const html = htm.bind(h); - -export function bind(node, config) { - return { - create: (type, props, children) => h(type, props, ...children), - render: (element) => render(element, node), - unmount: () => render(null, node), - }; -} - -export function Header1(props) { - return h("h1", { id: props.id }, props.text); -} - -export function Header2(props) { - return h("h2", { id: props.id }, props.text); -} diff --git a/src/py/reactpy/tests/test_web/js_fixtures/set-flag-when-unmount-is-called.js b/src/py/reactpy/tests/test_web/js_fixtures/set-flag-when-unmount-is-called.js deleted file mode 100644 index dbb1a1c99..000000000 --- a/src/py/reactpy/tests/test_web/js_fixtures/set-flag-when-unmount-is-called.js +++ /dev/null @@ -1,31 +0,0 @@ -export function bind(node, config) { - return { - create: (type, props, children) => type(props), - render: (element) => renderElement(element, node), - unmount: () => unmountElement(node), - }; -} - -export function renderElement(element, container) { - if (container.firstChild) { - container.removeChild(container.firstChild); - } - container.appendChild(element); -} - -export function unmountElement(container) { - // We add an element to the document.body to indicate that this function was called. - // Thus allowing Selenium to see communicate to server-side code that this effect - // did indeed occur. - const unmountFlag = document.createElement("h1"); - unmountFlag.setAttribute("id", "unmount-flag"); - document.body.appendChild(unmountFlag); - container.innerHTML = ""; -} - -export function SomeComponent(props) { - const element = document.createElement("h1"); - element.appendChild(document.createTextNode(props.text)); - element.setAttribute("id", props.id); - return element; -} diff --git a/src/py/reactpy/tests/test_web/js_fixtures/simple-button.js b/src/py/reactpy/tests/test_web/js_fixtures/simple-button.js deleted file mode 100644 index 2b49f505b..000000000 --- a/src/py/reactpy/tests/test_web/js_fixtures/simple-button.js +++ /dev/null @@ -1,25 +0,0 @@ -import { h, render } from "https://unpkg.com/preact?module"; -import htm from "https://unpkg.com/htm?module"; - -const html = htm.bind(h); - -export function bind(node, config) { - return { - create: (type, props, children) => h(type, props, ...children), - render: (element) => render(element, node), - unmount: () => render(null, node), - }; -} - -export function SimpleButton(props) { - return h( - "button", - { - id: props.id, - onClick(event) { - props.onClick({ data: props.eventResponseData }); - }, - }, - "simple button", - ); -} diff --git a/src/py/reactpy/tests/test_web/test_module.py b/src/py/reactpy/tests/test_web/test_module.py deleted file mode 100644 index f8783337d..000000000 --- a/src/py/reactpy/tests/test_web/test_module.py +++ /dev/null @@ -1,235 +0,0 @@ -from pathlib import Path - -import pytest -from sanic import Sanic - -import reactpy -from reactpy.backend import sanic as sanic_implementation -from reactpy.testing import ( - BackendFixture, - DisplayFixture, - assert_reactpy_did_log, - assert_reactpy_did_not_log, - poll, -) -from reactpy.web.module import NAME_SOURCE, WebModule - -JS_FIXTURES_DIR = Path(__file__).parent / "js_fixtures" - - -async def test_that_js_module_unmount_is_called(display: DisplayFixture): - SomeComponent = reactpy.web.export( - reactpy.web.module_from_file( - "set-flag-when-unmount-is-called", - JS_FIXTURES_DIR / "set-flag-when-unmount-is-called.js", - ), - "SomeComponent", - ) - - set_current_component = reactpy.Ref(None) - - @reactpy.component - def ShowCurrentComponent(): - current_component, set_current_component.current = reactpy.hooks.use_state( - lambda: SomeComponent({"id": "some-component", "text": "initial component"}) - ) - return current_component - - await display.show(ShowCurrentComponent) - - await display.page.wait_for_selector("#some-component", state="attached") - - set_current_component.current( - reactpy.html.h1({"id": "some-other-component"}, "some other component") - ) - - # the new component has been displayed - await display.page.wait_for_selector("#some-other-component", state="attached") - - # the unmount callback for the old component was called - await display.page.wait_for_selector("#unmount-flag", state="attached") - - -async def test_module_from_url(browser): - app = Sanic("test_module_from_url") - - # instead of directing the URL to a CDN, we just point it to this static file - app.static( - "/simple-button.js", - str(JS_FIXTURES_DIR / "simple-button.js"), - content_type="text/javascript", - ) - - SimpleButton = reactpy.web.export( - reactpy.web.module_from_url("/simple-button.js", resolve_exports=False), - "SimpleButton", - ) - - @reactpy.component - def ShowSimpleButton(): - return SimpleButton({"id": "my-button"}) - - async with BackendFixture(app=app, implementation=sanic_implementation) as server: - async with DisplayFixture(server, browser) as display: - await display.show(ShowSimpleButton) - - await display.page.wait_for_selector("#my-button") - - -def test_module_from_template_where_template_does_not_exist(): - with pytest.raises(ValueError, match="No template for 'does-not-exist.js'"): - reactpy.web.module_from_template("does-not-exist", "something.js") - - -async def test_module_from_template(display: DisplayFixture): - victory = reactpy.web.module_from_template("react@18.2.0", "victory-bar@35.4.0") - - assert "react@18.2.0" in victory.file.read_text() - VictoryBar = reactpy.web.export(victory, "VictoryBar") - await display.show(VictoryBar) - - await display.page.wait_for_selector(".VictoryContainer") - - -async def test_module_from_file(display: DisplayFixture): - SimpleButton = reactpy.web.export( - reactpy.web.module_from_file( - "simple-button", JS_FIXTURES_DIR / "simple-button.js" - ), - "SimpleButton", - ) - - is_clicked = reactpy.Ref(False) - - @reactpy.component - def ShowSimpleButton(): - return SimpleButton( - {"id": "my-button", "onClick": lambda event: is_clicked.set_current(True)} - ) - - await display.show(ShowSimpleButton) - - button = await display.page.wait_for_selector("#my-button") - await button.click() - await poll(lambda: is_clicked.current).until_is(True) - - -def test_module_from_file_source_conflict(tmp_path): - first_file = tmp_path / "first.js" - - with pytest.raises(FileNotFoundError, match="does not exist"): - reactpy.web.module_from_file("temp", first_file) - - first_file.touch() - - reactpy.web.module_from_file("temp", first_file) - - second_file = tmp_path / "second.js" - second_file.touch() - - # ok, same content - reactpy.web.module_from_file("temp", second_file) - - third_file = tmp_path / "third.js" - third_file.write_text("something-different") - - with assert_reactpy_did_log(r"Existing web module .* will be replaced with"): - reactpy.web.module_from_file("temp", third_file) - - -def test_web_module_from_file_symlink(tmp_path): - file = tmp_path / "temp.js" - file.touch() - - module = reactpy.web.module_from_file("temp", file, symlink=True) - - assert module.file.resolve().read_text() == "" - - file.write_text("hello world!") - - assert module.file.resolve().read_text() == "hello world!" - - -def test_web_module_from_file_symlink_twice(tmp_path): - file_1 = tmp_path / "temp_1.js" - file_1.touch() - - reactpy.web.module_from_file("temp", file_1, symlink=True) - - with assert_reactpy_did_not_log(r"Existing web module .* will be replaced with"): - reactpy.web.module_from_file("temp", file_1, symlink=True) - - file_2 = tmp_path / "temp_2.js" - file_2.write_text("something") - - with assert_reactpy_did_log(r"Existing web module .* will be replaced with"): - reactpy.web.module_from_file("temp", file_2, symlink=True) - - -def test_web_module_from_file_replace_existing(tmp_path): - file1 = tmp_path / "temp1.js" - file1.touch() - - reactpy.web.module_from_file("temp", file1) - - file2 = tmp_path / "temp2.js" - file2.write_text("something") - - with assert_reactpy_did_log(r"Existing web module .* will be replaced with"): - reactpy.web.module_from_file("temp", file2) - - -def test_module_missing_exports(): - module = WebModule("test", NAME_SOURCE, None, {"a", "b", "c"}, None, False) - - with pytest.raises(ValueError, match="does not export 'x'"): - reactpy.web.export(module, "x") - - with pytest.raises(ValueError, match=r"does not export \['x', 'y'\]"): - reactpy.web.export(module, ["x", "y"]) - - -async def test_module_exports_multiple_components(display: DisplayFixture): - Header1, Header2 = reactpy.web.export( - reactpy.web.module_from_file( - "exports-two-components", JS_FIXTURES_DIR / "exports-two-components.js" - ), - ["Header1", "Header2"], - ) - - await display.show(lambda: Header1({"id": "my-h1"}, "My Header 1")) - - await display.page.wait_for_selector("#my-h1", state="attached") - - await display.show(lambda: Header2({"id": "my-h2"}, "My Header 2")) - - await display.page.wait_for_selector("#my-h2", state="attached") - - -async def test_imported_components_can_render_children(display: DisplayFixture): - module = reactpy.web.module_from_file( - "component-can-have-child", JS_FIXTURES_DIR / "component-can-have-child.js" - ) - Parent, Child = reactpy.web.export(module, ["Parent", "Child"]) - - await display.show( - lambda: Parent( - Child({"index": 1}), - Child({"index": 2}), - Child({"index": 3}), - ) - ) - - parent = await display.page.wait_for_selector("#the-parent", state="attached") - children = await parent.query_selector_all("li") - - assert len(children) == 3 - - for index, child in enumerate(children): - assert (await child.get_attribute("id")) == f"child-{index + 1}" - - -def test_module_from_string(): - reactpy.web.module_from_string("temp", "old") - with assert_reactpy_did_log(r"Existing web module .* will be replaced with"): - reactpy.web.module_from_string("temp", "new") diff --git a/src/py/reactpy/tests/test_web/test_utils.py b/src/py/reactpy/tests/test_web/test_utils.py deleted file mode 100644 index 14c3e2e13..000000000 --- a/src/py/reactpy/tests/test_web/test_utils.py +++ /dev/null @@ -1,152 +0,0 @@ -from pathlib import Path - -import pytest -import responses - -from reactpy.testing import assert_reactpy_did_log -from reactpy.web.utils import ( - module_name_suffix, - resolve_module_exports_from_file, - resolve_module_exports_from_source, - resolve_module_exports_from_url, -) - -JS_FIXTURES_DIR = Path(__file__).parent / "js_fixtures" - - -@pytest.mark.parametrize( - "name, suffix", - [ - ("module", ".js"), - ("module.ext", ".ext"), - ("module@x.y.z", ".js"), - ("module.ext@x.y.z", ".ext"), - ("@namespace/module", ".js"), - ("@namespace/module.ext", ".ext"), - ("@namespace/module@x.y.z", ".js"), - ("@namespace/module.ext@x.y.z", ".ext"), - ], -) -def test_module_name_suffix(name, suffix): - assert module_name_suffix(name) == suffix - - -@responses.activate -def test_resolve_module_exports_from_file(caplog): - responses.add( - responses.GET, - "https://some.external.url", - body="export {something as ExternalUrl}", - ) - path = JS_FIXTURES_DIR / "export-resolution" / "index.js" - assert resolve_module_exports_from_file(path, 4) == { - "Index", - "One", - "Two", - "ExternalUrl", - } - - -def test_resolve_module_exports_from_file_log_on_max_depth(caplog): - path = JS_FIXTURES_DIR / "export-resolution" / "index.js" - assert resolve_module_exports_from_file(path, 0) == set() - assert len(caplog.records) == 1 - assert caplog.records[0].message.endswith("max depth reached") - - caplog.records.clear() - - assert resolve_module_exports_from_file(path, 2) == {"Index", "One"} - assert len(caplog.records) == 1 - assert caplog.records[0].message.endswith("max depth reached") - - -def test_resolve_module_exports_from_file_log_on_unknown_file_location( - caplog, tmp_path -): - file = tmp_path / "some.js" - file.write_text("export * from './does-not-exist.js';") - resolve_module_exports_from_file(file, 2) - assert len(caplog.records) == 1 - assert caplog.records[0].message.startswith( - "Did not resolve exports for unknown file" - ) - - -@responses.activate -def test_resolve_module_exports_from_url(): - responses.add( - responses.GET, - "https://some.url/first.js", - body="export const First = 1; export * from 'https://another.url/path/second.js';", - ) - responses.add( - responses.GET, - "https://another.url/path/second.js", - body="export const Second = 2; export * from '../third.js';", - ) - responses.add( - responses.GET, - "https://another.url/third.js", - body="export const Third = 3; export * from './fourth.js';", - ) - responses.add( - responses.GET, - "https://another.url/fourth.js", - body="export const Fourth = 4;", - ) - - assert resolve_module_exports_from_url("https://some.url/first.js", 4) == { - "First", - "Second", - "Third", - "Fourth", - } - - -def test_resolve_module_exports_from_url_log_on_max_depth(caplog): - assert resolve_module_exports_from_url("https://some.url", 0) == set() - assert len(caplog.records) == 1 - assert caplog.records[0].message.endswith("max depth reached") - - -def test_resolve_module_exports_from_url_log_on_bad_response(caplog): - assert resolve_module_exports_from_url("https://some.url", 1) == set() - assert len(caplog.records) == 1 - assert caplog.records[0].message.startswith("Did not resolve exports for url") - - -@pytest.mark.parametrize( - "text", - [ - "export default expression;", - "export default function (…) { … } // also class, function*", - "export default function name1(…) { … } // also class, function*", - "export { something as default };", - "export { default } from 'some-source';", - "export { something as default } from 'some-source';", - ], -) -def test_resolve_module_default_exports_from_source(text): - names, references = resolve_module_exports_from_source(text, exclude_default=False) - assert names == {"default"} and not references - - -def test_resolve_module_exports_from_source(): - fixture_file = JS_FIXTURES_DIR / "exports-syntax.js" - names, references = resolve_module_exports_from_source( - fixture_file.read_text(), exclude_default=False - ) - assert names == ( - {f"name{i}" for i in range(1, 21)} - | { - "functionName", - "ClassName", - } - ) and references == {"https://source1.com", "https://source2.com"} - - -def test_log_on_unknown_export_type(): - with assert_reactpy_did_log(match_message="Unknown export type "): - assert resolve_module_exports_from_source( - "export something unknown;", exclude_default=False - ) == (set(), set()) diff --git a/src/py/reactpy/tests/test_widgets.py b/src/py/reactpy/tests/test_widgets.py deleted file mode 100644 index d786fded0..000000000 --- a/src/py/reactpy/tests/test_widgets.py +++ /dev/null @@ -1,141 +0,0 @@ -from base64 import b64encode -from pathlib import Path - -import reactpy -from reactpy.testing import DisplayFixture, poll -from tests.tooling.common import DEFAULT_TYPE_DELAY - -HERE = Path(__file__).parent - - -IMAGE_SRC_BYTES = b""" -<svg width="400" height="110" xmlns="http://www.w3.org/2000/svg"> - <rect width="300" height="100" style="fill:rgb(0,0,255);" /> -</svg> -""" -BASE64_IMAGE_SRC = b64encode(IMAGE_SRC_BYTES).decode() - - -async def test_image_from_string(display: DisplayFixture): - src = IMAGE_SRC_BYTES.decode() - await display.show(lambda: reactpy.widgets.image("svg", src, {"id": "a-circle-1"})) - client_img = await display.page.wait_for_selector("#a-circle-1") - assert BASE64_IMAGE_SRC in (await client_img.get_attribute("src")) - - -async def test_image_from_bytes(display: DisplayFixture): - src = IMAGE_SRC_BYTES - await display.show(lambda: reactpy.widgets.image("svg", src, {"id": "a-circle-1"})) - client_img = await display.page.wait_for_selector("#a-circle-1") - assert BASE64_IMAGE_SRC in (await client_img.get_attribute("src")) - - -async def test_use_linked_inputs(display: DisplayFixture): - @reactpy.component - def SomeComponent(): - i_1, i_2 = reactpy.widgets.use_linked_inputs([{"id": "i_1"}, {"id": "i_2"}]) - return reactpy.html.div(i_1, i_2) - - await display.show(SomeComponent) - - input_1 = await display.page.wait_for_selector("#i_1") - input_2 = await display.page.wait_for_selector("#i_2") - - await input_1.type("hello", delay=DEFAULT_TYPE_DELAY) - - assert (await input_1.evaluate("e => e.value")) == "hello" - assert (await input_2.evaluate("e => e.value")) == "hello" - - await input_2.focus() - await input_2.type(" world", delay=DEFAULT_TYPE_DELAY) - - assert (await input_1.evaluate("e => e.value")) == "hello world" - assert (await input_2.evaluate("e => e.value")) == "hello world" - - -async def test_use_linked_inputs_on_change(display: DisplayFixture): - value = reactpy.Ref(None) - - @reactpy.component - def SomeComponent(): - i_1, i_2 = reactpy.widgets.use_linked_inputs( - [{"id": "i_1"}, {"id": "i_2"}], - on_change=value.set_current, - ) - return reactpy.html.div(i_1, i_2) - - await display.show(SomeComponent) - - input_1 = await display.page.wait_for_selector("#i_1") - input_2 = await display.page.wait_for_selector("#i_2") - - await input_1.type("hello", delay=DEFAULT_TYPE_DELAY) - - poll_value = poll(lambda: value.current) - - await poll_value.until_equals("hello") - - await input_2.focus() - await input_2.type(" world", delay=DEFAULT_TYPE_DELAY) - - await poll_value.until_equals("hello world") - - -async def test_use_linked_inputs_on_change_with_cast(display: DisplayFixture): - value = reactpy.Ref(None) - - @reactpy.component - def SomeComponent(): - i_1, i_2 = reactpy.widgets.use_linked_inputs( - [{"id": "i_1"}, {"id": "i_2"}], on_change=value.set_current, cast=int - ) - return reactpy.html.div(i_1, i_2) - - await display.show(SomeComponent) - - input_1 = await display.page.wait_for_selector("#i_1") - input_2 = await display.page.wait_for_selector("#i_2") - - await input_1.type("1") - - poll_value = poll(lambda: value.current) - - await poll_value.until_equals(1) - - await input_2.focus() - await input_2.type("2") - - await poll_value.until_equals(12) - - -async def test_use_linked_inputs_ignore_empty(display: DisplayFixture): - value = reactpy.Ref(None) - - @reactpy.component - def SomeComponent(): - i_1, i_2 = reactpy.widgets.use_linked_inputs( - [{"id": "i_1"}, {"id": "i_2"}], - on_change=value.set_current, - ignore_empty=True, - ) - return reactpy.html.div(i_1, i_2) - - await display.show(SomeComponent) - - input_1 = await display.page.wait_for_selector("#i_1") - input_2 = await display.page.wait_for_selector("#i_2") - - await input_1.type("1") - - poll_value = poll(lambda: value.current) - - await poll_value.until_equals("1") - - await input_2.focus() - await input_2.press("Backspace") - - await poll_value.until_equals("1") - - await input_2.type("2") - - await poll_value.until_equals("2") diff --git a/src/py/reactpy/tests/tooling/__init__.py b/src/py/reactpy/tests/tooling/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/py/reactpy/tests/tooling/asserts.py b/src/py/reactpy/tests/tooling/asserts.py deleted file mode 100644 index ac84aa0ba..000000000 --- a/src/py/reactpy/tests/tooling/asserts.py +++ /dev/null @@ -1,5 +0,0 @@ -def assert_same_items(left, right): - """Check that two unordered sequences are equal (only works if reprs are equal)""" - sorted_left = sorted(left, key=repr) - sorted_right = sorted(right, key=repr) - assert sorted_left == sorted_right diff --git a/src/py/reactpy/tests/tooling/common.py b/src/py/reactpy/tests/tooling/common.py deleted file mode 100644 index c0191bd4e..000000000 --- a/src/py/reactpy/tests/tooling/common.py +++ /dev/null @@ -1,14 +0,0 @@ -from typing import Any - -from reactpy.core.types import LayoutEventMessage, LayoutUpdateMessage - -# see: https://github.com/microsoft/playwright-python/issues/1614 -DEFAULT_TYPE_DELAY = 100 # milliseconds - - -def event_message(target: str, *data: Any) -> LayoutEventMessage: - return {"type": "layout-event", "target": target, "data": data} - - -def update_message(path: str, model: Any) -> LayoutUpdateMessage: - return {"type": "layout-update", "path": path, "model": model} diff --git a/src/py/reactpy/tests/tooling/hooks.py b/src/py/reactpy/tests/tooling/hooks.py deleted file mode 100644 index 1926a93bc..000000000 --- a/src/py/reactpy/tests/tooling/hooks.py +++ /dev/null @@ -1,15 +0,0 @@ -from reactpy.core.hooks import current_hook, use_state - - -def use_force_render(): - return current_hook().schedule_render - - -def use_toggle(init=False): - state, set_state = use_state(init) - return state, lambda: set_state(lambda old: not old) - - -def use_counter(initial_value): - state, set_state = use_state(initial_value) - return state, lambda: set_state(lambda old: old + 1) diff --git a/src/py/reactpy/tests/tooling/loop.py b/src/py/reactpy/tests/tooling/loop.py deleted file mode 100644 index f9e100981..000000000 --- a/src/py/reactpy/tests/tooling/loop.py +++ /dev/null @@ -1,91 +0,0 @@ -import asyncio -import threading -import time -from asyncio import wait_for -from collections.abc import Iterator -from contextlib import contextmanager - -from reactpy.config import REACTPY_TESTING_DEFAULT_TIMEOUT - - -@contextmanager -def open_event_loop(as_current: bool = True) -> Iterator[asyncio.AbstractEventLoop]: - """Open a new event loop and cleanly stop it - - Args: - as_current: whether to make this loop the current loop in this thread - """ - loop = asyncio.new_event_loop() - try: - if as_current: - asyncio.set_event_loop(loop) - loop.set_debug(True) - yield loop - finally: - try: - _cancel_all_tasks(loop, as_current) - if as_current: - loop.run_until_complete( - wait_for( - loop.shutdown_asyncgens(), - REACTPY_TESTING_DEFAULT_TIMEOUT.current, - ) - ) - loop.run_until_complete( - wait_for( - loop.shutdown_default_executor(), - REACTPY_TESTING_DEFAULT_TIMEOUT.current, - ) - ) - finally: - if as_current: - asyncio.set_event_loop(None) - start = time.time() - while loop.is_running(): - if (time.time() - start) > REACTPY_TESTING_DEFAULT_TIMEOUT.current: - msg = f"Failed to stop loop after {REACTPY_TESTING_DEFAULT_TIMEOUT.current} seconds" - raise TimeoutError(msg) - time.sleep(0.1) - loop.close() - - -def _cancel_all_tasks(loop: asyncio.AbstractEventLoop, is_current: bool) -> None: - to_cancel = asyncio.all_tasks(loop) - if not to_cancel: - return - - done = threading.Event() - count = len(to_cancel) - - def one_task_finished(future): - nonlocal count - count -= 1 - if count == 0: - done.set() - - for task in to_cancel: - loop.call_soon_threadsafe(task.cancel) - task.add_done_callback(one_task_finished) - - if is_current: - loop.run_until_complete( - wait_for( - asyncio.gather(*to_cancel, return_exceptions=True), - REACTPY_TESTING_DEFAULT_TIMEOUT.current, - ) - ) - elif not done.wait(timeout=3): # user was responsible for cancelling all tasks - msg = "Could not stop event loop in time" - raise TimeoutError(msg) - - for task in to_cancel: - if task.cancelled(): - continue - if task.exception() is not None: - loop.call_exception_handler( - { - "message": "unhandled exception during event loop shutdown", - "exception": task.exception(), - "task": task, - } - ) From fb84879c9b2504a56cfd2202807091ae1fc91b63 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 14 Mar 2025 22:07:23 -0700 Subject: [PATCH 48/49] ReactPy V2 changes --- .../asgi_component.py | 6 + .../asgi_configure_jinja.py | 20 + .../asgi_middleware.py | 22 + .../asgi_template.html | 12 + .../examples/creating_a_react_app/asgi_csr.py | 7 + .../creating_a_react_app/asgi_csr_root.py | 6 + .../examples/creating_a_react_app/asgi_ssr.py | 10 + .../python/quick_start/adding_styles.py | 4 - .../simple_button_event.py | 22 - .../configure_example.py | 6 - .../thinking_in_react/set_state_props.py | 32 - .../{css => }/quick_start/adding_styles.css | 0 docs/examples/quick_start/adding_styles.py | 4 + .../quick_start/conditional_rendering.py | 0 .../conditional_rendering_logical_and.py | 0 .../conditional_rendering_ternary.py | 0 .../creating_and_nesting_components.py | 7 - .../{css => }/quick_start/displaying_data.css | 0 .../quick_start/displaying_data.py | 14 +- .../{python => }/quick_start/my_app.py | 0 .../{python => }/quick_start/my_button.py | 0 .../quick_start/rendering_lists.py | 7 - .../quick_start/rendering_lists_list_items.py | 0 .../quick_start/rendering_lists_products.py | 0 .../quick_start/responding_to_events.py | 2 +- .../sharing_data_between_components.css | 0 .../sharing_data_between_components.py | 14 +- .../sharing_data_between_components_button.py | 2 +- ...ring_data_between_components_move_state.py | 0 .../sharing_data_between_components_props.py | 0 .../quick_start/updating_the_screen.css | 0 .../quick_start/updating_the_screen.py | 14 +- .../quick_start/updating_the_screen_event.py | 2 +- .../updating_the_screen_use_state.py | 0 .../updating_the_screen_use_state_button.py | 0 .../responding_to_events/simple_button.py | 0 .../simple_button_event.css | 0 .../simple_button_event.py | 9 + .../add_inverse_data_flow.css | 0 .../add_inverse_data_flow.py | 16 +- .../build_a_static_version_in_react.css | 0 .../build_a_static_version_in_react.py | 12 - .../thinking_in_react/error_example.py | 0 .../thinking_in_react/event_handlers.py | 5 +- .../identify_where_your_state_should_live.css | 0 .../identify_where_your_state_should_live.py | 12 - .../thinking_in_react/set_state_props.py | 20 + .../start_with_the_mockup.json | 0 .../thinking_in_react/use_state.py | 0 .../use_state_with_components.py | 0 .../setup_for_the_tutorial.css | 0 .../setup_for_the_tutorial.py | 3 +- .../tutorial_tic_tac_toe/tic_tac_toe.css | 0 .../tutorial_tic_tac_toe/tic_tac_toe.py | 20 +- docs/mkdocs.yml | 12 +- docs/overrides/home.html | 2 +- .../learn/add-react-to-an-existing-project.md | 179 +- docs/src/learn/creating-a-react-app.md | 95 + docs/src/learn/installation.md | 4 +- docs/src/learn/quick-start.md | 56 +- docs/src/learn/responding-to-events.md | 432 +-- docs/src/learn/start-a-new-react-project.md | 155 - docs/src/learn/thinking-in-react.md | 30 +- docs/src/learn/tutorial-tic-tac-toe.md | 3200 ++++++++--------- tasks.py | 426 --- 65 files changed, 2173 insertions(+), 2728 deletions(-) create mode 100644 docs/examples/add_react_to_an_existing_project/asgi_component.py create mode 100644 docs/examples/add_react_to_an_existing_project/asgi_configure_jinja.py create mode 100644 docs/examples/add_react_to_an_existing_project/asgi_middleware.py create mode 100644 docs/examples/add_react_to_an_existing_project/asgi_template.html create mode 100644 docs/examples/creating_a_react_app/asgi_csr.py create mode 100644 docs/examples/creating_a_react_app/asgi_csr_root.py create mode 100644 docs/examples/creating_a_react_app/asgi_ssr.py delete mode 100644 docs/examples/python/quick_start/adding_styles.py delete mode 100644 docs/examples/python/responding_to_events/simple_button_event.py delete mode 100644 docs/examples/python/start_a_new_react_project/configure_example.py delete mode 100644 docs/examples/python/thinking_in_react/set_state_props.py rename docs/examples/{css => }/quick_start/adding_styles.css (100%) create mode 100644 docs/examples/quick_start/adding_styles.py rename docs/examples/{python => }/quick_start/conditional_rendering.py (100%) rename docs/examples/{python => }/quick_start/conditional_rendering_logical_and.py (100%) rename docs/examples/{python => }/quick_start/conditional_rendering_ternary.py (100%) rename docs/examples/{python => }/quick_start/creating_and_nesting_components.py (73%) rename docs/examples/{css => }/quick_start/displaying_data.css (100%) rename docs/examples/{python => }/quick_start/displaying_data.py (66%) rename docs/examples/{python => }/quick_start/my_app.py (100%) rename docs/examples/{python => }/quick_start/my_button.py (100%) rename docs/examples/{python => }/quick_start/rendering_lists.py (86%) rename docs/examples/{python => }/quick_start/rendering_lists_list_items.py (100%) rename docs/examples/{python => }/quick_start/rendering_lists_products.py (100%) rename docs/examples/{python => }/quick_start/responding_to_events.py (83%) rename docs/examples/{css => }/quick_start/sharing_data_between_components.css (100%) rename docs/examples/{python => }/quick_start/sharing_data_between_components.py (55%) rename docs/examples/{python => }/quick_start/sharing_data_between_components_button.py (54%) rename docs/examples/{python => }/quick_start/sharing_data_between_components_move_state.py (100%) rename docs/examples/{python => }/quick_start/sharing_data_between_components_props.py (100%) rename docs/examples/{css => }/quick_start/updating_the_screen.css (100%) rename docs/examples/{python => }/quick_start/updating_the_screen.py (51%) rename docs/examples/{python => }/quick_start/updating_the_screen_event.py (70%) rename docs/examples/{python => }/quick_start/updating_the_screen_use_state.py (100%) rename docs/examples/{python => }/quick_start/updating_the_screen_use_state_button.py (100%) rename docs/examples/{python => }/responding_to_events/simple_button.py (100%) rename docs/examples/{css => }/responding_to_events/simple_button_event.css (100%) create mode 100644 docs/examples/responding_to_events/simple_button_event.py rename docs/examples/{css => }/thinking_in_react/add_inverse_data_flow.css (100%) rename docs/examples/{python => }/thinking_in_react/add_inverse_data_flow.py (88%) rename docs/examples/{css => }/thinking_in_react/build_a_static_version_in_react.css (100%) rename docs/examples/{python => }/thinking_in_react/build_a_static_version_in_react.py (88%) rename docs/examples/{python => }/thinking_in_react/error_example.py (100%) rename docs/examples/{python => }/thinking_in_react/event_handlers.py (60%) rename docs/examples/{css => }/thinking_in_react/identify_where_your_state_should_live.css (100%) rename docs/examples/{python => }/thinking_in_react/identify_where_your_state_should_live.py (91%) create mode 100644 docs/examples/thinking_in_react/set_state_props.py rename docs/examples/{json => }/thinking_in_react/start_with_the_mockup.json (100%) rename docs/examples/{python => }/thinking_in_react/use_state.py (100%) rename docs/examples/{python => }/thinking_in_react/use_state_with_components.py (100%) rename docs/examples/{css => }/tutorial_tic_tac_toe/setup_for_the_tutorial.css (100%) rename docs/examples/{python => }/tutorial_tic_tac_toe/setup_for_the_tutorial.py (56%) rename docs/examples/{css => }/tutorial_tic_tac_toe/tic_tac_toe.css (100%) rename docs/examples/{python => }/tutorial_tic_tac_toe/tic_tac_toe.py (87%) create mode 100644 docs/src/learn/creating-a-react-app.md delete mode 100644 docs/src/learn/start-a-new-react-project.md delete mode 100644 tasks.py diff --git a/docs/examples/add_react_to_an_existing_project/asgi_component.py b/docs/examples/add_react_to_an_existing_project/asgi_component.py new file mode 100644 index 000000000..ed1a6b25b --- /dev/null +++ b/docs/examples/add_react_to_an_existing_project/asgi_component.py @@ -0,0 +1,6 @@ +from reactpy import component, html + + +@component +def hello_world(): + return html.div("Hello World") diff --git a/docs/examples/add_react_to_an_existing_project/asgi_configure_jinja.py b/docs/examples/add_react_to_an_existing_project/asgi_configure_jinja.py new file mode 100644 index 000000000..e22212e75 --- /dev/null +++ b/docs/examples/add_react_to_an_existing_project/asgi_configure_jinja.py @@ -0,0 +1,20 @@ +from jinja2 import Environment, FileSystemLoader +from starlette.applications import Starlette +from starlette.routing import Route +from starlette.templating import Jinja2Templates + +from reactpy.templatetags import ReactPyJinja + +jinja_templates = Jinja2Templates( + env=Environment( + loader=FileSystemLoader("path/to/my_templates"), + extensions=[ReactPyJinja], + ) +) + + +async def example_webpage(request): + return jinja_templates.TemplateResponse(request, "my_template.html") + + +starlette_app = Starlette(routes=[Route("/", example_webpage)]) diff --git a/docs/examples/add_react_to_an_existing_project/asgi_middleware.py b/docs/examples/add_react_to_an_existing_project/asgi_middleware.py new file mode 100644 index 000000000..2e397be02 --- /dev/null +++ b/docs/examples/add_react_to_an_existing_project/asgi_middleware.py @@ -0,0 +1,22 @@ +from jinja2 import Environment, FileSystemLoader +from starlette.applications import Starlette +from starlette.routing import Route +from starlette.templating import Jinja2Templates + +from reactpy.executors.asgi import ReactPyMiddleware +from reactpy.templatetags import ReactPyJinja + +jinja_templates = Jinja2Templates( + env=Environment( + loader=FileSystemLoader("path/to/my_templates"), + extensions=[ReactPyJinja], + ) +) + + +async def example_webpage(request): + return jinja_templates.TemplateResponse(request, "my_template.html") + + +starlette_app = Starlette(routes=[Route("/", example_webpage)]) +reactpy_app = ReactPyMiddleware(starlette_app, ["my_components.hello_world"]) diff --git a/docs/examples/add_react_to_an_existing_project/asgi_template.html b/docs/examples/add_react_to_an_existing_project/asgi_template.html new file mode 100644 index 000000000..4fe678b8b --- /dev/null +++ b/docs/examples/add_react_to_an_existing_project/asgi_template.html @@ -0,0 +1,12 @@ +<!doctype html> +<html lang="en"> + +<head> + <title>ReactPy in Django</title> +</head> + +<body> + {% component "my_components.hello_world" %} +</body> + +</html> diff --git a/docs/examples/creating_a_react_app/asgi_csr.py b/docs/examples/creating_a_react_app/asgi_csr.py new file mode 100644 index 000000000..506930d33 --- /dev/null +++ b/docs/examples/creating_a_react_app/asgi_csr.py @@ -0,0 +1,7 @@ +from pathlib import Path + +from reactpy.executors.asgi import ReactPyCsr + +my_app = ReactPyCsr( + Path(__file__).parent / "components" / "root.py", initial="Loading..." +) diff --git a/docs/examples/creating_a_react_app/asgi_csr_root.py b/docs/examples/creating_a_react_app/asgi_csr_root.py new file mode 100644 index 000000000..8a6c17c55 --- /dev/null +++ b/docs/examples/creating_a_react_app/asgi_csr_root.py @@ -0,0 +1,6 @@ +from reactpy import component, html + + +@component +def root(): + return html.div("Hello World") diff --git a/docs/examples/creating_a_react_app/asgi_ssr.py b/docs/examples/creating_a_react_app/asgi_ssr.py new file mode 100644 index 000000000..d2e9b72ff --- /dev/null +++ b/docs/examples/creating_a_react_app/asgi_ssr.py @@ -0,0 +1,10 @@ +from reactpy import component, html +from reactpy.executors.asgi import ReactPy + + +@component +def hello_world(): + return html.div("Hello World") + + +my_app = ReactPy(hello_world) diff --git a/docs/examples/python/quick_start/adding_styles.py b/docs/examples/python/quick_start/adding_styles.py deleted file mode 100644 index cdc9a7b99..000000000 --- a/docs/examples/python/quick_start/adding_styles.py +++ /dev/null @@ -1,4 +0,0 @@ -from reactpy import html - -# start -html.img({"class_name": "avatar"}) diff --git a/docs/examples/python/responding_to_events/simple_button_event.py b/docs/examples/python/responding_to_events/simple_button_event.py deleted file mode 100644 index 292f3531c..000000000 --- a/docs/examples/python/responding_to_events/simple_button_event.py +++ /dev/null @@ -1,22 +0,0 @@ -from reactpy import component, html - - -@component -def button(): - def handle_click(event): - print("You clicked me!") - - return html.button({"on_click": handle_click}, "Click me") - - - -# end -if __name__ == "__main__": - from reactpy import run - from reactpy.utils import _read_docs_css - - @component - def styled_app(): - return html._(html.style(_read_docs_css()), button()) - - run(styled_app) diff --git a/docs/examples/python/start_a_new_react_project/configure_example.py b/docs/examples/python/start_a_new_react_project/configure_example.py deleted file mode 100644 index c04a0e54d..000000000 --- a/docs/examples/python/start_a_new_react_project/configure_example.py +++ /dev/null @@ -1,6 +0,0 @@ -from fastapi import FastAPI - -from reactpy.backend.fastapi import configure - -asgi_app = FastAPI() -configure(asgi_app) diff --git a/docs/examples/python/thinking_in_react/set_state_props.py b/docs/examples/python/thinking_in_react/set_state_props.py deleted file mode 100644 index bbd601416..000000000 --- a/docs/examples/python/thinking_in_react/set_state_props.py +++ /dev/null @@ -1,32 +0,0 @@ -# function filterable_product_table({ products }) { -# const [filter_text, set_filter_text] = use_state(''); -# const [in_stock_only, set_in_stock_only] = use_state(false); - -# return ( -# <div> -# <search_bar -# filter_text={filter_text} -# in_stock_only={in_stock_only} -# on_filter_text_change={set_filter_text} -# on_in_stock_only_change={set_in_stock_only} /> - -from reactpy import component, hooks, html - - -def search_bar(**_kws): - ... - -# start -@component -def filterable_product_table(products): - filter_text, set_filter_text = hooks.use_state("") - in_stock_only, set_in_stock_only = hooks.use_state(False) - - return html.div( - search_bar( - filter_text=filter_text, - in_stock_only=in_stock_only, - set_filter_text=set_filter_text, - set_in_stock_only=set_in_stock_only - ) - ) diff --git a/docs/examples/css/quick_start/adding_styles.css b/docs/examples/quick_start/adding_styles.css similarity index 100% rename from docs/examples/css/quick_start/adding_styles.css rename to docs/examples/quick_start/adding_styles.css diff --git a/docs/examples/quick_start/adding_styles.py b/docs/examples/quick_start/adding_styles.py new file mode 100644 index 000000000..8e1c7931b --- /dev/null +++ b/docs/examples/quick_start/adding_styles.py @@ -0,0 +1,4 @@ +from reactpy import html + +# start +html.img({"className": "avatar"}) diff --git a/docs/examples/python/quick_start/conditional_rendering.py b/docs/examples/quick_start/conditional_rendering.py similarity index 100% rename from docs/examples/python/quick_start/conditional_rendering.py rename to docs/examples/quick_start/conditional_rendering.py diff --git a/docs/examples/python/quick_start/conditional_rendering_logical_and.py b/docs/examples/quick_start/conditional_rendering_logical_and.py similarity index 100% rename from docs/examples/python/quick_start/conditional_rendering_logical_and.py rename to docs/examples/quick_start/conditional_rendering_logical_and.py diff --git a/docs/examples/python/quick_start/conditional_rendering_ternary.py b/docs/examples/quick_start/conditional_rendering_ternary.py similarity index 100% rename from docs/examples/python/quick_start/conditional_rendering_ternary.py rename to docs/examples/quick_start/conditional_rendering_ternary.py diff --git a/docs/examples/python/quick_start/creating_and_nesting_components.py b/docs/examples/quick_start/creating_and_nesting_components.py similarity index 73% rename from docs/examples/python/quick_start/creating_and_nesting_components.py rename to docs/examples/quick_start/creating_and_nesting_components.py index 0841e9514..99ff909a2 100644 --- a/docs/examples/python/quick_start/creating_and_nesting_components.py +++ b/docs/examples/quick_start/creating_and_nesting_components.py @@ -12,10 +12,3 @@ def my_app(): html.h1("Welcome to my app"), my_button(), ) - - -# end -if __name__ == "__main__": - from reactpy import run - - run(my_app) diff --git a/docs/examples/css/quick_start/displaying_data.css b/docs/examples/quick_start/displaying_data.css similarity index 100% rename from docs/examples/css/quick_start/displaying_data.css rename to docs/examples/quick_start/displaying_data.css diff --git a/docs/examples/python/quick_start/displaying_data.py b/docs/examples/quick_start/displaying_data.py similarity index 66% rename from docs/examples/python/quick_start/displaying_data.py rename to docs/examples/quick_start/displaying_data.py index 3534fe29d..3edf62674 100644 --- a/docs/examples/python/quick_start/displaying_data.py +++ b/docs/examples/quick_start/displaying_data.py @@ -13,7 +13,7 @@ def profile(): html.h3(user["name"]), html.img( { - "class_name": "avatar", + "className": "avatar", "src": user["image_url"], "alt": f"Photo of {user['name']}", "style": { @@ -23,15 +23,3 @@ def profile(): } ), ) - - -# end -if __name__ == "__main__": - from reactpy import run - from reactpy.utils import _read_docs_css - - @component - def styled_app(): - return html._(html.style(_read_docs_css()), profile()) - - run(styled_app) diff --git a/docs/examples/python/quick_start/my_app.py b/docs/examples/quick_start/my_app.py similarity index 100% rename from docs/examples/python/quick_start/my_app.py rename to docs/examples/quick_start/my_app.py diff --git a/docs/examples/python/quick_start/my_button.py b/docs/examples/quick_start/my_button.py similarity index 100% rename from docs/examples/python/quick_start/my_button.py rename to docs/examples/quick_start/my_button.py diff --git a/docs/examples/python/quick_start/rendering_lists.py b/docs/examples/quick_start/rendering_lists.py similarity index 86% rename from docs/examples/python/quick_start/rendering_lists.py rename to docs/examples/quick_start/rendering_lists.py index 35ec3e069..be75f8ce2 100644 --- a/docs/examples/python/quick_start/rendering_lists.py +++ b/docs/examples/quick_start/rendering_lists.py @@ -21,10 +21,3 @@ def shopping_list(): ] return html.ul(list_items) - - -# end -if __name__ == "__main__": - from reactpy import run - - run(shopping_list) diff --git a/docs/examples/python/quick_start/rendering_lists_list_items.py b/docs/examples/quick_start/rendering_lists_list_items.py similarity index 100% rename from docs/examples/python/quick_start/rendering_lists_list_items.py rename to docs/examples/quick_start/rendering_lists_list_items.py diff --git a/docs/examples/python/quick_start/rendering_lists_products.py b/docs/examples/quick_start/rendering_lists_products.py similarity index 100% rename from docs/examples/python/quick_start/rendering_lists_products.py rename to docs/examples/quick_start/rendering_lists_products.py diff --git a/docs/examples/python/quick_start/responding_to_events.py b/docs/examples/quick_start/responding_to_events.py similarity index 83% rename from docs/examples/python/quick_start/responding_to_events.py rename to docs/examples/quick_start/responding_to_events.py index c893353cf..613f11ca2 100644 --- a/docs/examples/python/quick_start/responding_to_events.py +++ b/docs/examples/quick_start/responding_to_events.py @@ -8,6 +8,6 @@ def handle_click(event): print("You clicked me!") return html.button( - {"on_click": handle_click}, + {"onClick": handle_click}, "Click me", ) diff --git a/docs/examples/css/quick_start/sharing_data_between_components.css b/docs/examples/quick_start/sharing_data_between_components.css similarity index 100% rename from docs/examples/css/quick_start/sharing_data_between_components.css rename to docs/examples/quick_start/sharing_data_between_components.css diff --git a/docs/examples/python/quick_start/sharing_data_between_components.py b/docs/examples/quick_start/sharing_data_between_components.py similarity index 55% rename from docs/examples/python/quick_start/sharing_data_between_components.py rename to docs/examples/quick_start/sharing_data_between_components.py index b256e6ecc..f781bca9b 100644 --- a/docs/examples/python/quick_start/sharing_data_between_components.py +++ b/docs/examples/quick_start/sharing_data_between_components.py @@ -17,16 +17,4 @@ def handle_click(event): @component def my_button(count, on_click): - return html.button({"on_click": on_click}, f"Clicked {count} times") - - -# end -if __name__ == "__main__": - from reactpy import run - from reactpy.utils import _read_docs_css - - @component - def styled_app(): - return html._(html.style(_read_docs_css()), my_app()) - - run(styled_app) + return html.button({"onClick": on_click}, f"Clicked {count} times") diff --git a/docs/examples/python/quick_start/sharing_data_between_components_button.py b/docs/examples/quick_start/sharing_data_between_components_button.py similarity index 54% rename from docs/examples/python/quick_start/sharing_data_between_components_button.py rename to docs/examples/quick_start/sharing_data_between_components_button.py index b96dadfa6..a9a4911f2 100644 --- a/docs/examples/python/quick_start/sharing_data_between_components_button.py +++ b/docs/examples/quick_start/sharing_data_between_components_button.py @@ -4,4 +4,4 @@ # start @component def my_button(count, on_click): - return html.button({"on_click": on_click}, f"Clicked {count} times") + return html.button({"onClick": on_click}, f"Clicked {count} times") diff --git a/docs/examples/python/quick_start/sharing_data_between_components_move_state.py b/docs/examples/quick_start/sharing_data_between_components_move_state.py similarity index 100% rename from docs/examples/python/quick_start/sharing_data_between_components_move_state.py rename to docs/examples/quick_start/sharing_data_between_components_move_state.py diff --git a/docs/examples/python/quick_start/sharing_data_between_components_props.py b/docs/examples/quick_start/sharing_data_between_components_props.py similarity index 100% rename from docs/examples/python/quick_start/sharing_data_between_components_props.py rename to docs/examples/quick_start/sharing_data_between_components_props.py diff --git a/docs/examples/css/quick_start/updating_the_screen.css b/docs/examples/quick_start/updating_the_screen.css similarity index 100% rename from docs/examples/css/quick_start/updating_the_screen.css rename to docs/examples/quick_start/updating_the_screen.css diff --git a/docs/examples/python/quick_start/updating_the_screen.py b/docs/examples/quick_start/updating_the_screen.py similarity index 51% rename from docs/examples/python/quick_start/updating_the_screen.py rename to docs/examples/quick_start/updating_the_screen.py index 1fc6cebcd..36d810529 100644 --- a/docs/examples/python/quick_start/updating_the_screen.py +++ b/docs/examples/quick_start/updating_the_screen.py @@ -17,16 +17,4 @@ def my_button(): def handle_click(event): set_count(count + 1) - return html.button({"on_click": handle_click}, f"Clicked {count} times") - - -# end -if __name__ == "__main__": - from reactpy import run - from reactpy.utils import _read_docs_css - - @component - def styled_app(): - return html._(html.style(_read_docs_css()), my_app()) - - run(styled_app) + return html.button({"onClick": handle_click}, f"Clicked {count} times") diff --git a/docs/examples/python/quick_start/updating_the_screen_event.py b/docs/examples/quick_start/updating_the_screen_event.py similarity index 70% rename from docs/examples/python/quick_start/updating_the_screen_event.py rename to docs/examples/quick_start/updating_the_screen_event.py index 2829c481c..60699955d 100644 --- a/docs/examples/python/quick_start/updating_the_screen_event.py +++ b/docs/examples/quick_start/updating_the_screen_event.py @@ -9,4 +9,4 @@ def my_button(): def handle_click(event): set_count(count + 1) - return html.button({"on_click": handle_click}, f"Clicked {count} times") + return html.button({"onClick": handle_click}, f"Clicked {count} times") diff --git a/docs/examples/python/quick_start/updating_the_screen_use_state.py b/docs/examples/quick_start/updating_the_screen_use_state.py similarity index 100% rename from docs/examples/python/quick_start/updating_the_screen_use_state.py rename to docs/examples/quick_start/updating_the_screen_use_state.py diff --git a/docs/examples/python/quick_start/updating_the_screen_use_state_button.py b/docs/examples/quick_start/updating_the_screen_use_state_button.py similarity index 100% rename from docs/examples/python/quick_start/updating_the_screen_use_state_button.py rename to docs/examples/quick_start/updating_the_screen_use_state_button.py diff --git a/docs/examples/python/responding_to_events/simple_button.py b/docs/examples/responding_to_events/simple_button.py similarity index 100% rename from docs/examples/python/responding_to_events/simple_button.py rename to docs/examples/responding_to_events/simple_button.py diff --git a/docs/examples/css/responding_to_events/simple_button_event.css b/docs/examples/responding_to_events/simple_button_event.css similarity index 100% rename from docs/examples/css/responding_to_events/simple_button_event.css rename to docs/examples/responding_to_events/simple_button_event.css diff --git a/docs/examples/responding_to_events/simple_button_event.py b/docs/examples/responding_to_events/simple_button_event.py new file mode 100644 index 000000000..df3e170fd --- /dev/null +++ b/docs/examples/responding_to_events/simple_button_event.py @@ -0,0 +1,9 @@ +from reactpy import component, html + + +@component +def button(): + def handle_click(event): + print("You clicked me!") + + return html.button({"onClick": handle_click}, "Click me") diff --git a/docs/examples/css/thinking_in_react/add_inverse_data_flow.css b/docs/examples/thinking_in_react/add_inverse_data_flow.css similarity index 100% rename from docs/examples/css/thinking_in_react/add_inverse_data_flow.css rename to docs/examples/thinking_in_react/add_inverse_data_flow.css diff --git a/docs/examples/python/thinking_in_react/add_inverse_data_flow.py b/docs/examples/thinking_in_react/add_inverse_data_flow.py similarity index 88% rename from docs/examples/python/thinking_in_react/add_inverse_data_flow.py rename to docs/examples/thinking_in_react/add_inverse_data_flow.py index fdb7c79ad..540bff825 100644 --- a/docs/examples/python/thinking_in_react/add_inverse_data_flow.py +++ b/docs/examples/thinking_in_react/add_inverse_data_flow.py @@ -75,7 +75,7 @@ def search_bar(filter_text, in_stock_only, set_filter_text, set_in_stock_only): "type": "text", "value": filter_text, "placeholder": "Search...", - "on_change": lambda event: set_filter_text(event["target"]["value"]), + "onChange": lambda event: set_filter_text(event["target"]["value"]), } ), html.label( @@ -83,7 +83,7 @@ def search_bar(filter_text, in_stock_only, set_filter_text, set_in_stock_only): { "type": "checkbox", "checked": in_stock_only, - "on_change": lambda event: set_in_stock_only( + "onChange": lambda event: set_in_stock_only( event["target"]["checked"] ), } @@ -106,15 +106,3 @@ def search_bar(filter_text, in_stock_only, set_filter_text, set_in_stock_only): @component def app(): return filterable_product_table(PRODUCTS) - - -# end -if __name__ == "__main__": - from reactpy import run - from reactpy.utils import _read_docs_css - - @component - def styled_app(): - return html._(html.style(_read_docs_css()), app()) - - run(styled_app) diff --git a/docs/examples/css/thinking_in_react/build_a_static_version_in_react.css b/docs/examples/thinking_in_react/build_a_static_version_in_react.css similarity index 100% rename from docs/examples/css/thinking_in_react/build_a_static_version_in_react.css rename to docs/examples/thinking_in_react/build_a_static_version_in_react.css diff --git a/docs/examples/python/thinking_in_react/build_a_static_version_in_react.py b/docs/examples/thinking_in_react/build_a_static_version_in_react.py similarity index 88% rename from docs/examples/python/thinking_in_react/build_a_static_version_in_react.py rename to docs/examples/thinking_in_react/build_a_static_version_in_react.py index 428406707..3c8c46761 100644 --- a/docs/examples/python/thinking_in_react/build_a_static_version_in_react.py +++ b/docs/examples/thinking_in_react/build_a_static_version_in_react.py @@ -58,15 +58,3 @@ def filterable_product_table(products): @component def app(): return filterable_product_table(PRODUCTS) - - -# end -if __name__ == "__main__": - from reactpy import run - from reactpy.utils import _read_docs_css - - @component - def styled_app(): - return html._(html.style(_read_docs_css()), app()) - - run(styled_app) diff --git a/docs/examples/python/thinking_in_react/error_example.py b/docs/examples/thinking_in_react/error_example.py similarity index 100% rename from docs/examples/python/thinking_in_react/error_example.py rename to docs/examples/thinking_in_react/error_example.py diff --git a/docs/examples/python/thinking_in_react/event_handlers.py b/docs/examples/thinking_in_react/event_handlers.py similarity index 60% rename from docs/examples/python/thinking_in_react/event_handlers.py rename to docs/examples/thinking_in_react/event_handlers.py index a97358c10..81eb99611 100644 --- a/docs/examples/python/thinking_in_react/event_handlers.py +++ b/docs/examples/thinking_in_react/event_handlers.py @@ -3,8 +3,7 @@ filter_text = "" -def set_filter_text(value): - ... +def set_filter_text(value): ... # start @@ -13,6 +12,6 @@ def set_filter_text(value): "type": "text", "value": filter_text, "placeholder": "Search...", - "on_change": lambda event: set_filter_text(event["target"]["value"]), + "onChange": lambda event: set_filter_text(event["target"]["value"]), } ) diff --git a/docs/examples/css/thinking_in_react/identify_where_your_state_should_live.css b/docs/examples/thinking_in_react/identify_where_your_state_should_live.css similarity index 100% rename from docs/examples/css/thinking_in_react/identify_where_your_state_should_live.css rename to docs/examples/thinking_in_react/identify_where_your_state_should_live.css diff --git a/docs/examples/python/thinking_in_react/identify_where_your_state_should_live.py b/docs/examples/thinking_in_react/identify_where_your_state_should_live.py similarity index 91% rename from docs/examples/python/thinking_in_react/identify_where_your_state_should_live.py rename to docs/examples/thinking_in_react/identify_where_your_state_should_live.py index c201b6742..f81a2cd03 100644 --- a/docs/examples/python/thinking_in_react/identify_where_your_state_should_live.py +++ b/docs/examples/thinking_in_react/identify_where_your_state_should_live.py @@ -86,15 +86,3 @@ def search_bar(filter_text, in_stock_only): @component def app(): return filterable_product_table(PRODUCTS) - - -# end -if __name__ == "__main__": - from reactpy import run - from reactpy.utils import _read_docs_css - - @component - def styled_app(): - return html._(html.style(_read_docs_css()), app()) - - run(styled_app) diff --git a/docs/examples/thinking_in_react/set_state_props.py b/docs/examples/thinking_in_react/set_state_props.py new file mode 100644 index 000000000..821249933 --- /dev/null +++ b/docs/examples/thinking_in_react/set_state_props.py @@ -0,0 +1,20 @@ +from reactpy import component, hooks, html + + +def search_bar(**_kws): ... + + +# start +@component +def filterable_product_table(products): + filter_text, set_filter_text = hooks.use_state("") + in_stock_only, set_in_stock_only = hooks.use_state(False) + + return html.div( + search_bar( + filter_text=filter_text, + in_stock_only=in_stock_only, + set_filter_text=set_filter_text, + set_in_stock_only=set_in_stock_only, + ) + ) diff --git a/docs/examples/json/thinking_in_react/start_with_the_mockup.json b/docs/examples/thinking_in_react/start_with_the_mockup.json similarity index 100% rename from docs/examples/json/thinking_in_react/start_with_the_mockup.json rename to docs/examples/thinking_in_react/start_with_the_mockup.json diff --git a/docs/examples/python/thinking_in_react/use_state.py b/docs/examples/thinking_in_react/use_state.py similarity index 100% rename from docs/examples/python/thinking_in_react/use_state.py rename to docs/examples/thinking_in_react/use_state.py diff --git a/docs/examples/python/thinking_in_react/use_state_with_components.py b/docs/examples/thinking_in_react/use_state_with_components.py similarity index 100% rename from docs/examples/python/thinking_in_react/use_state_with_components.py rename to docs/examples/thinking_in_react/use_state_with_components.py diff --git a/docs/examples/css/tutorial_tic_tac_toe/setup_for_the_tutorial.css b/docs/examples/tutorial_tic_tac_toe/setup_for_the_tutorial.css similarity index 100% rename from docs/examples/css/tutorial_tic_tac_toe/setup_for_the_tutorial.css rename to docs/examples/tutorial_tic_tac_toe/setup_for_the_tutorial.css diff --git a/docs/examples/python/tutorial_tic_tac_toe/setup_for_the_tutorial.py b/docs/examples/tutorial_tic_tac_toe/setup_for_the_tutorial.py similarity index 56% rename from docs/examples/python/tutorial_tic_tac_toe/setup_for_the_tutorial.py rename to docs/examples/tutorial_tic_tac_toe/setup_for_the_tutorial.py index efca94195..e0893d6b4 100644 --- a/docs/examples/python/tutorial_tic_tac_toe/setup_for_the_tutorial.py +++ b/docs/examples/tutorial_tic_tac_toe/setup_for_the_tutorial.py @@ -1,6 +1,7 @@ from reactpy import component, html + # start @component def square(): - return html.button({"class_name":"square"}, "X") + return html.button({"className": "square"}, "X") diff --git a/docs/examples/css/tutorial_tic_tac_toe/tic_tac_toe.css b/docs/examples/tutorial_tic_tac_toe/tic_tac_toe.css similarity index 100% rename from docs/examples/css/tutorial_tic_tac_toe/tic_tac_toe.css rename to docs/examples/tutorial_tic_tac_toe/tic_tac_toe.css diff --git a/docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py b/docs/examples/tutorial_tic_tac_toe/tic_tac_toe.py similarity index 87% rename from docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py rename to docs/examples/tutorial_tic_tac_toe/tic_tac_toe.py index eef970924..5eed504d1 100644 --- a/docs/examples/python/tutorial_tic_tac_toe/tic_tac_toe.py +++ b/docs/examples/tutorial_tic_tac_toe/tic_tac_toe.py @@ -6,7 +6,7 @@ @component def square(value, on_square_click): return html.button( - {"className": "square", "on_click": on_square_click}, + {"className": "square", "onClick": on_square_click}, value, ) @@ -14,7 +14,7 @@ def square(value, on_square_click): @component def board(x_is_next, squares, on_play): def handle_click(i): - def handle_click_event(_event): + def inner(event): """ Due to a quirk of Python, if your event handler needs args other than `event`, you will need to create a wrapper function as seen above. @@ -27,7 +27,7 @@ def handle_click_event(_event): next_squares[i] = "X" if x_is_next else "O" on_play(next_squares) - return handle_click_event + return inner winner = calculate_winner(squares) status = ( @@ -80,7 +80,7 @@ def jump_to(next_move): moves.append( html.li( {"key": move}, - html.button({"on_click": jump_to(move)}, description), + html.button({"onClick": jump_to(move)}, description), ) ) @@ -113,15 +113,3 @@ def calculate_winner(squares): return squares[a] return None - - -# end -if __name__ == "__main__": - from reactpy import run - from reactpy.utils import _read_docs_css - - @component - def styled_app(): - return html._(html.style(_read_docs_css()), game()) - - run(styled_app) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 082b77b01..3a7e0694b 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -7,16 +7,16 @@ nav: - "Tutorial: Tic-Tac-Toe 🚧": learn/tutorial-tic-tac-toe.md - Thinking in React: learn/thinking-in-react.md - Installation: - - learn/installation.md - - Start a New React Project: learn/start-a-new-react-project.md - - Add React to an Existing Project 🚫: learn/add-react-to-an-existing-project.md + - Creating a Standalone React App: learn/creating-a-react-app.md + - Add React to an Existing Project: learn/add-react-to-an-existing-project.md + - Setup: - Editor Setup: learn/editor-setup.md - React Developer Tools 🚫: learn/react-developer-tools.md - Extra Tools and Packages 🚧: learn/extra-tools-and-packages.md - More Tutorials: - "Tutorial: React Bootstrap 🚫": learn/tutorial-react-bootstrap.md - "Tutorial: Material UI 🚫": learn/tutorial-material-ui.md - - Learn React: + - Learn: - Describing the UI: - Your First Component 🚧: learn/your-first-component.md - Importing and Exporting Components 🚧: learn/importing-and-exporting-components.md @@ -93,7 +93,7 @@ nav: - PyScript 🚫: reference/pyscript.md - Protocol Structure 🚧: reference/protocol-structure.md - Client API 🚧: reference/client-api.md - - About ReactPy: + - About: - Changelog 🚧: about/changelog.md - Community 🚧: about/community.md - Running Tests 🚧: about/running-tests.md @@ -119,7 +119,7 @@ theme: primary: white accent: red features: - - navigation.instant + # - navigation.instant - navigation.tabs - navigation.tabs.sticky - navigation.top diff --git a/docs/overrides/home.html b/docs/overrides/home.html index 1357184f1..77446c7c8 100644 --- a/docs/overrides/home.html +++ b/docs/overrides/home.html @@ -125,7 +125,7 @@ <h1>Go full-stack with a framework</h1> <p> ReactPy is a library. It lets you put components together, but it doesn't prescribe how to do routing and data fetching. To build an entire app with ReactPy, we recommend a backend framework like - <a href="https://www.djangoproject.com/">Django</a> or <a href="https://fastapi.tiangolo.com/">FastAPI</a>. + <a href="https://www.djangoproject.com/">Django</a> or <a href="https://www.starlette.io/">Starlette</a>. </p> <a href="{{ page.next_page.url | url }}" class="md-button md-button--primary"> Get Started diff --git a/docs/src/learn/add-react-to-an-existing-project.md b/docs/src/learn/add-react-to-an-existing-project.md index a2fdb0a3d..d201c1b9e 100644 --- a/docs/src/learn/add-react-to-an-existing-project.md +++ b/docs/src/learn/add-react-to-an-existing-project.md @@ -1,10 +1,3 @@ -!!! warning "Planned / Undeveloped" - - This feature is planned, but not yet developed. - - See [this issue](https://github.com/reactive-python/reactpy/issues/653) for more details. - -<!-- ## Overview <p class="intro" markdown> @@ -13,146 +6,130 @@ If you want to add some interactivity to your existing project, you don't have t </p> -<Note> - -**You need to install [Node.js](https://nodejs.org/en/) for local development.** Although you can [try React](/learn/installation#try-react) online or with a simple HTML page, realistically most JavaScript tooling you'll want to use for development requires Node.js. - -</Note> - ## Using React for an entire subroute of your existing website Let's say you have an existing web app at `example.com` built with another server technology (like Rails), and you want to implement all routes starting with `example.com/some-app/` fully with React. +### Using an ASGI subroute + Here's how we recommend to set it up: -1. **Build the React part of your app** using one of the [React-based frameworks](/learn/start-a-new-react-project). -2. **Specify `/some-app` as the _base path_** in your framework's configuration (here's how: [Next.js](https://nextjs.org/docs/api-reference/next.config.js/basepath), [Gatsby](https://www.gatsbyjs.com/docs/how-to/previews-deploys-hosting/path-prefix/)). +1. **Build the React part of your app** using one of the [ReactPy executors](./creating-a-react-app.md). +2. **Specify `/some-app` as the _base path_** in your executors kwargs (`#!python path_prefix="/some-app"`). 3. **Configure your server or a proxy** so that all requests under `/some-app/` are handled by your React app. -This ensures the React part of your app can [benefit from the best practices](/learn/start-a-new-react-project#can-i-use-react-without-a-framework) baked into those frameworks. +This ensures the React part of your app can [benefit from the best practices](./creating-a-react-app.md) baked into those frameworks. -Many React-based frameworks are full-stack and let your React app take advantage of the server. However, you can use the same approach even if you can't or don't want to run JavaScript on the server. In that case, serve the HTML/CSS/JS export ([`next export` output](https://nextjs.org/docs/advanced-features/static-html-export) for Next.js, default for Gatsby) at `/some-app/` instead. +### Using static site generation ([SSG](https://developer.mozilla.org/en-US/docs/Glossary/SSG)) -## Using React for a part of your existing page +<!-- These apps can be deployed to a [CDN](https://developer.mozilla.org/en-US/docs/Glossary/CDN) or static hosting service without a server. --> -Let's say you have an existing page built with another technology (either a server one like Rails, or a client one like Backbone), and you want to render interactive React components somewhere on that page. That's a common way to integrate React--in fact, it's how most React usage looked at Meta for many years! +Support for SSG is coming in a [future version](https://github.com/reactive-python/reactpy/issues/1272). -You can do this in two steps: +## Using React for a part of your existing page -1. **Set up a JavaScript environment** that lets you use the [JSX syntax](/learn/writing-markup-with-jsx), split your code into modules with the [`import`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) / [`export`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export) syntax, and use packages (for example, React) from the [npm](https://www.npmjs.com/) package registry. -2. **Render your React components** where you want to see them on the page. +Let's say you have an existing page built with another Python web technology (ASGI or WSGI), and you want to render interactive React components somewhere on that page. The exact approach depends on your existing page setup, so let's walk through some details. -### Step 1: Set up a modular JavaScript environment +### Using ASGI Middleware -A modular JavaScript environment lets you write your React components in individual files, as opposed to writing all of your code in a single file. It also lets you use all the wonderful packages published by other developers on the [npm](https://www.npmjs.com/) registry--including React itself! How you do this depends on your existing setup: +ReactPy supports running as middleware for any existing ASGI application. ReactPy components are embedded into your existing HTML templates using Jinja2. You can use any ASGI framework, however for demonstration purposes we have selected [Starlette](https://www.starlette.io/) for the example below. -- **If your app is already split into files that use `import` statements,** try to use the setup you already have. Check whether writing `<div />` in your JS code causes a syntax error. If it causes a syntax error, you might need to [transform your JavaScript code with Babel](https://babeljs.io/setup), and enable the [Babel React preset](https://babeljs.io/docs/babel-preset-react) to use JSX. +First, install ReactPy, Starlette, and your preferred ASGI webserver. -- **If your app doesn't have an existing setup for compiling JavaScript modules,** set it up with [Vite](https://vitejs.dev/). The Vite community maintains [many integrations with backend frameworks](https://github.com/vitejs/awesome-vite#integrations-with-backends), including Rails, Django, and Laravel. If your backend framework is not listed, [follow this guide](https://vitejs.dev/guide/backend-integration.html) to manually integrate Vite builds with your backend. +!!! example "Terminal" -To check whether your setup works, run this command in your project folder: + ```linenums="0" + pip install reactpy[asgi,jinja] starlette uvicorn[standard] + ``` -<TerminalBlock> -npm install react react-dom -</TerminalBlock> +Next, configure your ASGI framework to use ReactPy's Jinja2 template tag. The method for doing this will vary depending on the ASGI framework you are using. Below is an example that follow's [Starlette's documentation](https://www.starlette.io/templates/): -Then add these lines of code at the top of your main JavaScript file (it might be called `index.js` or `main.js`): +```python linenums="0" hl_lines="6 11 17" +{% include "../../examples/add_react_to_an_existing_project/asgi_configure_jinja.py" %} +``` -```html -<!DOCTYPE html> -<html> - <head> - <title>My app</title> - </head> - <body> - <!-- Your existing page content (in this example, it gets replaced) --> +Now you will need to wrap your existing ASGI application with ReactPy's middleware, define the dotted path to your root components, and render your components in your existing HTML templates. - </body> +!!! abstract "Note" -</html> -``` + The `ReactPyJinja` extension enables a handful of [template tags](/reference/templatetags/) that allow you to render ReactPy components in your templates. The `component` tag is used to render a ReactPy SSR component, while the `pyscript_setup` and `pyscript_component` tags can be used together to render CSR components. -```js -import { createRoot } from "react-dom/client"; +=== "main.py" -// Clear the existing HTML content -document.body.innerHTML = '<div id="app"></div>'; + ```python hl_lines="6 22" + {% include "../../examples/add_react_to_an_existing_project/asgi_middleware.py" %} + ``` -// Render your React component instead -const root = createRoot(document.getElementById("app")); -root.render(<h1>Hello, world</h1>); -``` +=== "my_components.py" -If the entire content of your page was replaced by a "Hello, world!", everything worked! Keep reading. + ```python + {% include "../../examples/add_react_to_an_existing_project/asgi_component.py" %} + ``` -<Note> +=== "my_template.html" -Integrating a modular JavaScript environment into an existing project for the first time can feel intimidating, but it's worth it! If you get stuck, try our [community resources](/community) or the [Vite Chat](https://chat.vitejs.dev/). + ```html hl_lines="5 9" + {% include "../../examples/add_react_to_an_existing_project/asgi_template.html" %} + ``` -</Note> +Finally, use your webserver of choice to start ReactPy: -### Step 2: Render React components anywhere on the page +!!! example "Terminal" -In the previous step, you put this code at the top of your main file: + ```linenums="0" + uvicorn main:reactpy_app + ``` -```js -import { createRoot } from "react-dom/client"; +### Using WSGI Middleware -// Clear the existing HTML content -document.body.innerHTML = '<div id="app"></div>'; +Support for WSGI executors is coming in a [future version](https://github.com/reactive-python/reactpy/issues/1260). -// Render your React component instead -const root = createRoot(document.getElementById("app")); -root.render(<h1>Hello, world</h1>); -``` +## External Executors -Of course, you don't actually want to clear the existing HTML content! +!!! abstract "Note" -Delete this code. + **External executors** exist outside ReactPy's core library and have significantly different installation and configuration instructions. -Instead, you probably want to render your React components in specific places in your HTML. Open your HTML page (or the server templates that generate it) and add a unique [`id`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id) attribute to any tag, for example: + Make sure to follow the documentation for setting up your chosen _external_ executor. -```html -<!-- ... somewhere in your html ... --> -<nav id="navigation"></nav> -<!-- ... more html ... --> -``` +### Django -This lets you find that HTML element with [`document.getElementById`](https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById) and pass it to [`createRoot`](/reference/react-dom/client/createRoot) so that you can render your own React component inside: - -```html -<!DOCTYPE html> -<html> - <head> - <title>My app</title> - </head> - <body> - <p>This paragraph is a part of HTML.</p> - <nav id="navigation"></nav> - <p>This paragraph is also a part of HTML.</p> - </body> -</html> -``` +[Django](https://www.djangoproject.com/) is a full-featured web framework that provides a batteries-included approach to web development. -```js -import { createRoot } from "react-dom/client"; +Due to it's batteries-included approach, ReactPy has unique features only available to this executor. -function NavigationBar() { - // TODO: Actually implement a navigation bar - return <h1>Hello from React!</h1>; -} +To learn how to configure Django for ReactPy, see the [ReactPy-Django documentation](https://reactive-python.github.io/reactpy-django/). -const domNode = document.getElementById("navigation"); -const root = createRoot(domNode); -root.render(<NavigationBar />); -``` +<!-- +TODO: Fix reactpy-jupyter +### Jupyter + +Jupyter is an interactive computing environment that is used for data science and machine learning. It allows users to run code, visualize data, and collaborate with others in a live environment. Jupyter is a powerful tool for data scientists and machine learning engineers. + +!!! example "Terminal" + + ```linenums="0" + pip install reactpy-jupyter + ``` + +If you're new to Jupyter, check out the [Jupyter tutorial](https://jupyter.org/try). + +ReactPy has unique [configuration instructions](https://github.com/reactive-python/reactpy-jupyter#readme) to use Jupyter. --> + +<!-- +TODO: Fix reactpy-dash +### Plotly Dash + +Plotly Dash is a web application framework that is used to create interactive dashboards. It allows users to create dashboards that can be used to visualize data and interact with it in real time. Plotly Dash is a good choice for creating dashboards that need to be interactive and informative. -Notice how the original HTML content from `index.html` is preserved, but your own `NavigationBar` React component now appears inside the `<nav id="navigation">` from your HTML. Read the [`createRoot` usage documentation](/reference/react-dom/client/createRoot#rendering-a-page-partially-built-with-react) to learn more about rendering React components inside an existing HTML page. +!!! example "Terminal" -When you adopt React in an existing project, it's common to start with small interactive components (like buttons), and then gradually keep "moving upwards" until eventually your entire page is built with React. If you ever reach that point, we recommend migrating to [a React framework](/learn/start-a-new-react-project) right after to get the most out of React. + ```linenums="0" + pip install reactpy-dash + ``` -## Using React Native in an existing native mobile app +If you're new to Plotly Dash, check out the [Plotly Dash tutorial](https://dash.plotly.com/installation). -[React Native](https://reactnative.dev/) can also be integrated into existing native apps incrementally. If you have an existing native app for Android (Java or Kotlin) or iOS (Objective-C or Swift), [follow this guide](https://reactnative.dev/docs/integration-with-existing-apps) to add a React Native screen to it. --> +ReactPy has unique [configuration instructions](https://github.com/reactive-python/reactpy-dash#readme) to use Plotly Dash. --> diff --git a/docs/src/learn/creating-a-react-app.md b/docs/src/learn/creating-a-react-app.md new file mode 100644 index 000000000..5669d055c --- /dev/null +++ b/docs/src/learn/creating-a-react-app.md @@ -0,0 +1,95 @@ +## Overview + +<p class="intro" markdown> + +If you want to build a new app or website with React, we recommend starting with a standalone executor. + +</p> + +If your app has constraints not well-served by existing web frameworks, you prefer to build your own framework, or you just want to learn the basics of a React app, you can use ReactPy in **standalone mode**. + +## Using ReactPy for full-stack + +ReactPy is a component library that helps you build a full-stack web application. For convenience, ReactPy is also bundled with several different standalone executors. + +These standalone executors are the easiest way to get started with ReactPy, as they require no additional setup or configuration. + +!!! abstract "Note" + + **Standalone ReactPy requires a server** + + In order to serve the initial HTML page, you will need to run a server. The ASGI examples below use [Uvicorn](https://www.uvicorn.org/), but you can use [any ASGI server](https://github.com/florimondmanca/awesome-asgi#servers). + + Executors on this page can either support client-side rendering ([CSR](https://developer.mozilla.org/en-US/docs/Glossary/CSR)) or server-side rendering ([SSR](https://developer.mozilla.org/en-US/docs/Glossary/SSR)) + +### Running via ASGI SSR + +ReactPy can run in **server-side standalone mode**, where both page loading and component rendering occurs on an ASGI server. + +This executor is the most commonly used, as it provides maximum extensibility. + +First, install ReactPy and your preferred ASGI webserver. + +!!! example "Terminal" + + ```linenums="0" + pip install reactpy[asgi] uvicorn[standard] + ``` + +Next, create a new file called `main.py` containing the ASGI application: + +=== "main.py" + + ```python + {% include "../../examples/creating_a_react_app/asgi_ssr.py" %} + ``` + +Finally, use your webserver of choice to start ReactPy: + +!!! example "Terminal" + + ```linenums="0" + uvicorn main:my_app + ``` + +### Running via ASGI CSR + +ReactPy can run in **client-side standalone mode**, where the initial page is served using the ASGI protocol. This is configuration allows direct execution of Javascript, but requires special considerations since all ReactPy component code is run on the browser [via WebAssembly](https://pyscript.net/). + +First, install ReactPy and your preferred ASGI webserver. + +!!! example "Terminal" + + ```linenums="0" + pip install reactpy[asgi] uvicorn[standard] + ``` + +Next, create a new file called `main.py` containing the ASGI application, and a `root.py` file containing the root component: + +=== "main.py" + + ```python + {% include "../../examples/creating_a_react_app/asgi_csr.py" %} + ``` + +=== "root.py" + + ```python + {% include "../../examples/creating_a_react_app/asgi_csr_root.py" %} + ``` + +Finally, use your webserver of choice to start ReactPy: + +!!! example "Terminal" + + ```linenums="0" + uvicorn main:my_app + ``` + +### Running via WSGI SSR + +Support for WSGI executors is coming in a [future version](https://github.com/reactive-python/reactpy/issues/1260). + +### Running via WSGI CSR + +Support for WSGI executors is coming in a [future version](https://github.com/reactive-python/reactpy/issues/1260). diff --git a/docs/src/learn/installation.md b/docs/src/learn/installation.md index 7da6f960e..48441a7cb 100644 --- a/docs/src/learn/installation.md +++ b/docs/src/learn/installation.md @@ -13,9 +13,9 @@ React has been designed from the start for gradual adoption. You can use as litt * [How to set up your editor](../learn/editor-setup.md) * [How to install React Developer Tools](../learn/react-developer-tools.md) -## Try React +<!-- ## Try React -You don't need to install anything to play with React. [Try ReactPy within Jupyter Notebooks](https://mybinder.org/v2/gh/reactive-python/reactpy-jupyter/main?urlpath=lab/tree/notebooks/introduction.ipynb)! +You don't need to install anything to play with React. [Try ReactPy within Jupyter Notebooks](https://mybinder.org/v2/gh/reactive-python/reactpy-jupyter/main?urlpath=lab/tree/notebooks/introduction.ipynb)! --> ## Start a new React project diff --git a/docs/src/learn/quick-start.md b/docs/src/learn/quick-start.md index 91e4bcf3a..891612901 100644 --- a/docs/src/learn/quick-start.md +++ b/docs/src/learn/quick-start.md @@ -22,13 +22,13 @@ React apps are made out of _components_. A component is a piece of the UI (user React components are Python functions that return markup: ```python linenums="0" -{% include "../../examples/python/quick_start/my_button.py" start="# start" %} +{% include "../../examples/quick_start/my_button.py" start="# start" %} ``` Now that you've declared `my_button`, you can nest it into another component: ```python linenums="0" hl_lines="5" -{% include "../../examples/python/quick_start/my_app.py" start="# start" %} +{% include "../../examples/quick_start/my_app.py" start="# start" %} ``` Have a look at the result: @@ -36,7 +36,7 @@ Have a look at the result: === "app.py" ```python - {% include "../../examples/python/quick_start/creating_and_nesting_components.py" end="# end" %} + {% include "../../examples/quick_start/creating_and_nesting_components.py" %} ``` === ":material-play: Run" @@ -70,16 +70,16 @@ If you have a lot of HTML to port to JSX, you can use an [online converter.](htt ## Adding styles -In React, you specify a CSS class with `class_name`. It works the same way as the HTML [`class`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/class) attribute: +In React, you specify a CSS class with `className`. It works the same way as the HTML [`class`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/class) attribute: ```python linenums="0" -{% include "../../examples/python/quick_start/adding_styles.py" start="# start" %} +{% include "../../examples/quick_start/adding_styles.py" start="# start" %} ``` Then you write the CSS rules for it in a separate CSS file: ```css linenums="0" -{% include "../../examples/css/quick_start/adding_styles.css" %} +{% include "../../examples/quick_start/adding_styles.css" %} ``` React does not prescribe how you add CSS files. In the simplest case, you'll add a [`<link>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link) tag to your HTML. If you use a build tool or web framework, consult its documentation to learn how to add a CSS file to your project. @@ -105,13 +105,13 @@ You can fetch data from a variety of sources and directly embed it into your com === "app.py" ```python - {% include "../../examples/python/quick_start/displaying_data.py" end="# end" %} + {% include "../../examples/quick_start/displaying_data.py" %} ``` === "styles.css" ```css - {% include "../../examples/css/quick_start/displaying_data.css" %} + {% include "../../examples/quick_start/displaying_data.css" %} ``` === ":material-play: Run" @@ -125,19 +125,19 @@ You can fetch data from a variety of sources and directly embed it into your com In React, there is no special syntax for writing conditions. Instead, you'll use the same techniques as you use when writing regular Python code. For example, you can use an `if` statement to conditionally include components: ```python linenums="0" -{% include "../../examples/python/quick_start/conditional_rendering.py" start="# start"%} +{% include "../../examples/quick_start/conditional_rendering.py" start="# start"%} ``` If you prefer more compact code, you can use the [ternary operator.](https://www.geeksforgeeks.org/ternary-operator-in-python/): ```python linenums="0" -{% include "../../examples/python/quick_start/conditional_rendering_ternary.py" start="# start"%} +{% include "../../examples/quick_start/conditional_rendering_ternary.py" start="# start"%} ``` When you don't need the `else` branch, you can also use a shorter [logical `and` syntax](https://www.geeksforgeeks.org/short-circuiting-techniques-python/): ```python linenums="0" -{% include "../../examples/python/quick_start/conditional_rendering_logical_and.py" start="# start" %} +{% include "../../examples/quick_start/conditional_rendering_logical_and.py" start="# start" %} ``` All of these approaches also work for conditionally specifying attributes. If you're unfamiliar with some of this Python syntax, you can start by always using `if...else`. @@ -149,21 +149,21 @@ You will rely on Python features like [`for` loop](https://www.w3schools.com/pyt For example, let's say you have an array of products: ```python linenums="0" -{% include "../../examples/python/quick_start/rendering_lists_products.py" %} +{% include "../../examples/quick_start/rendering_lists_products.py" %} ``` -Inside your component, use list comprehension to transform an array of products into an array of `<li>` items: +Inside your component, use list comprehension to transform an array of products into an array of `#!html <li>` items: ```python linenums="0" -{% include "../../examples/python/quick_start/rendering_lists_list_items.py" start="# start" %} +{% include "../../examples/quick_start/rendering_lists_list_items.py" start="# start" %} ``` -Notice how `<li>` has a `key` attribute. For each item in a list, you should pass a string or a number that uniquely identifies that item among its siblings. Usually, a key should be coming from your data, such as a database ID. React uses your keys to know what happened if you later insert, delete, or reorder the items. +Notice how `#!html <li>` has a `key` attribute. For each item in a list, you should pass a string or a number that uniquely identifies that item among its siblings. Usually, a key should be coming from your data, such as a database ID. React uses your keys to know what happened if you later insert, delete, or reorder the items. === "app.py" ```python - {% include "../../examples/python/quick_start/rendering_lists.py" end="# end" %} + {% include "../../examples/quick_start/rendering_lists.py" %} ``` === ":material-play: Run" @@ -177,10 +177,10 @@ Notice how `<li>` has a `key` attribute. For each item in a list, you should pas You can respond to events by declaring _event handler_ functions inside your components: ```python linenums="0" hl_lines="3-4 7" -{% include "../../examples/python/quick_start/responding_to_events.py" start="# start" %} +{% include "../../examples/quick_start/responding_to_events.py" start="# start" %} ``` -Notice how `"on_click": handle_click` has no parentheses at the end! Do not _call_ the event handler function: you only need to _pass it down_. React will call your event handler when the user clicks the button. +Notice how `"onClick": handle_click` has no parentheses at the end! Do not _call_ the event handler function: you only need to _pass it down_. React will call your event handler when the user clicks the button. ## Updating the screen @@ -189,13 +189,13 @@ Often, you'll want your component to "remember" some information and display it. First, import [`use_state`](../reference/use-state.md) from React: ```python linenums="0" -{% include "../../examples/python/quick_start/updating_the_screen_use_state.py" end="# end" %} +{% include "../../examples/quick_start/updating_the_screen_use_state.py" end="# end" %} ``` Now you can declare a _state variable_ inside your component: ```python linenums="0" -{% include "../../examples/python/quick_start/updating_the_screen_use_state_button.py" start="# start" %} +{% include "../../examples/quick_start/updating_the_screen_use_state_button.py" start="# start" %} ``` You’ll get two things from `use_state`: the current state (`count`), and the function that lets you update it (`set_count`). You can give them any names, but the convention is to write `something, set_something = ...`. @@ -203,7 +203,7 @@ You’ll get two things from `use_state`: the current state (`count`), and the f The first time the button is displayed, `count` will be `0` because you passed `0` to `use_state()`. When you want to change state, call `set_count()` and pass the new value to it. Clicking this button will increment the counter: ```python linenums="0" hl_lines="6" -{% include "../../examples/python/quick_start/updating_the_screen_event.py" start="# start" %} +{% include "../../examples/quick_start/updating_the_screen_event.py" start="# start" %} ``` React will call your component function again. This time, `count` will be `1`. Then it will be `2`. And so on. @@ -213,13 +213,13 @@ If you render the same component multiple times, each will get its own state. Cl === "app.py" ```python - {% include "../../examples/python/quick_start/updating_the_screen.py" end="# end" %} + {% include "../../examples/quick_start/updating_the_screen.py" %} ``` === "styles.css" ```css - {% include "../../examples/css/quick_start/updating_the_screen.css" %} + {% include "../../examples/quick_start/updating_the_screen.css" %} ``` === ":material-play: Run" @@ -255,13 +255,13 @@ Now when you click either button, the `count` in `my_app` will change, which wil First, _move the state up_ from `my_button` into `my_app`: ```python linenums="0" hl_lines="3-6 17" -{% include "../../examples/python/quick_start/sharing_data_between_components_move_state.py" start="# start" %} +{% include "../../examples/quick_start/sharing_data_between_components_move_state.py" start="# start" %} ``` Then, _pass the state down_ from `my_app` to each `my_button`, together with the shared click handler. You can pass information to `my_button` using props: ```python linenums="0" hl_lines="10-11" -{% include "../../examples/python/quick_start/sharing_data_between_components_props.py" start="# start" end="# end" %} +{% include "../../examples/quick_start/sharing_data_between_components_props.py" start="# start" end="# end" %} ``` The information you pass down like this is called _props_. Now the `my_app` component contains the `count` state and the `handle_click` event handler, and _passes both of them down as props_ to each of the buttons. @@ -269,7 +269,7 @@ The information you pass down like this is called _props_. Now the `my_app` comp Finally, change `my_button` to _read_ the props you have passed from its parent component: ```python linenums="0" -{% include "../../examples/python/quick_start/sharing_data_between_components_button.py" start="# start" %} +{% include "../../examples/quick_start/sharing_data_between_components_button.py" start="# start" %} ``` When you click the button, the `on_click` handler fires. Each button's `on_click` prop was set to the `handle_click` function inside `my_app`, so the code inside of it runs. That code calls `set_count(count + 1)`, incrementing the `count` state variable. The new `count` value is passed as a prop to each button, so they all show the new value. This is called "lifting state up". By moving state up, you've shared it between components. @@ -277,13 +277,13 @@ When you click the button, the `on_click` handler fires. Each button's `on_click === "app.py" ```python - {% include "../../examples/python/quick_start/sharing_data_between_components.py" end="# end" %} + {% include "../../examples/quick_start/sharing_data_between_components.py" %} ``` === "styles.css" ```css - {% include "../../examples/css/quick_start/sharing_data_between_components.css" %} + {% include "../../examples/quick_start/sharing_data_between_components.css" %} ``` === ":material-play: Run" diff --git a/docs/src/learn/responding-to-events.md b/docs/src/learn/responding-to-events.md index c9fcb24ae..6c25fab56 100644 --- a/docs/src/learn/responding-to-events.md +++ b/docs/src/learn/responding-to-events.md @@ -19,7 +19,7 @@ To add an event handler, you will first define a function and then [pass it as a === "app.py" ```python - {% include "../../examples/python/responding_to_events/simple_button.py" start="# start" %} + {% include "../../examples/responding_to_events/simple_button.py" start="# start" %} ``` === ":material-play: Run" @@ -37,13 +37,13 @@ You can make it show a message when a user clicks by following these three steps === "app.py" ```python - {% include "../../examples/python/responding_to_events/simple_button_event.py" end="# end" %} + {% include "../../examples/responding_to_events/simple_button_event.py" %} ``` === "styles.css" ```css - {% include "../../examples/css/responding_to_events/simple_button_event.css" %} + {% include "../../examples/responding_to_events/simple_button_event.css" %} ``` === ":material-play: Run" @@ -91,8 +91,8 @@ In the second example, the `()` at the end of `handleClick()` fires the function When you write code inline, the same pitfall presents itself in a different way: -| passing a function (correct) | calling a function (incorrect) | -| --- | --- | +| passing a function (correct) | calling a function (incorrect) | +| ---------------------------------------- | ---------------------------------- | | `<button on_click={() => alert('...')}>` | `<button on_click={alert('...')}>` | Passing inline code like this won't fire on click—it fires every time the component renders: @@ -125,22 +125,22 @@ Because event handlers are declared inside of a component, they have access to t ```js function AlertButton({ message, children }) { - return <button on_click={() => alert(message)}>{children}</button>; + return <button on_click={() => alert(message)}>{children}</button>; } export default function Toolbar() { - return ( - <div> - <AlertButton message="Playing!">Play Movie</AlertButton> - <AlertButton message="Uploading!">Upload Image</AlertButton> - </div> - ); + return ( + <div> + <AlertButton message="Playing!">Play Movie</AlertButton> + <AlertButton message="Uploading!">Upload Image</AlertButton> + </div> + ); } ``` ```css button { - margin-right: 10px; + margin-right: 10px; } ``` @@ -154,34 +154,34 @@ To do this, pass a prop the component receives from its parent as the event hand ```js function Button({ on_click, children }) { - return <button on_click={on_click}>{children}</button>; + return <button on_click={on_click}>{children}</button>; } function PlayButton({ movieName }) { - function handlePlayClick() { - alert(`Playing ${movieName}!`); - } + function handlePlayClick() { + alert(`Playing ${movieName}!`); + } - return <Button on_click={handlePlayClick}>Play "{movieName}"</Button>; + return <Button on_click={handlePlayClick}>Play "{movieName}"</Button>; } function UploadButton() { - return <Button on_click={() => alert("Uploading!")}>Upload Image</Button>; + return <Button on_click={() => alert("Uploading!")}>Upload Image</Button>; } export default function Toolbar() { - return ( - <div> - <PlayButton movieName="Kiki's Delivery Service" /> - <UploadButton /> - </div> - ); + return ( + <div> + <PlayButton movieName="Kiki's Delivery Service" /> + <UploadButton /> + </div> + ); } ``` ```css button { - margin-right: 10px; + margin-right: 10px; } ``` @@ -204,22 +204,22 @@ For example, the `Button` component's `on_click` prop could have been called `on ```js function Button({ onSmash, children }) { - return <button on_click={onSmash}>{children}</button>; + return <button on_click={onSmash}>{children}</button>; } export default function App() { - return ( - <div> - <Button onSmash={() => alert("Playing!")}>Play Movie</Button> - <Button onSmash={() => alert("Uploading!")}>Upload Image</Button> - </div> - ); + return ( + <div> + <Button onSmash={() => alert("Playing!")}>Play Movie</Button> + <Button onSmash={() => alert("Uploading!")}>Upload Image</Button> + </div> + ); } ``` ```css button { - margin-right: 10px; + margin-right: 10px; } ``` @@ -229,31 +229,31 @@ When your component supports multiple interactions, you might name event handler ```js export default function App() { - return ( - <Toolbar - onPlayMovie={() => alert("Playing!")} - onUploadImage={() => alert("Uploading!")} - /> - ); + return ( + <Toolbar + onPlayMovie={() => alert("Playing!")} + onUploadImage={() => alert("Uploading!")} + /> + ); } function Toolbar({ onPlayMovie, onUploadImage }) { - return ( - <div> - <Button on_click={onPlayMovie}>Play Movie</Button> - <Button on_click={onUploadImage}>Upload Image</Button> - </div> - ); + return ( + <div> + <Button on_click={onPlayMovie}>Play Movie</Button> + <Button on_click={onUploadImage}>Upload Image</Button> + </div> + ); } function Button({ on_click, children }) { - return <button on_click={on_click}>{children}</button>; + return <button on_click={on_click}>{children}</button>; } ``` ```css button { - margin-right: 10px; + margin-right: 10px; } ``` @@ -273,27 +273,27 @@ This `<div>` contains two buttons. Both the `<div>` _and_ each button have their ```js export default function Toolbar() { - return ( - <div - className="Toolbar" - on_click={() => { - alert("You clicked on the toolbar!"); - }} - > - <button on_click={() => alert("Playing!")}>Play Movie</button> - <button on_click={() => alert("Uploading!")}>Upload Image</button> - </div> - ); + return ( + <div + className="Toolbar" + on_click={() => { + alert("You clicked on the toolbar!"); + }} + > + <button on_click={() => alert("Playing!")}>Play Movie</button> + <button on_click={() => alert("Uploading!")}>Upload Image</button> + </div> + ); } ``` ```css .Toolbar { - background: #aaa; - padding: 5px; + background: #aaa; + padding: 5px; } button { - margin: 5px; + margin: 5px; } ``` @@ -313,40 +313,40 @@ That event object also lets you stop the propagation. If you want to prevent an ```js function Button({ on_click, children }) { - return ( - <button - on_click={(e) => { - e.stopPropagation(); - on_click(); - }} - > - {children} - </button> - ); + return ( + <button + on_click={(e) => { + e.stopPropagation(); + on_click(); + }} + > + {children} + </button> + ); } export default function Toolbar() { - return ( - <div - className="Toolbar" - on_click={() => { - alert("You clicked on the toolbar!"); - }} - > - <Button on_click={() => alert("Playing!")}>Play Movie</Button> - <Button on_click={() => alert("Uploading!")}>Upload Image</Button> - </div> - ); + return ( + <div + className="Toolbar" + on_click={() => { + alert("You clicked on the toolbar!"); + }} + > + <Button on_click={() => alert("Playing!")}>Play Movie</Button> + <Button on_click={() => alert("Uploading!")}>Upload Image</Button> + </div> + ); } ``` ```css .Toolbar { - background: #aaa; - padding: 5px; + background: #aaa; + padding: 5px; } button { - margin: 5px; + margin: 5px; } ``` @@ -369,12 +369,12 @@ In rare cases, you might need to catch all events on child elements, _even if th ```js <div - on_clickCapture={() => { - /* this runs first */ - }} + on_clickCapture={() => { + /* this runs first */ + }} > - <button on_click={(e) => e.stopPropagation()} /> - <button on_click={(e) => e.stopPropagation()} /> + <button on_click={(e) => e.stopPropagation()} /> + <button on_click={(e) => e.stopPropagation()} /> </div> ``` @@ -394,16 +394,16 @@ Notice how this click handler runs a line of code _and then_ calls the `on_click ```js function Button({ on_click, children }) { - return ( - <button - on_click={(e) => { - e.stopPropagation(); - on_click(); - }} - > - {children} - </button> - ); + return ( + <button + on_click={(e) => { + e.stopPropagation(); + on_click(); + }} + > + {children} + </button> + ); } ``` @@ -417,18 +417,18 @@ Some browser events have default behavior associated with them. For example, a ` ```js export default function Signup() { - return ( - <form onSubmit={() => alert("Submitting!")}> - <input /> - <button>Send</button> - </form> - ); + return ( + <form onSubmit={() => alert("Submitting!")}> + <input /> + <button>Send</button> + </form> + ); } ``` ```css button { - margin-left: 5px; + margin-left: 5px; } ``` @@ -436,23 +436,23 @@ You can call `e.preventDefault()` on the event object to stop this from happenin ```js export default function Signup() { - return ( - <form - onSubmit={(e) => { - e.preventDefault(); - alert("Submitting!"); - }} - > - <input /> - <button>Send</button> - </form> - ); + return ( + <form + onSubmit={(e) => { + e.preventDefault(); + alert("Submitting!"); + }} + > + <input /> + <button>Send</button> + </form> + ); } ``` ```css button { - margin-left: 5px; + margin-left: 5px; } ``` @@ -489,16 +489,16 @@ Clicking this button is supposed to switch the page background between white and ```js export default function LightSwitch() { - function handleClick() { - let bodyStyle = document.body.style; - if (bodyStyle.backgroundColor === "black") { - bodyStyle.backgroundColor = "white"; - } else { - bodyStyle.backgroundColor = "black"; - } - } + function handleClick() { + let bodyStyle = document.body.style; + if (bodyStyle.backgroundColor === "black") { + bodyStyle.backgroundColor = "white"; + } else { + bodyStyle.backgroundColor = "black"; + } + } - return <button on_click={handleClick()}>Toggle the lights</button>; + return <button on_click={handleClick()}>Toggle the lights</button>; } ``` @@ -508,16 +508,16 @@ The problem is that `<button on_click={handleClick()}>` _calls_ the `handleClick ```js export default function LightSwitch() { - function handleClick() { - let bodyStyle = document.body.style; - if (bodyStyle.backgroundColor === "black") { - bodyStyle.backgroundColor = "white"; - } else { - bodyStyle.backgroundColor = "black"; - } - } + function handleClick() { + let bodyStyle = document.body.style; + if (bodyStyle.backgroundColor === "black") { + bodyStyle.backgroundColor = "white"; + } else { + bodyStyle.backgroundColor = "black"; + } + } - return <button on_click={handleClick}>Toggle the lights</button>; + return <button on_click={handleClick}>Toggle the lights</button>; } ``` @@ -525,16 +525,16 @@ Alternatively, you could wrap the call into another function, like `<button on_c ```js export default function LightSwitch() { - function handleClick() { - let bodyStyle = document.body.style; - if (bodyStyle.backgroundColor === "black") { - bodyStyle.backgroundColor = "white"; - } else { - bodyStyle.backgroundColor = "black"; - } - } + function handleClick() { + let bodyStyle = document.body.style; + if (bodyStyle.backgroundColor === "black") { + bodyStyle.backgroundColor = "white"; + } else { + bodyStyle.backgroundColor = "black"; + } + } - return <button on_click={() => handleClick()}>Toggle the lights</button>; + return <button on_click={() => handleClick()}>Toggle the lights</button>; } ``` @@ -548,7 +548,7 @@ After you do this, notice that clicking the button also increments the page clic ```js export default function ColorSwitch({ onChangeColor }) { - return <button>Change color</button>; + return <button>Change color</button>; } ``` @@ -557,35 +557,35 @@ import { useState } from "react"; import ColorSwitch from "./ColorSwitch.js"; export default function App() { - const [clicks, setClicks] = useState(0); - - function handleClickOutside() { - setClicks((c) => c + 1); - } - - function getRandomLightColor() { - let r = 150 + Math.round(100 * Math.random()); - let g = 150 + Math.round(100 * Math.random()); - let b = 150 + Math.round(100 * Math.random()); - return `rgb(${r}, ${g}, ${b})`; - } - - function handleChangeColor() { - let bodyStyle = document.body.style; - bodyStyle.backgroundColor = getRandomLightColor(); - } - - return ( - <div - style={{ width: "100%", height: "100%" }} - on_click={handleClickOutside} - > - <ColorSwitch onChangeColor={handleChangeColor} /> - <br /> - <br /> - <h2>Clicks on the page: {clicks}</h2> - </div> - ); + const [clicks, setClicks] = useState(0); + + function handleClickOutside() { + setClicks((c) => c + 1); + } + + function getRandomLightColor() { + let r = 150 + Math.round(100 * Math.random()); + let g = 150 + Math.round(100 * Math.random()); + let b = 150 + Math.round(100 * Math.random()); + return `rgb(${r}, ${g}, ${b})`; + } + + function handleChangeColor() { + let bodyStyle = document.body.style; + bodyStyle.backgroundColor = getRandomLightColor(); + } + + return ( + <div + style={{ width: "100%", height: "100%" }} + on_click={handleClickOutside} + > + <ColorSwitch onChangeColor={handleChangeColor} /> + <br /> + <br /> + <h2>Clicks on the page: {clicks}</h2> + </div> + ); } ``` @@ -597,16 +597,16 @@ However, this introduces the problem of the incrementing counter. If `onChangeCo ```js export default function ColorSwitch({ onChangeColor }) { - return ( - <button - on_click={(e) => { - e.stopPropagation(); - onChangeColor(); - }} - > - Change color - </button> - ); + return ( + <button + on_click={(e) => { + e.stopPropagation(); + onChangeColor(); + }} + > + Change color + </button> + ); } ``` @@ -615,35 +615,35 @@ import { useState } from "react"; import ColorSwitch from "./ColorSwitch.js"; export default function App() { - const [clicks, setClicks] = useState(0); - - function handleClickOutside() { - setClicks((c) => c + 1); - } - - function getRandomLightColor() { - let r = 150 + Math.round(100 * Math.random()); - let g = 150 + Math.round(100 * Math.random()); - let b = 150 + Math.round(100 * Math.random()); - return `rgb(${r}, ${g}, ${b})`; - } - - function handleChangeColor() { - let bodyStyle = document.body.style; - bodyStyle.backgroundColor = getRandomLightColor(); - } - - return ( - <div - style={{ width: "100%", height: "100%" }} - on_click={handleClickOutside} - > - <ColorSwitch onChangeColor={handleChangeColor} /> - <br /> - <br /> - <h2>Clicks on the page: {clicks}</h2> - </div> - ); + const [clicks, setClicks] = useState(0); + + function handleClickOutside() { + setClicks((c) => c + 1); + } + + function getRandomLightColor() { + let r = 150 + Math.round(100 * Math.random()); + let g = 150 + Math.round(100 * Math.random()); + let b = 150 + Math.round(100 * Math.random()); + return `rgb(${r}, ${g}, ${b})`; + } + + function handleChangeColor() { + let bodyStyle = document.body.style; + bodyStyle.backgroundColor = getRandomLightColor(); + } + + return ( + <div + style={{ width: "100%", height: "100%" }} + on_click={handleClickOutside} + > + <ColorSwitch onChangeColor={handleChangeColor} /> + <br /> + <br /> + <h2>Clicks on the page: {clicks}</h2> + </div> + ); } ``` diff --git a/docs/src/learn/start-a-new-react-project.md b/docs/src/learn/start-a-new-react-project.md deleted file mode 100644 index 490698fab..000000000 --- a/docs/src/learn/start-a-new-react-project.md +++ /dev/null @@ -1,155 +0,0 @@ -## Overview - -<p class="intro" markdown> - -If you want to build a new app or a new website fully with ReactPy, we recommend picking one of the ReactPy-compatible backends popular in the community. These backend frameworks provide features that most apps and sites eventually need, including routing, data fetching, and session management. - -</p> - -## Built-in Backends - -<!-- FIXME: This is reliant on https://github.com/reactive-python/reactpy/issues/1071 --> - -!!! abstract "Note" - - Some of our backend frameworks are considered _built-in_, meaning that compatibility for these backends are contained within `reactpy.backend.*`. - - In order to use ReactPy with _built-in_ backend, you will need to run `reactpy.backend.*.configure(...)` on your ASGI application. This command will configure the necessary settings and routes for ReactPy to work properly. - - For example, this is how you would configure ReactPy for FastAPI: - - ```python linenums="0" - {% include "../../examples/python/start_a_new_react_project/configure_example.py" %} - ``` - -### FastAPI - -FastAPI is a high-performance web framework that is designed for speed and efficiency. It is built on top of the asyncio library and uses a number of optimizations to achieve its performance. FastAPI is a good choice for web applications that need to be fast and scalable. - -!!! example "Terminal" - - ```bash linenums="0" - pip install reactpy[fastapi] - ``` - -If you're new to FastAPI, check out the [FastAPI tutorial](https://fastapi.tiangolo.com/tutorial/). - -You will need to [configure FastAPI](#built-in-backends) in order to use it with ReactPy. - -### Flask - -Flask is a microframework that is lightweight and easy to use. It is a good choice for small and simple web applications. Flask does not include many features out of the box, but it is highly customizable and can be extended with a variety of third-party libraries. - -!!! example "Terminal" - - ```bash linenums="0" - pip install reactpy[flask] - ``` - -If you're new to Flask, check out the [Flask tutorial](https://flask.palletsprojects.com/en/latest/tutorial/). - -You will need to [configure Flask](#built-in-backends) in order to use it with ReactPy. - -### Sanic - -Sanic is a microframework that is designed for speed and performance. It is built on top of the asyncio library and uses a number of optimizations to achieve its performance. Sanic is a good choice for web applications that need to be fast and scalable. - -!!! example "Terminal" - - ```bash linenums="0" - pip install reactpy[sanic] - ``` - -If you're new to Sanic, check out the [Sanic tutorial](https://sanicframework.org/en/guide/). - -You will need to [configure Sanic](#built-in-backends) in order to use it with ReactPy. - -### Starlette - -Starlette is a lightweight framework that is designed for simplicity and flexibility. It is built on top of the ASGI standard and is very easy to extend. Starlette is a good choice for web applications that need to be simple and flexible. - -!!! example "Terminal" - - ```bash linenums="0" - pip install reactpy[starlette] - ``` - -If you're new to Starlette, check out the [Starlette tutorial](https://www.starlette.io/tutorial/). - -You will need to [configure Starlette](#built-in-backends) in order to use it with ReactPy. - -### Tornado - -Tornado is a scalable web framework that is designed for high-traffic applications. It is built on top of the asyncio library and uses a number of optimizations to achieve its scalability. Tornado is a good choice for web applications that need to handle a lot of traffic. - -!!! example "Terminal" - - ```bash linenums="0" - pip install reactpy[tornado] - ``` - -If you're new to Tornado, check out the [Tornado tutorial](https://www.tornadoweb.org/en/stable/guide/). - -You will need to [configure Tornado](#built-in-backends) in order to use it with ReactPy. - -## External Backends - -!!! warning "Pitfall" - - _External_ backends have ReactPy support, but have significantly different installation and configuration instructions than _built-in_ backends. - - Make sure to follow the configuration guide for your chosen _external_ backend. - -### Django - -[Django](https://www.djangoproject.com/) is a full-featured web framework that provides a batteries-included approach to web development. It includes features such as ORM, templating, authentication, and authorization. Django is a good choice for large and complex web applications. - -!!! example "Terminal" - - ```bash linenums="0" - pip install reactpy-django - ``` - -If you're new to Django, check out the [Django tutorial](https://docs.djangoproject.com/en/dev/intro/tutorial01/). - -ReactPy has unique [configuration instructions](https://reactive-python.github.io/reactpy-django/get-started/installation/) to use Django. - -### Jupyter - -Jupyter is an interactive computing environment that is used for data science and machine learning. It allows users to run code, visualize data, and collaborate with others in a live environment. Jupyter is a powerful tool for data scientists and machine learning engineers. - -!!! example "Terminal" - - ```bash linenums="0" - pip install reactpy-jupyter - ``` - -If you're new to Jupyter, check out the [Jupyter tutorial](https://jupyter.org/try). - -ReactPy has unique [configuration instructions](https://github.com/reactive-python/reactpy-jupyter#readme) to use Jupyter. - -### Plotly Dash - -Plotly Dash is a web application framework that is used to create interactive dashboards. It allows users to create dashboards that can be used to visualize data and interact with it in real time. Plotly Dash is a good choice for creating dashboards that need to be interactive and informative. - -!!! example "Terminal" - - ```bash linenums="0" - pip install reactpy-dash - ``` - -If you're new to Plotly Dash, check out the [Plotly Dash tutorial](https://dash.plotly.com/installation). - -ReactPy has unique [configuration instructions](https://github.com/reactive-python/reactpy-dash#readme) to use Plotly Dash. - -!!! info "Deep Dive" - - <font size="4">**Can I use ReactPy without a backend framework?**</font> - - You can not ReactPy without a backend—this project was designed to be built on-top of existing web frameworks. - - Here's why. - - You can think of ReactPy as ReactJS server side rendering, but with a Python server. We rely on Python web frameworks and webservers in order to process ReactPy traffic. **This means that you can [use any Python web framework](../learn/creating-backends.md) as a ReactPy backend, as long as it supports the ASGI standard.** As your project grows with every new feature, you may want to switch backends in the future. As a result, we recommend keeping all backend-related logic within hook functions in order to make the "points of integration" between ReactPy and your backend as small as possible. - - **If you're building a new app or a site fully with ReactPy, we recommend using your favorite backend combined with [`reactpy-router`](https://github.com/reactive-python/reactpy-router) to create a Single Page Application (SPA).** diff --git a/docs/src/learn/thinking-in-react.md b/docs/src/learn/thinking-in-react.md index 0328ed5df..57873633e 100644 --- a/docs/src/learn/thinking-in-react.md +++ b/docs/src/learn/thinking-in-react.md @@ -13,12 +13,12 @@ Imagine that you already have a JSON API and a mockup from a designer. The JSON API returns some data that looks like this: ```json linenums="0" -{% include "../../examples/json/thinking_in_react/start_with_the_mockup.json" %} +{% include "../../examples/thinking_in_react/start_with_the_mockup.json" %} ``` The mockup looks like this: -<img src="../../static/images/s_thinking-in-react_ui.png" width="300" style="margin: 0 auto" /> +<img src="../../assets/images/s_thinking-in-react_ui.png" width="300" style="margin: 0 auto" /> To implement a UI in React, you will usually follow the same five steps. @@ -38,7 +38,7 @@ There are five components on this screen: <!-- TODO: Change this image to use snake_case --> -<img src="../../static/images/s_thinking-in-react_ui_outline.png" width="500" style="margin: 0 auto" /> +<img src="../../assets/images/s_thinking-in-react_ui_outline.png" width="500" style="margin: 0 auto" /> 1. `filterable_product_table` (grey) contains the entire app. 2. `search_bar` (blue) receives the user input. @@ -67,13 +67,13 @@ You can either build "top down" by starting with building the components higher === "app.py" ```python - {% include "../../examples/python/thinking_in_react/build_a_static_version_in_react.py" end="# end" %} + {% include "../../examples/thinking_in_react/build_a_static_version_in_react.py" %} ``` === "styles.css" ```css - {% include "../../examples/css/thinking_in_react/build_a_static_version_in_react.css" %} + {% include "../../examples/thinking_in_react/build_a_static_version_in_react.css" %} ``` === ":material-play: Run" @@ -159,13 +159,13 @@ So the state values will live in `filterable_product_table`. Add state to the component with the [`use_state()` Hook.](../reference/use-state.md) Hooks are special functions that let you "hook into" React. Add two state variables at the top of `filterable_product_table` and specify their initial state: ```python linenums="0" -{% include "../../examples/python/thinking_in_react/use_state.py" start="# start" %} +{% include "../../examples/thinking_in_react/use_state.py" start="# start" %} ``` Then, pass `filter_text` and `in_stock_only` to `product_table` and `search_bar` as props: ```python linenums="0" -{% include "../../examples/python/thinking_in_react/use_state_with_components.py" start="# start" %} +{% include "../../examples/thinking_in_react/use_state_with_components.py" start="# start" %} ``` You can start seeing how your application will behave. Edit the `filter_text` initial value from `use_state('')` to `use_state('fruit')` in the sandbox code below. You'll see both the search input text and the table update: @@ -173,13 +173,13 @@ You can start seeing how your application will behave. Edit the `filter_text` in === "app.py" ```python - {% include "../../examples/python/thinking_in_react/identify_where_your_state_should_live.py" end="# end" %} + {% include "../../examples/thinking_in_react/identify_where_your_state_should_live.py" %} ``` === "styles.css" ```css - {% include "../../examples/css/thinking_in_react/identify_where_your_state_should_live.css" %} + {% include "../../examples/thinking_in_react/identify_where_your_state_should_live.css" %} ``` === ":material-play: Run" @@ -193,7 +193,7 @@ Notice that editing the form doesn't work yet. In the code above, `product_table` and `search_bar` read the `filter_text` and `in_stock_only` props to render the table, the input, and the checkbox. For example, here is how `search_bar` populates the input value: ```python linenums="0" hl_lines="2 7" -{% include "../../examples/python/thinking_in_react/error_example.py" start="# start" %} +{% include "../../examples/thinking_in_react/error_example.py" start="# start" %} ``` However, you haven't added any code to respond to the user actions like typing yet. This will be your final step. @@ -207,13 +207,13 @@ React makes this data flow explicit, but it requires a little more typing than t You want to make it so whenever the user changes the form inputs, the state updates to reflect those changes. The state is owned by `filterable_product_table`, so only it can call `set_filter_text` and `set_in_stock_only`. To let `search_bar` update the `filterable_product_table`'s state, you need to pass these functions down to `search_bar`: ```python linenums="0" hl_lines="3-4 10-11" -{% include "../../examples/python/thinking_in_react/set_state_props.py" start="# start" %} +{% include "../../examples/thinking_in_react/set_state_props.py" start="# start" %} ``` -Inside the `search_bar`, you will add the `on_change` event handlers and set the parent state from them: +Inside the `search_bar`, you will add the `onChange` event handlers and set the parent state from them: ```python linenums="0" hl_lines="6" -{% include "../../examples/python/thinking_in_react/event_handlers.py" start="# start" %} +{% include "../../examples/thinking_in_react/event_handlers.py" start="# start" %} ``` Now the application fully works! @@ -223,13 +223,13 @@ Now the application fully works! <!-- FIXME: Click event on the checkbox is broken. `event["target"]["checked"]` doesn't exist --> ```python - {% include "../../examples/python/thinking_in_react/add_inverse_data_flow.py" end="# end" %} + {% include "../../examples/thinking_in_react/add_inverse_data_flow.py" %} ``` === "styles.css" ```css - {% include "../../examples/css/thinking_in_react/add_inverse_data_flow.css" %} + {% include "../../examples/thinking_in_react/add_inverse_data_flow.css" %} ``` === ":material-play: Run" diff --git a/docs/src/learn/tutorial-tic-tac-toe.md b/docs/src/learn/tutorial-tic-tac-toe.md index 218fec5de..e92f53bf2 100644 --- a/docs/src/learn/tutorial-tic-tac-toe.md +++ b/docs/src/learn/tutorial-tic-tac-toe.md @@ -28,13 +28,13 @@ You can see what it will look like when you're finished here: <!-- FIXME: Currently this example uses empty string instead of None, due to a bug with ReactPy --> ```python - {% include "../../examples/python/tutorial_tic_tac_toe/tic_tac_toe.py" end="# end" %} + {% include "../../examples/tutorial_tic_tac_toe/tic_tac_toe.py" %} ``` === "styles.css" ```css - {% include "../../examples/css/tutorial_tic_tac_toe/tic_tac_toe.css" %} + {% include "../../examples/tutorial_tic_tac_toe/tic_tac_toe.css" %} ``` === ":material-play: Run" @@ -56,13 +56,13 @@ In the code example below, click **Run** to open the editor in a new tab using t === "app.py" ```python - {% include "../../examples/python/tutorial_tic_tac_toe/setup_for_the_tutorial.py" start="# start" %} + {% include "../../examples/tutorial_tic_tac_toe/setup_for_the_tutorial.py" start="# start" %} ``` === "styles.css" ```css - {% include "../../examples/css/tutorial_tic_tac_toe/setup_for_the_tutorial.css" %} + {% include "../../examples/tutorial_tic_tac_toe/setup_for_the_tutorial.css" %} ``` === ":material-play: Run" @@ -102,7 +102,7 @@ In Jupyter you'll see three main sections: The `tic-tac-toe.ipynb` file should be selected in the _Files_ section. Click on the first code box, where the contents of that _code editor_ should be: ```python linenums="0" -{% include "../../examples/python/tutorial_tic_tac_toe/setup_for_the_tutorial.py" start="# start" %} +{% include "../../examples/tutorial_tic_tac_toe/setup_for_the_tutorial.py" start="# start" %} ``` After clicking the _run button_ the notebook should be displaying a square with a X in it like this: @@ -119,7 +119,7 @@ The code in `App.js` creates a _component_. In React, a component is a piece of ```js export default function Square() { - return <button className="square">X</button>; + return <button className="square">X</button>; } ``` @@ -127,7 +127,7 @@ The first line defines a function called `Square`. The `export` JavaScript keywo ```js export default function Square() { - return <button className="square">X</button>; + return <button className="square">X</button>; } ``` @@ -182,12 +182,12 @@ React components need to return a single JSX element and not multiple adjacent J ```js export default function Square() { - return ( - <> - <button className="square">X</button> - <button className="square">X</button> - </> - ); + return ( + <> + <button className="square">X</button> + <button className="square">X</button> + </> + ); } ``` @@ -205,25 +205,25 @@ In the `App.js` file, update the `Square` component to look like this: ```js export default function Square() { - return ( - <> - <div className="board-row"> - <button className="square">1</button> - <button className="square">2</button> - <button className="square">3</button> - </div> - <div className="board-row"> - <button className="square">4</button> - <button className="square">5</button> - <button className="square">6</button> - </div> - <div className="board-row"> - <button className="square">7</button> - <button className="square">8</button> - <button className="square">9</button> - </div> - </> - ); + return ( + <> + <div className="board-row"> + <button className="square">1</button> + <button className="square">2</button> + <button className="square">3</button> + </div> + <div className="board-row"> + <button className="square">4</button> + <button className="square">5</button> + <button className="square">6</button> + </div> + <div className="board-row"> + <button className="square">7</button> + <button className="square">8</button> + <button className="square">9</button> + </div> + </> + ); } ``` @@ -235,7 +235,7 @@ But you now have a problem. Your component named `Square`, really isn't a square ```js export default function Board() { - //... + //... } ``` @@ -243,70 +243,70 @@ At this point your code should look something like this: ```js export default function Board() { - return ( - <> - <div className="board-row"> - <button className="square">1</button> - <button className="square">2</button> - <button className="square">3</button> - </div> - <div className="board-row"> - <button className="square">4</button> - <button className="square">5</button> - <button className="square">6</button> - </div> - <div className="board-row"> - <button className="square">7</button> - <button className="square">8</button> - <button className="square">9</button> - </div> - </> - ); + return ( + <> + <div className="board-row"> + <button className="square">1</button> + <button className="square">2</button> + <button className="square">3</button> + </div> + <div className="board-row"> + <button className="square">4</button> + <button className="square">5</button> + <button className="square">6</button> + </div> + <div className="board-row"> + <button className="square">7</button> + <button className="square">8</button> + <button className="square">9</button> + </div> + </> + ); } ``` ```css * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: sans-serif; - margin: 20px; - padding: 0; + font-family: sans-serif; + margin: 20px; + padding: 0; } .square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; } .board-row:after { - clear: both; - content: ""; - display: table; + clear: both; + content: ""; + display: table; } .status { - margin-bottom: 10px; + margin-bottom: 10px; } .game { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .game-info { - margin-left: 20px; + margin-left: 20px; } ``` @@ -324,11 +324,11 @@ First, you are going to copy the line defining your first square (`<button class ```js function Square() { - return <button className="square">1</button>; + return <button className="square">1</button>; } export default function Board() { - // ... + // ... } ``` @@ -337,25 +337,25 @@ Then you'll update the Board component to render that `Square` component using J ```js // ... export default function Board() { - return ( - <> - <div className="board-row"> - <Square /> - <Square /> - <Square /> - </div> - <div className="board-row"> - <Square /> - <Square /> - <Square /> - </div> - <div className="board-row"> - <Square /> - <Square /> - <Square /> - </div> - </> - ); + return ( + <> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + </> + ); } ``` @@ -371,7 +371,7 @@ Update the `Square` component to read the `value` prop that you'll pass from the ```js function Square({ value }) { - return <button className="square">1</button>; + return <button className="square">1</button>; } ``` @@ -381,7 +381,7 @@ Now you want to display that `value` instead of `1` inside every square. Try doi ```js function Square({ value }) { - return <button className="square">value</button>; + return <button className="square">value</button>; } ``` @@ -393,7 +393,7 @@ You wanted to render the JavaScript variable called `value` from your component, ```js function Square({ value }) { - return <button className="square">{value}</button>; + return <button className="square">{value}</button>; } ``` @@ -405,25 +405,25 @@ This is because the `Board` component hasn't passed the `value` prop to each `Sq ```js export default function Board() { - return ( - <> - <div className="board-row"> - <Square value="1" /> - <Square value="2" /> - <Square value="3" /> - </div> - <div className="board-row"> - <Square value="4" /> - <Square value="5" /> - <Square value="6" /> - </div> - <div className="board-row"> - <Square value="7" /> - <Square value="8" /> - <Square value="9" /> - </div> - </> - ); + return ( + <> + <div className="board-row"> + <Square value="1" /> + <Square value="2" /> + <Square value="3" /> + </div> + <div className="board-row"> + <Square value="4" /> + <Square value="5" /> + <Square value="6" /> + </div> + <div className="board-row"> + <Square value="7" /> + <Square value="8" /> + <Square value="9" /> + </div> + </> + ); } ``` @@ -435,74 +435,74 @@ Your updated code should look like this: ```js function Square({ value }) { - return <button className="square">{value}</button>; + return <button className="square">{value}</button>; } export default function Board() { - return ( - <> - <div className="board-row"> - <Square value="1" /> - <Square value="2" /> - <Square value="3" /> - </div> - <div className="board-row"> - <Square value="4" /> - <Square value="5" /> - <Square value="6" /> - </div> - <div className="board-row"> - <Square value="7" /> - <Square value="8" /> - <Square value="9" /> - </div> - </> - ); + return ( + <> + <div className="board-row"> + <Square value="1" /> + <Square value="2" /> + <Square value="3" /> + </div> + <div className="board-row"> + <Square value="4" /> + <Square value="5" /> + <Square value="6" /> + </div> + <div className="board-row"> + <Square value="7" /> + <Square value="8" /> + <Square value="9" /> + </div> + </> + ); } ``` ```css * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: sans-serif; - margin: 20px; - padding: 0; + font-family: sans-serif; + margin: 20px; + padding: 0; } .square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; } .board-row:after { - clear: both; - content: ""; - display: table; + clear: both; + content: ""; + display: table; } .status { - margin-bottom: 10px; + margin-bottom: 10px; } .game { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .game-info { - margin-left: 20px; + margin-left: 20px; } ``` @@ -512,15 +512,15 @@ Let's fill the `Square` component with an `X` when you click it. Declare a funct ```js function Square({ value }) { - function handleClick() { - console.log("clicked!"); - } + function handleClick() { + console.log("clicked!"); + } - return ( - <button className="square" on_click={handleClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={handleClick}> + {value} + </button> + ); } ``` @@ -555,25 +555,25 @@ Since the `Square` component no longer accepts props anymore, you'll remove the ```js // ... export default function Board() { - return ( - <> - <div className="board-row"> - <Square /> - <Square /> - <Square /> - </div> - <div className="board-row"> - <Square /> - <Square /> - <Square /> - </div> - <div className="board-row"> - <Square /> - <Square /> - <Square /> - </div> - </> - ); + return ( + <> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + </> + ); } ``` @@ -581,17 +581,17 @@ Now you'll change `Square` to display an "X" when clicked. Replace the `console. ```js function Square() { - const [value, setValue] = useState(null); + const [value, setValue] = useState(null); - function handleClick() { - setValue("X"); - } + function handleClick() { + setValue("X"); + } - return ( - <button className="square" on_click={handleClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={handleClick}> + {value} + </button> + ); } ``` @@ -607,84 +607,84 @@ After you've made the above changes, your code will look like this: import { useState } from "react"; function Square() { - const [value, setValue] = useState(null); + const [value, setValue] = useState(null); - function handleClick() { - setValue("X"); - } + function handleClick() { + setValue("X"); + } - return ( - <button className="square" on_click={handleClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={handleClick}> + {value} + </button> + ); } export default function Board() { - return ( - <> - <div className="board-row"> - <Square /> - <Square /> - <Square /> - </div> - <div className="board-row"> - <Square /> - <Square /> - <Square /> - </div> - <div className="board-row"> - <Square /> - <Square /> - <Square /> - </div> - </> - ); + return ( + <> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + <div className="board-row"> + <Square /> + <Square /> + <Square /> + </div> + </> + ); } ``` ```css * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: sans-serif; - margin: 20px; - padding: 0; + font-family: sans-serif; + margin: 20px; + padding: 0; } .square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; } .board-row:after { - clear: both; - content: ""; - display: table; + clear: both; + content: ""; + display: table; } .status { - margin-bottom: 10px; + margin-bottom: 10px; } .game { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .game-info { - margin-left: 20px; + margin-left: 20px; } ``` @@ -740,26 +740,26 @@ Now your `Board` component needs to pass the `value` prop down to each `Square` ```js export default function Board() { - const [squares, setSquares] = useState(Array(9).fill(null)); - return ( - <> - <div className="board-row"> - <Square value={squares[0]} /> - <Square value={squares[1]} /> - <Square value={squares[2]} /> - </div> - <div className="board-row"> - <Square value={squares[3]} /> - <Square value={squares[4]} /> - <Square value={squares[5]} /> - </div> - <div className="board-row"> - <Square value={squares[6]} /> - <Square value={squares[7]} /> - <Square value={squares[8]} /> - </div> - </> - ); + const [squares, setSquares] = useState(Array(9).fill(null)); + return ( + <> + <div className="board-row"> + <Square value={squares[0]} /> + <Square value={squares[1]} /> + <Square value={squares[2]} /> + </div> + <div className="board-row"> + <Square value={squares[3]} /> + <Square value={squares[4]} /> + <Square value={squares[5]} /> + </div> + <div className="board-row"> + <Square value={squares[6]} /> + <Square value={squares[7]} /> + <Square value={squares[8]} /> + </div> + </> + ); } ``` @@ -767,7 +767,7 @@ Next, you'll edit the `Square` component to receive the `value` prop from the Bo ```js function Square({ value }) { - return <button className="square">{value}</button>; + return <button className="square">{value}</button>; } ``` @@ -781,75 +781,75 @@ And your code should look like this: import { useState } from "react"; function Square({ value }) { - return <button className="square">{value}</button>; + return <button className="square">{value}</button>; } export default function Board() { - const [squares, setSquares] = useState(Array(9).fill(null)); - return ( - <> - <div className="board-row"> - <Square value={squares[0]} /> - <Square value={squares[1]} /> - <Square value={squares[2]} /> - </div> - <div className="board-row"> - <Square value={squares[3]} /> - <Square value={squares[4]} /> - <Square value={squares[5]} /> - </div> - <div className="board-row"> - <Square value={squares[6]} /> - <Square value={squares[7]} /> - <Square value={squares[8]} /> - </div> - </> - ); + const [squares, setSquares] = useState(Array(9).fill(null)); + return ( + <> + <div className="board-row"> + <Square value={squares[0]} /> + <Square value={squares[1]} /> + <Square value={squares[2]} /> + </div> + <div className="board-row"> + <Square value={squares[3]} /> + <Square value={squares[4]} /> + <Square value={squares[5]} /> + </div> + <div className="board-row"> + <Square value={squares[6]} /> + <Square value={squares[7]} /> + <Square value={squares[8]} /> + </div> + </> + ); } ``` ```css * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: sans-serif; - margin: 20px; - padding: 0; + font-family: sans-serif; + margin: 20px; + padding: 0; } .square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; } .board-row:after { - clear: both; - content: ""; - display: table; + clear: both; + content: ""; + display: table; } .status { - margin-bottom: 10px; + margin-bottom: 10px; } .game { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .game-info { - margin-left: 20px; + margin-left: 20px; } ``` @@ -861,11 +861,11 @@ Instead, you'll pass down a function from the `Board` component to the `Square` ```js function Square({ value }) { - return ( - <button className="square" on_click={onSquareClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); } ``` @@ -873,11 +873,11 @@ Next, you'll add the `onSquareClick` function to the `Square` component's props: ```js function Square({ value, onSquareClick }) { - return ( - <button className="square" on_click={onSquareClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); } ``` @@ -982,53 +982,53 @@ Now you need to update the other eight squares to call `handleClick` from the ar ```js export default function Board() { - // ... - return ( - <> - <div className="board-row"> - <Square - value={squares[0]} - onSquareClick={() => handleClick(0)} - /> - <Square - value={squares[1]} - onSquareClick={() => handleClick(1)} - /> - <Square - value={squares[2]} - onSquareClick={() => handleClick(2)} - /> - </div> - <div className="board-row"> - <Square - value={squares[3]} - onSquareClick={() => handleClick(3)} - /> - <Square - value={squares[4]} - onSquareClick={() => handleClick(4)} - /> - <Square - value={squares[5]} - onSquareClick={() => handleClick(5)} - /> - </div> - <div className="board-row"> - <Square - value={squares[6]} - onSquareClick={() => handleClick(6)} - /> - <Square - value={squares[7]} - onSquareClick={() => handleClick(7)} - /> - <Square - value={squares[8]} - onSquareClick={() => handleClick(8)} - /> - </div> - </> - ); + // ... + return ( + <> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); } ``` @@ -1044,113 +1044,113 @@ This is what your code should look like: import { useState } from "react"; function Square({ value, onSquareClick }) { - return ( - <button className="square" on_click={onSquareClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); } export default function Board() { - const [squares, setSquares] = useState(Array(9).fill(null)); - - function handleClick(i) { - const nextSquares = squares.slice(); - nextSquares[i] = "X"; - setSquares(nextSquares); - } - - return ( - <> - <div className="board-row"> - <Square - value={squares[0]} - onSquareClick={() => handleClick(0)} - /> - <Square - value={squares[1]} - onSquareClick={() => handleClick(1)} - /> - <Square - value={squares[2]} - onSquareClick={() => handleClick(2)} - /> - </div> - <div className="board-row"> - <Square - value={squares[3]} - onSquareClick={() => handleClick(3)} - /> - <Square - value={squares[4]} - onSquareClick={() => handleClick(4)} - /> - <Square - value={squares[5]} - onSquareClick={() => handleClick(5)} - /> - </div> - <div className="board-row"> - <Square - value={squares[6]} - onSquareClick={() => handleClick(6)} - /> - <Square - value={squares[7]} - onSquareClick={() => handleClick(7)} - /> - <Square - value={squares[8]} - onSquareClick={() => handleClick(8)} - /> - </div> - </> - ); + const [squares, setSquares] = useState(Array(9).fill(null)); + + function handleClick(i) { + const nextSquares = squares.slice(); + nextSquares[i] = "X"; + setSquares(nextSquares); + } + + return ( + <> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); } ``` ```css * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: sans-serif; - margin: 20px; - padding: 0; + font-family: sans-serif; + margin: 20px; + padding: 0; } .square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; } .board-row:after { - clear: both; - content: ""; - display: table; + clear: both; + content: ""; + display: table; } .status { - margin-bottom: 10px; + margin-bottom: 10px; } .game { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .game-info { - margin-left: 20px; + margin-left: 20px; } ``` @@ -1204,10 +1204,10 @@ You'll set the first move to be "X" by default. Let's keep track of this by addi ```js function Board() { - const [xIsNext, setXIsNext] = useState(true); - const [squares, setSquares] = useState(Array(9).fill(null)); + const [xIsNext, setXIsNext] = useState(true); + const [squares, setSquares] = useState(Array(9).fill(null)); - // ... + // ... } ``` @@ -1247,11 +1247,11 @@ When you mark a square with a `X` or an `O` you aren't first checking to see if ```js function handleClick(i) { - if (squares[i]) { - return; - } - const nextSquares = squares.slice(); - //... + if (squares[i]) { + return; + } + const nextSquares = squares.slice(); + //... } ``` @@ -1261,122 +1261,122 @@ Now you can only add `X`'s or `O`'s to empty squares! Here is what your code sho import { useState } from "react"; function Square({ value, onSquareClick }) { - return ( - <button className="square" on_click={onSquareClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); } export default function Board() { - const [xIsNext, setXIsNext] = useState(true); - const [squares, setSquares] = useState(Array(9).fill(null)); - - function handleClick(i) { - if (squares[i]) { - return; - } - const nextSquares = squares.slice(); - if (xIsNext) { - nextSquares[i] = "X"; - } else { - nextSquares[i] = "O"; - } - setSquares(nextSquares); - setXIsNext(!xIsNext); - } - - return ( - <> - <div className="board-row"> - <Square - value={squares[0]} - onSquareClick={() => handleClick(0)} - /> - <Square - value={squares[1]} - onSquareClick={() => handleClick(1)} - /> - <Square - value={squares[2]} - onSquareClick={() => handleClick(2)} - /> - </div> - <div className="board-row"> - <Square - value={squares[3]} - onSquareClick={() => handleClick(3)} - /> - <Square - value={squares[4]} - onSquareClick={() => handleClick(4)} - /> - <Square - value={squares[5]} - onSquareClick={() => handleClick(5)} - /> - </div> - <div className="board-row"> - <Square - value={squares[6]} - onSquareClick={() => handleClick(6)} - /> - <Square - value={squares[7]} - onSquareClick={() => handleClick(7)} - /> - <Square - value={squares[8]} - onSquareClick={() => handleClick(8)} - /> - </div> - </> - ); + const [xIsNext, setXIsNext] = useState(true); + const [squares, setSquares] = useState(Array(9).fill(null)); + + function handleClick(i) { + if (squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + setSquares(nextSquares); + setXIsNext(!xIsNext); + } + + return ( + <> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); } ``` ```css * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: sans-serif; - margin: 20px; - padding: 0; + font-family: sans-serif; + margin: 20px; + padding: 0; } .square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; } .board-row:after { - clear: both; - content: ""; - display: table; + clear: both; + content: ""; + display: table; } .status { - margin-bottom: 10px; + margin-bottom: 10px; } .game { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .game-info { - margin-left: 20px; + margin-left: 20px; } ``` @@ -1386,31 +1386,31 @@ Now that the players can take turns, you'll want to show when the game is won an ```js export default function Board() { - //... + //... } function calculateWinner(squares) { - const lines = [ - [0, 1, 2], - [3, 4, 5], - [6, 7, 8], - [0, 3, 6], - [1, 4, 7], - [2, 5, 8], - [0, 4, 8], - [2, 4, 6], - ]; - for (let i = 0; i < lines.length; i++) { - const [a, b, c] = lines[i]; - if ( - squares[a] && - squares[a] === squares[b] && - squares[a] === squares[c] - ) { - return squares[a]; - } - } - return null; + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; } ``` @@ -1424,11 +1424,11 @@ You will call `calculateWinner(squares)` in the `Board` component's `handleClick ```js function handleClick(i) { - if (squares[i] || calculateWinner(squares)) { - return; - } - const nextSquares = squares.slice(); - //... + if (squares[i] || calculateWinner(squares)) { + return; + } + const nextSquares = squares.slice(); + //... } ``` @@ -1460,155 +1460,155 @@ Congratulations! You now have a working tic-tac-toe game. And you've just learne import { useState } from "react"; function Square({ value, onSquareClick }) { - return ( - <button className="square" on_click={onSquareClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); } export default function Board() { - const [xIsNext, setXIsNext] = useState(true); - const [squares, setSquares] = useState(Array(9).fill(null)); - - function handleClick(i) { - if (calculateWinner(squares) || squares[i]) { - return; - } - const nextSquares = squares.slice(); - if (xIsNext) { - nextSquares[i] = "X"; - } else { - nextSquares[i] = "O"; - } - setSquares(nextSquares); - setXIsNext(!xIsNext); - } - - const winner = calculateWinner(squares); - let status; - if (winner) { - status = "Winner: " + winner; - } else { - status = "Next player: " + (xIsNext ? "X" : "O"); - } - - return ( - <> - <div className="status">{status}</div> - <div className="board-row"> - <Square - value={squares[0]} - onSquareClick={() => handleClick(0)} - /> - <Square - value={squares[1]} - onSquareClick={() => handleClick(1)} - /> - <Square - value={squares[2]} - onSquareClick={() => handleClick(2)} - /> - </div> - <div className="board-row"> - <Square - value={squares[3]} - onSquareClick={() => handleClick(3)} - /> - <Square - value={squares[4]} - onSquareClick={() => handleClick(4)} - /> - <Square - value={squares[5]} - onSquareClick={() => handleClick(5)} - /> - </div> - <div className="board-row"> - <Square - value={squares[6]} - onSquareClick={() => handleClick(6)} - /> - <Square - value={squares[7]} - onSquareClick={() => handleClick(7)} - /> - <Square - value={squares[8]} - onSquareClick={() => handleClick(8)} - /> - </div> - </> - ); + const [xIsNext, setXIsNext] = useState(true); + const [squares, setSquares] = useState(Array(9).fill(null)); + + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + setSquares(nextSquares); + setXIsNext(!xIsNext); + } + + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); } function calculateWinner(squares) { - const lines = [ - [0, 1, 2], - [3, 4, 5], - [6, 7, 8], - [0, 3, 6], - [1, 4, 7], - [2, 5, 8], - [0, 4, 8], - [2, 4, 6], - ]; - for (let i = 0; i < lines.length; i++) { - const [a, b, c] = lines[i]; - if ( - squares[a] && - squares[a] === squares[b] && - squares[a] === squares[c] - ) { - return squares[a]; - } - } - return null; + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; } ``` ```css * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: sans-serif; - margin: 20px; - padding: 0; + font-family: sans-serif; + margin: 20px; + padding: 0; } .square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; } .board-row:after { - clear: both; - content: ""; - display: table; + clear: both; + content: ""; + display: table; } .status { - margin-bottom: 10px; + margin-bottom: 10px; } .game { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .game-info { - margin-left: 20px; + margin-left: 20px; } ``` @@ -1626,13 +1626,13 @@ You'll store the past `squares` arrays in another array called `history`, which ```jsx [ - // Before first move - [null, null, null, null, null, null, null, null, null], - // After first move - [null, null, null, null, "X", null, null, null, null], - // After second move - [null, null, null, null, "X", null, null, null, "O"], - // ... + // Before first move + [null, null, null, null, null, null, null, null, null], + // After first move + [null, null, null, null, "X", null, null, null, null], + // After second move + [null, null, null, null, "X", null, null, null, "O"], + // ... ]; ``` @@ -1646,20 +1646,20 @@ First, add a `Game` component with `export default`. Have it render the `Board` ```js function Board() { - // ... + // ... } export default function Game() { - return ( - <div className="game"> - <div className="game-board"> - <Board /> - </div> - <div className="game-info"> - <ol>{/*TODO*/}</ol> - </div> - </div> - ); + return ( + <div className="game"> + <div className="game-board"> + <Board /> + </div> + <div className="game-info"> + <ol>{/*TODO*/}</ol> + </div> + </div> + ); } ``` @@ -1711,10 +1711,10 @@ Let's make the `Board` component fully controlled by the props it receives. Chan ```js function Board({ xIsNext, squares, onPlay }) { - function handleClick(i) { - //... - } - // ... + function handleClick(i) { + //... + } + // ... } ``` @@ -1722,19 +1722,19 @@ Now replace the `setSquares` and `setXIsNext` calls in `handleClick` in the `Boa ```js function Board({ xIsNext, squares, onPlay }) { - function handleClick(i) { - if (calculateWinner(squares) || squares[i]) { - return; - } - const nextSquares = squares.slice(); - if (xIsNext) { - nextSquares[i] = "X"; - } else { - nextSquares[i] = "O"; - } - onPlay(nextSquares); - } - //... + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + onPlay(nextSquares); + } + //... } ``` @@ -1746,12 +1746,12 @@ The `handlePlay` function needs to update `Game`'s state to trigger a re-render, ```js export default function Game() { - //... - function handlePlay(nextSquares) { - setHistory([...history, nextSquares]); - setXIsNext(!xIsNext); - } - //... + //... + function handlePlay(nextSquares) { + setHistory([...history, nextSquares]); + setXIsNext(!xIsNext); + } + //... } ``` @@ -1765,177 +1765,177 @@ At this point, you've moved the state to live in the `Game` component, and the U import { useState } from "react"; function Square({ value, onSquareClick }) { - return ( - <button className="square" on_click={onSquareClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); } function Board({ xIsNext, squares, onPlay }) { - function handleClick(i) { - if (calculateWinner(squares) || squares[i]) { - return; - } - const nextSquares = squares.slice(); - if (xIsNext) { - nextSquares[i] = "X"; - } else { - nextSquares[i] = "O"; - } - onPlay(nextSquares); - } - - const winner = calculateWinner(squares); - let status; - if (winner) { - status = "Winner: " + winner; - } else { - status = "Next player: " + (xIsNext ? "X" : "O"); - } - - return ( - <> - <div className="status">{status}</div> - <div className="board-row"> - <Square - value={squares[0]} - onSquareClick={() => handleClick(0)} - /> - <Square - value={squares[1]} - onSquareClick={() => handleClick(1)} - /> - <Square - value={squares[2]} - onSquareClick={() => handleClick(2)} - /> - </div> - <div className="board-row"> - <Square - value={squares[3]} - onSquareClick={() => handleClick(3)} - /> - <Square - value={squares[4]} - onSquareClick={() => handleClick(4)} - /> - <Square - value={squares[5]} - onSquareClick={() => handleClick(5)} - /> - </div> - <div className="board-row"> - <Square - value={squares[6]} - onSquareClick={() => handleClick(6)} - /> - <Square - value={squares[7]} - onSquareClick={() => handleClick(7)} - /> - <Square - value={squares[8]} - onSquareClick={() => handleClick(8)} - /> - </div> - </> - ); + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + onPlay(nextSquares); + } + + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); } export default function Game() { - const [xIsNext, setXIsNext] = useState(true); - const [history, setHistory] = useState([Array(9).fill(null)]); - const currentSquares = history[history.length - 1]; - - function handlePlay(nextSquares) { - setHistory([...history, nextSquares]); - setXIsNext(!xIsNext); - } - - return ( - <div className="game"> - <div className="game-board"> - <Board - xIsNext={xIsNext} - squares={currentSquares} - onPlay={handlePlay} - /> - </div> - <div className="game-info"> - <ol>{/*TODO*/}</ol> - </div> - </div> - ); + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const currentSquares = history[history.length - 1]; + + function handlePlay(nextSquares) { + setHistory([...history, nextSquares]); + setXIsNext(!xIsNext); + } + + return ( + <div className="game"> + <div className="game-board"> + <Board + xIsNext={xIsNext} + squares={currentSquares} + onPlay={handlePlay} + /> + </div> + <div className="game-info"> + <ol>{/*TODO*/}</ol> + </div> + </div> + ); } function calculateWinner(squares) { - const lines = [ - [0, 1, 2], - [3, 4, 5], - [6, 7, 8], - [0, 3, 6], - [1, 4, 7], - [2, 5, 8], - [0, 4, 8], - [2, 4, 6], - ]; - for (let i = 0; i < lines.length; i++) { - const [a, b, c] = lines[i]; - if ( - squares[a] && - squares[a] === squares[b] && - squares[a] === squares[c] - ) { - return squares[a]; - } - } - return null; + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; } ``` ```css * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: sans-serif; - margin: 20px; - padding: 0; + font-family: sans-serif; + margin: 20px; + padding: 0; } .square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; } .board-row:after { - clear: both; - content: ""; - display: table; + clear: both; + content: ""; + display: table; } .status { - margin-bottom: 10px; + margin-bottom: 10px; } .game { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .game-info { - margin-left: 20px; + margin-left: 20px; } ``` @@ -1955,47 +1955,47 @@ You'll use `map` to transform your `history` of moves into React elements repres ```js export default function Game() { - const [xIsNext, setXIsNext] = useState(true); - const [history, setHistory] = useState([Array(9).fill(null)]); - const currentSquares = history[history.length - 1]; - - function handlePlay(nextSquares) { - setHistory([...history, nextSquares]); - setXIsNext(!xIsNext); - } - - function jumpTo(nextMove) { - // TODO - } - - const moves = history.map((squares, move) => { - let description; - if (move > 0) { - description = "Go to move #" + move; - } else { - description = "Go to game start"; - } - return ( - <li> - <button on_click={() => jumpTo(move)}>{description}</button> - </li> - ); - }); - - return ( - <div className="game"> - <div className="game-board"> - <Board - xIsNext={xIsNext} - squares={currentSquares} - onPlay={handlePlay} - /> - </div> - <div className="game-info"> - <ol>{moves}</ol> - </div> - </div> - ); + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const currentSquares = history[history.length - 1]; + + function handlePlay(nextSquares) { + setHistory([...history, nextSquares]); + setXIsNext(!xIsNext); + } + + function jumpTo(nextMove) { + // TODO + } + + const moves = history.map((squares, move) => { + let description; + if (move > 0) { + description = "Go to move #" + move; + } else { + description = "Go to game start"; + } + return ( + <li> + <button on_click={() => jumpTo(move)}>{description}</button> + </li> + ); + }); + + return ( + <div className="game"> + <div className="game-board"> + <Board + xIsNext={xIsNext} + squares={currentSquares} + onPlay={handlePlay} + /> + </div> + <div className="game-info"> + <ol>{moves}</ol> + </div> + </div> + ); } ``` @@ -2005,196 +2005,196 @@ You can see what your code should look like below. Note that you should see an e import { useState } from "react"; function Square({ value, onSquareClick }) { - return ( - <button className="square" on_click={onSquareClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); } function Board({ xIsNext, squares, onPlay }) { - function handleClick(i) { - if (calculateWinner(squares) || squares[i]) { - return; - } - const nextSquares = squares.slice(); - if (xIsNext) { - nextSquares[i] = "X"; - } else { - nextSquares[i] = "O"; - } - onPlay(nextSquares); - } - - const winner = calculateWinner(squares); - let status; - if (winner) { - status = "Winner: " + winner; - } else { - status = "Next player: " + (xIsNext ? "X" : "O"); - } - - return ( - <> - <div className="status">{status}</div> - <div className="board-row"> - <Square - value={squares[0]} - onSquareClick={() => handleClick(0)} - /> - <Square - value={squares[1]} - onSquareClick={() => handleClick(1)} - /> - <Square - value={squares[2]} - onSquareClick={() => handleClick(2)} - /> - </div> - <div className="board-row"> - <Square - value={squares[3]} - onSquareClick={() => handleClick(3)} - /> - <Square - value={squares[4]} - onSquareClick={() => handleClick(4)} - /> - <Square - value={squares[5]} - onSquareClick={() => handleClick(5)} - /> - </div> - <div className="board-row"> - <Square - value={squares[6]} - onSquareClick={() => handleClick(6)} - /> - <Square - value={squares[7]} - onSquareClick={() => handleClick(7)} - /> - <Square - value={squares[8]} - onSquareClick={() => handleClick(8)} - /> - </div> - </> - ); + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + onPlay(nextSquares); + } + + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); } export default function Game() { - const [xIsNext, setXIsNext] = useState(true); - const [history, setHistory] = useState([Array(9).fill(null)]); - const currentSquares = history[history.length - 1]; - - function handlePlay(nextSquares) { - setHistory([...history, nextSquares]); - setXIsNext(!xIsNext); - } - - function jumpTo(nextMove) { - // TODO - } - - const moves = history.map((squares, move) => { - let description; - if (move > 0) { - description = "Go to move #" + move; - } else { - description = "Go to game start"; - } - return ( - <li> - <button on_click={() => jumpTo(move)}>{description}</button> - </li> - ); - }); - - return ( - <div className="game"> - <div className="game-board"> - <Board - xIsNext={xIsNext} - squares={currentSquares} - onPlay={handlePlay} - /> - </div> - <div className="game-info"> - <ol>{moves}</ol> - </div> - </div> - ); + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const currentSquares = history[history.length - 1]; + + function handlePlay(nextSquares) { + setHistory([...history, nextSquares]); + setXIsNext(!xIsNext); + } + + function jumpTo(nextMove) { + // TODO + } + + const moves = history.map((squares, move) => { + let description; + if (move > 0) { + description = "Go to move #" + move; + } else { + description = "Go to game start"; + } + return ( + <li> + <button on_click={() => jumpTo(move)}>{description}</button> + </li> + ); + }); + + return ( + <div className="game"> + <div className="game-board"> + <Board + xIsNext={xIsNext} + squares={currentSquares} + onPlay={handlePlay} + /> + </div> + <div className="game-info"> + <ol>{moves}</ol> + </div> + </div> + ); } function calculateWinner(squares) { - const lines = [ - [0, 1, 2], - [3, 4, 5], - [6, 7, 8], - [0, 3, 6], - [1, 4, 7], - [2, 5, 8], - [0, 4, 8], - [2, 4, 6], - ]; - for (let i = 0; i < lines.length; i++) { - const [a, b, c] = lines[i]; - if ( - squares[a] && - squares[a] === squares[b] && - squares[a] === squares[c] - ) { - return squares[a]; - } - } - return null; + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; } ``` ```css * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: sans-serif; - margin: 20px; - padding: 0; + font-family: sans-serif; + margin: 20px; + padding: 0; } .square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; } .board-row:after { - clear: both; - content: ""; - display: table; + clear: both; + content: ""; + display: table; } .status { - margin-bottom: 10px; + margin-bottom: 10px; } .game { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .game-info { - margin-left: 20px; + margin-left: 20px; } ``` @@ -2227,7 +2227,7 @@ In addition to the updated counts, a human reading this would probably say that ```js <li key={user.id}> - {user.name}: {user.taskCount} tasks left + {user.name}: {user.taskCount} tasks left </li> ``` @@ -2251,12 +2251,12 @@ In the `Game` function, you can add the key as `<li key={move}>`, and if you rel ```js const moves = history.map((squares, move) => { - //... - return ( - <li key={move}> - <button on_click={() => jumpTo(move)}>{description}</button> - </li> - ); + //... + return ( + <li key={move}> + <button on_click={() => jumpTo(move)}>{description}</button> + </li> + ); }); ``` @@ -2264,196 +2264,196 @@ const moves = history.map((squares, move) => { import { useState } from "react"; function Square({ value, onSquareClick }) { - return ( - <button className="square" on_click={onSquareClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); } function Board({ xIsNext, squares, onPlay }) { - function handleClick(i) { - if (calculateWinner(squares) || squares[i]) { - return; - } - const nextSquares = squares.slice(); - if (xIsNext) { - nextSquares[i] = "X"; - } else { - nextSquares[i] = "O"; - } - onPlay(nextSquares); - } - - const winner = calculateWinner(squares); - let status; - if (winner) { - status = "Winner: " + winner; - } else { - status = "Next player: " + (xIsNext ? "X" : "O"); - } - - return ( - <> - <div className="status">{status}</div> - <div className="board-row"> - <Square - value={squares[0]} - onSquareClick={() => handleClick(0)} - /> - <Square - value={squares[1]} - onSquareClick={() => handleClick(1)} - /> - <Square - value={squares[2]} - onSquareClick={() => handleClick(2)} - /> - </div> - <div className="board-row"> - <Square - value={squares[3]} - onSquareClick={() => handleClick(3)} - /> - <Square - value={squares[4]} - onSquareClick={() => handleClick(4)} - /> - <Square - value={squares[5]} - onSquareClick={() => handleClick(5)} - /> - </div> - <div className="board-row"> - <Square - value={squares[6]} - onSquareClick={() => handleClick(6)} - /> - <Square - value={squares[7]} - onSquareClick={() => handleClick(7)} - /> - <Square - value={squares[8]} - onSquareClick={() => handleClick(8)} - /> - </div> - </> - ); + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + onPlay(nextSquares); + } + + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); } export default function Game() { - const [xIsNext, setXIsNext] = useState(true); - const [history, setHistory] = useState([Array(9).fill(null)]); - const currentSquares = history[history.length - 1]; - - function handlePlay(nextSquares) { - setHistory([...history, nextSquares]); - setXIsNext(!xIsNext); - } - - function jumpTo(nextMove) { - // TODO - } - - const moves = history.map((squares, move) => { - let description; - if (move > 0) { - description = "Go to move #" + move; - } else { - description = "Go to game start"; - } - return ( - <li key={move}> - <button on_click={() => jumpTo(move)}>{description}</button> - </li> - ); - }); - - return ( - <div className="game"> - <div className="game-board"> - <Board - xIsNext={xIsNext} - squares={currentSquares} - onPlay={handlePlay} - /> - </div> - <div className="game-info"> - <ol>{moves}</ol> - </div> - </div> - ); + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const currentSquares = history[history.length - 1]; + + function handlePlay(nextSquares) { + setHistory([...history, nextSquares]); + setXIsNext(!xIsNext); + } + + function jumpTo(nextMove) { + // TODO + } + + const moves = history.map((squares, move) => { + let description; + if (move > 0) { + description = "Go to move #" + move; + } else { + description = "Go to game start"; + } + return ( + <li key={move}> + <button on_click={() => jumpTo(move)}>{description}</button> + </li> + ); + }); + + return ( + <div className="game"> + <div className="game-board"> + <Board + xIsNext={xIsNext} + squares={currentSquares} + onPlay={handlePlay} + /> + </div> + <div className="game-info"> + <ol>{moves}</ol> + </div> + </div> + ); } function calculateWinner(squares) { - const lines = [ - [0, 1, 2], - [3, 4, 5], - [6, 7, 8], - [0, 3, 6], - [1, 4, 7], - [2, 5, 8], - [0, 4, 8], - [2, 4, 6], - ]; - for (let i = 0; i < lines.length; i++) { - const [a, b, c] = lines[i]; - if ( - squares[a] && - squares[a] === squares[b] && - squares[a] === squares[c] - ) { - return squares[a]; - } - } - return null; + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; } ``` ```css * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: sans-serif; - margin: 20px; - padding: 0; + font-family: sans-serif; + margin: 20px; + padding: 0; } .square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; } .board-row:after { - clear: both; - content: ""; - display: table; + clear: both; + content: ""; + display: table; } .status { - margin-bottom: 10px; + margin-bottom: 10px; } .game { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .game-info { - margin-left: 20px; + margin-left: 20px; } ``` @@ -2461,11 +2461,11 @@ Before you can implement `jumpTo`, you need the `Game` component to keep track o ```js export default function Game() { - const [xIsNext, setXIsNext] = useState(true); - const [history, setHistory] = useState([Array(9).fill(null)]); - const [currentMove, setCurrentMove] = useState(0); - const currentSquares = history[history.length - 1]; - //... + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const [currentMove, setCurrentMove] = useState(0); + const currentSquares = history[history.length - 1]; + //... } ``` @@ -2473,12 +2473,12 @@ Next, update the `jumpTo` function inside `Game` to update that `currentMove`. Y ```js export default function Game() { - // ... - function jumpTo(nextMove) { - setCurrentMove(nextMove); - setXIsNext(nextMove % 2 === 0); - } - //... + // ... + function jumpTo(nextMove) { + setCurrentMove(nextMove); + setXIsNext(nextMove % 2 === 0); + } + //... } ``` @@ -2489,10 +2489,10 @@ You will now make two changes to the `Game`'s `handlePlay` function which is cal ```js function handlePlay(nextSquares) { - const nextHistory = [...history.slice(0, currentMove + 1), nextSquares]; - setHistory(nextHistory); - setCurrentMove(nextHistory.length - 1); - setXIsNext(!xIsNext); + const nextHistory = [...history.slice(0, currentMove + 1), nextSquares]; + setHistory(nextHistory); + setCurrentMove(nextHistory.length - 1); + setXIsNext(!xIsNext); } ``` @@ -2500,12 +2500,12 @@ Finally, you will modify the `Game` component to render the currently selected m ```js export default function Game() { - const [xIsNext, setXIsNext] = useState(true); - const [history, setHistory] = useState([Array(9).fill(null)]); - const [currentMove, setCurrentMove] = useState(0); - const currentSquares = history[currentMove]; + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const [currentMove, setCurrentMove] = useState(0); + const currentSquares = history[currentMove]; - // ... + // ... } ``` @@ -2515,199 +2515,199 @@ If you click on any step in the game's history, the tic-tac-toe board should imm import { useState } from "react"; function Square({ value, onSquareClick }) { - return ( - <button className="square" on_click={onSquareClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); } function Board({ xIsNext, squares, onPlay }) { - function handleClick(i) { - if (calculateWinner(squares) || squares[i]) { - return; - } - const nextSquares = squares.slice(); - if (xIsNext) { - nextSquares[i] = "X"; - } else { - nextSquares[i] = "O"; - } - onPlay(nextSquares); - } - - const winner = calculateWinner(squares); - let status; - if (winner) { - status = "Winner: " + winner; - } else { - status = "Next player: " + (xIsNext ? "X" : "O"); - } - - return ( - <> - <div className="status">{status}</div> - <div className="board-row"> - <Square - value={squares[0]} - onSquareClick={() => handleClick(0)} - /> - <Square - value={squares[1]} - onSquareClick={() => handleClick(1)} - /> - <Square - value={squares[2]} - onSquareClick={() => handleClick(2)} - /> - </div> - <div className="board-row"> - <Square - value={squares[3]} - onSquareClick={() => handleClick(3)} - /> - <Square - value={squares[4]} - onSquareClick={() => handleClick(4)} - /> - <Square - value={squares[5]} - onSquareClick={() => handleClick(5)} - /> - </div> - <div className="board-row"> - <Square - value={squares[6]} - onSquareClick={() => handleClick(6)} - /> - <Square - value={squares[7]} - onSquareClick={() => handleClick(7)} - /> - <Square - value={squares[8]} - onSquareClick={() => handleClick(8)} - /> - </div> - </> - ); + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + onPlay(nextSquares); + } + + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); } export default function Game() { - const [xIsNext, setXIsNext] = useState(true); - const [history, setHistory] = useState([Array(9).fill(null)]); - const [currentMove, setCurrentMove] = useState(0); - const currentSquares = history[currentMove]; - - function handlePlay(nextSquares) { - const nextHistory = [...history.slice(0, currentMove + 1), nextSquares]; - setHistory(nextHistory); - setCurrentMove(nextHistory.length - 1); - setXIsNext(!xIsNext); - } - - function jumpTo(nextMove) { - setCurrentMove(nextMove); - setXIsNext(nextMove % 2 === 0); - } - - const moves = history.map((squares, move) => { - let description; - if (move > 0) { - description = "Go to move #" + move; - } else { - description = "Go to game start"; - } - return ( - <li key={move}> - <button on_click={() => jumpTo(move)}>{description}</button> - </li> - ); - }); - - return ( - <div className="game"> - <div className="game-board"> - <Board - xIsNext={xIsNext} - squares={currentSquares} - onPlay={handlePlay} - /> - </div> - <div className="game-info"> - <ol>{moves}</ol> - </div> - </div> - ); + const [xIsNext, setXIsNext] = useState(true); + const [history, setHistory] = useState([Array(9).fill(null)]); + const [currentMove, setCurrentMove] = useState(0); + const currentSquares = history[currentMove]; + + function handlePlay(nextSquares) { + const nextHistory = [...history.slice(0, currentMove + 1), nextSquares]; + setHistory(nextHistory); + setCurrentMove(nextHistory.length - 1); + setXIsNext(!xIsNext); + } + + function jumpTo(nextMove) { + setCurrentMove(nextMove); + setXIsNext(nextMove % 2 === 0); + } + + const moves = history.map((squares, move) => { + let description; + if (move > 0) { + description = "Go to move #" + move; + } else { + description = "Go to game start"; + } + return ( + <li key={move}> + <button on_click={() => jumpTo(move)}>{description}</button> + </li> + ); + }); + + return ( + <div className="game"> + <div className="game-board"> + <Board + xIsNext={xIsNext} + squares={currentSquares} + onPlay={handlePlay} + /> + </div> + <div className="game-info"> + <ol>{moves}</ol> + </div> + </div> + ); } function calculateWinner(squares) { - const lines = [ - [0, 1, 2], - [3, 4, 5], - [6, 7, 8], - [0, 3, 6], - [1, 4, 7], - [2, 5, 8], - [0, 4, 8], - [2, 4, 6], - ]; - for (let i = 0; i < lines.length; i++) { - const [a, b, c] = lines[i]; - if ( - squares[a] && - squares[a] === squares[b] && - squares[a] === squares[c] - ) { - return squares[a]; - } - } - return null; + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; } ``` ```css * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: sans-serif; - margin: 20px; - padding: 0; + font-family: sans-serif; + margin: 20px; + padding: 0; } .square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; } .board-row:after { - clear: both; - content: ""; - display: table; + clear: both; + content: ""; + display: table; } .status { - margin-bottom: 10px; + margin-bottom: 10px; } .game { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .game-info { - margin-left: 20px; + margin-left: 20px; } ``` @@ -2719,21 +2719,21 @@ There's no reason for you to store both of these in state. In fact, always try t ```js export default function Game() { - const [history, setHistory] = useState([Array(9).fill(null)]); - const [currentMove, setCurrentMove] = useState(0); - const xIsNext = currentMove % 2 === 0; - const currentSquares = history[currentMove]; - - function handlePlay(nextSquares) { - const nextHistory = [...history.slice(0, currentMove + 1), nextSquares]; - setHistory(nextHistory); - setCurrentMove(nextHistory.length - 1); - } + const [history, setHistory] = useState([Array(9).fill(null)]); + const [currentMove, setCurrentMove] = useState(0); + const xIsNext = currentMove % 2 === 0; + const currentSquares = history[currentMove]; + + function handlePlay(nextSquares) { + const nextHistory = [...history.slice(0, currentMove + 1), nextSquares]; + setHistory(nextHistory); + setCurrentMove(nextHistory.length - 1); + } - function jumpTo(nextMove) { - setCurrentMove(nextMove); - } - // ... + function jumpTo(nextMove) { + setCurrentMove(nextMove); + } + // ... } ``` @@ -2756,197 +2756,197 @@ Check out the final result here: import { useState } from "react"; function Square({ value, onSquareClick }) { - return ( - <button className="square" on_click={onSquareClick}> - {value} - </button> - ); + return ( + <button className="square" on_click={onSquareClick}> + {value} + </button> + ); } function Board({ xIsNext, squares, onPlay }) { - function handleClick(i) { - if (calculateWinner(squares) || squares[i]) { - return; - } - const nextSquares = squares.slice(); - if (xIsNext) { - nextSquares[i] = "X"; - } else { - nextSquares[i] = "O"; - } - onPlay(nextSquares); - } - - const winner = calculateWinner(squares); - let status; - if (winner) { - status = "Winner: " + winner; - } else { - status = "Next player: " + (xIsNext ? "X" : "O"); - } - - return ( - <> - <div className="status">{status}</div> - <div className="board-row"> - <Square - value={squares[0]} - onSquareClick={() => handleClick(0)} - /> - <Square - value={squares[1]} - onSquareClick={() => handleClick(1)} - /> - <Square - value={squares[2]} - onSquareClick={() => handleClick(2)} - /> - </div> - <div className="board-row"> - <Square - value={squares[3]} - onSquareClick={() => handleClick(3)} - /> - <Square - value={squares[4]} - onSquareClick={() => handleClick(4)} - /> - <Square - value={squares[5]} - onSquareClick={() => handleClick(5)} - /> - </div> - <div className="board-row"> - <Square - value={squares[6]} - onSquareClick={() => handleClick(6)} - /> - <Square - value={squares[7]} - onSquareClick={() => handleClick(7)} - /> - <Square - value={squares[8]} - onSquareClick={() => handleClick(8)} - /> - </div> - </> - ); + function handleClick(i) { + if (calculateWinner(squares) || squares[i]) { + return; + } + const nextSquares = squares.slice(); + if (xIsNext) { + nextSquares[i] = "X"; + } else { + nextSquares[i] = "O"; + } + onPlay(nextSquares); + } + + const winner = calculateWinner(squares); + let status; + if (winner) { + status = "Winner: " + winner; + } else { + status = "Next player: " + (xIsNext ? "X" : "O"); + } + + return ( + <> + <div className="status">{status}</div> + <div className="board-row"> + <Square + value={squares[0]} + onSquareClick={() => handleClick(0)} + /> + <Square + value={squares[1]} + onSquareClick={() => handleClick(1)} + /> + <Square + value={squares[2]} + onSquareClick={() => handleClick(2)} + /> + </div> + <div className="board-row"> + <Square + value={squares[3]} + onSquareClick={() => handleClick(3)} + /> + <Square + value={squares[4]} + onSquareClick={() => handleClick(4)} + /> + <Square + value={squares[5]} + onSquareClick={() => handleClick(5)} + /> + </div> + <div className="board-row"> + <Square + value={squares[6]} + onSquareClick={() => handleClick(6)} + /> + <Square + value={squares[7]} + onSquareClick={() => handleClick(7)} + /> + <Square + value={squares[8]} + onSquareClick={() => handleClick(8)} + /> + </div> + </> + ); } export default function Game() { - const [history, setHistory] = useState([Array(9).fill(null)]); - const [currentMove, setCurrentMove] = useState(0); - const xIsNext = currentMove % 2 === 0; - const currentSquares = history[currentMove]; - - function handlePlay(nextSquares) { - const nextHistory = [...history.slice(0, currentMove + 1), nextSquares]; - setHistory(nextHistory); - setCurrentMove(nextHistory.length - 1); - } - - function jumpTo(nextMove) { - setCurrentMove(nextMove); - } - - const moves = history.map((squares, move) => { - let description; - if (move > 0) { - description = "Go to move #" + move; - } else { - description = "Go to game start"; - } - return ( - <li key={move}> - <button on_click={() => jumpTo(move)}>{description}</button> - </li> - ); - }); - - return ( - <div className="game"> - <div className="game-board"> - <Board - xIsNext={xIsNext} - squares={currentSquares} - onPlay={handlePlay} - /> - </div> - <div className="game-info"> - <ol>{moves}</ol> - </div> - </div> - ); + const [history, setHistory] = useState([Array(9).fill(null)]); + const [currentMove, setCurrentMove] = useState(0); + const xIsNext = currentMove % 2 === 0; + const currentSquares = history[currentMove]; + + function handlePlay(nextSquares) { + const nextHistory = [...history.slice(0, currentMove + 1), nextSquares]; + setHistory(nextHistory); + setCurrentMove(nextHistory.length - 1); + } + + function jumpTo(nextMove) { + setCurrentMove(nextMove); + } + + const moves = history.map((squares, move) => { + let description; + if (move > 0) { + description = "Go to move #" + move; + } else { + description = "Go to game start"; + } + return ( + <li key={move}> + <button on_click={() => jumpTo(move)}>{description}</button> + </li> + ); + }); + + return ( + <div className="game"> + <div className="game-board"> + <Board + xIsNext={xIsNext} + squares={currentSquares} + onPlay={handlePlay} + /> + </div> + <div className="game-info"> + <ol>{moves}</ol> + </div> + </div> + ); } function calculateWinner(squares) { - const lines = [ - [0, 1, 2], - [3, 4, 5], - [6, 7, 8], - [0, 3, 6], - [1, 4, 7], - [2, 5, 8], - [0, 4, 8], - [2, 4, 6], - ]; - for (let i = 0; i < lines.length; i++) { - const [a, b, c] = lines[i]; - if ( - squares[a] && - squares[a] === squares[b] && - squares[a] === squares[c] - ) { - return squares[a]; - } - } - return null; + const lines = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], + [0, 4, 8], + [2, 4, 6], + ]; + for (let i = 0; i < lines.length; i++) { + const [a, b, c] = lines[i]; + if ( + squares[a] && + squares[a] === squares[b] && + squares[a] === squares[c] + ) { + return squares[a]; + } + } + return null; } ``` ```css * { - box-sizing: border-box; + box-sizing: border-box; } body { - font-family: sans-serif; - margin: 20px; - padding: 0; + font-family: sans-serif; + margin: 20px; + padding: 0; } .square { - background: #fff; - border: 1px solid #999; - float: left; - font-size: 24px; - font-weight: bold; - line-height: 34px; - height: 34px; - margin-right: -1px; - margin-top: -1px; - padding: 0; - text-align: center; - width: 34px; + background: #fff; + border: 1px solid #999; + float: left; + font-size: 24px; + font-weight: bold; + line-height: 34px; + height: 34px; + margin-right: -1px; + margin-top: -1px; + padding: 0; + text-align: center; + width: 34px; } .board-row:after { - clear: both; - content: ""; - display: table; + clear: both; + content: ""; + display: table; } .status { - margin-bottom: 10px; + margin-bottom: 10px; } .game { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .game-info { - margin-left: 20px; + margin-left: 20px; } ``` diff --git a/tasks.py b/tasks.py deleted file mode 100644 index e19476202..000000000 --- a/tasks.py +++ /dev/null @@ -1,426 +0,0 @@ -from __future__ import annotations - -import json -import logging -import os -import re -import sys -from dataclasses import dataclass -from pathlib import Path -from shutil import rmtree -from typing import TYPE_CHECKING, Any, Callable - -import semver -import toml -from invoke import task -from invoke.context import Context -from invoke.exceptions import Exit - -# --- Typing Preamble ------------------------------------------------------------------ - - -if TYPE_CHECKING: - # not available in typing module until Python 3.8 - # not available in typing module until Python 3.10 - from typing import Literal, Protocol, TypeAlias - - class ReleasePrepFunc(Protocol): - def __call__( - self, context: Context, package: PackageInfo - ) -> Callable[[bool], None]: - ... - - LanguageName: TypeAlias = "Literal['py', 'js']" - - -# --- Constants ------------------------------------------------------------------------ - - -log = logging.getLogger(__name__) -log.setLevel("INFO") -log_handler = logging.StreamHandler(sys.stdout) -log_handler.setFormatter(logging.Formatter("%(message)s")) -log.addHandler(log_handler) - - -# --- Constants ------------------------------------------------------------------------ - - -ROOT = Path(__file__).parent -DOCS_DIR = ROOT / "docs" -SRC_DIR = ROOT / "src" -JS_DIR = SRC_DIR / "js" -PY_DIR = SRC_DIR / "py" -PY_PROJECTS = [p for p in PY_DIR.iterdir() if (p / "pyproject.toml").exists()] -TAG_PATTERN = re.compile( - # start - r"^" - # package name - r"(?P<name>[0-9a-zA-Z-@/]+)-" - # package version - r"v(?P<version>[0-9][0-9a-zA-Z-\.\+]*)" - # end - r"$" -) - - -# --- Tasks ---------------------------------------------------------------------------- - - -@task -def env(context: Context): - """Install development environment""" - env_py(context) - env_js(context) - - -@task -def env_py(context: Context): - """Install Python development environment""" - for py_proj in PY_PROJECTS: - py_proj_toml = toml.load(py_proj / "pyproject.toml") - hatch_default_env = py_proj_toml["tool"]["hatch"]["envs"].get("default", {}) - hatch_default_features = hatch_default_env.get("features", []) - hatch_default_deps = hatch_default_env.get("dependencies", []) - with context.cd(py_proj): - context.run(f"pip install '.[{','.join(hatch_default_features)}]'") - context.run(f"pip install {' '.join(map(repr, hatch_default_deps))}") - - -@task -def env_js(context: Context): - """Install JS development environment""" - in_js( - context, - "npm ci", - "npm run build", - hide="out", - ) - - -@task -def lint_py(context: Context, fix: bool = False): - """Run linters and type checkers""" - if fix: - context.run("ruff --fix .") - else: - context.run("ruff .") - context.run("black --check --diff .") - in_py( - context, - f"flake8 --toml-config '{ROOT / 'pyproject.toml'}' .", - "hatch run lint:all", - ) - - -@task(pre=[env_js]) -def lint_js(context: Context, fix: bool = False): - """Run linters and type checkers""" - if fix: - in_js(context, "npm run fix:format") - else: - in_js(context, "npm run check:format") - in_js(context, "npm run check:types") - - -@task -def test_py(context: Context, no_cov: bool = False): - """Run test suites""" - in_py( - context, - f"hatch run {'test' if no_cov else 'cov'} --maxfail=3 --reruns=3", - ) - - -@task(pre=[env_js]) -def test_js(context: Context): - """Run test suites""" - in_js(context, "npm run check:tests") - - -@task(pre=[env_py]) -def test_docs(context: Context): - with context.cd(DOCS_DIR): - context.run("poetry install") - context.run( - "poetry run sphinx-build " - "-a " # re-write all output files - "-T " # show full tracebacks - "-W " # turn warnings into errors - "--keep-going " # complete the build, but still report warnings as errors - "-b doctest " - "source " - "build", - ) - context.run("poetry run sphinx-build -b doctest source build") - - context.run("docker build . --file ./docs/Dockerfile") - - -@task -def docs(context: Context, docker: bool = False): - """Build documentation""" - if docker: - _docker_docs(context) - else: - _live_docs(context) - - -def _docker_docs(context: Context) -> None: - context.run("docker build . --file ./docs/Dockerfile --tag reactpy-docs:latest") - context.run( - "docker run -it -p 5000:5000 -e DEBUG=1 --rm reactpy-docs:latest", pty=True - ) - - -def _live_docs(context: Context) -> None: - with context.cd(DOCS_DIR): - context.run("poetry install") - context.run( - "poetry run python main.py " - "--open-browser " - # watch python source too - "--watch=../src/py " - # for some reason this matches absolute paths - "--ignore=**/_auto/* " - "--ignore=**/_static/custom.js " - "--ignore=**/node_modules/* " - "--ignore=**/package-lock.json " - "-a " - "-E " - "-b " - "html " - "source " - "build" - ) - - -@task -def publish(context: Context, dry_run: str = ""): - """Publish packages that have been tagged for release in the current commit - - To perform a test run use `--dry-run=<name>-v<version>` to specify a comma-separated - list of tags to simulate a release of. For example, to simulate a release of - `@foo/bar-v1.2.3` and `baz-v4.5.6` use `--dry-run=@foo/bar-v1.2.3,baz-v4.5.6`. - """ - packages = get_packages(context) - - release_prep: dict[LanguageName, ReleasePrepFunc] = { - "js": prepare_js_release, - "py": prepare_py_release, - } - - parsed_tags: list[TagInfo] = [ - parse_tag(tag) for tag in dry_run.split(",") or get_current_tags(context) - ] - - publishers: list[Callable[[bool], None]] = [] - for tag_info in parsed_tags: - if tag_info.name not in packages: - msg = f"Tag {tag_info.tag} references package {tag_info.name} that does not exist" - raise Exit(msg) - - pkg_info = packages[tag_info.name] - if pkg_info.version != tag_info.version: - msg = f"Tag {tag_info.tag} references version {tag_info.version} of package {tag_info.name}, but the current version is {pkg_info.version}" - raise Exit(msg) - - log.info(f"Preparing {tag_info.name} for release...") - publishers.append(release_prep[pkg_info.language](context, pkg_info)) - - for publish in publishers: - publish(bool(dry_run)) - - -# --- Utilities ------------------------------------------------------------------------ - - -def in_py(context: Context, *commands: str, **kwargs: Any) -> None: - for p in PY_PROJECTS: - with context.cd(p): - log.info(f"Running commands in {p}...") - for c in commands: - context.run(c, **kwargs) - - -def in_js(context: Context, *commands: str, **kwargs: Any) -> None: - with context.cd(JS_DIR): - for c in commands: - context.run(c, **kwargs) - - -def get_packages(context: Context) -> dict[str, PackageInfo]: - packages: list[PackageInfo] = [] - - for maybe_pkg in PY_DIR.glob("*"): - if (maybe_pkg / "pyproject.toml").exists(): - packages.append(make_py_pkg_info(context, maybe_pkg)) - else: - msg = f"unexpected dir or file: {maybe_pkg}" - raise Exit(msg) - - packages_dir = JS_DIR / "packages" - for maybe_pkg in packages_dir.glob("*"): - if (maybe_pkg / "package.json").exists(): - packages.append(make_js_pkg_info(maybe_pkg)) - elif maybe_pkg.is_dir(): - for maybe_ns_pkg in maybe_pkg.glob("*"): - if (maybe_ns_pkg / "package.json").exists(): - packages.append(make_js_pkg_info(maybe_ns_pkg)) - else: - msg = f"unexpected dir or file: {maybe_pkg}" - raise Exit(msg) - - packages_by_name = {p.name: p for p in packages} - if len(packages_by_name) != len(packages): - raise Exit("duplicate package names detected") - - return packages_by_name - - -def make_py_pkg_info(context: Context, pkg_dir: Path) -> PackageInfo: - with context.cd(pkg_dir): - proj_metadata = json.loads(context.run("hatch project metadata").stdout) - return PackageInfo( - name=proj_metadata["name"], - path=pkg_dir, - language="py", - version=proj_metadata["version"], - ) - - -def make_js_pkg_info(pkg_dir: Path) -> PackageInfo: - with (pkg_dir / "package.json").open() as f: - pkg_json = json.load(f) - return PackageInfo( - name=pkg_json["name"], - path=pkg_dir, - language="js", - version=pkg_json["version"], - ) - - -@dataclass -class PackageInfo: - name: str - path: Path - language: LanguageName - version: str - - -def get_current_tags(context: Context) -> set[str]: - """Get tags for the current commit""" - # check if unstaged changes - try: - context.run("git diff --cached --exit-code", hide=True) - context.run("git diff --exit-code", hide=True) - except Exception: - log.error("Cannot create a tag - there are uncommitted changes") - return set() - - tags_per_commit: dict[str, list[str]] = {} - for commit, tag in map( - str.split, - context.run( - r"git for-each-ref --format '%(objectname) %(refname:short)' refs/tags", - hide=True, - ).stdout.splitlines(), - ): - tags_per_commit.setdefault(commit, []).append(tag) - - current_commit = context.run( - "git rev-parse HEAD", silent=True, external=True - ).stdout.strip() - tags = set(tags_per_commit.get(current_commit, set())) - - if not tags: - log.error("No tags found for current commit") - - for t in tags: - if not TAG_PATTERN.match(t): - msg = f"Invalid tag: {t}" - raise Exit(msg) - - log.info(f"Found tags: {tags}") - - return tags - - -def parse_tag(tag: str) -> TagInfo: - match = TAG_PATTERN.match(tag) - if not match: - msg = f"Invalid tag: {tag}" - raise Exit(msg) - - version = match.group("version") - if not semver.Version.is_valid(version): - raise Exit(f"Invalid version: {version} in tag {tag}") - - return TagInfo(tag=tag, name=match.group("name"), version=match.group("version")) - - -@dataclass -class TagInfo: - tag: str - name: str - version: str - - -def prepare_js_release( - context: Context, package: PackageInfo -) -> Callable[[bool], None]: - node_auth_token = os.getenv("NODE_AUTH_TOKEN") - if node_auth_token is None: - msg = "NODE_AUTH_TOKEN environment variable must be set" - raise Exit(msg) - - with context.cd(JS_DIR): - context.run("npm ci") - context.run("npm run build") - - def publish(dry_run: bool) -> None: - with context.cd(JS_DIR): - if dry_run: - context.run(f"npm --workspace {package.name} pack --dry-run") - return - context.run( - f"npm --workspace {package.name} publish --access public", - env={"NODE_AUTH_TOKEN": node_auth_token}, - ) - - return publish - - -def prepare_py_release( - context: Context, package: PackageInfo -) -> Callable[[bool], None]: - twine_username = os.getenv("PYPI_USERNAME") - twine_password = os.getenv("PYPI_PASSWORD") - - if not (twine_password and twine_username): - msg = "PYPI_USERNAME and PYPI_PASSWORD environment variables must be set" - raise Exit(msg) - - for build_dir_name in ["build", "dist"]: - build_dir_path = Path.cwd() / build_dir_name - if build_dir_path.exists(): - rmtree(str(build_dir_path)) - - with context.cd(package.path): - context.run("hatch build") - - def publish(dry_run: bool): - with context.cd(package.path): - if dry_run: - context.run("twine check dist/*") - return - - context.run( - "twine upload dist/*", - env_dict={ - "TWINE_USERNAME": twine_username, - "TWINE_PASSWORD": twine_password, - }, - ) - - return publish From 1e935761ec3622a7b1d4842b997d360ad67b4672 Mon Sep 17 00:00:00 2001 From: Archmonger <16909269+Archmonger@users.noreply.github.com> Date: Fri, 14 Mar 2025 23:28:15 -0700 Subject: [PATCH 49/49] fix a few pages --- docs/mkdocs.yml | 45 +- .../django.md => about/licenses.md} | 0 ...d => components-and-hooks-must-be-pure.md} | 0 docs/src/reference/overview.md | 38 + ...md => react-calls-components-and-hooks.md} | 0 .../reference/{jupyter.md => reactpy-csr.md} | 0 .../{plotly-dash.md => reactpy-middleware.md} | 0 docs/src/reference/{sanic.md => reactpy.md} | 0 .../{starlette.md => rules-of-hooks.md} | 0 .../{tornado.md => rules-of-react.md} | 0 docs/src/reference/use-async-effect.md | 1860 +++++++++++++++++ 11 files changed, 1919 insertions(+), 24 deletions(-) rename docs/src/{reference/django.md => about/licenses.md} (100%) rename docs/src/reference/{fastapi.md => components-and-hooks-must-be-pure.md} (100%) create mode 100644 docs/src/reference/overview.md rename docs/src/reference/{flask.md => react-calls-components-and-hooks.md} (100%) rename docs/src/reference/{jupyter.md => reactpy-csr.md} (100%) rename docs/src/reference/{plotly-dash.md => reactpy-middleware.md} (100%) rename docs/src/reference/{sanic.md => reactpy.md} (100%) rename docs/src/reference/{starlette.md => rules-of-hooks.md} (100%) rename docs/src/reference/{tornado.md => rules-of-react.md} (100%) create mode 100644 docs/src/reference/use-async-effect.md diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 3a7e0694b..77af61224 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -11,17 +11,17 @@ nav: - Add React to an Existing Project: learn/add-react-to-an-existing-project.md - Setup: - Editor Setup: learn/editor-setup.md - - React Developer Tools 🚫: learn/react-developer-tools.md - - Extra Tools and Packages 🚧: learn/extra-tools-and-packages.md - - More Tutorials: - - "Tutorial: React Bootstrap 🚫": learn/tutorial-react-bootstrap.md - - "Tutorial: Material UI 🚫": learn/tutorial-material-ui.md + # - ReactPy Developer Tools 🚫: learn/react-developer-tools.md + - Tools, Modules, and Packages 🚧: learn/extra-tools-and-packages.md + # - More Tutorials: + # - "Tutorial: React Bootstrap 🚫": learn/tutorial-react-bootstrap.md + # - "Tutorial: Material UI 🚫": learn/tutorial-material-ui.md - Learn: - Describing the UI: - Your First Component 🚧: learn/your-first-component.md - Importing and Exporting Components 🚧: learn/importing-and-exporting-components.md - - Writing Markup with PSX 🚫: learn/writing-markup-with-psx.md - - Python in PSX with Curly Braces 🚫: learn/python-in-psx-with-curly-braces.md + # - Writing Markup with PSX 🚫: learn/writing-markup-with-psx.md + # - Python in PSX with Curly Braces 🚫: learn/python-in-psx-with-curly-braces.md - Passing Props to a Component 🚧: learn/passing-props-to-a-component.md - Conditional Rendering 🚧: learn/conditional-rendering.md - Rendering Lists 🚧: learn/rendering-lists.md @@ -59,9 +59,11 @@ nav: - Creating Backends 🚧: learn/creating-backends.md - Manually Register a Client 🚧: learn/manually-register-a-client.md - Reference: + - Overview: reference/overview.md - Hooks: - Use State 🚧: reference/use-state.md - Use Effect 🚧: reference/use-effect.md + - Use Async Effect 🚧: reference/use-async-effect.md - Use Context 🚧: reference/use-context.md - Use Reducer 🚧: reference/use-reducer.md - Use Callback 🚧: reference/use-callback.md @@ -71,26 +73,20 @@ nav: - Use Connection 🚧: reference/use-connection.md - Use Scope 🚧: reference/use-scope.md - Use Location 🚧: reference/use-location.md - - Use ID 🚫: reference/use-id.md - - Use Deferred Value 🚫: reference/use-deferred-value.md - - Use Imperative Handle 🚫: reference/use-imperative-handle.md - - Use Insertion Effect 🚫: reference/use-insertion-effect.md - - Use Layout Effect 🚫: reference/use-layout-effect.md - - Use Sync External Store 🚫: reference/use-sync-external-store.md - - Use Transition 🚫: reference/use-transition.md - HTML Tags: - Common Props 🚧: reference/common-props.md - Usage 🚧: reference/usage.md - - Backends: - - FastAPI 🚧: reference/fastapi.md - - Flask 🚧: reference/flask.md - - Sanic 🚧: reference/sanic.md - - Starlette 🚧: reference/starlette.md - - Tornado 🚧: reference/tornado.md - - Django 🚧: reference/django.md - - Jupyter 🚧: reference/jupyter.md - - Plotly Dash 🚧: reference/plotly-dash.md - - PyScript 🚫: reference/pyscript.md + - Executors: + - ReactPy: reference/reactpy.md + - ReactPyCsr 🚧: reference/reactpy-csr.md + - ReactPyMiddleware 🚧: reference/reactpy-middleware.md + - Rules of React: + - Overview 🚧: reference/rules-of-react.md + - Components and Hooks must be pure 🚧: reference/components-and-hooks-must-be-pure.md + - React calls Components and Hooks 🚧: reference/react-calls-components-and-hooks.md + - Rules of Hooks 🚧: reference/rules-of-hooks.md + # - Template Tags: + # - Jinja 🚧: reference/jinja.md - Protocol Structure 🚧: reference/protocol-structure.md - Client API 🚧: reference/client-api.md - About: @@ -99,6 +95,7 @@ nav: - Running Tests 🚧: about/running-tests.md - Contributing Code 🚧: about/code.md - Contributing Documentation 🚧: about/docs.md + - Licenses 🚧: about/licenses.md theme: name: material diff --git a/docs/src/reference/django.md b/docs/src/about/licenses.md similarity index 100% rename from docs/src/reference/django.md rename to docs/src/about/licenses.md diff --git a/docs/src/reference/fastapi.md b/docs/src/reference/components-and-hooks-must-be-pure.md similarity index 100% rename from docs/src/reference/fastapi.md rename to docs/src/reference/components-and-hooks-must-be-pure.md diff --git a/docs/src/reference/overview.md b/docs/src/reference/overview.md new file mode 100644 index 000000000..51d6b24b9 --- /dev/null +++ b/docs/src/reference/overview.md @@ -0,0 +1,38 @@ +<p class="intro" markdown> + +This section provides detailed reference documentation for working with React. For an introduction to React, please visit the [Learn](/learn) section. + +</p> + +The React reference documentation is broken down into functional subsections: + +## React + +Programmatic React features: + +- [Hooks](/reference/react/hooks) - Use different React features from your components. +- [Components](/reference/react/components) - Built-in components that you can use in your JSX. +- [APIs](/reference/react/apis) - APIs that are useful for defining components. +- [Directives](/reference/rsc/directives) - Provide instructions to bundlers compatible with React Server Components. + +## React DOM + +React-dom contains features that are only supported for web applications (which run in the browser DOM environment). This section is broken into the following: + +- [Hooks](/reference/react-dom/hooks) - Hooks for web applications which run in the browser DOM environment. +- [Components](/reference/react-dom/components) - React supports all of the browser built-in HTML and SVG components. +- [APIs](/reference/react-dom) - The `react-dom` package contains methods supported only in web applications. +- [Client APIs](/reference/react-dom/client) - The `react-dom/client` APIs let you render React components on the client (in the browser). +- [Server APIs](/reference/react-dom/server) - The `react-dom/server` APIs let you render React components to HTML on the server. + +## Rules of React + +React has idioms — or rules — for how to express patterns in a way that is easy to understand and yields high-quality applications: + +- [Components and Hooks must be pure](/reference/rules/components-and-hooks-must-be-pure) – Purity makes your code easier to understand, debug, and allows React to automatically optimize your components and hooks correctly. +- [React calls Components and Hooks](/reference/rules/react-calls-components-and-hooks) – React is responsible for rendering components and hooks when necessary to optimize the user experience. +- [Rules of Hooks](/reference/rules/rules-of-hooks) – Hooks are defined using JavaScript functions, but they represent a special type of reusable UI logic with restrictions on where they can be called. + +## Legacy APIs + +- [Legacy APIs](/reference/react/legacy) - Exported from the `react` package, but not recommended for use in newly written code. diff --git a/docs/src/reference/flask.md b/docs/src/reference/react-calls-components-and-hooks.md similarity index 100% rename from docs/src/reference/flask.md rename to docs/src/reference/react-calls-components-and-hooks.md diff --git a/docs/src/reference/jupyter.md b/docs/src/reference/reactpy-csr.md similarity index 100% rename from docs/src/reference/jupyter.md rename to docs/src/reference/reactpy-csr.md diff --git a/docs/src/reference/plotly-dash.md b/docs/src/reference/reactpy-middleware.md similarity index 100% rename from docs/src/reference/plotly-dash.md rename to docs/src/reference/reactpy-middleware.md diff --git a/docs/src/reference/sanic.md b/docs/src/reference/reactpy.md similarity index 100% rename from docs/src/reference/sanic.md rename to docs/src/reference/reactpy.md diff --git a/docs/src/reference/starlette.md b/docs/src/reference/rules-of-hooks.md similarity index 100% rename from docs/src/reference/starlette.md rename to docs/src/reference/rules-of-hooks.md diff --git a/docs/src/reference/tornado.md b/docs/src/reference/rules-of-react.md similarity index 100% rename from docs/src/reference/tornado.md rename to docs/src/reference/rules-of-react.md diff --git a/docs/src/reference/use-async-effect.md b/docs/src/reference/use-async-effect.md new file mode 100644 index 000000000..c11ea69cd --- /dev/null +++ b/docs/src/reference/use-async-effect.md @@ -0,0 +1,1860 @@ +## Overview + +<p class="intro" markdown> + +`useEffect` is a React Hook that lets you [synchronize a component with an external system.](/learn/synchronizing-with-effects) + +```js +useEffect(setup, dependencies?) +``` + +</p> + +--- + +## Reference + +### `useEffect(setup, dependencies?)` + +Call `useEffect` at the top level of your component to declare an Effect: + +```js +import { useEffect } from "react"; +import { createConnection } from "./chat.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [serverUrl, roomId]); + // ... +} +``` + +[See more examples below.](#usage) + +#### Parameters + +- `setup`: The function with your Effect's logic. Your setup function may also optionally return a _cleanup_ function. When your component is added to the DOM, React will run your setup function. After every re-render with changed dependencies, React will first run the cleanup function (if you provided it) with the old values, and then run your setup function with the new values. After your component is removed from the DOM, React will run your cleanup function. + +- **optional** `dependencies`: The list of all reactive values referenced inside of the `setup` code. Reactive values include props, state, and all the variables and functions declared directly inside your component body. If your linter is [configured for React](/learn/editor-setup#linting), it will verify that every reactive value is correctly specified as a dependency. The list of dependencies must have a constant number of items and be written inline like `[dep1, dep2, dep3]`. React will compare each dependency with its previous value using the [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison. If you omit this argument, your Effect will re-run after every re-render of the component. [See the difference between passing an array of dependencies, an empty array, and no dependencies at all.](#examples-dependencies) + +#### Returns + +`useEffect` returns `undefined`. + +#### Caveats + +- `useEffect` is a Hook, so you can only call it **at the top level of your component** or your own Hooks. You can't call it inside loops or conditions. If you need that, extract a new component and move the state into it. + +- If you're **not trying to synchronize with some external system,** [you probably don't need an Effect.](/learn/you-might-not-need-an-effect) + +- When Strict Mode is on, React will **run one extra development-only setup+cleanup cycle** before the first real setup. This is a stress-test that ensures that your cleanup logic "mirrors" your setup logic and that it stops or undoes whatever the setup is doing. If this causes a problem, [implement the cleanup function.](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development) + +- If some of your dependencies are objects or functions defined inside the component, there is a risk that they will **cause the Effect to re-run more often than needed.** To fix this, remove unnecessary [object](#removing-unnecessary-object-dependencies) and [function](#removing-unnecessary-function-dependencies) dependencies. You can also [extract state updates](#updating-state-based-on-previous-state-from-an-effect) and [non-reactive logic](#reading-the-latest-props-and-state-from-an-effect) outside of your Effect. + +- If your Effect wasn't caused by an interaction (like a click), React will let the browser **paint the updated screen first before running your Effect.** If your Effect is doing something visual (for example, positioning a tooltip), and the delay is noticeable (for example, it flickers), replace `useEffect` with [`useLayoutEffect`.](/reference/react/useLayoutEffect) + +- Even if your Effect was caused by an interaction (like a click), **the browser may repaint the screen before processing the state updates inside your Effect.** Usually, that's what you want. However, if you must block the browser from repainting the screen, you need to replace `useEffect` with [`useLayoutEffect`.](/reference/react/useLayoutEffect) + +- Effects **only run on the client.** They don't run during server rendering. + +--- + +## Usage + +### Connecting to an external system + +Some components need to stay connected to the network, some browser API, or a third-party library, while they are displayed on the page. These systems aren't controlled by React, so they are called _external._ + +To [connect your component to some external system,](/learn/synchronizing-with-effects) call `useEffect` at the top level of your component: + +```js +import { useEffect } from "react"; +import { createConnection } from "./chat.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [serverUrl, roomId]); + // ... +} +``` + +You need to pass two arguments to `useEffect`: + +1. A _setup function_ with <CodeStep step={1}>setup code</CodeStep> that connects to that system. + - It should return a _cleanup function_ with <CodeStep step={2}>cleanup code</CodeStep> that disconnects from that system. +2. A <CodeStep step={3}>list of dependencies</CodeStep> including every value from your component used inside of those functions. + +**React calls your setup and cleanup functions whenever it's necessary, which may happen multiple times:** + +1. Your <CodeStep step={1}>setup code</CodeStep> runs when your component is added to the page _(mounts)_. +2. After every re-render of your component where the <CodeStep step={3}>dependencies</CodeStep> have changed: + - First, your <CodeStep step={2}>cleanup code</CodeStep> runs with the old props and state. + - Then, your <CodeStep step={1}>setup code</CodeStep> runs with the new props and state. +3. Your <CodeStep step={2}>cleanup code</CodeStep> runs one final time after your component is removed from the page _(unmounts)._ + +**Let's illustrate this sequence for the example above.** + +When the `ChatRoom` component above gets added to the page, it will connect to the chat room with the initial `serverUrl` and `roomId`. If either `serverUrl` or `roomId` change as a result of a re-render (say, if the user picks a different chat room in a dropdown), your Effect will _disconnect from the previous room, and connect to the next one._ When the `ChatRoom` component is removed from the page, your Effect will disconnect one last time. + +**To [help you find bugs,](/learn/synchronizing-with-effects#step-3-add-cleanup-if-needed) in development React runs <CodeStep step={1}>setup</CodeStep> and <CodeStep step={2}>cleanup</CodeStep> one extra time before the <CodeStep step={1}>setup</CodeStep>.** This is a stress-test that verifies your Effect's logic is implemented correctly. If this causes visible issues, your cleanup function is missing some logic. The cleanup function should stop or undo whatever the setup function was doing. The rule of thumb is that the user shouldn't be able to distinguish between the setup being called once (as in production) and a _setup_ → _cleanup_ → _setup_ sequence (as in development). [See common solutions.](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development) + +**Try to [write every Effect as an independent process](/learn/lifecycle-of-reactive-effects#each-effect-represents-a-separate-synchronization-process) and [think about a single setup/cleanup cycle at a time.](/learn/lifecycle-of-reactive-effects#thinking-from-the-effects-perspective)** It shouldn't matter whether your component is mounting, updating, or unmounting. When your cleanup logic correctly "mirrors" the setup logic, your Effect is resilient to running setup and cleanup as often as needed. + +<Note> + +An Effect lets you [keep your component synchronized](/learn/synchronizing-with-effects) with some external system (like a chat service). Here, _external system_ means any piece of code that's not controlled by React, such as: + +- A timer managed with <CodeStep step={1}>[`setInterval()`](https://developer.mozilla.org/en-US/docs/Web/API/setInterval)</CodeStep> and <CodeStep step={2}>[`clearInterval()`](https://developer.mozilla.org/en-US/docs/Web/API/clearInterval)</CodeStep>. +- An event subscription using <CodeStep step={1}>[`window.addEventListener()`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)</CodeStep> and <CodeStep step={2}>[`window.removeEventListener()`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener)</CodeStep>. +- A third-party animation library with an API like <CodeStep step={1}>`animation.start()`</CodeStep> and <CodeStep step={2}>`animation.reset()`</CodeStep>. + +**If you're not connecting to any external system, [you probably don't need an Effect.](/learn/you-might-not-need-an-effect)** + +</Note> + +<Recipes titleText="Examples of connecting to an external system" titleId="examples-connecting"> + +#### Connecting to a chat server + +In this example, the `ChatRoom` component uses an Effect to stay connected to an external system defined in `chat.js`. Press "Open chat" to make the `ChatRoom` component appear. This sandbox runs in development mode, so there is an extra connect-and-disconnect cycle, as [explained here.](/learn/synchronizing-with-effects#step-3-add-cleanup-if-needed) Try changing the `roomId` and `serverUrl` using the dropdown and the input, and see how the Effect re-connects to the chat. Press "Close chat" to see the Effect disconnect one last time. + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [roomId, serverUrl]); + + return ( + <> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [show, setShow] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <button onClick={() => setShow(!show)}> + {show ? "Close chat" : "Open chat"} + </button> + {show && <hr />} + {show && <ChatRoom roomId={roomId} />} + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +#### Listening to a global browser event + +In this example, the external system is the browser DOM itself. Normally, you'd specify event listeners with JSX, but you can't listen to the global [`window`](https://developer.mozilla.org/en-US/docs/Web/API/Window) object this way. An Effect lets you connect to the `window` object and listen to its events. Listening to the `pointermove` event lets you track the cursor (or finger) position and update the red dot to move with it. + +```js +import { useState, useEffect } from "react"; + +export default function App() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + + useEffect(() => { + function handleMove(e) { + setPosition({ x: e.clientX, y: e.clientY }); + } + window.addEventListener("pointermove", handleMove); + return () => { + window.removeEventListener("pointermove", handleMove); + }; + }, []); + + return ( + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity: 0.6, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + ); +} +``` + +```css +body { + min-height: 300px; +} +``` + +#### Triggering an animation + +In this example, the external system is the animation library in `animation.js`. It provides a JavaScript class called `FadeInAnimation` that takes a DOM node as an argument and exposes `start()` and `stop()` methods to control the animation. This component [uses a ref](/learn/manipulating-the-dom-with-refs) to access the underlying DOM node. The Effect reads the DOM node from the ref and automatically starts the animation for that node when the component appears. + +```js +import { useState, useEffect, useRef } from "react"; +import { FadeInAnimation } from "./animation.js"; + +function Welcome() { + const ref = useRef(null); + + useEffect(() => { + const animation = new FadeInAnimation(ref.current); + animation.start(1000); + return () => { + animation.stop(); + }; + }, []); + + return ( + <h1 + ref={ref} + style={{ + opacity: 0, + color: "white", + padding: 50, + textAlign: "center", + fontSize: 50, + backgroundImage: + "radial-gradient(circle, rgba(63,94,251,1) 0%, rgba(252,70,107,1) 100%)", + }} + > + Welcome + </h1> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button onClick={() => setShow(!show)}> + {show ? "Remove" : "Show"} + </button> + <hr /> + {show && <Welcome />} + </> + ); +} +``` + +```js +export class FadeInAnimation { + constructor(node) { + this.node = node; + } + start(duration) { + this.duration = duration; + if (this.duration === 0) { + // Jump to end immediately + this.onProgress(1); + } else { + this.onProgress(0); + // Start animating + this.startTime = performance.now(); + this.frameId = requestAnimationFrame(() => this.onFrame()); + } + } + onFrame() { + const timePassed = performance.now() - this.startTime; + const progress = Math.min(timePassed / this.duration, 1); + this.onProgress(progress); + if (progress < 1) { + // We still have more frames to paint + this.frameId = requestAnimationFrame(() => this.onFrame()); + } + } + onProgress(progress) { + this.node.style.opacity = progress; + } + stop() { + cancelAnimationFrame(this.frameId); + this.startTime = null; + this.frameId = null; + this.duration = 0; + } +} +``` + +```css +label, +button { + display: block; + margin-bottom: 20px; +} +html, +body { + min-height: 300px; +} +``` + +#### Controlling a modal dialog + +In this example, the external system is the browser DOM. The `ModalDialog` component renders a [`<dialog>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog) element. It uses an Effect to synchronize the `isOpen` prop to the [`showModal()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/showModal) and [`close()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/close) method calls. + +```js +import { useState } from "react"; +import ModalDialog from "./ModalDialog.js"; + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button onClick={() => setShow(true)}>Open dialog</button> + <ModalDialog isOpen={show}> + Hello there! + <br /> + <button + onClick={() => { + setShow(false); + }} + > + Close + </button> + </ModalDialog> + </> + ); +} +``` + +```js +import { useEffect, useRef } from "react"; + +export default function ModalDialog({ isOpen, children }) { + const ref = useRef(); + + useEffect(() => { + if (!isOpen) { + return; + } + const dialog = ref.current; + dialog.showModal(); + return () => { + dialog.close(); + }; + }, [isOpen]); + + return <dialog ref={ref}>{children}</dialog>; +} +``` + +```css +body { + min-height: 300px; +} +``` + +#### Tracking element visibility + +In this example, the external system is again the browser DOM. The `App` component displays a long list, then a `Box` component, and then another long list. Scroll the list down. Notice that when the `Box` component appears in the viewport, the background color changes to black. To implement this, the `Box` component uses an Effect to manage an [`IntersectionObserver`](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API). This browser API notifies you when the DOM element is visible in the viewport. + +```js +import Box from "./Box.js"; + +export default function App() { + return ( + <> + <LongSection /> + <Box /> + <LongSection /> + <Box /> + <LongSection /> + </> + ); +} + +function LongSection() { + const items = []; + for (let i = 0; i < 50; i++) { + items.push(<li key={i}>Item #{i} (keep scrolling)</li>); + } + return <ul>{items}</ul>; +} +``` + +```js +import { useRef, useEffect } from "react"; + +export default function Box() { + const ref = useRef(null); + + useEffect(() => { + const div = ref.current; + const observer = new IntersectionObserver((entries) => { + const entry = entries[0]; + if (entry.isIntersecting) { + document.body.style.backgroundColor = "black"; + document.body.style.color = "white"; + } else { + document.body.style.backgroundColor = "white"; + document.body.style.color = "black"; + } + }); + observer.observe(div, { + threshold: 1.0, + }); + return () => { + observer.disconnect(); + }; + }, []); + + return ( + <div + ref={ref} + style={{ + margin: 20, + height: 100, + width: 100, + border: "2px solid black", + backgroundColor: "blue", + }} + /> + ); +} +``` + +</Recipes> + +--- + +### Wrapping Effects in custom Hooks + +Effects are an ["escape hatch":](/learn/escape-hatches) you use them when you need to "step outside React" and when there is no better built-in solution for your use case. If you find yourself often needing to manually write Effects, it's usually a sign that you need to extract some [custom Hooks](/learn/reusing-logic-with-custom-hooks) for common behaviors your components rely on. + +For example, this `useChatRoom` custom Hook "hides" the logic of your Effect behind a more declarative API: + +```js +function useChatRoom({ serverUrl, roomId }) { + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [roomId, serverUrl]); +} +``` + +Then you can use it from any component like this: + +```js +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState('https://localhost:1234'); + + useChatRoom({ + roomId: roomId, + serverUrl: serverUrl + }); + // ... +``` + +There are also many excellent custom Hooks for every purpose available in the React ecosystem. + +[Learn more about wrapping Effects in custom Hooks.](/learn/reusing-logic-with-custom-hooks) + +<Recipes titleText="Examples of wrapping Effects in custom Hooks" titleId="examples-custom-hooks"> + +#### Custom `useChatRoom` Hook + +This example is identical to one of the [earlier examples,](#examples-connecting) but the logic is extracted to a custom Hook. + +```js +import { useState } from "react"; +import { useChatRoom } from "./useChatRoom.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useChatRoom({ + roomId: roomId, + serverUrl: serverUrl, + }); + + return ( + <> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + const [show, setShow] = useState(false); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <button onClick={() => setShow(!show)}> + {show ? "Close chat" : "Open chat"} + </button> + {show && <hr />} + {show && <ChatRoom roomId={roomId} />} + </> + ); +} +``` + +```js +import { useEffect } from "react"; +import { createConnection } from "./chat.js"; + +export function useChatRoom({ serverUrl, roomId }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [roomId, serverUrl]); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +#### Custom `useWindowListener` Hook + +This example is identical to one of the [earlier examples,](#examples-connecting) but the logic is extracted to a custom Hook. + +```js +import { useState } from "react"; +import { useWindowListener } from "./useWindowListener.js"; + +export default function App() { + const [position, setPosition] = useState({ x: 0, y: 0 }); + + useWindowListener("pointermove", (e) => { + setPosition({ x: e.clientX, y: e.clientY }); + }); + + return ( + <div + style={{ + position: "absolute", + backgroundColor: "pink", + borderRadius: "50%", + opacity: 0.6, + transform: `translate(${position.x}px, ${position.y}px)`, + pointerEvents: "none", + left: -20, + top: -20, + width: 40, + height: 40, + }} + /> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export function useWindowListener(eventType, listener) { + useEffect(() => { + window.addEventListener(eventType, listener); + return () => { + window.removeEventListener(eventType, listener); + }; + }, [eventType, listener]); +} +``` + +```css +body { + min-height: 300px; +} +``` + +#### Custom `useIntersectionObserver` Hook + +This example is identical to one of the [earlier examples,](#examples-connecting) but the logic is partially extracted to a custom Hook. + +```js +import Box from "./Box.js"; + +export default function App() { + return ( + <> + <LongSection /> + <Box /> + <LongSection /> + <Box /> + <LongSection /> + </> + ); +} + +function LongSection() { + const items = []; + for (let i = 0; i < 50; i++) { + items.push(<li key={i}>Item #{i} (keep scrolling)</li>); + } + return <ul>{items}</ul>; +} +``` + +```js +import { useRef, useEffect } from "react"; +import { useIntersectionObserver } from "./useIntersectionObserver.js"; + +export default function Box() { + const ref = useRef(null); + const isIntersecting = useIntersectionObserver(ref); + + useEffect(() => { + if (isIntersecting) { + document.body.style.backgroundColor = "black"; + document.body.style.color = "white"; + } else { + document.body.style.backgroundColor = "white"; + document.body.style.color = "black"; + } + }, [isIntersecting]); + + return ( + <div + ref={ref} + style={{ + margin: 20, + height: 100, + width: 100, + border: "2px solid black", + backgroundColor: "blue", + }} + /> + ); +} +``` + +```js +import { useState, useEffect } from "react"; + +export function useIntersectionObserver(ref) { + const [isIntersecting, setIsIntersecting] = useState(false); + + useEffect(() => { + const div = ref.current; + const observer = new IntersectionObserver((entries) => { + const entry = entries[0]; + setIsIntersecting(entry.isIntersecting); + }); + observer.observe(div, { + threshold: 1.0, + }); + return () => { + observer.disconnect(); + }; + }, [ref]); + + return isIntersecting; +} +``` + +</Recipes> + +--- + +### Controlling a non-React widget + +Sometimes, you want to keep an external system synchronized to some prop or state of your component. + +For example, if you have a third-party map widget or a video player component written without React, you can use an Effect to call methods on it that make its state match the current state of your React component. This Effect creates an instance of a `MapWidget` class defined in `map-widget.js`. When you change the `zoomLevel` prop of the `Map` component, the Effect calls the `setZoom()` on the class instance to keep it synchronized: + +```json package.json hidden +{ + "dependencies": { + "leaflet": "1.9.1", + "react": "latest", + "react-dom": "latest", + "react-scripts": "latest", + "remarkable": "2.0.1" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject" + } +} +``` + +```js +import { useState } from "react"; +import Map from "./Map.js"; + +export default function App() { + const [zoomLevel, setZoomLevel] = useState(0); + return ( + <> + Zoom level: {zoomLevel}x + <button onClick={() => setZoomLevel(zoomLevel + 1)}>+</button> + <button onClick={() => setZoomLevel(zoomLevel - 1)}>-</button> + <hr /> + <Map zoomLevel={zoomLevel} /> + </> + ); +} +``` + +```js +import { useRef, useEffect } from "react"; +import { MapWidget } from "./map-widget.js"; + +export default function Map({ zoomLevel }) { + const containerRef = useRef(null); + const mapRef = useRef(null); + + useEffect(() => { + if (mapRef.current === null) { + mapRef.current = new MapWidget(containerRef.current); + } + + const map = mapRef.current; + map.setZoom(zoomLevel); + }, [zoomLevel]); + + return <div style={{ width: 200, height: 200 }} ref={containerRef} />; +} +``` + +```js +import "leaflet/dist/leaflet.css"; +import * as L from "leaflet"; + +export class MapWidget { + constructor(domNode) { + this.map = L.map(domNode, { + zoomControl: false, + doubleClickZoom: false, + boxZoom: false, + keyboard: false, + scrollWheelZoom: false, + zoomAnimation: false, + touchZoom: false, + zoomSnap: 0.1, + }); + L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", { + maxZoom: 19, + attribution: "© OpenStreetMap", + }).addTo(this.map); + this.map.setView([0, 0], 0); + } + setZoom(level) { + this.map.setZoom(level); + } +} +``` + +```css +button { + margin: 5px; +} +``` + +In this example, a cleanup function is not needed because the `MapWidget` class manages only the DOM node that was passed to it. After the `Map` React component is removed from the tree, both the DOM node and the `MapWidget` class instance will be automatically garbage-collected by the browser JavaScript engine. + +--- + +### Fetching data with Effects + +You can use an Effect to fetch data for your component. Note that [if you use a framework,](/learn/start-a-new-react-project#production-grade-react-frameworks) using your framework's data fetching mechanism will be a lot more efficient than writing Effects manually. + +If you want to fetch data from an Effect manually, your code might look like this: + +```js +import { useState, useEffect } from 'react'; +import { fetchBio } from './api.js'; + +export default function Page() { + const [person, setPerson] = useState('Alice'); + const [bio, setBio] = useState(null); + + useEffect(() => { + let ignore = false; + setBio(null); + fetchBio(person).then(result => { + if (!ignore) { + setBio(result); + } + }); + return () => { + ignore = true; + }; + }, [person]); + + // ... +``` + +Note the `ignore` variable which is initialized to `false`, and is set to `true` during cleanup. This ensures [your code doesn't suffer from "race conditions":](https://maxrozen.com/race-conditions-fetching-data-react-with-useeffect) network responses may arrive in a different order than you sent them. + +```js +import { useState, useEffect } from "react"; +import { fetchBio } from "./api.js"; + +export default function Page() { + const [person, setPerson] = useState("Alice"); + const [bio, setBio] = useState(null); + useEffect(() => { + let ignore = false; + setBio(null); + fetchBio(person).then((result) => { + if (!ignore) { + setBio(result); + } + }); + return () => { + ignore = true; + }; + }, [person]); + + return ( + <> + <select + value={person} + onChange={(e) => { + setPerson(e.target.value); + }} + > + <option value="Alice">Alice</option> + <option value="Bob">Bob</option> + <option value="Taylor">Taylor</option> + </select> + <hr /> + <p> + <i>{bio ?? "Loading..."}</i> + </p> + </> + ); +} +``` + +```js +export async function fetchBio(person) { + const delay = person === "Bob" ? 2000 : 200; + return new Promise((resolve) => { + setTimeout(() => { + resolve("This is " + person + "’s bio."); + }, delay); + }); +} +``` + +You can also rewrite using the [`async` / `await`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function) syntax, but you still need to provide a cleanup function: + +```js +import { useState, useEffect } from "react"; +import { fetchBio } from "./api.js"; + +export default function Page() { + const [person, setPerson] = useState("Alice"); + const [bio, setBio] = useState(null); + useEffect(() => { + async function startFetching() { + setBio(null); + const result = await fetchBio(person); + if (!ignore) { + setBio(result); + } + } + + let ignore = false; + startFetching(); + return () => { + ignore = true; + }; + }, [person]); + + return ( + <> + <select + value={person} + onChange={(e) => { + setPerson(e.target.value); + }} + > + <option value="Alice">Alice</option> + <option value="Bob">Bob</option> + <option value="Taylor">Taylor</option> + </select> + <hr /> + <p> + <i>{bio ?? "Loading..."}</i> + </p> + </> + ); +} +``` + +```js +export async function fetchBio(person) { + const delay = person === "Bob" ? 2000 : 200; + return new Promise((resolve) => { + setTimeout(() => { + resolve("This is " + person + "’s bio."); + }, delay); + }); +} +``` + +Writing data fetching directly in Effects gets repetitive and makes it difficult to add optimizations like caching and server rendering later. [It's easier to use a custom Hook--either your own or maintained by the community.](/learn/reusing-logic-with-custom-hooks#when-to-use-custom-hooks) + +<DeepDive> + +#### What are good alternatives to data fetching in Effects? + +Writing `fetch` calls inside Effects is a [popular way to fetch data](https://www.robinwieruch.de/react-hooks-fetch-data/), especially in fully client-side apps. This is, however, a very manual approach and it has significant downsides: + +- **Effects don't run on the server.** This means that the initial server-rendered HTML will only include a loading state with no data. The client computer will have to download all JavaScript and render your app only to discover that now it needs to load the data. This is not very efficient. +- **Fetching directly in Effects makes it easy to create "network waterfalls".** You render the parent component, it fetches some data, renders the child components, and then they start fetching their data. If the network is not very fast, this is significantly slower than fetching all data in parallel. +- **Fetching directly in Effects usually means you don't preload or cache data.** For example, if the component unmounts and then mounts again, it would have to fetch the data again. +- **It's not very ergonomic.** There's quite a bit of boilerplate code involved when writing `fetch` calls in a way that doesn't suffer from bugs like [race conditions.](https://maxrozen.com/race-conditions-fetching-data-react-with-useeffect) + +This list of downsides is not specific to React. It applies to fetching data on mount with any library. Like with routing, data fetching is not trivial to do well, so we recommend the following approaches: + +- **If you use a [framework](/learn/start-a-new-react-project#production-grade-react-frameworks), use its built-in data fetching mechanism.** Modern React frameworks have integrated data fetching mechanisms that are efficient and don't suffer from the above pitfalls. +- **Otherwise, consider using or building a client-side cache.** Popular open source solutions include [React Query](https://react-query.tanstack.com/), [useSWR](https://swr.vercel.app/), and [React Router 6.4+.](https://beta.reactrouter.com/en/main/start/overview) You can build your own solution too, in which case you would use Effects under the hood but also add logic for deduplicating requests, caching responses, and avoiding network waterfalls (by preloading data or hoisting data requirements to routes). + +You can continue fetching data directly in Effects if neither of these approaches suit you. + +</DeepDive> + +--- + +### Specifying reactive dependencies + +**Notice that you can't "choose" the dependencies of your Effect.** Every <CodeStep step={2}>reactive value</CodeStep> used by your Effect's code must be declared as a dependency. Your Effect's dependency list is determined by the surrounding code: + +```js +function ChatRoom({ roomId }) { + // This is a reactive value + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); // This is a reactive value too + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); // This Effect reads these reactive values + connection.connect(); + return () => connection.disconnect(); + }, [serverUrl, roomId]); // ✅ So you must specify them as dependencies of your Effect + // ... +} +``` + +If either `serverUrl` or `roomId` change, your Effect will reconnect to the chat using the new values. + +**[Reactive values](/learn/lifecycle-of-reactive-effects#effects-react-to-reactive-values) include props and all variables and functions declared directly inside of your component.** Since `roomId` and `serverUrl` are reactive values, you can't remove them from the dependencies. If you try to omit them and [your linter is correctly configured for React,](/learn/editor-setup#linting) the linter will flag this as a mistake you need to fix: + +```js +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, []); // 🔴 React Hook useEffect has missing dependencies: 'roomId' and 'serverUrl' + // ... +} +``` + +**To remove a dependency, you need to ["prove" to the linter that it _doesn't need_ to be a dependency.](/learn/removing-effect-dependencies#removing-unnecessary-dependencies)** For example, you can move `serverUrl` out of your component to prove that it's not reactive and won't change on re-renders: + +```js +const serverUrl = "https://localhost:1234"; // Not a reactive value anymore + +function ChatRoom({ roomId }) { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); // ✅ All dependencies declared + // ... +} +``` + +Now that `serverUrl` is not a reactive value (and can't change on a re-render), it doesn't need to be a dependency. **If your Effect's code doesn't use any reactive values, its dependency list should be empty (`[]`):** + +```js +const serverUrl = "https://localhost:1234"; // Not a reactive value anymore +const roomId = "music"; // Not a reactive value anymore + +function ChatRoom() { + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, []); // ✅ All dependencies declared + // ... +} +``` + +[An Effect with empty dependencies](/learn/lifecycle-of-reactive-effects#what-an-effect-with-empty-dependencies-means) doesn't re-run when any of your component's props or state change. + +<Pitfall> + +If you have an existing codebase, you might have some Effects that suppress the linter like this: + +```js +useEffect(() => { + // ... + // 🔴 Avoid suppressing the linter like this: + // eslint-ignore-next-line react-hooks/exhaustive-deps +}, []); +``` + +**When dependencies don't match the code, there is a high risk of introducing bugs.** By suppressing the linter, you "lie" to React about the values your Effect depends on. [Instead, prove they're unnecessary.](/learn/removing-effect-dependencies#removing-unnecessary-dependencies) + +</Pitfall> + +<Recipes titleText="Examples of passing reactive dependencies" titleId="examples-dependencies"> + +#### Passing a dependency array + +If you specify the dependencies, your Effect runs **after the initial render _and_ after re-renders with changed dependencies.** + +```js +useEffect(() => { + // ... +}, [a, b]); // Runs again if a or b are different +``` + +In the below example, `serverUrl` and `roomId` are [reactive values,](/learn/lifecycle-of-reactive-effects#effects-react-to-reactive-values) so they both must be specified as dependencies. As a result, selecting a different room in the dropdown or editing the server URL input causes the chat to re-connect. However, since `message` isn't used in the Effect (and so it isn't a dependency), editing the message doesn't re-connect to the chat. + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + const [message, setMessage] = useState(""); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }, [serverUrl, roomId]); + + return ( + <> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + <label> + Your message:{" "} + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </label> + </> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + <button onClick={() => setShow(!show)}>{show ? "Close chat" : "Open chat"}</button> + </label> + {show && <hr />} + {show && <ChatRoom roomId={roomId} />} + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + margin-bottom: 10px; +} +button { + margin-left: 5px; +} +``` + +#### Passing an empty dependency array + +If your Effect truly doesn't use any reactive values, it will only run **after the initial render.** + +```js +useEffect(() => { + // ... +}, []); // Does not run again (except once in development) +``` + +**Even with empty dependencies, setup and cleanup will [run one extra time in development](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development) to help you find bugs.** + +In this example, both `serverUrl` and `roomId` are hardcoded. Since they're declared outside the component, they are not reactive values, and so they aren't dependencies. The dependency list is empty, so the Effect doesn't re-run on re-renders. + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; +const roomId = "music"; + +function ChatRoom() { + const [message, setMessage] = useState(""); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => connection.disconnect(); + }, []); + + return ( + <> + <h1>Welcome to the {roomId} room!</h1> + <label> + Your message:{" "} + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </label> + </> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + return ( + <> + <button onClick={() => setShow(!show)}> + {show ? "Close chat" : "Open chat"} + </button> + {show && <hr />} + {show && <ChatRoom />} + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +#### Passing no dependency array at all + +If you pass no dependency array at all, your Effect runs **after every single render (and re-render)** of your component. + +```js +useEffect(() => { + // ... +}); // Always runs again +``` + +In this example, the Effect re-runs when you change `serverUrl` and `roomId`, which is sensible. However, it _also_ re-runs when you change the `message`, which is probably undesirable. This is why usually you'll specify the dependency array. + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +function ChatRoom({ roomId }) { + const [serverUrl, setServerUrl] = useState("https://localhost:1234"); + const [message, setMessage] = useState(""); + + useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; + }); // No dependency array at all + + return ( + <> + <label> + Server URL:{" "} + <input + value={serverUrl} + onChange={(e) => setServerUrl(e.target.value)} + /> + </label> + <h1>Welcome to the {roomId} room!</h1> + <label> + Your message:{" "} + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </label> + </> + ); +} + +export default function App() { + const [show, setShow] = useState(false); + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + <button onClick={() => setShow(!show)}>{show ? "Close chat" : "Open chat"}</button> + </label> + {show && <hr />} + {show && <ChatRoom roomId={roomId} />} + </> + ); +} +``` + +```js +export function createConnection(serverUrl, roomId) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + margin-bottom: 10px; +} +button { + margin-left: 5px; +} +``` + +</Recipes> + +--- + +### Updating state based on previous state from an Effect + +When you want to update state based on previous state from an Effect, you might run into a problem: + +```js +function Counter() { + const [count, setCount] = useState(0); + + useEffect(() => { + const intervalId = setInterval(() => { + setCount(count + 1); // You want to increment the counter every second... + }, 1000); + return () => clearInterval(intervalId); + }, [count]); // 🚩 ... but specifying `count` as a dependency always resets the interval. + // ... +} +``` + +Since `count` is a reactive value, it must be specified in the list of dependencies. However, that causes the Effect to cleanup and setup again every time the `count` changes. This is not ideal. + +To fix this, [pass the `c => c + 1` state updater](/reference/react/useState#updating-state-based-on-the-previous-state) to `setCount`: + +```js +import { useState, useEffect } from "react"; + +export default function Counter() { + const [count, setCount] = useState(0); + + useEffect(() => { + const intervalId = setInterval(() => { + setCount((c) => c + 1); // ✅ Pass a state updater + }, 1000); + return () => clearInterval(intervalId); + }, []); // ✅ Now count is not a dependency + + return <h1>{count}</h1>; +} +``` + +```css +label { + display: block; + margin-top: 20px; + margin-bottom: 20px; +} + +body { + min-height: 150px; +} +``` + +Now that you're passing `c => c + 1` instead of `count + 1`, [your Effect no longer needs to depend on `count`.](/learn/removing-effect-dependencies#are-you-reading-some-state-to-calculate-the-next-state) As a result of this fix, it won't need to cleanup and setup the interval again every time the `count` changes. + +--- + +### Removing unnecessary object dependencies + +If your Effect depends on an object or a function created during rendering, it might run too often. For example, this Effect re-connects after every render because the `options` object is [different for every render:](/learn/removing-effect-dependencies#does-some-reactive-value-change-unintentionally) + +```js +const serverUrl = 'https://localhost:1234'; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(''); + + const options = { // 🚩 This object is created from scratch on every re-render + serverUrl: serverUrl, + roomId: roomId + }; + + useEffect(() => { + const connection = createConnection(options); // It's used inside the Effect + connection.connect(); + return () => connection.disconnect(); + }, [options]); // 🚩 As a result, these dependencies are always different on a re-render + // ... +``` + +Avoid using an object created during rendering as a dependency. Instead, create the object inside the Effect: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(""); + + useEffect(() => { + const options = { + serverUrl: serverUrl, + roomId: roomId, + }; + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + + return ( + <> + <h1>Welcome to the {roomId} room!</h1> + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +export function createConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +Now that you create the `options` object inside the Effect, the Effect itself only depends on the `roomId` string. + +With this fix, typing into the input doesn't reconnect the chat. Unlike an object which gets re-created, a string like `roomId` doesn't change unless you set it to another value. [Read more about removing dependencies.](/learn/removing-effect-dependencies) + +--- + +### Removing unnecessary function dependencies + +If your Effect depends on an object or a function created during rendering, it might run too often. For example, this Effect re-connects after every render because the `createOptions` function is [different for every render:](/learn/removing-effect-dependencies#does-some-reactive-value-change-unintentionally) + +```js +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(''); + + function createOptions() { // 🚩 This function is created from scratch on every re-render + return { + serverUrl: serverUrl, + roomId: roomId + }; + } + + useEffect(() => { + const options = createOptions(); // It's used inside the Effect + const connection = createConnection(); + connection.connect(); + return () => connection.disconnect(); + }, [createOptions]); // 🚩 As a result, these dependencies are always different on a re-render + // ... +``` + +By itself, creating a function from scratch on every re-render is not a problem. You don't need to optimize that. However, if you use it as a dependency of your Effect, it will cause your Effect to re-run after every re-render. + +Avoid using a function created during rendering as a dependency. Instead, declare it inside the Effect: + +```js +import { useState, useEffect } from "react"; +import { createConnection } from "./chat.js"; + +const serverUrl = "https://localhost:1234"; + +function ChatRoom({ roomId }) { + const [message, setMessage] = useState(""); + + useEffect(() => { + function createOptions() { + return { + serverUrl: serverUrl, + roomId: roomId, + }; + } + + const options = createOptions(); + const connection = createConnection(options); + connection.connect(); + return () => connection.disconnect(); + }, [roomId]); + + return ( + <> + <h1>Welcome to the {roomId} room!</h1> + <input + value={message} + onChange={(e) => setMessage(e.target.value)} + /> + </> + ); +} + +export default function App() { + const [roomId, setRoomId] = useState("general"); + return ( + <> + <label> + Choose the chat room:{" "} + <select + value={roomId} + onChange={(e) => setRoomId(e.target.value)} + > + <option value="general">general</option> + <option value="travel">travel</option> + <option value="music">music</option> + </select> + </label> + <hr /> + <ChatRoom roomId={roomId} /> + </> + ); +} +``` + +```js +export function createConnection({ serverUrl, roomId }) { + // A real implementation would actually connect to the server + return { + connect() { + console.log( + '✅ Connecting to "' + roomId + '" room at ' + serverUrl + "..." + ); + }, + disconnect() { + console.log( + '❌ Disconnected from "' + roomId + '" room at ' + serverUrl + ); + }, + }; +} +``` + +```css +input { + display: block; + margin-bottom: 20px; +} +button { + margin-left: 10px; +} +``` + +Now that you define the `createOptions` function inside the Effect, the Effect itself only depends on the `roomId` string. With this fix, typing into the input doesn't reconnect the chat. Unlike a function which gets re-created, a string like `roomId` doesn't change unless you set it to another value. [Read more about removing dependencies.](/learn/removing-effect-dependencies) + +--- + +### Reading the latest props and state from an Effect + +<Wip> + +This section describes an **experimental API that has not yet been released** in a stable version of React. + +</Wip> + +By default, when you read a reactive value from an Effect, you have to add it as a dependency. This ensures that your Effect "reacts" to every change of that value. For most dependencies, that's the behavior you want. + +**However, sometimes you'll want to read the _latest_ props and state from an Effect without "reacting" to them.** For example, imagine you want to log the number of the items in the shopping cart for every page visit: + +```js +function Page({ url, shoppingCart }) { + useEffect(() => { + logVisit(url, shoppingCart.length); + }, [url, shoppingCart]); // ✅ All dependencies declared + // ... +} +``` + +**What if you want to log a new page visit after every `url` change, but _not_ if only the `shoppingCart` changes?** You can't exclude `shoppingCart` from dependencies without breaking the [reactivity rules.](#specifying-reactive-dependencies) However, you can express that you _don't want_ a piece of code to "react" to changes even though it is called from inside an Effect. [Declare an _Effect Event_](/learn/separating-events-from-effects#declaring-an-effect-event) with the [`useEffectEvent`](/reference/react/experimental_useEffectEvent) Hook, and move the code reading `shoppingCart` inside of it: + +```js +function Page({ url, shoppingCart }) { + const onVisit = useEffectEvent((visitedUrl) => { + logVisit(visitedUrl, shoppingCart.length); + }); + + useEffect(() => { + onVisit(url); + }, [url]); // ✅ All dependencies declared + // ... +} +``` + +**Effect Events are not reactive and must always be omitted from dependencies of your Effect.** This is what lets you put non-reactive code (where you can read the latest value of some props and state) inside of them. By reading `shoppingCart` inside of `onVisit`, you ensure that `shoppingCart` won't re-run your Effect. + +[Read more about how Effect Events let you separate reactive and non-reactive code.](/learn/separating-events-from-effects#reading-latest-props-and-state-with-effect-events) + +--- + +### Displaying different content on the server and the client + +If your app uses server rendering (either [directly](/reference/react-dom/server) or via a [framework](/learn/start-a-new-react-project#production-grade-react-frameworks)), your component will render in two different environments. On the server, it will render to produce the initial HTML. On the client, React will run the rendering code again so that it can attach your event handlers to that HTML. This is why, for [hydration](/reference/react-dom/client/hydrateRoot#hydrating-server-rendered-html) to work, your initial render output must be identical on the client and the server. + +In rare cases, you might need to display different content on the client. For example, if your app reads some data from [`localStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage), it can't possibly do that on the server. Here is how you could implement this: + +```js +function MyComponent() { + const [didMount, setDidMount] = useState(false); + + useEffect(() => { + setDidMount(true); + }, []); + + if (didMount) { + // ... return client-only JSX ... + } else { + // ... return initial JSX ... + } +} +``` + +While the app is loading, the user will see the initial render output. Then, when it's loaded and hydrated, your Effect will run and set `didMount` to `true`, triggering a re-render. This will switch to the client-only render output. Effects don't run on the server, so this is why `didMount` was `false` during the initial server render. + +Use this pattern sparingly. Keep in mind that users with a slow connection will see the initial content for quite a bit of time--potentially, many seconds--so you don't want to make jarring changes to your component's appearance. In many cases, you can avoid the need for this by conditionally showing different things with CSS. + +--- + +## Troubleshooting + +### My Effect runs twice when the component mounts + +When Strict Mode is on, in development, React runs setup and cleanup one extra time before the actual setup. + +This is a stress-test that verifies your Effect’s logic is implemented correctly. If this causes visible issues, your cleanup function is missing some logic. The cleanup function should stop or undo whatever the setup function was doing. The rule of thumb is that the user shouldn’t be able to distinguish between the setup being called once (as in production) and a setup → cleanup → setup sequence (as in development). + +Read more about [how this helps find bugs](/learn/synchronizing-with-effects#step-3-add-cleanup-if-needed) and [how to fix your logic.](/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development) + +--- + +### My Effect runs after every re-render + +First, check that you haven't forgotten to specify the dependency array: + +```js +useEffect(() => { + // ... +}); // 🚩 No dependency array: re-runs after every render! +``` + +If you've specified the dependency array but your Effect still re-runs in a loop, it's because one of your dependencies is different on every re-render. + +You can debug this problem by manually logging your dependencies to the console: + +```js +useEffect(() => { + // .. +}, [serverUrl, roomId]); + +console.log([serverUrl, roomId]); +``` + +You can then right-click on the arrays from different re-renders in the console and select "Store as a global variable" for both of them. Assuming the first one got saved as `temp1` and the second one got saved as `temp2`, you can then use the browser console to check whether each dependency in both arrays is the same: + +```js +Object.is(temp1[0], temp2[0]); // Is the first dependency the same between the arrays? +Object.is(temp1[1], temp2[1]); // Is the second dependency the same between the arrays? +Object.is(temp1[2], temp2[2]); // ... and so on for every dependency ... +``` + +When you find the dependency that is different on every re-render, you can usually fix it in one of these ways: + +- [Updating state based on previous state from an Effect](#updating-state-based-on-previous-state-from-an-effect) +- [Removing unnecessary object dependencies](#removing-unnecessary-object-dependencies) +- [Removing unnecessary function dependencies](#removing-unnecessary-function-dependencies) +- [Reading the latest props and state from an Effect](#reading-the-latest-props-and-state-from-an-effect) + +As a last resort (if these methods didn't help), wrap its creation with [`useMemo`](/reference/react/useMemo#memoizing-a-dependency-of-another-hook) or [`useCallback`](/reference/react/useCallback#preventing-an-effect-from-firing-too-often) (for functions). + +--- + +### My Effect keeps re-running in an infinite cycle + +If your Effect runs in an infinite cycle, these two things must be true: + +- Your Effect is updating some state. +- That state leads to a re-render, which causes the Effect's dependencies to change. + +Before you start fixing the problem, ask yourself whether your Effect is connecting to some external system (like DOM, network, a third-party widget, and so on). Why does your Effect need to set state? Does it synchronize with that external system? Or are you trying to manage your application's data flow with it? + +If there is no external system, consider whether [removing the Effect altogether](/learn/you-might-not-need-an-effect) would simplify your logic. + +If you're genuinely synchronizing with some external system, think about why and under what conditions your Effect should update the state. Has something changed that affects your component's visual output? If you need to keep track of some data that isn't used by rendering, a [ref](/reference/react/useRef#referencing-a-value-with-a-ref) (which doesn't trigger re-renders) might be more appropriate. Verify your Effect doesn't update the state (and trigger re-renders) more than needed. + +Finally, if your Effect is updating the state at the right time, but there is still a loop, it's because that state update leads to one of the Effect's dependencies changing. [Read how to debug dependency changes.](/reference/react/useEffect#my-effect-runs-after-every-re-render) + +--- + +### My cleanup logic runs even though my component didn't unmount + +The cleanup function runs not only during unmount, but before every re-render with changed dependencies. Additionally, in development, React [runs setup+cleanup one extra time immediately after component mounts.](#my-effect-runs-twice-when-the-component-mounts) + +If you have cleanup code without corresponding setup code, it's usually a code smell: + +```js +useEffect(() => { + // 🔴 Avoid: Cleanup logic without corresponding setup logic + return () => { + doSomething(); + }; +}, []); +``` + +Your cleanup logic should be "symmetrical" to the setup logic, and should stop or undo whatever setup did: + +```js +useEffect(() => { + const connection = createConnection(serverUrl, roomId); + connection.connect(); + return () => { + connection.disconnect(); + }; +}, [serverUrl, roomId]); +``` + +[Learn how the Effect lifecycle is different from the component's lifecycle.](/learn/lifecycle-of-reactive-effects#the-lifecycle-of-an-effect) + +--- + +### My Effect does something visual, and I see a flicker before it runs + +If your Effect must block the browser from [painting the screen,](/learn/render-and-commit#epilogue-browser-paint) replace `useEffect` with [`useLayoutEffect`](/reference/react/useLayoutEffect). Note that **this shouldn't be needed for the vast majority of Effects.** You'll only need this if it's crucial to run your Effect before the browser paint: for example, to measure and position a tooltip before the user sees it.