From e3501348ea6acd9eb197662552236e6d5f9bb58c Mon Sep 17 00:00:00 2001 From: karimsemmoud Date: Sat, 21 Feb 2026 08:17:27 +0700 Subject: [PATCH 1/4] fix(seeds): batch database requests --- e2e/lib/e2e/place/helper.ex | 78 ++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 27 deletions(-) diff --git a/e2e/lib/e2e/place/helper.ex b/e2e/lib/e2e/place/helper.ex index e72d616..a354f35 100644 --- a/e2e/lib/e2e/place/helper.ex +++ b/e2e/lib/e2e/place/helper.ex @@ -1,7 +1,6 @@ defmodule E2e.Place.Helper do @moduledoc false - alias E2e.Place - + alias E2e.Repo require Logger def country_name_from_code(country_code) do @@ -9,40 +8,65 @@ defmodule E2e.Place.Helper do country_name end - # Save from seeds def fetch_and_insert_cities() do - priv_dir = :code.priv_dir(:e2e) - file_path = Path.join([priv_dir, "repo", "seeds", "cities.tar.gz"]) + read_compressed("cities.tar.gz") + |> Jason.decode!() + |> Enum.chunk_every(500) + |> Enum.each(fn batch -> - {:ok, file} = File.open(file_path, [:read, :utf8, :compressed]) + entries = + Enum.map(batch, fn city -> + %{ + id: city["id"], + name: city["name"], + iata_code: city["iata_code"], + iata_country_code: city["iata_country_code"], + # embedded airports stored as jsonb + airports: city["airports"] |> encode_embed() + } + end) - all_cities = IO.read(file, :eof) + Repo.insert_all("cities", entries, on_conflict: :nothing, conflict_target: :id) + end) + end - File.close(file) + def fetch_and_insert_airports() do + read_compressed("airports.tar.gz") + |> Jason.decode!() + |> Enum.chunk_every(500) + |> Enum.each(fn batch -> + entries = + Enum.map(batch, fn airport -> + %{ + id: airport["id"], + name: airport["name"], + iata_code: airport["iata_code"], + city_name: airport["city_name"], + iata_city_code: airport["iata_city_code"], + iata_country_code: airport["iata_country_code"], + icao_code: airport["icao_code"], + latitude: airport["latitude"], + longitude: airport["longitude"], + time_zone: airport["time_zone"], + # embedded city stored as jsonb + city: airport["city"] |> encode_embed() + } + end) - for city <- Jason.decode!(all_cities) do - case Place.create_city(city) do - {:error, changeset} -> Logger.debug(changeset) - {:ok, _city} -> :ok - end - end + Repo.insert_all("airports", entries, on_conflict: :nothing, conflict_target: :id) + end) end - def fetch_and_insert_airports() do + defp read_compressed(filename) do priv_dir = :code.priv_dir(:e2e) - file_path = Path.join([priv_dir, "repo", "seeds", "airports.tar.gz"]) - + file_path = Path.join([priv_dir, "repo", "seeds", filename]) {:ok, file} = File.open(file_path, [:read, :utf8, :compressed]) - - all_airports = IO.read(file, :eof) - + data = IO.read(file, :eof) File.close(file) - - for airport <- Jason.decode!(all_airports) do - case Place.create_airport(airport) do - {:error, changeset} -> Logger.debug(changeset) - {:ok, _airport} -> :ok - end - end + data end + + defp encode_embed(nil), do: nil + defp encode_embed(data) when is_list(data), do: data + defp encode_embed(data) when is_map(data), do: data end From d92439256ad861fed45b013fed65e7752dba0327 Mon Sep 17 00:00:00 2001 From: karimsemmoud Date: Sat, 21 Feb 2026 08:17:53 +0700 Subject: [PATCH 2/4] fix(doc): combobox filter false example --- lib/components/combobox.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/components/combobox.ex b/lib/components/combobox.ex index c09dce3..8427018 100644 --- a/lib/components/combobox.ex +++ b/lib/components/combobox.ex @@ -131,7 +131,7 @@ defmodule Corex.Combobox do ### Server-side Filtering - Use `on_input_value_change` to filter on the server. This example uses a local list; replace with a database query for real apps. + Disable client filtering with `disabled={false}` and use `on_input_value_change` to filter on the server. This example uses a local list; replace with a database query for real apps. ```heex defmodule MyAppWeb.CountryCombobox do @@ -168,6 +168,7 @@ defmodule Corex.Combobox do <.combobox id="country-combobox" collection={@items} + filter={false} on_input_value_change="search" > <:empty>No results From 8360a643424bfab4c868fc3451b6194ae1e8521e Mon Sep 17 00:00:00 2001 From: karimsemmoud Date: Sun, 22 Feb 2026 16:26:26 +0700 Subject: [PATCH 3/4] add theming and code component --- README.md | 2 +- design/components/clipboard.css | 26 + design/components/code.css | 126 + e2e/assets/corex/components/clipboard.css | 26 + e2e/assets/corex/components/code.css | 126 + e2e/assets/corex/components/typo.css | 4 +- e2e/assets/css/app.css | 12 +- e2e/assets/css/code_highlight.css | 77 + e2e/assets/styles/custom.css | 77 + e2e/lib/e2e/place/helper.ex | 1 - e2e/lib/e2e_web/code_examples.ex | 21 + e2e/lib/e2e_web/components/layouts.ex | 76 +- .../components/layouts/captures.html.heex | 21 +- .../e2e_web/components/layouts/root.html.heex | 20 +- .../e2e_web/controllers/page_controller.ex | 23 + e2e/lib/e2e_web/controllers/page_html.ex | 7 + .../page_html/accordion_page.html.heex | 20 +- .../page_html/action_page.html.heex | 71 + .../page_html/angle_slider_page.html.heex | 24 +- .../page_html/avatar_page.html.heex | 8 +- .../page_html/carousel_page.html.heex | 8 +- .../page_html/checkbox_page.html.heex | 20 +- .../page_html/clipboard_page.html.heex | 20 +- .../controllers/page_html/code_page.html.heex | 104 + .../page_html/collapsible_page.html.heex | 16 +- .../page_html/combobox_page.html.heex | 8 +- .../page_html/date_picker_page.html.heex | 16 +- .../page_html/dialog_page.html.heex | 16 +- .../page_html/editable_page.html.heex | 8 +- .../page_html/floating_panel_page.html.heex | 8 +- .../controllers/page_html/home.html.heex | 18 +- .../page_html/listbox_page.html.heex | 8 +- .../controllers/page_html/menu_page.html.heex | 8 +- .../page_html/navigate_page.html.heex | 78 + .../page_html/number_input_page.html.heex | 8 +- .../page_html/password_input_page.html.heex | 8 +- .../page_html/pin_input_page.html.heex | 8 +- .../page_html/radio_group_page.html.heex | 8 +- .../page_html/select_page.html.heex | 8 +- .../page_html/signature_page.html.heex | 12 +- .../page_html/switch_page.html.heex | 8 +- .../controllers/page_html/tabs_page.html.heex | 20 +- .../page_html/timer_page.html.heex | 8 +- .../page_html/toast_page.html.heex | 26 +- .../page_html/toggle_group_page.html.heex | 20 +- .../page_html/tree_view_page.html.heex | 24 +- .../controllers/user_html/edit.html.heex | 8 +- .../controllers/user_html/index.html.heex | 8 +- .../controllers/user_html/new.html.heex | 8 +- .../controllers/user_html/show.html.heex | 8 +- e2e/lib/e2e_web/live/accordion_async_live.ex | 8 +- .../e2e_web/live/accordion_controlled_live.ex | 8 +- e2e/lib/e2e_web/live/accordion_live.ex | 8 +- e2e/lib/e2e_web/live/accordion_play_live.ex | 8 +- e2e/lib/e2e_web/live/action_live.ex | 83 + e2e/lib/e2e_web/live/admin_live/form.ex | 8 +- e2e/lib/e2e_web/live/admin_live/index.ex | 8 +- e2e/lib/e2e_web/live/admin_live/show.ex | 8 +- .../live/angle_slider_controlled_live.ex | 8 +- e2e/lib/e2e_web/live/angle_slider_live.ex | 8 +- .../e2e_web/live/angle_slider_play_live.ex | 10 +- e2e/lib/e2e_web/live/avatar_live.ex | 8 +- e2e/lib/e2e_web/live/carousel_live.ex | 8 +- e2e/lib/e2e_web/live/checkbox_live.ex | 8 +- e2e/lib/e2e_web/live/clipboard_live.ex | 8 +- e2e/lib/e2e_web/live/code_live.ex | 129 + e2e/lib/e2e_web/live/collapsible_live.ex | 8 +- e2e/lib/e2e_web/live/combobox_fetch.ex | 8 +- e2e/lib/e2e_web/live/combobox_form.ex | 12 +- e2e/lib/e2e_web/live/combobox_live.ex | 8 +- e2e/lib/e2e_web/live/date_picker_live.ex | 8 +- e2e/lib/e2e_web/live/dialog_live.ex | 8 +- e2e/lib/e2e_web/live/editable_live.ex | 8 +- e2e/lib/e2e_web/live/floating_panel_live.ex | 8 +- e2e/lib/e2e_web/live/hooks/theme_live.ex | 10 + e2e/lib/e2e_web/live/listbox_live.ex | 8 +- e2e/lib/e2e_web/live/menu_live.ex | 8 +- e2e/lib/e2e_web/live/navigate_live.ex | 90 + e2e/lib/e2e_web/live/number_input_live.ex | 8 +- e2e/lib/e2e_web/live/password_input_live.ex | 8 +- e2e/lib/e2e_web/live/pin_input_live.ex | 8 +- e2e/lib/e2e_web/live/radio_group_live.ex | 8 +- e2e/lib/e2e_web/live/select_live.ex | 8 +- e2e/lib/e2e_web/live/signature_live.ex | 8 +- e2e/lib/e2e_web/live/switch_live.ex | 8 +- e2e/lib/e2e_web/live/tabs_live.ex | 8 +- e2e/lib/e2e_web/live/timer_live.ex | 8 +- e2e/lib/e2e_web/live/toast_live.ex | 8 +- e2e/lib/e2e_web/live/toggle_group_live.ex | 8 +- e2e/lib/e2e_web/live/tree_view_live.ex | 8 +- e2e/lib/e2e_web/plugs/theme.ex | 25 + e2e/lib/e2e_web/router.ex | 12 +- e2e/mix.exs | 5 + e2e/mix.lock | 6 + e2e/priv/code_examples/app.js | 6 + e2e/priv/code_examples/component.html | 3 + e2e/priv/code_examples/hello.ex | 5 + e2e/priv/code_examples/styles.css | 8 + ...0x180-480d4b1992079367b6cda44422dcbc96.png | Bin 0 -> 981 bytes ...vatar-bad9d852614f92cdfb9e547ffaede5ae.png | Bin 0 -> 29586 bytes ...beach-53c468d9dab6f884c050d58958e6c3d2.jpg | Bin 0 -> 45502 bytes ...ui-og-8952a72b82157d452a54bfc82c001011.jpg | Bin 0 -> 46089 bytes .../fall-5f37212ea29d4300569b148c4b2eb2bc.jpg | Bin 0 -> 35994 bytes ...vicon-7e94605551aa8aa20243bed3756d9343.ico | Bin 0 -> 526 bytes ...2x512-1e9be444ed2d780f521ab103340c3f15.png | Bin 0 -> 3301 bytes ...2x192-d874e80476b7bb8610a27acd76e24c58.png | Bin 0 -> 1266 bytes ...2x512-b05b19fb9e7210bcde2ed7bdfa24bc27.png | Bin 0 -> 3327 bytes ...64x64-e3204a9e30605560ebcf76a7280099a0.png | Bin 0 -> 467 bytes .../sand-cb1e068d7c2553040ad21f38a607ef92.jpg | Bin 0 -> 27925 bytes .../star-1981517c7246c2e0e2de660489b98c6d.jpg | Bin 0 -> 40927 bytes ...inter-e3e112f7d35ec9131ea2063c45eef8b9.jpg | Bin 0 -> 22067 bytes e2e/test/components/action_test.exs | 16 + e2e/test/components/code_test.exs | 16 + e2e/test/components/navigate_test.exs | 16 + e2e/test/support/models/action_model.ex | 3 + e2e/test/support/models/code_model.ex | 3 + e2e/test/support/models/navigate_model.ex | 3 + guides/installation.md | 2 +- guides/theming.md | 202 ++ lib/components/action.ex | 66 + lib/components/clipboard.ex | 6 + lib/components/code.ex | 156 + lib/components/listbox/connect.ex | 2 +- lib/components/navigate.ex | 109 + lib/corex.ex | 56 +- lib/mix/tasks/corex.code.ex | 91 + mix.exs | 6 +- package.json | 62 +- pnpm-lock.yaml | 760 ++--- priv/design/components/clipboard.css | 26 + priv/design/components/code.css | 126 + priv/static/accordion.mjs | 4 +- priv/static/angle-slider.mjs | 92 +- priv/static/avatar.mjs | 4 +- priv/static/carousel.mjs | 6 +- priv/static/checkbox.mjs | 6 +- priv/static/chunk-2QLEEEGG.mjs | 174 ++ priv/static/chunk-EBQGC3XC.mjs | 237 ++ priv/static/chunk-GN3NEUUU.mjs | 1988 ++++++++++++ priv/static/chunk-KCOQB3RU.mjs | 1339 +++++++++ priv/static/chunk-OA4F3YDQ.mjs | 295 ++ priv/static/chunk-QHOSSHQC.mjs | 432 +++ priv/static/chunk-RUWIVFVB.mjs | 2674 +++++++++++++++++ priv/static/clipboard.mjs | 4 +- priv/static/collapsible.mjs | 4 +- priv/static/combobox.mjs | 14 +- priv/static/date-picker.mjs | 14 +- priv/static/dialog.mjs | 14 +- priv/static/editable.mjs | 6 +- priv/static/floating-panel.mjs | 6 +- priv/static/listbox.mjs | 8 +- priv/static/menu.mjs | 14 +- priv/static/number-input.mjs | 4 +- priv/static/password-input.mjs | 4 +- priv/static/pin-input.mjs | 4 +- priv/static/radio-group.mjs | 6 +- priv/static/select.mjs | 14 +- priv/static/signature-pad.mjs | 4 +- priv/static/switch.mjs | 6 +- priv/static/tabs.mjs | 4 +- priv/static/timer.mjs | 4 +- priv/static/toast.mjs | 8 +- priv/static/toggle-group.mjs | 4 +- priv/static/tree-view.mjs | 6 +- 164 files changed, 10387 insertions(+), 713 deletions(-) create mode 100644 design/components/code.css create mode 100644 e2e/assets/corex/components/code.css create mode 100644 e2e/assets/css/code_highlight.css create mode 100644 e2e/assets/styles/custom.css create mode 100644 e2e/lib/e2e_web/code_examples.ex create mode 100644 e2e/lib/e2e_web/controllers/page_html/action_page.html.heex create mode 100644 e2e/lib/e2e_web/controllers/page_html/code_page.html.heex create mode 100644 e2e/lib/e2e_web/controllers/page_html/navigate_page.html.heex create mode 100644 e2e/lib/e2e_web/live/action_live.ex create mode 100644 e2e/lib/e2e_web/live/code_live.ex create mode 100644 e2e/lib/e2e_web/live/hooks/theme_live.ex create mode 100644 e2e/lib/e2e_web/live/navigate_live.ex create mode 100644 e2e/lib/e2e_web/plugs/theme.ex create mode 100644 e2e/priv/code_examples/app.js create mode 100644 e2e/priv/code_examples/component.html create mode 100644 e2e/priv/code_examples/hello.ex create mode 100644 e2e/priv/code_examples/styles.css create mode 100644 e2e/priv/static/images/apple-touch-icon-180x180-480d4b1992079367b6cda44422dcbc96.png create mode 100644 e2e/priv/static/images/avatar-bad9d852614f92cdfb9e547ffaede5ae.png create mode 100644 e2e/priv/static/images/beach-53c468d9dab6f884c050d58958e6c3d2.jpg create mode 100644 e2e/priv/static/images/corex-ui-og-8952a72b82157d452a54bfc82c001011.jpg create mode 100644 e2e/priv/static/images/fall-5f37212ea29d4300569b148c4b2eb2bc.jpg create mode 100644 e2e/priv/static/images/favicon-7e94605551aa8aa20243bed3756d9343.ico create mode 100644 e2e/priv/static/images/maskable-icon-512x512-1e9be444ed2d780f521ab103340c3f15.png create mode 100644 e2e/priv/static/images/pwa-192x192-d874e80476b7bb8610a27acd76e24c58.png create mode 100644 e2e/priv/static/images/pwa-512x512-b05b19fb9e7210bcde2ed7bdfa24bc27.png create mode 100644 e2e/priv/static/images/pwa-64x64-e3204a9e30605560ebcf76a7280099a0.png create mode 100644 e2e/priv/static/images/sand-cb1e068d7c2553040ad21f38a607ef92.jpg create mode 100644 e2e/priv/static/images/star-1981517c7246c2e0e2de660489b98c6d.jpg create mode 100644 e2e/priv/static/images/winter-e3e112f7d35ec9131ea2063c45eef8b9.jpg create mode 100644 e2e/test/components/action_test.exs create mode 100644 e2e/test/components/code_test.exs create mode 100644 e2e/test/components/navigate_test.exs create mode 100644 e2e/test/support/models/action_model.ex create mode 100644 e2e/test/support/models/code_model.ex create mode 100644 e2e/test/support/models/navigate_model.ex create mode 100644 guides/theming.md create mode 100644 lib/components/action.ex create mode 100644 lib/components/code.ex create mode 100644 lib/components/navigate.ex create mode 100644 lib/mix/tasks/corex.code.ex create mode 100644 priv/design/components/code.css create mode 100644 priv/static/chunk-2QLEEEGG.mjs create mode 100644 priv/static/chunk-EBQGC3XC.mjs create mode 100644 priv/static/chunk-GN3NEUUU.mjs create mode 100644 priv/static/chunk-KCOQB3RU.mjs create mode 100644 priv/static/chunk-OA4F3YDQ.mjs create mode 100644 priv/static/chunk-QHOSSHQC.mjs create mode 100644 priv/static/chunk-RUWIVFVB.mjs diff --git a/README.md b/README.md index 66ee9d8..8b71405 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Add `corex` to your `mix.exs` dependencies: ```elixir def deps do [ - {:corex, "~> 0.1.0-alpha.26"} + {:corex, "~> 0.1.0-alpha.27"} ] end ``` diff --git a/design/components/clipboard.css b/design/components/clipboard.css index eba8c2f..0407fb4 100644 --- a/design/components/clipboard.css +++ b/design/components/clipboard.css @@ -61,3 +61,29 @@ display: inline-block !important; } } + +@utility clipboard--* { + [data-scope="clipboard"][data-part="root"] { + max-width: --value(--container-ui-*, [length]); + gap: --value(--spacing-ui-gap-*, [length]); + } + + [data-scope="clipboard"][data-part="control"] { + gap: --value(--spacing-ui-gap-*, [length]); + } + + [data-scope="clipboard"][data-part="trigger"] { + font-size: --value(--text-ui-*, [length]); + line-height: --value(--text-ui-* --line-height, [length]); + min-height: --value(--spacing-ui-*, [length]); + } + + [data-scope="clipboard"][data-part="label"] { + font-size: --value(--text-ui-*, [length]); + line-height: --value(--text-ui-* --line-height, [length]); + } + + [data-scope="clipboard"][data-part="input"] { + max-width: --value(--container-ui-*, [length]); + } +} diff --git a/design/components/code.css b/design/components/code.css new file mode 100644 index 0000000..f6dec12 --- /dev/null +++ b/design/components/code.css @@ -0,0 +1,126 @@ +@import "../main.css"; + +@layer components { + .code[data-scope="code"][data-part="root"] { + @apply ui-root; + } + + .code [data-scope="code"][data-part="content"] .highlight { + @apply ui-content scrollbar scrollbar--sm; + font-family: var(--font-code); + font-size: var(--text-ui-sm); + line-height: var(--text-ui-sm--line-height); + padding: var(--spacing-ui-padding); + background-color: var(--color-ui); + color: var(--color-ui--text); + border: 1px solid var(--color-ui--border); + overflow: auto; + background-image: linear-gradient( + var(--color-root) 50%, + var(--color-layer) 50% + ); + background-size: 100% calc(var(--text-ui) * var(--text-ui--line-height)); + background-origin: content-box; + background-attachment: local; + background-position: 0 calc(var(--spacing-ui-padding) / 2);; + + + & code { + width: fit-content; + padding-inline-end: var(--spacing-ui); + } + } + + + .code .highlight .unselectable { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + + [data-mode="light"] .code .highlight .hll { background-color: #fff9c4; } + [data-mode="light"] .code .highlight .bp { color: #0070c1; } + [data-mode="light"] .code .highlight .c, [data-mode="light"] .code .highlight .c1, [data-mode="light"] .code .highlight .ch, [data-mode="light"] .code .highlight .cm, [data-mode="light"] .code .highlight .cs { color: #008000; font-style: italic; } + [data-mode="light"] .code .highlight .cp, [data-mode="light"] .code .highlight .cpf { color: #0000ff; font-style: normal; } + [data-mode="light"] .code .highlight .dl { color: #a31515; } + [data-mode="light"] .code .highlight .err { border-color: #cd3131; color: #cd3131; } + [data-mode="light"] .code .highlight .fm { color: #795e26; } + [data-mode="light"] .code .highlight .gd { color: #a31515; } + [data-mode="light"] .code .highlight .ge { font-style: italic; } + [data-mode="light"] .code .highlight .gh { color: #000080; font-weight: bold; } + [data-mode="light"] .code .highlight .gi { color: #098658; } + [data-mode="light"] .code .highlight .go { color: #6e7681; } + [data-mode="light"] .code .highlight .gp { color: #000080; font-weight: bold; } + [data-mode="light"] .code .highlight .gr { color: #cd3131; } + [data-mode="light"] .code .highlight .gs { font-weight: bold; } + [data-mode="light"] .code .highlight .gt { color: #0451a5; } + [data-mode="light"] .code .highlight .gu { color: #800080; font-weight: bold; } + [data-mode="light"] .code .highlight .il { color: #098658; } + [data-mode="light"] .code .highlight .k, [data-mode="light"] .code .highlight .kd, [data-mode="light"] .code .highlight .kr, [data-mode="light"] .code .highlight .kc, [data-mode="light"] .code .highlight .kn, [data-mode="light"] .code .highlight .kp { color: #0000ff; font-weight: bold; } + [data-mode="light"] .code .highlight .kt { color: #267f99; } + [data-mode="light"] .code .highlight .m, [data-mode="light"] .code .highlight .mb, [data-mode="light"] .code .highlight .mf, [data-mode="light"] .code .highlight .mh, [data-mode="light"] .code .highlight .mi, [data-mode="light"] .code .highlight .mo { color: #098658; } + [data-mode="light"] .code .highlight .na { color: #e50000; } + [data-mode="light"] .code .highlight .nb { color: #267f99; } + [data-mode="light"] .code .highlight .nc, [data-mode="light"] .code .highlight .nn { color: #267f99; font-weight: bold; } + [data-mode="light"] .code .highlight .nd { color: #af00db; } + [data-mode="light"] .code .highlight .ne { color: #cd3131; font-weight: bold; } + [data-mode="light"] .code .highlight .nf { color: #795e26; } + [data-mode="light"] .code .highlight .ni { color: #6e7681; font-weight: bold; } + [data-mode="light"] .code .highlight .nl { color: #000000; } + [data-mode="light"] .code .highlight .no { color: #0070c1; } + [data-mode="light"] .code .highlight .nt { color: #800000; font-weight: bold; } + [data-mode="light"] .code .highlight .nv, [data-mode="light"] .code .highlight .vc, [data-mode="light"] .code .highlight .vg, [data-mode="light"] .code .highlight .vi, [data-mode="light"] .code .highlight .vm { color: #001080; } + [data-mode="light"] .code .highlight .o { color: #000000; } + [data-mode="light"] .code .highlight .ow { color: #0000ff; font-weight: bold; } + [data-mode="light"] .code .highlight .s, [data-mode="light"] .code .highlight .s1, [data-mode="light"] .code .highlight .s2, [data-mode="light"] .code .highlight .sa, [data-mode="light"] .code .highlight .sb, [data-mode="light"] .code .highlight .sc, [data-mode="light"] .code .highlight .sh, [data-mode="light"] .code .highlight .sx { color: #a31515; } + [data-mode="light"] .code .highlight .sd { color: #a31515; font-style: italic; } + [data-mode="light"] .code .highlight .se { color: #ee0000; font-weight: bold; } + [data-mode="light"] .code .highlight .si { color: #811f3f; font-weight: bold; } + [data-mode="light"] .code .highlight .sr { color: #811f3f; } + [data-mode="light"] .code .highlight .ss { color: #001080; } + + [data-mode="dark"] .code .highlight .hll { background-color: #264f78; } + [data-mode="dark"] .code .highlight .bp { color: #4ec9b0; } + [data-mode="dark"] .code .highlight .c, [data-mode="dark"] .code .highlight .c1, [data-mode="dark"] .code .highlight .ch, [data-mode="dark"] .code .highlight .cm, [data-mode="dark"] .code .highlight .cs { color: #6a9955; font-style: italic; } + [data-mode="dark"] .code .highlight .cp, [data-mode="dark"] .code .highlight .cpf { color: #569cd6; font-style: normal; } + [data-mode="dark"] .code .highlight .dl { color: #ce9178; } + [data-mode="dark"] .code .highlight .err { border-color: #f44747; color: #f44747; } + [data-mode="dark"] .code .highlight .fm { color: #dcdcaa; } + [data-mode="dark"] .code .highlight .gd { color: #ce9178; } + [data-mode="dark"] .code .highlight .ge { font-style: italic; } + [data-mode="dark"] .code .highlight .gh { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .gi { color: #b5cea8; } + [data-mode="dark"] .code .highlight .go { color: #808080; } + [data-mode="dark"] .code .highlight .gp { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .gr { color: #f44747; } + [data-mode="dark"] .code .highlight .gs { font-weight: bold; } + [data-mode="dark"] .code .highlight .gt { color: #4ec9b0; } + [data-mode="dark"] .code .highlight .gu { color: #c586c0; font-weight: bold; } + [data-mode="dark"] .code .highlight .il { color: #b5cea8; } + [data-mode="dark"] .code .highlight .k, [data-mode="dark"] .code .highlight .kd, [data-mode="dark"] .code .highlight .kr, [data-mode="dark"] .code .highlight .kc, [data-mode="dark"] .code .highlight .kn, [data-mode="dark"] .code .highlight .kp { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .kt { color: #4ec9b0; } + [data-mode="dark"] .code .highlight .m, [data-mode="dark"] .code .highlight .mb, [data-mode="dark"] .code .highlight .mf, [data-mode="dark"] .code .highlight .mh, [data-mode="dark"] .code .highlight .mi, [data-mode="dark"] .code .highlight .mo { color: #b5cea8; } + [data-mode="dark"] .code .highlight .na { color: #9cdcfe; } + [data-mode="dark"] .code .highlight .nb { color: #4ec9b0; } + [data-mode="dark"] .code .highlight .nc, [data-mode="dark"] .code .highlight .nn { color: #4ec9b0; font-weight: bold; } + [data-mode="dark"] .code .highlight .nd { color: #c586c0; } + [data-mode="dark"] .code .highlight .ne { color: #f44747; font-weight: bold; } + [data-mode="dark"] .code .highlight .nf { color: #dcdcaa; } + [data-mode="dark"] .code .highlight .ni { color: #808080; font-weight: bold; } + [data-mode="dark"] .code .highlight .nl { color: #c8c8c8; } + [data-mode="dark"] .code .highlight .no { color: #4fc1ff; } + [data-mode="dark"] .code .highlight .nt { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .nv, [data-mode="dark"] .code .highlight .vc, [data-mode="dark"] .code .highlight .vg, [data-mode="dark"] .code .highlight .vi, [data-mode="dark"] .code .highlight .vm { color: #9cdcfe; } + [data-mode="dark"] .code .highlight .o { color: #d4d4d4; } + [data-mode="dark"] .code .highlight .ow { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .s, [data-mode="dark"] .code .highlight .s1, [data-mode="dark"] .code .highlight .s2, [data-mode="dark"] .code .highlight .sa, [data-mode="dark"] .code .highlight .sb, [data-mode="dark"] .code .highlight .sc, [data-mode="dark"] .code .highlight .sh, [data-mode="dark"] .code .highlight .sx { color: #ce9178; } + [data-mode="dark"] .code .highlight .sd { color: #ce9178; font-style: italic; } + [data-mode="dark"] .code .highlight .se { color: #d7ba7d; font-weight: bold; } + [data-mode="dark"] .code .highlight .si { color: #d7ba7d; font-weight: bold; } + [data-mode="dark"] .code .highlight .sr { color: #d16969; } + [data-mode="dark"] .code .highlight .ss { color: #9cdcfe; } +} diff --git a/e2e/assets/corex/components/clipboard.css b/e2e/assets/corex/components/clipboard.css index eba8c2f..0407fb4 100644 --- a/e2e/assets/corex/components/clipboard.css +++ b/e2e/assets/corex/components/clipboard.css @@ -61,3 +61,29 @@ display: inline-block !important; } } + +@utility clipboard--* { + [data-scope="clipboard"][data-part="root"] { + max-width: --value(--container-ui-*, [length]); + gap: --value(--spacing-ui-gap-*, [length]); + } + + [data-scope="clipboard"][data-part="control"] { + gap: --value(--spacing-ui-gap-*, [length]); + } + + [data-scope="clipboard"][data-part="trigger"] { + font-size: --value(--text-ui-*, [length]); + line-height: --value(--text-ui-* --line-height, [length]); + min-height: --value(--spacing-ui-*, [length]); + } + + [data-scope="clipboard"][data-part="label"] { + font-size: --value(--text-ui-*, [length]); + line-height: --value(--text-ui-* --line-height, [length]); + } + + [data-scope="clipboard"][data-part="input"] { + max-width: --value(--container-ui-*, [length]); + } +} diff --git a/e2e/assets/corex/components/code.css b/e2e/assets/corex/components/code.css new file mode 100644 index 0000000..f6dec12 --- /dev/null +++ b/e2e/assets/corex/components/code.css @@ -0,0 +1,126 @@ +@import "../main.css"; + +@layer components { + .code[data-scope="code"][data-part="root"] { + @apply ui-root; + } + + .code [data-scope="code"][data-part="content"] .highlight { + @apply ui-content scrollbar scrollbar--sm; + font-family: var(--font-code); + font-size: var(--text-ui-sm); + line-height: var(--text-ui-sm--line-height); + padding: var(--spacing-ui-padding); + background-color: var(--color-ui); + color: var(--color-ui--text); + border: 1px solid var(--color-ui--border); + overflow: auto; + background-image: linear-gradient( + var(--color-root) 50%, + var(--color-layer) 50% + ); + background-size: 100% calc(var(--text-ui) * var(--text-ui--line-height)); + background-origin: content-box; + background-attachment: local; + background-position: 0 calc(var(--spacing-ui-padding) / 2);; + + + & code { + width: fit-content; + padding-inline-end: var(--spacing-ui); + } + } + + + .code .highlight .unselectable { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + + [data-mode="light"] .code .highlight .hll { background-color: #fff9c4; } + [data-mode="light"] .code .highlight .bp { color: #0070c1; } + [data-mode="light"] .code .highlight .c, [data-mode="light"] .code .highlight .c1, [data-mode="light"] .code .highlight .ch, [data-mode="light"] .code .highlight .cm, [data-mode="light"] .code .highlight .cs { color: #008000; font-style: italic; } + [data-mode="light"] .code .highlight .cp, [data-mode="light"] .code .highlight .cpf { color: #0000ff; font-style: normal; } + [data-mode="light"] .code .highlight .dl { color: #a31515; } + [data-mode="light"] .code .highlight .err { border-color: #cd3131; color: #cd3131; } + [data-mode="light"] .code .highlight .fm { color: #795e26; } + [data-mode="light"] .code .highlight .gd { color: #a31515; } + [data-mode="light"] .code .highlight .ge { font-style: italic; } + [data-mode="light"] .code .highlight .gh { color: #000080; font-weight: bold; } + [data-mode="light"] .code .highlight .gi { color: #098658; } + [data-mode="light"] .code .highlight .go { color: #6e7681; } + [data-mode="light"] .code .highlight .gp { color: #000080; font-weight: bold; } + [data-mode="light"] .code .highlight .gr { color: #cd3131; } + [data-mode="light"] .code .highlight .gs { font-weight: bold; } + [data-mode="light"] .code .highlight .gt { color: #0451a5; } + [data-mode="light"] .code .highlight .gu { color: #800080; font-weight: bold; } + [data-mode="light"] .code .highlight .il { color: #098658; } + [data-mode="light"] .code .highlight .k, [data-mode="light"] .code .highlight .kd, [data-mode="light"] .code .highlight .kr, [data-mode="light"] .code .highlight .kc, [data-mode="light"] .code .highlight .kn, [data-mode="light"] .code .highlight .kp { color: #0000ff; font-weight: bold; } + [data-mode="light"] .code .highlight .kt { color: #267f99; } + [data-mode="light"] .code .highlight .m, [data-mode="light"] .code .highlight .mb, [data-mode="light"] .code .highlight .mf, [data-mode="light"] .code .highlight .mh, [data-mode="light"] .code .highlight .mi, [data-mode="light"] .code .highlight .mo { color: #098658; } + [data-mode="light"] .code .highlight .na { color: #e50000; } + [data-mode="light"] .code .highlight .nb { color: #267f99; } + [data-mode="light"] .code .highlight .nc, [data-mode="light"] .code .highlight .nn { color: #267f99; font-weight: bold; } + [data-mode="light"] .code .highlight .nd { color: #af00db; } + [data-mode="light"] .code .highlight .ne { color: #cd3131; font-weight: bold; } + [data-mode="light"] .code .highlight .nf { color: #795e26; } + [data-mode="light"] .code .highlight .ni { color: #6e7681; font-weight: bold; } + [data-mode="light"] .code .highlight .nl { color: #000000; } + [data-mode="light"] .code .highlight .no { color: #0070c1; } + [data-mode="light"] .code .highlight .nt { color: #800000; font-weight: bold; } + [data-mode="light"] .code .highlight .nv, [data-mode="light"] .code .highlight .vc, [data-mode="light"] .code .highlight .vg, [data-mode="light"] .code .highlight .vi, [data-mode="light"] .code .highlight .vm { color: #001080; } + [data-mode="light"] .code .highlight .o { color: #000000; } + [data-mode="light"] .code .highlight .ow { color: #0000ff; font-weight: bold; } + [data-mode="light"] .code .highlight .s, [data-mode="light"] .code .highlight .s1, [data-mode="light"] .code .highlight .s2, [data-mode="light"] .code .highlight .sa, [data-mode="light"] .code .highlight .sb, [data-mode="light"] .code .highlight .sc, [data-mode="light"] .code .highlight .sh, [data-mode="light"] .code .highlight .sx { color: #a31515; } + [data-mode="light"] .code .highlight .sd { color: #a31515; font-style: italic; } + [data-mode="light"] .code .highlight .se { color: #ee0000; font-weight: bold; } + [data-mode="light"] .code .highlight .si { color: #811f3f; font-weight: bold; } + [data-mode="light"] .code .highlight .sr { color: #811f3f; } + [data-mode="light"] .code .highlight .ss { color: #001080; } + + [data-mode="dark"] .code .highlight .hll { background-color: #264f78; } + [data-mode="dark"] .code .highlight .bp { color: #4ec9b0; } + [data-mode="dark"] .code .highlight .c, [data-mode="dark"] .code .highlight .c1, [data-mode="dark"] .code .highlight .ch, [data-mode="dark"] .code .highlight .cm, [data-mode="dark"] .code .highlight .cs { color: #6a9955; font-style: italic; } + [data-mode="dark"] .code .highlight .cp, [data-mode="dark"] .code .highlight .cpf { color: #569cd6; font-style: normal; } + [data-mode="dark"] .code .highlight .dl { color: #ce9178; } + [data-mode="dark"] .code .highlight .err { border-color: #f44747; color: #f44747; } + [data-mode="dark"] .code .highlight .fm { color: #dcdcaa; } + [data-mode="dark"] .code .highlight .gd { color: #ce9178; } + [data-mode="dark"] .code .highlight .ge { font-style: italic; } + [data-mode="dark"] .code .highlight .gh { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .gi { color: #b5cea8; } + [data-mode="dark"] .code .highlight .go { color: #808080; } + [data-mode="dark"] .code .highlight .gp { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .gr { color: #f44747; } + [data-mode="dark"] .code .highlight .gs { font-weight: bold; } + [data-mode="dark"] .code .highlight .gt { color: #4ec9b0; } + [data-mode="dark"] .code .highlight .gu { color: #c586c0; font-weight: bold; } + [data-mode="dark"] .code .highlight .il { color: #b5cea8; } + [data-mode="dark"] .code .highlight .k, [data-mode="dark"] .code .highlight .kd, [data-mode="dark"] .code .highlight .kr, [data-mode="dark"] .code .highlight .kc, [data-mode="dark"] .code .highlight .kn, [data-mode="dark"] .code .highlight .kp { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .kt { color: #4ec9b0; } + [data-mode="dark"] .code .highlight .m, [data-mode="dark"] .code .highlight .mb, [data-mode="dark"] .code .highlight .mf, [data-mode="dark"] .code .highlight .mh, [data-mode="dark"] .code .highlight .mi, [data-mode="dark"] .code .highlight .mo { color: #b5cea8; } + [data-mode="dark"] .code .highlight .na { color: #9cdcfe; } + [data-mode="dark"] .code .highlight .nb { color: #4ec9b0; } + [data-mode="dark"] .code .highlight .nc, [data-mode="dark"] .code .highlight .nn { color: #4ec9b0; font-weight: bold; } + [data-mode="dark"] .code .highlight .nd { color: #c586c0; } + [data-mode="dark"] .code .highlight .ne { color: #f44747; font-weight: bold; } + [data-mode="dark"] .code .highlight .nf { color: #dcdcaa; } + [data-mode="dark"] .code .highlight .ni { color: #808080; font-weight: bold; } + [data-mode="dark"] .code .highlight .nl { color: #c8c8c8; } + [data-mode="dark"] .code .highlight .no { color: #4fc1ff; } + [data-mode="dark"] .code .highlight .nt { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .nv, [data-mode="dark"] .code .highlight .vc, [data-mode="dark"] .code .highlight .vg, [data-mode="dark"] .code .highlight .vi, [data-mode="dark"] .code .highlight .vm { color: #9cdcfe; } + [data-mode="dark"] .code .highlight .o { color: #d4d4d4; } + [data-mode="dark"] .code .highlight .ow { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .s, [data-mode="dark"] .code .highlight .s1, [data-mode="dark"] .code .highlight .s2, [data-mode="dark"] .code .highlight .sa, [data-mode="dark"] .code .highlight .sb, [data-mode="dark"] .code .highlight .sc, [data-mode="dark"] .code .highlight .sh, [data-mode="dark"] .code .highlight .sx { color: #ce9178; } + [data-mode="dark"] .code .highlight .sd { color: #ce9178; font-style: italic; } + [data-mode="dark"] .code .highlight .se { color: #d7ba7d; font-weight: bold; } + [data-mode="dark"] .code .highlight .si { color: #d7ba7d; font-weight: bold; } + [data-mode="dark"] .code .highlight .sr { color: #d16969; } + [data-mode="dark"] .code .highlight .ss { color: #9cdcfe; } +} diff --git a/e2e/assets/corex/components/typo.css b/e2e/assets/corex/components/typo.css index 2729c4b..19f752a 100644 --- a/e2e/assets/corex/components/typo.css +++ b/e2e/assets/corex/components/typo.css @@ -286,7 +286,7 @@ gap: var(--spacing-ui-gap-lg); } - .typo pre { + /* .typo pre { @apply scrollbar scrollbar--sm; font-family: var(--font-code); @@ -297,5 +297,5 @@ color: var(--color-ui--text); border: 1px solid var(--color-ui--border); overflow: auto; - } + } */ } diff --git a/e2e/assets/css/app.css b/e2e/assets/css/app.css index 518c01b..b96ffff 100644 --- a/e2e/assets/css/app.css +++ b/e2e/assets/css/app.css @@ -10,6 +10,12 @@ @import "../corex/main.css"; @import "../corex/tokens/themes/neo/light.css"; @import "../corex/tokens/themes/neo/dark.css"; +@import "../corex/tokens/themes/uno/light.css"; +@import "../corex/tokens/themes/uno/dark.css"; +@import "../corex/tokens/themes/duo/light.css"; +@import "../corex/tokens/themes/duo/dark.css"; +@import "../corex/tokens/themes/leo/light.css"; +@import "../corex/tokens/themes/leo/dark.css"; @import "../corex/components/typo.css"; @import "../corex/components/accordion.css"; @import "../corex/components/layout.css"; @@ -43,6 +49,7 @@ @import "../corex/components/pin-input.css"; @import "../corex/components/radio-group.css"; @import "../corex/components/timer.css"; +@import "../corex/components/code.css"; @import "./navigation.css"; @@ -50,7 +57,10 @@ #locale-select.select, #locale-select.select [data-scope="select"][data-part="root"], -#locale-select.select [data-scope="select"][data-part="trigger"] { +#locale-select.select [data-scope="select"][data-part="trigger"], +#theme-select.select, +#theme-select.select [data-scope="select"][data-part="root"], +#theme-select.select [data-scope="select"][data-part="trigger"] { width: auto; } diff --git a/e2e/assets/css/code_highlight.css b/e2e/assets/css/code_highlight.css new file mode 100644 index 0000000..24b6479 --- /dev/null +++ b/e2e/assets/css/code_highlight.css @@ -0,0 +1,77 @@ +.highlight .hll {background-color: #ffffcc} +.highlight {background-color: #f8f8f8}.highlight .unselectable { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.highlight .bp {color: #008000; } /* :name_builtin_pseudo */ +.highlight .c {color: #408080; font-style: italic; } /* :comment */ +.highlight .c1 {color: #408080; font-style: italic; } /* :comment_single */ +.highlight .ch {color: #408080; font-style: italic; } /* :comment_hashbang */ +.highlight .cm {color: #408080; font-style: italic; } /* :comment_multiline */ +.highlight .cp {color: #BC7A00; font-style: normal; } /* :comment_preproc */ +.highlight .cpf {color: #BC7A00; font-style: normal; } /* :comment_preproc_file */ +.highlight .cs {color: #408080; font-style: italic; } /* :comment_special */ +.highlight .dl {color: #BA2121; } /* :string_delimiter */ +.highlight .err {border: #FF0000; } /* :error */ +.highlight .fm {color: #0000FF; } /* :name_function_magic */ +.highlight .gd {color: #A00000; } /* :generic_deleted */ +.highlight .ge {font-style: italic; } /* :generic_emph */ +.highlight .gh {color: #000080; font-weight: bold; } /* :generic_heading */ +.highlight .gi {color: #00A000; } /* :generic_inserted */ +.highlight .go {color: #888; } /* :generic_output */ +.highlight .gp {color: #000080; font-weight: bold; } /* :generic_prompt */ +.highlight .gr {color: #FF0000; } /* :generic_error */ +.highlight .gs {font-weight: bold; } /* :generic_strong */ +.highlight .gt {color: #04D; } /* :generic_traceback */ +.highlight .gu {color: #800080; font-weight: bold; } /* :generic_subheading */ +.highlight .il {color: #666666; } /* :number_integer_long */ +.highlight .k {color: #008000; font-weight: bold; } /* :keyword */ +.highlight .kc {color: #008000; font-weight: bold; } /* :keyword_constant */ +.highlight .kd {color: #008000; font-weight: bold; } /* :keyword_declaration */ +.highlight .kn {color: #008000; font-weight: bold; } /* :keyword_namespace */ +.highlight .kp {color: #008000; font-weight: normal; } /* :keyword_pseudo */ +.highlight .kr {color: #008000; font-weight: bold; } /* :keyword_reserved */ +.highlight .kt {color: #B00040; font-weight: normal; } /* :keyword_type */ +.highlight .m {color: #666666; } /* :number */ +.highlight .mb {color: #666666; } /* :number_bin */ +.highlight .mf {color: #666666; } /* :number_float */ +.highlight .mh {color: #666666; } /* :number_hex */ +.highlight .mi {color: #666666; } /* :number_integer */ +.highlight .mo {color: #666666; } /* :number_oct */ +.highlight .na {color: #7D9029; } /* :name_attribute */ +.highlight .nb {color: #008000; } /* :name_builtin */ +.highlight .nc {color: #0000FF; font-weight: bold; } /* :name_class */ +.highlight .nd {color: #AA22FF; } /* :name_decorator */ +.highlight .ne {color: #D2413A; font-weight: bold; } /* :name_exception */ +.highlight .nf {color: #0000FF; } /* :name_function */ +.highlight .ni {color: #999999; font-weight: bold; } /* :name_entity */ +.highlight .nl {color: #A0A000; } /* :name_label */ +.highlight .nn {color: #0000FF; font-weight: bold; } /* :name_namespace */ +.highlight .no {color: #880000; } /* :name_constant */ +.highlight .nt {color: #008000; font-weight: bold; } /* :name_tag */ +.highlight .nv {color: #19177C; } /* :name_variable */ +.highlight .o {color: #666666; } /* :operator */ +.highlight .ow {color: #AA22FF; font-weight: bold; } /* :operator_word */ +.highlight .s {color: #BA2121; } /* :string */ +.highlight .s1 {color: #BA2121; } /* :string_single */ +.highlight .s2 {color: #BA2121; } /* :string_double */ +.highlight .sa {color: #BA2121; } /* :string_affix */ +.highlight .sb {color: #BA2121; } /* :string_backtick */ +.highlight .sc {color: #BA2121; } /* :string_char */ +.highlight .sd {color: #BA2121; font-style: italic; } /* :string_doc */ +.highlight .se {color: #BB6622; font-weight: bold; } /* :string_escape */ +.highlight .sh {color: #BA2121; } /* :string_heredoc */ +.highlight .si {color: #BB6688; font-weight: bold; } /* :string_interpol */ +.highlight .sr {color: #BB6688; } /* :string_regex */ +.highlight .ss {color: #19177C; } /* :string_symbol */ +.highlight .sx {color: #008000; } /* :string_other */ +.highlight .sx {color: #BA2121; } /* :string_sigil */ +.highlight .vc {color: #19177C; } /* :name_variable_class */ +.highlight .vg {color: #19177C; } /* :name_variable_global */ +.highlight .vi {color: #19177C; } /* :name_variable_instance */ +.highlight .vm {color: #19177C; } /* :name_variable_magic */ diff --git a/e2e/assets/styles/custom.css b/e2e/assets/styles/custom.css new file mode 100644 index 0000000..24b6479 --- /dev/null +++ b/e2e/assets/styles/custom.css @@ -0,0 +1,77 @@ +.highlight .hll {background-color: #ffffcc} +.highlight {background-color: #f8f8f8}.highlight .unselectable { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.highlight .bp {color: #008000; } /* :name_builtin_pseudo */ +.highlight .c {color: #408080; font-style: italic; } /* :comment */ +.highlight .c1 {color: #408080; font-style: italic; } /* :comment_single */ +.highlight .ch {color: #408080; font-style: italic; } /* :comment_hashbang */ +.highlight .cm {color: #408080; font-style: italic; } /* :comment_multiline */ +.highlight .cp {color: #BC7A00; font-style: normal; } /* :comment_preproc */ +.highlight .cpf {color: #BC7A00; font-style: normal; } /* :comment_preproc_file */ +.highlight .cs {color: #408080; font-style: italic; } /* :comment_special */ +.highlight .dl {color: #BA2121; } /* :string_delimiter */ +.highlight .err {border: #FF0000; } /* :error */ +.highlight .fm {color: #0000FF; } /* :name_function_magic */ +.highlight .gd {color: #A00000; } /* :generic_deleted */ +.highlight .ge {font-style: italic; } /* :generic_emph */ +.highlight .gh {color: #000080; font-weight: bold; } /* :generic_heading */ +.highlight .gi {color: #00A000; } /* :generic_inserted */ +.highlight .go {color: #888; } /* :generic_output */ +.highlight .gp {color: #000080; font-weight: bold; } /* :generic_prompt */ +.highlight .gr {color: #FF0000; } /* :generic_error */ +.highlight .gs {font-weight: bold; } /* :generic_strong */ +.highlight .gt {color: #04D; } /* :generic_traceback */ +.highlight .gu {color: #800080; font-weight: bold; } /* :generic_subheading */ +.highlight .il {color: #666666; } /* :number_integer_long */ +.highlight .k {color: #008000; font-weight: bold; } /* :keyword */ +.highlight .kc {color: #008000; font-weight: bold; } /* :keyword_constant */ +.highlight .kd {color: #008000; font-weight: bold; } /* :keyword_declaration */ +.highlight .kn {color: #008000; font-weight: bold; } /* :keyword_namespace */ +.highlight .kp {color: #008000; font-weight: normal; } /* :keyword_pseudo */ +.highlight .kr {color: #008000; font-weight: bold; } /* :keyword_reserved */ +.highlight .kt {color: #B00040; font-weight: normal; } /* :keyword_type */ +.highlight .m {color: #666666; } /* :number */ +.highlight .mb {color: #666666; } /* :number_bin */ +.highlight .mf {color: #666666; } /* :number_float */ +.highlight .mh {color: #666666; } /* :number_hex */ +.highlight .mi {color: #666666; } /* :number_integer */ +.highlight .mo {color: #666666; } /* :number_oct */ +.highlight .na {color: #7D9029; } /* :name_attribute */ +.highlight .nb {color: #008000; } /* :name_builtin */ +.highlight .nc {color: #0000FF; font-weight: bold; } /* :name_class */ +.highlight .nd {color: #AA22FF; } /* :name_decorator */ +.highlight .ne {color: #D2413A; font-weight: bold; } /* :name_exception */ +.highlight .nf {color: #0000FF; } /* :name_function */ +.highlight .ni {color: #999999; font-weight: bold; } /* :name_entity */ +.highlight .nl {color: #A0A000; } /* :name_label */ +.highlight .nn {color: #0000FF; font-weight: bold; } /* :name_namespace */ +.highlight .no {color: #880000; } /* :name_constant */ +.highlight .nt {color: #008000; font-weight: bold; } /* :name_tag */ +.highlight .nv {color: #19177C; } /* :name_variable */ +.highlight .o {color: #666666; } /* :operator */ +.highlight .ow {color: #AA22FF; font-weight: bold; } /* :operator_word */ +.highlight .s {color: #BA2121; } /* :string */ +.highlight .s1 {color: #BA2121; } /* :string_single */ +.highlight .s2 {color: #BA2121; } /* :string_double */ +.highlight .sa {color: #BA2121; } /* :string_affix */ +.highlight .sb {color: #BA2121; } /* :string_backtick */ +.highlight .sc {color: #BA2121; } /* :string_char */ +.highlight .sd {color: #BA2121; font-style: italic; } /* :string_doc */ +.highlight .se {color: #BB6622; font-weight: bold; } /* :string_escape */ +.highlight .sh {color: #BA2121; } /* :string_heredoc */ +.highlight .si {color: #BB6688; font-weight: bold; } /* :string_interpol */ +.highlight .sr {color: #BB6688; } /* :string_regex */ +.highlight .ss {color: #19177C; } /* :string_symbol */ +.highlight .sx {color: #008000; } /* :string_other */ +.highlight .sx {color: #BA2121; } /* :string_sigil */ +.highlight .vc {color: #19177C; } /* :name_variable_class */ +.highlight .vg {color: #19177C; } /* :name_variable_global */ +.highlight .vi {color: #19177C; } /* :name_variable_instance */ +.highlight .vm {color: #19177C; } /* :name_variable_magic */ diff --git a/e2e/lib/e2e/place/helper.ex b/e2e/lib/e2e/place/helper.ex index a354f35..8d54fa5 100644 --- a/e2e/lib/e2e/place/helper.ex +++ b/e2e/lib/e2e/place/helper.ex @@ -13,7 +13,6 @@ defmodule E2e.Place.Helper do |> Jason.decode!() |> Enum.chunk_every(500) |> Enum.each(fn batch -> - entries = Enum.map(batch, fn city -> %{ diff --git a/e2e/lib/e2e_web/code_examples.ex b/e2e/lib/e2e_web/code_examples.ex new file mode 100644 index 0000000..42d4e0f --- /dev/null +++ b/e2e/lib/e2e_web/code_examples.ex @@ -0,0 +1,21 @@ +defmodule E2eWeb.CodeExamples do + @code_examples_path Path.join(:code.priv_dir(:e2e), "code_examples") + + def load(name) do + path = Path.join(@code_examples_path, name) + + case File.read(path) do + {:ok, content} -> content + {:error, _} -> "" + end + end + + def all do + %{ + elixir: load("hello.ex"), + html: load("component.html"), + css: load("styles.css"), + js: load("app.js") + } + end +end diff --git a/e2e/lib/e2e_web/components/layouts.ex b/e2e/lib/e2e_web/components/layouts.ex index 3350070..ba01c8c 100644 --- a/e2e/lib/e2e_web/components/layouts.ex +++ b/e2e/lib/e2e_web/components/layouts.ex @@ -20,7 +20,7 @@ defmodule E2eWeb.Layouts do ## Examples - +

Content

@@ -29,6 +29,8 @@ defmodule E2eWeb.Layouts do attr :mode, :string, default: "light", doc: "the mode (dark or light) from cookie/session" + attr :theme, :string, default: "neo", doc: "the theme (neo, uno, duo, leo) from cookie/session" + attr :current_scope, :map, default: nil, doc: "the current [scope](https://hexdocs.pm/phoenix/scopes.html)" @@ -56,8 +58,8 @@ defmodule E2eWeb.Layouts do ~H"""
-
-
+
+
<.dialog id="menu-dialog" class="dialog dialog--side lg:hidden"> <:trigger class="button button--sm button--circle rounded-full" aria_label="Open menu"> <.icon name="hero-bars-3" class="icon" /> @@ -126,11 +128,12 @@ defmodule E2eWeb.Layouts do fill="var(--color-layer--brand)" /> - Corex +
-
+
<.locale_switcher :if={@locale} locale={@locale} current_path={@current_path} /> + <.theme_toggle theme={@theme} /> <.mode_toggle mode={@mode} />
@@ -253,6 +256,44 @@ defmodule E2eWeb.Layouts do """ end + attr :theme, :string, + default: "neo", + values: ["neo", "uno", "duo", "leo"], + doc: "the theme from cookie/session" + + @doc """ + Provides theme selection using the select component. + """ + def theme_toggle(assigns) do + ~H""" + <.select + id="theme-select" + class="select select--sm select--micro" + collection={[ + %{id: "neo", label: "Neo"}, + %{id: "uno", label: "Uno"}, + %{id: "duo", label: "Duo"}, + %{id: "leo", label: "Leo"} + ]} + value={[@theme]} + on_value_change_client="phx:set-theme" + > + <:label class="sr-only"> + Theme + + <:item :let={item}> + {item.label} + + <:trigger> + <.icon name="hero-swatch" /> + + <:item_indicator> + <.icon name="hero-check" /> + + + """ + end + attr :mode, :string, default: "light", values: ["light", "dark"], @@ -260,7 +301,6 @@ defmodule E2eWeb.Layouts do @doc """ Provides dark vs light theme toggle using toggle_group. - """ def mode_toggle(assigns) do ~H""" @@ -334,6 +374,14 @@ defmodule E2eWeb.Layouts do [label: "Async", id: "/#{locale}/async/accordion"] ] ], + [ + label: "Action", + id: "action", + children: [ + [label: "Controller", id: "/#{locale}/action"], + [label: "Live", id: "/#{locale}/live/action"] + ] + ], [ label: "Angle Slider", id: "angle-slider", @@ -376,6 +424,14 @@ defmodule E2eWeb.Layouts do [label: "Live", id: "/#{locale}/live/clipboard"] ] ], + [ + label: "Code", + id: "code", + children: [ + [label: "Controller", id: "/#{locale}/code"], + [label: "Live", id: "/#{locale}/live/code"] + ] + ], [ label: "Collapsible", id: "collapsible", @@ -442,6 +498,14 @@ defmodule E2eWeb.Layouts do [label: "Live", id: "/#{locale}/live/menu"] ] ], + [ + label: "Navigate", + id: "navigate", + children: [ + [label: "Controller", id: "/#{locale}/navigate"], + [label: "Live", id: "/#{locale}/live/navigate"] + ] + ], [ label: "Number Input", id: "number-input", diff --git a/e2e/lib/e2e_web/components/layouts/captures.html.heex b/e2e/lib/e2e_web/components/layouts/captures.html.heex index 9cd2be5..2aa485e 100644 --- a/e2e/lib/e2e_web/components/layouts/captures.html.heex +++ b/e2e/lib/e2e_web/components/layouts/captures.html.heex @@ -8,7 +8,7 @@ else: "ltr" ) } - data-theme="neo" + data-theme={assigns[:theme] || "neo"} data-mode={assigns[:mode]} > @@ -78,6 +78,24 @@ const mode = Array.isArray(value) && value[0] ? value[0] : "light"; setMode(mode); }); + + const validThemes = ["neo", "uno", "duo", "leo"]; + const setTheme = (theme) => { + const resolved = validThemes.includes(theme) ? theme : "neo"; + localStorage.setItem("phx:theme", resolved); + document.cookie = "phx_theme=" + resolved + "; path=/; max-age=31536000"; + document.documentElement.setAttribute("data-theme", resolved); + }; + + setTheme(localStorage.getItem("phx:theme") || document.documentElement.getAttribute("data-theme") || "neo"); + + window.addEventListener("storage", (e) => e.key === "phx:theme" && e.newValue && setTheme(e.newValue)); + + window.addEventListener("phx:set-theme", (e) => { + const value = e.detail?.value; + const theme = Array.isArray(value) && value[0] ? value[0] : "neo"; + setTheme(theme); + }); })(); @@ -100,6 +118,7 @@
+ <.theme_toggle theme={assigns[:theme] || "neo"} /> <.mode_toggle mode={@mode} />
@@ -78,6 +78,24 @@ const mode = Array.isArray(value) && value[0] ? value[0] : "light"; setMode(mode); }); + + const validThemes = ["neo", "uno", "duo", "leo"]; + const setTheme = (theme) => { + const resolved = validThemes.includes(theme) ? theme : "neo"; + localStorage.setItem("phx:theme", resolved); + document.cookie = "phx_theme=" + resolved + "; path=/; max-age=31536000"; + document.documentElement.setAttribute("data-theme", resolved); + }; + + setTheme(localStorage.getItem("phx:theme") || document.documentElement.getAttribute("data-theme") || "neo"); + + window.addEventListener("storage", (e) => e.key === "phx:theme" && e.newValue && setTheme(e.newValue)); + + window.addEventListener("phx:set-theme", (e) => { + const value = e.detail?.value; + const theme = Array.isArray(value) && value[0] ? value[0] : "neo"; + setTheme(theme); + }); })(); diff --git a/e2e/lib/e2e_web/controllers/page_controller.ex b/e2e/lib/e2e_web/controllers/page_controller.ex index 0920eb6..ecd174e 100644 --- a/e2e/lib/e2e_web/controllers/page_controller.ex +++ b/e2e/lib/e2e_web/controllers/page_controller.ex @@ -9,6 +9,14 @@ defmodule E2eWeb.PageController do render(conn, :accordion_page) end + def action_page(conn, _params) do + render(conn, :action_page) + end + + def navigate_page(conn, _params) do + render(conn, :navigate_page) + end + def switch_page(conn, _params) do render(conn, :switch_page) end @@ -79,6 +87,21 @@ defmodule E2eWeb.PageController do render(conn, :clipboard_page) end + def code_page(conn, _params) do + heredoc_example = """ + defmodule Hello do + def world do + "Hello, World!" + end + end + """ + + conn + |> assign(:code_examples, E2eWeb.CodeExamples.all()) + |> assign(:heredoc_example, heredoc_example) + |> render(:code_page) + end + def date_picker_page(conn, _params) do render(conn, :date_picker_page) end diff --git a/e2e/lib/e2e_web/controllers/page_html.ex b/e2e/lib/e2e_web/controllers/page_html.ex index 2651896..dfb8e64 100644 --- a/e2e/lib/e2e_web/controllers/page_html.ex +++ b/e2e/lib/e2e_web/controllers/page_html.ex @@ -37,6 +37,13 @@ defmodule E2eWeb.PageHTML do [label: "Live", id: "/#{locale}/live/clipboard"] ] ], + [ + label: "Code", + id: "code", + children: [ + [label: "Controller", id: "/#{locale}/code"] + ] + ], [ label: "Collapsible", id: "collapsible", diff --git a/e2e/lib/e2e_web/controllers/page_html/accordion_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/accordion_page.html.heex index ff967f5..3a9c614 100644 --- a/e2e/lib/e2e_web/controllers/page_html/accordion_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/accordion_page.html.heex @@ -1,24 +1,30 @@ - +

Accordion

Controller View

Client Api

- - - +
diff --git a/e2e/lib/e2e_web/controllers/page_html/action_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/action_page.html.heex new file mode 100644 index 0000000..9fda167 --- /dev/null +++ b/e2e/lib/e2e_web/controllers/page_html/action_page.html.heex @@ -0,0 +1,71 @@ + +

Action

+

Controller View

+

Anatomy

+
+
+ <.action class="button">Text + <.action class="button"> + Text and SVG + + + <.action class="button button--square" aria_label="Button text"> + + + <.action class="button button--square" aria_label="Button text">B +
+
+ +

Color

+
+
+ <.action class="button">Text + <.action class="button button--accent">Text + <.action class="button button--brand">Text + <.action class="button button--alert">Text + <.action class="button button--info">Text + <.action class="button button--success">Text +
+
+ +

Size

+
+
+ <.action class="button button--sm">Button SM + <.action class="button">Button MD + <.action class="button button--lg">Button LG + <.action class="button button--xl">Button XL +
+
+ +

Shape

+
+
+ <.action class="button button--square" aria_label="Square button"> + + + <.action class="button button--square" aria_label="Square button">B + <.action class="button button--circle" aria_label="Circle button"> + + + <.action class="button button--circle" aria_label="Circle button">B +
+
+ +

Disabled

+
+
+ <.action class="button" disabled>Text + <.action class="button button--accent" disabled>Text + <.action class="button button--square" aria_label="Disabled" disabled> + + +
+
+
diff --git a/e2e/lib/e2e_web/controllers/page_html/angle_slider_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/angle_slider_page.html.heex index fe1a12e..1aec8ec 100644 --- a/e2e/lib/e2e_web/controllers/page_html/angle_slider_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/angle_slider_page.html.heex @@ -1,33 +1,39 @@ - +

Angle Slider

Controller View

Client Api

- - - - +
<.angle_slider id="my-angle-slider" class="angle-slider" marker_values={[0, 90, 180, 270]}> diff --git a/e2e/lib/e2e_web/controllers/page_html/avatar_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/avatar_page.html.heex index 44627ad..50d95d9 100644 --- a/e2e/lib/e2e_web/controllers/page_html/avatar_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/avatar_page.html.heex @@ -1,4 +1,10 @@ - +

Avatar

Controller View

diff --git a/e2e/lib/e2e_web/controllers/page_html/carousel_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/carousel_page.html.heex index 5ab2ec8..7612ff5 100644 --- a/e2e/lib/e2e_web/controllers/page_html/carousel_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/carousel_page.html.heex @@ -1,4 +1,10 @@ - +

Carousel

Controller View

diff --git a/e2e/lib/e2e_web/controllers/page_html/checkbox_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/checkbox_page.html.heex index 04245ec..7e4d781 100644 --- a/e2e/lib/e2e_web/controllers/page_html/checkbox_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/checkbox_page.html.heex @@ -1,29 +1,35 @@ - +

Checkbox

Controller View

Client Api

- + - - +
<.checkbox id="my-checkbox" class="checkbox"> diff --git a/e2e/lib/e2e_web/controllers/page_html/clipboard_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/clipboard_page.html.heex index ce70ef6..6fa99c3 100644 --- a/e2e/lib/e2e_web/controllers/page_html/clipboard_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/clipboard_page.html.heex @@ -1,26 +1,32 @@ - +

Clipboard

Controller View

Client Api

- - - +
<.clipboard id="my-clipboard" diff --git a/e2e/lib/e2e_web/controllers/page_html/code_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/code_page.html.heex new file mode 100644 index 0000000..222f840 --- /dev/null +++ b/e2e/lib/e2e_web/controllers/page_html/code_page.html.heex @@ -0,0 +1,104 @@ + +

Code

+

Controller View

+

Elixir

+
+
+ <.clipboard + id="code-elixir" + class="clipboard clipboard--sm absolute top-ui-padding right-ui-padding z-10" + value={@code_examples.elixir} + input={false} + trigger_aria_label="Copy code" + > + <:trigger> + <.icon name="hero-clipboard" class="icon data-copy" /> + <.icon name="hero-check" class="icon data-copied" /> + + + <.code code={@code_examples.elixir} language={:elixir} class="code" /> +
+
+ +

HTML

+
+
+ <.clipboard + id="code-html" + class="clipboard clipboard--sm absolute top-ui-padding right-ui-padding z-10" + value={@code_examples.html} + input={false} + trigger_aria_label="Copy code" + > + <:trigger> + <.icon name="hero-clipboard" class="icon data-copy" /> + <.icon name="hero-check" class="icon data-copied" /> + + + <.code code={@code_examples.html} language={:html} class="code" /> +
+
+ +

CSS

+
+
+ <.clipboard + id="code-css" + class="clipboard clipboard--sm absolute top-ui-padding right-ui-padding z-10" + value={@code_examples.css} + input={false} + trigger_aria_label="Copy code" + > + <:trigger> + <.icon name="hero-clipboard" class="icon data-copy" /> + <.icon name="hero-check" class="icon data-copied" /> + + + <.code code={@code_examples.css} language={:css} class="code" /> +
+
+ +

JavaScript

+
+
+ <.clipboard + id="code-js" + class="clipboard clipboard--sm absolute top-ui-padding right-ui-padding z-10" + value={@code_examples.js} + input={false} + trigger_aria_label="Copy code" + > + <:trigger> + <.icon name="hero-clipboard" class="icon data-copy" /> + <.icon name="hero-check" class="icon data-copied" /> + + + <.code code={@code_examples.js} language={:js} class="code" /> +
+
+ +

Inline with heredoc

+
+
+ <.clipboard + id="code-heredoc" + class="clipboard clipboard--sm absolute top-ui-padding right-ui-padding z-10" + value={@heredoc_example} + input={false} + trigger_aria_label="Copy code" + > + <:trigger> + <.icon name="hero-clipboard" class="icon data-copy" /> + <.icon name="hero-check" class="icon data-copied" /> + + + <.code language={:elixir} class="code" code={@heredoc_example} /> +
+
+
diff --git a/e2e/lib/e2e_web/controllers/page_html/collapsible_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/collapsible_page.html.heex index 5a9d1ca..94d2e02 100644 --- a/e2e/lib/e2e_web/controllers/page_html/collapsible_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/collapsible_page.html.heex @@ -1,21 +1,27 @@ - +

Collapsible

Controller View

Client Api

- - +
diff --git a/e2e/lib/e2e_web/controllers/page_html/combobox_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/combobox_page.html.heex index cfc59e7..62e0f57 100644 --- a/e2e/lib/e2e_web/controllers/page_html/combobox_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/combobox_page.html.heex @@ -1,4 +1,10 @@ - +

Combobox

Live View

diff --git a/e2e/lib/e2e_web/controllers/page_html/date_picker_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/date_picker_page.html.heex index 2bcad98..ae322e0 100644 --- a/e2e/lib/e2e_web/controllers/page_html/date_picker_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/date_picker_page.html.heex @@ -1,20 +1,26 @@ - +

Date Picker

Controller View

Client Api

- - +
<.date_picker id="my-date-picker" diff --git a/e2e/lib/e2e_web/controllers/page_html/dialog_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/dialog_page.html.heex index 360843b..b0a040a 100644 --- a/e2e/lib/e2e_web/controllers/page_html/dialog_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/dialog_page.html.heex @@ -1,14 +1,20 @@ - +

Dialog

Controller View

Client Api

- +
<.dialog id="my-dialog" class="dialog"> <:trigger>Open Dialog @@ -18,12 +24,12 @@ <:content>

Dialog content goes here. You can add any content you want inside the dialog.

- + <:close_trigger> <.icon name="hero-x-mark" class="icon" /> diff --git a/e2e/lib/e2e_web/controllers/page_html/editable_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/editable_page.html.heex index 63fdc71..7e43978 100644 --- a/e2e/lib/e2e_web/controllers/page_html/editable_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/editable_page.html.heex @@ -1,4 +1,10 @@ - +
diff --git a/e2e/lib/e2e_web/controllers/page_html/listbox_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/listbox_page.html.heex index 25041d0..92dd0c2 100644 --- a/e2e/lib/e2e_web/controllers/page_html/listbox_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/listbox_page.html.heex @@ -1,4 +1,10 @@ - +

Listbox

Controller View

diff --git a/e2e/lib/e2e_web/controllers/page_html/menu_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/menu_page.html.heex index 82b049c..8694663 100644 --- a/e2e/lib/e2e_web/controllers/page_html/menu_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/menu_page.html.heex @@ -1,4 +1,10 @@ - +

Menu

Controller View

diff --git a/e2e/lib/e2e_web/controllers/page_html/navigate_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/navigate_page.html.heex new file mode 100644 index 0000000..da4a987 --- /dev/null +++ b/e2e/lib/e2e_web/controllers/page_html/navigate_page.html.heex @@ -0,0 +1,78 @@ + +

Navigate

+

Controller View

+

Anatomy

+
+
+ <.navigate to="#" class="link">Internal Link + <.navigate to="#" class="link"> + Internal Link + + + <.navigate to="#" class="link" aria_label="Internal link icon only"> + + + <.navigate to="https://example.com" class="link" external> + External Link + + Opens in a new window + + + + <.navigate to="#" class="link" download="report.pdf"> + Download Link + + Download PDF, 2MB + + + +
+
+ +

Color

+
+
+ <.navigate to="#" class="link link--accent">Internal Link + <.navigate to="#" class="link link--brand">Internal Link + <.navigate to="#" class="link link--alert">Internal Link + <.navigate to="#" class="link link--info">Internal Link + <.navigate to="#" class="link link--success">Internal Link +
+
+ +

Size

+
+
+ <.navigate to="#" class="link link--sm">Internal Link + <.navigate to="#" class="link link--md">Internal Link + <.navigate to="#" class="link link--lg">Internal Link + <.navigate to="#" class="link link--xl">Internal Link +
+
+
diff --git a/e2e/lib/e2e_web/controllers/page_html/number_input_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/number_input_page.html.heex index 5d05fe1..1a7c6db 100644 --- a/e2e/lib/e2e_web/controllers/page_html/number_input_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/number_input_page.html.heex @@ -1,4 +1,10 @@ - +

Number Input

Controller View

diff --git a/e2e/lib/e2e_web/controllers/page_html/password_input_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/password_input_page.html.heex index 03eb14b..30b4404 100644 --- a/e2e/lib/e2e_web/controllers/page_html/password_input_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/password_input_page.html.heex @@ -1,4 +1,10 @@ - +

Password Input

Controller View

diff --git a/e2e/lib/e2e_web/controllers/page_html/pin_input_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/pin_input_page.html.heex index c96eae3..0f1905a 100644 --- a/e2e/lib/e2e_web/controllers/page_html/pin_input_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/pin_input_page.html.heex @@ -1,4 +1,10 @@ - +

Pin Input

Controller View

diff --git a/e2e/lib/e2e_web/controllers/page_html/radio_group_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/radio_group_page.html.heex index 2ace990..f84bbe4 100644 --- a/e2e/lib/e2e_web/controllers/page_html/radio_group_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/radio_group_page.html.heex @@ -1,4 +1,10 @@ - +

Radio Group

Controller View

diff --git a/e2e/lib/e2e_web/controllers/page_html/select_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/select_page.html.heex index 16cf3ce..f44ed0d 100644 --- a/e2e/lib/e2e_web/controllers/page_html/select_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/select_page.html.heex @@ -1,4 +1,10 @@ - +

Select

Live View

diff --git a/e2e/lib/e2e_web/controllers/page_html/signature_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/signature_page.html.heex index 171e01f..01a6387 100644 --- a/e2e/lib/e2e_web/controllers/page_html/signature_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/signature_page.html.heex @@ -1,12 +1,18 @@ - +

Signature Pad

Controller View

Client API

- +
<.signature_pad id="my-signature-pad" on_draw_end="signature_drawn"> diff --git a/e2e/lib/e2e_web/controllers/page_html/switch_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/switch_page.html.heex index b7e024e..1f2c803 100644 --- a/e2e/lib/e2e_web/controllers/page_html/switch_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/switch_page.html.heex @@ -1,4 +1,10 @@ - +

Switch

Controller View

<.switch class="switch"> diff --git a/e2e/lib/e2e_web/controllers/page_html/tabs_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/tabs_page.html.heex index 37229b1..b74dcd5 100644 --- a/e2e/lib/e2e_web/controllers/page_html/tabs_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/tabs_page.html.heex @@ -1,23 +1,29 @@ - +

Tabs

Controller View

Client Api

- - - +
<.tabs id="my-tabs" diff --git a/e2e/lib/e2e_web/controllers/page_html/timer_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/timer_page.html.heex index 4bb2188..3c6497c 100644 --- a/e2e/lib/e2e_web/controllers/page_html/timer_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/timer_page.html.heex @@ -1,4 +1,10 @@ - +

Timer

Controller View

diff --git a/e2e/lib/e2e_web/controllers/page_html/toast_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/toast_page.html.heex index 7bda6ca..24b5e66 100644 --- a/e2e/lib/e2e_web/controllers/page_html/toast_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/toast_page.html.heex @@ -1,4 +1,10 @@ - +

Toast

Controller View

@@ -35,13 +41,13 @@
- <.button class="button button--accent">Create Flash Message + <.action class="button button--accent">Create Flash Message

Client Api

- + - - + - +
diff --git a/e2e/lib/e2e_web/controllers/page_html/toggle_group_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/toggle_group_page.html.heex index 1a7523c..8595289 100644 --- a/e2e/lib/e2e_web/controllers/page_html/toggle_group_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/toggle_group_page.html.heex @@ -1,28 +1,34 @@ - +

Toggle Group

Controller View

Client Api

- - - +
<.toggle_group id="my-toggle-group" class="toggle-group"> <:item value="lorem"> diff --git a/e2e/lib/e2e_web/controllers/page_html/tree_view_page.html.heex b/e2e/lib/e2e_web/controllers/page_html/tree_view_page.html.heex index 775c488..0539d62 100644 --- a/e2e/lib/e2e_web/controllers/page_html/tree_view_page.html.heex +++ b/e2e/lib/e2e_web/controllers/page_html/tree_view_page.html.heex @@ -1,33 +1,39 @@ - +

Tree View

Controller View

Client Api

- - - - +
<.tree_view diff --git a/e2e/lib/e2e_web/controllers/user_html/edit.html.heex b/e2e/lib/e2e_web/controllers/user_html/edit.html.heex index 184905e..fa49184 100644 --- a/e2e/lib/e2e_web/controllers/user_html/edit.html.heex +++ b/e2e/lib/e2e_web/controllers/user_html/edit.html.heex @@ -1,4 +1,10 @@ - + <.header> Edit User {@user.id} <:subtitle>Use this form to manage user records in your database. diff --git a/e2e/lib/e2e_web/controllers/user_html/index.html.heex b/e2e/lib/e2e_web/controllers/user_html/index.html.heex index 47819fd..67cee01 100644 --- a/e2e/lib/e2e_web/controllers/user_html/index.html.heex +++ b/e2e/lib/e2e_web/controllers/user_html/index.html.heex @@ -1,4 +1,10 @@ - + <.header> Listing Users <:actions> diff --git a/e2e/lib/e2e_web/controllers/user_html/new.html.heex b/e2e/lib/e2e_web/controllers/user_html/new.html.heex index 62ca3d4..bbea01c 100644 --- a/e2e/lib/e2e_web/controllers/user_html/new.html.heex +++ b/e2e/lib/e2e_web/controllers/user_html/new.html.heex @@ -1,4 +1,10 @@ - + <.header> New User <:subtitle>Use this form to manage user records in your database. diff --git a/e2e/lib/e2e_web/controllers/user_html/show.html.heex b/e2e/lib/e2e_web/controllers/user_html/show.html.heex index 6eb80a5..9b950d7 100644 --- a/e2e/lib/e2e_web/controllers/user_html/show.html.heex +++ b/e2e/lib/e2e_web/controllers/user_html/show.html.heex @@ -1,4 +1,10 @@ - + <.header> User {@user.id} <:subtitle>This is a user record from your database. diff --git a/e2e/lib/e2e_web/live/accordion_async_live.ex b/e2e/lib/e2e_web/live/accordion_async_live.ex index ed7b102..b976b0c 100644 --- a/e2e/lib/e2e_web/live/accordion_async_live.ex +++ b/e2e/lib/e2e_web/live/accordion_async_live.ex @@ -40,7 +40,13 @@ defmodule E2eWeb.AccordionAsyncLive do def render(assigns) do ~H""" - +

Accordion

Async

diff --git a/e2e/lib/e2e_web/live/accordion_controlled_live.ex b/e2e/lib/e2e_web/live/accordion_controlled_live.ex index 7c28366..7425e0c 100644 --- a/e2e/lib/e2e_web/live/accordion_controlled_live.ex +++ b/e2e/lib/e2e_web/live/accordion_controlled_live.ex @@ -47,7 +47,13 @@ defmodule E2eWeb.AccordionControlledLive do def render(assigns) do ~H""" - +

Accordion

Live View

diff --git a/e2e/lib/e2e_web/live/accordion_live.ex b/e2e/lib/e2e_web/live/accordion_live.ex index 0a41b9e..3e8e1d8 100644 --- a/e2e/lib/e2e_web/live/accordion_live.ex +++ b/e2e/lib/e2e_web/live/accordion_live.ex @@ -32,7 +32,13 @@ defmodule E2eWeb.AccordionLive do def render(assigns) do ~H""" - +

Accordion

Live View

diff --git a/e2e/lib/e2e_web/live/accordion_play_live.ex b/e2e/lib/e2e_web/live/accordion_play_live.ex index 534c526..b5c03e6 100644 --- a/e2e/lib/e2e_web/live/accordion_play_live.ex +++ b/e2e/lib/e2e_web/live/accordion_play_live.ex @@ -91,7 +91,13 @@ defmodule E2eWeb.AccordionPlayLive do @impl true def render(assigns) do ~H""" - +

Accordion

Playground

diff --git a/e2e/lib/e2e_web/live/action_live.ex b/e2e/lib/e2e_web/live/action_live.ex new file mode 100644 index 0000000..de6868c --- /dev/null +++ b/e2e/lib/e2e_web/live/action_live.ex @@ -0,0 +1,83 @@ +defmodule E2eWeb.ActionLive do + use E2eWeb, :live_view + + def mount(_params, _session, socket) do + {:ok, socket} + end + + def render(assigns) do + ~H""" + +

Action

+

Live View

+

Anatomy

+
+
+ <.action class="button">Text + <.action class="button"> + Text and SVG + + + <.action class="button button--square" aria_label="Button text"> + + + <.action class="button button--square" aria_label="Button text">B +
+
+ +

Color

+
+
+ <.action class="button">Text + <.action class="button button--accent">Text + <.action class="button button--brand">Text + <.action class="button button--alert">Text + <.action class="button button--info">Text + <.action class="button button--success">Text +
+
+ +

Size

+
+
+ <.action class="button button--sm">Button SM + <.action class="button">Button MD + <.action class="button button--lg">Button LG + <.action class="button button--xl">Button XL +
+
+ +

Shape

+
+
+ <.action class="button button--square" aria_label="Square button"> + + + <.action class="button button--square" aria_label="Square button">B + <.action class="button button--circle" aria_label="Circle button"> + + + <.action class="button button--circle" aria_label="Circle button">B +
+
+ +

Disabled

+
+
+ <.action class="button" disabled>Text + <.action class="button button--accent" disabled>Text + <.action class="button button--square" aria_label="Disabled" disabled> + + +
+
+
+ """ + end +end diff --git a/e2e/lib/e2e_web/live/admin_live/form.ex b/e2e/lib/e2e_web/live/admin_live/form.ex index fd176fa..c5cbca9 100644 --- a/e2e/lib/e2e_web/live/admin_live/form.ex +++ b/e2e/lib/e2e_web/live/admin_live/form.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.AdminLive.Form do @impl true def render(assigns) do ~H""" - + <.header> {@page_title} <:subtitle>Use this form to manage admin records in your database. diff --git a/e2e/lib/e2e_web/live/admin_live/index.ex b/e2e/lib/e2e_web/live/admin_live/index.ex index 58ffea3..80ae53a 100644 --- a/e2e/lib/e2e_web/live/admin_live/index.ex +++ b/e2e/lib/e2e_web/live/admin_live/index.ex @@ -6,7 +6,13 @@ defmodule E2eWeb.AdminLive.Index do @impl true def render(assigns) do ~H""" - + <.header> Listing Admins <:actions> diff --git a/e2e/lib/e2e_web/live/admin_live/show.ex b/e2e/lib/e2e_web/live/admin_live/show.ex index abf6283..bc79b3e 100644 --- a/e2e/lib/e2e_web/live/admin_live/show.ex +++ b/e2e/lib/e2e_web/live/admin_live/show.ex @@ -6,7 +6,13 @@ defmodule E2eWeb.AdminLive.Show do @impl true def render(assigns) do ~H""" - + <.header> Admin {@admin.id} <:subtitle>This is a admin record from your database. diff --git a/e2e/lib/e2e_web/live/angle_slider_controlled_live.ex b/e2e/lib/e2e_web/live/angle_slider_controlled_live.ex index 8773037..73fcea0 100644 --- a/e2e/lib/e2e_web/live/angle_slider_controlled_live.ex +++ b/e2e/lib/e2e_web/live/angle_slider_controlled_live.ex @@ -26,7 +26,13 @@ defmodule E2eWeb.AngleSliderControlledLive do def render(assigns) do ~H""" - +

Angle Slider

Controlled

diff --git a/e2e/lib/e2e_web/live/angle_slider_live.ex b/e2e/lib/e2e_web/live/angle_slider_live.ex index 882f11e..13933d8 100644 --- a/e2e/lib/e2e_web/live/angle_slider_live.ex +++ b/e2e/lib/e2e_web/live/angle_slider_live.ex @@ -37,7 +37,13 @@ defmodule E2eWeb.AngleSliderLive do def render(assigns) do ~H""" - +

Angle Slider

Live View

diff --git a/e2e/lib/e2e_web/live/angle_slider_play_live.ex b/e2e/lib/e2e_web/live/angle_slider_play_live.ex index 9c6691d..8c8b361 100644 --- a/e2e/lib/e2e_web/live/angle_slider_play_live.ex +++ b/e2e/lib/e2e_web/live/angle_slider_play_live.ex @@ -90,7 +90,13 @@ defmodule E2eWeb.AngleSliderPlayLive do @impl true def render(assigns) do ~H""" - +

Angle Slider

Playground

@@ -130,7 +136,7 @@ defmodule E2eWeb.AngleSliderPlayLive do checked={@controls.show_markers} on_checked_change="control_changed" > - <:label>Show Markers (0°, 90°, 180°, 270°) + <:label>Show Markers <.toggle_group diff --git a/e2e/lib/e2e_web/live/avatar_live.ex b/e2e/lib/e2e_web/live/avatar_live.ex index 9af0750..ad311eb 100644 --- a/e2e/lib/e2e_web/live/avatar_live.ex +++ b/e2e/lib/e2e_web/live/avatar_live.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.AvatarLive do def render(assigns) do ~H""" - +

Avatar

Live View

diff --git a/e2e/lib/e2e_web/live/carousel_live.ex b/e2e/lib/e2e_web/live/carousel_live.ex index 6f2ff3f..3c96752 100644 --- a/e2e/lib/e2e_web/live/carousel_live.ex +++ b/e2e/lib/e2e_web/live/carousel_live.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.CarouselLive do def render(assigns) do ~H""" - +

Carousel

Live View

diff --git a/e2e/lib/e2e_web/live/checkbox_live.ex b/e2e/lib/e2e_web/live/checkbox_live.ex index 06bbd58..68b89f0 100644 --- a/e2e/lib/e2e_web/live/checkbox_live.ex +++ b/e2e/lib/e2e_web/live/checkbox_live.ex @@ -15,7 +15,13 @@ defmodule E2eWeb.CheckboxLive do def render(assigns) do ~H""" - +

Checkbox

Live View

diff --git a/e2e/lib/e2e_web/live/clipboard_live.ex b/e2e/lib/e2e_web/live/clipboard_live.ex index 080d820..1b5c5ce 100644 --- a/e2e/lib/e2e_web/live/clipboard_live.ex +++ b/e2e/lib/e2e_web/live/clipboard_live.ex @@ -19,7 +19,13 @@ defmodule E2eWeb.ClipboardLive do def render(assigns) do ~H""" - +

Clipboard

Live View

diff --git a/e2e/lib/e2e_web/live/code_live.ex b/e2e/lib/e2e_web/live/code_live.ex new file mode 100644 index 0000000..2f0d1d7 --- /dev/null +++ b/e2e/lib/e2e_web/live/code_live.ex @@ -0,0 +1,129 @@ +defmodule E2eWeb.CodeLive do + use E2eWeb, :live_view + + def mount(_params, _session, socket) do + heredoc_example = """ + defmodule Hello do + def world do + "Hello, World!" + end + end + """ + + socket = + socket + |> assign(:code_examples, E2eWeb.CodeExamples.all()) + |> assign(:heredoc_example, heredoc_example) + + {:ok, socket} + end + + def render(assigns) do + ~H""" + +

Code

+

Live View

+

Elixir

+
+
+ <.clipboard + id="code-elixir" + class="clipboard clipboard--sm absolute top-ui-padding right-ui-padding z-10" + value={@code_examples.elixir} + input={false} + trigger_aria_label="Copy code" + > + <:trigger> + <.icon name="hero-clipboard" class="icon data-copy" /> + <.icon name="hero-check" class="icon data-copied" /> + + + <.code code={@code_examples.elixir} language={:elixir} class="code" /> +
+
+ +

HTML

+
+
+ <.clipboard + id="code-html" + class="clipboard clipboard--sm absolute top-ui-padding right-ui-padding z-10" + value={@code_examples.html} + input={false} + trigger_aria_label="Copy code" + > + <:trigger> + <.icon name="hero-clipboard" class="icon data-copy" /> + <.icon name="hero-check" class="icon data-copied" /> + + + <.code code={@code_examples.html} language={:html} class="code" /> +
+
+ +

CSS

+
+
+ <.clipboard + id="code-css" + class="clipboard clipboard--sm absolute top-ui-padding right-ui-padding z-10" + value={@code_examples.css} + input={false} + trigger_aria_label="Copy code" + > + <:trigger> + <.icon name="hero-clipboard" class="icon data-copy" /> + <.icon name="hero-check" class="icon data-copied" /> + + + <.code code={@code_examples.css} language={:css} class="code" /> +
+
+ +

JavaScript

+
+
+ <.clipboard + id="code-js" + class="clipboard clipboard--sm absolute top-ui-padding right-ui-padding z-10" + value={@code_examples.js} + input={false} + trigger_aria_label="Copy code" + > + <:trigger> + <.icon name="hero-clipboard" class="icon data-copy" /> + <.icon name="hero-check" class="icon data-copied" /> + + + <.code code={@code_examples.js} language={:js} class="code" /> +
+
+ +

Inline with heredoc

+
+
+ <.clipboard + id="code-heredoc" + class="clipboard clipboard--sm absolute top-ui-padding right-ui-padding z-10" + value={@heredoc_example} + input={false} + trigger_aria_label="Copy code" + > + <:trigger> + <.icon name="hero-clipboard" class="icon data-copy" /> + <.icon name="hero-check" class="icon data-copied" /> + + + <.code language={:elixir} class="code" code={@heredoc_example} /> +
+
+
+ """ + end +end diff --git a/e2e/lib/e2e_web/live/collapsible_live.ex b/e2e/lib/e2e_web/live/collapsible_live.ex index 15e5009..0cebb4d 100644 --- a/e2e/lib/e2e_web/live/collapsible_live.ex +++ b/e2e/lib/e2e_web/live/collapsible_live.ex @@ -19,7 +19,13 @@ defmodule E2eWeb.CollapsibleLive do def render(assigns) do ~H""" - +

Collapsible

Live View

diff --git a/e2e/lib/e2e_web/live/combobox_fetch.ex b/e2e/lib/e2e_web/live/combobox_fetch.ex index b909401..d821fd9 100644 --- a/e2e/lib/e2e_web/live/combobox_fetch.ex +++ b/e2e/lib/e2e_web/live/combobox_fetch.ex @@ -84,7 +84,13 @@ defmodule E2eWeb.ComboboxFetch do def render(assigns) do ~H""" - +

Combobox

Server-side Filtering

diff --git a/e2e/lib/e2e_web/live/combobox_form.ex b/e2e/lib/e2e_web/live/combobox_form.ex index 080b624..00a2a9c 100644 --- a/e2e/lib/e2e_web/live/combobox_form.ex +++ b/e2e/lib/e2e_web/live/combobox_form.ex @@ -149,7 +149,13 @@ defmodule E2eWeb.ComboboxForm do @impl true def render(assigns) do ~H""" - +

Combobox

Form with validation

@@ -157,7 +163,9 @@ defmodule E2eWeb.ComboboxForm do <.header> Combobox form - <:subtitle>Phoenix form with Ecto validation, database fetching and server side fitlering combobox. + <:subtitle> + Phoenix form with Ecto validation, database fetching and server side fitlering combobox. + <.form diff --git a/e2e/lib/e2e_web/live/combobox_live.ex b/e2e/lib/e2e_web/live/combobox_live.ex index 0c6adc9..8ae8a9e 100644 --- a/e2e/lib/e2e_web/live/combobox_live.ex +++ b/e2e/lib/e2e_web/live/combobox_live.ex @@ -12,7 +12,13 @@ defmodule E2eWeb.ComboboxLive do def render(assigns) do ~H""" - +

Combobox

Live View

diff --git a/e2e/lib/e2e_web/live/date_picker_live.ex b/e2e/lib/e2e_web/live/date_picker_live.ex index e074d97..5851a27 100644 --- a/e2e/lib/e2e_web/live/date_picker_live.ex +++ b/e2e/lib/e2e_web/live/date_picker_live.ex @@ -11,7 +11,13 @@ defmodule E2eWeb.DatePickerLive do def render(assigns) do ~H""" - +

Date Picker

Live View

diff --git a/e2e/lib/e2e_web/live/dialog_live.ex b/e2e/lib/e2e_web/live/dialog_live.ex index 494b6ab..46399c2 100644 --- a/e2e/lib/e2e_web/live/dialog_live.ex +++ b/e2e/lib/e2e_web/live/dialog_live.ex @@ -19,7 +19,13 @@ defmodule E2eWeb.DialogLive do def render(assigns) do ~H""" - +

Dialog

Live View

diff --git a/e2e/lib/e2e_web/live/editable_live.ex b/e2e/lib/e2e_web/live/editable_live.ex index 13a8e90..ca6218d 100644 --- a/e2e/lib/e2e_web/live/editable_live.ex +++ b/e2e/lib/e2e_web/live/editable_live.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.EditableLive do def render(assigns) do ~H""" - +

Editable

Live View

diff --git a/e2e/lib/e2e_web/live/floating_panel_live.ex b/e2e/lib/e2e_web/live/floating_panel_live.ex index 58cffca..d03b0ca 100644 --- a/e2e/lib/e2e_web/live/floating_panel_live.ex +++ b/e2e/lib/e2e_web/live/floating_panel_live.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.FloatingPanelLive do def render(assigns) do ~H""" - +

Floating Panel

Live View

diff --git a/e2e/lib/e2e_web/live/hooks/theme_live.ex b/e2e/lib/e2e_web/live/hooks/theme_live.ex new file mode 100644 index 0000000..c6cbf41 --- /dev/null +++ b/e2e/lib/e2e_web/live/hooks/theme_live.ex @@ -0,0 +1,10 @@ +defmodule E2eWeb.ThemeLive do + @moduledoc """ + Assigns the theme from the session to the LiveView socket. + """ + def on_mount(:default, _params, session, socket) do + theme = session["theme"] || "neo" + + {:cont, Phoenix.Component.assign(socket, :theme, theme)} + end +end diff --git a/e2e/lib/e2e_web/live/listbox_live.ex b/e2e/lib/e2e_web/live/listbox_live.ex index 5fa98b7..2bcacb6 100644 --- a/e2e/lib/e2e_web/live/listbox_live.ex +++ b/e2e/lib/e2e_web/live/listbox_live.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.ListboxLive do def render(assigns) do ~H""" - +

Listbox

Live View

diff --git a/e2e/lib/e2e_web/live/menu_live.ex b/e2e/lib/e2e_web/live/menu_live.ex index 95445be..ded3ccd 100644 --- a/e2e/lib/e2e_web/live/menu_live.ex +++ b/e2e/lib/e2e_web/live/menu_live.ex @@ -16,7 +16,13 @@ defmodule E2eWeb.MenuLive do def render(assigns) do ~H""" - +

Menu

Live View

diff --git a/e2e/lib/e2e_web/live/navigate_live.ex b/e2e/lib/e2e_web/live/navigate_live.ex new file mode 100644 index 0000000..011c644 --- /dev/null +++ b/e2e/lib/e2e_web/live/navigate_live.ex @@ -0,0 +1,90 @@ +defmodule E2eWeb.NavigateLive do + use E2eWeb, :live_view + + def mount(_params, _session, socket) do + {:ok, socket} + end + + def render(assigns) do + ~H""" + +

Navigate

+

Live View

+

Anatomy

+
+
+ <.navigate to="#" class="link">Internal Link + <.navigate to="#" class="link"> + Internal Link + + + <.navigate to="#" class="link" aria_label="Internal link icon only"> + + + <.navigate to="https://example.com" class="link" external> + External Link + + Opens in a new window + + + + <.navigate to="#" class="link" download="report.pdf"> + Download Link + + Download PDF, 2MB + + + +
+
+ +

Color

+
+
+ <.navigate to="#" class="link link--accent">Internal Link + <.navigate to="#" class="link link--brand">Internal Link + <.navigate to="#" class="link link--alert">Internal Link + <.navigate to="#" class="link link--info">Internal Link + <.navigate to="#" class="link link--success">Internal Link +
+
+ +

Size

+
+
+ <.navigate to="#" class="link link--sm">Internal Link + <.navigate to="#" class="link link--md">Internal Link + <.navigate to="#" class="link link--lg">Internal Link + <.navigate to="#" class="link link--xl">Internal Link +
+
+
+ """ + end +end diff --git a/e2e/lib/e2e_web/live/number_input_live.ex b/e2e/lib/e2e_web/live/number_input_live.ex index e3e05c2..fcb7d61 100644 --- a/e2e/lib/e2e_web/live/number_input_live.ex +++ b/e2e/lib/e2e_web/live/number_input_live.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.NumberInputLive do def render(assigns) do ~H""" - +

Number Input

Live View

diff --git a/e2e/lib/e2e_web/live/password_input_live.ex b/e2e/lib/e2e_web/live/password_input_live.ex index 14b0f90..251363b 100644 --- a/e2e/lib/e2e_web/live/password_input_live.ex +++ b/e2e/lib/e2e_web/live/password_input_live.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.PasswordInputLive do def render(assigns) do ~H""" - +

Password Input

Live View

diff --git a/e2e/lib/e2e_web/live/pin_input_live.ex b/e2e/lib/e2e_web/live/pin_input_live.ex index c0037fb..3f1760a 100644 --- a/e2e/lib/e2e_web/live/pin_input_live.ex +++ b/e2e/lib/e2e_web/live/pin_input_live.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.PinInputLive do def render(assigns) do ~H""" - +

Pin Input

Live View

diff --git a/e2e/lib/e2e_web/live/radio_group_live.ex b/e2e/lib/e2e_web/live/radio_group_live.ex index 765119c..1ec9821 100644 --- a/e2e/lib/e2e_web/live/radio_group_live.ex +++ b/e2e/lib/e2e_web/live/radio_group_live.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.RadioGroupLive do def render(assigns) do ~H""" - +

Radio Group

Live View

diff --git a/e2e/lib/e2e_web/live/select_live.ex b/e2e/lib/e2e_web/live/select_live.ex index 3773771..7493e48 100644 --- a/e2e/lib/e2e_web/live/select_live.ex +++ b/e2e/lib/e2e_web/live/select_live.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.SelectLive do def render(assigns) do ~H""" - +

Select

Live View

diff --git a/e2e/lib/e2e_web/live/signature_live.ex b/e2e/lib/e2e_web/live/signature_live.ex index 1376b74..46998aa 100644 --- a/e2e/lib/e2e_web/live/signature_live.ex +++ b/e2e/lib/e2e_web/live/signature_live.ex @@ -20,7 +20,13 @@ defmodule E2eWeb.SignatureLive do def render(assigns) do ~H""" - +

Signature Pad

Live View

diff --git a/e2e/lib/e2e_web/live/switch_live.ex b/e2e/lib/e2e_web/live/switch_live.ex index 1bdfa16..091858a 100644 --- a/e2e/lib/e2e_web/live/switch_live.ex +++ b/e2e/lib/e2e_web/live/switch_live.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.SwitchLive do def render(assigns) do ~H""" - +

Switch

Live View

<.switch class="switch"> diff --git a/e2e/lib/e2e_web/live/tabs_live.ex b/e2e/lib/e2e_web/live/tabs_live.ex index 467de87..ec49ef9 100644 --- a/e2e/lib/e2e_web/live/tabs_live.ex +++ b/e2e/lib/e2e_web/live/tabs_live.ex @@ -11,7 +11,13 @@ defmodule E2eWeb.TabsLive do def render(assigns) do ~H""" - +

Tabs

Live View

diff --git a/e2e/lib/e2e_web/live/timer_live.ex b/e2e/lib/e2e_web/live/timer_live.ex index e4e88b5..e3d9887 100644 --- a/e2e/lib/e2e_web/live/timer_live.ex +++ b/e2e/lib/e2e_web/live/timer_live.ex @@ -7,7 +7,13 @@ defmodule E2eWeb.TimerLive do def render(assigns) do ~H""" - +

Timer

Live View

diff --git a/e2e/lib/e2e_web/live/toast_live.ex b/e2e/lib/e2e_web/live/toast_live.ex index f34cd53..eab9f37 100644 --- a/e2e/lib/e2e_web/live/toast_live.ex +++ b/e2e/lib/e2e_web/live/toast_live.ex @@ -60,7 +60,13 @@ defmodule E2eWeb.ToastLive do def render(assigns) do ~H""" - +

Toast

Live View

diff --git a/e2e/lib/e2e_web/live/toggle_group_live.ex b/e2e/lib/e2e_web/live/toggle_group_live.ex index 5e527ae..0d68f34 100644 --- a/e2e/lib/e2e_web/live/toggle_group_live.ex +++ b/e2e/lib/e2e_web/live/toggle_group_live.ex @@ -11,7 +11,13 @@ defmodule E2eWeb.ToggleGroupLive do def render(assigns) do ~H""" - +

Toggle Group

Live View

diff --git a/e2e/lib/e2e_web/live/tree_view_live.ex b/e2e/lib/e2e_web/live/tree_view_live.ex index 22d3581..ebf6f81 100644 --- a/e2e/lib/e2e_web/live/tree_view_live.ex +++ b/e2e/lib/e2e_web/live/tree_view_live.ex @@ -77,7 +77,13 @@ defmodule E2eWeb.TreeViewLive do def render(assigns) do ~H""" - +

Tree View

Live View

diff --git a/e2e/lib/e2e_web/plugs/theme.ex b/e2e/lib/e2e_web/plugs/theme.ex new file mode 100644 index 0000000..8593a6d --- /dev/null +++ b/e2e/lib/e2e_web/plugs/theme.ex @@ -0,0 +1,25 @@ +defmodule E2eWeb.Plugs.Theme do + @moduledoc """ + Reads the theme from the phx_theme cookie and puts it in assigns and session. + Allows the server to render the correct theme in the initial HTML (no flash). + """ + import Plug.Conn + + @valid_themes ~w(neo uno duo leo) + + def init(opts), do: opts + + def call(conn, _opts) do + theme = + conn.cookies["phx_theme"] + |> parse_theme() + + conn + |> assign(:theme, theme) + |> put_session(:theme, theme) + end + + defp parse_theme(nil), do: "neo" + defp parse_theme(theme) when theme in @valid_themes, do: theme + defp parse_theme(_), do: "neo" +end diff --git a/e2e/lib/e2e_web/router.ex b/e2e/lib/e2e_web/router.ex index f313202..1936ba1 100644 --- a/e2e/lib/e2e_web/router.ex +++ b/e2e/lib/e2e_web/router.ex @@ -8,6 +8,7 @@ defmodule E2eWeb.Router do plug :fetch_flash plug :fetch_live_flash plug E2eWeb.Plugs.Mode + plug E2eWeb.Plugs.Theme plug E2eWeb.Plugs.Locale plug :put_root_layout, html: {E2eWeb.Layouts, :root} plug :protect_from_forgery @@ -31,13 +32,16 @@ defmodule E2eWeb.Router do scope "/:locale", E2eWeb do pipe_through :browser - live_session :default, on_mount: [E2eWeb.ModeLive, E2eWeb.SharedEvents] do + live_session :default, on_mount: [E2eWeb.ModeLive, E2eWeb.ThemeLive, E2eWeb.SharedEvents] do live "/live/accordion", AccordionLive live "/playground/accordion", AccordionPlayLive live "/controlled/accordion", AccordionControlledLive live "/async/accordion", AccordionAsyncLive live "/live/checkbox", CheckboxLive live "/live/clipboard", ClipboardLive + live "/live/code", CodeLive + live "/live/action", ActionLive + live "/live/navigate", NavigateLive live "/live/collapsible", CollapsibleLive live "/live/combobox", ComboboxLive live "/live/combobox-fetch", ComboboxFetch @@ -71,9 +75,13 @@ defmodule E2eWeb.Router do get "/", PageController, :home get "/accordion", PageController, :accordion_page + get "/action", PageController, :action_page get "/checkbox", PageController, :checkbox_page get "/clipboard", PageController, :clipboard_page + get "/code", PageController, :code_page + + get "/navigate", PageController, :navigate_page get "/collapsible", PageController, :collapsible_page @@ -109,7 +117,7 @@ defmodule E2eWeb.Router do get "/radio-group", PageController, :radio_group_page get "/timer", PageController, :timer_page - live_session :browser, on_mount: [E2eWeb.ModeLive, E2eWeb.SharedEvents] do + live_session :browser, on_mount: [E2eWeb.ModeLive, E2eWeb.ThemeLive, E2eWeb.SharedEvents] do live "/admins", AdminLive.Index, :index live "/admins/new", AdminLive.Form, :new live "/admins/:id", AdminLive.Show, :show diff --git a/e2e/mix.exs b/e2e/mix.exs index ee79b79..4ccaec4 100644 --- a/e2e/mix.exs +++ b/e2e/mix.exs @@ -68,6 +68,11 @@ defmodule E2e.MixProject do {:dns_cluster, "~> 0.2.0"}, {:bandit, "~> 1.5"}, {:corex, path: "../../corex"}, + {:makeup, "~> 1.2"}, + {:makeup_elixir, "~> 1.0.1 or ~> 1.1"}, + {:makeup_html, "~> 0.2"}, + {:makeup_css, "~> 0.2"}, + {:makeup_js, "~> 0.1.0"}, {:wallaby, "~> 0.30", only: :test}, {:a11y_audit, "~> 0.3.1", only: :test}, {:flagpack, "~> 0.6.0"}, diff --git a/e2e/mix.lock b/e2e/mix.lock index 2b8311d..c7a1bbd 100644 --- a/e2e/mix.lock +++ b/e2e/mix.lock @@ -27,11 +27,17 @@ "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "lazy_html": {:hex, :lazy_html, "0.1.10", "ffe42a0b4e70859cf21a33e12a251e0c76c1dff76391609bd56702a0ef5bc429", [:make, :mix], [{:cc_precompiler, "~> 0.1", [hex: :cc_precompiler, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.9.0", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:fine, "~> 0.1.0", [hex: :fine, repo: "hexpm", optional: false]}], "hexpm", "50f67e5faa09d45a99c1ddf3fac004f051997877dc8974c5797bb5ccd8e27058"}, "live_capture": {:hex, :live_capture, "0.2.7", "d06d636b468d3579c30dc6be35fea6c2f805b1e9d4dd67d8d96184ec6852ee60", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}], "hexpm", "e5d176d0b90292683faf5852dbd67a2d331f28430d39624754e209da20378e25"}, + "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, + "makeup_css": {:hex, :makeup_css, "0.2.3", "abbe801a520b88a0430684293f98745a7b082fb47c3902c61ec277a0fb7b79d7", [:mix], [{:makeup, "~> 1.1", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "656afcd4e96468311ac9b34ce4c91bb8521a48203afa33982d5f21edc012e79a"}, + "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, + "makeup_html": {:hex, :makeup_html, "0.2.0", "9f810da8d43d625ccd3f7ea25997e588fa541d80e0a8c6b895157ad5c7e9ca13", [:mix], [{:makeup, "~> 1.2", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "0856f7beb9a6a642ab1307e06d990fe39f0ba58690d0b8e662aa2e027ba331b2"}, + "makeup_js": {:hex, :makeup_js, "0.1.0", "ffa8ce9db95d14dcd09045334539d5992d540d63598c592d4805b7674bdd6675", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "3f0c1a5eb52c9737b1679c926574e83bb260ccdedf08b58ee96cca7c685dea75"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, "mimerl": {:hex, :mimerl, "1.4.0", "3882a5ca67fbbe7117ba8947f27643557adec38fa2307490c4c4207624cb213b", [:rebar3], [], "hexpm", "13af15f9f68c65884ecca3a3891d50a7b57d82152792f3e19d88650aa126b144"}, "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, + "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, "phoenix": {:hex, :phoenix, "1.8.3", "49ac5e485083cb1495a905e47eb554277bdd9c65ccb4fc5100306b350151aa95", [:mix], [{:bandit, "~> 1.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "36169f95cc2e155b78be93d9590acc3f462f1e5438db06e6248613f27c80caec"}, diff --git a/e2e/priv/code_examples/app.js b/e2e/priv/code_examples/app.js new file mode 100644 index 0000000..2184af5 --- /dev/null +++ b/e2e/priv/code_examples/app.js @@ -0,0 +1,6 @@ +document.addEventListener("DOMContentLoaded", () => { + const button = document.querySelector("button"); + button?.addEventListener("click", () => { + console.log("Clicked!"); + }); +}); diff --git a/e2e/priv/code_examples/component.html b/e2e/priv/code_examples/component.html new file mode 100644 index 0000000..5b3ad8e --- /dev/null +++ b/e2e/priv/code_examples/component.html @@ -0,0 +1,3 @@ +
+

Hello, <%= @name %>!

+
diff --git a/e2e/priv/code_examples/hello.ex b/e2e/priv/code_examples/hello.ex new file mode 100644 index 0000000..a242b2e --- /dev/null +++ b/e2e/priv/code_examples/hello.ex @@ -0,0 +1,5 @@ +defmodule Hello do + def world do + "Hello, World!" + end +end diff --git a/e2e/priv/code_examples/styles.css b/e2e/priv/code_examples/styles.css new file mode 100644 index 0000000..370ec50 --- /dev/null +++ b/e2e/priv/code_examples/styles.css @@ -0,0 +1,8 @@ +.greeting { + padding: 1rem; + background: var(--color-layer); +} + +.greeting h1 { + font-size: 1.5rem; +} diff --git a/e2e/priv/static/images/apple-touch-icon-180x180-480d4b1992079367b6cda44422dcbc96.png b/e2e/priv/static/images/apple-touch-icon-180x180-480d4b1992079367b6cda44422dcbc96.png new file mode 100644 index 0000000000000000000000000000000000000000..13b654c12f068391bcd33dca896b2ac309e7a172 GIT binary patch literal 981 zcmeAS@N?(olHy`uVBq!ia0vp^TR@nD8Ax&oe*=;X5&=FTuKF%(|NsC0?8Voh@~3;P7pAh@?B;zP z{_}DL|CXlHv(~jwV~dmiGO;kDjpOpv3pW&wWyo%Em|+^ja#kR77t1V#YZZ1SGpzZ8 z4|ATm_LjrlKzijvo;2yLqE%v>JEgwOlTO|(*q3NF=lX{CewAi38FUS98^}oAF3I3( zSDTS9!*h1SAr%p++>dG><0aqgy)c})XH~0H^pzR!PpjT>l4WV~?_2gF;H;Iu0LR{a zo`3igxtibIYV~!x_g;vlH*mW_`y1Des2AtHXP)O(RlFb}xoBejO2xE=rXfC)IbLk| zux9csrUjANBHg|yk|dhJ$iawSieNtYW@?s`+}cm2RwQ8 zd7^L>+qEZ(&fl#R0^92wE?e(-t{?YIGvki^ftRv3#6|aZEG_u+hvELsg?HuMa=q`y zT*xZ6eRV(DqGo@?>7_Rxd8b5WeRVKDT{PjOf9jQ$2ZePeew-(KzTD7Z@k8N7UoW0& zRyVEqw$O4QA3?z2a1ZW@?7iUycLpw?E!FC_BCDmH4Vht9{q4UA}D5S)ceG zm9Bl;-fWTWT(o+M%s$_fcYV#5J}FYOPhT?gWavl1i5ISaxMK1D(xuKRu3875I_y~{ z^J3b@4_X_J_)eR;mdKI;Vst0K)&*T>t<8 literal 0 HcmV?d00001 diff --git a/e2e/priv/static/images/avatar-bad9d852614f92cdfb9e547ffaede5ae.png b/e2e/priv/static/images/avatar-bad9d852614f92cdfb9e547ffaede5ae.png new file mode 100644 index 0000000000000000000000000000000000000000..cd084b01fb7ef3f1c2bbaac07ae43706caeb6352 GIT binary patch literal 29586 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 z zXOT8ceZ4AcUfS!eJm%g_%poRzar*Mvx!*5l@v$3gH|mE4-z_8JQ^)Aw^ZG?O=FVGE zyozea$&V(9BC`IUV*6L-U*8>D=Dwoje>{X7R+ff9LL?-%rdP~QYYc6vo{u$8ycXnJ zRI6*(DzqD#7nh=~PUTw(Wi@#Pf5c;^_v_+NRvrfSF5ed#UriYki8#4>q9fA{pWlu{ z5nU<5Yv~P1ic7-9^{bX$s^w$%vXiX)don(s_Y|*P+Zt!MnX@qBQF?p=$_@(VNKKnx=$gM59u-;+Mq++;E- z?bW<&bZ)c%;Qf)6Ry*f%q8W*bD}M%qqhc`Z zU5jIr@&NBnBm_{@SqALitLoFc?qAwja*Tbvx4@Wt`-y!@35Y)w(7!1yv@{Yf{NO?aE85ur~Tr2 zf#UP;3V3C^eK(48pIe*^$=2x{=o+!dT&Ub33ch#DZH|7}F5;U1dW2f`MgO&N&V`)L z9naopHx#z!FYkpF1bU1&yOtF@y@_vl`(`jVyK+N;WZduQoA+~4BzUd~-{DrmGAlQ| zduI6yr5As{G`X(Y{oeLVb(G}t0+-hfsnMuXL>=`Twq4q%E)w1C#Ze84YM$qw7ZgMn z5| z2t^MC3Ce0AXaAl~joCg*+!r~|p zf7>WOAVOLBmfW)T-`DomTV12nTf2V57VM(ktc>GqnoGX*)ag@{ zfAu%%{s@sVFa?C~Zl+9d#N%`i%dJB#LT+{AmeUO1o=yuL_4?hpS7l441b~~mO7N4_ z%KDTaUD7)`MiccTGt>Vg-_jX;FqZp$K~lq$6)r}0T(L;|!{U`xUGX6H?ka>@oPZ-rAN@$ETn1mE(aw!xK06k zSa;LPzJIcvcgZtWJ&)zL+U=}Gdz(L>3?zNcPf9^>#`76r+;iqaV%>97Pr`@i%%y%g zMKWjm-5dvW2&xKYkziusrjTsH%^sb_hDAv)6WF~OQHy~;sfKfFmrBj{kCa=+YW!Jb z`%jL8yqWNGJ)vh2?=|0gCQ%#k&t0TXs-iv@UUpn{MdWZA$P2m#4V3HVT?~8_z@*;b zuryD2@rciysKj>O$(6z=b^EuqCzxN>EKIZ-RDR#Me1XyE(nfjUfIr{ScDnJvYuS$^ zZZo?mpe@BtQ@8DQAH8R$Zx?F@t+LX^w z&-2wW6N!1=A^A>QA+WYKQ)g`J#`xowJ)6VUE7|JCYhFY;^D~W{yMOgX0Ip{RPsZ{+ z+aiKNuYvWpO@3`FKy`;SdF@3Lf#zxmt6|U*7fwwD68LCPoapf3x6(tBXWE% z0TbP$tO8}D>;>NY8;lubJe2+O=im4%+?>Yr!$2+Hfj zyz55QIi>1|8y#Kkt2E>f+h*@G1bL_6zqKKq`}AmMWGamElmrE2wlVs=nIW+i-X`I9 ztp6&suG6`lS&pPo*vv3i;aKwMKmymy;&%!%?rVLzl|dvDFWx>lpflnPXv77)y8v)? zSMjlJ?YX~LEEXJ4mRSXfcDHT%-!F*<*&cd;6)pL$Q&TvLanPidGmd`p;`@BqME+s^ z;N=-09}v-DS90G^iYW-EIP<%m=HXupUb287`&d&<@mcVK5-#xJ!NMHN)m*j+L+6S_ zO?#2gmpFV{FWx{B%Af68iT)95z2p}rT5jsOPhIbS2L-C#5{;^Bt0}99{LB`$b|Ocj>Uk?T4zpXk*M3aODU^JKOKekYxjv z9&a;j;EMgGMIN=mY6Q2j$wxOl4nN&)UL~df4b3K~p0r%CwRy!3xs@tAkdno+{88qf zfhPjcslyFi({<*q3eE>x)wF6jmGJOy25$EMm4YO@3`tgA5=$=N`<39fQClfrkoN&h z?EEf!CmF41rn-JDOeKGWfsFQ;&CApTh*2P+LkL{~wN`EY`Dj-|L#OArzJ}C4Oumvo0u5RKDieipT#6R-V6V0HX@RWv&1m zE!shUX-oT}x%mXiV(}n2qn`B$op(06fkPn?=K; zXIQ3us7e=fM=3eK;dQ%r>#XYxvi$nhZ~3F$-{>Dmr^n?n>ggym7#T`YP$4U+Tz>WS zO=};lv7dnf(m@7N^#54Z5;eu{{uxw zKL5!h`^L#4^~|Ozi>ymY`te^?_{@<&v(A92kt__L*})5{-3uF;9MXc-JtTkd~DD%U0<9~cwdqO4s?1k>f9ll+snUAew0~0ekN}~It-c(8tZy}=QEN;f_u)n9G?bOtLOb((Ev>ibTklV7xS}Z&y{*rZzvsa`T6>_&MC(<@F5Sg znpjUaC8nzFRZ@_v0e>AJ+?BLyoi~jM2+Ub^{63&Gr=%dZIB<80JsL`0y-$M0wXXi; zHSx^)8#+Epazp6P>RSg>ny+wxpMVkAsrZXG8nwArOf%k#2KDwIRZN8xS|G=79*+C2 zKCqoz>&wHmdrw;_IH7?UKk~JjM$hjabvSesTe)azI!6J&nc{GTdIIOq=nWk-;H1o` z_}d0r8ke@2*l_`+F3Xm%D0az}doX~V2Lx0%=U-9Io{An`D?m0e#uW- zy-3Vhyr*=W{BiG!JM$&pHZg$HL;GA60L%+nn+!?OTtt8M@!^cKVTWH}=kl5Ek%J5| zLjNxN_1xTRkBZI=+8gmj+HWm3^Pe<0akNMQ=rlg@7++^Bn_;=)6kINLc-MTVCtBhV zO2Hnl);HMuQF?>HvuXGE*S)>Tn4PaZnWq96nVW#rLq{X0tXW);ELX}(UsrrYN+no-F@WkDc}uEOBDMO0IudLK0V_Z z9JKv-lPMtiE_7m($=@xl;gIaa129N*R7go0d84mh6Mdb*@o9YZ=C_bTT0md|%*c{+ zh7cm=sbOx#gV!}_DQXbdmd8Gy;rJ%5tZ2vF1#T>Kap9KTeAfjx5p41*kfy*cDWx&U zgY0)59Bb@)mh^z+;s#=w6s(QU9R)~^4BO8p{w0TTx*o=T+$%pm5qzV@$^s}!V3N_7 zCBT!1UG~vhH!%J#$ng|Qx(9o@G(QYZe8Xoe&F&)L+U-uHJz|H9k4XR+f&oNu^D`D- z?>22od+W>x!T>t z0iF4Skb+0|_H}72^oOTd(pMSpjeQR&eQRhQWGi;myvl6`l_(T|7#jDStkCQr>CRKY zXpbw0hi?=$76+WLc?}u@90u(mZcmTZUr0JuBOkwqBDG_Ze)}mkNS!G&G5;Dp?xacF z$-$XSf2ic65+vPPkjRJ~_>{uXcca2LT@pjML$Y;#BHQ2l+*^FO?ueT#v>a0UIs*wa zl(2O{GX6m!3RJ)B$0M$GicC|3>xZmqT*t?eQt=Qu5n+UDTn=x%GX1|R(5`KJdyK#) za@lXap$`gqLMAp~3Q?aZ)dhn+OF69R#}Ei@>NDFGFfL-3hm))8boM>z@JvXgc`C5v zf5^>sLFBm{_+gQ8+X;wa&rOirRD+#Xt_uulf(LXaQ02=XlAz!yVWgsS;W#?^Ff;C% z)2I8p`OYUH0MIBNO2FFsfCUdsXc)(zeSExgw0kS!It_TNiXFX*vb^ns)^is3 z77K1(9cpe$-;C6Hw`cN@?BYH*07Xg<)AP}-X)kP&Yat`^!1sD|Hx#AJ%@yB~ zde8J!*3XAI&oH*sJJs4gY zd+nB`-Zad(c=)H~;qMpt@lJXE^8if_^9V-*=vI)(dwo!Y6C3&eZ6-DZkYH{2&E%VV zMHXZ+3<8Sp+qYAYl(0;<(N1=-(>BxFRl2ct;`b0yGoZdmUGrJz#9kU*Qs4=uisEYy z?#-opKwABwHzq*>$Fu6nQ49~K++YAN4G3HlS5@v{F>9a4)K)-=XRn8&`H3sQh|#X) zWdnk2itDyXVo7>n!WwZ7vav|9>xKTz)y_pc*|*wXz0-e+Z%f4EzyM+y}(8Yx|i_hud!#q3+9kn*sHGkJ34O#P62%IpP z`w~iO*c0_^_*_nPqyg{#nmK;2st-{i48=Fjh#Y@7ISJRa10Ww@OQ3^jIKcn!et|kj zoosl4g8cvZoCXaJs9zgsYk!m!2+t*TfzME`uRsZB00PP(Adwau`F zT|OcR>ewbxtTxt!E-8Y97tb_x_(+e!UiYx9P(l&JwiZ~l({^qr7*8V=_@#cklXwCh zGN=GE0HJswH!3Ow_yt-?1+ETS1>vs#n1mEFyW=Pdq}|Vj$X=S)Ro$mP>H=ULmi4YG zOw#|@P82=3v&_8$)>>ECB2T!cM8Cek2dKaa>;j|kO9R$FLQ41BEFnbEC-$e4;uX5T z8II%00##BRT;d@UaRO7d?3}tN)4`LDnKX-_18TN8YVe@{H2{Z5yt^j+gTRrpG+NKl zSCsiuvm#OT^QTG(TSWyf*#W3t3k*Im$R#Xopc@9-03d~Zxe{YJb+YnKm_DKTI?oa|tDK^DCSkN@#55};wAnVt+|CpN*Zzs0J4{;n8LXh1WHs@!;k z9i=xOn%ubatYeoF00bQCLNSx_>wXwMDANlKFgzd>27i@1+f)3Rg9Nf6l?sObFB(GQM~|!azR{c6=lV- zOvSOnq_QTOKkCWr^3SBuP8%B@8DY|*T6(hKk_}=0p7V5}wseLL#0$*Kz{#8+%0B<_ z6F$40g9B*ojYYMAg>~)CLTO1st+ytlGZ`qMFI}8Z6hixQM)c8t8 zvF`Xdr^2SU(B~-pyEa4ZRu z%3n8U*^|bbQ6BahK_wHYV!{RyGM8Yn01jO<+06{_Iw0#3(sK+-V!T2C)c&PRXvMg5 z>~iOdm3V-3OXj`&B>u%m76AVUWYsmC=Q>S9Db@${PiZaH3pKc)e+003%pA=jc9F0% z=DA0i95w66o}<4Pd(1K@0FDFT^dUy}ZRDP4jqe4(27nG8nB-6%1>i5A*HX{ph^%Iw z>X=siv=MbO4eCCon>o?O6`opm77iFmq?66&nUHFqm}vl-4mcoTqaW^BJwTTXEqHL` zKx-l}G@qu<^*?4_Dt>#mFo=Eo*5*y<%(}bZltI=VD0*>Il-#{F(E(tYVOU=Di#IZW zUvh|Kol*1CqtTexubRHVxW*f2Q$H+{K?@@Af9n{vn9s>{B`e5aPQ+pwFWAACDpYR* z952-+;<*1*CztJXQScX7)^_oG$;JDZ0e&Cg)z4`Ou#hg1z9_#y0=Uq?Jr3zV#H(Mts2-GZ13t(9JEY%!5YKQqLB=37CX zHaC9ag6>M^QUM-19^5rrK#Ddsd9)y+RKE=SQzO;J8?BywSbYSkNdhDp2?MM!&gHL< z_bB*}KeZvnV(*xBu)|kMp2E8sbt@i?J+G7_>d=h1=U7@BHUIW3hXV8yw8@c%o%af8 zgF~4e5@48tj~e`gz9*|UD0x@$Dt~aobgHT4Ls9@_)Wu9!-wy{-&}yW>`Zw$(pr0E$ z!U2o`($sm2)Enp-3g8`L_=e=FcatR*u`-G#g!NtBV1#6zIud<0JTM8Ts+j%=IU=XEdP>F_k{Qh zOAYvoo$kX3P=OfxU`=S2;3ni9FJm){rh$+ezxy1`AQEvTs6TMkDN%JE)G=TE=D zjRHT~_HLq-!{RudAv_o#$LUJCE<4sB)~k)~GN52`FGnKaqTQ8o=%=V=b-%v3BJY zet~UlMJppT?_5ZF-6BSZ`2u9-KX82Pfgk`EU_gl%rf}K}mc@4Oq6O1n-~t>3K`4DD;Q%4PmpwEDbrKv4Df&n{8ER7jIY$xj7pX|$Z>fzR$P$C`MNnp!4^stiPLeeD&SI|zDLl~% zy&2I8`5%gBFT|m}Vjb*LYp+n|K`{P=j2YTUtS0-)T0B}JqP)h#)I;2R#GnHm7az!C z#l^qZ$4qTg*qYqjX`MRG%J>R8|^ zFLCX;@YeK->AMf_x@(ZO99DP0Rrw6xEl;a)AjZ(lii=fXK1#l#%WO{^L%>;Hyg8tPc^7z6sF^!MfDW?y&2@)D zV$gtHAzAA$g*GYu;W2*V(Xe2J(hgcCeO5O@hyob?67OvjZOHb!aGhOm>mcMY+0Bfs z;>K||0kpe+Dhi1GUc@&{v{AvJi{>RM08s?`AMV4WR^yO@mA1T4*SQQ<_KP^W=V`{2|jUIrGt%w}qDu>NaN(^4Fex17> zajV?*`J1WLIQXX>V!N1S_QQM$LEykZ+zrQ*#3Y|(0qvKlu>zpZ)rnZw1jFVr$dizM zp=G*oL8M>DVoUnIi%Y%r>fT3n`Cs-ruGt(ZdBZY4pz{KlDL>i#kWR2$DrgBj_a4ex1VT7vlHHrttXR3qO5deSHE- z{uJ(dAt1))45;es0wwM@6#@2{D}Iu0DwPz8Kkb{)f1C6lfu~&Z{rcqL+}?26t``Xy zK5TUKzGNd^b{2+fR*hdI2T=IAIe@|E78D=>3BuJ^yf4SDGQsItN0Cj8CMA!?)94X% zCwE^GIRXT_`c=5k=Bh=f zjic{M&^85t+CbB)zfSl}!CRw@T|(94bNl-x=0%PvLD>WHtr~gDpEi+7F2fa#y9%nUg=IspkU^5tJn3xq+XCb|qB2rv|Maq(NptPOJ%tl%61 zs8M-GP=L5|cbHkgouEXjQxk}!B_>|M0Jf0-kQy<*$#A?x`zmP!xOp>ClrMU0qiwClw0=9bcy@TgB4T_op5G<}w1jp{UD zvr`gS8}pNu>)M|YU<{eCXhb;ETbA(` z0T@{o+HT^Ye8a|eL>vBA53T;T=xwhAgS&B6Fdg4sNjZcZ-RqxR0pS9h)^{Osc_8Lq z_mBuvgPn_lTS&Ejc?BJ}lc8Od0op}p-+BiW1S>b1)!xY!(Z{!Hn=t=UIbs@q0^RU0 zb?49hg~K+jt!&BH?@E3=sH6w@bHKgzPhv;_52T3sqv(Ik!yG^jbg$Xz_oqK zelG)wbv<~=0Bon9Nn}#*Rdw&`Yxy=f0>Zi@$7x*G-0mrTrU-DA`U3wYBgSd>bXbRu zJ49~e0?wk7=E9e6%u*SEY0OS*>v!>3_=i1Qu47B)@5Scnugn+v!6G*R_CM6Du>SkNSEc*bG= z`}b)A0`D(gk&CD1(8*d29Mm1(r0fJF2!*8Y2@YKt;cr$u)^w# zisTK9@8cx{*M*m(6tr6Hz3M}oZ;Go~ceab>qBtK#3nJy$P2?EP4qiAKEl>3S17Bm* zx)Ri||8`_iR}~wob<%Er+g;uxm`A1)D)SW;p-p#I%$!_Yt|VsbymEL* zcEp$IlAB@`kaFio1&u?D2MzI(SJ8dZ(MRK|Tl2k=X2cy-;{6fRqp`5ON^!Zr_9B>) zwaV(ZAIiE*u)i|*%2zkr6DSBj9-c?#lggtI5p{@dOfsy* zVY1GJfU}fOdh`3@ zOWnMt9%57E!S$4LzB<|r;JpQZ|Hv$U#2=7*7dc^suBv(5aWLlTwFqU(itLN1la((H z#EINa$Az@_mXjV;{z1$6TgyKc3=J(9XK6_TiS-9GVTVM!0ze3Tu8w3Bwse&amVf2` z%DC|8Ne<(2Y(}a?{2K+C@0AuM4rdE38(-4K&#|nelG5%q1-^fW055K>)fX>Ef4hkK z3BViJg)tt%zw0ZOn3_QxO{vh@^vYnC`B8>Gi~~%#Dm3o>O*0^y#XWXv85d1w3vmV4 z>R=E_zVK!NLXtzg?{L``{=9V0t?9IX=%o^b2yb|)D~iW&ZYc~rg7A)X9@|miA}nsp z@&*$M%i{nz2gAp3MiwhjK{5V?yTU)r*w9ZWNI|Trsej58PqpXg(LHQoc0!5tIsII1 zbb~#-)k$5wG5{j8AiVN|L7vr+B&jsI_@X?@_S|5Nz zrA6n#L#iA=8VfhI(t@9I-CYa+4F&;XIfnm>DJ6KOAUL;+Qxpp|-MRuA4v4qlh0_;L7N)d$oF z^FV2q9`NzBzW}g2pvJ~*$CMOQ#|RknGX;r7nF+os%Eksl_5iPTYHs)d+%$Odj9ag` z$xB0~v-}=(P^E=uCi|v92PTvh6A*X>|y{R3y3|Cr~^M_=Q{_y zETtp@*b(^J|5mtLxS{HJy29Y`vdAP1w?a`2KegD+lzd(|mp*bL_1l+f8vUh;tA?d2 zwR<7ou6z&sB}v~-L-DImD)iNf_517i538B>h$p%~prRH%SP4>K09n!*`g@U!2PRu=x|Y_lkJAWjt%DlT=`=Qu^$_&yI2T$rs^+T<=V? zEe@M*x3M-mv69b5kjTo)Erg{cdjx|FfVuRLmLc&Mlq^$%lWD8~&N^V`&e2NGwWxg| z_!`519(t>NsCU+xr-H=EX>sA@Z_zMH*e5U%#Iuq+uX+s=gosg!0f(I1{5*hG9f-V4 z)RSy^*At%;&CuS;dA+UiTt!v3d!SiXR!L}v?{RAa7aq#@*T)+kD7B1FOmzZWOD^i4 z(^~1``%BPRq5my=^L=_j{ukY(raLO;Sv9X;9m~$mWN~vDLR}L-q=~M(%8`v^EtxPv z*H;Aqq5y6$l$VMU#6>|kNs+|$4DwVIWxK;nvx*v?KJK8wkb{!9K{T!T%7-_2j+4BE zF+ou+nX&h398@eQ5cuopLP-cGmND<)dd$uOpGXD?gl*Pp(pLh~rr^c;FN=1;x8Zwf z>WBBt3qG&_Tz^yGk>vo%G)>hNz)x#bpeN!&I9G}FxuFURDZv`+D0ZZuNHu;$!b$MM zU!LU0D-BamN`ZqADr32T*!KDy|CMUWDL0k%yCA`M5DgM2!B2Lk;m;sT$1q!^wgUFtjfPd_yWUrf z(1h;eEG!_58nkTOj`{8UQ2K=x>fiXNCmxr9!{aU|-in-|?T~bCeu{?@p{FG_dZ$9d zbnpCqfWHmIgf0(}0O1^RhW0$F7oWS>^Moc&CGqaA2YntBk~! zp$T0#!9?h(OgzJtWZ&>A3DEHgk_jA=LR9#SHt?q{A-4bt^kxwFEuM9C%JY<`Wp03P z1bTYGY~bkp_e-0*u3(2`@dn{jlvKQ_MdcuNhs;Gv;iYyvF~;DZ;q2*4}-M)`AYG+vbYONsntSF@dmny)FVPfR^l z_@9Jg%plRQ5_@=_A&Bw!zwlUuM+Sd&5-j5x_8x|XsW22ECaX?80{EvmB@$>?F+jdU;lK0cv)S1J z#wZ~j{icZ{V%*_+u zzAP34d(Y>mLN^u={1CjcHYIPn{^8aihV?WPhTf5^ZUmo+zpc>T21Y1@`!sRt)thu~ zWQC6W7T~{u|3fYSd@!8GPj*#T@2;5~3P?!KtlNyJtjmLjrvD&52J}q3DWO+GnLEMO zx}6OkS8tz7hh6|7p7!ZNVY6K(8rmmL54|rv6>|)%&FDmX1P`5MC3b_#m72zQClK}=OMkWylHv}ESQy$ zGO!mmgJzJ^gpRwp-QSt-gi!oStT{HpK4?xffEiLjsWVIXGa<<1xq|G95~^B z^(Gq&J^F_JxFZNvpOf;<12Iikc=*eOE$CpiWQ3d^Z4C^{Kf4fOy??(8a6VCA>1wST zH!XrBtGe0c^j8I5A@Rm6>+_J8nosKeC)y)=cIvh>&m(;4r`~1Ou(bAbF45}@=y56i z10du>A<}@8%hg*4A0L{q;G|%tMrADOiF!ImSoaZx6SwYD?9^nSBx% zFwuNKQ@sO&8cEE#-VvkUJzWZb;GZYaJkLrF{UCu0yCqVY$+`syOmYXE@yiQa3_o=Y?eGJUzJ__X(%@*{UNH^jYSDSKD+e4M=QGzu$mOaI1VtKOR>`vv;snM9qHKaZ&@&!YfnxG(#fB!u*q-p7-s)teW*G-mR7n2q zDU37)7GwU64s~jgJSZvk3mUDW05n#FD?vIvlSdueU)L zMBSYox}4Mn8=C0xJ?=wDWr>?{Zr+OlnR&LkXtZ3Yf*vO>1fDkh*pPdPQ4$J2DA)BW z^cktrJpw8Yz8}ZOGfhQktybeL|TifKAeFVLK^+7$f*}qIyk_LCI`&)}cPamosPw z>tAm^cVH6q_`a^X+c()2ApgyR`25}`b3iK}vgzV+ca6Y54P?V8*Ydz_G0^OEO zXB!?5GOZE(CqmLE6U1L#!9eOhfdST?lnBHBxokF)%R+8u?~7~ts`pu&d?l3@?kRcy ziC9rFF)@sCzn?k4?*V*CqfCnlGLq$z@a}P7*!YnuRQfeCbeiJ^(xh11N#C3}k@`HU zxy>&SBs~7LN-(;OTv*cekmt(`CTC~FTonh2D7OfTBe%TlB*uWLKB(KnO+Pb= z@pC-D&PVFdU##UDZ45#m=&Emu#7W+jxiK*B1F+`cs?DQ~<_NaC%#yV(j-S>La6qQb zaD8UGQ3At7kGlUiFz0Cpo1?>gzwU3hOawfp3>2W)F>Th|kqUp%dbd<`;QPUFFH=P(z(m1hAoI0nTB_3LSuRw@%CkRE)G!`micpl7 z6A~lLUVm8761CFu^@GXA8XYVn#dt0pm(QLFAQTltyPGSe z$D3W(yX}JnC|^W&L33i|nz%ufYAE(f0}TTLMNl>4sr9uBjIL>>-y60oBxAT2A#cDF z(Q|j62t6{VDSAV@OtmHQ%`zDFq9J6s#XwJDNeI?!e?5(?Gd;|y(Kl3CY!EF?fBM$x zYU}nmajtmv^}+p9bvNt|boK2#QW_c{T8~!b$4iPJq~%;t)=d(yx2@$$nA)tXFHNM@ zncJgmX`sPMV%DcFqCgH94McyaUbxe^8Pwa8d(tx`=Nd(rmCMgRUIg~i1y1y8y*#^z1liJ{+!Uju*^VV%tPb})T@qC-hkn$QYrH+J3q1QazI2ka2HJ9p zil6)?1QcUNc`JnKZ(fBcYgCYtlGipmEL*c4vj?4I5WqH#C)-+|DOzdB1xj>w9k%fr z-?i;I4{`CDwm+5zeIj+rF4j)7!5+10Q}%aPh(pI&>Pm8Ox>>${V~zkb0G#bo+20$p zTlRQvseVad+NJKq}dvG2NE5 z)NS3C56vynknCfc52^UDkzo}dzm+Wj#$|9!ls5ta4@^*3NPv8Ome9tzB!Af#u~wf$ zZI+^>k$@M;@Ra_*Q_b1~Q@^ym9ht#)v2mJp`RX!$#!o$*^+4Q`oYcA4m>j9hAzlH-aei%0mjnxaN-3+Z~^&4!u+` zVa+Y~h7_^$1#SG)SQjidXfpLtEQT%aGktZ%*~nn_*OX{gzt*4OUOzSo`!qC5O9*wc zy$3K1DuD8V;QJOqlT?BFS7t}DvMJW_qi@#s89i^F~hxKWnkm(g z$bjsTs*q4wP4Zi$VBlL>5u5c!Q$5q+%_T-p5;PZfLPf^TajObJbAVPFJ)hCNyN|~0 zp~AsPCl#%(e0b)e!d1S%70S$%NwFGWL;CxL?o|7lQOIor@Z#1bnc_u&; zk>uRH*082vq{}wQv}6A8M*P=<>xA`($d8&?YQ58NertI@=KaAp!WzRCI@WMxNK?e} zyaDp!#C^|)ho9i&j?464*6%ZG&CP}8P8H2cbY&z+@`KQjPGO-xe)IA*J&`)hNLHk? zG>?qBI^%R=I z9(PUsZ}h|?QBaQ{-wd(U?+VOFn+)KYd3$c-j7C0PM15cm_h;p-UHz3l0=Y!@&mXZG zl&O~IBObr}dRsz{AKqTirOYIo%3t*kX02)WIbi(d=EA%?S8-7SQ~eb0B$W1D|5Dph zZdztn<0q?{y5P6P8#j6Fu=l1z!&yh(7!Ww6T6q>4_0os3)#PKc-!#n|=b^r|lJdh_ z`P=g5{f-~E%?QezFUz#{#@r$gP=626cccJd#3F(we?8WERTtS*77EV*!Z6vOpQP^Z z*Y>>v!b!aZjh&25-G)}I7hm}Y^;32X-7aBnaBxIuAg8R<^+n{|Gqo%$^DAP5=HXT+E&)+QFUgBE| zM_i=Sr3w7_{wv8_;73IjbF;BDtm@NJep|(wlnWgINe# zKR|cW;LV<+jVbXxUna?Gw{mX9XGMP$Mc_lkDGkULW#Q^-~hGP4y zC(}qK)tf@|Gp#Ckvxzy!7Y&xPg<62LYx? zKu%tBuvy;2AQM(mCevZ}OjlSq!I6KB{x93D6gS zuis5!0Dc4iUECX^GfA|0-%}56-|uzP$R9wFB1cj=Io`IV3gF8==X6y$!v_(#?ME~L zCWn>P?)NjA1-S0Sju|MZqkHGK@w@+K|{LioTz|zEk|-K;bF>7icPfr3-77G^RSl0 zM&M+?L)wDA)I%4@j7Hhg_-?s*J0Ru-L3Q*2_slL-7b!M{w2>}iDMs1z`=yrwa;!cW zI&MY{LUz%VCk-NLtrZ8yOLfHKp$9|IZEr!?D-xyV&WJy_m`9d$5*duw-Xg4P<({4R zRD4Y?%vR;6&&2xhtGGjjQ9JH0M;`$4bm+YXu^IBXTF%Kk^dANtq!tb{AyD(B%W2#- z6^5M^r40gw0Pg2F1wdPap=wTt5c?Ql4Ud)%2Eq#$At4061_T7RKsex%Um*E6!b2-K z+puIWkwrbw`>(&t|0kmCuhly0@#2*ANk z#5%cVUWjl3R1FBJtn@%RhI<3{R!%Hu>^=!yorOSxbf*c*-We0ie zym;5z@C!o_<_6KPT1HWKMZY0+S;^{x9S7{jNR@k;$6&muC^Dv|j3YsETSRWOv__Uu z?!)#E9cT~VNcLO3MwRU>8Qe3k>}u`2{k^YKiqbgQYwS84_W@Wgu=45l1|f=fYTO>e z+FqnSlrMI5EG+m#=jgJSH?Sq;I6qSm)BOx%W24;v?Z;&Zzb$Qn@H;!qcP~j}i#|Qp z?;^zPel5yLRG{zy)3vC_v=`oInale+ImtsX$9-5nzC4ouDuu#Bw$r)Z)bJ%U13H*; z=aBLn!9S{OJnPk*rHxvTdUI25T75&n=LyWclOYJMP%?7%X_G4nw#Jt(J76EUk$i35 z;Rje)u_j)tZdi^>w%)B=+Bd&f%?;2lfI~U9s2o{Fn3djN z!Zi4%2gMs7?`M6px*ehWF%-b}x^xts@nFr>`xeSMBrDvz+qqAEFH!J|Smzs?e5U_40+GUeS`Q8qNw?1Ofr*iSO$hi#BY;xS_K z7e$QeBaIK2&b>4dk|1I?-9%|;G0J4IgXib(+`;dTDRZUmWfm`2lnMdgAE92%<@ZTo zOu-^((UWdWpAfz=NeUx-5if^5)V}_bS=7A)D|86t7Yf8ts&)cT$mD0A^S^f~%_*f(t@f!eUByQ74cAWl7`1{&z zZHkPtp_g0?Xer8}Y6`fjkEc?+*ydbmo~<<85J(4;Z!Ns;oyotQfFM;P4LQonoL^v) zcK#01-=e3_4SN*q_$oS+0;JG@Z)J(JaNDPxXVcbi<0J{8v$n202O-rE$T9b#+I6R>3}{sx zv7Mac#qBVZ|Caeis1NVR5^~zyo>|e!k`CcnP%=bdhZ8R{=O9A7s1{=0&tq@TkSmJF ze%fuAB{QSq9Xp6bSM(u?PJ@?-aA(024k=Yf3i3-lWN7K;m-$JsBcGg|aTWczFqz(@ zDvP%U+G08DpO!DN;3f^hCA~dn(GySHdxhX|9v1vo!+r6Q!IxR3kXu%MP;eel{z^EG z04W*6$HIM$aH^D%ftws~UJA%KJ6EqO^ijJ|8r#xVH06AgfH4e-i(J$uD8;Q*P0XDb z38UQ&AbD&Ep!i-?5C?n{JIPBzsyg%>R(527_1SY?Eqt(yq&7aC9R+Dn5QtA<*qK{- zgp-uugnqSCQq6=_qhFvrR2Fac+wjPaIRt_Pg*!@><`l6W{8vWzd`Ln+YKjxXnp^Dq z%lRhSgb~;QIKXS}-+_uBX>KfLWayuQLa8#WY!n+4+aHq`&NOW=OYV(lL8d~vRM2sK z+`yX;UskhH)l)*wiXo?muKgJ^&2xKF)t>pGN_vNo=mA={u7uxN{_}Ybs#@n~tTpnj zhvD^mFpHRtxWdM5odK^QB9{a-@Hl&4%>3o>@a9Jm0m<@sFnMsFqTVI=!Xkekb#obw zk+a-KZKSA&g@}~eo~`RD{ot|S5XuAeNGby8kF%q&3bmtagYRd^WwaG=UPiK}JKwa8 zFzk@XRYE-f^QqUGbz2`f;Td5D>IN%kQdSx;3iNP1Pos-U9eLpsX=CGQW`G8ucIEK> zJq4|T3@68m<>gc&sO*pykkvyp6|*dJjBpo$Jm!ulTOQ= zDMT{FS!)l3Yaze`B+laI_BYxym0I+9(ccaViZ)7LBPI5{TB=xQG0%%Uy|z-6dgjAx zfaA?BF4fo*Md=~0Q?RUhp_10NedwnT-=phAzb~6|Dogu2nZI2dJC{|ISLvGaU1`Db zPtWZW8-Ho3Zj*yQ&xBZMuR%!Wf4L1CEwVJzJuu4n*HX{NOdYxeskG0LflXCr?HPwP z1uwo|eYWolZ+lr?bl? zvA;gs3)ao^?7^p8_aoA#c*^3S);obEKPH&wt<2lQ_7Ld7vAi+={pp4p z_v`-#Vx7HPSr_-lhfdiNFedkCpw&qXw!pfNRR<;b?o|Tq{gjOv&dRC^0nW#gC}KuK zN++&J*NU6t-v<*}-->UsUg7P!p1B4V6tYMZg&q+*k)S3qgx18{2IO15r(3F0gU=;HIW;C7;u*8eH zdz=c_0}FI@sFaa$F_VU1mvzjYCg{CV<}15H_gq5z72n^Q80 zH$%3$uCK_*XyNA;z8ZCJ&rWnC9}X^vVVW)xmU=2R;rL*=SZJ(pXCl8ZJ{C@MuHW?KW{2Gi-%eNxAf)xs^;DtG#8X z_R^}Xe99Sdbn7*~VY*7Y?WNH?legwrw?`QH(U8X+yiL|g2Rrm#*I-4F!fkBBTpb}7 ziA)c$)$55i@;Jm(V7?dv-9z)LbAL3mIi z#AA?~0!|`y*L z9L`DhXHRA2o+@z-j38^eUSx@hvxXU+>hfKxzEJm#&>=e;TeH%j+R2S@qa{zc_cWVD zkNyiMh+Ap1df~ML8Mz52#&f5086N#kh3ST%DPPB0o9w&xLwex$ZQ@yb zQNH|$Zq62ZLo7oMc+a1kL68wxHfWZknwWKlyT1QL@Uy>d=NF%;)I+mBQ>vLS=m73A za1$aEkCPC)I`s---S_|uR%a##EdIFFhn#}&{x{?A9Fo>chNR5)CYU8NGS7=Ho+omw zz)4!2@3bqe-PQmV2i$h^rm91#DO2o3Jr7(w0!se-#dQE69XE%Kb z6Jvi7aC8wI3+$8a%$pZWfMuL3$4_g{h@uu9uh!eZkSqo3$wp=o5 zup;EyB7r{%D)@ehF(|j^`G(vdp>^Axn#w(#qkl_NMW#PZG30tgPxSbl`zAr5#tvks z1p?57$bPL;8iHMI*QQy3jma#xJgVjWM;84g%1yFSrPW2o#mR9eRxdEKL$gT^_p^ty z@{$KjLLgfK7`Mwyqulw%j`9YMY|hEieY=2Q<+J;?$nQMP(pa+B-g^eH0w)kz#chAR z@giK}F>t=Ye-zgAnLsZm7}|-;ZC?{4wHw@9`=kd@5bH9~6fpbHVc39@*IrbuoNXr{ z33q3c!AKzUX25HB`j3N+4aI!+;2PNShN4@(qa+qQ5C9LL>;I-oZ|YN?g<>oJ;gHBk zX4xrgwWxmXqkBHV9$+zdVDAai5`0mO$?srAXlqO6+=veVi0i~rj>i_r%N&tRkz_;J zD9Ct!SFA`=Y3pX^ln$X&+-Iv);V`2DthB_#G6S*&tG1~xp3i* z(ul(Ua<$YV0Ws}^gxJeieUW8Uws>q2IGwhH}n=_odo z0c=HXkYOJ@JrCn-G)c;#OJqNA+q~4)GLJmDDf1OjC4 z#hwN#{MR+|H?JXa1!HRkWH9PoD@F*?XiPaEj;57@T8$v>)a#vN(D~I1fatE1O{7=1 z=p&%p1T4wzRN($)_ZX7eTi4WfyW$=GuJyBVb@H-B1SSRN6tUc7`T57N`>2{y;QH|| z+vPLT2+$Ny0eZL3!7%o(s3K~jfLo!`(jS#mUY8C1%o_PJoJ_xoJEirKb+p@)a2^=I z25Ha2!W4Fdeb1`n7+6=)PbLS!vWIAq>)U;5hP1w4j!01p-32Ipi|j`$ZA;-@Q^Fs< zg6rc6Ea^N3`(mHt*><4$`v;#D*lwW}H4&{eJ>rPQWGQ5yHV$D8B5WXGxvl=+Yl}2^ zNqcf^?n@21{war$N72#VhmMW|q$QrDZD%1(c^CK4srm>Ct7fevVyLXjfyhX30pB`U z-w$Boih0iN`ojfV1*_7GeN~yVmlh+IqikjZi7+;R=T7xN82RD3gMQAT` zqMZ)7-s_SVg7C*6tqbY1y_TwOfz0Nx+!gR8MRH|dU@f1p`FfOyBr(9Oypd7@3sKUt zCm}+!CD`(hm2jM}^@Hn>X4hZauwBeON+qr`I#bKo9QM~lY!kCBT1eoFl_5xji) zaZ<7tmXl6A-8my(ThN&ok}z7t*93Xjr4w}r9nXKdgJ~)cZc5?l6=t&9+a0Tm z!cPUQBgfgwhwi@p{BFs0cpy;X&Yo?L&e1|PC~W5eR?U)dGgAyqcCHC^ z$te{Rg#W(>&!^vlOl%AoX6pNj((Rua7b-bEhBHT%YU{NrsyP*sPXJPu62)x%s z5PP-~>6RfLY5hpk#6LTn?(7Z?>;o?dJfPR=U|8e}SucAe0)&?iGu*+rjmAML1BI76 zk?t0eI&|?L#ybob1ZQXCmpGi(fq+IY#9c8C4AW( zA$s_d?_Ow`7o5cfLnlR+=CQg&x))Su9?RI%sA=jL3yTpKiAj00Y_SGXjd;ApdtXMk>02w1v})}WQE&~bU^hurrZN!7L=|S4*%vyBW#a; zIz(K2@jDapZ5uzntc?2TL{GD4PC!-@5@HlTOLi1PZBzyJZ`*naH;0nx*(0_dVn6E7 zS7YG}wP*t=(RX-lpNHR@+zLNTBH|?D{uKh?yb-bJy8frFPfFHAC^jmDjJyi>vNh!7 zg^QCF_OPU5J5AiTjlY~r%Lvd6yEY^+a(A$T?h{e1!J!VM!3uSdc7IP5a#J+&PG*$A z#g%?(N`~+JXOahmt#0MFC9h(B+e_rm7b_RL*lXWh>>c3Gqmttz6_-KS$>sk@A(}V9 zu8q1f*=bXo`#xmQkq=QuUruO|>yPRY11wlONn`&!V9bWC!oR8GTKVIOmwvOjveWjx z{c{U1B8|bfoMzrfsW(WHX=UX!ub?8{HQ%ieTm|CaHSeDz%dP|)^aj6@MEuKUPvI8# zAK5G{*R)@ZPP0%B8KYZRc0-kFkj6CQW-(D0uP?qL-S#v-T z-irpJ8t8n3ZG-sNSOw8%kO4{+RqsPyI0{XEXc;23T==4kA%0TFDQDvx8QLD9xM{iB zhja}*uwD|Nz{d`q`czjZSniFa_r7sSOC+;Q6WJXA1$D@l#^@um!Kt!G?kz^Zlnv|i zu$Ysge0n4_WIx8Y=Cv}_t`1ZA=@8`%-|F`vVLGJTgxw4Lr?&{nG@HLeA!EVMjox==XTz0+3H8$$WR74vRll5zfj$+UBDfYL>IjEki(o#fe zBi~$|jYnp)VQ-3zNl@boT$=@!{bW}@{>bB*2q)D>XPgT_KO$*aa6^}-Q#ST@ju1?# zH-EYR?^hiWitFCH4k29)JNNM2+B{mj>sSq>7yrt4{Xl;RnAR1-DYwpIB*OjSMqrUw zUx(|&vVb?hnj_))(ct{aU9pYAZzniIF z1)`uB{{UHj9^t#`EZT(c9l}q`KJL`UlAh4xWl9bRmnt+y-1+Mbb$~Jw6jop}(Vfw2*??{BhcXF0AznjP>beWEm$%palbyF(YVBxFR2M4$AyxqiKeb%UIG> zZQj(+!PjRV8nAkMI}sOYeAWO_YYE6RURd~`=AG^GR&(KV#e58OH*+KG>%*nWiqv|f z7Fhr_ws=4cEVF__*B@u)Z#$O=2kg|q1+npE3r&frTVKCQmUZ&S(U&ufKoTi>=wydK zat{&pfx|2mZfprDXtbUA6dRU#`4zG}JQ8Cj>d4m{OR_pj$~j^cNJLct&a&hmGLerm@L1B)cV1 zV?^A&y?fhdfIy~LmjWO6z1E0d;?JOPY1rN~S&a2xUr~3MIv=UpYort@vp{!zeDyQ^ zddpn*F^d!;AP zX2#u`HNB+wpHixANTD$_{-TO__WSoxZ&Bmq-#9>3&4=)?ydmjwLBR9*RkEVQ|CIf< z9;7hu)&};uDrUUwy2qh0DhMUG%_vjG!BD@zRR84FgZ{{WGDumO05<8_21Wed2lZP4 zRcj$xx^Q1ekf{%^Fe;L~cisJ`)H@~!4tMf(7s5tXM(W%4 zdMeym0R&u^*ZhFP>VlM{ur2XeguCSa+xQZTD?oG9NG#S?se69s_$w%>q!y~reVc9R zEV}4j&GSm?GMK*RYTuyM8U)t?A#tym!_J zkZUDtZZtgj(UiYWp9Qx+4%NvF%7bq_!Ku9HR4}<=J^xPyMqLcp8wR4YRCjys4>Tvi zxj^_V&XGzzclIQI(kxp&OEJ1sLkU`5c5$vI6^bx3)!3)7_$y=AG>z>*39jp{AS~~_ z>w2V5Wz$`(=3nwpUhg?cAh0Ah)_9IyYrV!k;eIZ(nbL5SoVcoS?J_P!{PnAQ|IWJ+ zJwnFy%kO%Q+4X3LtcIkZ&@v&YFN76?jC24~{c2od%o_uHPR97+ zbJ~`(>T(D65fibbP%7suyc{2*qhzynJsMHX9HX!N@`#Se>skreh_!w&T;|HXVZ+Sq z^TYq|)Tbj==2E8Ahzxl8p=Q=5)RL1;ejb^K<1H_wj05+^%}nf;)_8D@VStkABjN|d z8O$5cycoWc-O2r;bJqQ$0rVdUucD?q#i?+(&r=7`C*BS2`&;58u@GjhM_fo3TnO(I z&1n*~WE)1COzH91qmv(8F1@|)PBbrRrKX=3V{N%;AHC;Hvl%=HgbIUuAx;%>Yl&Mj z$xqzgx*4FCnjT%;SLyt7$8d@F?x4M;H9yB??PSbeS>vs;j*KT5ed4!FMbOuul1(B& z57?o{rrWS$k-Ut$x9w#!mUTIIb03qsyz$4o*}<1&L-w!vxAt;sj_&XfVi01F#1^l=#2J%^?|V&i58F&!$V;Pw5v%A4q>29=2gS z81zW|w{Y!AMC(VV#@&4YwP^#!a8N`i;OBmEF7i z9v>Hyp@P1`njYMy~V#lzxB#Ou;-&{Vtb;e&d z?MY#!<%JAd;l6Wb?!rF7v)Ii2N5k}4@@r#%6ns2ZPHK$|7LxCj3SM<60#rp$|YI|8VWN2l^6w$80C2cKm!1vqM`in zasRKOpaRfdp<`gaIHidIsHiAtXlSTtn6FUL04V4$PGU3?CV^K9x}?lD=-z_SX|Gun zOPYSpVd!oBB|Cp3WUFN7a}0c+ClT4cB7j0B8T4pyk|8O z)AJ7|4A9Z(e*D2YJrzL(Mdk?Y!Rm}C&kP4Ml0oEnj?+EI0J#}-x3L?zjaR+V>4&7Y zwfzcf^MYwDlYc0K(#n|}J9``*ufhZ0sZd2P0YCIf*mY%bEjLHlLe&b_Y29m_y|QGbo_}{o#VHnh;ZSxG4DhT3TEFc9gDypcK0T%~n;GQJZVQd8qJPH8N8{ znzXlM_!6E(FnXN3f0G;0GUs3@;j{Z%l;$*&ci-2051eX8aA1VP(lj8Hm_;|o=NxOr zL_N9jgRCL30FSc!YmWDK2S#eUpE;-q*+P-!+_SFxphD2$Bfln_r6}ImgtLh@cWV`y z)1e`mn$AYR(qtaUNGUm9y^b-r0Fv#`p6z2h4|ZN=GR{VLi7CTEf(&Pbw7|i$zz)uE zjT_WWM$m_|#~y9nD{0AY<6oH7$~?~i$$aI(h(Z;oG3UoJHOX69` z56u)e;+Z9~JiT4MlZqt=>8vxDNcLu@GyPIbR!;~2>niqJ`nNk-^11l6vuxyzz!jaS zwTe>gP!o;18;$o_pI0UT+><^s%%T-YZf@(*w zP(G$4A)W#G`(j3ecLQSd2C6>U%}l_4EU4B@ zL9ZNq0e#|%0#V#z2L}-7_dk&uym)c2YMQ?i2ThxI!&kJGA-;*_TK|Y9U8ai;-&)9N zLGy7!+H0qp-c|QI$vy+F(eg^En!c7t&6l~Ye138ORZ}+NaTI4*BjcAAi)IeqJgq%i zm6;id?yNUIK4{6j$1Nh#k|1S-)}BcCqOE`S}J-Jza`_z>1S<^H(w?kYjqL5X( z52#cAH^XKvt&3r8;u(;nIDN0;j~klw({qy6q|x3jD1=e9XG6nsbH&*=GgA4ar96=R z6kRAZoXDiN#QM`~1^eOZAVpj1Dq(7c1%Ofm3m0-0FshxfM_XQ#YMe6k(z-b5s4K zUrM#Gz)@j!+3~)!`|6UuF9 zZko<6h}yx#i@Oa~Rs(Y)ogP6I6a87f#(s(qkc+)c1Y7si50QoEjfVM_MXa6`Y0!f<@B=sAv0rdg|2xmT`)RMS_w!mRr!^ID$ykTUV&hk5 z61Z~>+ODzTnq6u*F8?JgKBmiA`m&NQ(H&p>Wlhe4t5(3_`McvP$J%Iv+5i4-XqFZB zj~PPX{Jf0Zp~flc`!2srqkZ#W{#x@_C!f;FPSH;8&_rw@ISTXdZEn9GtF8f)v_Ugr z4-%laQyh!)|4#P%=YkJ{CB6|#t_VWpK24Tqr|?UM*Si1wK4#Y|Es`k`^QYrT!S0ca76gzF00Bd+{$4;iVwOTQGe+Wl_O za*f{|e=?31%JFyxXjk1n1L(cB_>=nhV9nb@NAm16mV4Sag`UhkS5&^~b!*GN*AfeA zW5o3OOTgtRBGP9jbdv33QMtnMDbfweS>D+*1tMf{A%=C1SH@@|8(kYL8JtVL4%D7& z!m-eev&Q~kez)nos9)7t<(&gw%gurz?;J-ymQ1EJ1xf+%Q64}9J@4GjvGb_R9by*A z0^aw?jRW<>be3B}7Z-lIO-iH8LJs{+p8<~Wb$;qeE#^gtHmHKPsCp7x&q8LmV0Q3f zdkhg!Iq~aiDOr1?UT-Gyo;vE`)1kehf&`V7tHy&+>Y;c4J3pOID~TKRt`iG#`p|a9 zTnn+)fsx*(M>akukJNrzH$>%Y6PNFtAyj>eGKvAL<0WARZg(wwz^}^&#P&tUEV8`? zqJqlyKI{#i1KH-aEbvjH6h;ZJ$72N}ljr!j3B87(UDvlZ-b@a)(*lf3mwKQUPk z{WuJh#Y6YD!}EaUy5w95tX)nyJp-W19_fPhjf0;`6hsCe=h^tLu$|zI839@Ndikw|UR$lSQ}5JUk2= z!UZkwm7KPJ

|M_J&*LTfatM{419-=`&1cMRFA}$GYPLGA1x$4}|O8<1ZPu^?A&N z06X8!^fFaEuj!ykU+u_+J~75e>0~ zy*}}unTmnH6+6T^d;&p0gPf@T5=5eWn{-b6H5D5>is}s!?gpYqeoXC66bmm@)V^OL z7gDvLvX8PW+q8g}GlTb@;r$PniTlVLFdb)QprN%6zCHGd@8uUVFc3pD!UP}T+kD9Z z^&|LPS92kRcYD%P1)cTVVVWwJImQAhjGxFj&A0d~=P~GU6JRe@{e3qK4dIf6J!(+NGga{BLu$3Vk9W%nD)Z>#q$00lo(PTzZKv142e&Y(`Te)s27F zs8q^UJkiFU0hQiYOk>}0M2GGfQZA(LcaMD1Q)Cq<8sB!5$VM;t)#TBz)R)VE-u5TO zDv)n!ORYm%hIuY61@;>+b0R;EMVs)FTCYb*rTqRl8Eg2O+yW4#h+u(SnsjRh8GR>l zX`_FiCQ0kip}{k8COEaTx-nK5NMOWadQzh7NoIHLde%dx9Vff3SE`zr^w;nN(e zThMs94j}LE`K{1c<;*G9-(U#DG~>>|l_zVbQN7wd+kRLtIPv z6Wd$w%R@RJ=Fj6epHEwg3f00%@~hXy zx_1_8^DgEY6;op8^cV6o7XS1LICtr9^v&LVX^NYn-02w@sTw#Cz0}I0Cn-#KoLt4Q zJJvtApY-9XdR%FOYfwquDiJtb8Z$zsD{)RG7|PtL<7)Ie6C^#~2GXUB^wdbisl@?R!tC|F@tycedoRGm z_pg@H`Cv+0Gb=5>?Daor|L2(8fkpKlP`0J}b@B0j6pjp2gV`U^hAz4F>U%%h7`XNE z|K7Of<(u}9>s<_K*0rNpAZx>ct)|xZCLTMCPhA#Od^cuj-J^~_i;&Yk!oVBmtFx_A zOy7-edV=OIAv2G{HDh2F))yTkU1AGJHc!0<7=iIR(BjP+c=4QF~W9F}ZoHJLoW zmh5u{T**^POMg#e1<5}D zO(_IVz=xPHdY6!aQopKG2?`ID5~tk_&7Z;EkjOvjA|cEELVLE}-&~ap zu}33PNOxuAAx+5yBM{Nw2WU}uv zu5vJVi_xiL*qIuTPwAG@5=Fe)8n`3~o`2M53NA$YsVz5Ov~aj~12C?_Tt)`3Os`U; zJT&Lv{3=LtE8WZ|0LB+w#3uF_=1AgsqZ=x#xh@8Sv6L%q=W4hD5QH$>cC(`7(TGho&PV z(lbfHrrdDZ@4vKCAz#$M$Ju~DVX1qx0vRZ&o1lrfO}-{3X($W*Plau1RFzX+V_~QVvlwbUJHcG z+3i`v?fFB_eSL%BoHgS7Bch2{nU+M1!TBXu|GW&BHFCo(ATT!P9wt>!Owo z5?|fjW_!PcU%@?{J@59hp%bqz8$M6{$x$ogAxWE$TiSn%j->ZB@pD$60m-HbEvwFJ zM-6od8lDaQOtMhpn*!dL61dN!987zC-(gd?S=wFVR7@7wpmzQDQSsnsI*{AG?lU7@ zW_!btFspPIapBx0ehf9s1MDhNXE+=O<<~ZqKqV&ss?AbN->kq_R_T@hqCAdsQ}U=j zx8^Yk)V%Nm22zs$o&khxXLQ~bioX3BS|5M~QF7bvqj_9X6d`(|mKbZ#00e^uXgY>f z`XfMplVO7kav zS0yB8a3|&erd|N_H;<}z-k7;?^U59%IhlvI;N5=QfhO0oi&+IXaEwNK z1Ex}FsO_u@=WSl-11tP|85#hIEStEZkK?j2f*V^t10J2CWZz8jEKs{6`fj7ghUf86 z>bH3{gM5p@l1#y1JGcOb5g94qumn7 zizW6+yFBda8_j=ZD>9#0dA_733K0APF$#17Qh)kKqP}TA8gZl<_Ez{RYmM=q zm-1CSyjnUHhk)<5VLHe>3Ze6HovIn1nSVABb;lxZ?MCod^W?W5I0*h9ECysM7?shkkmRb9wmC-K_Y8OVTFIk z-#-yeG}X1K(0`FUqPU0S!fH3Zstg=8KldE6AQUF6UhA z7j({{Y?0GO6gIOa@Gs9OU)2WM6ZNx^_@Ic{bl#tm{&&Ll3jGlc!h(5wKB=&&iy^_^ z`Jo~#h~Ft5M;XsOY!%a370q?j#)_8B1Iq#E7w$HE%j_C3k~ zZX{85HyLLsg`U9yn+_g9Y8dsI42Aj^DuJEBWo%I&oSL)i^wFxKe@47w7IV$i)(ZNO zMb48GMbIhek0KB0*n~%?E@X<@(H5V)q?__A_Ei{f&gV~<_cM^cSxq5q8u6c*;#xSG zd6Ts8zQljxbAM5kO%pM7062d_l~H~U%zT75yShaWT1cS<;O$Ks8Coiv=TIr4ta)K) zI>4JR6H_WD;*ny?$-CwSu6Q=8psHy)i>SLe3Yf;0IDH-sK6jSO@EN_-4S~u<7NK4) z|CY+i@{$E%PQrkbn~kK?V%i!yi?wzLT4R*WrFW_8#9^mBrWQ$r^i&8iNnm?&5Si1Q zOF;04eu2#=pmKTfzG(+j84tHC?bou6`^rL(-|lMz<09oyecB#z->QQ3eR?;vo&gE!cy(&1(ii~|_{0FO>g$mDS)^NPvVM|$l z1?&^?dx-ozcX^H%#yw&l1U8h{8j*MgB<458k_zqUr}?Jh8`eKbYpce9o&h^aCdtk2D|cj8-=Vl0DX)*MskxB8P|j+>oF5v;PMi0R)wkvnVK?>rRf zUkJ`c0ljY`A@||bDj_oK2V%wv@g6_<&QiT1ImSF1%Ee`bQN(VDB2U!7v_kzp$9>(KKyewJoPU)ce()8|SY26_@~TgE zTWCK6#?hDVguc(lvC=xAqd&c^*LL1Sis|TMmRCT)w^%Z*lSK% z&2yYa3x&ezU^P=;pnNpj9_c z@Kr;+(C#x}!oLQ}lUzV^ldDCddR^f244`Y={j`Lz1`zwX%%hI`|Y z!pa6tuI!7=gO+C%FI*o%6}#is&Y4>e;@)>aD5ci6vuPj(RA)2tc;EQx4{XB-$Ma89;E(G5 zC_?b1dsSaa-?6==CJ=#6*A%h*S!LcTkwEGTKo#N5kQbyU?ETW5b7@qf>c@7EnfnHpZA8ScG9{$ZZ@GN&IgEzE^iWoAB2fzDX}{f~L~biuF{?h)NvS zqqFZaad`|Bt`lIf+vznAG6#^U;Q#=~oW8TKp8+5#v3KS@Tx4>nnvvR*uN@s<)lW)= zZylNb^Ov_XHW*{KqS*Iq6bivg20r{JS~YMx>tqW7e)&>-3}8$*BaGpdLOhs7(Ep25 zcDhbg_i~LEx}scV8t?ok*+RI*b|ploq3>X8G}z~1&Qb~R0k;-ug7Ps)h&e6vOaA^@b?00eW z_D4P_u&AHPpY4<*py~HQevfLZ?K%OBZo?3`&CAEg(Bp8s*i10B`+8}--2JuwrG#f> zg#ODfhAO z52iDA)LgByjh8tyCK=_RJDQL6g5r-4)Lj;y*iwUQ?<(nbZ=(vz?k99EaI!yb62&Ne z#OLnh%_ScYev-jymq zOR6jK4RFptxv-R@oAH$EMOtpU4o$~xVarCFfDr!_%K+FIe?{go?=j#L$Lus00nJqTSub7tKByTi=n0rW8s)e7Dy50@8cWb>K27+~-g zf_7M?a-g*SF7!9e+?yn@*0IOJZ?eT2NbrP)%T~lNYPKplbc^hJ9re8qlyqB{C9V_x z3K9OK)D|{nR%QIAi=5yO&BFm9&gHGKn(>u(D+5vUmAK%}bRs)v#i}W7WJ2V(iMbQw z7m6^on1nsP>=T9N-u^Pj1dwdttOjs2z}!Vf#HN4eT%>Tw4%lIAnAWsSIs9Ms;JITh zut*gO(*COFIzALn%Q=qNd-#+mOP_}!+cF0}HRb|_hD}q3WE@`X4@y>yo;dv0ckmcV zxrcxY68+ssmvB;Xa#>;o_QqkxmGc&>U28#4dXC0aePrDq`Xcq>m>$dXOm0k1yu?Ry zgrx-G?(t-L`I?=uLzEcm(t~|>lxB7U|43|##ueYaf~-&{TKX3F83O-JFrLcV^rM&t zECk4)#KnV9vgbd0tjL$s4xCD(sjPT~4h9(({pKspKntNS9Lr8?d!Q*G-}5^05xffL zx{}djM^m8ANx_kNe42l73*pwRu1uU}2FTwDmCje7%^MlJzsvN(oXrlI$@@K%?NyBX zp`eFvq+eoBL>p)lfDpu6R&W>#{u^8s;)f7qHFsMYlc#zw<+*e#cm-GYt3Jlk8AP#E z+q^8`&4cHB1{QqhvT>k}ONrOy0kIg*_2)mb0THJSb#16@I)IwaM`jx|0vU`$Z_Zhm zv%dPsViG7oNMEI)7GX?)3i%nj{6||XPnH0*;NYF=HexKYO<3t4dB?vbuz!tW+s(T>zA!r28h3cE(mm|ZSTBvwpC#j*o*hP$2tumijC zWn6pxa=HY1&BHAhaER(NVBLCJmSX3jDCL{hhrI)^MC=r`-M!?lTq{$610(-#&_;l4 z*40;&xN?|{@QI5;H>rzX0io{vHoVD(s@Zv!Ul?UK?`*)vS6l5;HW5q3EuyrlPc!tf zVv}u(*ENg23~7Z)Z?g5auksn7=br@iV-kqI-*kV_W{GXR{|={%CtZDXg6|;c#C80- zY4oN0<$hd6wjoWM$dvl~7q%Uyl1+`eG%lxpN6hyz?@m_hjzJW`>3?+uSb$vw9x za7k(I?Ndu!w2bi^y(lqmrNmV zTjnFrVKv2)@-u@=4voXt6de%2ILlwVQ2-FW6Y!M~S5x7X-*uCnKj1mL zm&nL!&kvXS0~$^x??b><_a<)RWCJFk#o>9Z!!B>ba!&&v`u|-+`oxq@Z$3at_;mlu zvdQEvAiSINxZM^3g`26Q(v1u5d=`?P;d13Ebk1RBkF{raz@jH5a$p|d$TW}ncj~~1 zYiOY{Yrw=}-!g6^U}I2GGCge=pt9bpwmvrf_AulbP`5QYw~I-iiF@A$WXm7Dq8QHb zwc|EFt+<~y_1!{91}LL3;oj!i;vM+ar09Y(jB_zg_dDb`Hlf_>^reUbpr#9m1rAkA zqI^W|jCxDseDXFZ$=w1Qm`{^q3N_z=DSURo8Bfcp2*8rG6;+yMvYe}k0bv6gPoL5SW4H&AAKeIj!n@;vGIX8 zXZaTn>gm277LV2E>GTa*={^2AjPHhp|91Nkft#-H@yhH0$>5x9;uQ9=s8g*I?^SWi zH71m7lhqh16iu$GM2Xkh#P505te_5F(X~z82WdPr#7zQ>&g}2e@-BohF30LdJv*{< z{@I6#*7|!ZHJ#xH#Iu!~uXFB{pde9048pne8CsA#7Y^bqvtZeVF(o6535d$C+oDLWW9FiX+A&R?r^jweC%vG>(0 zIZ28$>6wWYxyU%o;ybWAn<+@h@hY;3f;X_31$sV@x)b@b2_$i2eDYEtX{+BilSeVT zOMW*8woATHbdzPmg-S0AvJa%~=e>37k$ zC=Ky{PI|d`oLlGv{C*9lidiKzlpd+@wh%wOcR7RXB2K*ilkZ9M&S;muv#Y*-DK<;G zE&H%GN3(|}?>pP#a_Dz>=4^L+RGse2=NJ07me+8!zg10!-#5mcMW+`v~<6Gza}cRYDS=m|?cnkNnlH~CL3 zWIIljeX6=ACYFDKqqZc!Ej2NM%c7`nFNAC~xfU=~c_H}!i8ih7`wLzIqxuc!?L zdcG&e6M)pw?)wy9ls)`|w>kJiPA~F6$g)04xaxU{qzjj|8)cSWL**)G^y)-m3LF_y z7)OF>Zzw!v{-Eybr&OUlk-na>_MfVa3YGWj+c*#lg;qk}s2}Nx#WMik0I>t_qtDLo zgsZW^Or6wz85_u`U$%X8w|q|%>0Co1R(xyz&0F@H^uur>ZvXIPxLGwz)n(JMLF6@o zT86CxymDH3aQDo1Bh-cX3+APS4#g6F=&>}TDKFOB`uF1M4Y8lD%T ztmZ*?;Nwo1SyU$I$NR@`A-TAK4172MYh$P6S<(_dOUaU;ao~v~{b+kXoY~%!+&40p@E{pUcD0tod#? zg60P?oF5a8cHYZ}2c}zTe>*l}E&Lg7t6B@J|7c zAiE>QzmjL5k@GuA?*6XvX%OAUI>Kf;BTH9A=!&7m?(z$531$!Ti(sAf^fp|~7+9mQ z5ZlO-CT#!GGcx!cw@b}s0_1n&Tx`RW8`N5z-_*64XA|w~ z5Jv_@eYRo{EX>}S$;ihD6qR1<;5!LtRkeRd-j7ikv}txM^|EL`67Z`_q1jtd|4IG~ zID=e1V(Jwbp`^Xv{X)8LA*(u@y8FRawM+hi^(8G7`*jK0GSXogC0e9Oiu*R-&L@Ll zvNef65Z*TSygr2rJHgtEn^oXnJ$@tgt7+3(T_KhkeWFue#foLhQ%H+`KZb&oaihak z7R-{W-7{c4AWNxQ_lO*2r*SRPoqgNkIF?-pGb-#J)KFkiCDNKFPm~P&J-2O*q47jC zIR#s`LfRT*Gogr_25bf_o$#}u&;zNs879SMzPt%knAKk8(m#`3EPy`Z)yboF`9uaE zP1G0s%B7}4J9<$?GmAFMd&=hDG}QC6Rs=HdzSUMsVD$4{<{$$+m)m-ntdZH#@miBmm~1$Vq+JBL@WlV5+bk zT5E#gkwWFhLYlE2xq8m=3>YiFkDaNP?~Iev`0gOXSu*kM z9{cG0Q49m4Rj0xQSU`OBt67Zy0sB07rURaoUOE!}rMq%7Hya#yZ(On`V zw&2sCmMW`qZM4BgSdIL~f-~ga=`N4PCGn>Fx(?wyF#+8@?EZoJwez2DpMi_T6&@u; z#dxQN?fog?0msyDr?BZPQ5n~FQSxFIaU%otY)4*%hF1d10J4r1AEyVljH(XJa6Vv{ zz^{q)jk5cPci@!ykzvkn6szGs?-S<0Nv%wyAt_Cj3%I*s>LImm^~;9gpi~T~MBzWE z;8B<}DanYsdK!0bSd?P&$w?R5M4P#hDw^1N|A`9ECG^XGkC@b$6F@#vvTY z)3!A@^|fA5g#1;}%twOG$KCtfK>(x=m-Y*mJ8!X@s!%Z`d+C6y(itOa^NfFT+0SG; zouo$K4VgN60-2Db;vGSv`*GXF_D2L26~?#2xW@B8*!kjAp43sa9%VUYnOZ9~+)h*R z`Hs1R!dUzJ=AY`xdSeWIUT~4d^exH>%_svizAdPe?Ccxm(`T*KRLPCPs|3TXb19N| zF?0fsv;o-*ljIm$^L}EhWTD0&sfu2r`D6}X!HJ5G8+RI}0kXMCI z%s+PLs(=Mjn~&QJI$Sk*_-h5R5V0omow22LUFD4vGlM3bBWjgYV14Ljuu_-#4zs-| zK2d0nz!l!cwkpk;cR;UyU58-1O{(a%8<9Av*s=3^9GvG7Bn~g|+VjV2U1&==lem7e zdIsDij=A0zWoejgvlA_|IE$fz=1=~he0q-w@p`M+%Bh4$oaRCq^bJFgnOJYBmZ>yD z*DU^BYxKygcU^|MRh*`}z&U5V@7P=sOe9u8AE}IXN?6o~wAJYn)}8mqx&4+;qWnu}WO@KNosLT~ z@Zae8Y_iG8?Is_$&u@#qQnWlYD@GG$-$X8e@z{l`G7K+%a(cyS0*W*)wVR-;_TEce z8))LidOZR5QXo)S^Ez|EYg`#T8)Sp4^`3nqdo0J*C+Qk5Ildu zn&b*h@_5^LI}8$HTh4V)YR205G7UUEmba$lzjf2e*R=d!$74z${dtqev6WoU*}<1r zV=Kq$Zkss;wm&%DyI_h@0QoelGQSp zI0rd1-zVh>Z^2kh$?8EU^b{yiNp&$GO;2$tNZq;wawDlb%v9=!{ z4>FKdW3?KBXyz8A*M-m;dG99Xqt?IczIM-mS*{ZOc)Mz;lr({ZZ#&CoAU>ELtx=NF z+MurI>^(3=?HBQU0}!OR|6{Kwx{Ea9x1HO%y!TIwcf@TQt6H1wSK=XVs-onftGWYw z68@~{+~pI$Sn7>&y#E_1q1`Mx;ijVwK@-{|v>j?*?y{BDT*>I{ZfR3k@Hb9SjzeIT>8w(RL)kEy<6~m>j(H>aNHvBFgJa~C6y!ZOp{yWH|H&wB! zb;O=?ki7g>(Q&XHEXWy;dT7#hgnWt(S(DAwpjl!`6W4euM9dm38JdQKmZY}j)?Z|0 z(bmE1GG=Xmmr=9UgX)n1%mo-k5H+aJ0O*mFLS-V0rQQ4smv^h2KC+NL1^2Z>fYla; zEG;kH{O?SEaWZ6}id?)l=@mCiIb!qLM`_)87Z?-nR1cX{u|Uh!!2%=%DlCRPDkeA9 zYq^)0za@JH#9vH0%>}EENJ>9iRYc23cl-0RMi-o2-l#74fq12F|0`icNT*A_(9T2x zm5DM6=Gtp|R@fNx&Y$ePy|$Wp)U}C)msrlQL7sUw;#qSr0rhiRit9Yax6mfO0=865 zeT6o1{~-zs(-PbV(^iNb7beLT3;9!?b8)5LM(sH{keNypQow8O#q_#z63{=Q1~Tl2 zY$R6c4W{4rXbDW&Og{s3!}-JvmYS`Nd_eyF(1a_7iYpTV^ob~{Ff^N^|?kW8wX;tvND?=CqFJBXP3M~g8t?&`ysB|q6dQGK+`aPyr*U|jB&Zo zW?vm1Ti8G^Rf{5;X-c^uFzk;TdW^&_82@TrxgO|aEG|!2jkVHQplRJ`EEz>p)Vq*a zuDP7tYozaB!+R8hmO=%=rTxeazmOCtH1RyqH}ZolM-491FqQYvn&#+>HKgYI|6w?3 zomy~|7~1hJ2{mW{jc>N0k8HVSzErH#3WmLULsq*I48N!1bkfGGd_?zQz90J*z|sp& zFh}4akhgVTOIakZI7@Dsdku!Xmoq0VMC>O{IVwhfttO~yn!(2FKSOV`jpi;~%El?l z8?oxDl|%7@>3;qR64-O8+qCzsBv}a1N`dq5!$^MOfIIX2?cCmlUKeADvRanC9@iag zXlP_4q6o!2gk= zq$9XUAFrk%VC}GFDR-Zh75r|F8)I>#L#o2E6hlWi{lml38B();k3`x1UY@?$*;b3# z+`NTALv+eI@Gcka)d-l3Hb)C(8n+8mvmb6&58dInz*Jw^i zIb~vKmp=D+xlF_OpBdV}3!!Ua-)0gwL~f%@h|rpH+P^QhW}!|H$A1duSBcVKOOP_i zYE2bSjd{ftsMK3PJ!ogHQnuP_;V5w8CFp|I3(~z{>!FW|TQ%zhu0!TnPVq{3v!f^{K+GdYG|C(TxEkkOIr{l~+1KH zelF+Y$_I=gC&a)^n zFSecm)OoDNrmDVTi``KTF&MALT2XH}c5znxWn&gXmhz>@t3}mHByRgZzeGQSqmV#N z7XF($Z!>qv97#MYO(ak^>A(J>0QKGLjJ-nh!VkZ>zCB$p^=WIQU2ab$<$b|tkae?= zWu3_Qulk?n`KG$wx?ZDEp5iF!(0>NV z&FzJCHoQl(jf|h=S*Y^p5EREz*mQYiUQ^*C$hE7&2|S2W6`BV@k)Ab-)6l9hqv*Ds zlU>cT-QA)!%^vu^IxY2=#_eddn0*TtHSv%h8L)QjS>l%Q^ z)k%1TNUo8ir7K15GJ|(Fc}%KYSNSp1d=st;(?Ma6jO>}qo%PBz1qB}{)}?0`BzIs} z@#}BJjz{9|&sq`f;Z?2Sd}a8Rw)MZuhWa?SroLi0sc?CC6zcFpX+Hr%_M?2l|TYzt%7<6p=o<}2q5Qd7!iyD+V-QcEn>gub=h)HV=-70rOQw``Ob72um$(ns1Gmt4ny-Eu0C&Rvv6Ije|Yz7$+kvK1FSt7)O7B6;2z-O9R254S#O%^%tbfneNQtcYZc(dW^a7JBamZ| zl#7l_CBeQW5=zsJQU(w^KX_twEI!I;Vo3U${btpY)va1rIP*o(+15?^&Z=wqFA#9f zci3h>R$FHs^pwFXBZ`-T;7nc1lj_)@GVu+puuNEG!F><|+X!Bj>eGn|=e{}<*&VxG z`b0m!I8srYI%U_JbkkI4^mgX((;UXj=A!`$!;GKGn4YpnpE&V8IiqW*I>6KE>tuJf zhzx4#Ld-8)h{gsUJH1Vh$rB#RWz=n5(TJ^t9ee#y=yU6?ft$X7K^e5~bxCG?IYKOk z^R}UmdICS9CfT3LavEs9^x*d&TMs2I&{p1~0?68^tW^iYIbUN8p0JHs%zYI)&OIuK zXF%02McLFNjNvP$?EAvndck2A)%4OJ0+Jc=asKegCGt9YJSK*c_eM77!ZOC2iGM&K zSm4v2ai+Q-@zg&@M_K>yoG|m8pfHm5Vko*zkZh@)P`Jc?{!7V8R{f_^^R<2TE6jLs z4qyWVEnWp2EJcbwm{b#9!g~EhB5q%xvdBN& z&^O2ur}#av<>Y;HD3H^=w^DN%_I}tF%y=aUm&LpI2e#aJqJmUxo1_ zKDsof)rM0&Y32RbG6jZgtZ4GG%FtmQ^h)6=PW9*-T!P$WiS75O24wV#jPICnG7Ua_ zWwg^3$i&;5US1*?lFmR?DoX&G2Q;tzSL`8XdRdy0;myh1bkpX^?=PolvtUPQaCo^y z-gl*~-J7wmJY+dM9Jw7)+@MwC>H zd3cE1i<*+{jbljUU%=@fF10oO-sn_a7Tx>&iXAYA%wbR! zVqo61`RSfm7Y?9oq`S>QMqYwVR#cP{=_1M2BlKb6a`2@P`tLSlr76Bf$6+~?b`C27 zLno8dPvwW{Rc>$1t8;n92U>St_REDF=g^SYPEI9#E&;hR2z3-a3e4>y2rNud(<{r5 zonEqpuHSOw)nLCMKRQm`wsgIvn3KbTuebYmfm1O?-*XvHq**1EKtIz5@92uLOSS#r zSD1M_|EZFKF6n#NRIkXy$I7RV8BYQn%}rh3Xn?vVqhT@P1rhWyKj6ut*zpoev0WQn zuF_}7xY|Rcb*ZeJF`Iq=rcnLSy352odqgR#KO)lqE8x1!N@i9r_$6=|rdJ}CYLMAK zuRYs<73SGKmtymHmI-9v#kksse35Q_9HVLc=;q(m+~QKAq#+XSecFn~#Qz*6*n9Z@ zmL>IHC=7N9e1>EXB~mUv0~UN7&JxJn{^IBDW-qHpq3pFQJUa1A*?n+6+^j_E?LdeC z_a-#d$4)j8<#9D*GW=V4F3eGK!IASc6c(2YKhq2jrK%Wa9OP6cVk+^vXm>Dm#>9Kh zq{Pd|{MX7Z`ixbJKnOE><@O%fiyTIaQ}rvvw8@3K&D0Dk>Z?Mcyln_8`c~6PsT{qZb~-oQ5lvRwXV#;)XpR3IJ#qw@ z>~d5TmKv+`|6NXLO}EpI4x%+yw^%U*TfVYIY}e{Q$63w<>?}(~wKQv8Z2>EO-ki3& z?ZtxS_gEbj8hMlb@LSmPLPa`kydbmD(}Uj575 z5|R79t*R;A@OAE^Z$Q<|?y>1z zl;8&)p|R#xm`anSM&oM}qWvfA{W@kLm0W)8f>x~w(!q&UZu z*q+P1h0VWK!{{a!$VaGF^n*6^A4%$$s!X{M4t>-%{HI?p(y(V>*_T@m=4m*3sd)Tr zmi?anxA^XiFP$QnCz7fpEc5lvsh6O~Ar9G+?VY z0VP z?I49l@>C2)@RMRJ8^CF0@m$C`iZ+bA#z(!jgnvk)FqDOu#kEanLM+Cnx0b6GA~spg zwFbFjo0JWP(#371NawM5U?CX@HVqj_U||MQJY8?5b>5R`b4#!SdQn|g1wz0u-A|d} zl+O3jdgG_kX7?`yna|C|xw!N`7sSNlo^K_Sz^A@!M#OLHy(&Fc0Mp&;kd45y#;%3GEw&-Y}Iz zc(!Am{{Sel2$Ebia73XIfrudnBV47An0JI^ z+i?Th8}Bjo{SGd>0mYeiJRah0)(;{LOI$!W7{Ak9CN^SQBZ4bS8{f>+(tQV@>9QtW z1@b2h$NNsLii&HrpA3IRs5?~P{ded`>MXf2WDAi+Z^50<&PeQ*YKNOo^#1^%^v1xC zd0%qfui|-w^xmT$cE(YyPWxQ?Q6CXKB;VLK_>q?!zKc(r{?FCELsyeX*a32-T-o}8 zYi&RU9jDS)rox4eJV>RvAWVz&PKb36nXzhS>`ue&Gn^I`#l!j@JpDFv)O84Pro9D8 ztG@Hqg1SM}H{*GSCqUUUt1;Pj1GP;VdSK)o>;MMyd@=Fp^`n$vSk$LB4QO`WYb2Y3 zo5Z7euA}LAMTNkd{{Z=%&addXdBmzfH(lqmY-&#HD}I?-NE>~k%Ndl_7TfLSx(}h} z&5WL{TN?xIHVGsAPL5BY;A|RkipT{5PT!p9W9c&~_UCXfjit@ejEV!6HQX99e;zv0 zWYfg;SlT_lBt?FKmyl!j_M@S}*b5QiXHbunB63VTCm55`WAP~Sb$7rcCu{!=clczwuWywao1tSKSyl6B4f>! zfI(VD^eR@r>HKA^IS4?dsz03WNi@_Ou3kT)bZBg*qh03Q9WD$4v11D_sQ`zeu#RFxg*;|JbQH`-XDRA*#d82OGH=23nni?nR)T&7)#&NmFEh?#+o8a8%4 z4@K9O>JgAtat!a_IJ%T9=%BFQ%<$N9wl)l=h@Ok+y=cl;8?f~>&>nZ3-27c`Js*Yg zZXNH_T20B^Y)$b8Aq5J1F9 z`N@08A~BFjBmtDsmrUYc*nOfgl1TuF43Y?7X$%4w1d>Q#5=bPt05^XgBEn#- zKz4xy5u(NtNhE-(P1e?eP@sN+1G~W_QWJCdh17UDb@eZQ~qZkDSx7fzBAYtAQv;l$h7*Unk@g}f4 z)B?(qD9F9co}y7V12hmEh!)9!mU0RW6XV>MpG*XZKJOd#8|aV zy9Q>(kYq+G!-6FX7#`8G`|0a?KC2gA6lE-~v~RSS`mU>@&a0CRVt22P$j>>_b(uO$ zg|V=+$f@YMUcVPzkJ8KoEA8Oz-g0tr`2PT>tHJUoB$C}^?-a+I7!IJ0)19BC$&J{m zl7oXbVq%n{its2+3c$`QH1(z1i~&=)+(1b-OzLLoapm0FpCWVfVSFt_6MPZGN>$0K zkKgS8*lov?0pf?}0Djv+0Na!KL*54ye(;VUxI{ofh7G(+6Bb9RQ%Af3M7g#gcmfsa zoG{lwed9hXmRPSn?`RnWTv5wxE1PcS`<6(leSBMrHVIgUA$nuPBP z+<|QG7;PG8hKDk^rhaPF_w4d&TH{ zf1PLX&ON2o_k!$kVsiRFsQSjTdr34X&HkhFrpFcHa$GFEy<9maQ*f`+V#rArx8ecO zV$wpE4dz&xEYTgVHv`%??{ajxSl^(?2`EDkouVF-Fl{<{?l_$le>)!#jDYM7n6$02 zH%3z#V0975sh-Ww$0MDleBCnSLR3=?#dm?S^!U9-I==|!ZUhax%5i~@7+>~_KQWnz zV89=mfd)Xt5O{+cuq0Wi;D_V5+A@H5xWQFHHb(L=p~*4E(p&*Cf){vA*xX!~zy`;8 z4*VN{PJ3)3n#uo)zQnRt-Nz=}*pGC&PTObB2iOM>GG1Ta97 zNhE+tB$5Fnl1KoO7$6c!B!MK55r3300wIePSdvDPDAxVpXR=`e0Sp33a7h3LENBb} zB$7zNNhFW~B$7aqNg%iZl1Ly12w;FnZU`;_NrFirA2((I?Fz9nvZPCK@jV#%>!}Z_ zhVgFqxft&N6eCQDdv5@<7z=<3j1HR+X@=zHFq{ZJ(3m3tBG-8T0C^x}JVZCxOGv1o z2|84&^q%pRV*zqhG&U9o5tKy&Ff=xRrmdjUadml)yhfiz2n04EBF@ojpb*9%FafJ?l2;cHey_dji6dzh_SFc?tW)q>7ubXeTM@3&K@^qI~lvD z>dFuum@QV)a+`w-IoB9lZOFNfTzmHE z$K*_XJtFm(@=z_N&EE!VT$+JkMISw1$u;GnPe7N-Q;`uWtWHBV}0{x&; zq?WKx$7zQjQIfwE{pG%)(`rqz+|2apnab#^0C}snMnJ^o4FKs9t@@MUikL- zF=+PBB#a0&MG*u5$pE=1zzmlcc`g9g1Q!j!Boavgl1U^2K_rkQf=EDs3X-Ei02L)e zBmhAgpr`fL2cM z$yFIdXS5qE0zRFfsLN%jc@WT$2n~>pIT69!Me9p=nA2sRAm&j+c)&HHrWwwd)JX3F5dQ$X*bCdtpj#T67ZV&{9llJRDqBTM zDPoOQcc|@>l!vBcU-ZOGd;3j;=a_T?=&!Yoe8FDzj^NVBlpv|2rl(AaOpU z{6NtnqbQ{cdyafS&MPD7s!=acH>I!dDhv%3*#PD+B7r>i5IB4N1Qq50PWp(rrK;?b zc-&MN`A#kd2AZY9ag2={VCx{w$H z$x%Z_1~7EUm~p!}J-C;t1Olei?hH&odVRMt&8ulpgz*%bhT@+Qk*+{?iaCr9&><$^ zhvoyg*zph#F!DF3pqq}PykMmRieYlLz*ltl59cqw!T}bIlZYmlMSs7UnSoP8MWCBW zv=CfIIz$CzhTuigV5ssyE0Qr1Q~_kD)g%B^kik$11TsJbl1TuPNhAUZ6cT6&ZagK0 zoxUc7P&NR5QOH{+3_3l;f=s(ii$q+T_>@nQ4f{iN3V;?V8_xLf1hojH*r*u5BRK{- z?YW900~{(O)Bwdhw3oa?MlubD-VRO3d8okZxdF3rM=}G!URxulIVQHWu!1& znG9RsXstO4>`0J9SFw-^5i99pd`kh^RHlS<-f!a>cBx6Hp6mPtn2?GxB zGwIY}RqYCq+AuUFBHB||LLmk-83&jg=rr7ov|@H3MF5z@B|-=Fj#f&s1KAIG6m1_( za~F+-V`*DlgNZ9>MF_%P^&#R)7ji}m3XSAmV<_%mHnC3o4WSlB(F0Xfbb3;1G*~4_ z1Zm%G=8ux;JBk@%*4> zE_Q-)j+PAID(b59b9Nq~SbI$1CGm4#O`p>s6JkbK?O1Z$Yrl=POF^9M8N+NCO^D*R zoVjDCqs7TGjR4IU@+&cCG(^X!cZ?ftrh0ValWIPaGy(o)qe(U>Y1nObFk^aegW6k# zt5FnCoriWYX{60|$Et1a#ZS zp$fZ$wGrMIEl*=@s-mV;Vs<{$d-;#T1DSyxtGqNeBy5*e@_8}SYjVPd!ctDJPe7%s zq1rC)EL{!+T2#rQTm(8jpxs}1-maQC0oCA2LxtGbp|bdZ8&Xcj`$VZ)RBT8LPhe%3 z*HAiv1HqZ`Gi1&bi%$Ol683gu?Hfd?SEy0I5r**;5G9gUqpSY_=qJ62f^@Q=$TX9; zBzb`2#zyKQJ-L!i&(mWhRgX0k^w^v5k|CkCIRToRqog$6>65eqL2`D224M&>E=xBM zYr<^^@h($nekNQeaz8nxELk$=q<|!uAUhce1RL!b5f5@817YScfh3#*1@G}8?EnTi zJ|c0*kQ&&)EZcJjJV*_WZU_O|CPdb!$l@`Kyg)D$1_#}Kf^WR!nlXGpEAK1Vf~*aU4J--6NM~P(C<1h5DL*7Ksk_2 z**bM_G}4jrGQKv)_=etK70D!#0Fq0B_J9~5xg!Y~2e@2bBV!;slf}Xc+M>m-{{RsG z04Y}E@-oX;Jo~=<%1MNjJVd)D%$xa)K2a2!G7XFe+-GyaiA2d&8AJr{yavQ^1;|fm zE&(GfQ5bC;6iM2m6H&WGg%B^33hrdnW;%}1L20Yo^A_lQ#sollg-lLTC21S;A#LbF zd_-V3J4PEFcEgLP!i`>RHrCZg>UQA-PU;@la z+QGn#e+*EtgKa4k5Lwkv}dx_Kt|Uayi?6UL_dZsU@kV8;q0m;CN)#NPD`e7D`gwJC9JAEN*UE9Cn<1U23Qc z&eLWLn!VkoIbo+(9P;$sj0rYtXuw-;zzIlTV}mo(rev|0YPAG-vvL;HZKZmFj5yjQ zZ)>`6%pE}%#8v!F8OpXq)NZ-?n6aHCk<4`@*8S^vR+!$j+HwU_0MxbZp%TJ9S-xU3 z1!4f;-`*8tqRG14T!ylpYe6h4;74I-NNOGgtz5C(jkl}Y^Nj3SMvSyciYzA?;N=*slGh=!|r>LsU2tYe^QR*6~{+uQ4)Y*z=@#nTBxR{{R@O z^So0Xs^=p|tO=;ag&Q;`aKMr2l@u(-aq5Ljt?jBk7m$pDBONDYkP@cMshx442n7;5 z%QU%bCtz$tLRN)opR7y8r~$V%Eyh9OPNaU}{?b<*!^H@<34#Wf3|V#@4V3s_F#*7R z$L%!ZH)0%pA}QRKKctMln^-mpl?tE$h?l>_e#8x`F0bBE0*qvJ`|}uZc9rNVcfF76 zEMEI}fFan>gOOfg$$Iwt#3zma02i18iy&Vx01tRh(tjc50Lle%QNR^(7vM&_G&?{B z%y!zoVWKxM)!&H@!)`o86}pE)Jc*AE6O$oRwR1WE1AA0BQB<)2@8m+5W9jjr*+C<@ zmH`Qqv_S+iKu>6bNhDDiG)F+_RQHVp1DNZj%AP@rOw-n(85O|T%#6?j1RbCR+yKLH zNFWCGlHiPrayU`RjGCKqenf0XpN)i>F_loe_M-+cLkkrsj{5_=OF!;Eq?wrM_KOAp zT#w=XAWxL@-VhDKqj=TK?s!&#G$nn>gxT*D3g#`Gh)(c`2-@LMa53gffNivd#zrOx zfbVgHLs~uUAb>`VC=Zzl_ScyjE!+l>P!QPW4L2oe<|7?O5J@t!cM{ZrS)pd7g++@p z1hZxmbgXIr07F9LX6!pevr#S^6BCHr0lYxak*HiC(ZL24P&bI8jI23dbHkbTm_#A3r~xE_YW8>QM(TT!_7QX99-ns|eIj+_2b zAEY1!hif2qgOeRsNRMPvHo033{_@8)e=?>u-|Y%`knms|$agmg6%$0$?YLG-CS8el z;?K-wvI9SJX)gqwFO=&LIp9iEhCLozKr{Qj4HDGeRShNl*vOCuMpl zMkHKzMqbr%(O9(s@h#1X^lA%B-sNeY?PpR!oBC{wziG_`_LpGF!HtX4AEhBJlmH zbMERkE>cA*lepu!oABai$?7rED|F_jTuhoh$aUVp9>d9+aAi743KF>&yo()pU)z2* zO##0R`HWl@vAoQ|jgz?XcLqi{aas0&IhlC6JdK|&lx-t$IGp~VYtuw10?0d5(T%kP zVn&iVyZt7APfliHS(^48zVk^m$2+p&84-em?Y+KcoQ-(cuO4MT{frQR9C$oSF-SFQ4%-s|U(h(F9)Iphp%)s-r^Uvuc@X(&?6x$&a5O zteOK<$BRCi4Z)kSICZdYXOz=?GL?;bExqkV`$k@u7@%#u&0}(Qh{sRsC1mum04W#r zjua2P7qyD1HEA?Y>SH5|4Iv5%HFxF(v$^I%NZ9w{BP$>##@`aQN^-=@Z{h|Ue8&kn zA9yQJ8cZvD72S9+Aoq~~R{^Wd%H2U8Xv>_C6K-EZ*#vtHod(CT5$Z~UMDEdxfo2y|7G{a_5H_KpVJ?JM;G{66orA&Ia> zR5UiUf!|>v1wasH56>_%ViV&|jH0xV~aDT!JrXLEbVyGjC0UMKk^*$HdRl;`JWe@UJs@ zJ|iJvwfB|jDoHJ1^KrFrKz^|^WYRQ|07s*YX*Wl-BCGKjbdsWmo8*HgyhFJCBPYs| zq+?qMjcWk;ov#O9W*cuSW4vaw5W!GEy`!jzqCTn-iiA)ytGLAK?*&%EBY>lMU=RiK z2qK_V>LlXggW3_iY0#Cu;(N5w-U|BhzE&kni7#|0It!&u?J%Sx`BH((Ms*K4Yx4ehz$Tc)O93T^R!d~ z?mbxefm0yb<1MoV9nD0#6(!Q#X$+nIB_ngZw3`*?4^P{)7cPmXc*S>&7P*WC#|M!> zp&3{U*c%=DNJj8g2-CHCNhYCW0{y`FsKQ07-AUWD6)FLim~0mOc`lq2a@!umv{ioK#09g{%U5K&02E&Y9H{ zy`E*?wo`;t%;%;;IE8(rJ01K%o#XD;S#llsJHi^tH@A6(dV^MFgE%7VYBBW2;ghY6 zzj!ylX*^VXIejetrx!zS>p6J(lX%>yAZ$;Wt@A4}C~Zi!--Gia&AKtp^R-+j9=k05UN&4~cea&T zfZOwmaC5S9UollespY(X_LK206=`QAF`RzS>X4UO|FN%D)G32i$OUFCcF#Ep;+ zPkBrAMUt?92a_vCY=>}Ij(iWasfsTo`e`|W4{5X9n2(Y25Dvq=MN|x+ny(iuOln9b z@34nZZq?Ymi)Q}9T9i%dvEWL|kh~TrZew8@Q=5@mMZPPD)wc0hi; z*C^9%4-@iQ+mQ`Qk?dI}U1BOFLjl}Wg@6(RW5f;1>amP@*bWZjPz>nxxHYD=y+fb0 z=dhyy6(;2EF2mEai#rLo9xO?^uJP!$oh~zv4KNyx^1{OFyp{?1m9x^4RQ^UVU_f98 zeoT+4pbHe_zl4TZuDn9^1SxsYubo$5sp z8x`QfIErjSHh}}3_JEre9H=o_MbLrG7aX%t9K@r0NH>HRvx8<9J|I)PEGu~8QAe0E zZL}NK(5Q?PdWUM-<%ACL4P0lmMH+!&e-hQljF86MoAxciipc`V1Gw!QAi@xlnVE`^ zDS0>F;!R#Ggx!t-H?&qB-xAJEF7X_zZbtxqaaBcp4TLrYZ@esZlEFX+fH;#*+r)I5 ziG*7)QQz{Bg$=5NMJJe*7AexiUB@f}+5Dw=M&-yQR<%@&-Me!Z%FfpyrM+L5iDoON z4hUM`ZpXZ-1p-@QJ4-QTUwyR#q--wXw8`18_I7+Z6cRux!d#gM#kI@>ol{mEp=@8Y z@;t&+@=03pX0>5^8Go#)N^9qSXFoUYh0xH()QMWLa9D7oi`>fFFUNP&q+POXf$ z3x>)ISzgw7oMm;~p2k`;I;mwJhhl4jc!2zOZpL1zO9~>0?b=_9tjCOMBn2n^XQteDDQ(--dih3>Rjz+TE-qp0y-%u;lsbnCqI{{io(eq>;lCt}+VZ7xWhxTR5L?fO_ zv_{d1wSqyZJ`F!UrQ561bqe5xZEdQ)=4dPw)z;T@&f)6L9L&IqJXdR)Kk|TP zMkSh!9rmd29r`{$myWx=y%$VF@N0fM8EJR*3kB3TBKVkk45un+00Vb?ZRTiv#6GGd zsip*QCK+Sf(8E9Dv{rvr7bZF!l4Y10^=3;ukN}LMQ6cP=+#b-1P!oWDIFQm+{{X}+ zZg~>g47D<1cl8Kn1XY8?w_hh!)SDMFTGRzx&6%4+gfweoDSovM)5HQ5NSurlw zv6&wsV&G$1qI}DSKv1ybwM<<&RYRx(PT(1+xGAJn*J(B{8@Pz%PM7!Z=RaM2^&L6zzQjxL2o6>8whR*bE> zb$q(pj}p6J`h{1B>zs0Sk45D^%*-*V;05!*fqmZLwf2?e%%*`iaWZ8JG}#1mymJ~? zIK17Bw(oHdxk~IdZ?&B(iEh0{oku2U6o2ngF%e=Q(Gs$_e*OT}NB$=WMp#lQ#hGaX)Cl ze}Tu?&YXC)9$zoYmi2Vt0ko?t(4j1D4NR|O(T=jhZi=;;U?!q1b`kGrl~5aykTwwk zB*t$71*Bp~mDK`cji7EIaFFRFK}WQH1QkiasN-=En=!`K2q{XNgdV~;g10{r=(dJR zxfk(Na00-$paa_oQ(N;0@eR;|b^&(YA=pO*_lm;7F$k1U7VxO+c&(j?_d&T7l0?8!6GF zU_J*jvAN@&m=#94)Hs)y|um#AEO=N9#_PLa< z`~D-^q^@-WscI=LReMV-Z7}!8?#=xP?Zw^-*0e$y8o!~SM zJ=Q1#9~k}Fdg4$?X8_fINp7P>cGEXHcr6;)Bb=YRY04V=eoHK6Fm6%Xp`)nkgN zSE%&x@O2%m9ja#O$;+8k+9NOphiiv6lbqwk0Z_$MkK*5$;%+2dPCJR;oj^U(>Zx@zE4x) z=R7-Kk(n{pwgm75%sQbyKbNJ6F z>W`^n)?dpq*qMC?3+J%T_ktZ8&j`9#5Icoa?7= zr|L6h$5rg!$P&cNrRZ)4VKaRzBEBb6m@Vv}o=nG!t8R~}aLc&u_8`f#yP=MGOmVf_ z!e1Z@K|mK~8$cKWNd$`><}RP9)sVWXrlr&ncHHePR$|%|1=a2rcONy{Wn;4oxzk80 z040T=_Z}hj@rwg3gS9N9t7Sz~_{kpX?ejAXy1I6z03o|ENwr&X>Dj}d7(ju&$D1+o zWJ{rB0kq?$LZKKnk~?>e`(5f)CiNRI@juJgZT|qYQjIrjwVq|zx}phegoZo*9%m~q zbAeD5_Z{!BioHiwodH_Xr*lzwiOs90boF@XoOVg=Tt$4t(=KR}wBo36-@I_4xI4?T zK0I`(l~~sGy+grYp8dy2JLO$=Xb<7-6Vxg0x+iJRT&r3}O+FXAwM9OWdXJcRkIS~x zWH3$7Bo7jj{@p%FPsk_*nryn=elUB{7@HXZv^y|?0L&g5ce%4)k0yg{EYs{WopK>P#Dr>p7IVmW%AplUmWCaC`aSy;_p(Vlyj z$1~~~oaQPrmK@grM^3bK{WwH+E=7_&_?R^SNgyA*R(t!-zZtDOkI9#n$~sH+ZmN(g zkU{-p^?7pV=yGIi&0)aPt6~hnml?x{8OVa%Y6KqAfYwhu?I*_{ai`_ZOESA_>6;z~ zQ;?}rERJ{W`Oc#CA579W#5Vr`Z~RUXIP^8K*S3%b-!XRc3x>-MYlPOLmKc+~4h8Qf zF}=$Q*qJxps*9rmv&3gY3?M|Uq7AMv7Y3>kL+{KBR-T|DF1myrQH=(Y4ZznfBn6e7 z;Y6eY74IWK5v&40rq9fZY)b~hQf<)!(TZ%fMw5uBf;Nmf-XJ^3&A-GUXy&A=8$<_a z%65Ti3aIKge|u50(x4YBS1S%Au3ej_K!kkwp~PYgYC*sHg&x&vZ?E%dml)IkpNnYku|i^Ac}rNnBv}CxcR; zEN*t1GJsB^!LN<@uZWs#asUt;DMA%b`?!ozbPwkl&8{%1j0-#+{>T3Jiquq)C=J0965&A~PPBvCU z`u4ujE@Qd64fwW}2F6q>1 z+ypQsg@qRd>!D(PT_kpayHMKJUv`*%Q z!tML8x{iW(9j;W&zMkBJUlKL2)DEjWnBsJ^5oU0B1lG%U`FWZ;r9~*^t(byXwTAoG ze=@8%GPC+GkmD=vRX1Dr{{Wdfg#!{OZNc{spFc2HsinOU%=-NV+q+l;&iD3-gaydD z$qcLs{;_&|nT|7q9=0qBs;Ki<{UT*X!iK{sDaNv&TH!W=UP?L_BSP`BOZTAK>=8@(Xqq}kmVx9jx6|<}!d$qtlxUE-_F1UwMsjfAN^mQm3CXeK)K9o2xpHw= zoH(zI=OWm)$C>DUrr0{3g|eYL8s>32bqUnsETNT;1kfYXV}4j z>}9!fs}{+me((lYJJlJR>KQ;7)`qP+k+>tY=Zv}N4JqND+76Yd#OpgEPIlFuIzJ zuk}R;tNY8-v8o5Ro+Vf_2Xb=iRqRl3W+zhFG%#uj^M84-0-S29`5hTpTK@nE1Z-oI zOzgQ=R~~GOg|Zc-{{Vge0MRpH&TwRG&V+^@+P#l?N$MT)zfYZ*0yrbS)1}ej8F6|- zj+3&JQF`{$OP%RgO^+s1>U9oV+8I>wK#%1&=E0dCQYhST$J=NADrU!(aP;cEdKA*e zvMAIE2jVaOM;BApoIb9cY(p=$tby|;-POz{GgsQ*O_ZFOv7>2gY8pTuDpV=JCruVR z1?|}VrLIO?3Nva7pTs`?W@FPnKABS?DvbWt3u4F5Xyry&S?Vptiy5{WRQ~`I6YUbl z&Kn9VpOIXdi}r+EYNsN)w#+036Cbc~Bz0&necJ!A|6;L^bRfFxLi}F)0JBumdx8YV_HpE6Fb*#o;fm;8SCz}wmd&cz#lV%)G**1 zWBvr;^%>4*e3Squi@J-{^*J-Xtkhn~C(NqBV?u{*_=Y`qeW#Z>m+{7GL=9#!BDR94 z?E`HuY;Q#Z)sU3 zI)Z-CD-13=e8mw<5yWWrzh8))n22xh90LN@i0ft$bc!;?0A;DK33I{?T;)>r0g~^vc2Ac zw1Px-EUr@Q5AiellueI`V%RiA7?rI>d2nl{LA~6Hp;m|+cb1HY9z}7;J6O3(w|*j2 zw#^lr-9xlogp6f$j%=S0fCZNCxRtpqXf4FNeU;SEBY0I9sbvO$-lf>h0b#z=j64x|L>ukZRz z#{&dL52b>aR-icSe4Zk(#*B-X8nv-v*Si8d^BLdmS4Zihy0|Np(OjXZF5DXVuhvu6 zVtg-cRQ}~7f+6Y@YACy^5&_$BaXO5zlpu3q00J5wQq3t)4^5nPypjy=_h&{ z)O|E*SSdRj@d8<_prxuJi2?>}qbXdAPTQLsn~AtO4KCu$v;&cjQK6YgB~J(9F+1qs z61s`pRf0FErvfWD(UW7^w*qIwoan|d5;9#BD`WCM+C<9On5hB22;cITj!g2xI;)Jf z5`dFmp_sFJXC9KII6um0>3XHg1}6-tc2YN^+9y(l7y?5Rw~}Q_&f}@L&yT2VcuqB9 z+W!C$t}0lpnEH0qH!EXqPZj-lmHK|3mTxjc1QjRx83%UOQaPcOz#xS~u7w$V( z=MX8(1t2K8--x+=Gevy;i2neIonAJnWPDCQe{yk0`b)9>M?N)m$B~Au znx$E>vV}URk#dkXAo4s&tz~P&)VpWL>K|fk7q`#nI$d8*`E;%zQI&Ps{xtdd9y?Ap zOl+zPApnhyb2ju{UP74g9H$w^2|{=uF<8?Kr>f{H;LXu%+Y^E-PUTpCP9}Hj`jMQm zL|}%2Q?=IHi7^7d{EQhG=hOS-Ct^4^HLd6Bm^KejLh;B^=IiqFW+hG55}j9C?UU17 zYCX*7Yy9Qdv*S*sy;TlRaMz^#Uesgtr2@Y?XrF6#`+1Y;N`c&G#;h|XE3y1PF&?|p z+#t21`e$_YdW^`WfnmLt`6g59 zInw0@JVcscF3)*WW@dE9)2k@eVM*A0Nu0k)s~F5_fdy5C{&J>Fvci2F^+=15CNRv$ z@i&jO#Bv+pNck5|l|m14P0ICK0HVyTv)Apfr|O>><*Ub;wK~jUY^c6SBJOfR9bBK7 z=io||y?S)9^(l`ib>I6y{Zi4S1okFjLfm+f7&cX1s`uVj+3Naf!fUp@}}?N%CV6$IK%;>|&Gg9g&oPz>Ta$J98e(S`a}SUeVPV)Q|}v zS^Go)h4FFL^jNwv!a?m3V^+qXp&2=fcYuOT!Ng@IVC^ANIfH@3x~?XZaM8+9yd=Oy zT}2xR8r3_?Y}BC*N7ZnMu{*?Mt>cd|hr5^!=|~1JU8TB3+$Ot6q2#NGe95#2cmjZX zLW^d*#}JLT9igMy8phFMF}Nxk5EpYV8!V^*uxc%|3eA|k9k`Q|7Op*kv_Q%#SS&V1GyoupTRDj(iAMf=yj^iZ0-o zu81UB<_g#0XYOz`??IQia^95b{s@Q^g zu`9~9D~}Sv_^1t`BT=(a33Sbk2x?<=HZuJ>P~_AG`fB&yM>>3MD{PvRMeTPI_vP7E z%bJapldvG^*i@L;O4#P?8FGX~^%cl%Cs6r6*oYt4V{I6i&?NkEDP`0F9pMCNZ*vAb zSNDp?O#$P04I%|rDs26xu85`wb?Oy}ApQ}(`4XH;-l1(ekXEk*O&Z@GB`Ba3Yvfwr z72XP#Lq21ivBokoB5!^#ljE7AuW{&L#;HuUPv>9znR-xM8Yh4u1`H`*@Qo z?mAb9V|_rgV{Y46KX}T{*$$#hFU+iqYpp6xZ5tW{$Tb5;c~Ljg{-3C9E*a0^-FELf zU$peOaVr;LlOF+AzntZg!HN-N8q!uUW?BpF7sYY$DLd3@>T-I4Pr9zPF~7X6vbI%y zEJw8aZsxpd~Ou2YsdE|Yj zWo0+0U(CI-2UQ?&D4Qlp`cs)5L3X|OJ8^S8X|P8AL7K8rVxZcQ&zP9NAX0|&@h3}^ zn90Z!6EGEFN$qmBcN#+z?LVYvu-C&4?mIE+7%LDq3*(L?)ynB~Zl|NkmojQJ1%@Gw zpXvT4x6J5rgv?x>AeyT+U=I6ED&#nIVtQrb!N0K+rH3XAteFm5%S7rUVn+b{9xt?t z*9?=Z89I!Cb&;prOh#$*`~W9hPD)<6xVh@sCMc9}YkuO2od8)MO7NMzuBr!yW@ z05&13AfgVcB=@l^&f48uBZ~x$C5R($nB+!T_0wSL5#1LEP(qsoSR$~TyHV6h0Ay> z0Bi%j8GcihNX4zn3ijO-a;Id*NJOK-B=5{Li3*3JvrHMNOuHOYt!v_L!><_vh< zzj{C)Ea?_@90@4h_Ay#|(?{*O+!YO_Snd>6{o~@rlPGeETSDq@ zfhbY@N;sRkKB(YazyWy>s6H+eWw~!`>;TwFdu_hZ8v>7G+7NEQ?*;Un~Q4kIpz`OEz}_FV=WjS&=W!eYRKXtZ!n@kz2q!J z3ScoSO9N_zD3vcUwbk5ZXX$4gNEXig#6~Q4m!P;r-i)h4Fy08lgr-#pv9zkH?pvzv zBO8E)y{hCJ8-S=L;o=K1-T*6^18q_b;6@wo8s&OPj)J*@XqB-d<24;>5xi;G1lxG7 zbjyyyXUL(qfn#^=HEkGfC2A{Z<6vOAao7oJ;{{mQ8+Y^ZD@fXi;=~z;JIG}4OpioB z5bQaDR>6cUdH_@pdQf)%01^hV^DHYuR-(x!CBsxgNd#AZWrS3%ja&pVZ6lsW^2|ZV zKF~lnziqrqPw8sAc5%V+q zb?T_LxjShDRgUs61o(-znCtFQv~28B#@|itBjN)Jw%{F)-~Rwn^z(d}dXf)Jq<%Gu zwZ{Dp0CYGMKwBjEiolfL@p-vcEp3bvcJDOgW0{MJ1oj&U73rKB6}*Dnn;U;ga8OfM z`+1cX2FN3S9pHcIeiv0xyD>JTab65Y#@NxB_aK!jO%PyZY*@iei0PA%Q*eIg`$){g z7)u0xD)3^5WQ1&l09=5e_5$U8yOcPCdqw_ye~4b0O`dzmn1O2tv<_J!VW%a03v2Ku zj4Bbx4w{gLP;Y-f^vZGK2RIL?Av=*SHn5(e+^BzBi!_|4Qn5wYF&qH~ zBe_B?3vLvh_OH@wTn9EhXgYS>ZtB33TeGwP;BB-nE2e>+F9sZ^$Hps+() zxd3zVQrFhvh&sjI+x~JF2c`%yl{a;!uff0V9Y!5x8p4t+@&5p^7SCH$GUP=%b!zNE z;%CT9v1XuedKG_^+0@`-YahRB3Zs2JiK$Pb5lMGYc%i=W`zg53jQjrp{QafE^sonM z0K^cs_uK(eAt6cZeq!`i?8$BpmZp$s8AqqRcWs4Az$ytB^EAJt$k`RheW`nx#A9&9 zuJ1^asZ@{%apGDRQ30uSaegJ4abs2PKm7L+RlO<%?df)YshAu%EmI%>P|6M1^ysEF7d5(I=YVqfi?3J4lHLAKsE#;Z!c>gy96%^wNo}^SAYc^N z@pl7{${>E^U*%HD_iJ^&@uU5N02ft~Zh)y-<8c@tQzJ1H3FE|VBSAhOJu6YD0p8`h zMyefzI4N=|EvAj#T|;ECqgTDc6#;1FYk!EqQ;`Df*UVxVwSoEw(@$Gn#n^GgVPhEu zdEmeRzIPFz7;VQLp+G%KU`_ar5uE8>Ps~8H=TWL1j0B-};Z%3;G@NG|>&QPAz>_kI zE_Czf#Jy1D%n_MLBirsYAbKW6DlCyiZKu4eLrZg^09EhJ_A;GJHrg?!GB(;kA%sly z=-95&!HKoT5yaD0(zX_3-qAUMLaOf?q!)3NUocgqh}_UJ)*DJ2V{uc*wCw=c$Ty7= z#0{d8wMH96z3K%Jl0;grW9=fPm>$6e!oUdRY2sH_W6?{r6ifvy!(Jl~0wdaEQd($T zqGJ>zGXN#Vd0o?8nHmK4yPLF#gZo&DCNI+Q*p)SXe;4MHfW$rk?{mO4@j2lx|>k``V-%b-KZ7<5# zf&OK!g-=L~9YcUwsB!oC;7qFH)Edo&6eIeeAv$fzvEV?qtbPyxH@?v_F`z6DkDoE| zdX0?ms?9~a{l3w^Wya;sBF9e}s1gA2CY+j4gB8EMTiy6;xsx)X%5?EwZ~4tR9rASe z*GQ~ow;b>Nr5KXh%vw8_MZ~tg@8>lr3YE19pC~K1J@}80C4yY`jx)+z*)oz2%S24! z*u4%r%^7nxcRHH%i_}i$RfL6hC%82eNi_}&Y7{n>;zuEfThc7;+E-@v4kenDpr#f{ zuzNuSWhDrz1Wf6VA#jPl#;&XR%}Z@$QSV2*uN!4cQlfzP^Kh%e=*OtYoi2@F-?XV8 z&SrNfaCaVKki?D22gI5JkPJ%S?NL@H*MKI>WG<3{Rh0)n#9&aPor&!&7|C_ggq9!x z2Y(UBo0j@k{-cI8)`G|bzt7%3Py396D&rXdABL=P&)Qv^DYfbH;aoWsn_w#M&&JUM zg7(~ zl+MamGYYeGW7-LO15^wliYqALw*GO51*?jd=up8}50ecKEduZX6|}i9yAZ6S+hmuIU6RcVn{yF2mSeln;WqqSPRn3HQ2K>Xjk&HNq2$gn5&r<# zwhwT4kBbg6bhGIBJBfQT6(rbk_*b=mScMLaML-9NhK}U0Yd9&vWV_T49ijybkegvg zZ!yy|Vn$BPD1syCd;~EBGXPZo0Ep4E;!GhGbL3-IX?uQrM0fN{9-WY*t!d=f&&;%F zaH`7M{!YdYp)e8#FhBy%-}k&)SCcYR@;Dotk4<`PAGEmOKtFU1?|kefS=$&?Tz9B` zBgC&v{nH+pYO;N*MSyvV7h~M~$gWsXB*j}N&A_b`qDJxhyl;;tm*n_|9sxkR01em8 zL)0qjPz~CGVgu5eS1Y721lxG2qoZ7SvbJum900eB0d~ia^DD)TMl>3%vjL|0zwtEn zsBmMzQSp^!CH*tWz6twOKcz{o{{T#20hBG1-m7qX%XF(Nl*|JT7P%6XzfiSp%xB4J zOFIS|sQdFN62lCc6}0BI4x>#T(z>jUtT$bvlc~cTmh3nkrKyC4$i$6E+rkW{;ksjlu*gBxSU!kdPp6ysfSWCd^I5$y5bE8UjJ) zPS+-jdqN1k;*SuGqEO!EC=_>$yO`l_1-%lD80tGow1KMXR3VB*69t>OIe>v%%N1Zz z9PJ4T(*scs<^ysAv}L1$Dk0>+Ne~cD@Hq?))dWy?sbxex2h10|eg#MX?HJi=KuDGW zVxqE`NLxVr%ad^_Q7=GaiO9kRH5-8|HMWGNKR;6O2!eBB4nl%d`rL@ zcNAp^ZTIG0D^TZ;=M-K{`5cETHWNk+ip!2TK(} z8x8x-7%}6@jHH#wfU=wByG)4oENydEA(IU=;Ux$=kZ8cQcCR9u^-e<02pUPV{{Vg^ zIrEIULJ~k%C0WTk9s!pz*O66pp#%WH*XI+cQ~OFLbD?N%eZ+nL0K`?c7op4tqm9=x zgJ;;hp}qeAC`NZUn-L&_Mb`Fw$}*t!9WlSK)t)c%m*B$XG67T;$htM=5VF6ec-)QF znwxY##6RuLYnKBfI|s%{J1rgNafR{a50b#hx{Vvu4+LDWDzbj?auBJ|3=H&Oe@x-cf)w9B^ZsRyg!-BB4Oqvt zy;h3c-S_PkT%B$*dg}QZauq3dT7WnC_KlA>vpDI?W7kv%@p(TIfr}ewf7&k@34eIF zoUK)UV(JnWR>;oOu1N393^+Gi%SJLw3N$&Dy=nkPnNNiS9YoOnveFHmXY=m@ue5=& zt^_1#YRk8pJjzA84A}!MYqPYkQmNBd^KvK;nVT9=y@w_jVRk^ zO~lp0}M9t;oEGB&_&NA#CtMGb5V75)G@{N*_JpyOe*w6=mqCN<_%O;k&a znt{@9w$&^pjwVocJonmC%;ndTK(FU4KuE4{v_h%6Vl1%ic$$m7A004KPD@;t; zG-&{x_uFn`WyrchD$xYncQ*s}vrfGzfpugxA5p=O0kaO}c>JPtEs%8>&LvX(EsNaC zI)-d?nFD&j+Y%@N*h6Kmwp~gwmS<}qfGVy~2E4;k>iF{!wFVYR-d&U^I@lX4Ko9Ez z`zdhDNCSTzrK*P>J$9hoS9m%gtB_=H2wlkYG$s*|vbO6yN=g8{D8z9Ndvk<=0V zAn&-jSO@*5i~Gy7*R{0lMUz#ler26Le@`(u6qaG7M|!9Wt?1n^OO3HUT=`W7l2l)D zz?J1@&}(FKr~}CPmG8ba1cTb>iDD4p22#qGv8w<;t(J7Vrwyf1lmH1k_dE%kJ{o*w zofyA5P1oPVvo2hL!Xuo)HdSCkf!l6nZq4bE$e@$R9pgK#YBc>tFr#BQPNnYKN&&QM z^JZ870Pve(b~e4?R`!wGnCD2&?(G?Awj}wCMf)!-a#}axpam)(AD>1f1DL>TPIVPdSHv|eE`M#d6g zLU@Z?#}q_U4G4q?vKx>Hi~yD?fC&H~$01Q8nHQMqEE|dj@uz13HB<^f<`Qp+Bo>L5 z4~VHylcov1nCv3R4T%Rafe`nQ7{`bu1;_CeI1p;yGS#aH-lCO|Fp#yHfp#nL7%>BR zU4i$3o*}K6Hlk&tO#%&?-sWU&<;%oSWevA}(xbab?Qt#x7?~TysBTOo**;}@n~I6H zGod4BmqvtrURtnmcdWd8ta^p9{H)s5>AP z3oQac@kaTG*vhqCk1;D7qT^a%W`a{nLJ$wc7lHSHpU8tDM;vM% zcLp5&H~?iw)mxGee;drnm7ggjckwLhdW@Mkp+b#!K1`Ol&2)7os=()Yt2RN0JEk0( zm4=XOw~3pl3fR3yG}Y|@ZTZVGVgoVILob!!%8c@wSiwpuW?*Yzc>e&r%Q87+K=|n| zVg+C4=2l(U?!w5fHzHfqVF_q5StJ0rxcNP!M2j%`w8s`TKA6;OcKi3+d7EFXxrkLz z6mU=GK5yn-hY)6LEscoMNh`4%)sf%+W^6ed5@bbTPBgNSf1H;7Qg*x48FQm30I0S+ z1|WYaTVi9Gfznv;bqc=b4x1UzlhaU5kT#lg;V#H=%F zlNmx{%Hgsj>08x&{k~yDjNlY&9L75zcIr)@@xb-65~ELuGUF-&uor!dWxmMT3)-Mi zdk!N2G__vGX*7zc4XChw`@#+E9e`S+6l>g*$IP$|d+laKx@6b28XQ~%C}&E)5Ua7U zfB+;2932!kx+Xx32mt-e2SbVUg2el{v%FG;j-WQZriI6ke^A&wR~PdfX;r*qbFe*! zm}s^gD94K~M##q0drF=4cK&i^Z(k-{taopBJ;{)jQuu>V<8_tf05jC{Uhegb7NH_WgYjFo71Z5_WQ;{qZ?lB!u`9zIv-96kEO`Pm(*{=uqA7MxR;Kk zCK9R+LAScL414}_2h-aqe1j7as8JPRz9x>S;YK)cI4qW}sCYME$@^(CzCAMa4jEa` zEZlez18T2L4Ugg+%JKqi8FxwQsxt-3%X(=$?R@=&t8~s!BjZz(sWxee;GN0)%{>b$ z`*IdI(e)^?RzL4)R!TWjD~fD^iM9vqe*Xa0MPZW)WMHl4wHRE7T`vCsfqlO}5$QJ~V#e7R(+)W?6nQ&G zS0IqP1KLFtene^6vAZIj09{dNyoSE~Mo=`lCwkadGO~6M4IMf5zT&HU?*Yw_rh>;o zt&hZBl>_9^&J-T!v@Nx-EBuUPS5gkl2{ zD)StgFlT*$S`t(mw~&~@ge>2rt!_Bp1)vtkXvKDnyFkW07SRPmRlF-w9ro=4`ym!A z7yz>co2XNmlq#a-r)4m0b_UQBW`q%YRz-8TkN`%}*?wY;qE^VuM`)i0Uera(O%5We z#-M=gVI*i3&v-A)N{6}@40du_$=vfRQDR0nTScRwF6RFLsH0)@hD<`RJmvsRaF6+HWjqg4?Ux=8LK3&ZZp3=k=eU`AuB`&YS*`qkWY6ex;x~M;G2%(=+Aj29*x_feXf?;#br&wnFwp zHv9qi;ugf%)IRjW>_%T}23+|1rp$l-L$IsAfR&A=)waTbfpX;7Yi3|< z9`O_1lT8xcfE>xwOO?GY>9QOe$Oee6FMiV8nKH8a#Yk`Wp5NkElhV|xtm}_rOLKMO z?+;O@&< ziq_Jzm4fNjw>(65Vn`*A-6mVn7UP1le`OLBKNa>?l52le<^+}ic6OFP!taaR8(s< z0km9}$}%me_>OnT1}!QH;FueBP(J`1caqB}TW=e8fd*84{lJhm-XT^P!;omp2_Ds^ z`PC**av}wyq6e}rCUZbu*BGthRZvRQ9s z1--u?oQaX}=uK-}fDLJGH~A2iY?&Khxxmy#MmMD?go+sfDg}}@scsy1m}9y^cCo+O zBPK?62O^PsZ^@Q^*x4}*B{enGoy`se2m21J1UhlJDtDl6r8vdocdH9umhnx|_=wII z87w*C1?^?fCutSIlO9Y>h?Wdb0;;80zX@$hDXUL&4UZP4BxCJOzsy6qx z>-5*QAU^4T-ev@ZqBSoyd>DaA7f1Ag<8;Y(Ay7c#1R|x2CN;eUT!b2y0TrW6s#qAe zQo?0tm@XCGS8XnWFUb8-R~@|sx485gr^3ib8rK_Mhjvz`c@BVV(}^<>W-EU@hYxS4O9!f zhhtKi12srEfP-;>+6F5bx!NV^Foy30=xWR$R0DWPq4NR)NZJ+HTwlB(?Gcrm-LxF@ zCvzBXB0of8cpOZw-&~Wf_1+^vB{|iTReGU)m9}X-rud{yl)&jL(-L&D54v15wxrm6v_2 zS7!^5`xIQ^;Qa(%S9KL?hcSm9p!mdfT6_Kkbr$QE2%7P-+7scCW(%sTPbj{$DLelN1D2q z(aJJEx0~j>_?1{B0neFkJ>AU@apDJ+=mV;f7#=p7dJM-K@@cjpa%LQ=PFg3Oro74l z)Sze^2UVqDJHWk7!Rw0t)Du%uC{Rk#H7m+hFAohhjY%+73cclx$PHX}h}tqAU0*Il(8LW21p+v^W@C>g zJSfzf02@%d-sMcHI(%#thBs#U5VnGt(NL@I7@qzkkgZdagX&f_=ftxTr>HfC33Xsd z7f5v2s6UIk#vy&Bbx;;b-pp{TZ>pFTP9-j-NH@Nl?eQ`7II-%|jK;v*Nf#}5$T5Pw zLavZKs&_x;R9e(HR`%>p`xpy)P!aKxSua8ND-J&KMlyeTKvlXm+Gx(@>C|v2kU9Ix zhQRHyi$lp`WCI?GQ}Zg{SRyuMIMIE8}WSijI_DVHb%(L?=3?ea4VaL z;WUB)uFz4N1z$rjA5nye1B@RrPaI&)k2q4u+$Jzk=;6}=% zVhjfz{KQ6MK}YE2d<2{vHFU}&egwT=0wP^msU$6 z?0|Wc;>KK-RV3cVp#w{>Ka0QKEuE2jWG7Fi0_ZytEXp&Y>d0u3usqR~VfMJyXh!!} zQT=k}-HUBel9g6xtt8Oc34M=M8&e?_Y&jn?mMpKS4FWqufHE;P`4|i9V#rnLiQj$s zj*47Rvdi0#u%yYFL`cEjKG0@ z?qxsJLaIim3b+6aruW;CGUNfkAFQ>W)D0jID{k>lpaqHt$bn9kp$hs>#L}4C5{$qo zv$q7wlNi^of&0tVUG+I1Kh6+a`b1SAU*fwY_>mlHVt)ue+S_><3X-R7uYc()QWUkQ zYZNcH%xQ+yz=Ey0_>`)-b|i`tFR0MuX9#l@_s zbgSc?;udS>F{L4BZy9!gZxoUYmY&uIlaVXGn95@<0bSrCge}ZM*R)E3rs9wzgDYZg zDyTd~zGG=MaA}EA1yO);B!tueUho*C?;eJj89|H*iUeT;r@e@W8j{;{6?cw@OIS2S zsEUM9GE^>X$RkLKsHd1gsEl{G2@W`eQ34@)=0I*Oo{S#jsfZR_tG4or>H%m27+83V zM3@xO^+vy#nqebo(y&x;c9bU4&~6E_2p!`n1Vo}+;y4s`fm6^M#XFb{-3d64Y0?u$ zp%D(|<7yCxpa z?x7!Qh-nGG%2L@m@h$8`Rz=elJan&OHjJAH%2(6Ur+B;_qEQ{jsvMa<44OUn728Wh zsr?vGyPGg(#;T#$RSUoN^Zx)Jq`(fTb~@NlCi}+)>2`Myi5R{|%iK2rd>Bzxa<0LU zH{z<*`tb%wV}RpU<$)_(o@R_$LBba{J+Y?X4n_Cz0XsT|A+X?JTNxxU00KLkJNA_} za-Cyk>Ht@xwHpV)?=I=zF+@xuGF|#=riz~AkIuK1^#tf`N{VXB0(S&_^CeTJOl7iU z{oMlF0CtPF+9)U$M<(pe8L<)S6h19Jk9 z26j=Pa82zj#gGk&U@w8*Qiyf#YWo?blw-sR?l^>9(0fakBcCzUhWujdi!!w&)OG;u zEJn_&>RnaHKq`ey#m}fnn=)f|Rj_E;8*?iPD~lfyX{5?2IRcTtGfp9O{pD|nE1wIrR^xP+cI18&{mpP?Hm zyWH?b(KA`t9%aKID5E0k3Aa6^Sx%JpcjYr}tSa1u{$$qY8pjyViIgCTLZx~KJxyf3gbrrt)po-_=(?o z@f71lzz?Pciv^o=_J^hl+0Hz^-CHpR;}M%sQDtp-VOD1C)K1@NrA{w!S7B@1 z@_b5iC2L`f?Rtg&9~;DQzM;kJ#Kwp7hZ2GB)kOaQFPToFPs!V9q54c|ow1z3fL&Kr ze-KuWpg#uF!b28vg0F*BPE~l12|v82sg<#V~ERN zMk7^_Hspw|{mT-0H|AC9HlwAg`KX0UFc%G!#b&0v+v8|yhCY5E$cGuCLEwrqzzr^< z0Qff;y(+WfB7*s7eWsk@Xz4woVQ`qQNY!^|#13AMTC*HWLaNVbukPo1{*iINxry6q zgz9E)^|^sjUM0_v*34)M1HkbU0*sEUxU)ooEX|`5xByw80UfKD;cBZI^5eE(s<%Y> zhzgbjox8?-&5XLE0vv8YmEwIHjltNDF&>sR+Z-5{=w6B}G$FbbF=1K*THy$y<;FsgBohbiILv%Nbt7sHhIH)vS2xF^2y(=hqgeU@|pE3a!hSh`tu0FuXO$kYJt7sgStzsg% z+NDK}{iCVWE+g^KD(Q^ek|bk$MI&g84)Uy?1d86{@gqrTCaFOpT8sfV;#AuYyqM0C z3F0_*ZZ>p-)W{P502hIAjzgibGA)x@k0b1SN_6Q!!@m;IkxlDUQ~)EidPmyMhd=DO z{bm4^1a2>RGcYQL@iE_6VrclT&>u{Y)^5f`oWI`zS4ea|EEBmfVr3aU)B)z;dgz&! zo7?%A>g>aFxD~uAcC)_s6a%S@59wKld#iQu$2R)eY+T!sOi7f1KF<0H&?aD%r?*n+rIIA#p`XO zqO%Ls2A#xU6l!gSAH2LMR;-L@i}C@L;K)5g>RnZD;xkbu&fUDi6%fZs0PTE5e2m(4 zlSg0yj5O)eLtp*v3b0mvfl_!M+6jt+6*O!S*v4_73LxACuO*Ufcb4XFRka!{K(ai* zGm1F@9^JoLbK^Kz5~9cln+8%<>@tn-X<-ZO2EiojZf+>OZEh#U>o2UTPy_9)iSaX< zOoR(6I3!4{$x-E7P|P4k+IqIg#+5`-+#zOEY3i#A)Wk@fmk2#ULsLW32Zbqh>nC z;#*_7fmJ9CK#{c>W-`E1@^}3pO7dy2syO7H@k0O#SAC4HA<))$6)9ZAxZ7ZRNwuWH z*ytnMRlg7vyV$8-H7SeK*5I{^3uBKlHTwb7qk69Y0Q!z6#-XaS zznMnS^W+%GKtVV6mFY0rq|_lk(-jFk$s|oDrOO$3l1SOn5=kTyhh>@BjhQ5huL2Xi z07)d4$PUmMB#c8WjkJN3-B$A?Uq&%1_+a!>pB7q*H zk_AoxsVH2MMun-wwRnBdTGRN6PNhDFF_EMm4T+J8K%B!o_0jO4o#$8#v|e@P^crx0UQ2M~!Q ziC;wooVssfYF$(oyX<6=5M*~y4;&dwekml47`1e0GIae>ef=zYlziOG4$9r+k|o*F z)ZK#-xtHey8yz5aH6)Vb8lit2d5QO_Tb`Buh;oAG~cMn0S&%LRyMF0^8Uk6JDyOmD5A{ z$s}o>)VU|yW`tB@Uwx#KCH(@8h>O#x%hV<|x-DBtBvn|o5CWC|0BJS)$e?<84{=o_ zl9?)SD&hi3yOKyQdICt`%X)FGg_1eqNg{&!0r-gKR!J?nl1RjA(liJdX~xBNJAXMO zl+JrosILc^b{8Wk;ElE;ZX}W@s>_^~vUw&|i9vn*NhF%vAMtbx7wPea+*uXdyvIN* dH+@wkk^LhPUw^cLTvQq}+f literal 0 HcmV?d00001 diff --git a/e2e/priv/static/images/corex-ui-og-8952a72b82157d452a54bfc82c001011.jpg b/e2e/priv/static/images/corex-ui-og-8952a72b82157d452a54bfc82c001011.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a0dc6ee7950960bb9fc382532f7539216dad062 GIT binary patch literal 46089 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

5%O9v$pBIgmNfU^ODt{1s z)WTmIDS~dh^{K*E;Xr_}*F~6f{!rvPqAy)j)K15If2F?v$^CMlO8~LNf106vs)8K` zcDUJd2_MT<1`H^7#pzbx?Fb)3SGfe}6PY2ZAC~PfiY^94mk2rwLXZM4NQI6G6b5cl zG7H-!Cv|Blf(r!RNno)%*bt#^Z;MYL4)m|w5-dVAV%#=N>>p9rhywV~l!i|amIH?; z(HpUG1Nk!p%7_?^U|iQGOH5h2Mf zoFac^S|tEn_22%y(%6F$TYKCnY#v7d;ony~o*&e;DVT9p0g`aQ%PkLw{Qv+t- z?{E9Z`cTs)2bYY?tqo>Xe{7x;Jek$+YSN&qzI`YaA>cY^_cinH`(&i`fzP4lErQM ziUbOl!a_w>4e3dTi%bc)WfP{WVpe6o62_bTZIno-^hqP;%U0J~}Ktp0$5 zu+G1b+>I6DefO&0ar(AvVS)MeGh{6XGHK9ve3B0JG>x8Q^~-FH9*9-m%2XF8l$f{G#gx>Tvl64VfZz`VDr7BiJf^8I4Hu#xQ#^$EE}MEcdA%b}e6Ir~ zY8^KOFZ-RB)xSB}v$L$B6@P;$?sR@}5rTmXWxSPuACA=0=#!-C)rFbvCNFnT$E>&6 zQyHw8(ndGaa~nTNI8<=sveBZSp$LU+lGM5X!M3P#ub&~oP^8->W^Y*wEK(?_MO|a! z&8dkMnrN^&r;S*}86rW*SrHXljL1wKWbun1=~J|BW?X0Cp^wTM401wXFN!&2Mw{}X zae`w*6HY_klp~|t=J{1?%;?kFlTX0MF0tM!gxKOgNe5RY zeNd746LuB}2xl?I^_A~Z=LZzmM~84{0qS5`i+eO5Xp0Ay!S*P;j_MDV-_(mthplGT zlYfq5NpmpGo4DgV=PM5Nq!Gzfu4!4!NvMUHpAp(<&WmzPg?(z3W3p|kf>t?_aY zb<~S6n@rL^XwY zPR-4*ty)$_gw6M!x~!)djX=y@y&*<^U3G}7B9i(n+hC?!gIP2U^+Q%8Y%yB+~yZ2 z!AJN%`?ohX?$c+eu;`zW`D;^~Ba;yITF|Dn>1x+2aCCrEt-Jy@MjbNNpm0!ZHIBLv z-vZysVz$3Pz3PYMkLJ?|mdREneP4oo^H5sGI6n2WJ@j^OP~W^^++#RZt-Sy089z2*ged(RLo$ zQvWQFu8rb>&Pw8`E?SFAtk|1^Xx&#HgNU?ZqT0P0KRUv^`-z5}BD%$0f%Xixi5jWE zX;_TU=SP%NM8BObqBroQ$jh2u#le$> zGe_!RH3l@OCkaFZ7V+M-n_Ata=N}{dzF5x`me6|)Vv&{VkHz=d7cF2IEBAE5LluPd zdC)%%7?E?!B6uoLi-UOWB7e}0UPQ_O zLP^Qzfoaxf!I}pWU>y;}NBoITr5tMdEcL{ig788xB{ye3{udD5-QBs>M6neXIw_{Plsmol*av3Sa+qe}K|~ z7T%x*j{hxmM%mEN@1vPqm}ZzloI^_o^FkLLwdF_2U+QF6OOnk*fNy&}MCJC)P#(OqPMBZV=gG6OA2`Y!|s?-1tR7cB84~V?~B)H1UGn z*XMMfbJ|z{^!ec%E~E5TabHrE-;c}(5A*9*X)v|)notW?7U>dZ(dF_Q^U}>G(~V_J zfad91!Bxbi60_;Uahz;XQ(Xfa9w@|~&f^&i@DsBx+v^zvqWJ@7f$WOh+rFp*e)Q=l zRr84?8iw@+rl1LjXVFy{Pp4E*tz#ZyE9S|f=33J>(Q~1_mUyOE4yLv9vwD+?o(|mP zrU7t=&pDm{9!&uGD(YyiotIaeJl1rFa&K~2n*XPkph$BFZS#`V z5$sb_nK*7h4*dsr_K>Rboh$5)ia2-YkaFoPdwx`eDZc%HTd^^ypW&C**&c&?Y&PuC zx}!K24w|E4HsZv(V9M{+X!yt#v`OJ9*r-AjeX`i^Na&m`B=&!neKcJTL_>eC3f{jK z1uxEvER?D)kkd}~A}HHfvnuY*PT}|6l6{D8%@5~6tmIa*gaT=Wlyn%XIq34gkme>) zs119(|3FA%i&*85fJWwFZyT-Sr`3@Ib%fG!I?B*T!hEF5NcD8Iz8pVDvahla=kbv_ z?xlS!5*Ooy!wcsT;?7A)iQTNweN)evJVd_o_w(~)WjDXwR}FN%&K+YsU-=98V~8~R zsLdLRfcTD{Ml=3ecQL@wIy66?JFV$*Ad!4^1if^Yv(%5;Ub5-cAlQiEO?e_l3X;`C zmwHeeT&C)V9!Za3uAIjKMA!J^A+N3Xx>7GLfR~&{{l~g22-(eCC4iGShfWH)@bR5r zv(xr1CL`u!qEtp?_%X7UA!GV<*qpPwCwBFt)0Fnkl}j8maEi-{hGB%;X|n6ZXAt*M z)>;devSNimDBtoatVUg7bQ z8#h`2=%92Kv;2V~kXA`A8}P|f5AmLF|0_#DaLG1Kq7}yLoYVpK{5y}JmU;$pDyBK{ zz6G&%)aRUIz!aR9x+-!D!9Kdfb;E4m)sRzO($PbyNSPn%u+8pu;`g)JKdUs9hkW}= z)z=VG&QBxj%!-rkmZFtS@UVO0nWh9!%h3~Zpv)$rqCsqY7)xTXwhAf`i2S%&*8FhJ zTe_~4#IUwW&>q*s@Tl<@;I0dkjuA&oB$1<Q}*qRqtq&$jwUN z`I#1l+ki%yJ2C`l60wk z+9aZ7;}_0hdudCw>xOaN3<>g)0jY5Idy|Vly<%@QxukIZ?EiQ(rXTDe>K_tu8U6Zu zf2~1sA*SFjfUVC_hCxCIc@nE54xdAQqG?ePuCejxbA80;IL335L@t6>g)?xyIi)Z8 zmFXC|EK!ENaEzICAwAHF`sw*XdcHr>jU2kr^O@>pRDk*I-LjT1pJl{Jy*wCf@y0Sn zlR6ap9a9TNSyw*-b1WmnmlA(<>Ax#agJ5!p+Fz->Hy;*Aq9yvLS7cO}kH|;;E(vIg zv4nc2)#m0$?#^%|`IzzdVkH!(#j1+lrW1=@u*++72*uu?E9EZH*y^-aIjkn&GHn*o z&!?&^{FCF%|Kzw1-TI11SCY2uRFqHv`Bn~i)_rG_kBPas=EB2=;zxNTX*o6Br7Q{P zv=F3I=>G#0g@yS~cFya+0I&c1lW`!V_7@=Y>$e}Axtceu937%LT9sJ5%F^Ju{jGO;VGlS!s6!aN72z)sV(2rpuzA9 zgdt#@;;H4Bq?laN|q0FkqB1@!TmO*oUj6%IBm+@?tK&Db4tNx`kL_dcd>uKSR7}i=tw^J!f=}8^7G#k#wL02O#m6I$ zymL>pH99Tu-CZ=?Js7p~hVulPtI^@8ko6F#{lRkszsd?BkQx1M38P-@9^wMTe^yP- z&3x;%St=WBz2z&>Ych?2c?6sS-5!0Qhk3nc%eFwRzX188=(F)bna$0(+VHs8D6<}0 z9{&x3^4@Gd37B$AKh3kT2CMpN`&T@d5IZY{h z0a-)^FE176yun|gY95ev6aY)Qs)11@hBk^9;@n6f8Dx>l#~&9D+9l39TQ^RGkR&$j zDQLSQ+R_yg>_IrcT|Bb*;Qx9oR6{9Uk*UV{F72QOE%J(yp467|GDLpMqb$Tyk1?mK zs_OB;lZN?s>#X#$Rw!+t#(kv*A_g)U8dTNftpPJxMNgrT{17&VP6 z&aQ!OGgFf-&eQ>Q@AEns>>~O}U>BcB=JmW`a%PR2RcCx<*B}2?S&N7Txk+W)t~N@J z`Uc)@m-(>IdX92HD}LAv}w*iXZWjwxv3XqUJ zZm7|?)bvx-tq-H-cEY(#H08=`v{i_CnGeZ|LZ#tyYq(=sn@f{?KT%JY>m~&5TQkMW zSP&Q;%Qf+=28tKrGDICk$GS{|7b1wLA*S41skIb&ghn7hkG@dAPK!YepSOD2N%_A9g7=uOieg9gO6b* zodMtb^=i!0Dg$W4uMV%n-VE|m|46VoKIvWI(Ozj!v=^LTak1Kp5Z|Ne^B|B3?0+c) zpcL)Qnx<(G<{F7gD5n_?BWKvQQegWEP;`N2T%FJtGuJ0W>OMLR?D@vV z6X!04IXs9uRk!!_UugEX|7@x{O^KRRy?@C0A>L_>E${pB3HluFPE3JkWM2tJ;Hj8s zf4Usj=~%z1gUOW`@F6bqHm83t*h+Kj+DXeO?ixqLhllQ*2kG=AW7CNN=1Z*_Y64rO znGFYCZNzP0EK;v-&q=az2DW~g>857x<}{P8Q3&c8@?uW0W_GPDwJ#U<86>Z##&=Z? zl^1!_Fn5O=9cWlzs731;bBq%p^&i6$_wU`EyM(2I^pml_(osf-e~Ib3u5N5_RfW_P3v{ktgMvk89M51v(? zxw~Ev?VV<}6%lX2KmRCiHaA%}VK89HFlR;bZN-gwpwtnR5JO zFy%)|eTv@8Ad)SquGe6E5qyxE)3Vk?^UcA=ws!!OFsGPBBfnV3d`6mOCsy<=95ab% z`7AW<1azB}$j`@K16j|s?YGgM&F);smRcNYPd>?IGD8Mra(NXXUz(op(4c)GYx}Zq zZQFx^ZW`nF-Fv~4m$n7TI{Pr}>0I(u%A0AO@1O@mq5D#}u!^95Cn8_!F|sA)BKYi7 zBwIvKHt7>D=duNjJ`L5}Uy$~sZ@ormr+obfQdQy(t0IYv|bY2$3WAe6LI_Ss`M1g z(jXLH?hT2buX}qerG}gUP7D-Z>h@02up&tf>UVk%PUB{ZZH@sj|86LIAh^s_uAaGh z{RK??1soVU#@PLi;6LC)%}%ZdK?ybpviEE#uku3oa8ytP;qGUOd=G;81LCssfvmmC z^f%Gz-+Jn+0K^y-_vQJc7ypdC`1}x0pn=7*HB0gLgxloRUJ94X(1*W(mueiREGs&S zcqRgA0oGypdrHaa=0&ju*Q{?@eu7jFUDSTEx}-Q6oQuKl7*{PrFAUEtOgu7ohvK5k zyGW03>p*x>e*qC_&=BETO$QZ^s2Hy)l>O0bYyAQu?NfxbKFervYO!przW^;*3^+{c zB25hj#ta~DB5ellrVD-V(C@#bk0n)!7;jmkNdE%laMUMm+7&jQjLUz$jOC6I z*O&bu5c)W-FXP3+)k@5%^Gx_Py0Yvj%?D=nCI900N=6fBFT&0K_GWxy&?C?jk655_z366rq!u2dsh`u>`=Er`Nzbjn$bt({(iE2%7$e5i8`Cb+}mmKAtX0> zc^)25(_njyj@QEE1@qs&Z;XtLBX<}fpzZosIoK z$ySi{zJIyAt-Xh+=H^kqkZZM?6QZX)*7B)X`Tjcb0-y6p_g1WHuE1(?WfNC8rP@Do zoidk6eEzz;U5iDy_UfrTq@|tz4{Boczx0WCqyFagN9RF4Hc55zca`Twu z>>6=TMmbDty<9nOsa_G?N5oZ?B!oO+c8{>7R1D+cM-;WQBHtrgxG%k_fu@(d)5?X( zJkFyn1(XVH!3l6Aht4^jA{~ibzuFDsKvv%O+1tA}U5&p6WKT^p{3`jo<5JF8+6?(6 z_(Vdn)g#+yx_QX3xv!nvzcroEDd-@b<^C|$WAz4(NDe&eq9%=#ET`S?M9v@TME7i% zMOL^df}yhTJ!-2TcdcuMsLbZ z5tBcJLM?z5o`G)AT`WVW6_@xTk9au{x^zk}*jIS!sp{@{p5s3K5%UuN&M88fYw;n6 z3i_+{Pl;l`B67m+PsR58)Ebe>!Ng6ann89!wBg-Zs)?wfhK$cbn8&}3zwK}Q}i z*_NVM)%z8uXL!oQ%RQ^$WYf|0OU+GF)tF@u1-hDYY5Tu`SQwrNbqp4HOzM~Q-cW4$ z(SB4RJSvV6a<%S35VJ^*LFf(i?TkOm;z=~;6gy-y^3r1KPJ4OtLJrSAKn94}zcmH z8!@WA(H&v=oaj5qp#lGyAnjRZ)0^ea?4D=a&vRA!FT}hJFS46Gtx2-wz!7ql!^ZyH z1d0OXX~w?Ur#%6}O_E`~_pyDY!q|s#A=}Kj`N2G0xu24HjQdjJR%a80m~!emf2e+b zWR+*}BVy*ee3UKzE?2fNU;U7OHCDz?5z%g_u5tPmy|d@1b&vSGn*8Xua-8K6l57=Y zB=TSb1$29PYOg8vcdZ2s+uO4Otcv6HkUa4$GVEO=(aiKIBbLz?LtF-VVDGuL_A=bG zMf@)-s{|eW9*1KJZxe)}yK8+_W#jhmDp!z2GR&b>Yh!zH>iYAd#oybIdeq0oANBi0l2YYs+_Xz9fuVa=ofnkZ z8VXtWv#C%gM&R%r{$ZN;NJA%^1t7F)3G0-Ly}6*@*^t={#11%ne+{mb#`|Zz;86TRWUoo? z^I{CC;%h{k{fCnA1?p2ePqUd;!qUsf*&v1>tV{#82&-Ndae2MKWkpcIQM=KGu%#3k z?n`^qD*4f7ogiKnl8v=Vp4Rk8k!m?G|LXs$>^q>EYPz+9AcRh+p*QKFBy+ z3IwD#5d;P4Er19Ffe0efYos^n9RwjDT{_ZKs)&g9==**5es}$A{cGKvb0(8LGpA%d zXV0E_W@hh&-m7dHInrI)t?ltLzET<%J~YnMev59JdmqC4=r`!VCeeO2d6jTvJMXF- zv)(RC>g{d%!?_4oz}IKwav2_OsFaLqwtdjcnWfqyZvE#imTTh4O}sIuiTB#s##wJ z{q|~iI#z;3?}uo7ahC2W{0+kY5E8of@Y3vneZ$#s9tJd?Eycl?`8UO%X?=(J9n_k! zb2hZnzM6eKW%b3|9rlA!SJ-tzhV8>d{)eu*)ZRu%DEg-4>ak4^YPAXFI zaLjI9{Z&wT9y72ZG9VdP)&Xf6=a^zExa*rax0)~Ze2bU9e{8nD<59e;CXPlSr6zrP zO{%a7N%)Z|2cPhC`!cFWP9uZ7%?>kq^PbpE#x#^CN21sqL+T%kxJZ|9$!%0heG@c? zg9^j3V`|Tr3NBGaF)dax1|IkYLS9;wf3gj@#f~)@rcROL7C$^s&3Y;nX6bcLUkONos3Ac859U9^jq^9_GcE*aOb}X0t0LUwm zT)2eSI5W(FXEWCkQr+`AbBHDVb_P;&$D+UZ|2)3W%RVo+oz_z<6+Qc1|5@TZ(r~RB zYpzPD8)2AL+t+Tnj!l6rCp2W#yCS%@ zqqp}bk){{7|2TN8?vvJ25=n$cg*YiT7BF(1`98vw*42Ftbn@KB^*m*zwcd%Hp+V5_ z=D32zi~o4J{&~nogN0B<&3R<(2}~JaPZ;lfh(Ds<*fcA46#T}btqbN+yq-IyBodv+ z4M(U@z`T{D5nhLP?RjVGu;&8z{ViTpn?^V#^n{`)Q$PEa6B#2mYba#iL(VizpZNbI zMy;~Dj7`%;lB4Q2EfbU!Pf>x?Gx;}-_-pHih9z^kP|ucUtm`u7G9GJ|->S)ApPZuE z&rGsFZhMP`mVAHBDy5-^FR;6h6PUxLojuNaUmhi(>s7#Mw4XKA4e7 z@r(?CU!tnJ?!hEpWt{7SK-&8&HJ+%JWD;=xxddA|!}HY1oNy*7>oPun0UHiTrRkZ} ze8n4ZBkyY&uTQnNFCUjJ^xdHIlY~%a;=pUhRt(Je^G<8jk2p1KR~cI!)-vR0&(LOz zsG|yZGLqEg7S{24Ns^CBNlDs=jC!~TF5H&~@cZ9ln-5@>%~`8;-{yrqu|U&%SU2%t zwe8!yfuu#0my-k4!|2W+RJThWe2yAK{qy%1D+*?9l7ksBUP_tdIR zvSCYx3%kqhXtZx;Tra3*;(U;lG;k_0*uVXSslj&jPWsyOhn@G`Y*8M6j0K=ja^pJn zBLSnE(T?!LLHTSav@@>1-M84uawPHy3oGd5Y;VI%`u< zNXLB1{ZPfIH921z)oRGKppS5 zOma3&90rgx(ZuZm-Ct)xakRk_e2|YoCm5wZL_%(_Dt7;~E~N(04aQzq;LJa9l~DpL zj;L+Y!ai9dWzWPuSy%nzDg)n{14t>s-vo;lbK2@Fy0hdnR7HGZLJrU~h#*58aQO$rlryo`3Q1$|t3 zlvy>Vkfk%$Uw`mZZSKMh8+P`ROkPGM zdQ^tfJA-np{q}SIJ6~H!Mg7pFRbE6IYa;8Fn>0wPr#q*JRMUzrb`@FJ?UlD(2pg?e?00o|=+A5|1+HF3G zZw-Mg6cd`1eea);hlVomyPsdAU0zWe#oeJdX?XnfV}7aTO&&ZZNnCxBs5ziv4EQH# zUwJuBq`#(ColH4miz#GmrdR6GXqmwl?w-anA(aZ0jKZ5Kd*3SpZi!<*o$pSC?Z}S& zI9EN#>2^w9rDfXPxLk!BCjkDd;%n&wuF^I7i*$LI!*Ws#{Xr8~!c=vp6PKp-7M~T$ z@;CxNyPN98+Y_!?R7thlbdzWJ^w?V$Hl?WCt$4sTt)Ka7zHIT1J>l?wCPz1=^u4WF z*Vuok`s2Zb_3$28;#Pv%qAC92TjOpo*W1$X7RiGVr4-WFtDVawa6&c|4IBXZ!E%+NP9;f%+NItpP#G5V7f2DVpSE zqoGY$?*AgZQ)f6++^S|<5OxU5#tD$*^?_ap@e1235qzEV~kf%v~j{hU| zUc3)?>~Ra#t7twN$)DjmVEZzXUQigguIy!Osoe%)JGmBijvxG?s=mTCxP^#GFkItl zA-*45R3X*A!tLK6QB@<1g zbE_QB*};#UkA5U>-$E&BnDHYiTgHH&JtNzcu{qI{8)gh#3}8zW?l+qH_rNn|Za4Y-h6V zIw5&=j)~A;>O&3*3$kp=mNEN8~v5T(1g0pmoH@>^I|aD9v7R3_nX zv%ub^ih^;14OE7QakUN!^nJ~wznG!@aFpZ!1b~YmHxp}*w*^M8*O3`#B}PW-eI(lP zTvyX1LO@JN{WpkwcI`ybVSpk3_^iUu580P2C5yOx!wLR-+y4aTZW#>BFknDf(;PBP z{Qo_nl)&E;s%-Ha-etHongXCt_z(I34}|!Cy%7Rb=U=W9LO@ML3pgR9;Q**kWdk33 zZWTlEXMa(M{}0i5j8F6LkH-T1(vikv;PA0ZEqmWtcSqmw-{V$d#+8T}_w2#QJyQJRMKw#H6J_2T&R5b*{cqBx80}Pqb*lsE1rk zN?XwMbn^CopuvwFyi<0fKx?h1pb-#Bkl9b2x06)RH(Xw^6!`@lM80pnI3RNlr$PJ# z0jvmr_K}#}(Ub6Y%`OU34|ElCbeLA05Zjy6bPOa)x3i@Q0+7Zt`RJQD*u_ZVlX)NI zn4X<2*VzVS?k&?_QB#jbqZs+Aa2n0bk%@a%rZmC z0Pxb_BuGponBWi0Abe1HjL$Ed(@%!Q<*)EmkbqHDIogO467qtZNDDLgj8J&IV+q%_ zS6dccIb5!@_|q&xTlet2(NbFgX;5X_8Pm5&HlK(q7pj_Fparp$&yhqZla){?o3RQD z&RW(#^h^geqlOtE)7Hcm;KPq%y&f$6;Oz(II;jkv4x|L9^j7!AwJ>yoekDzKy&}?a zdoPl&jlA%T>zU#*GRF=Y-1~9E8IrQJaX3zvE1R{Nl^5!)Gfwu?{|xb@SzI3B?5y9a zxIdaVAvVf=UR!+_XdOn+ErtrkfZgrIuS|54j#xu&XbX7tg{?QslM0RJ=M&hmg$8%& zpqW4egkNbaa>QKLZSyl-jY5Q}3f)lqwRc2KT6H6+Mq%rB>867}BY42(h)t4S%8#x% z8ZZ?7lsOvA+&*2Fj8VI55dZm2OTA(0cMHc&LwEd!P;NI1M)jW;tXdHmsob0TAmR+P z>azghxI2z%kYSc&*G(NuzX03NE@Q^JNd9j$rrTdlWh3iC7FmeuXYIey!J}^j2qw-= zQvt7)`3oIpmM%L_eODT#lMqy!4~pgu)+I^p1q(TnK=#2pk~L=_os)Sg%^I_QTJAW; zI7>a{b}aGGYT@OW=6%{12FYA!)H$Sq9Rss?;#01XXDm*S%jA16HKt?{2_!5pO`nR) z*`;?bu(uVDsu0dDZKbd})5}1UKEE@^aeP znr~ARprM;;PUhhtU;vCbT_B5AsR@k`tkhc5rkFZKM(W#+Xn)Ul(CF)@1vfGv<>t{E z+&{G3mL1GWc+C{t)~sxMXr0!Kl?>A|XhapT2>e4D&-Ec$${q7$);#raHWUk1(OpiD>++-6YV z4%qL-P!1K0D$fTGAy^)~D>4>3$~#Tj6gY;oIR=Kur8f&R_e+Oz8Lse_k4NK+aNabt zbcbim4m(J#W|bX($B%1}vOh#Olar+2DD=SMOq@~ujf6tM4_(BnxTI9-gcl<5;$A&{`PpREU5lR# za11tm-ejN|9=|x8Nh(~4>C5j*#00ea9M#6W>~&+8B|GEqy^%KKIyfg>(rECyH+es# zvsVj)PMT-Cl<3HEKd`XK(v4!#V5IuKT9kQy_{v@zPobSY4h)qGKVx~EEx&re+%`#* zRf>NvR=4ZI>US6e(y|TU=NKdjWI$@9kLI* zzBkY{0v4Dy<=ISstIPMOgi#M%n9S|^0xSp3g;$gKJj%cfk6>g+A*>V1WsuvxqDsZl zRs&v+tR#1`%2w`>t@f{gb=R6oUJ+pYJfK+mq{Hsv;f+8wXQ(0EA78e0Q*#UZQs5EuW^V&nY)`gGc@w(DyS&`WRLFvLz>^b7g zDk$EfNtS#nI44CMIF#ede5_cA9+{(p>5_F%$|x`r31mnDZ3cJ9SB-gpNKeHR1UBAi zdM1#@C|qAxxamUsmG8%Ni!v%*-JIm>`q)~!$hdhVqQ#Ww?7A&eh%!`EtIY-xk93Vg z>d+P8gCBHr5zrWQVw45!%@ptoA4JJ!){u5*M^cn)MZy)XqxsEx0i;7_v+?2$Ed5uM zaeeu|)HUr{s;VmeP(^Nk6qd$rmTghWl)T zi-a%nXxULDO^$eu>sVdjqQ6j0{^-{HpNudZ19a7<;+Z>7Hu`?{^8)IDW&f{4G}$t! zh2)^Z=$qtDwMOGYI0TutsAzZV9G@(^$pBV%-8TOja2?A>zR41;0-sS90j-0-5)Pd9 zC7+MXt+`oh@St-zWa3Man2jge(o6?Vk><=M`pynZYgpDy6HWi}6!%-S&1iq$(;H`e z@^r&zOa&BW;^?nJO>eez{%p>F?(t1XqB;&j@uuHlX{9ZGlo8mVdO9v@Tg-Y?UFLhiPl%8#K zX{9kVeZp24%$ZNts$W}@K7q>O(|g`7_C=Q;dE&84=jSUp1(M4)^6PofkZyWIt4zdU z=Yz|e7^|YoD!9a{5P+M~K@Ldd$eZ?Sxj?n0wmE5MRI)>$WtfTBm|xTqMqdK$66Va5anHsO|-~NZ`GOYGq&e@vr>e)YfBUb*U2V}^pMq9e~Q9m z{?;(nu<*#X(rXnhM-G1aUtuP#4kUa982C;tB^rJCROh@Op$-wM9 z;-X`8P|xyT>8~VqN69BmJCAv*JIJMfgW!^(*8c!u)jXXwAL~+*Hf{On`l#)nYk*P1TbUS*%C7s!29S0Kc{D5xpo;%BKk9lq@5W4;OshD9YK@YRxGNXX z(4Hsv2{-Ml%3u=Po}HgkRH=7!DY#|DV3nD7N#*T&G(CZWSG$dG_e*8HC^sXkGH7?v zo9kW8Jq?<5EKo@;f-SVaHVjuTB4Zrs}j)(aCQbhO}0gVHftlxHzMjva~)|!>gkOJrD+kKq~=mOzMQvq3sJA)-j<3}sD%oKJtWQtzlMUKK+#xC7ESi$YwZlL`y78{ofVTo3k zcR#JoTt&GqqWX=Bi4F`kuHKG`5Ngs^bhzZ>oG!D=MSLlqIUq7**2*kaSZ}7-Pc=i* zOS^swMz@lSYfRNdL5@MACsuKVC_$5zN{^*>`rJf)^#V@737y;f-=J5lo3`S{TcOM7 zPD1jAvI_YJPqvDCHeE470aE;o=!UIvCiz}(=+e1pP%Z+ntj^qR1|U=%Nx>BWrDbQp z&AmCjd5h|M1Rtt(*k}a|Gw#7z`r|Jg+zLw|w4Z!1TJ`cEerV+W$;zaYGh$`U{7z7d zGV|?Ql$NTvz>J^~LD74Ww|TNv2$i9$W|%f6b+qg4UGMLmx-#Q2jg+pE!rm$6j$FEl4T8Ph+! zv(YaWD8OMbo&wj{Xs347CJ$tzoE%tLTJrROhk=*yG;OU+g-xse>VZhrv}i5n2+ zHZ|e72OSp=UMuj(m}(qm4fnl5_ijeLeT|`hJK-87=Y9D=sJlfq9(j|4F;aI@?m*_d z>A(Mik!V}vL&~tGr7OYj@vHpomQlYP+&ZX&M!ghn1R#wbQ7Ja;w_HHtoqZ+2G z$elDP5R#@V8=^sxZUeXsnTS)NG=Cu}wQ?hfuV9;{q#}zej=);0nqHgTesrt1{(A%R zPCJ&C08($EAlMOhr?djG9h0Oygr2L>I<=IMo<}u(|NN7&gxw(7C$;6xWO9t#&tVa| zUR;b!$~togiSWsqn<|TnkGL#Ww8@g8t-9aR?V}Lxiwq3GjgoG?16+_`*~MR=LU2Ts zn86sB=ML32cGs$!htqC2Ti(B8x^SVbVJ5h-#uW|uI^fh1sOm;&ORG4=8VD=vD7)zi zu*EIa0_U-95P9UXHDKk&h5V|WXHVdNTcQOMRiHeMaLvkA`4R!ZPr_fXi%U5X(zr<{*ty_zT(NO!!~3O7Y+ZF387psCQGx zFeWc0I1K4Oo#F4M9KheWc=JDHynB;44AJ^LC}|h$p9y^m`Rn;@3rv0F8U8 z`stv#^Ss+|RpgT8>okHX3<)KU7Zd=oHq(7TFD#IH+GItJXL*8J?Lz2gffP zD*0x4UVrQ+<;?csvVC6hs0&SFxGE@HWh7Q>x=ml?HEq=O)&hAi|Cmt=!>IWp>Ti_f zyX~PoU?YqEsa7oS1QPW8u3GN z-4`a+VYRO37a_E~;0Hu-OmK5FF5WY-Hkt`VCKe#pQt|HF5-4Lf-yTPP&WTnSer>V& z-d-ksR~gEg-d}HK=XFd_)<>$Ko?F(B^`#7D3b`h2XL=8dj1|V~EjEJ3kQFi0A-{Wn z=3(%Fdzxh#ir_$El&v~lcNtVAMMzc*9rnA-)v1q2$HYr)-@Vp1bt!p%M2gW`aCa6S zRy(D3v!MUnzGl&i91vz`qZi?c75)O~WF>9_#0wiUo6s*2#t)aHJcC#xJPan*n5Nz%6r-#0zn-90M|Sev^r0M8=UAt<2y0Z~Q=ryd z^R|3MbYKyD`FJ#!QCvQdvFUJVwQ2OHG-KL;IIq)ap0m!-nU^@MS^T1R{x|)?R`kDMf1}PvwW`^{mPY0NAi&TRd5D9|Cx#Wnl?8QtMZ-qp*ij* zc8Nw_9%?oP?2?&2XpyOuk7;pZY2WVKMEYC(1_^FHN#}HYVPm&L&uJXlM~m$=r%Nh2 zkzG2-e*$l=WGnlV&L`I7TPK$xBX6k9ay_8px?B{;m-7~&lXiSs)cWe(z_|u60NT3R z+hNwko{(b;u+aM~N(W(ghNP(B2kuZ5-9y{uKJ3#@GUZVhm|svio$U2^S>Aqbc7{6( z+q2H2+7<@z1zKsPog7v(x4bK;p7KoC%k!>) z_>}t~d-9MXB?xl^|C!0cce#?Dd)3S&%9k!P5T>O$U zD|z=x4Y6tVtUOb3*wEU(>cw_tzH;|riGX+M$@VSX`ZBW6JuwOLLx0jZ>(Q&2=visW zj-x7*6eJy5HhTIh)qzg2*JuFG#+_OB^W*lq6df;j&9Y`YB;9j=((;Jcy@EbLuhB9j zdln?#DimLrBk`5KiDmuF%ITF-*>X9Fo<*tqwYP^4Lh<5cQJbxYW`cgC)PA}s4TZuX zsNiNu$n_{PP%lfr-;zF^Loo-I??x*m<(s9rZ_d__ciw*kabRuofpMV6nHz!!!Xx-Q zwdUV+2Nj4z46ej!|Lm2|Q;5MoYzICbz;;}*#pPRNh6OW#m zv2eXK)|HsjMf8N%9~l^8ULQj+Uuo)78e@kCKs^VxkG$WjVXmRnpgKeqATIQc#IUn-+#)Bpeg literal 0 HcmV?d00001 diff --git a/e2e/priv/static/images/fall-5f37212ea29d4300569b148c4b2eb2bc.jpg b/e2e/priv/static/images/fall-5f37212ea29d4300569b148c4b2eb2bc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1cbbd9838eb0bec466800c57f80cc9ff8e1dc1ac GIT binary patch literal 35994 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 literal 0 HcmV?d00001 diff --git a/e2e/priv/static/images/pwa-512x512-b05b19fb9e7210bcde2ed7bdfa24bc27.png b/e2e/priv/static/images/pwa-512x512-b05b19fb9e7210bcde2ed7bdfa24bc27.png new file mode 100644 index 0000000000000000000000000000000000000000..039fe66c791161243e87734fa302af9ce90c0445 GIT binary patch literal 3327 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 literal 0 HcmV?d00001 diff --git a/e2e/priv/static/images/winter-e3e112f7d35ec9131ea2063c45eef8b9.jpg b/e2e/priv/static/images/winter-e3e112f7d35ec9131ea2063c45eef8b9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..418285798fb1b2a1f8d32e4c3d48d431d7dd2363 GIT binary patch literal 22067 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 Action.goto(@mode) + |> Action.check_accessibility() + end + end +end diff --git a/e2e/test/components/code_test.exs b/e2e/test/components/code_test.exs new file mode 100644 index 0000000..32d9e5e --- /dev/null +++ b/e2e/test/components/code_test.exs @@ -0,0 +1,16 @@ +defmodule E2eWeb.CodeTest do + use ExUnit.Case, async: true + use Wallaby.Feature + + alias E2eWeb.CodeModel, as: Code + + for mode <- [:static, :live] do + @mode mode + + feature "#{@mode} - Code has no A11y violations", %{session: session} do + session + |> Code.goto(@mode) + |> Code.check_accessibility() + end + end +end diff --git a/e2e/test/components/navigate_test.exs b/e2e/test/components/navigate_test.exs new file mode 100644 index 0000000..42a2d1c --- /dev/null +++ b/e2e/test/components/navigate_test.exs @@ -0,0 +1,16 @@ +defmodule E2eWeb.NavigateTest do + use ExUnit.Case, async: true + use Wallaby.Feature + + alias E2eWeb.NavigateModel, as: Navigate + + for mode <- [:static, :live] do + @mode mode + + feature "#{@mode} - Navigate has no A11y violations", %{session: session} do + session + |> Navigate.goto(@mode) + |> Navigate.check_accessibility() + end + end +end diff --git a/e2e/test/support/models/action_model.ex b/e2e/test/support/models/action_model.ex new file mode 100644 index 0000000..6e9802d --- /dev/null +++ b/e2e/test/support/models/action_model.ex @@ -0,0 +1,3 @@ +defmodule E2eWeb.ActionModel do + use E2eWeb.Model, component: "action" +end diff --git a/e2e/test/support/models/code_model.ex b/e2e/test/support/models/code_model.ex new file mode 100644 index 0000000..ad61d48 --- /dev/null +++ b/e2e/test/support/models/code_model.ex @@ -0,0 +1,3 @@ +defmodule E2eWeb.CodeModel do + use E2eWeb.Model, component: "code" +end diff --git a/e2e/test/support/models/navigate_model.ex b/e2e/test/support/models/navigate_model.ex new file mode 100644 index 0000000..04a3985 --- /dev/null +++ b/e2e/test/support/models/navigate_model.ex @@ -0,0 +1,3 @@ +defmodule E2eWeb.NavigateModel do + use E2eWeb.Model, component: "navigate" +end diff --git a/guides/installation.md b/guides/installation.md index 747f725..117d2a1 100644 --- a/guides/installation.md +++ b/guides/installation.md @@ -44,7 +44,7 @@ Add `corex` to your `mix.exs` dependencies: ```elixir def deps do [ - {:corex, "~> 0.1.0-alpha.26"} + {:corex, "~> 0.1.0-alpha.27"} ] end ``` diff --git a/guides/theming.md b/guides/theming.md new file mode 100644 index 0000000..17d41f7 --- /dev/null +++ b/guides/theming.md @@ -0,0 +1,202 @@ +# Theming + +## Introduction + +This guide explains how to set up **theme selection** using the `data-theme` attribute and the `Corex.Select` component in Phoenix LiveView. + +Theme (neo, uno, duo, leo) is independent from mode (light/dark). The CSS token system uses both: `[data-theme="neo"][data-mode="dark"]`. See [Dark Mode](dark_mode.html) for mode setup. + +This approach uses [Plugs](https://hexdocs.pm/plug/Plug.html) to load the correct theme on initial render, avoiding FOUC (Flash of Unstyled Content). + +--- + +## Implementation + +### 1. Create the Theme Plug + +Create a plug that reads the theme from the `phx_theme` cookie and puts it in assigns and session: + +```elixir +defmodule MyAppWeb.Plugs.Theme do + @moduledoc """ + Reads the theme from the phx_theme cookie and puts it in assigns and session. + Allows the server to render the correct theme in the initial HTML (no flash). + """ + import Plug.Conn + + @valid_themes ~w(neo uno duo leo) + + def init(opts), do: opts + + def call(conn, _opts) do + theme = + conn.cookies["phx_theme"] + |> parse_theme() + + conn + |> assign(:theme, theme) + |> put_session(:theme, theme) + end + + defp parse_theme(nil), do: "neo" + defp parse_theme(theme) when theme in @valid_themes, do: theme + defp parse_theme(_), do: "neo" +end +``` + +### 2. Add the Plug to Your Router + +Add the Theme plug to your browser pipeline, after the Mode plug: + +```elixir +pipeline :browser do + plug :accepts, ["html"] + plug :fetch_session + plug :fetch_live_flash + plug MyAppWeb.Plugs.Mode + plug MyAppWeb.Plugs.Theme + plug :put_root_layout, html: {MyAppWeb.Layouts, :root} + plug :protect_from_forgery + plug :put_secure_browser_headers +end +``` + +### 3. Create the Theme Live Hook + +Create a LiveView hook that assigns the theme from the session: + +```elixir +defmodule MyAppWeb.ThemeLive do + @moduledoc """ + Assigns the theme from the session to the LiveView socket. + """ + def on_mount(:default, _params, session, socket) do + theme = session["theme"] || "neo" + + {:cont, Phoenix.Component.assign(socket, :theme, theme)} + end +end +``` + +Add it to your live sessions: + +```elixir +live_session :default, on_mount: [MyAppWeb.ModeLive, MyAppWeb.ThemeLive, MyAppWeb.SharedEvents] do + live "/", PageLive, :index +end +``` + +### 4. Configure Your Root Layout + +Update your `root.html.heex` to use a dynamic `data-theme` attribute and add the theme script (alongside the mode script): + +```heex + + + + + + {@inner_content} + + +``` + +### 5. Theme Select Component + +Add a theme switcher using the Select component: + +```elixir +attr :theme, :string, + default: "neo", + values: ["neo", "uno", "duo", "leo"], + doc: "the theme from cookie/session" + +def theme_toggle(assigns) do + ~H""" + <.select + id="theme-select" + class="select select--sm select--micro" + collection={[ + %{id: "neo", label: "Neo"}, + %{id: "uno", label: "Uno"}, + %{id: "duo", label: "Duo"}, + %{id: "leo", label: "Leo"} + ]} + value={[@theme]} + on_value_change_client="phx:set-theme" + > + <:label class="sr-only"> + Theme + + <:item :let={item}> + {item.label} + + <:trigger> + <.icon name="hero-swatch" /> + + <:item_indicator> + <.icon name="hero-check" /> + + + """ +end +``` + +### 6. Styling + +Import all theme CSS files so switching works. Each theme has light and dark variants, combined with `data-mode`: + +```css +@import "../corex/tokens/themes/neo/light.css"; +@import "../corex/tokens/themes/neo/dark.css"; +@import "../corex/tokens/themes/uno/light.css"; +@import "../corex/tokens/themes/uno/dark.css"; +@import "../corex/tokens/themes/duo/light.css"; +@import "../corex/tokens/themes/duo/dark.css"; +@import "../corex/tokens/themes/leo/light.css"; +@import "../corex/tokens/themes/leo/dark.css"; +``` + +--- + +## Available Themes + +- **neo** – default +- **uno** +- **duo** +- **leo** + +Theme and mode are independent. The active selector is `[data-theme="neo"][data-mode="dark"]` for Neo in dark mode. + +--- + +## Summary + +1. The theme is read from the `phx_theme` cookie on initial load (via Theme plug) +2. The theme is stored in assigns and session +3. A client-side script in `root.html.heex` initializes and persists the theme +4. LiveView receives the theme via the ThemeLive `on_mount` hook +5. The Select component dispatches `phx:set-theme` on change +6. Both cookie and localStorage stay in sync for server and client + +Theme logic is separate from mode logic: use distinct plugs, hooks, cookies, and scripts for each. diff --git a/lib/components/action.ex b/lib/components/action.ex new file mode 100644 index 0000000..773b832 --- /dev/null +++ b/lib/components/action.ex @@ -0,0 +1,66 @@ +defmodule Corex.Action do + @moduledoc """ + Renders a button element for actions based of Phoenix Core Components. + Use the `type` attribute to set the button type. + Icon-only buttons must pass `aria_label` to screen readers. + + ## Examples + ```elixir + <.action>Send! + <.action phx-click="go">Send! + <.action type="submit">Save + <.action aria_label="Close dialog"> + <.icon name="hero-x-mark" aria-hidden="true" /> + + ``` + + ## Styling + + If you wish to use the default Corex styling, you can use the class `button` on the component. + This requires to install `Mix.Tasks.Corex.Design` first and import the component css file. + + ```css + @import "../corex/main.css"; + @import "../corex/tokens/themes/neo/light.css"; + @import "../corex/components/button.css"; + ``` + + You can then use modifiers + + ```heex + <.action class="button button--accent button--lg"> + ``` + + Learn more about modifiers and [Corex Design](https://corex-ui.com/components/button#modifiers) + """ + + @doc type: :component + use Phoenix.Component + + attr(:type, :string, + default: "button", + values: ["button", "submit", "reset"], + doc: "The button type, defaults to button to prevent accidental form submissions" + ) + + attr(:aria_label, :string, + default: nil, + doc: "Required for icon-only buttons, describes the button to screen readers" + ) + + attr(:disabled, :boolean, default: false, doc: "Disables the button") + + attr(:rest, :global, + include: ~w(class name value form phx-click phx-submit phx-disable-with phx-value) + ) + + slot(:inner_block, required: true) + + def action(assigns) do + ~H""" + + """ + end +end diff --git a/lib/components/clipboard.ex b/lib/components/clipboard.ex index 414f467..0168ff1 100644 --- a/lib/components/clipboard.ex +++ b/lib/components/clipboard.ex @@ -159,6 +159,11 @@ defmodule Corex.Clipboard do "Accessible name for the input when it's not associated with a visible label (e.g. \"Value to copy\")" ) + attr(:input, :boolean, + default: true, + doc: "Whether to render the input element. Set to false when using only the trigger to copy." + ) + attr(:rest, :global) slot :label, required: false do @@ -198,6 +203,7 @@ defmodule Corex.Clipboard do
diff --git a/lib/components/code.ex b/lib/components/code.ex new file mode 100644 index 0000000..a6b89b5 --- /dev/null +++ b/lib/components/code.ex @@ -0,0 +1,156 @@ +defmodule Corex.Code do + @moduledoc ~S''' + Displays syntax-highlighted code with Makeup. + + ## Installation + + Add `makeup` and the lexer packages for each language you use: + + ```elixir + defp deps do + [ + {:makeup, "~> 1.2"}, + {:makeup_elixir, "~> 1.0.1 or ~> 1.1"}, + {:makeup_html, "~> 1.0"}, + {:makeup_css, "~> 1.0"}, + {:makeup_js, "~> 1.0"} + ] + end + ``` + + Only `makeup` is required. Add the lexer packages you need; without a lexer, code renders as plain escaped text. + + ## Examples + + ### Basic Usage + + ```heex + <.code code="def hello, do: :world" /> + ``` + + ### Multi-line with heredoc + + Use `"""` heredoc for readable multi-line code in templates: + + ```heex + <.code code={""" + defmodule Hello do + def world, do: "Hello, World!" + end + """} /> + ``` + + ### Loading from a file + + ```heex + <.code code={File.read!("priv/code_examples/example.ex")} language={:elixir} /> + ``` + + Or in a controller, load the file and pass the contents: + + ```elixir + def my_page(conn, _params) do + code = File.read!("priv/code_examples/example.ex") + + render(conn, :my_page, code: code) + end + ``` + + ```heex + <.code code={@code} language={:elixir} /> + ``` + + The `language` attribute maps to Makeup's registry (e.g. `:elixir` → `"elixir"`). + Add the corresponding lexer package to your deps for each language. Without it, code renders as plain escaped text. + + ## Styling + + Use data attributes to target elements: + + ```css + [data-scope="code"][data-part="root"] {} + [data-scope="code"][data-part="content"] {} + ``` + + With Corex Design (`mix corex.design`), syntax highlighting styles are included in + `code.css`. Nothing else is required. + + Without Corex Design, run `mix corex.code` to generate the Makeup stylesheet and + import it in your CSS: + + ```bash + mix corex.code + mix corex.code assets/styles/syntax.css + mix corex.code --force + ``` + + ```css + @import "./code_highlight.css"; + ``` + ''' + + @doc type: :component + use Phoenix.Component + + attr(:code, :string, required: true, doc: "The raw source code to display") + + attr(:language, :atom, + default: :elixir, + doc: + "The language name in Makeup's registry (e.g. :elixir, :html). Add the lexer package to deps; otherwise renders as plain escaped text." + ) + + attr(:rest, :global) + + def code(assigns) do + makeup = Module.concat(["Elixir", "Makeup"]) + + unless Code.ensure_loaded?(makeup) do + raise """ + Corex.Code requires makeup. + + Add it to your mix.exs: + + {:makeup, "~> 1.2"} + + Add lexer packages for each language you use (e.g. makeup_elixir, makeup_html). + """ + end + + assigns = + assigns + |> assign(:lexer, lexer_for(assigns.language)) + |> then(&assign(&1, :highlighted_html, highlight_code(&1))) + + ~H""" +
+
+
{Phoenix.HTML.raw(@highlighted_html)}
+
+
+ """ + end + + defp lexer_for(language) do + name = to_string(language) + registry = Module.concat(["Elixir", "Makeup", "Registry"]) + + case apply(registry, :fetch_lexer_by_name, [name]) do + {:ok, {lexer, _opts}} -> lexer + :error -> nil + end + end + + defp highlight_code(assigns) do + case assigns.lexer do + nil -> + assigns.code + |> Phoenix.HTML.html_escape() + |> Phoenix.HTML.safe_to_string() + + lexer -> + makeup = Module.concat(["Elixir", "Makeup"]) + apply(makeup, :highlight_inner_html, [assigns.code, [lexer: lexer]]) + end + end +end diff --git a/lib/components/listbox/connect.ex b/lib/components/listbox/connect.ex index 1e2c7b6..3d2d6a0 100644 --- a/lib/components/listbox/connect.ex +++ b/lib/components/listbox/connect.ex @@ -89,7 +89,7 @@ defmodule Corex.Listbox.Connect do "data-scope" => "listbox", "data-part" => "label", "dir" => assigns.dir, - "id" => "select:#{assigns.id}:label" + "id" => "listbox:#{assigns.id}:label" } end diff --git a/lib/components/navigate.ex b/lib/components/navigate.ex new file mode 100644 index 0000000..9976a18 --- /dev/null +++ b/lib/components/navigate.ex @@ -0,0 +1,109 @@ +defmodule Corex.Navigate do + @moduledoc """ + Renders an anchor element for navigation based of Phoenix Core Components and Phoenix Link + + Supports plain href, LiveView navigate, and LiveView patch. + External links should be flagged with the `external` attribute. + Icon-only links must pass `aria_label` to screen readers. + + ## Examples + + ```heex + <.navigate to="/about">About + <.navigate to={~p"/dashboard"} type="navigate">Dashboard + <.navigate to={~p"/items"} type="patch">Filter + <.navigate to="https://example.com" external> + External + ... + + <.navigate to="/file.pdf" download="report.pdf"> + Download PDF + ... + + <.navigate to="/profile" aria_label="View profile"> + + + ``` + + ## Styling + + If you wish to use the default Corex styling, you can use the class `link` on the component. + This requires to install `Mix.Tasks.Corex.Design` first and import the component css file. + + ```css + @import "../corex/main.css"; + @import "../corex/tokens/themes/neo/light.css"; + @import "../corex/components/link.css"; + ``` + + You can then use modifiers + + ```heex + <.navigate class="link link--accent link--lg"> + ``` + + Learn more about modifiers and [Corex Design](https://corex-ui.com/components/link#modifiers) + """ + + @doc type: :component + use Phoenix.Component + + attr(:to, :string, required: true, doc: "The destination URL") + + attr(:type, :string, + default: "href", + values: ["href", "navigate", "patch"], + doc: "The navigation type, defaults to href" + ) + + attr(:external, :boolean, + default: false, + doc: + "Marks the link as external, only valid with type=\"href\". Adds target=\"_blank\" and rel=\"noopener noreferrer\"" + ) + + attr(:download, :any, + default: nil, + doc: "Prompts the browser to download the target, accepts a boolean or filename string" + ) + + attr(:aria_label, :string, + default: nil, + doc: "Required for icon-only links, describes the link to screen readers" + ) + + attr(:rest, :global, include: ~w(class method replace)) + slot(:inner_block, required: true) + + def navigate(%{rest: %{replace: _}, type: "href"} = assigns) do + IO.warn("<.navigate> replace has no effect with type=\"href\"") + navigate(Map.update!(assigns, :rest, &Map.delete(&1, :replace))) + end + + def navigate(%{rest: %{method: _}, type: type} = assigns) when type in ["navigate", "patch"] do + IO.warn("<.navigate> method has no effect with type=\"#{type}\"") + navigate(Map.update!(assigns, :rest, &Map.delete(&1, :method))) + end + + def navigate(%{external: true, type: type} = assigns) when type in ["navigate", "patch"] do + IO.warn("<.navigate> external has no effect with type=\"#{type}\"") + navigate(%{assigns | external: false}) + end + + def navigate(assigns) do + ~H""" + <.link + href={@type == "href" && @to} + navigate={@type == "navigate" && @to} + patch={@type == "patch" && @to} + download={@download} + aria-label={@aria_label} + target={@external && "_blank"} + rel={@external && "noopener noreferrer"} + {@rest} + > + {render_slot(@inner_block)} + + """ + end +end diff --git a/lib/corex.ex b/lib/corex.ex index 8cf9edb..db6bfaf 100644 --- a/lib/corex.ex +++ b/lib/corex.ex @@ -2,47 +2,45 @@ defmodule Corex do @moduledoc false @components %{ - accordion: - {Corex.Accordion, - [ - accordion: 1, - accordion_skeleton: 1 - ]}, - combobox: {Corex.Combobox, [combobox: 1]}, - switch: {Corex.Switch, [switch: 1]}, - toggle_group: {Corex.ToggleGroup, [toggle_group: 1]}, - toast: - {Corex.Toast, - [ - toast_group: 1, - toast_client_error: 1, - toast_server_error: 1, - toast_connected: 1, - toast_disconnected: 1 - ]}, - form: {Corex.Form, [get_form_id: 1]}, - select: {Corex.Select, [select: 1]}, + accordion: {Corex.Accordion, [accordion: 1, accordion_skeleton: 1]}, + action: {Corex.Action, [action: 1]}, + angle_slider: {Corex.AngleSlider, [angle_slider: 1]}, + avatar: {Corex.Avatar, [avatar: 1]}, + carousel: {Corex.Carousel, [carousel: 1]}, checkbox: {Corex.Checkbox, [checkbox: 1]}, - tabs: {Corex.Tabs, [tabs: 1, tabs_trigger: 1, tabs_content: 1]}, clipboard: {Corex.Clipboard, [clipboard: 1]}, + code: {Corex.Code, [code: 1]}, collapsible: {Corex.Collapsible, [collapsible: 1]}, + combobox: {Corex.Combobox, [combobox: 1]}, + date_picker: {Corex.DatePicker, [date_picker: 1]}, dialog: {Corex.Dialog, [dialog: 1, dialog_title: 1, dialog_description: 1, dialog_close_trigger: 1]}, - date_picker: {Corex.DatePicker, [date_picker: 1]}, - signature_pad: {Corex.SignaturePad, [signature_pad: 1]}, - menu: {Corex.Menu, [menu: 1]}, - tree_view: {Corex.TreeView, [tree_view: 1, tree_item: 1, tree_branch: 1]}, - angle_slider: {Corex.AngleSlider, [angle_slider: 1]}, - avatar: {Corex.Avatar, [avatar: 1]}, - carousel: {Corex.Carousel, [carousel: 1]}, editable: {Corex.Editable, [editable: 1]}, floating_panel: {Corex.FloatingPanel, [floating_panel: 1]}, + form: {Corex.Form, [get_form_id: 1]}, listbox: {Corex.Listbox, [listbox: 1]}, + menu: {Corex.Menu, [menu: 1]}, + navigate: {Corex.Navigate, [navigate: 1]}, number_input: {Corex.NumberInput, [number_input: 1]}, password_input: {Corex.PasswordInput, [password_input: 1]}, pin_input: {Corex.PinInput, [pin_input: 1]}, radio_group: {Corex.RadioGroup, [radio_group: 1]}, - timer: {Corex.Timer, [timer: 1]} + select: {Corex.Select, [select: 1]}, + signature_pad: {Corex.SignaturePad, [signature_pad: 1]}, + switch: {Corex.Switch, [switch: 1]}, + tabs: {Corex.Tabs, [tabs: 1, tabs_trigger: 1, tabs_content: 1]}, + timer: {Corex.Timer, [timer: 1]}, + toast: + {Corex.Toast, + [ + toast_group: 1, + toast_client_error: 1, + toast_server_error: 1, + toast_connected: 1, + toast_disconnected: 1 + ]}, + toggle_group: {Corex.ToggleGroup, [toggle_group: 1]}, + tree_view: {Corex.TreeView, [tree_view: 1, tree_item: 1, tree_branch: 1]} } defmacro __using__(opts \\ []) do diff --git a/lib/mix/tasks/corex.code.ex b/lib/mix/tasks/corex.code.ex new file mode 100644 index 0000000..a7199d3 --- /dev/null +++ b/lib/mix/tasks/corex.code.ex @@ -0,0 +1,91 @@ +defmodule Mix.Tasks.Corex.Code do + use Mix.Task + + @shortdoc "Generate and copy Makeup syntax highlighting stylesheet to your project" + + @default_path "assets/css/code_highlight.css" + + @moduledoc """ + Generates the full Makeup syntax highlighting stylesheet and writes it to your project. + + Run when you add or update Makeup language packages (e.g. makeup_elixir, makeup_html, makeup_css). + + Requires `makeup` and `makeup_elixir` in your deps. + + ## Examples + + # Default path (assets/css/code_highlight.css) + mix corex.code + + # Custom path and filename + mix corex.code assets/styles/syntax.css + + # Override if file already exists + mix corex.code --force + mix corex.code assets/css/code_highlight.css --force + + ## Import + + Add the generated file to your CSS (e.g. assets/css/app.css): + + @import "./code_highlight.css"; + + Works with or without Corex Design. For unstyled projects, import only the highlight file. + """ + + @impl Mix.Task + def run(args) do + Mix.Task.run("app.start") + + {opts, paths, _} = + OptionParser.parse(args, switches: [force: :boolean]) + + path = List.first(paths) || @default_path + force = Keyword.get(opts, :force, false) + full_path = Path.expand(path, File.cwd!()) + + validate_makeup!() + validate_path!(full_path, force) + generate!(full_path) + + Mix.shell().info("Makeup stylesheet written to: #{path}") + end + + defp validate_makeup! do + makeup = Module.concat(["Elixir", "Makeup"]) + + unless Code.ensure_loaded?(makeup) do + Mix.raise(""" + Makeup is not available. Add to your mix.exs: + + defp deps do + [ + {:makeup, "~> 1.2"}, + {:makeup_elixir, "~> 1.0.1 or ~> 1.1"} + ] + end + """) + end + end + + defp validate_path!(full_path, force) do + if File.exists?(full_path) and not force do + Mix.raise(""" + #{full_path} already exists. + + Re-run with --force to overwrite. + """) + end + end + + defp generate!(full_path) do + makeup = Module.concat(["Elixir", "Makeup"]) + stylesheet = apply(makeup, :stylesheet, [:default_style]) + + full_path + |> Path.dirname() + |> File.mkdir_p!() + + File.write!(full_path, stylesheet) + end +end diff --git a/mix.exs b/mix.exs index 728d368..e00d53b 100644 --- a/mix.exs +++ b/mix.exs @@ -1,7 +1,7 @@ defmodule Corex.MixProject do use Mix.Project - @version "0.1.0-alpha.26" + @version "0.1.0-alpha.27" @elixir_requirement "~> 1.15" def project do @@ -96,6 +96,7 @@ defmodule Corex.MixProject do main: "Corex", extras: [ "guides/installation.md", + "guides/theming.md", "guides/dark_mode.md", "guides/locale.md", "guides/rtl.md", @@ -116,11 +117,13 @@ defmodule Corex.MixProject do [ Components: [ Corex.Accordion, + Corex.Action, Corex.AngleSlider, Corex.Avatar, Corex.Carousel, Corex.Checkbox, Corex.Clipboard, + Corex.Code, Corex.Combobox, Corex.Collapsible, Corex.DatePicker, @@ -129,6 +132,7 @@ defmodule Corex.MixProject do Corex.FloatingPanel, Corex.Listbox, Corex.Menu, + Corex.Navigate, Corex.NumberInput, Corex.PasswordInput, Corex.PinInput, diff --git a/package.json b/package.json index b5553d4..38e26e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "corex", - "version": "0.1.0-alpha.26", + "version": "0.1.0-alpha.27", "description": "The official JavaScript client for the Corex Phoenix Hooks.", "license": "MIT", "module": "./priv/static/corex.mjs", @@ -62,36 +62,36 @@ "@eslint/js": "^9.39.2", "@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/parser": "^8.0.0", -"@zag-js/accordion": "^1.34.0", - "@zag-js/angle-slider": "^1.34.0", - "@zag-js/avatar": "^1.34.0", - "@zag-js/carousel": "^1.34.0", - "@zag-js/collection": "^1.34.0", - "@zag-js/checkbox": "^1.34.0", - "@zag-js/clipboard": "^1.34.0", - "@zag-js/collapsible": "^1.34.0", - "@zag-js/combobox": "^1.34.0", - "@zag-js/date-picker": "^1.34.0", - "@zag-js/dialog": "^1.34.0", - "@zag-js/editable": "^1.34.0", - "@zag-js/floating-panel": "^1.34.0", - "@zag-js/listbox": "^1.34.0", - "@zag-js/menu": "^1.34.0", - "@zag-js/number-input": "^1.34.0", - "@zag-js/password-input": "^1.34.0", - "@zag-js/pin-input": "^1.34.0", - "@zag-js/popper": "^1.34.0", - "@zag-js/radio-group": "^1.34.0", - "@zag-js/select": "^1.34.0", - "@zag-js/signature-pad": "^1.34.0", - "@zag-js/switch": "^1.34.0", - "@zag-js/tabs": "^1.34.0", - "@zag-js/timer": "^1.34.0", - "@zag-js/toast": "^1.34.0", - "@zag-js/toggle-group": "^1.34.0", - "@zag-js/tree-view": "^1.34.0", - "@zag-js/types": "^1.34.0", - "@zag-js/vanilla": "^1.34.0", +"@zag-js/accordion": "^1.34.1", + "@zag-js/angle-slider": "^1.34.1", + "@zag-js/avatar": "^1.34.1", + "@zag-js/carousel": "^1.34.1", + "@zag-js/collection": "^1.34.1", + "@zag-js/checkbox": "^1.34.1", + "@zag-js/clipboard": "^1.34.1", + "@zag-js/collapsible": "^1.34.1", + "@zag-js/combobox": "^1.34.1", + "@zag-js/date-picker": "^1.34.1", + "@zag-js/dialog": "^1.34.1", + "@zag-js/editable": "^1.34.1", + "@zag-js/floating-panel": "^1.34.1", + "@zag-js/listbox": "^1.34.1", + "@zag-js/menu": "^1.34.1", + "@zag-js/number-input": "^1.34.1", + "@zag-js/password-input": "^1.34.1", + "@zag-js/pin-input": "^1.34.1", + "@zag-js/popper": "^1.34.1", + "@zag-js/radio-group": "^1.34.1", + "@zag-js/select": "^1.34.1", + "@zag-js/signature-pad": "^1.34.1", + "@zag-js/switch": "^1.34.1", + "@zag-js/tabs": "^1.34.1", + "@zag-js/timer": "^1.34.1", + "@zag-js/toast": "^1.34.1", + "@zag-js/toggle-group": "^1.34.1", + "@zag-js/tree-view": "^1.34.1", + "@zag-js/types": "^1.34.1", + "@zag-js/vanilla": "^1.34.1", "eslint": "^9.39.2", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ad876f..45e1209 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,95 +21,95 @@ importers: specifier: ^8.0.0 version: 8.54.0(eslint@9.39.2)(typescript@5.9.3) '@zag-js/accordion': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/angle-slider': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/avatar': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/carousel': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/checkbox': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/clipboard': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/collapsible': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/collection': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/combobox': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/date-picker': - specifier: ^1.34.0 - version: 1.34.0(@internationalized/date@3.11.0) + specifier: ^1.34.1 + version: 1.34.1(@internationalized/date@3.11.0) '@zag-js/dialog': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/editable': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/floating-panel': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/listbox': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/menu': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/number-input': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/password-input': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/pin-input': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/popper': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/radio-group': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/select': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/signature-pad': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/switch': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/tabs': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/timer': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/toast': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/toggle-group': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/tree-view': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/types': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 '@zag-js/vanilla': - specifier: ^1.34.0 - version: 1.34.0 + specifier: ^1.34.1 + version: 1.34.1 eslint: specifier: ^9.39.2 version: 9.39.2 @@ -279,144 +279,144 @@ packages: resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@zag-js/accordion@1.34.0': - resolution: {integrity: sha512-4zK897tjM72D65dBZ+DKwxzJXV1Hy/QjDANDiLukpVE8oD+bO4jwh5i8Ee7U3n8YuJFluM7Ajn+xZ/HQdg9yJA==} + '@zag-js/accordion@1.34.1': + resolution: {integrity: sha512-FEk9iBwoCkbs96386MfKG7fKZ6uAnID/ppkYFs3FatTf79liJi6cQekWuOxhDPwpmbndCBNSO+eRJgsN1DWGxw==} - '@zag-js/anatomy@1.34.0': - resolution: {integrity: sha512-c13dPCG7Sa8Xqhz25AoZFWvMkhw5RlNgTOPD0Z6ZXpURNauLn1r5C9a/H0SAdO66yOsPHJoK8LZxoL4BiGE8KQ==} + '@zag-js/anatomy@1.34.1': + resolution: {integrity: sha512-FQuhlB5ggZvC2AKy52qITBe8Q8GCHdO+tsSY0A7kOe1C3wDnZNRCKtiNfkcIlEc3uP+alMhF/7xn09N7XXOTcQ==} - '@zag-js/angle-slider@1.34.0': - resolution: {integrity: sha512-WEQTxxiqqfh025Bq7mhfYQc0AMua8dWWjmCOrGxXQD2kVI58RMNNCBImcNVYyvyCd97Om5rcaVEzaJ248xBNxQ==} + '@zag-js/angle-slider@1.34.1': + resolution: {integrity: sha512-TQjzs9GZMWX4TKCmO164eWBnmw9R0EzQUkbEMSPgQ5Ue2vxxU4CCFlcn2HNlP0cz1PASk2xnMPRhcoPoRUTM+w==} - '@zag-js/aria-hidden@1.34.0': - resolution: {integrity: sha512-aloo68LsjiHpZdR+qzNNBuFP6F72gPfwpBmPmcVUQbHp0o5nhT+oxmcqg1A3xeuJkvJibQVqgaSep2YMcVZSQQ==} + '@zag-js/aria-hidden@1.34.1': + resolution: {integrity: sha512-3oO8T4ezzZI+DSDTaPZ4ZE6wdzHqywlz2Q6sqwjnsE46NcmlnZkaFgDPJCNPH56tXLsB7uE7A6KXLYxQrLf6fw==} - '@zag-js/avatar@1.34.0': - resolution: {integrity: sha512-rlJ8xpNLqSFxpyFtO2j+JRI0LTPgqzviEWSO/ejb+1w/VvB2SHPfslHfJsLqll9yUwnEvEn6+kEalcTPn/V5RQ==} + '@zag-js/avatar@1.34.1': + resolution: {integrity: sha512-O7Bt02kZiTozNsEaWWgGYyTOU3wFejQIQl1Y0bYEeFbBQ2y75pmffhK9792UW6oZ+nwQ+s/0/kAMkzZWSl3qww==} - '@zag-js/carousel@1.34.0': - resolution: {integrity: sha512-g9pmUfWQlII0glsltLJb12L6EXsw+ms69xELAF58pZxwxK4hss0M2ZZRRY/JOgU9nX6UtZTs8CdfaKI+bIyP5g==} + '@zag-js/carousel@1.34.1': + resolution: {integrity: sha512-aKOXJCslU8HoPp54sNv0tQraVG00fq9qL/ZwmZAzKw6G2kLtHaHtxBunQMRVrVGCYxXqsdoHWGikKT9PJWIICg==} - '@zag-js/checkbox@1.34.0': - resolution: {integrity: sha512-47rEtbHXUh5t8bgk3j18lDvhoMTkxTKLBRUKx/TlNYl0r6/RwUWp4yRUpOM0NQkV3wvFyMc6LqTrOKRK6KKngg==} + '@zag-js/checkbox@1.34.1': + resolution: {integrity: sha512-qj9paN6hcFwmQz+T7ABrlN8zVeA/11WLB2JDhno2xuJjdHDmOSWnWVxCEf8lv4nxcw3SUnJnMgFtAWLd0xJkFA==} - '@zag-js/clipboard@1.34.0': - resolution: {integrity: sha512-Wkm4sWwXcIvpeZEdaUQB7Oy91UMUm1Rfyb/UjWUv12gMlXTAmdUucaT2yR7cPanYzUzwOR3ZNepwOxC2CjYE6w==} + '@zag-js/clipboard@1.34.1': + resolution: {integrity: sha512-O1xH2e3E+GYXubA/vtBkuE3AD81hO3N5P1weA6iHOCyDl8CAtKMZZ1xMuCTwt+wujwdvM1DT4IF+II9fBMngAw==} - '@zag-js/collapsible@1.34.0': - resolution: {integrity: sha512-P2d4DLVpVbLP0Qfq/rWjyCSgj380LKcnU04xLQV4ujAESx6Ga+w6MbW09ywCZGi1JPWlRu6A06bhVSRvyHTGHg==} + '@zag-js/collapsible@1.34.1': + resolution: {integrity: sha512-1u32Zz/shcmxPbPsXuiIc5D9eIoZdpFoLuzlUzGlutBzq7zoavmMVIGmSevBEn12a6vhk/dPoiz2+OAKXi+2ww==} - '@zag-js/collection@1.34.0': - resolution: {integrity: sha512-2fU7l/iRpCSsngRYTfbnVOFLGhlylk4+IuJgWZPpBHafDv5hg14Ju5OZK0U+SCFSkHDvN/vnr/4QllIftBWsfQ==} + '@zag-js/collection@1.34.1': + resolution: {integrity: sha512-C61BL3cFyEfPCsPKeWshc8l7D3igqySPksVtmfzHhxcnlOxgVkBBpik7JF/cYk9yU6pHB6bCRzRgPDziiyOHLQ==} - '@zag-js/combobox@1.34.0': - resolution: {integrity: sha512-fsTfGCDBbyYaWAmsF7VsOh5LIpqhbd2IxMLl41I8GPeQIRkiqomuOjEmq4vNiNIBEGVPMREFWb67ADlivZcPOQ==} + '@zag-js/combobox@1.34.1': + resolution: {integrity: sha512-YzqOYbfh8vDmc/ewj3DetGHt0hwYuvDV/2BdCQJ5rLtLK8iLJuTB79x8l6QJBCi93BG64E7aY7Wa7jyK+1oILQ==} - '@zag-js/core@1.34.0': - resolution: {integrity: sha512-+w6zQ5PiBNbUd2xu91FUQruIAHcTYsueUNlXz3biAEAcU7pzre3Es4ApTepkbijYjcsiXzI/QwTtujot53eVyA==} + '@zag-js/core@1.34.1': + resolution: {integrity: sha512-GjOZOL/p0tsuH/koYR+mSoegs3JXpP0ZkFuidAf0R4zqklNSdTLzhb00CZHGZcdWCExhmG18YwpjbEx8eyfV5g==} - '@zag-js/date-picker@1.34.0': - resolution: {integrity: sha512-0jF2clkuwyK6fIIkHd8RsqWO+/zl6xwK5HHEJoLHWEbWaJ4DvOfjadQD/5bHGIbCulZb37yHKgidI3pcQ1R3uw==} + '@zag-js/date-picker@1.34.1': + resolution: {integrity: sha512-ubhpCRDf7vVXSvToJvnsnqjTB2hhbsYEaeIrwsHTFAFOETD15A5H/aC5PeiwCouLEbTQDiIoaDlOsNh57IO7XQ==} peerDependencies: '@internationalized/date': '>=3.0.0' - '@zag-js/date-utils@1.34.0': - resolution: {integrity: sha512-9LjsBA4oCq1+jq33CTw469lhNhCajAvN1QyNGLTfzRdUDfaJE1/egv3akM2Gn+FaKU1pOWB11uJiK+VR6Eui9w==} + '@zag-js/date-utils@1.34.1': + resolution: {integrity: sha512-UG0aooQXNWINlO8RWcBFv6aEHE1jAFKU4vNprh0nDOl61O0+j+lbV0qYushgyZ7O6aYSoI+tdb/Myv+BPqQxyg==} peerDependencies: '@internationalized/date': '>=3.0.0' - '@zag-js/dialog@1.34.0': - resolution: {integrity: sha512-w52x1jCgpmaOx5zmJ2878sX6yIjz7QN/ICT5eH22uoyZQ1YKl1XlFUYf3SOCzY3svs4gSRHLd+/KFA/u0YEGGQ==} + '@zag-js/dialog@1.34.1': + resolution: {integrity: sha512-2PfuUhC2e0ouQ2s2F9qmeThwTMGptVCAMDNMh1ZOPeVzQLvnsIQDvcYHeb62BuKgYDeoUiz3Tz/ns/sV/VI1kw==} - '@zag-js/dismissable@1.34.0': - resolution: {integrity: sha512-R+H2E1gasWhChnBBXgzWSnok5NIL4IG9XfVPFTOWNz5OldqOTWH6p0xZgVbO85/ifBDmF3C+663ZeaZ1EW49EA==} + '@zag-js/dismissable@1.34.1': + resolution: {integrity: sha512-7dj7G0Cl6Fu7IHENdLT1tFeePuq8BqxPT6xANdk66hnpVeyDKcrR3XjN+ChWpYxGIkeOfPGYsjRHx1kDiFv89g==} - '@zag-js/dom-query@1.34.0': - resolution: {integrity: sha512-bK3rEAsY130SPrRsWn+M4Dim2Ne92Sq+RsRQ4I9UTOa98OeSPVc8F77zPdoc4aKS+XAWWpzNASTfDjYhAy1gKQ==} + '@zag-js/dom-query@1.34.1': + resolution: {integrity: sha512-7GaxMaShtWsGgsz9jPfi+aJSQrx7aVFnCi5edGet76Tcytv0MRTqFKUcpSCWu3W3znBt8tQO07Mu1SBSNQk07Q==} - '@zag-js/editable@1.34.0': - resolution: {integrity: sha512-ABJl+HusXMFidoGClcuH8rOhkw/9StKKak9WSQbHRcgd4f3GQQt7h8ENMaxmaK2FwZKywcoNnVB4+OdssVAxWQ==} + '@zag-js/editable@1.34.1': + resolution: {integrity: sha512-IXR8TE/S7uuTOY/Mj3tk8zmXlpgym9OUYZGFjohVdXeUC9INIeO27ei8mfAxY3JLqnYIyrLGD0Q7OUUj2L/vTQ==} - '@zag-js/floating-panel@1.34.0': - resolution: {integrity: sha512-5bd/5sOGfHunfKFXxQm96QbS6RgezB72nHW6Ir/wD1/CxClcRKILYwznx6E3BxpqPaOq8s6JdsMnLdzSoASoAw==} + '@zag-js/floating-panel@1.34.1': + resolution: {integrity: sha512-2yreCW74MO047Yd3jjofFyJpbfd55E9TBw0Hh4W1kMPpWg8E3XnL4gWrYYKX6ycjeWNVNNvyAg1O/0qiM49fiA==} - '@zag-js/focus-trap@1.34.0': - resolution: {integrity: sha512-vejkVmkqQ5Uv3/bhFaFovC2ownIwN+3Bh2CGLhqTI+bijsGtbFpmcpmwVXxnWQdO9VKaesygChFLmgQaFJ9UWw==} + '@zag-js/focus-trap@1.34.1': + resolution: {integrity: sha512-vfIC3diaYbdxDmKmNASZYx0RrNj6bG0InrIgQF0Kk/qI81FcK/VXQDjpXnnWC+yG2u3hG8h+6kbfgHtgoCuDjQ==} - '@zag-js/focus-visible@1.34.0': - resolution: {integrity: sha512-tHtvqxiBsNfzDaZaD8qpSBl7PRndeDrVLgCX80M0bcYu6f1RHJY53qGriBFqocRuKlNtSASE39JAicKCojQzpw==} + '@zag-js/focus-visible@1.34.1': + resolution: {integrity: sha512-Wvl/w6JpPU8DwEfq+I82yzlBX9mEp2o2k6DZc+3Kb3x/3oP8Jr0fCXdk+qWTvKekfVvDpM2vS1fjNNLfiOaQww==} - '@zag-js/interact-outside@1.34.0': - resolution: {integrity: sha512-U7E3k2pkF7xh9cxU3za1BaiAo33kCdW/iulicPutTVEgSa09bXARa2/v/ISrpAKj/Crau69UAfxjjl4D56fxnw==} + '@zag-js/interact-outside@1.34.1': + resolution: {integrity: sha512-wQdOYVhPFyYPJUDPYXQc1tg8vdJGTG5xwTEdOGVG1DpVo87VNsdb0KjnWPZsfPQEUSkvJIXtbjopp/OLw4fFow==} - '@zag-js/listbox@1.34.0': - resolution: {integrity: sha512-T1KHdYpaN/iIL2w14ySG4wLLti/az62CIe1Tnx9szuo7nC38GeeSsWtQJxc+DRKYTPNC9PDvbImKS6CsdcaaSg==} + '@zag-js/listbox@1.34.1': + resolution: {integrity: sha512-0KcGH8lILd1fLO49VCl3nyalesm+Nvr6/oH6qflsbn+frM4JaDcF/S6gngtKXJ8Mzx+5Qua97uAvuk047Z0I/A==} - '@zag-js/live-region@1.34.0': - resolution: {integrity: sha512-GTlVqRLJaZpqSg6j6XufxrD2z0EIaTp1tIddU4USceNb38SDb4JbFf/DB6IATRS506W27kfxQW1J4uau5bJLEg==} + '@zag-js/live-region@1.34.1': + resolution: {integrity: sha512-0Heu0z0cBQQDA1289nm0wQM3+ybEuOSqpPffHQdRgaTtUWnG0xkw0jt8qq0A/tq2VIlwLnbNledE4dh1Y6KwhA==} - '@zag-js/menu@1.34.0': - resolution: {integrity: sha512-qruSZvJuLVBi0Af8YkB/7+fRAmLuAu6MSMLuIW2WT4FlcsqLk9AEnYXD5X/shUKJmNiIvZisyaZlpzMxkNHChQ==} + '@zag-js/menu@1.34.1': + resolution: {integrity: sha512-nhVM6dNf48QqeY0qzn6n5hTk8qbBM7FwnGAUJmGRx9nrrG1SpIpQ5sCxDcOwgI/Q2vMu+2ggmIiObvZKAqZkiA==} - '@zag-js/number-input@1.34.0': - resolution: {integrity: sha512-xuq7skBhR4zH7bf9quuADOTQwl2FVdv/Wpsetj4epN+ZLJk31UwRYYYusfEhXZ3B9N9m7qdgADEF1zJLjwtm+g==} + '@zag-js/number-input@1.34.1': + resolution: {integrity: sha512-ZcqsC7XRzutc3nDV1AJO/kwb6ycAeDGTMOL3jTQND0xPZfUb5u/YZcMxinWHLwXZZ8ZuXZeWvtiy3veCUJGCFg==} - '@zag-js/password-input@1.34.0': - resolution: {integrity: sha512-OAkJNz443Pm90GVBomfDEhI20ADZEGv/23MprP3x1+sV/Ppn9HOTWUWSyghVQzIfocDK0X5zPygIE/XaJVaxBQ==} + '@zag-js/password-input@1.34.1': + resolution: {integrity: sha512-0gay9u9NqN8b4QuIpABlCtP93TbQJ8uRGurUSQwgbbG6llf+EOLiZs5f0H19MVnhbcINatv9p34Je6GAP2SBbA==} - '@zag-js/pin-input@1.34.0': - resolution: {integrity: sha512-PpH0MGW67tnNupApXv5a0LzzkYgzVxgomcirCrWjqPGMa+ZHBy6T0ZdHBVR/zBfOwtB/s/wiS883n18TIJ0Ekg==} + '@zag-js/pin-input@1.34.1': + resolution: {integrity: sha512-xmXdDA2JahFD+I+avDw62WX9/tKH6ab6rkn46ciqHbGTTgSW23s/btiPRuMshdd4lnqXgQgKBE/wkVdRZzeRnA==} - '@zag-js/popper@1.34.0': - resolution: {integrity: sha512-JCcQUfe8aSkE1Pgfes30xx5Fea2O3eIOhMKr7pMAFByYw9otLEimFaA3T8OU11O9gTgy5qlStAljbxpJYFB4pg==} + '@zag-js/popper@1.34.1': + resolution: {integrity: sha512-e9xklP5YjfqS6sTSzezsRBdaD5ilMTQoEedAQecy16jstIAQsberctUYZVg8vRQubA9ukmv1JvaNbkVFclr13w==} - '@zag-js/radio-group@1.34.0': - resolution: {integrity: sha512-xqUVmMrFgN/9/oBa/rvuTnKVc1KAH1jpHNsIYhMIAAbyR96Kl8LxRC0tq+gnwLFGijHnxjnTfqqHSwul+k3Suw==} + '@zag-js/radio-group@1.34.1': + resolution: {integrity: sha512-dRy7Z1zE2qwyyjI68icLBkPzM+ZzL0aAklFVc7kd/ejYxZfk6SrPoMjg3u22a34J2scxHwh/LdSuQFmauj4sAA==} - '@zag-js/rect-utils@1.34.0': - resolution: {integrity: sha512-KUJrU0xb1L53PFDDP0y/VuOzKDIFAFvfWru6AWIR1HaDDcX62K9s51mg9E27LgHSsXn1/yUTR2Nktb+wXy1dOg==} + '@zag-js/rect-utils@1.34.1': + resolution: {integrity: sha512-ms81ltfYBsabzk6tqy+kheMAUkx9IB+AUt8sATWGgqSTemBuMv/dptCJt3+WbkQjc8NveuEWmq3S6w1KJ31gaQ==} - '@zag-js/remove-scroll@1.34.0': - resolution: {integrity: sha512-StGyXyFdKXU5P86M7Jqiwh5dy9UwguXva2WuO+eM4vCfI/GvS76JoznjJqjF08uKBRelJdm+JDO0+KJj2OGqUA==} + '@zag-js/remove-scroll@1.34.1': + resolution: {integrity: sha512-irnvF4cwoAidwdU4UsPQyhTivnY3V/ZBO9EW/zTJ78qm3sjkRDDZsKEVV2UstUEmvH1jcFFPp6eNoTVItsyJBg==} - '@zag-js/scroll-snap@1.34.0': - resolution: {integrity: sha512-WJ6u75xIlQvtglLon4HADDBjbj9frQsmIAoeTkhDw7RaHNwT4Z0jqilPtkP87wBkSTNRc5/xuifgPSpm+81o3Q==} + '@zag-js/scroll-snap@1.34.1': + resolution: {integrity: sha512-pvgbJ3tjKRM1LlF14QY5riV/KT2EYGfYY4Cl5QuONqjO0ergrRd0FxDzhiwqIthgXrDZOavMucr7yqCLrjVQQA==} - '@zag-js/select@1.34.0': - resolution: {integrity: sha512-Cg3aMo4cMF2UWoP5oy4N/iwKR3vMbmrP12azlvQ0ZIjwGoDVBzUKbVvTo6W4Br5+PJWhzlYKphkf3RoCwpYB/w==} + '@zag-js/select@1.34.1': + resolution: {integrity: sha512-4Pc062McPgdRYwOU6v8jaqP48nBeTuSbuToHWixTVUhDkAsLDd7A8od2sKPsGHRsPOce0D259vJS5L3c0vtfig==} - '@zag-js/signature-pad@1.34.0': - resolution: {integrity: sha512-nyBOhncvaGa+FpAPM54q5oPnu0UNSK3EedIZdEAB1GZi0sI7wYmcKnKGxxN1QIwT4kWXbDWoA0y1ivHZFZFgdg==} + '@zag-js/signature-pad@1.34.1': + resolution: {integrity: sha512-yeYi4Tl+IgPfGA5ejbYSpHU52MBchR0S2aqT9X4kRJniCcnKLV3ZI5VOz8cYXCpYMDiWSsQnzcIIohHNHVhK2g==} - '@zag-js/store@1.34.0': - resolution: {integrity: sha512-ITHPt9mZT7OQUicVGVI3ajRa3/VZvXGiIPXo3YsQtajM62N3RvlbjyDRqfy0ApmW1/uQzO+ftj+v6BbDWBe2IQ==} + '@zag-js/store@1.34.1': + resolution: {integrity: sha512-127OWtrFKuS9HsbZITancVrydA9CpDHxyS5V+gDA7bnsNdw8kKx1H82oMh8Ok6hkDXvilhEB+g+UIOVeQD7RwQ==} - '@zag-js/switch@1.34.0': - resolution: {integrity: sha512-g9ZJDHDSD57VPYmNpARHhEmZPn5M3l+SCcHIT73IeiCR0EEmvKtNzd7YruAUGZBeFDch4g3lLAPqD4FPMgIEyA==} + '@zag-js/switch@1.34.1': + resolution: {integrity: sha512-yOibKwJ+/WZBxVBpiK7mFEFjz88rLCzAhYEr5Om52fsWPc7BbxZKBZw058e0yx5mEBXJUTXNebgp1fkmth7U9g==} - '@zag-js/tabs@1.34.0': - resolution: {integrity: sha512-UW4uTdutIl5tgkUOsmRH68K7zhar2MNg5usYGeykQu0Gk/GeEir+R1VvU6NFBu9Tc5nSq4VvEGytwjlNkNDU5A==} + '@zag-js/tabs@1.34.1': + resolution: {integrity: sha512-5qAz3jyawmfwpIjd5rNe10yae3YdZSaUu9bNk8ZzJXkXu+Sf69BO6M/k32+ZtAS1i+cku7ZXluza95CxA/Oshg==} - '@zag-js/timer@1.34.0': - resolution: {integrity: sha512-ppH1XRvp83y68ww1qLiKkzwUOgWpb5g47nHU3Q20zq3l/gfWIhjfkTcqp+ak/0C/Vk4ZvmP5Jhfn+oFFpAbTFg==} + '@zag-js/timer@1.34.1': + resolution: {integrity: sha512-awQXcKCHAKS+XBJCV+TpZhSI+zRmQCtYUqVjXMv6Mj1jmB7PS/I7gAt1D7wGmMKtkBZ4vbRxe2p2qO3StlpxRA==} - '@zag-js/toast@1.34.0': - resolution: {integrity: sha512-v9mWi5dBpUGXJLMvSVMOR/mmujENKhE2v2M6VJ/+0bilBYwcX3VW05OywSYaTlxi5vt9n2cOpvFDstMAnuRJHQ==} + '@zag-js/toast@1.34.1': + resolution: {integrity: sha512-Ad1QQ2aSbJUO+wDOLRAONrhhTsAm6YHwSxKnp4wMOvTw6UcBgRr2MeebrvYx/kwHa4UK/Y9L5rxoyRoTrk2mGg==} - '@zag-js/toggle-group@1.34.0': - resolution: {integrity: sha512-zXw9A5jTygdWgjsQi+gasvXaxekIbDTCbB0vrbLVZE/10aSO+v70INZmhlbffl6MjykqMD9HeV2eKvdpg0Uudw==} + '@zag-js/toggle-group@1.34.1': + resolution: {integrity: sha512-QDgABKDhz8EShqZoIK4NR0Ca2qDpOYAaClHlq4loyWqBhKSt1Xtok7GaD4iwer+U/5WpkzJqIlwV2nC09dsRpA==} - '@zag-js/tree-view@1.34.0': - resolution: {integrity: sha512-10WbUg/w9OlohHabJWqwFx3PSyqUdxyF7dHWJQKLxZo6J1YUrp1KXIC6+/NOSKtJ0F0olZbRJnrTAvgkejo97Q==} + '@zag-js/tree-view@1.34.1': + resolution: {integrity: sha512-ExoUFplWtTyVEGITgAFR2kIaJax/zznPuWVBiWL+Avf7qn0+CCs1b1JOPeGQtqUXk9Fso67uw9BwNQFOxbQelA==} - '@zag-js/types@1.34.0': - resolution: {integrity: sha512-0DRMFFfq77ofAQIXQrqieGAOvFezKx6VDrdgMsV7zhQRbTPBXxA7VjDdd0mSSk8sHFiA1AL7Jxzc5zFrQcOpow==} + '@zag-js/types@1.34.1': + resolution: {integrity: sha512-DAg2cD5g0PvYGIC08GWa71aSyO2IEGlQCIIdOtmUSN2PdLyRi3IllNHlnDYFCkTGbb0GUunCro8FLvE9Aj2BOA==} - '@zag-js/utils@1.34.0': - resolution: {integrity: sha512-rdk7T3M8Rj+Wew7jtQuaWzxT/htbk2PCoLuF2yj3ldef+4txVE2uVQWodeM5mp7vArvMJxXvipnJJtkTXEPNkw==} + '@zag-js/utils@1.34.1': + resolution: {integrity: sha512-XgNTbcxPgNkPEuH/s/WUSU3M1mnO7453P53Wvym3dte+zPmqjwf5VT1FmEw8t6YQDBiBkIEKpUnNwR2x/pmZgg==} - '@zag-js/vanilla@1.34.0': - resolution: {integrity: sha512-svVl2KrUNgB4O4l2LQu2f6crb+Qw5kfRL54WJUaVGeJZrrD3kjoXtcCMUP4nLNqX/YVnY4d2kPn/qskU+JUc1A==} + '@zag-js/vanilla@1.34.1': + resolution: {integrity: sha512-hMiIUhbAwB8TuRLGSd9vFeVjA13S5yqrDlgDbA3kOeDdqKilEhHaXuSFS1iid6QXUbGTPOlrdh0VLJRtA8OnVQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -983,327 +983,327 @@ snapshots: '@typescript-eslint/types': 8.54.0 eslint-visitor-keys: 4.2.1 - '@zag-js/accordion@1.34.0': + '@zag-js/accordion@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/anatomy@1.34.0': {} + '@zag-js/anatomy@1.34.1': {} - '@zag-js/angle-slider@1.34.0': + '@zag-js/angle-slider@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/rect-utils': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/rect-utils': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/aria-hidden@1.34.0': + '@zag-js/aria-hidden@1.34.1': dependencies: - '@zag-js/dom-query': 1.34.0 + '@zag-js/dom-query': 1.34.1 - '@zag-js/avatar@1.34.0': + '@zag-js/avatar@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/carousel@1.34.0': + '@zag-js/carousel@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/scroll-snap': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/scroll-snap': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/checkbox@1.34.0': + '@zag-js/checkbox@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/focus-visible': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/focus-visible': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/clipboard@1.34.0': + '@zag-js/clipboard@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/collapsible@1.34.0': + '@zag-js/collapsible@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/collection@1.34.0': + '@zag-js/collection@1.34.1': dependencies: - '@zag-js/utils': 1.34.0 + '@zag-js/utils': 1.34.1 - '@zag-js/combobox@1.34.0': + '@zag-js/combobox@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/aria-hidden': 1.34.0 - '@zag-js/collection': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dismissable': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/focus-visible': 1.34.0 - '@zag-js/popper': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/aria-hidden': 1.34.1 + '@zag-js/collection': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dismissable': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/focus-visible': 1.34.1 + '@zag-js/popper': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/core@1.34.0': + '@zag-js/core@1.34.1': dependencies: - '@zag-js/dom-query': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/dom-query': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/date-picker@1.34.0(@internationalized/date@3.11.0)': + '@zag-js/date-picker@1.34.1(@internationalized/date@3.11.0)': dependencies: '@internationalized/date': 3.11.0 - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/date-utils': 1.34.0(@internationalized/date@3.11.0) - '@zag-js/dismissable': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/live-region': 1.34.0 - '@zag-js/popper': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 - - '@zag-js/date-utils@1.34.0(@internationalized/date@3.11.0)': + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/date-utils': 1.34.1(@internationalized/date@3.11.0) + '@zag-js/dismissable': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/live-region': 1.34.1 + '@zag-js/popper': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 + + '@zag-js/date-utils@1.34.1(@internationalized/date@3.11.0)': dependencies: '@internationalized/date': 3.11.0 - '@zag-js/dialog@1.34.0': + '@zag-js/dialog@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/aria-hidden': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dismissable': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/focus-trap': 1.34.0 - '@zag-js/remove-scroll': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/aria-hidden': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dismissable': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/focus-trap': 1.34.1 + '@zag-js/remove-scroll': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/dismissable@1.34.0': + '@zag-js/dismissable@1.34.1': dependencies: - '@zag-js/dom-query': 1.34.0 - '@zag-js/interact-outside': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/dom-query': 1.34.1 + '@zag-js/interact-outside': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/dom-query@1.34.0': + '@zag-js/dom-query@1.34.1': dependencies: - '@zag-js/types': 1.34.0 + '@zag-js/types': 1.34.1 - '@zag-js/editable@1.34.0': + '@zag-js/editable@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/interact-outside': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/interact-outside': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/floating-panel@1.34.0': + '@zag-js/floating-panel@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/popper': 1.34.0 - '@zag-js/rect-utils': 1.34.0 - '@zag-js/store': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/popper': 1.34.1 + '@zag-js/rect-utils': 1.34.1 + '@zag-js/store': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/focus-trap@1.34.0': + '@zag-js/focus-trap@1.34.1': dependencies: - '@zag-js/dom-query': 1.34.0 + '@zag-js/dom-query': 1.34.1 - '@zag-js/focus-visible@1.34.0': + '@zag-js/focus-visible@1.34.1': dependencies: - '@zag-js/dom-query': 1.34.0 + '@zag-js/dom-query': 1.34.1 - '@zag-js/interact-outside@1.34.0': + '@zag-js/interact-outside@1.34.1': dependencies: - '@zag-js/dom-query': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/dom-query': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/listbox@1.34.0': + '@zag-js/listbox@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/collection': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/focus-visible': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/collection': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/focus-visible': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/live-region@1.34.0': {} + '@zag-js/live-region@1.34.1': {} - '@zag-js/menu@1.34.0': + '@zag-js/menu@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dismissable': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/focus-visible': 1.34.0 - '@zag-js/popper': 1.34.0 - '@zag-js/rect-utils': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dismissable': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/focus-visible': 1.34.1 + '@zag-js/popper': 1.34.1 + '@zag-js/rect-utils': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/number-input@1.34.0': + '@zag-js/number-input@1.34.1': dependencies: '@internationalized/number': 3.6.5 - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/password-input@1.34.0': + '@zag-js/password-input@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/pin-input@1.34.0': + '@zag-js/pin-input@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/popper@1.34.0': + '@zag-js/popper@1.34.1': dependencies: '@floating-ui/dom': 1.7.5 - '@zag-js/dom-query': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/dom-query': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/radio-group@1.34.0': + '@zag-js/radio-group@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/focus-visible': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/focus-visible': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/rect-utils@1.34.0': {} + '@zag-js/rect-utils@1.34.1': {} - '@zag-js/remove-scroll@1.34.0': + '@zag-js/remove-scroll@1.34.1': dependencies: - '@zag-js/dom-query': 1.34.0 + '@zag-js/dom-query': 1.34.1 - '@zag-js/scroll-snap@1.34.0': + '@zag-js/scroll-snap@1.34.1': dependencies: - '@zag-js/dom-query': 1.34.0 + '@zag-js/dom-query': 1.34.1 - '@zag-js/select@1.34.0': + '@zag-js/select@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/collection': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dismissable': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/focus-visible': 1.34.0 - '@zag-js/popper': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/collection': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dismissable': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/focus-visible': 1.34.1 + '@zag-js/popper': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/signature-pad@1.34.0': + '@zag-js/signature-pad@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 perfect-freehand: 1.2.3 - '@zag-js/store@1.34.0': + '@zag-js/store@1.34.1': dependencies: proxy-compare: 3.0.1 - '@zag-js/switch@1.34.0': + '@zag-js/switch@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/focus-visible': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/focus-visible': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/tabs@1.34.0': + '@zag-js/tabs@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/timer@1.34.0': + '@zag-js/timer@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/toast@1.34.0': + '@zag-js/toast@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dismissable': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dismissable': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/toggle-group@1.34.0': + '@zag-js/toggle-group@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/tree-view@1.34.0': + '@zag-js/tree-view@1.34.1': dependencies: - '@zag-js/anatomy': 1.34.0 - '@zag-js/collection': 1.34.0 - '@zag-js/core': 1.34.0 - '@zag-js/dom-query': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/anatomy': 1.34.1 + '@zag-js/collection': 1.34.1 + '@zag-js/core': 1.34.1 + '@zag-js/dom-query': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 - '@zag-js/types@1.34.0': + '@zag-js/types@1.34.1': dependencies: csstype: 3.2.3 - '@zag-js/utils@1.34.0': {} + '@zag-js/utils@1.34.1': {} - '@zag-js/vanilla@1.34.0': + '@zag-js/vanilla@1.34.1': dependencies: - '@zag-js/core': 1.34.0 - '@zag-js/store': 1.34.0 - '@zag-js/types': 1.34.0 - '@zag-js/utils': 1.34.0 + '@zag-js/core': 1.34.1 + '@zag-js/store': 1.34.1 + '@zag-js/types': 1.34.1 + '@zag-js/utils': 1.34.1 acorn-jsx@5.3.2(acorn@8.15.0): dependencies: diff --git a/priv/design/components/clipboard.css b/priv/design/components/clipboard.css index eba8c2f..0407fb4 100644 --- a/priv/design/components/clipboard.css +++ b/priv/design/components/clipboard.css @@ -61,3 +61,29 @@ display: inline-block !important; } } + +@utility clipboard--* { + [data-scope="clipboard"][data-part="root"] { + max-width: --value(--container-ui-*, [length]); + gap: --value(--spacing-ui-gap-*, [length]); + } + + [data-scope="clipboard"][data-part="control"] { + gap: --value(--spacing-ui-gap-*, [length]); + } + + [data-scope="clipboard"][data-part="trigger"] { + font-size: --value(--text-ui-*, [length]); + line-height: --value(--text-ui-* --line-height, [length]); + min-height: --value(--spacing-ui-*, [length]); + } + + [data-scope="clipboard"][data-part="label"] { + font-size: --value(--text-ui-*, [length]); + line-height: --value(--text-ui-* --line-height, [length]); + } + + [data-scope="clipboard"][data-part="input"] { + max-width: --value(--container-ui-*, [length]); + } +} diff --git a/priv/design/components/code.css b/priv/design/components/code.css new file mode 100644 index 0000000..f6dec12 --- /dev/null +++ b/priv/design/components/code.css @@ -0,0 +1,126 @@ +@import "../main.css"; + +@layer components { + .code[data-scope="code"][data-part="root"] { + @apply ui-root; + } + + .code [data-scope="code"][data-part="content"] .highlight { + @apply ui-content scrollbar scrollbar--sm; + font-family: var(--font-code); + font-size: var(--text-ui-sm); + line-height: var(--text-ui-sm--line-height); + padding: var(--spacing-ui-padding); + background-color: var(--color-ui); + color: var(--color-ui--text); + border: 1px solid var(--color-ui--border); + overflow: auto; + background-image: linear-gradient( + var(--color-root) 50%, + var(--color-layer) 50% + ); + background-size: 100% calc(var(--text-ui) * var(--text-ui--line-height)); + background-origin: content-box; + background-attachment: local; + background-position: 0 calc(var(--spacing-ui-padding) / 2);; + + + & code { + width: fit-content; + padding-inline-end: var(--spacing-ui); + } + } + + + .code .highlight .unselectable { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + + [data-mode="light"] .code .highlight .hll { background-color: #fff9c4; } + [data-mode="light"] .code .highlight .bp { color: #0070c1; } + [data-mode="light"] .code .highlight .c, [data-mode="light"] .code .highlight .c1, [data-mode="light"] .code .highlight .ch, [data-mode="light"] .code .highlight .cm, [data-mode="light"] .code .highlight .cs { color: #008000; font-style: italic; } + [data-mode="light"] .code .highlight .cp, [data-mode="light"] .code .highlight .cpf { color: #0000ff; font-style: normal; } + [data-mode="light"] .code .highlight .dl { color: #a31515; } + [data-mode="light"] .code .highlight .err { border-color: #cd3131; color: #cd3131; } + [data-mode="light"] .code .highlight .fm { color: #795e26; } + [data-mode="light"] .code .highlight .gd { color: #a31515; } + [data-mode="light"] .code .highlight .ge { font-style: italic; } + [data-mode="light"] .code .highlight .gh { color: #000080; font-weight: bold; } + [data-mode="light"] .code .highlight .gi { color: #098658; } + [data-mode="light"] .code .highlight .go { color: #6e7681; } + [data-mode="light"] .code .highlight .gp { color: #000080; font-weight: bold; } + [data-mode="light"] .code .highlight .gr { color: #cd3131; } + [data-mode="light"] .code .highlight .gs { font-weight: bold; } + [data-mode="light"] .code .highlight .gt { color: #0451a5; } + [data-mode="light"] .code .highlight .gu { color: #800080; font-weight: bold; } + [data-mode="light"] .code .highlight .il { color: #098658; } + [data-mode="light"] .code .highlight .k, [data-mode="light"] .code .highlight .kd, [data-mode="light"] .code .highlight .kr, [data-mode="light"] .code .highlight .kc, [data-mode="light"] .code .highlight .kn, [data-mode="light"] .code .highlight .kp { color: #0000ff; font-weight: bold; } + [data-mode="light"] .code .highlight .kt { color: #267f99; } + [data-mode="light"] .code .highlight .m, [data-mode="light"] .code .highlight .mb, [data-mode="light"] .code .highlight .mf, [data-mode="light"] .code .highlight .mh, [data-mode="light"] .code .highlight .mi, [data-mode="light"] .code .highlight .mo { color: #098658; } + [data-mode="light"] .code .highlight .na { color: #e50000; } + [data-mode="light"] .code .highlight .nb { color: #267f99; } + [data-mode="light"] .code .highlight .nc, [data-mode="light"] .code .highlight .nn { color: #267f99; font-weight: bold; } + [data-mode="light"] .code .highlight .nd { color: #af00db; } + [data-mode="light"] .code .highlight .ne { color: #cd3131; font-weight: bold; } + [data-mode="light"] .code .highlight .nf { color: #795e26; } + [data-mode="light"] .code .highlight .ni { color: #6e7681; font-weight: bold; } + [data-mode="light"] .code .highlight .nl { color: #000000; } + [data-mode="light"] .code .highlight .no { color: #0070c1; } + [data-mode="light"] .code .highlight .nt { color: #800000; font-weight: bold; } + [data-mode="light"] .code .highlight .nv, [data-mode="light"] .code .highlight .vc, [data-mode="light"] .code .highlight .vg, [data-mode="light"] .code .highlight .vi, [data-mode="light"] .code .highlight .vm { color: #001080; } + [data-mode="light"] .code .highlight .o { color: #000000; } + [data-mode="light"] .code .highlight .ow { color: #0000ff; font-weight: bold; } + [data-mode="light"] .code .highlight .s, [data-mode="light"] .code .highlight .s1, [data-mode="light"] .code .highlight .s2, [data-mode="light"] .code .highlight .sa, [data-mode="light"] .code .highlight .sb, [data-mode="light"] .code .highlight .sc, [data-mode="light"] .code .highlight .sh, [data-mode="light"] .code .highlight .sx { color: #a31515; } + [data-mode="light"] .code .highlight .sd { color: #a31515; font-style: italic; } + [data-mode="light"] .code .highlight .se { color: #ee0000; font-weight: bold; } + [data-mode="light"] .code .highlight .si { color: #811f3f; font-weight: bold; } + [data-mode="light"] .code .highlight .sr { color: #811f3f; } + [data-mode="light"] .code .highlight .ss { color: #001080; } + + [data-mode="dark"] .code .highlight .hll { background-color: #264f78; } + [data-mode="dark"] .code .highlight .bp { color: #4ec9b0; } + [data-mode="dark"] .code .highlight .c, [data-mode="dark"] .code .highlight .c1, [data-mode="dark"] .code .highlight .ch, [data-mode="dark"] .code .highlight .cm, [data-mode="dark"] .code .highlight .cs { color: #6a9955; font-style: italic; } + [data-mode="dark"] .code .highlight .cp, [data-mode="dark"] .code .highlight .cpf { color: #569cd6; font-style: normal; } + [data-mode="dark"] .code .highlight .dl { color: #ce9178; } + [data-mode="dark"] .code .highlight .err { border-color: #f44747; color: #f44747; } + [data-mode="dark"] .code .highlight .fm { color: #dcdcaa; } + [data-mode="dark"] .code .highlight .gd { color: #ce9178; } + [data-mode="dark"] .code .highlight .ge { font-style: italic; } + [data-mode="dark"] .code .highlight .gh { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .gi { color: #b5cea8; } + [data-mode="dark"] .code .highlight .go { color: #808080; } + [data-mode="dark"] .code .highlight .gp { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .gr { color: #f44747; } + [data-mode="dark"] .code .highlight .gs { font-weight: bold; } + [data-mode="dark"] .code .highlight .gt { color: #4ec9b0; } + [data-mode="dark"] .code .highlight .gu { color: #c586c0; font-weight: bold; } + [data-mode="dark"] .code .highlight .il { color: #b5cea8; } + [data-mode="dark"] .code .highlight .k, [data-mode="dark"] .code .highlight .kd, [data-mode="dark"] .code .highlight .kr, [data-mode="dark"] .code .highlight .kc, [data-mode="dark"] .code .highlight .kn, [data-mode="dark"] .code .highlight .kp { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .kt { color: #4ec9b0; } + [data-mode="dark"] .code .highlight .m, [data-mode="dark"] .code .highlight .mb, [data-mode="dark"] .code .highlight .mf, [data-mode="dark"] .code .highlight .mh, [data-mode="dark"] .code .highlight .mi, [data-mode="dark"] .code .highlight .mo { color: #b5cea8; } + [data-mode="dark"] .code .highlight .na { color: #9cdcfe; } + [data-mode="dark"] .code .highlight .nb { color: #4ec9b0; } + [data-mode="dark"] .code .highlight .nc, [data-mode="dark"] .code .highlight .nn { color: #4ec9b0; font-weight: bold; } + [data-mode="dark"] .code .highlight .nd { color: #c586c0; } + [data-mode="dark"] .code .highlight .ne { color: #f44747; font-weight: bold; } + [data-mode="dark"] .code .highlight .nf { color: #dcdcaa; } + [data-mode="dark"] .code .highlight .ni { color: #808080; font-weight: bold; } + [data-mode="dark"] .code .highlight .nl { color: #c8c8c8; } + [data-mode="dark"] .code .highlight .no { color: #4fc1ff; } + [data-mode="dark"] .code .highlight .nt { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .nv, [data-mode="dark"] .code .highlight .vc, [data-mode="dark"] .code .highlight .vg, [data-mode="dark"] .code .highlight .vi, [data-mode="dark"] .code .highlight .vm { color: #9cdcfe; } + [data-mode="dark"] .code .highlight .o { color: #d4d4d4; } + [data-mode="dark"] .code .highlight .ow { color: #569cd6; font-weight: bold; } + [data-mode="dark"] .code .highlight .s, [data-mode="dark"] .code .highlight .s1, [data-mode="dark"] .code .highlight .s2, [data-mode="dark"] .code .highlight .sa, [data-mode="dark"] .code .highlight .sb, [data-mode="dark"] .code .highlight .sc, [data-mode="dark"] .code .highlight .sh, [data-mode="dark"] .code .highlight .sx { color: #ce9178; } + [data-mode="dark"] .code .highlight .sd { color: #ce9178; font-style: italic; } + [data-mode="dark"] .code .highlight .se { color: #d7ba7d; font-weight: bold; } + [data-mode="dark"] .code .highlight .si { color: #d7ba7d; font-weight: bold; } + [data-mode="dark"] .code .highlight .sr { color: #d16969; } + [data-mode="dark"] .code .highlight .ss { color: #9cdcfe; } +} diff --git a/priv/static/accordion.mjs b/priv/static/accordion.mjs index 2c6373d..939c673 100644 --- a/priv/static/accordion.mjs +++ b/priv/static/accordion.mjs @@ -22,9 +22,9 @@ import { queryAll, remove, warn -} from "./chunk-TZXIWZZ7.mjs"; +} from "./chunk-RUWIVFVB.mjs"; -// ../node_modules/.pnpm/@zag-js+accordion@1.34.0/node_modules/@zag-js/accordion/dist/index.mjs +// ../node_modules/.pnpm/@zag-js+accordion@1.34.1/node_modules/@zag-js/accordion/dist/index.mjs var anatomy = createAnatomy("accordion").parts("root", "item", "itemTrigger", "itemContent", "itemIndicator"); var parts = anatomy.build(); var getRootId = (ctx) => ctx.ids?.root ?? `accordion:${ctx.id}`; diff --git a/priv/static/angle-slider.mjs b/priv/static/angle-slider.mjs index 5a38f0b..7bcb190 100644 --- a/priv/static/angle-slider.mjs +++ b/priv/static/angle-slider.mjs @@ -1,7 +1,7 @@ import { createRect, getPointAngle -} from "./chunk-FEZIYMNT.mjs"; +} from "./chunk-QHOSSHQC.mjs"; import { Component, VanillaMachine, @@ -11,6 +11,7 @@ import { createSplitProps, dataAttr, getBoolean, + getEventKey, getEventPoint, getEventStep, getNativeEvent, @@ -22,9 +23,9 @@ import { setElementValue, snapValueToStep, trackPointerMove -} from "./chunk-TZXIWZZ7.mjs"; +} from "./chunk-RUWIVFVB.mjs"; -// ../node_modules/.pnpm/@zag-js+angle-slider@1.34.0/node_modules/@zag-js/angle-slider/dist/index.mjs +// ../node_modules/.pnpm/@zag-js+angle-slider@1.34.1/node_modules/@zag-js/angle-slider/dist/index.mjs var anatomy = createAnatomy("angle-slider").parts( "root", "label", @@ -47,14 +48,31 @@ var getControlEl = (ctx) => ctx.getById(getControlId(ctx)); var getThumbEl = (ctx) => ctx.getById(getThumbId(ctx)); var MIN_VALUE = 0; var MAX_VALUE = 359; -function getAngle(controlEl, point, angularOffset) { +function mirrorAngle(angle) { + return (360 - angle) % 360; +} +function getAngle(controlEl, point, angularOffset, dir) { const rect = createRect(controlEl.getBoundingClientRect()); - const angle = getPointAngle(rect, point); + let angle = getPointAngle(rect, point); if (angularOffset != null) { return angle - angularOffset; } + if (dir === "rtl") { + angle = mirrorAngle(angle); + } return angle; } +function getPointerValue(controlEl, point, angularOffset, value, dir) { + if (angularOffset == null) { + return getAngle(controlEl, point, null, dir); + } + const angle = getAngle(controlEl, point); + const clickAngle = value + angularOffset; + return dir === "rtl" ? value + clickAngle - angle : angle - angularOffset; +} +function getDisplayAngle(value, dir) { + return dir === "rtl" ? mirrorAngle(value) : value; +} function clampAngle(degree) { return Math.min(Math.max(degree, MIN_VALUE), MAX_VALUE); } @@ -72,6 +90,8 @@ function connect(service, normalize) { const dragging = state.matches("dragging"); const value = context.get("value"); const valueAsDegree = computed("valueAsDegree"); + const dir = prop("dir"); + const displayAngle = getDisplayAngle(value, dir); const disabled = prop("disabled"); const invalid = prop("invalid"); const readOnly = prop("readOnly"); @@ -89,12 +109,13 @@ function connect(service, normalize) { return normalize.element({ ...parts.root.attrs, id: getRootId(scope), + dir: prop("dir"), "data-disabled": dataAttr(disabled), "data-invalid": dataAttr(invalid), "data-readonly": dataAttr(readOnly), style: { "--value": value, - "--angle": valueAsDegree + "--angle": `${displayAngle}deg` } }); }, @@ -103,6 +124,7 @@ function connect(service, normalize) { ...parts.label.attrs, id: getLabelId(scope), htmlFor: getHiddenInputId(scope), + dir: prop("dir"), "data-disabled": dataAttr(disabled), "data-invalid": dataAttr(invalid), "data-readonly": dataAttr(readOnly), @@ -118,7 +140,8 @@ function connect(service, normalize) { type: "hidden", value, name: prop("name"), - id: getHiddenInputId(scope) + id: getHiddenInputId(scope), + dir: prop("dir") }); }, getControlProps() { @@ -126,6 +149,7 @@ function connect(service, normalize) { ...parts.control.attrs, role: "presentation", id: getControlId(scope), + dir: prop("dir"), "data-disabled": dataAttr(disabled), "data-invalid": dataAttr(invalid), "data-readonly": dataAttr(readOnly), @@ -157,6 +181,7 @@ function connect(service, normalize) { ...parts.thumb.attrs, id: getThumbId(scope), role: "slider", + dir: prop("dir"), "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy ?? getLabelId(scope), "aria-valuemax": 360, @@ -175,25 +200,34 @@ function connect(service, normalize) { onKeyDown(event) { if (!interactive) return; const step = getEventStep(event) * prop("step"); - switch (event.key) { - case "ArrowLeft": - case "ArrowUp": - event.preventDefault(); + const keyMap = { + ArrowLeft() { + send({ type: "THUMB.ARROW_DEC", step }); + }, + ArrowUp() { send({ type: "THUMB.ARROW_DEC", step }); - break; - case "ArrowRight": - case "ArrowDown": - event.preventDefault(); + }, + ArrowRight() { send({ type: "THUMB.ARROW_INC", step }); - break; - case "Home": - event.preventDefault(); + }, + ArrowDown() { + send({ type: "THUMB.ARROW_INC", step }); + }, + Home() { send({ type: "THUMB.HOME" }); - break; - case "End": - event.preventDefault(); + }, + End() { send({ type: "THUMB.END" }); - break; + } + }; + const key = getEventKey(event, { + dir: prop("dir"), + orientation: "horizontal" + }); + const exec = keyMap[key]; + if (exec) { + exec(event); + event.preventDefault(); } }, style: { @@ -204,12 +238,14 @@ function connect(service, normalize) { getValueTextProps() { return normalize.element({ ...parts.valueText.attrs, - id: getValueTextId(scope) + id: getValueTextId(scope), + dir: prop("dir") }); }, getMarkerGroupProps() { return normalize.element({ - ...parts.markerGroup.attrs + ...parts.markerGroup.attrs, + dir: prop("dir") }); }, getMarkerProps(props2) { @@ -221,14 +257,17 @@ function connect(service, normalize) { } else { markerState = "at-value"; } + const markerDisplayAngle = getDisplayAngle(props2.value, dir); return normalize.element({ ...parts.marker.attrs, + dir: prop("dir"), "data-value": props2.value, "data-state": markerState, "data-disabled": dataAttr(disabled), style: { "--marker-value": props2.value, - rotate: `calc(var(--marker-value) * 1deg)` + "--marker-display-value": markerDisplayAngle, + rotate: `calc(var(--marker-display-value) * 1deg)` } }); } @@ -352,7 +391,8 @@ var machine = createMachine({ const controlEl = getControlEl(scope); if (!controlEl) return; const angularOffset = refs.get("thumbDragOffset"); - const deg = getAngle(controlEl, event.point, angularOffset); + const value = context.get("value"); + const deg = getPointerValue(controlEl, event.point, angularOffset, value, prop("dir")); context.set("value", constrainAngle(deg, prop("step"))); }, setValueToMin({ context }) { diff --git a/priv/static/avatar.mjs b/priv/static/avatar.mjs index f90feee..68a9bf9 100644 --- a/priv/static/avatar.mjs +++ b/priv/static/avatar.mjs @@ -9,9 +9,9 @@ import { normalizeProps, observeAttributes, observeChildren -} from "./chunk-TZXIWZZ7.mjs"; +} from "./chunk-RUWIVFVB.mjs"; -// ../node_modules/.pnpm/@zag-js+avatar@1.34.0/node_modules/@zag-js/avatar/dist/index.mjs +// ../node_modules/.pnpm/@zag-js+avatar@1.34.1/node_modules/@zag-js/avatar/dist/index.mjs var anatomy = createAnatomy("avatar").parts("root", "image", "fallback"); var parts = anatomy.build(); var getRootId = (ctx) => ctx.ids?.root ?? `avatar:${ctx.id}`; diff --git a/priv/static/carousel.mjs b/priv/static/carousel.mjs index 3a8e2b9..940ea44 100644 --- a/priv/static/carousel.mjs +++ b/priv/static/carousel.mjs @@ -34,9 +34,9 @@ import { throttle, trackPointerMove, uniq -} from "./chunk-TZXIWZZ7.mjs"; +} from "./chunk-RUWIVFVB.mjs"; -// ../node_modules/.pnpm/@zag-js+scroll-snap@1.34.0/node_modules/@zag-js/scroll-snap/dist/index.mjs +// ../node_modules/.pnpm/@zag-js+scroll-snap@1.34.1/node_modules/@zag-js/scroll-snap/dist/index.mjs var getDirection = (element) => getComputedStyle2(element).direction; function getScrollPadding(element) { const style = getComputedStyle2(element); @@ -198,7 +198,7 @@ function findSnapPoint(parent, axis, predicate) { var uniq2 = (arr) => [...new Set(arr)]; var clamp = (min, max) => (value) => Math.max(min, Math.min(max, value)); -// ../node_modules/.pnpm/@zag-js+carousel@1.34.0/node_modules/@zag-js/carousel/dist/index.mjs +// ../node_modules/.pnpm/@zag-js+carousel@1.34.1/node_modules/@zag-js/carousel/dist/index.mjs var anatomy = createAnatomy("carousel").parts( "root", "itemGroup", diff --git a/priv/static/checkbox.mjs b/priv/static/checkbox.mjs index 90a7341..015541c 100644 --- a/priv/static/checkbox.mjs +++ b/priv/static/checkbox.mjs @@ -1,7 +1,7 @@ import { isFocusVisible, trackFocusVisible -} from "./chunk-GXGJDSCU.mjs"; +} from "./chunk-2QLEEEGG.mjs"; import { Component, VanillaMachine, @@ -21,9 +21,9 @@ import { trackFormControl, trackPress, visuallyHiddenStyle -} from "./chunk-TZXIWZZ7.mjs"; +} from "./chunk-RUWIVFVB.mjs"; -// ../node_modules/.pnpm/@zag-js+checkbox@1.34.0/node_modules/@zag-js/checkbox/dist/index.mjs +// ../node_modules/.pnpm/@zag-js+checkbox@1.34.1/node_modules/@zag-js/checkbox/dist/index.mjs var anatomy = createAnatomy("checkbox").parts("root", "label", "control", "indicator"); var parts = anatomy.build(); var getRootId = (ctx) => ctx.ids?.root ?? `checkbox:${ctx.id}`; diff --git a/priv/static/chunk-2QLEEEGG.mjs b/priv/static/chunk-2QLEEEGG.mjs new file mode 100644 index 0000000..e99849d --- /dev/null +++ b/priv/static/chunk-2QLEEEGG.mjs @@ -0,0 +1,174 @@ +import { + getActiveElement, + getDocument, + getEventTarget, + getWindow, + isMac, + isVirtualClick +} from "./chunk-RUWIVFVB.mjs"; + +// ../node_modules/.pnpm/@zag-js+focus-visible@1.34.1/node_modules/@zag-js/focus-visible/dist/index.mjs +function isValidKey(e) { + return !(e.metaKey || !isMac() && e.altKey || e.ctrlKey || e.key === "Control" || e.key === "Shift" || e.key === "Meta"); +} +var nonTextInputTypes = /* @__PURE__ */ new Set(["checkbox", "radio", "range", "color", "file", "image", "button", "submit", "reset"]); +function isKeyboardFocusEvent(isTextInput, modality, e) { + const eventTarget = e ? getEventTarget(e) : null; + const doc = getDocument(eventTarget); + const win = getWindow(eventTarget); + const activeElement = getActiveElement(doc); + isTextInput = isTextInput || activeElement instanceof win.HTMLInputElement && !nonTextInputTypes.has(activeElement?.type) || activeElement instanceof win.HTMLTextAreaElement || activeElement instanceof win.HTMLElement && activeElement.isContentEditable; + return !(isTextInput && modality === "keyboard" && e instanceof win.KeyboardEvent && !Reflect.has(FOCUS_VISIBLE_INPUT_KEYS, e.key)); +} +var currentModality = null; +var changeHandlers = /* @__PURE__ */ new Set(); +var listenerMap = /* @__PURE__ */ new Map(); +var hasEventBeforeFocus = false; +var hasBlurredWindowRecently = false; +var ignoreFocusEvent = false; +var FOCUS_VISIBLE_INPUT_KEYS = { + Tab: true, + Escape: true +}; +function triggerChangeHandlers(modality, e) { + for (let handler of changeHandlers) { + handler(modality, e); + } +} +function handleKeyboardEvent(e) { + hasEventBeforeFocus = true; + if (isValidKey(e)) { + currentModality = "keyboard"; + triggerChangeHandlers("keyboard", e); + } +} +function handlePointerEvent(e) { + currentModality = "pointer"; + if (e.type === "mousedown" || e.type === "pointerdown") { + hasEventBeforeFocus = true; + triggerChangeHandlers("pointer", e); + } +} +function handleClickEvent(e) { + if (isVirtualClick(e)) { + hasEventBeforeFocus = true; + currentModality = "virtual"; + } +} +function handleFocusEvent(e) { + const target = getEventTarget(e); + if (target === getWindow(target) || target === getDocument(target) || ignoreFocusEvent || !e.isTrusted) { + return; + } + if (!hasEventBeforeFocus && !hasBlurredWindowRecently) { + currentModality = "virtual"; + triggerChangeHandlers("virtual", e); + } + hasEventBeforeFocus = false; + hasBlurredWindowRecently = false; +} +function handleWindowBlur() { + hasEventBeforeFocus = false; + hasBlurredWindowRecently = true; +} +function setupGlobalFocusEvents(root) { + if (typeof window === "undefined" || listenerMap.get(getWindow(root))) { + return; + } + const win = getWindow(root); + const doc = getDocument(root); + let focus = win.HTMLElement.prototype.focus; + function patchedFocus() { + hasEventBeforeFocus = true; + focus.apply(this, arguments); + } + try { + Object.defineProperty(win.HTMLElement.prototype, "focus", { + configurable: true, + value: patchedFocus + }); + } catch { + } + doc.addEventListener("keydown", handleKeyboardEvent, true); + doc.addEventListener("keyup", handleKeyboardEvent, true); + doc.addEventListener("click", handleClickEvent, true); + win.addEventListener("focus", handleFocusEvent, true); + win.addEventListener("blur", handleWindowBlur, false); + if (typeof win.PointerEvent !== "undefined") { + doc.addEventListener("pointerdown", handlePointerEvent, true); + doc.addEventListener("pointermove", handlePointerEvent, true); + doc.addEventListener("pointerup", handlePointerEvent, true); + } else { + doc.addEventListener("mousedown", handlePointerEvent, true); + doc.addEventListener("mousemove", handlePointerEvent, true); + doc.addEventListener("mouseup", handlePointerEvent, true); + } + win.addEventListener( + "beforeunload", + () => { + tearDownWindowFocusTracking(root); + }, + { once: true } + ); + listenerMap.set(win, { focus }); +} +var tearDownWindowFocusTracking = (root, loadListener) => { + const win = getWindow(root); + const doc = getDocument(root); + const listenerData = listenerMap.get(win); + if (!listenerData) { + return; + } + try { + Object.defineProperty(win.HTMLElement.prototype, "focus", { + configurable: true, + value: listenerData.focus + }); + } catch { + } + doc.removeEventListener("keydown", handleKeyboardEvent, true); + doc.removeEventListener("keyup", handleKeyboardEvent, true); + doc.removeEventListener("click", handleClickEvent, true); + win.removeEventListener("focus", handleFocusEvent, true); + win.removeEventListener("blur", handleWindowBlur, false); + if (typeof win.PointerEvent !== "undefined") { + doc.removeEventListener("pointerdown", handlePointerEvent, true); + doc.removeEventListener("pointermove", handlePointerEvent, true); + doc.removeEventListener("pointerup", handlePointerEvent, true); + } else { + doc.removeEventListener("mousedown", handlePointerEvent, true); + doc.removeEventListener("mousemove", handlePointerEvent, true); + doc.removeEventListener("mouseup", handlePointerEvent, true); + } + listenerMap.delete(win); +}; +function getInteractionModality() { + return currentModality; +} +function setInteractionModality(modality) { + currentModality = modality; + triggerChangeHandlers(modality, null); +} +function isFocusVisible() { + return currentModality === "keyboard" || currentModality === "virtual"; +} +function trackFocusVisible(props = {}) { + const { isTextInput, autoFocus, onChange, root } = props; + setupGlobalFocusEvents(root); + onChange?.({ isFocusVisible: autoFocus || isFocusVisible(), modality: currentModality }); + const handler = (modality, e) => { + if (!isKeyboardFocusEvent(!!isTextInput, modality, e)) return; + onChange?.({ isFocusVisible: isFocusVisible(), modality }); + }; + changeHandlers.add(handler); + return () => { + changeHandlers.delete(handler); + }; +} + +export { + getInteractionModality, + setInteractionModality, + isFocusVisible, + trackFocusVisible +}; diff --git a/priv/static/chunk-EBQGC3XC.mjs b/priv/static/chunk-EBQGC3XC.mjs new file mode 100644 index 0000000..ee7255b --- /dev/null +++ b/priv/static/chunk-EBQGC3XC.mjs @@ -0,0 +1,237 @@ +import { + addDomEvent, + callAll, + contains, + getDocument, + getEventTarget, + getNearestOverflowAncestor, + getWindow, + isContextMenuEvent, + isControlledElement, + isFocusable, + isHTMLElement, + isShadowRoot, + isTouchDevice, + raf +} from "./chunk-RUWIVFVB.mjs"; + +// ../node_modules/.pnpm/@zag-js+interact-outside@1.34.1/node_modules/@zag-js/interact-outside/dist/index.mjs +function getWindowFrames(win) { + const frames = { + each(cb) { + for (let i = 0; i < win.frames?.length; i += 1) { + const frame = win.frames[i]; + if (frame) cb(frame); + } + }, + addEventListener(event, listener, options) { + frames.each((frame) => { + try { + frame.document.addEventListener(event, listener, options); + } catch { + } + }); + return () => { + try { + frames.removeEventListener(event, listener, options); + } catch { + } + }; + }, + removeEventListener(event, listener, options) { + frames.each((frame) => { + try { + frame.document.removeEventListener(event, listener, options); + } catch { + } + }); + } + }; + return frames; +} +function getParentWindow(win) { + const parent = win.frameElement != null ? win.parent : null; + return { + addEventListener: (event, listener, options) => { + try { + parent?.addEventListener(event, listener, options); + } catch { + } + return () => { + try { + parent?.removeEventListener(event, listener, options); + } catch { + } + }; + }, + removeEventListener: (event, listener, options) => { + try { + parent?.removeEventListener(event, listener, options); + } catch { + } + } + }; +} +var POINTER_OUTSIDE_EVENT = "pointerdown.outside"; +var FOCUS_OUTSIDE_EVENT = "focus.outside"; +function isComposedPathFocusable(composedPath) { + for (const node of composedPath) { + if (isHTMLElement(node) && isFocusable(node)) return true; + } + return false; +} +var isPointerEvent = (event) => "clientY" in event; +function isEventPointWithin(node, event) { + if (!isPointerEvent(event) || !node) return false; + const rect = node.getBoundingClientRect(); + if (rect.width === 0 || rect.height === 0) return false; + return rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width; +} +function isPointInRect(rect, point) { + return rect.y <= point.y && point.y <= rect.y + rect.height && rect.x <= point.x && point.x <= rect.x + rect.width; +} +function isEventWithinScrollbar(event, ancestor) { + if (!ancestor || !isPointerEvent(event)) return false; + const isScrollableY = ancestor.scrollHeight > ancestor.clientHeight; + const onScrollbarY = isScrollableY && event.clientX > ancestor.offsetLeft + ancestor.clientWidth; + const isScrollableX = ancestor.scrollWidth > ancestor.clientWidth; + const onScrollbarX = isScrollableX && event.clientY > ancestor.offsetTop + ancestor.clientHeight; + const rect = { + x: ancestor.offsetLeft, + y: ancestor.offsetTop, + width: ancestor.clientWidth + (isScrollableY ? 16 : 0), + height: ancestor.clientHeight + (isScrollableX ? 16 : 0) + }; + const point = { + x: event.clientX, + y: event.clientY + }; + if (!isPointInRect(rect, point)) return false; + return onScrollbarY || onScrollbarX; +} +function trackInteractOutsideImpl(node, options) { + const { + exclude, + onFocusOutside, + onPointerDownOutside, + onInteractOutside, + defer, + followControlledElements = true + } = options; + if (!node) return; + const doc = getDocument(node); + const win = getWindow(node); + const frames = getWindowFrames(win); + const parentWin = getParentWindow(win); + function isEventOutside(event, target) { + if (!isHTMLElement(target)) return false; + if (!target.isConnected) return false; + if (contains(node, target)) return false; + if (isEventPointWithin(node, event)) return false; + if (followControlledElements && isControlledElement(node, target)) return false; + const triggerEl = doc.querySelector(`[aria-controls="${node.id}"]`); + if (triggerEl) { + const triggerAncestor = getNearestOverflowAncestor(triggerEl); + if (isEventWithinScrollbar(event, triggerAncestor)) return false; + } + const nodeAncestor = getNearestOverflowAncestor(node); + if (isEventWithinScrollbar(event, nodeAncestor)) return false; + return !exclude?.(target); + } + const pointerdownCleanups = /* @__PURE__ */ new Set(); + const isInShadowRoot = isShadowRoot(node?.getRootNode()); + function onPointerDown(event) { + function handler(clickEvent) { + const func = defer && !isTouchDevice() ? raf : (v) => v(); + const evt = clickEvent ?? event; + const composedPath = evt?.composedPath?.() ?? [evt?.target]; + func(() => { + const target = isInShadowRoot ? composedPath[0] : getEventTarget(event); + if (!node || !isEventOutside(event, target)) return; + if (onPointerDownOutside || onInteractOutside) { + const handler2 = callAll(onPointerDownOutside, onInteractOutside); + node.addEventListener(POINTER_OUTSIDE_EVENT, handler2, { once: true }); + } + fireCustomEvent(node, POINTER_OUTSIDE_EVENT, { + bubbles: false, + cancelable: true, + detail: { + originalEvent: evt, + contextmenu: isContextMenuEvent(evt), + focusable: isComposedPathFocusable(composedPath), + target + } + }); + }); + } + if (event.pointerType === "touch") { + pointerdownCleanups.forEach((fn) => fn()); + pointerdownCleanups.add(addDomEvent(doc, "click", handler, { once: true })); + pointerdownCleanups.add(parentWin.addEventListener("click", handler, { once: true })); + pointerdownCleanups.add(frames.addEventListener("click", handler, { once: true })); + } else { + handler(); + } + } + const cleanups = /* @__PURE__ */ new Set(); + const timer = setTimeout(() => { + cleanups.add(addDomEvent(doc, "pointerdown", onPointerDown, true)); + cleanups.add(parentWin.addEventListener("pointerdown", onPointerDown, true)); + cleanups.add(frames.addEventListener("pointerdown", onPointerDown, true)); + }, 0); + function onFocusin(event) { + const func = defer ? raf : (v) => v(); + func(() => { + const composedPath = event?.composedPath?.() ?? [event?.target]; + const target = isInShadowRoot ? composedPath[0] : getEventTarget(event); + if (!node || !isEventOutside(event, target)) return; + if (onFocusOutside || onInteractOutside) { + const handler = callAll(onFocusOutside, onInteractOutside); + node.addEventListener(FOCUS_OUTSIDE_EVENT, handler, { once: true }); + } + fireCustomEvent(node, FOCUS_OUTSIDE_EVENT, { + bubbles: false, + cancelable: true, + detail: { + originalEvent: event, + contextmenu: false, + focusable: isFocusable(target), + target + } + }); + }); + } + if (!isTouchDevice()) { + cleanups.add(addDomEvent(doc, "focusin", onFocusin, true)); + cleanups.add(parentWin.addEventListener("focusin", onFocusin, true)); + cleanups.add(frames.addEventListener("focusin", onFocusin, true)); + } + return () => { + clearTimeout(timer); + pointerdownCleanups.forEach((fn) => fn()); + cleanups.forEach((fn) => fn()); + }; +} +function trackInteractOutside(nodeOrFn, options) { + const { defer } = options; + const func = defer ? raf : (v) => v(); + const cleanups = []; + cleanups.push( + func(() => { + const node = typeof nodeOrFn === "function" ? nodeOrFn() : nodeOrFn; + cleanups.push(trackInteractOutsideImpl(node, options)); + }) + ); + return () => { + cleanups.forEach((fn) => fn?.()); + }; +} +function fireCustomEvent(el, type, init) { + const win = el.ownerDocument.defaultView || window; + const event = new win.CustomEvent(type, init); + return el.dispatchEvent(event); +} + +export { + trackInteractOutside +}; diff --git a/priv/static/chunk-GN3NEUUU.mjs b/priv/static/chunk-GN3NEUUU.mjs new file mode 100644 index 0000000..f7ec740 --- /dev/null +++ b/priv/static/chunk-GN3NEUUU.mjs @@ -0,0 +1,1988 @@ +import { + compact, + getComputedStyle as getComputedStyle2, + getWindow, + isHTMLElement, + isNull, + noop, + raf +} from "./chunk-RUWIVFVB.mjs"; + +// ../node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs +var sides = ["top", "right", "bottom", "left"]; +var min = Math.min; +var max = Math.max; +var round = Math.round; +var floor = Math.floor; +var createCoords = (v) => ({ + x: v, + y: v +}); +var oppositeSideMap = { + left: "right", + right: "left", + bottom: "top", + top: "bottom" +}; +var oppositeAlignmentMap = { + start: "end", + end: "start" +}; +function clamp(start, value, end) { + return max(start, min(value, end)); +} +function evaluate(value, param) { + return typeof value === "function" ? value(param) : value; +} +function getSide(placement) { + return placement.split("-")[0]; +} +function getAlignment(placement) { + return placement.split("-")[1]; +} +function getOppositeAxis(axis) { + return axis === "x" ? "y" : "x"; +} +function getAxisLength(axis) { + return axis === "y" ? "height" : "width"; +} +var yAxisSides = /* @__PURE__ */ new Set(["top", "bottom"]); +function getSideAxis(placement) { + return yAxisSides.has(getSide(placement)) ? "y" : "x"; +} +function getAlignmentAxis(placement) { + return getOppositeAxis(getSideAxis(placement)); +} +function getAlignmentSides(placement, rects, rtl) { + if (rtl === void 0) { + rtl = false; + } + const alignment = getAlignment(placement); + const alignmentAxis = getAlignmentAxis(placement); + const length = getAxisLength(alignmentAxis); + let mainAlignmentSide = alignmentAxis === "x" ? alignment === (rtl ? "end" : "start") ? "right" : "left" : alignment === "start" ? "bottom" : "top"; + if (rects.reference[length] > rects.floating[length]) { + mainAlignmentSide = getOppositePlacement(mainAlignmentSide); + } + return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)]; +} +function getExpandedPlacements(placement) { + const oppositePlacement = getOppositePlacement(placement); + return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)]; +} +function getOppositeAlignmentPlacement(placement) { + return placement.replace(/start|end/g, (alignment) => oppositeAlignmentMap[alignment]); +} +var lrPlacement = ["left", "right"]; +var rlPlacement = ["right", "left"]; +var tbPlacement = ["top", "bottom"]; +var btPlacement = ["bottom", "top"]; +function getSideList(side, isStart, rtl) { + switch (side) { + case "top": + case "bottom": + if (rtl) return isStart ? rlPlacement : lrPlacement; + return isStart ? lrPlacement : rlPlacement; + case "left": + case "right": + return isStart ? tbPlacement : btPlacement; + default: + return []; + } +} +function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) { + const alignment = getAlignment(placement); + let list = getSideList(getSide(placement), direction === "start", rtl); + if (alignment) { + list = list.map((side) => side + "-" + alignment); + if (flipAlignment) { + list = list.concat(list.map(getOppositeAlignmentPlacement)); + } + } + return list; +} +function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, (side) => oppositeSideMap[side]); +} +function expandPaddingObject(padding) { + return { + top: 0, + right: 0, + bottom: 0, + left: 0, + ...padding + }; +} +function getPaddingObject(padding) { + return typeof padding !== "number" ? expandPaddingObject(padding) : { + top: padding, + right: padding, + bottom: padding, + left: padding + }; +} +function rectToClientRect(rect) { + const { + x, + y, + width, + height + } = rect; + return { + width, + height, + top: y, + left: x, + right: x + width, + bottom: y + height, + x, + y + }; +} + +// ../node_modules/.pnpm/@floating-ui+core@1.7.4/node_modules/@floating-ui/core/dist/floating-ui.core.mjs +function computeCoordsFromPlacement(_ref, placement, rtl) { + let { + reference, + floating + } = _ref; + const sideAxis = getSideAxis(placement); + const alignmentAxis = getAlignmentAxis(placement); + const alignLength = getAxisLength(alignmentAxis); + const side = getSide(placement); + const isVertical = sideAxis === "y"; + const commonX = reference.x + reference.width / 2 - floating.width / 2; + const commonY = reference.y + reference.height / 2 - floating.height / 2; + const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2; + let coords; + switch (side) { + case "top": + coords = { + x: commonX, + y: reference.y - floating.height + }; + break; + case "bottom": + coords = { + x: commonX, + y: reference.y + reference.height + }; + break; + case "right": + coords = { + x: reference.x + reference.width, + y: commonY + }; + break; + case "left": + coords = { + x: reference.x - floating.width, + y: commonY + }; + break; + default: + coords = { + x: reference.x, + y: reference.y + }; + } + switch (getAlignment(placement)) { + case "start": + coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1); + break; + case "end": + coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1); + break; + } + return coords; +} +async function detectOverflow(state, options) { + var _await$platform$isEle; + if (options === void 0) { + options = {}; + } + const { + x, + y, + platform: platform2, + rects, + elements, + strategy + } = state; + const { + boundary = "clippingAncestors", + rootBoundary = "viewport", + elementContext = "floating", + altBoundary = false, + padding = 0 + } = evaluate(options, state); + const paddingObject = getPaddingObject(padding); + const altContext = elementContext === "floating" ? "reference" : "floating"; + const element = elements[altBoundary ? altContext : elementContext]; + const clippingClientRect = rectToClientRect(await platform2.getClippingRect({ + element: ((_await$platform$isEle = await (platform2.isElement == null ? void 0 : platform2.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || await (platform2.getDocumentElement == null ? void 0 : platform2.getDocumentElement(elements.floating)), + boundary, + rootBoundary, + strategy + })); + const rect = elementContext === "floating" ? { + x, + y, + width: rects.floating.width, + height: rects.floating.height + } : rects.reference; + const offsetParent = await (platform2.getOffsetParent == null ? void 0 : platform2.getOffsetParent(elements.floating)); + const offsetScale = await (platform2.isElement == null ? void 0 : platform2.isElement(offsetParent)) ? await (platform2.getScale == null ? void 0 : platform2.getScale(offsetParent)) || { + x: 1, + y: 1 + } : { + x: 1, + y: 1 + }; + const elementClientRect = rectToClientRect(platform2.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform2.convertOffsetParentRelativeRectToViewportRelativeRect({ + elements, + rect, + offsetParent, + strategy + }) : rect); + return { + top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y, + bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y, + left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x, + right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x + }; +} +var computePosition = async (reference, floating, config) => { + const { + placement = "bottom", + strategy = "absolute", + middleware = [], + platform: platform2 + } = config; + const validMiddleware = middleware.filter(Boolean); + const rtl = await (platform2.isRTL == null ? void 0 : platform2.isRTL(floating)); + let rects = await platform2.getElementRects({ + reference, + floating, + strategy + }); + let { + x, + y + } = computeCoordsFromPlacement(rects, placement, rtl); + let statefulPlacement = placement; + let middlewareData = {}; + let resetCount = 0; + for (let i = 0; i < validMiddleware.length; i++) { + var _platform$detectOverf; + const { + name, + fn + } = validMiddleware[i]; + const { + x: nextX, + y: nextY, + data, + reset + } = await fn({ + x, + y, + initialPlacement: placement, + placement: statefulPlacement, + strategy, + middlewareData, + rects, + platform: { + ...platform2, + detectOverflow: (_platform$detectOverf = platform2.detectOverflow) != null ? _platform$detectOverf : detectOverflow + }, + elements: { + reference, + floating + } + }); + x = nextX != null ? nextX : x; + y = nextY != null ? nextY : y; + middlewareData = { + ...middlewareData, + [name]: { + ...middlewareData[name], + ...data + } + }; + if (reset && resetCount <= 50) { + resetCount++; + if (typeof reset === "object") { + if (reset.placement) { + statefulPlacement = reset.placement; + } + if (reset.rects) { + rects = reset.rects === true ? await platform2.getElementRects({ + reference, + floating, + strategy + }) : reset.rects; + } + ({ + x, + y + } = computeCoordsFromPlacement(rects, statefulPlacement, rtl)); + } + i = -1; + } + } + return { + x, + y, + placement: statefulPlacement, + strategy, + middlewareData + }; +}; +var arrow = (options) => ({ + name: "arrow", + options, + async fn(state) { + const { + x, + y, + placement, + rects, + platform: platform2, + elements, + middlewareData + } = state; + const { + element, + padding = 0 + } = evaluate(options, state) || {}; + if (element == null) { + return {}; + } + const paddingObject = getPaddingObject(padding); + const coords = { + x, + y + }; + const axis = getAlignmentAxis(placement); + const length = getAxisLength(axis); + const arrowDimensions = await platform2.getDimensions(element); + const isYAxis = axis === "y"; + const minProp = isYAxis ? "top" : "left"; + const maxProp = isYAxis ? "bottom" : "right"; + const clientProp = isYAxis ? "clientHeight" : "clientWidth"; + const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length]; + const startDiff = coords[axis] - rects.reference[axis]; + const arrowOffsetParent = await (platform2.getOffsetParent == null ? void 0 : platform2.getOffsetParent(element)); + let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0; + if (!clientSize || !await (platform2.isElement == null ? void 0 : platform2.isElement(arrowOffsetParent))) { + clientSize = elements.floating[clientProp] || rects.floating[length]; + } + const centerToReference = endDiff / 2 - startDiff / 2; + const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1; + const minPadding = min(paddingObject[minProp], largestPossiblePadding); + const maxPadding = min(paddingObject[maxProp], largestPossiblePadding); + const min$1 = minPadding; + const max2 = clientSize - arrowDimensions[length] - maxPadding; + const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference; + const offset3 = clamp(min$1, center, max2); + const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset3 && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0; + const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max2 : 0; + return { + [axis]: coords[axis] + alignmentOffset, + data: { + [axis]: offset3, + centerOffset: center - offset3 - alignmentOffset, + ...shouldAddOffset && { + alignmentOffset + } + }, + reset: shouldAddOffset + }; + } +}); +var flip = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: "flip", + options, + async fn(state) { + var _middlewareData$arrow, _middlewareData$flip; + const { + placement, + middlewareData, + rects, + initialPlacement, + platform: platform2, + elements + } = state; + const { + mainAxis: checkMainAxis = true, + crossAxis: checkCrossAxis = true, + fallbackPlacements: specifiedFallbackPlacements, + fallbackStrategy = "bestFit", + fallbackAxisSideDirection = "none", + flipAlignment = true, + ...detectOverflowOptions + } = evaluate(options, state); + if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { + return {}; + } + const side = getSide(placement); + const initialSideAxis = getSideAxis(initialPlacement); + const isBasePlacement = getSide(initialPlacement) === initialPlacement; + const rtl = await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements.floating)); + const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement)); + const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== "none"; + if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) { + fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl)); + } + const placements2 = [initialPlacement, ...fallbackPlacements]; + const overflow = await platform2.detectOverflow(state, detectOverflowOptions); + const overflows = []; + let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || []; + if (checkMainAxis) { + overflows.push(overflow[side]); + } + if (checkCrossAxis) { + const sides2 = getAlignmentSides(placement, rects, rtl); + overflows.push(overflow[sides2[0]], overflow[sides2[1]]); + } + overflowsData = [...overflowsData, { + placement, + overflows + }]; + if (!overflows.every((side2) => side2 <= 0)) { + var _middlewareData$flip2, _overflowsData$filter; + const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1; + const nextPlacement = placements2[nextIndex]; + if (nextPlacement) { + const ignoreCrossAxisOverflow = checkCrossAxis === "alignment" ? initialSideAxis !== getSideAxis(nextPlacement) : false; + if (!ignoreCrossAxisOverflow || // We leave the current main axis only if every placement on that axis + // overflows the main axis. + overflowsData.every((d) => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) { + return { + data: { + index: nextIndex, + overflows: overflowsData + }, + reset: { + placement: nextPlacement + } + }; + } + } + let resetPlacement = (_overflowsData$filter = overflowsData.filter((d) => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement; + if (!resetPlacement) { + switch (fallbackStrategy) { + case "bestFit": { + var _overflowsData$filter2; + const placement2 = (_overflowsData$filter2 = overflowsData.filter((d) => { + if (hasFallbackAxisSideDirection) { + const currentSideAxis = getSideAxis(d.placement); + return currentSideAxis === initialSideAxis || // Create a bias to the `y` side axis due to horizontal + // reading directions favoring greater width. + currentSideAxis === "y"; + } + return true; + }).map((d) => [d.placement, d.overflows.filter((overflow2) => overflow2 > 0).reduce((acc, overflow2) => acc + overflow2, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0]; + if (placement2) { + resetPlacement = placement2; + } + break; + } + case "initialPlacement": + resetPlacement = initialPlacement; + break; + } + } + if (placement !== resetPlacement) { + return { + reset: { + placement: resetPlacement + } + }; + } + } + return {}; + } + }; +}; +function getSideOffsets(overflow, rect) { + return { + top: overflow.top - rect.height, + right: overflow.right - rect.width, + bottom: overflow.bottom - rect.height, + left: overflow.left - rect.width + }; +} +function isAnySideFullyClipped(overflow) { + return sides.some((side) => overflow[side] >= 0); +} +var hide = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: "hide", + options, + async fn(state) { + const { + rects, + platform: platform2 + } = state; + const { + strategy = "referenceHidden", + ...detectOverflowOptions + } = evaluate(options, state); + switch (strategy) { + case "referenceHidden": { + const overflow = await platform2.detectOverflow(state, { + ...detectOverflowOptions, + elementContext: "reference" + }); + const offsets = getSideOffsets(overflow, rects.reference); + return { + data: { + referenceHiddenOffsets: offsets, + referenceHidden: isAnySideFullyClipped(offsets) + } + }; + } + case "escaped": { + const overflow = await platform2.detectOverflow(state, { + ...detectOverflowOptions, + altBoundary: true + }); + const offsets = getSideOffsets(overflow, rects.floating); + return { + data: { + escapedOffsets: offsets, + escaped: isAnySideFullyClipped(offsets) + } + }; + } + default: { + return {}; + } + } + } + }; +}; +var originSides = /* @__PURE__ */ new Set(["left", "top"]); +async function convertValueToCoords(state, options) { + const { + placement, + platform: platform2, + elements + } = state; + const rtl = await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements.floating)); + const side = getSide(placement); + const alignment = getAlignment(placement); + const isVertical = getSideAxis(placement) === "y"; + const mainAxisMulti = originSides.has(side) ? -1 : 1; + const crossAxisMulti = rtl && isVertical ? -1 : 1; + const rawValue = evaluate(options, state); + let { + mainAxis, + crossAxis, + alignmentAxis + } = typeof rawValue === "number" ? { + mainAxis: rawValue, + crossAxis: 0, + alignmentAxis: null + } : { + mainAxis: rawValue.mainAxis || 0, + crossAxis: rawValue.crossAxis || 0, + alignmentAxis: rawValue.alignmentAxis + }; + if (alignment && typeof alignmentAxis === "number") { + crossAxis = alignment === "end" ? alignmentAxis * -1 : alignmentAxis; + } + return isVertical ? { + x: crossAxis * crossAxisMulti, + y: mainAxis * mainAxisMulti + } : { + x: mainAxis * mainAxisMulti, + y: crossAxis * crossAxisMulti + }; +} +var offset = function(options) { + if (options === void 0) { + options = 0; + } + return { + name: "offset", + options, + async fn(state) { + var _middlewareData$offse, _middlewareData$arrow; + const { + x, + y, + placement, + middlewareData + } = state; + const diffCoords = await convertValueToCoords(state, options); + if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { + return {}; + } + return { + x: x + diffCoords.x, + y: y + diffCoords.y, + data: { + ...diffCoords, + placement + } + }; + } + }; +}; +var shift = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: "shift", + options, + async fn(state) { + const { + x, + y, + placement, + platform: platform2 + } = state; + const { + mainAxis: checkMainAxis = true, + crossAxis: checkCrossAxis = false, + limiter = { + fn: (_ref) => { + let { + x: x2, + y: y2 + } = _ref; + return { + x: x2, + y: y2 + }; + } + }, + ...detectOverflowOptions + } = evaluate(options, state); + const coords = { + x, + y + }; + const overflow = await platform2.detectOverflow(state, detectOverflowOptions); + const crossAxis = getSideAxis(getSide(placement)); + const mainAxis = getOppositeAxis(crossAxis); + let mainAxisCoord = coords[mainAxis]; + let crossAxisCoord = coords[crossAxis]; + if (checkMainAxis) { + const minSide = mainAxis === "y" ? "top" : "left"; + const maxSide = mainAxis === "y" ? "bottom" : "right"; + const min2 = mainAxisCoord + overflow[minSide]; + const max2 = mainAxisCoord - overflow[maxSide]; + mainAxisCoord = clamp(min2, mainAxisCoord, max2); + } + if (checkCrossAxis) { + const minSide = crossAxis === "y" ? "top" : "left"; + const maxSide = crossAxis === "y" ? "bottom" : "right"; + const min2 = crossAxisCoord + overflow[minSide]; + const max2 = crossAxisCoord - overflow[maxSide]; + crossAxisCoord = clamp(min2, crossAxisCoord, max2); + } + const limitedCoords = limiter.fn({ + ...state, + [mainAxis]: mainAxisCoord, + [crossAxis]: crossAxisCoord + }); + return { + ...limitedCoords, + data: { + x: limitedCoords.x - x, + y: limitedCoords.y - y, + enabled: { + [mainAxis]: checkMainAxis, + [crossAxis]: checkCrossAxis + } + } + }; + } + }; +}; +var limitShift = function(options) { + if (options === void 0) { + options = {}; + } + return { + options, + fn(state) { + const { + x, + y, + placement, + rects, + middlewareData + } = state; + const { + offset: offset3 = 0, + mainAxis: checkMainAxis = true, + crossAxis: checkCrossAxis = true + } = evaluate(options, state); + const coords = { + x, + y + }; + const crossAxis = getSideAxis(placement); + const mainAxis = getOppositeAxis(crossAxis); + let mainAxisCoord = coords[mainAxis]; + let crossAxisCoord = coords[crossAxis]; + const rawOffset = evaluate(offset3, state); + const computedOffset = typeof rawOffset === "number" ? { + mainAxis: rawOffset, + crossAxis: 0 + } : { + mainAxis: 0, + crossAxis: 0, + ...rawOffset + }; + if (checkMainAxis) { + const len = mainAxis === "y" ? "height" : "width"; + const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis; + const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis; + if (mainAxisCoord < limitMin) { + mainAxisCoord = limitMin; + } else if (mainAxisCoord > limitMax) { + mainAxisCoord = limitMax; + } + } + if (checkCrossAxis) { + var _middlewareData$offse, _middlewareData$offse2; + const len = mainAxis === "y" ? "width" : "height"; + const isOriginSide = originSides.has(getSide(placement)); + const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis); + const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0); + if (crossAxisCoord < limitMin) { + crossAxisCoord = limitMin; + } else if (crossAxisCoord > limitMax) { + crossAxisCoord = limitMax; + } + } + return { + [mainAxis]: mainAxisCoord, + [crossAxis]: crossAxisCoord + }; + } + }; +}; +var size = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: "size", + options, + async fn(state) { + var _state$middlewareData, _state$middlewareData2; + const { + placement, + rects, + platform: platform2, + elements + } = state; + const { + apply = () => { + }, + ...detectOverflowOptions + } = evaluate(options, state); + const overflow = await platform2.detectOverflow(state, detectOverflowOptions); + const side = getSide(placement); + const alignment = getAlignment(placement); + const isYAxis = getSideAxis(placement) === "y"; + const { + width, + height + } = rects.floating; + let heightSide; + let widthSide; + if (side === "top" || side === "bottom") { + heightSide = side; + widthSide = alignment === (await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements.floating)) ? "start" : "end") ? "left" : "right"; + } else { + widthSide = side; + heightSide = alignment === "end" ? "top" : "bottom"; + } + const maximumClippingHeight = height - overflow.top - overflow.bottom; + const maximumClippingWidth = width - overflow.left - overflow.right; + const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight); + const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth); + const noShift = !state.middlewareData.shift; + let availableHeight = overflowAvailableHeight; + let availableWidth = overflowAvailableWidth; + if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) { + availableWidth = maximumClippingWidth; + } + if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) { + availableHeight = maximumClippingHeight; + } + if (noShift && !alignment) { + const xMin = max(overflow.left, 0); + const xMax = max(overflow.right, 0); + const yMin = max(overflow.top, 0); + const yMax = max(overflow.bottom, 0); + if (isYAxis) { + availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right)); + } else { + availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom)); + } + } + await apply({ + ...state, + availableWidth, + availableHeight + }); + const nextDimensions = await platform2.getDimensions(elements.floating); + if (width !== nextDimensions.width || height !== nextDimensions.height) { + return { + reset: { + rects: true + } + }; + } + return {}; + } + }; +}; + +// ../node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs +function hasWindow() { + return typeof window !== "undefined"; +} +function getNodeName(node) { + if (isNode(node)) { + return (node.nodeName || "").toLowerCase(); + } + return "#document"; +} +function getWindow2(node) { + var _node$ownerDocument; + return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; +} +function getDocumentElement(node) { + var _ref; + return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement; +} +function isNode(value) { + if (!hasWindow()) { + return false; + } + return value instanceof Node || value instanceof getWindow2(value).Node; +} +function isElement(value) { + if (!hasWindow()) { + return false; + } + return value instanceof Element || value instanceof getWindow2(value).Element; +} +function isHTMLElement2(value) { + if (!hasWindow()) { + return false; + } + return value instanceof HTMLElement || value instanceof getWindow2(value).HTMLElement; +} +function isShadowRoot(value) { + if (!hasWindow() || typeof ShadowRoot === "undefined") { + return false; + } + return value instanceof ShadowRoot || value instanceof getWindow2(value).ShadowRoot; +} +var invalidOverflowDisplayValues = /* @__PURE__ */ new Set(["inline", "contents"]); +function isOverflowElement(element) { + const { + overflow, + overflowX, + overflowY, + display + } = getComputedStyle3(element); + return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display); +} +var tableElements = /* @__PURE__ */ new Set(["table", "td", "th"]); +function isTableElement(element) { + return tableElements.has(getNodeName(element)); +} +var topLayerSelectors = [":popover-open", ":modal"]; +function isTopLayer(element) { + return topLayerSelectors.some((selector) => { + try { + return element.matches(selector); + } catch (_e) { + return false; + } + }); +} +var transformProperties = ["transform", "translate", "scale", "rotate", "perspective"]; +var willChangeValues = ["transform", "translate", "scale", "rotate", "perspective", "filter"]; +var containValues = ["paint", "layout", "strict", "content"]; +function isContainingBlock(elementOrCss) { + const webkit = isWebKit(); + const css = isElement(elementOrCss) ? getComputedStyle3(elementOrCss) : elementOrCss; + return transformProperties.some((value) => css[value] ? css[value] !== "none" : false) || (css.containerType ? css.containerType !== "normal" : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== "none" : false) || !webkit && (css.filter ? css.filter !== "none" : false) || willChangeValues.some((value) => (css.willChange || "").includes(value)) || containValues.some((value) => (css.contain || "").includes(value)); +} +function getContainingBlock(element) { + let currentNode = getParentNode(element); + while (isHTMLElement2(currentNode) && !isLastTraversableNode(currentNode)) { + if (isContainingBlock(currentNode)) { + return currentNode; + } else if (isTopLayer(currentNode)) { + return null; + } + currentNode = getParentNode(currentNode); + } + return null; +} +function isWebKit() { + if (typeof CSS === "undefined" || !CSS.supports) return false; + return CSS.supports("-webkit-backdrop-filter", "none"); +} +var lastTraversableNodeNames = /* @__PURE__ */ new Set(["html", "body", "#document"]); +function isLastTraversableNode(node) { + return lastTraversableNodeNames.has(getNodeName(node)); +} +function getComputedStyle3(element) { + return getWindow2(element).getComputedStyle(element); +} +function getNodeScroll(element) { + if (isElement(element)) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; + } + return { + scrollLeft: element.scrollX, + scrollTop: element.scrollY + }; +} +function getParentNode(node) { + if (getNodeName(node) === "html") { + return node; + } + const result = ( + // Step into the shadow DOM of the parent of a slotted node. + node.assignedSlot || // DOM Element detected. + node.parentNode || // ShadowRoot detected. + isShadowRoot(node) && node.host || // Fallback. + getDocumentElement(node) + ); + return isShadowRoot(result) ? result.host : result; +} +function getNearestOverflowAncestor(node) { + const parentNode = getParentNode(node); + if (isLastTraversableNode(parentNode)) { + return node.ownerDocument ? node.ownerDocument.body : node.body; + } + if (isHTMLElement2(parentNode) && isOverflowElement(parentNode)) { + return parentNode; + } + return getNearestOverflowAncestor(parentNode); +} +function getOverflowAncestors(node, list, traverseIframes) { + var _node$ownerDocument2; + if (list === void 0) { + list = []; + } + if (traverseIframes === void 0) { + traverseIframes = true; + } + const scrollableAncestor = getNearestOverflowAncestor(node); + const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); + const win = getWindow2(scrollableAncestor); + if (isBody) { + const frameElement = getFrameElement(win); + return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); + } + return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); +} +function getFrameElement(win) { + return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; +} + +// ../node_modules/.pnpm/@floating-ui+dom@1.7.5/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs +function getCssDimensions(element) { + const css = getComputedStyle3(element); + let width = parseFloat(css.width) || 0; + let height = parseFloat(css.height) || 0; + const hasOffset = isHTMLElement2(element); + const offsetWidth = hasOffset ? element.offsetWidth : width; + const offsetHeight = hasOffset ? element.offsetHeight : height; + const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight; + if (shouldFallback) { + width = offsetWidth; + height = offsetHeight; + } + return { + width, + height, + $: shouldFallback + }; +} +function unwrapElement(element) { + return !isElement(element) ? element.contextElement : element; +} +function getScale(element) { + const domElement = unwrapElement(element); + if (!isHTMLElement2(domElement)) { + return createCoords(1); + } + const rect = domElement.getBoundingClientRect(); + const { + width, + height, + $ + } = getCssDimensions(domElement); + let x = ($ ? round(rect.width) : rect.width) / width; + let y = ($ ? round(rect.height) : rect.height) / height; + if (!x || !Number.isFinite(x)) { + x = 1; + } + if (!y || !Number.isFinite(y)) { + y = 1; + } + return { + x, + y + }; +} +var noOffsets = /* @__PURE__ */ createCoords(0); +function getVisualOffsets(element) { + const win = getWindow2(element); + if (!isWebKit() || !win.visualViewport) { + return noOffsets; + } + return { + x: win.visualViewport.offsetLeft, + y: win.visualViewport.offsetTop + }; +} +function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) { + if (isFixed === void 0) { + isFixed = false; + } + if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow2(element)) { + return false; + } + return isFixed; +} +function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) { + if (includeScale === void 0) { + includeScale = false; + } + if (isFixedStrategy === void 0) { + isFixedStrategy = false; + } + const clientRect = element.getBoundingClientRect(); + const domElement = unwrapElement(element); + let scale = createCoords(1); + if (includeScale) { + if (offsetParent) { + if (isElement(offsetParent)) { + scale = getScale(offsetParent); + } + } else { + scale = getScale(element); + } + } + const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0); + let x = (clientRect.left + visualOffsets.x) / scale.x; + let y = (clientRect.top + visualOffsets.y) / scale.y; + let width = clientRect.width / scale.x; + let height = clientRect.height / scale.y; + if (domElement) { + const win = getWindow2(domElement); + const offsetWin = offsetParent && isElement(offsetParent) ? getWindow2(offsetParent) : offsetParent; + let currentWin = win; + let currentIFrame = getFrameElement(currentWin); + while (currentIFrame && offsetParent && offsetWin !== currentWin) { + const iframeScale = getScale(currentIFrame); + const iframeRect = currentIFrame.getBoundingClientRect(); + const css = getComputedStyle3(currentIFrame); + const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x; + const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y; + x *= iframeScale.x; + y *= iframeScale.y; + width *= iframeScale.x; + height *= iframeScale.y; + x += left; + y += top; + currentWin = getWindow2(currentIFrame); + currentIFrame = getFrameElement(currentWin); + } + } + return rectToClientRect({ + width, + height, + x, + y + }); +} +function getWindowScrollBarX(element, rect) { + const leftScroll = getNodeScroll(element).scrollLeft; + if (!rect) { + return getBoundingClientRect(getDocumentElement(element)).left + leftScroll; + } + return rect.left + leftScroll; +} +function getHTMLOffset(documentElement, scroll) { + const htmlRect = documentElement.getBoundingClientRect(); + const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect); + const y = htmlRect.top + scroll.scrollTop; + return { + x, + y + }; +} +function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) { + let { + elements, + rect, + offsetParent, + strategy + } = _ref; + const isFixed = strategy === "fixed"; + const documentElement = getDocumentElement(offsetParent); + const topLayer = elements ? isTopLayer(elements.floating) : false; + if (offsetParent === documentElement || topLayer && isFixed) { + return rect; + } + let scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + let scale = createCoords(1); + const offsets = createCoords(0); + const isOffsetParentAnElement = isHTMLElement2(offsetParent); + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + if (isHTMLElement2(offsetParent)) { + const offsetRect = getBoundingClientRect(offsetParent); + scale = getScale(offsetParent); + offsets.x = offsetRect.x + offsetParent.clientLeft; + offsets.y = offsetRect.y + offsetParent.clientTop; + } + } + const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); + return { + width: rect.width * scale.x, + height: rect.height * scale.y, + x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x, + y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y + }; +} +function getClientRects(element) { + return Array.from(element.getClientRects()); +} +function getDocumentRect(element) { + const html = getDocumentElement(element); + const scroll = getNodeScroll(element); + const body = element.ownerDocument.body; + const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth); + const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight); + let x = -scroll.scrollLeft + getWindowScrollBarX(element); + const y = -scroll.scrollTop; + if (getComputedStyle3(body).direction === "rtl") { + x += max(html.clientWidth, body.clientWidth) - width; + } + return { + width, + height, + x, + y + }; +} +var SCROLLBAR_MAX = 25; +function getViewportRect(element, strategy) { + const win = getWindow2(element); + const html = getDocumentElement(element); + const visualViewport = win.visualViewport; + let width = html.clientWidth; + let height = html.clientHeight; + let x = 0; + let y = 0; + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; + const visualViewportBased = isWebKit(); + if (!visualViewportBased || visualViewportBased && strategy === "fixed") { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; + } + } + const windowScrollbarX = getWindowScrollBarX(html); + if (windowScrollbarX <= 0) { + const doc = html.ownerDocument; + const body = doc.body; + const bodyStyles = getComputedStyle(body); + const bodyMarginInline = doc.compatMode === "CSS1Compat" ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0; + const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline); + if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) { + width -= clippingStableScrollbarWidth; + } + } else if (windowScrollbarX <= SCROLLBAR_MAX) { + width += windowScrollbarX; + } + return { + width, + height, + x, + y + }; +} +var absoluteOrFixed = /* @__PURE__ */ new Set(["absolute", "fixed"]); +function getInnerBoundingClientRect(element, strategy) { + const clientRect = getBoundingClientRect(element, true, strategy === "fixed"); + const top = clientRect.top + element.clientTop; + const left = clientRect.left + element.clientLeft; + const scale = isHTMLElement2(element) ? getScale(element) : createCoords(1); + const width = element.clientWidth * scale.x; + const height = element.clientHeight * scale.y; + const x = left * scale.x; + const y = top * scale.y; + return { + width, + height, + x, + y + }; +} +function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) { + let rect; + if (clippingAncestor === "viewport") { + rect = getViewportRect(element, strategy); + } else if (clippingAncestor === "document") { + rect = getDocumentRect(getDocumentElement(element)); + } else if (isElement(clippingAncestor)) { + rect = getInnerBoundingClientRect(clippingAncestor, strategy); + } else { + const visualOffsets = getVisualOffsets(element); + rect = { + x: clippingAncestor.x - visualOffsets.x, + y: clippingAncestor.y - visualOffsets.y, + width: clippingAncestor.width, + height: clippingAncestor.height + }; + } + return rectToClientRect(rect); +} +function hasFixedPositionAncestor(element, stopNode) { + const parentNode = getParentNode(element); + if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) { + return false; + } + return getComputedStyle3(parentNode).position === "fixed" || hasFixedPositionAncestor(parentNode, stopNode); +} +function getClippingElementAncestors(element, cache) { + const cachedResult = cache.get(element); + if (cachedResult) { + return cachedResult; + } + let result = getOverflowAncestors(element, [], false).filter((el) => isElement(el) && getNodeName(el) !== "body"); + let currentContainingBlockComputedStyle = null; + const elementIsFixed = getComputedStyle3(element).position === "fixed"; + let currentNode = elementIsFixed ? getParentNode(element) : element; + while (isElement(currentNode) && !isLastTraversableNode(currentNode)) { + const computedStyle = getComputedStyle3(currentNode); + const currentNodeIsContaining = isContainingBlock(currentNode); + if (!currentNodeIsContaining && computedStyle.position === "fixed") { + currentContainingBlockComputedStyle = null; + } + const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === "static" && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode); + if (shouldDropCurrentNode) { + result = result.filter((ancestor) => ancestor !== currentNode); + } else { + currentContainingBlockComputedStyle = computedStyle; + } + currentNode = getParentNode(currentNode); + } + cache.set(element, result); + return result; +} +function getClippingRect(_ref) { + let { + element, + boundary, + rootBoundary, + strategy + } = _ref; + const elementClippingAncestors = boundary === "clippingAncestors" ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary); + const clippingAncestors = [...elementClippingAncestors, rootBoundary]; + const firstClippingAncestor = clippingAncestors[0]; + const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => { + const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy); + accRect.top = max(rect.top, accRect.top); + accRect.right = min(rect.right, accRect.right); + accRect.bottom = min(rect.bottom, accRect.bottom); + accRect.left = max(rect.left, accRect.left); + return accRect; + }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy)); + return { + width: clippingRect.right - clippingRect.left, + height: clippingRect.bottom - clippingRect.top, + x: clippingRect.left, + y: clippingRect.top + }; +} +function getDimensions(element) { + const { + width, + height + } = getCssDimensions(element); + return { + width, + height + }; +} +function getRectRelativeToOffsetParent(element, offsetParent, strategy) { + const isOffsetParentAnElement = isHTMLElement2(offsetParent); + const documentElement = getDocumentElement(offsetParent); + const isFixed = strategy === "fixed"; + const rect = getBoundingClientRect(element, true, isFixed, offsetParent); + let scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + const offsets = createCoords(0); + function setLeftRTLScrollbarOffset() { + offsets.x = getWindowScrollBarX(documentElement); + } + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + if (isOffsetParentAnElement) { + const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent); + offsets.x = offsetRect.x + offsetParent.clientLeft; + offsets.y = offsetRect.y + offsetParent.clientTop; + } else if (documentElement) { + setLeftRTLScrollbarOffset(); + } + } + if (isFixed && !isOffsetParentAnElement && documentElement) { + setLeftRTLScrollbarOffset(); + } + const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); + const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x; + const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y; + return { + x, + y, + width: rect.width, + height: rect.height + }; +} +function isStaticPositioned(element) { + return getComputedStyle3(element).position === "static"; +} +function getTrueOffsetParent(element, polyfill) { + if (!isHTMLElement2(element) || getComputedStyle3(element).position === "fixed") { + return null; + } + if (polyfill) { + return polyfill(element); + } + let rawOffsetParent = element.offsetParent; + if (getDocumentElement(element) === rawOffsetParent) { + rawOffsetParent = rawOffsetParent.ownerDocument.body; + } + return rawOffsetParent; +} +function getOffsetParent(element, polyfill) { + const win = getWindow2(element); + if (isTopLayer(element)) { + return win; + } + if (!isHTMLElement2(element)) { + let svgOffsetParent = getParentNode(element); + while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) { + if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) { + return svgOffsetParent; + } + svgOffsetParent = getParentNode(svgOffsetParent); + } + return win; + } + let offsetParent = getTrueOffsetParent(element, polyfill); + while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) { + offsetParent = getTrueOffsetParent(offsetParent, polyfill); + } + if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) { + return win; + } + return offsetParent || getContainingBlock(element) || win; +} +var getElementRects = async function(data) { + const getOffsetParentFn = this.getOffsetParent || getOffsetParent; + const getDimensionsFn = this.getDimensions; + const floatingDimensions = await getDimensionsFn(data.floating); + return { + reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy), + floating: { + x: 0, + y: 0, + width: floatingDimensions.width, + height: floatingDimensions.height + } + }; +}; +function isRTL(element) { + return getComputedStyle3(element).direction === "rtl"; +} +var platform = { + convertOffsetParentRelativeRectToViewportRelativeRect, + getDocumentElement, + getClippingRect, + getOffsetParent, + getElementRects, + getClientRects, + getDimensions, + getScale, + isElement, + isRTL +}; +function rectsAreEqual(a, b) { + return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height; +} +function observeMove(element, onMove) { + let io = null; + let timeoutId; + const root = getDocumentElement(element); + function cleanup() { + var _io; + clearTimeout(timeoutId); + (_io = io) == null || _io.disconnect(); + io = null; + } + function refresh(skip, threshold) { + if (skip === void 0) { + skip = false; + } + if (threshold === void 0) { + threshold = 1; + } + cleanup(); + const elementRectForRootMargin = element.getBoundingClientRect(); + const { + left, + top, + width, + height + } = elementRectForRootMargin; + if (!skip) { + onMove(); + } + if (!width || !height) { + return; + } + const insetTop = floor(top); + const insetRight = floor(root.clientWidth - (left + width)); + const insetBottom = floor(root.clientHeight - (top + height)); + const insetLeft = floor(left); + const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px"; + const options = { + rootMargin, + threshold: max(0, min(1, threshold)) || 1 + }; + let isFirstUpdate = true; + function handleObserve(entries) { + const ratio = entries[0].intersectionRatio; + if (ratio !== threshold) { + if (!isFirstUpdate) { + return refresh(); + } + if (!ratio) { + timeoutId = setTimeout(() => { + refresh(false, 1e-7); + }, 1e3); + } else { + refresh(false, ratio); + } + } + if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) { + refresh(); + } + isFirstUpdate = false; + } + try { + io = new IntersectionObserver(handleObserve, { + ...options, + // Handle