From 3cf00d30a5a75dde6c2b37fb4362152a23622472 Mon Sep 17 00:00:00 2001 From: Dave Lucia Date: Sun, 24 May 2026 09:04:57 -0400 Subject: [PATCH 01/20] feat(website): interactive Lua showcase site MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a Phoenix LiveView site under `website/` that demos this VM: * Landing page โ€” hero, feature grid, compiler-explorer teaser, embed example, CTA * `/playground[/:example]` โ€” Lua editor with `print` capture, return values, and a Godbolt-style register-aware bytecode panel that walks every prototype (closures included). Eight preloaded snippets: hello, fib, BEAM creators table, closures, patterns, metatables, compile error, runtime error. * `/tour[/:slug]` โ€” eight bite-sized lessons (values, control flow, tables, functions, closures, metatables, patterns, errors) with per-lesson editable runnables and optional bytecode toggle. Snippets run in `Website.LuaSandbox`: a `Task.async` wrapper around `Lua.eval!/2` with a 1.5s timeout, default sandboxing, and ANSI stripped from error messages. `multi(n)` counts and the rest of the instruction set get per-opcode disassembly so registers display as `rN` and counts/literals stay bare. Depends on the parent Lua library via `{:lua, path: ".."}`. --- website/.formatter.exs | 5 + website/.gitignore | 37 + website/AGENTS.md | 437 +++++++ website/README.md | 18 + website/assets/css/app.css | 105 ++ website/assets/js/app.js | 139 +++ website/assets/tsconfig.json | 32 + website/assets/vendor/daisyui-theme.js | 124 ++ website/assets/vendor/daisyui.js | 1031 +++++++++++++++++ website/assets/vendor/heroicons.js | 43 + website/assets/vendor/topbar.js | 138 +++ website/config/config.exs | 65 ++ website/config/dev.exs | 82 ++ website/config/prod.exs | 32 + website/config/runtime.exs | 102 ++ website/config/test.exs | 28 + website/lib/website.ex | 9 + website/lib/website/application.ex | 33 + website/lib/website/lua_sandbox.ex | 621 ++++++++++ website/lib/website/mailer.ex | 3 + website/lib/website_web.ex | 114 ++ .../website_web/components/core_components.ex | 505 ++++++++ website/lib/website_web/components/layouts.ex | 249 ++++ .../components/layouts/root.html.heex | 34 + .../lib/website_web/controllers/error_html.ex | 24 + .../lib/website_web/controllers/error_json.ex | 21 + .../controllers/page_controller.ex | 7 + .../lib/website_web/controllers/page_html.ex | 50 + .../controllers/page_html/home.html.heex | 341 ++++++ website/lib/website_web/endpoint.ex | 58 + website/lib/website_web/gettext.ex | 25 + .../lib/website_web/live/playground_live.ex | 597 ++++++++++ website/lib/website_web/live/tour_live.ex | 331 ++++++ website/lib/website_web/router.ex | 48 + website/lib/website_web/telemetry.ex | 70 ++ website/mix.exs | 90 ++ website/mix.lock | 42 + website/priv/gettext/en/LC_MESSAGES/errors.po | 11 + website/priv/gettext/errors.pot | 10 + website/priv/static/favicon.ico | Bin 0 -> 152 bytes website/priv/static/images/logo.svg | 6 + website/priv/static/robots.txt | 5 + website/test/support/conn_case.ex | 37 + website/test/test_helper.exs | 1 + .../controllers/error_html_test.exs | 14 + .../controllers/error_json_test.exs | 12 + .../controllers/page_controller_test.exs | 10 + 47 files changed, 5796 insertions(+) create mode 100644 website/.formatter.exs create mode 100644 website/.gitignore create mode 100644 website/AGENTS.md create mode 100644 website/README.md create mode 100644 website/assets/css/app.css create mode 100644 website/assets/js/app.js create mode 100644 website/assets/tsconfig.json create mode 100644 website/assets/vendor/daisyui-theme.js create mode 100644 website/assets/vendor/daisyui.js create mode 100644 website/assets/vendor/heroicons.js create mode 100644 website/assets/vendor/topbar.js create mode 100644 website/config/config.exs create mode 100644 website/config/dev.exs create mode 100644 website/config/prod.exs create mode 100644 website/config/runtime.exs create mode 100644 website/config/test.exs create mode 100644 website/lib/website.ex create mode 100644 website/lib/website/application.ex create mode 100644 website/lib/website/lua_sandbox.ex create mode 100644 website/lib/website/mailer.ex create mode 100644 website/lib/website_web.ex create mode 100644 website/lib/website_web/components/core_components.ex create mode 100644 website/lib/website_web/components/layouts.ex create mode 100644 website/lib/website_web/components/layouts/root.html.heex create mode 100644 website/lib/website_web/controllers/error_html.ex create mode 100644 website/lib/website_web/controllers/error_json.ex create mode 100644 website/lib/website_web/controllers/page_controller.ex create mode 100644 website/lib/website_web/controllers/page_html.ex create mode 100644 website/lib/website_web/controllers/page_html/home.html.heex create mode 100644 website/lib/website_web/endpoint.ex create mode 100644 website/lib/website_web/gettext.ex create mode 100644 website/lib/website_web/live/playground_live.ex create mode 100644 website/lib/website_web/live/tour_live.ex create mode 100644 website/lib/website_web/router.ex create mode 100644 website/lib/website_web/telemetry.ex create mode 100644 website/mix.exs create mode 100644 website/mix.lock create mode 100644 website/priv/gettext/en/LC_MESSAGES/errors.po create mode 100644 website/priv/gettext/errors.pot create mode 100644 website/priv/static/favicon.ico create mode 100644 website/priv/static/images/logo.svg create mode 100644 website/priv/static/robots.txt create mode 100644 website/test/support/conn_case.ex create mode 100644 website/test/test_helper.exs create mode 100644 website/test/website_web/controllers/error_html_test.exs create mode 100644 website/test/website_web/controllers/error_json_test.exs create mode 100644 website/test/website_web/controllers/page_controller_test.exs diff --git a/website/.formatter.exs b/website/.formatter.exs new file mode 100644 index 0000000..e945e12 --- /dev/null +++ b/website/.formatter.exs @@ -0,0 +1,5 @@ +[ + import_deps: [:phoenix], + plugins: [Phoenix.LiveView.HTMLFormatter], + inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}"] +] diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 0000000..076e671 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,37 @@ +# The directory Mix will write compiled artifacts to. +/_build/ + +# If you run "mix test --cover", coverage assets end up here. +/cover/ + +# The directory Mix downloads your dependencies sources to. +/deps/ + +# Where 3rd-party dependencies like ExDoc output generated docs. +/doc/ + +# Ignore .fetch files in case you like to edit your project deps locally. +/.fetch + +# If the VM crashes, it generates a dump, let's ignore it too. +erl_crash.dump + +# Also ignore archive artifacts (built via "mix archive.build"). +*.ez + +# Temporary files, for example, from tests. +/tmp/ + +# Ignore package tarball (built via "mix hex.build"). +website-*.tar + +# Ignore assets that are produced by build tools. +/priv/static/assets/ + +# Ignore digested assets cache. +/priv/static/cache_manifest.json + +# In case you use Node.js/npm, you want to ignore these. +npm-debug.log +/assets/node_modules/ + diff --git a/website/AGENTS.md b/website/AGENTS.md new file mode 100644 index 0000000..e3daa75 --- /dev/null +++ b/website/AGENTS.md @@ -0,0 +1,437 @@ +This is a web application written using the Phoenix web framework. + +## Project guidelines + +- Use `mix precommit` alias when you are done with all changes and fix any pending issues +- Use the already included and available `:req` (`Req`) library for HTTP requests, **avoid** `:httpoison`, `:tesla`, and `:httpc`. Req is included by default and is the preferred HTTP client for Phoenix apps + +### Phoenix v1.8 guidelines + +- **Always** begin your LiveView templates with `` which wraps all inner content +- The `MyAppWeb.Layouts` module is aliased in the `my_app_web.ex` file, so you can use it without needing to alias it again +- Anytime you run into errors with no `current_scope` assign: + - You failed to follow the Authenticated Routes guidelines, or you failed to pass `current_scope` to `` + - **Always** fix the `current_scope` error by moving your routes to the proper `live_session` and ensure you pass `current_scope` as needed +- Phoenix v1.8 moved the `<.flash_group>` component to the `Layouts` module. You are **forbidden** from calling `<.flash_group>` outside of the `layouts.ex` module +- Out of the box, `core_components.ex` imports an `<.icon name="hero-x-mark" class="w-5 h-5"/>` component for hero icons. **Always** use the `<.icon>` component for icons, **never** use `Heroicons` modules or similar +- **Always** use the imported `<.input>` component for form inputs from `core_components.ex` when available. `<.input>` is imported and using it will save steps and prevent errors +- If you override the default input classes (`<.input class="myclass px-2 py-1 rounded-lg">)`) class with your own values, no default classes are inherited, so your +custom classes must fully style the input + +### JS and CSS guidelines + +- **Use Tailwind CSS classes and custom CSS rules** to create polished, responsive, and visually stunning interfaces. +- Tailwindcss v4 **no longer needs a tailwind.config.js** and uses a new import syntax in `app.css`: + + @import "tailwindcss" source(none); + @source "../css"; + @source "../js"; + @source "../../lib/my_app_web"; + +- **Always use and maintain this import syntax** in the app.css file for projects generated with `phx.new` +- **Never** use `@apply` when writing raw css +- **Always** manually write your own tailwind-based components instead of using daisyUI for a unique, world-class design +- Out of the box **only the app.js and app.css bundles are supported** + - You cannot reference an external vendor'd script `src` or link `href` in the layouts + - You must import the vendor deps into app.js and app.css to use them + - **Never write inline tags within templates** + +### UI/UX & design guidelines + +- **Produce world-class UI designs** with a focus on usability, aesthetics, and modern design principles +- Implement **subtle micro-interactions** (e.g., button hover effects, and smooth transitions) +- Ensure **clean typography, spacing, and layout balance** for a refined, premium look +- Focus on **delightful details** like hover effects, loading states, and smooth page transitions + + + + + +## Elixir guidelines + +- Elixir lists **do not support index based access via the access syntax** + + **Never do this (invalid)**: + + i = 0 + mylist = ["blue", "green"] + mylist[i] + + Instead, **always** use `Enum.at`, pattern matching, or `List` for index based list access, ie: + + i = 0 + mylist = ["blue", "green"] + Enum.at(mylist, i) + +- Elixir variables are immutable, but can be rebound, so for block expressions like `if`, `case`, `cond`, etc + you *must* bind the result of the expression to a variable if you want to use it and you CANNOT rebind the result inside the expression, ie: + + # INVALID: we are rebinding inside the `if` and the result never gets assigned + if connected?(socket) do + socket = assign(socket, :val, val) + end + + # VALID: we rebind the result of the `if` to a new variable + socket = + if connected?(socket) do + assign(socket, :val, val) + end + +- **Never** nest multiple modules in the same file as it can cause cyclic dependencies and compilation errors +- **Never** use map access syntax (`changeset[:field]`) on structs as they do not implement the Access behaviour by default. For regular structs, you **must** access the fields directly, such as `my_struct.field` or use higher level APIs that are available on the struct if they exist, `Ecto.Changeset.get_field/2` for changesets +- Elixir's standard library has everything necessary for date and time manipulation. Familiarize yourself with the common `Time`, `Date`, `DateTime`, and `Calendar` interfaces by accessing their documentation as necessary. **Never** install additional dependencies unless asked or for date/time parsing (which you can use the `date_time_parser` package) +- Don't use `String.to_atom/1` on user input (memory leak risk) +- Predicate function names should not start with `is_` and should end in a question mark. Names like `is_thing` should be reserved for guards +- Elixir's builtin OTP primitives like `DynamicSupervisor` and `Registry`, require names in the child spec, such as `{DynamicSupervisor, name: MyApp.MyDynamicSup}`, then you can use `DynamicSupervisor.start_child(MyApp.MyDynamicSup, child_spec)` +- Use `Task.async_stream(collection, callback, options)` for concurrent enumeration with back-pressure. The majority of times you will want to pass `timeout: :infinity` as option + +## Mix guidelines + +- Read the docs and options before using tasks (by using `mix help task_name`) +- To debug test failures, run tests in a specific file with `mix test test/my_test.exs` or run all previously failed tests with `mix test --failed` +- `mix deps.clean --all` is **almost never needed**. **Avoid** using it unless you have good reason + +## Test guidelines + +- **Always use `start_supervised!/1`** to start processes in tests as it guarantees cleanup between tests +- **Avoid** `Process.sleep/1` and `Process.alive?/1` in tests + - Instead of sleeping to wait for a process to finish, **always** use `Process.monitor/1` and assert on the DOWN message: + + ref = Process.monitor(pid) + assert_receive {:DOWN, ^ref, :process, ^pid, :normal} + + - Instead of sleeping to synchronize before the next call, **always** use `_ = :sys.get_state/1` to ensure the process has handled prior messages + + + +## Phoenix guidelines + +- Remember Phoenix router `scope` blocks include an optional alias which is prefixed for all routes within the scope. **Always** be mindful of this when creating routes within a scope to avoid duplicate module prefixes. + +- You **never** need to create your own `alias` for route definitions! The `scope` provides the alias, ie: + + scope "/admin", AppWeb.Admin do + pipe_through :browser + + live "/users", UserLive, :index + end + + the UserLive route would point to the `AppWeb.Admin.UserLive` module + +- `Phoenix.View` no longer is needed or included with Phoenix, don't use it + + + +## Phoenix HTML guidelines + +- Phoenix templates **always** use `~H` or .html.heex files (known as HEEx), **never** use `~E` +- **Always** use the imported `Phoenix.Component.form/1` and `Phoenix.Component.inputs_for/1` function to build forms. **Never** use `Phoenix.HTML.form_for` or `Phoenix.HTML.inputs_for` as they are outdated +- When building forms **always** use the already imported `Phoenix.Component.to_form/2` (`assign(socket, form: to_form(...))` and `<.form for={@form} id="msg-form">`), then access those forms in the template via `@form[:field]` +- **Always** add unique DOM IDs to key elements (like forms, buttons, etc) when writing templates, these IDs can later be used in tests (`<.form for={@form} id="product-form">`) +- For "app wide" template imports, you can import/alias into the `my_app_web.ex`'s `html_helpers` block, so they will be available to all LiveViews, LiveComponent's, and all modules that do `use MyAppWeb, :html` (replace "my_app" by the actual app name) + +- Elixir supports `if/else` but **does NOT support `if/else if` or `if/elsif`**. **Never use `else if` or `elseif` in Elixir**, **always** use `cond` or `case` for multiple conditionals. + + **Never do this (invalid)**: + + <%= if condition do %> + ... + <% else if other_condition %> + ... + <% end %> + + Instead **always** do this: + + <%= cond do %> + <% condition -> %> + ... + <% condition2 -> %> + ... + <% true -> %> + ... + <% end %> + +- HEEx require special tag annotation if you want to insert literal curly's like `{` or `}`. If you want to show a textual code snippet on the page in a `
` or `` block you *must* annotate the parent tag with `phx-no-curly-interpolation`:
+
+      
+        let obj = {key: "val"}
+      
+
+  Within `phx-no-curly-interpolation` annotated tags, you can use `{` and `}` without escaping them, and dynamic Elixir expressions can still be used with `<%= ... %>` syntax
+
+- HEEx class attrs support lists, but you must **always** use list `[...]` syntax. You can use the class list syntax to conditionally add classes, **always do this for multiple class values**:
+
+      Text
+
+  and **always** wrap `if`'s inside `{...}` expressions with parens, like done above (`if(@other_condition, do: "...", else: "...")`)
+
+  and **never** do this, since it's invalid (note the missing `[` and `]`):
+
+       ...
+      => Raises compile syntax error on invalid HEEx attr syntax
+
+- **Never** use `<% Enum.each %>` or non-for comprehensions for generating template content, instead **always** use `<%= for item <- @collection do %>`
+- HEEx HTML comments use `<%!-- comment --%>`. **Always** use the HEEx HTML comment syntax for template comments (`<%!-- comment --%>`)
+- HEEx allows interpolation via `{...}` and `<%= ... %>`, but the `<%= %>` **only** works within tag bodies. **Always** use the `{...}` syntax for interpolation within tag attributes, and for interpolation of values within tag bodies. **Always** interpolate block constructs (if, cond, case, for) within tag bodies using `<%= ... %>`.
+
+  **Always** do this:
+
+      
+ {@my_assign} + <%= if @some_block_condition do %> + {@another_assign} + <% end %> +
+ + and **Never** do this โ€“ the program will terminate with a syntax error: + + <%!-- THIS IS INVALID NEVER EVER DO THIS --%> +
+ {if @invalid_block_construct do} + {end} +
+ + + +## Phoenix LiveView guidelines + +- **Never** use the deprecated `live_redirect` and `live_patch` functions, instead **always** use the `<.link navigate={href}>` and `<.link patch={href}>` in templates, and `push_navigate` and `push_patch` functions LiveViews +- **Avoid LiveComponent's** unless you have a strong, specific need for them +- LiveViews should be named like `AppWeb.WeatherLive`, with a `Live` suffix. When you go to add LiveView routes to the router, the default `:browser` scope is **already aliased** with the `AppWeb` module, so you can just do `live "/weather", WeatherLive` + +### LiveView streams + +- **Always** use LiveView streams for collections for assigning regular lists to avoid memory ballooning and runtime termination with the following operations: + - basic append of N items - `stream(socket, :messages, [new_msg])` + - resetting stream with new items - `stream(socket, :messages, [new_msg], reset: true)` (e.g. for filtering items) + - prepend to stream - `stream(socket, :messages, [new_msg], at: -1)` + - deleting items - `stream_delete(socket, :messages, msg)` + +- When using the `stream/3` interfaces in the LiveView, the LiveView template must 1) always set `phx-update="stream"` on the parent element, with a DOM id on the parent element like `id="messages"` and 2) consume the `@streams.stream_name` collection and use the id as the DOM id for each child. For a call like `stream(socket, :messages, [new_msg])` in the LiveView, the template would be: + +
+
+ {msg.text} +
+
+ +- LiveView streams are *not* enumerable, so you cannot use `Enum.filter/2` or `Enum.reject/2` on them. Instead, if you want to filter, prune, or refresh a list of items on the UI, you **must refetch the data and re-stream the entire stream collection, passing reset: true**: + + def handle_event("filter", %{"filter" => filter}, socket) do + # re-fetch the messages based on the filter + messages = list_messages(filter) + + {:noreply, + socket + |> assign(:messages_empty?, messages == []) + # reset the stream with the new messages + |> stream(:messages, messages, reset: true)} + end + +- LiveView streams *do not support counting or empty states*. If you need to display a count, you must track it using a separate assign. For empty states, you can use Tailwind classes: + +
+ +
+ {task.name} +
+
+ + The above only works if the empty state is the only HTML block alongside the stream for-comprehension. + +- When updating an assign that should change content inside any streamed item(s), you MUST re-stream the items + along with the updated assign: + + def handle_event("edit_message", %{"message_id" => message_id}, socket) do + message = Chat.get_message!(message_id) + edit_form = to_form(Chat.change_message(message, %{content: message.content})) + + # re-insert message so @editing_message_id toggle logic takes effect for that stream item + {:noreply, + socket + |> stream_insert(:messages, message) + |> assign(:editing_message_id, String.to_integer(message_id)) + |> assign(:edit_form, edit_form)} + end + + And in the template: + +
+
+ {message.username} + <%= if @editing_message_id == message.id do %> + <%!-- Edit mode --%> + <.form for={@edit_form} id="edit-form-#{message.id}" phx-submit="save_edit"> + ... + + <% end %> +
+
+ +- **Never** use the deprecated `phx-update="append"` or `phx-update="prepend"` for collections + +### LiveView JavaScript interop + +- Remember anytime you use `phx-hook="MyHook"` and that JS hook manages its own DOM, you **must** also set the `phx-update="ignore"` attribute +- **Always** provide an unique DOM id alongside `phx-hook` otherwise a compiler error will be raised + +LiveView hooks come in two flavors, 1) colocated js hooks for "inline" scripts defined inside HEEx, +and 2) external `phx-hook` annotations where JavaScript object literals are defined and passed to the `LiveSocket` constructor. + +#### Inline colocated js hooks + +**Never** write raw embedded ` + +- colocated hooks are automatically integrated into the app.js bundle +- colocated hooks names **MUST ALWAYS** start with a `.` prefix, i.e. `.PhoneNumber` + +#### External phx-hook + +External JS hooks (`
`) must be placed in `assets/js/` and passed to the +LiveSocket constructor: + + const MyHook = { + mounted() { ... } + } + let liveSocket = new LiveSocket("/live", Socket, { + hooks: { MyHook } + }); + +#### Pushing events between client and server + +Use LiveView's `push_event/3` when you need to push events/data to the client for a phx-hook to handle. +**Always** return or rebind the socket on `push_event/3` when pushing events: + + # re-bind socket so we maintain event state to be pushed + socket = push_event(socket, "my_event", %{...}) + + # or return the modified socket directly: + def handle_event("some_event", _, socket) do + {:noreply, push_event(socket, "my_event", %{...})} + end + +Pushed events can then be picked up in a JS hook with `this.handleEvent`: + + mounted() { + this.handleEvent("my_event", data => console.log("from server:", data)); + } + +Clients can also push an event to the server and receive a reply with `this.pushEvent`: + + mounted() { + this.el.addEventListener("click", e => { + this.pushEvent("my_event", { one: 1 }, reply => console.log("got reply from server:", reply)); + }) + } + +Where the server handled it via: + + def handle_event("my_event", %{"one" => 1}, socket) do + {:reply, %{two: 2}, socket} + end + +### LiveView tests + +- `Phoenix.LiveViewTest` module and `LazyHTML` (included) for making your assertions +- Form tests are driven by `Phoenix.LiveViewTest`'s `render_submit/2` and `render_change/2` functions +- Come up with a step-by-step test plan that splits major test cases into small, isolated files. You may start with simpler tests that verify content exists, gradually add interaction tests +- **Always reference the key element IDs you added in the LiveView templates in your tests** for `Phoenix.LiveViewTest` functions like `element/2`, `has_element/2`, selectors, etc +- **Never** tests again raw HTML, **always** use `element/2`, `has_element/2`, and similar: `assert has_element?(view, "#my-form")` +- Instead of relying on testing text content, which can change, favor testing for the presence of key elements +- Focus on testing outcomes rather than implementation details +- Be aware that `Phoenix.Component` functions like `<.form>` might produce different HTML than expected. Test against the output HTML structure, not your mental model of what you expect it to be +- When facing test failures with element selectors, add debug statements to print the actual HTML, but use `LazyHTML` selectors to limit the output, ie: + + html = render(view) + document = LazyHTML.from_fragment(html) + matches = LazyHTML.filter(document, "your-complex-selector") + IO.inspect(matches, label: "Matches") + +### Form handling + +#### Creating a form from params + +If you want to create a form based on `handle_event` params: + + def handle_event("submitted", params, socket) do + {:noreply, assign(socket, form: to_form(params))} + end + +When you pass a map to `to_form/1`, it assumes said map contains the form params, which are expected to have string keys. + +You can also specify a name to nest the params: + + def handle_event("submitted", %{"user" => user_params}, socket) do + {:noreply, assign(socket, form: to_form(user_params, as: :user))} + end + +#### Creating a form from changesets + +When using changesets, the underlying data, form params, and errors are retrieved from it. The `:as` option is automatically computed too. E.g. if you have a user schema: + + defmodule MyApp.Users.User do + use Ecto.Schema + ... + end + +And then you create a changeset that you pass to `to_form`: + + %MyApp.Users.User{} + |> Ecto.Changeset.change() + |> to_form() + +Once the form is submitted, the params will be available under `%{"user" => user_params}`. + +In the template, the form form assign can be passed to the `<.form>` function component: + + <.form for={@form} id="todo-form" phx-change="validate" phx-submit="save"> + <.input field={@form[:field]} type="text" /> + + +Always give the form an explicit, unique DOM ID, like `id="todo-form"`. + +#### Avoiding form errors + +**Always** use a form assigned via `to_form/2` in the LiveView, and the `<.input>` component in the template. In the template **always access forms this**: + + <%!-- ALWAYS do this (valid) --%> + <.form for={@form} id="my-form"> + <.input field={@form[:field]} type="text" /> + + +And **never** do this: + + <%!-- NEVER do this (invalid) --%> + <.form for={@changeset} id="my-form"> + <.input field={@changeset[:field]} type="text" /> + + +- You are FORBIDDEN from accessing the changeset in the template as it will cause errors +- **Never** use `<.form let={f} ...>` in the template, instead **always use `<.form for={@form} ...>`**, then drive all form references from the form assign as in `@form[:field]`. The UI should **always** be driven by a `to_form/2` assigned in the LiveView module that is derived from a changeset + + + \ No newline at end of file diff --git a/website/README.md b/website/README.md new file mode 100644 index 0000000..56bc843 --- /dev/null +++ b/website/README.md @@ -0,0 +1,18 @@ +# Demo + +To start your Phoenix server: + +* Run `mix setup` to install and setup dependencies +* Start Phoenix endpoint with `mix phx.server` or inside IEx with `iex -S mix phx.server` + +Now you can visit [`localhost:4000`](http://localhost:4000) from your browser. + +Ready to run in production? Please [check our deployment guides](https://hexdocs.pm/phoenix/deployment.html). + +## Learn more + +* Official website: https://www.phoenixframework.org/ +* Guides: https://hexdocs.pm/phoenix/overview.html +* Docs: https://hexdocs.pm/phoenix +* Forum: https://elixirforum.com/c/phoenix-forum +* Source: https://github.com/phoenixframework/phoenix diff --git a/website/assets/css/app.css b/website/assets/css/app.css new file mode 100644 index 0000000..cc9a7f1 --- /dev/null +++ b/website/assets/css/app.css @@ -0,0 +1,105 @@ +/* See the Tailwind configuration guide for advanced usage + https://tailwindcss.com/docs/configuration */ + +@import "tailwindcss" source(none); +@source "../css"; +@source "../js"; +@source "../../lib/website_web"; + +/* A Tailwind plugin that makes "hero-#{ICON}" classes available. + The heroicons installation itself is managed by your mix.exs */ +@plugin "../vendor/heroicons"; + +/* daisyUI Tailwind Plugin. You can update this file by fetching the latest version with: + curl -sLO https://github.com/saadeghi/daisyui/releases/latest/download/daisyui.js + Make sure to look at the daisyUI changelog: https://daisyui.com/docs/changelog/ */ +@plugin "../vendor/daisyui" { + themes: false; +} + +/* daisyUI theme plugin. You can update this file by fetching the latest version with: + curl -sLO https://github.com/saadeghi/daisyui/releases/latest/download/daisyui-theme.js + We ship with two themes, a light one inspired on Phoenix colors and a dark one inspired + on Elixir colors. Build your own at: https://daisyui.com/theme-generator/ */ +@plugin "../vendor/daisyui-theme" { + name: "dark"; + default: false; + prefersdark: true; + color-scheme: "dark"; + --color-base-100: oklch(30.33% 0.016 252.42); + --color-base-200: oklch(25.26% 0.014 253.1); + --color-base-300: oklch(20.15% 0.012 254.09); + --color-base-content: oklch(97.807% 0.029 256.847); + --color-primary: oklch(58% 0.233 277.117); + --color-primary-content: oklch(96% 0.018 272.314); + --color-secondary: oklch(58% 0.233 277.117); + --color-secondary-content: oklch(96% 0.018 272.314); + --color-accent: oklch(60% 0.25 292.717); + --color-accent-content: oklch(96% 0.016 293.756); + --color-neutral: oklch(37% 0.044 257.287); + --color-neutral-content: oklch(98% 0.003 247.858); + --color-info: oklch(58% 0.158 241.966); + --color-info-content: oklch(97% 0.013 236.62); + --color-success: oklch(60% 0.118 184.704); + --color-success-content: oklch(98% 0.014 180.72); + --color-warning: oklch(66% 0.179 58.318); + --color-warning-content: oklch(98% 0.022 95.277); + --color-error: oklch(58% 0.253 17.585); + --color-error-content: oklch(96% 0.015 12.422); + --radius-selector: 0.25rem; + --radius-field: 0.25rem; + --radius-box: 0.5rem; + --size-selector: 0.21875rem; + --size-field: 0.21875rem; + --border: 1.5px; + --depth: 1; + --noise: 0; +} + +@plugin "../vendor/daisyui-theme" { + name: "light"; + default: true; + prefersdark: false; + color-scheme: "light"; + --color-base-100: oklch(98% 0 0); + --color-base-200: oklch(96% 0.001 286.375); + --color-base-300: oklch(92% 0.004 286.32); + --color-base-content: oklch(21% 0.006 285.885); + --color-primary: oklch(70% 0.213 47.604); + --color-primary-content: oklch(98% 0.016 73.684); + --color-secondary: oklch(55% 0.027 264.364); + --color-secondary-content: oklch(98% 0.002 247.839); + --color-accent: oklch(0% 0 0); + --color-accent-content: oklch(100% 0 0); + --color-neutral: oklch(44% 0.017 285.786); + --color-neutral-content: oklch(98% 0 0); + --color-info: oklch(62% 0.214 259.815); + --color-info-content: oklch(97% 0.014 254.604); + --color-success: oklch(70% 0.14 182.503); + --color-success-content: oklch(98% 0.014 180.72); + --color-warning: oklch(66% 0.179 58.318); + --color-warning-content: oklch(98% 0.022 95.277); + --color-error: oklch(58% 0.253 17.585); + --color-error-content: oklch(96% 0.015 12.422); + --radius-selector: 0.25rem; + --radius-field: 0.25rem; + --radius-box: 0.5rem; + --size-selector: 0.21875rem; + --size-field: 0.21875rem; + --border: 1.5px; + --depth: 1; + --noise: 0; +} + +/* Add variants based on LiveView classes */ +@custom-variant phx-click-loading (.phx-click-loading&, .phx-click-loading &); +@custom-variant phx-submit-loading (.phx-submit-loading&, .phx-submit-loading &); +@custom-variant phx-change-loading (.phx-change-loading&, .phx-change-loading &); + +/* Use the data attribute for dark mode */ +@custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *)); + +/* Make LiveView wrapper divs transparent for layout */ +[data-phx-session], [data-phx-teleported-src] { display: contents } + +/* This file is for your main application CSS */ diff --git a/website/assets/js/app.js b/website/assets/js/app.js new file mode 100644 index 0000000..df7e8ce --- /dev/null +++ b/website/assets/js/app.js @@ -0,0 +1,139 @@ +// If you want to use Phoenix channels, run `mix help phx.gen.channel` +// to get started and then uncomment the line below. +// import "./user_socket.js" + +// You can include dependencies in two ways. +// +// The simplest option is to put them in assets/vendor and +// import them using relative paths: +// +// import "../vendor/some-package.js" +// +// Alternatively, you can `npm install some-package --prefix assets` and import +// them using a path starting with the package name: +// +// import "some-package" +// +// If you have dependencies that try to import CSS, esbuild will generate a separate `app.css` file. +// To load it, simply add a second `` to your `root.html.heex` file. + +// Include phoenix_html to handle method=PUT/DELETE in forms and buttons. +import "phoenix_html" +// Establish Phoenix Socket and LiveView configuration. +import {Socket} from "phoenix" +import {LiveSocket} from "phoenix_live_view" +import {hooks as colocatedHooks} from "phoenix-colocated/website" +import topbar from "../vendor/topbar" + +const LuaEditor = { + mounted() { + const ta = this.el.querySelector("textarea") + if (!ta) return + + ta.addEventListener("keydown", (e) => { + // Cmd/Ctrl + Enter -> submit form + if ((e.metaKey || e.ctrlKey) && e.key === "Enter") { + e.preventDefault() + const form = ta.closest("form") + if (form) form.requestSubmit() + return + } + + // Tab / Shift+Tab indentation + if (e.key === "Tab") { + e.preventDefault() + const start = ta.selectionStart + const end = ta.selectionEnd + const before = ta.value.slice(0, start) + const sel = ta.value.slice(start, end) + const after = ta.value.slice(end) + + if (e.shiftKey) { + // De-indent each line in selection by removing up to 2 leading spaces + const lineStart = before.lastIndexOf("\n") + 1 + const block = ta.value.slice(lineStart, end) + const dedented = block.replace(/^( ?)/gm, "") + const newVal = ta.value.slice(0, lineStart) + dedented + after + ta.value = newVal + const delta = block.length - dedented.length + ta.selectionStart = Math.max(lineStart, start - 2) + ta.selectionEnd = Math.max(lineStart, end - delta) + } else if (sel.includes("\n")) { + // Indent each line of multi-line selection + const lineStart = before.lastIndexOf("\n") + 1 + const block = ta.value.slice(lineStart, end) + const indented = block.replace(/^/gm, " ") + ta.value = ta.value.slice(0, lineStart) + indented + after + const delta = indented.length - block.length + ta.selectionStart = start + 2 + ta.selectionEnd = end + delta + } else { + // Single position: insert two spaces + ta.value = before + " " + after + ta.selectionStart = ta.selectionEnd = start + 2 + } + ta.dispatchEvent(new Event("input", {bubbles: true})) + return + } + }) + } +} + +const hooks = {...colocatedHooks, LuaEditor} + +const csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") +const liveSocket = new LiveSocket("/live", Socket, { + longPollFallbackMs: 2500, + params: {_csrf_token: csrfToken}, + hooks: hooks, +}) + +// Show progress bar on live navigation and form submits +topbar.config({barColors: {0: "#29d"}, shadowColor: "rgba(0, 0, 0, .3)"}) +window.addEventListener("phx:page-loading-start", _info => topbar.show(300)) +window.addEventListener("phx:page-loading-stop", _info => topbar.hide()) + +// connect if there are any LiveViews on the page +liveSocket.connect() + +// expose liveSocket on window for web console debug logs and latency simulation: +// >> liveSocket.enableDebug() +// >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session +// >> liveSocket.disableLatencySim() +window.liveSocket = liveSocket + +// The lines below enable quality of life phoenix_live_reload +// development features: +// +// 1. stream server logs to the browser console +// 2. click on elements to jump to their definitions in your code editor +// +if (process.env.NODE_ENV === "development") { + window.addEventListener("phx:live_reload:attached", ({detail: reloader}) => { + // Enable server log streaming to client. + // Disable with reloader.disableServerLogs() + reloader.enableServerLogs() + + // Open configured PLUG_EDITOR at file:line of the clicked element's HEEx component + // + // * click with "c" key pressed to open at caller location + // * click with "d" key pressed to open at function component definition location + let keyDown + window.addEventListener("keydown", e => keyDown = e.key) + window.addEventListener("keyup", _e => keyDown = null) + window.addEventListener("click", e => { + if(keyDown === "c"){ + e.preventDefault() + e.stopImmediatePropagation() + reloader.openEditorAtCaller(e.target) + } else if(keyDown === "d"){ + e.preventDefault() + e.stopImmediatePropagation() + reloader.openEditorAtDef(e.target) + } + }, true) + + window.liveReloader = reloader + }) +} + diff --git a/website/assets/tsconfig.json b/website/assets/tsconfig.json new file mode 100644 index 0000000..a9401b6 --- /dev/null +++ b/website/assets/tsconfig.json @@ -0,0 +1,32 @@ +// This file is needed on most editors to enable the intelligent autocompletion +// of LiveView's JavaScript API methods. You can safely delete it if you don't need it. +// +// Note: This file assumes a basic esbuild setup without node_modules. +// We include a generic paths alias to deps to mimic how esbuild resolves +// the Phoenix and LiveView JavaScript assets. +// If you have a package.json in your project, you should remove the +// paths configuration and instead add the phoenix dependencies to the +// dependencies section of your package.json: +// +// { +// ... +// "dependencies": { +// ..., +// "phoenix": "../deps/phoenix", +// "phoenix_html": "../deps/phoenix_html", +// "phoenix_live_view": "../deps/phoenix_live_view" +// } +// } +// +// Feel free to adjust this configuration however you need. +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "*": ["../deps/*"] + }, + "allowJs": true, + "noEmit": true + }, + "include": ["js/**/*"] +} diff --git a/website/assets/vendor/daisyui-theme.js b/website/assets/vendor/daisyui-theme.js new file mode 100644 index 0000000..169c806 --- /dev/null +++ b/website/assets/vendor/daisyui-theme.js @@ -0,0 +1,124 @@ +/** ๐ŸŒผ + * @license MIT + * daisyUI bundle + * https://daisyui.com/ + */ + +var __defProp = Object.defineProperty; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __moduleCache = /* @__PURE__ */ new WeakMap; +var __toCommonJS = (from) => { + var entry = __moduleCache.get(from), desc; + if (entry) + return entry; + entry = __defProp({}, "__esModule", { value: true }); + if (from && typeof from === "object" || typeof from === "function") + __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, { + get: () => from[key], + enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable + })); + __moduleCache.set(from, entry); + return entry; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { + get: all[name], + enumerable: true, + configurable: true, + set: (newValue) => all[name] = () => newValue + }); +}; + +// packages/daisyui/theme/index.js +var exports_theme = {}; +__export(exports_theme, { + default: () => theme_default +}); +module.exports = __toCommonJS(exports_theme); + +// packages/daisyui/functions/plugin.js +var plugin = { + withOptions: (pluginFunction, configFunction = () => ({})) => { + const optionsFunction = (options) => { + const handler = pluginFunction(options); + const config = configFunction(options); + return { handler, config }; + }; + optionsFunction.__isOptionsFunction = true; + return optionsFunction; + } +}; + +// packages/daisyui/theme/object.js +var object_default = { cyberpunk: { "color-scheme": "light", "--color-base-100": "oklch(94.51% 0.179 104.32)", "--color-base-200": "oklch(91.51% 0.179 104.32)", "--color-base-300": "oklch(85.51% 0.179 104.32)", "--color-base-content": "oklch(0% 0 0)", "--color-primary": "oklch(74.22% 0.209 6.35)", "--color-primary-content": "oklch(14.844% 0.041 6.35)", "--color-secondary": "oklch(83.33% 0.184 204.72)", "--color-secondary-content": "oklch(16.666% 0.036 204.72)", "--color-accent": "oklch(71.86% 0.217 310.43)", "--color-accent-content": "oklch(14.372% 0.043 310.43)", "--color-neutral": "oklch(23.04% 0.065 269.31)", "--color-neutral-content": "oklch(94.51% 0.179 104.32)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "0rem", "--radius-field": "0rem", "--radius-box": "0rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, acid: { "color-scheme": "light", "--color-base-100": "oklch(98% 0 0)", "--color-base-200": "oklch(95% 0 0)", "--color-base-300": "oklch(91% 0 0)", "--color-base-content": "oklch(0% 0 0)", "--color-primary": "oklch(71.9% 0.357 330.759)", "--color-primary-content": "oklch(14.38% 0.071 330.759)", "--color-secondary": "oklch(73.37% 0.224 48.25)", "--color-secondary-content": "oklch(14.674% 0.044 48.25)", "--color-accent": "oklch(92.78% 0.264 122.962)", "--color-accent-content": "oklch(18.556% 0.052 122.962)", "--color-neutral": "oklch(21.31% 0.128 278.68)", "--color-neutral-content": "oklch(84.262% 0.025 278.68)", "--color-info": "oklch(60.72% 0.227 252.05)", "--color-info-content": "oklch(12.144% 0.045 252.05)", "--color-success": "oklch(85.72% 0.266 158.53)", "--color-success-content": "oklch(17.144% 0.053 158.53)", "--color-warning": "oklch(91.01% 0.212 100.5)", "--color-warning-content": "oklch(18.202% 0.042 100.5)", "--color-error": "oklch(64.84% 0.293 29.349)", "--color-error-content": "oklch(12.968% 0.058 29.349)", "--radius-selector": "1rem", "--radius-field": "1rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, black: { "color-scheme": "dark", "--color-base-100": "oklch(0% 0 0)", "--color-base-200": "oklch(19% 0 0)", "--color-base-300": "oklch(22% 0 0)", "--color-base-content": "oklch(87.609% 0 0)", "--color-primary": "oklch(35% 0 0)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(35% 0 0)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(35% 0 0)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(35% 0 0)", "--color-neutral-content": "oklch(100% 0 0)", "--color-info": "oklch(45.201% 0.313 264.052)", "--color-info-content": "oklch(89.04% 0.062 264.052)", "--color-success": "oklch(51.975% 0.176 142.495)", "--color-success-content": "oklch(90.395% 0.035 142.495)", "--color-warning": "oklch(96.798% 0.211 109.769)", "--color-warning-content": "oklch(19.359% 0.042 109.769)", "--color-error": "oklch(62.795% 0.257 29.233)", "--color-error-content": "oklch(12.559% 0.051 29.233)", "--radius-selector": "0rem", "--radius-field": "0rem", "--radius-box": "0rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, dark: { "color-scheme": "dark", "--color-base-100": "oklch(25.33% 0.016 252.42)", "--color-base-200": "oklch(23.26% 0.014 253.1)", "--color-base-300": "oklch(21.15% 0.012 254.09)", "--color-base-content": "oklch(97.807% 0.029 256.847)", "--color-primary": "oklch(58% 0.233 277.117)", "--color-primary-content": "oklch(96% 0.018 272.314)", "--color-secondary": "oklch(65% 0.241 354.308)", "--color-secondary-content": "oklch(94% 0.028 342.258)", "--color-accent": "oklch(77% 0.152 181.912)", "--color-accent-content": "oklch(38% 0.063 188.416)", "--color-neutral": "oklch(14% 0.005 285.823)", "--color-neutral-content": "oklch(92% 0.004 286.32)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(76% 0.177 163.223)", "--color-success-content": "oklch(37% 0.077 168.94)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(71% 0.194 13.428)", "--color-error-content": "oklch(27% 0.105 12.094)", "--radius-selector": "0.5rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, light: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(98% 0 0)", "--color-base-300": "oklch(95% 0 0)", "--color-base-content": "oklch(21% 0.006 285.885)", "--color-primary": "oklch(45% 0.24 277.023)", "--color-primary-content": "oklch(93% 0.034 272.788)", "--color-secondary": "oklch(65% 0.241 354.308)", "--color-secondary-content": "oklch(94% 0.028 342.258)", "--color-accent": "oklch(77% 0.152 181.912)", "--color-accent-content": "oklch(38% 0.063 188.416)", "--color-neutral": "oklch(14% 0.005 285.823)", "--color-neutral-content": "oklch(92% 0.004 286.32)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(76% 0.177 163.223)", "--color-success-content": "oklch(37% 0.077 168.94)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(71% 0.194 13.428)", "--color-error-content": "oklch(27% 0.105 12.094)", "--radius-selector": "0.5rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, luxury: { "color-scheme": "dark", "--color-base-100": "oklch(14.076% 0.004 285.822)", "--color-base-200": "oklch(20.219% 0.004 308.229)", "--color-base-300": "oklch(23.219% 0.004 308.229)", "--color-base-content": "oklch(75.687% 0.123 76.89)", "--color-primary": "oklch(100% 0 0)", "--color-primary-content": "oklch(20% 0 0)", "--color-secondary": "oklch(27.581% 0.064 261.069)", "--color-secondary-content": "oklch(85.516% 0.012 261.069)", "--color-accent": "oklch(36.674% 0.051 338.825)", "--color-accent-content": "oklch(87.334% 0.01 338.825)", "--color-neutral": "oklch(24.27% 0.057 59.825)", "--color-neutral-content": "oklch(93.203% 0.089 90.861)", "--color-info": "oklch(79.061% 0.121 237.133)", "--color-info-content": "oklch(15.812% 0.024 237.133)", "--color-success": "oklch(78.119% 0.192 132.154)", "--color-success-content": "oklch(15.623% 0.038 132.154)", "--color-warning": "oklch(86.127% 0.136 102.891)", "--color-warning-content": "oklch(17.225% 0.027 102.891)", "--color-error": "oklch(71.753% 0.176 22.568)", "--color-error-content": "oklch(14.35% 0.035 22.568)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, dracula: { "color-scheme": "dark", "--color-base-100": "oklch(28.822% 0.022 277.508)", "--color-base-200": "oklch(26.805% 0.02 277.508)", "--color-base-300": "oklch(24.787% 0.019 277.508)", "--color-base-content": "oklch(97.747% 0.007 106.545)", "--color-primary": "oklch(75.461% 0.183 346.812)", "--color-primary-content": "oklch(15.092% 0.036 346.812)", "--color-secondary": "oklch(74.202% 0.148 301.883)", "--color-secondary-content": "oklch(14.84% 0.029 301.883)", "--color-accent": "oklch(83.392% 0.124 66.558)", "--color-accent-content": "oklch(16.678% 0.024 66.558)", "--color-neutral": "oklch(39.445% 0.032 275.524)", "--color-neutral-content": "oklch(87.889% 0.006 275.524)", "--color-info": "oklch(88.263% 0.093 212.846)", "--color-info-content": "oklch(17.652% 0.018 212.846)", "--color-success": "oklch(87.099% 0.219 148.024)", "--color-success-content": "oklch(17.419% 0.043 148.024)", "--color-warning": "oklch(95.533% 0.134 112.757)", "--color-warning-content": "oklch(19.106% 0.026 112.757)", "--color-error": "oklch(68.22% 0.206 24.43)", "--color-error-content": "oklch(13.644% 0.041 24.43)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, retro: { "color-scheme": "light", "--color-base-100": "oklch(91.637% 0.034 90.515)", "--color-base-200": "oklch(88.272% 0.049 91.774)", "--color-base-300": "oklch(84.133% 0.065 90.856)", "--color-base-content": "oklch(41% 0.112 45.904)", "--color-primary": "oklch(80% 0.114 19.571)", "--color-primary-content": "oklch(39% 0.141 25.723)", "--color-secondary": "oklch(92% 0.084 155.995)", "--color-secondary-content": "oklch(44% 0.119 151.328)", "--color-accent": "oklch(68% 0.162 75.834)", "--color-accent-content": "oklch(41% 0.112 45.904)", "--color-neutral": "oklch(44% 0.011 73.639)", "--color-neutral-content": "oklch(86% 0.005 56.366)", "--color-info": "oklch(58% 0.158 241.966)", "--color-info-content": "oklch(96% 0.059 95.617)", "--color-success": "oklch(51% 0.096 186.391)", "--color-success-content": "oklch(96% 0.059 95.617)", "--color-warning": "oklch(64% 0.222 41.116)", "--color-warning-content": "oklch(96% 0.059 95.617)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(40% 0.123 38.172)", "--radius-selector": "0.25rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, lofi: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97% 0 0)", "--color-base-300": "oklch(94% 0 0)", "--color-base-content": "oklch(0% 0 0)", "--color-primary": "oklch(15.906% 0 0)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(21.455% 0.001 17.278)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(26.861% 0 0)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(0% 0 0)", "--color-neutral-content": "oklch(100% 0 0)", "--color-info": "oklch(79.54% 0.103 205.9)", "--color-info-content": "oklch(15.908% 0.02 205.9)", "--color-success": "oklch(90.13% 0.153 164.14)", "--color-success-content": "oklch(18.026% 0.03 164.14)", "--color-warning": "oklch(88.37% 0.135 79.94)", "--color-warning-content": "oklch(17.674% 0.027 79.94)", "--color-error": "oklch(78.66% 0.15 28.47)", "--color-error-content": "oklch(15.732% 0.03 28.47)", "--radius-selector": "2rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, valentine: { "color-scheme": "light", "--color-base-100": "oklch(97% 0.014 343.198)", "--color-base-200": "oklch(94% 0.028 342.258)", "--color-base-300": "oklch(89% 0.061 343.231)", "--color-base-content": "oklch(52% 0.223 3.958)", "--color-primary": "oklch(65% 0.241 354.308)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(62% 0.265 303.9)", "--color-secondary-content": "oklch(97% 0.014 308.299)", "--color-accent": "oklch(82% 0.111 230.318)", "--color-accent-content": "oklch(39% 0.09 240.876)", "--color-neutral": "oklch(40% 0.153 2.432)", "--color-neutral-content": "oklch(89% 0.061 343.231)", "--color-info": "oklch(86% 0.127 207.078)", "--color-info-content": "oklch(44% 0.11 240.79)", "--color-success": "oklch(84% 0.143 164.978)", "--color-success-content": "oklch(43% 0.095 166.913)", "--color-warning": "oklch(75% 0.183 55.934)", "--color-warning-content": "oklch(26% 0.079 36.259)", "--color-error": "oklch(63% 0.237 25.331)", "--color-error-content": "oklch(97% 0.013 17.38)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, nord: { "color-scheme": "light", "--color-base-100": "oklch(95.127% 0.007 260.731)", "--color-base-200": "oklch(93.299% 0.01 261.788)", "--color-base-300": "oklch(89.925% 0.016 262.749)", "--color-base-content": "oklch(32.437% 0.022 264.182)", "--color-primary": "oklch(59.435% 0.077 254.027)", "--color-primary-content": "oklch(11.887% 0.015 254.027)", "--color-secondary": "oklch(69.651% 0.059 248.687)", "--color-secondary-content": "oklch(13.93% 0.011 248.687)", "--color-accent": "oklch(77.464% 0.062 217.469)", "--color-accent-content": "oklch(15.492% 0.012 217.469)", "--color-neutral": "oklch(45.229% 0.035 264.131)", "--color-neutral-content": "oklch(89.925% 0.016 262.749)", "--color-info": "oklch(69.207% 0.062 332.664)", "--color-info-content": "oklch(13.841% 0.012 332.664)", "--color-success": "oklch(76.827% 0.074 131.063)", "--color-success-content": "oklch(15.365% 0.014 131.063)", "--color-warning": "oklch(85.486% 0.089 84.093)", "--color-warning-content": "oklch(17.097% 0.017 84.093)", "--color-error": "oklch(60.61% 0.12 15.341)", "--color-error-content": "oklch(12.122% 0.024 15.341)", "--radius-selector": "1rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, lemonade: { "color-scheme": "light", "--color-base-100": "oklch(98.71% 0.02 123.72)", "--color-base-200": "oklch(91.8% 0.018 123.72)", "--color-base-300": "oklch(84.89% 0.017 123.72)", "--color-base-content": "oklch(19.742% 0.004 123.72)", "--color-primary": "oklch(58.92% 0.199 134.6)", "--color-primary-content": "oklch(11.784% 0.039 134.6)", "--color-secondary": "oklch(77.75% 0.196 111.09)", "--color-secondary-content": "oklch(15.55% 0.039 111.09)", "--color-accent": "oklch(85.39% 0.201 100.73)", "--color-accent-content": "oklch(17.078% 0.04 100.73)", "--color-neutral": "oklch(30.98% 0.075 108.6)", "--color-neutral-content": "oklch(86.196% 0.015 108.6)", "--color-info": "oklch(86.19% 0.047 224.14)", "--color-info-content": "oklch(17.238% 0.009 224.14)", "--color-success": "oklch(86.19% 0.047 157.85)", "--color-success-content": "oklch(17.238% 0.009 157.85)", "--color-warning": "oklch(86.19% 0.047 102.15)", "--color-warning-content": "oklch(17.238% 0.009 102.15)", "--color-error": "oklch(86.19% 0.047 25.85)", "--color-error-content": "oklch(17.238% 0.009 25.85)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, garden: { "color-scheme": "light", "--color-base-100": "oklch(92.951% 0.002 17.197)", "--color-base-200": "oklch(86.445% 0.002 17.197)", "--color-base-300": "oklch(79.938% 0.001 17.197)", "--color-base-content": "oklch(16.961% 0.001 17.32)", "--color-primary": "oklch(62.45% 0.278 3.836)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(48.495% 0.11 355.095)", "--color-secondary-content": "oklch(89.699% 0.022 355.095)", "--color-accent": "oklch(56.273% 0.054 154.39)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(24.155% 0.049 89.07)", "--color-neutral-content": "oklch(92.951% 0.002 17.197)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, aqua: { "color-scheme": "dark", "--color-base-100": "oklch(37% 0.146 265.522)", "--color-base-200": "oklch(28% 0.091 267.935)", "--color-base-300": "oklch(22% 0.091 267.935)", "--color-base-content": "oklch(90% 0.058 230.902)", "--color-primary": "oklch(85.661% 0.144 198.645)", "--color-primary-content": "oklch(40.124% 0.068 197.603)", "--color-secondary": "oklch(60.682% 0.108 309.782)", "--color-secondary-content": "oklch(96% 0.016 293.756)", "--color-accent": "oklch(93.426% 0.102 94.555)", "--color-accent-content": "oklch(18.685% 0.02 94.555)", "--color-neutral": "oklch(27% 0.146 265.522)", "--color-neutral-content": "oklch(80% 0.146 265.522)", "--color-info": "oklch(54.615% 0.215 262.88)", "--color-info-content": "oklch(90.923% 0.043 262.88)", "--color-success": "oklch(62.705% 0.169 149.213)", "--color-success-content": "oklch(12.541% 0.033 149.213)", "--color-warning": "oklch(66.584% 0.157 58.318)", "--color-warning-content": "oklch(27% 0.077 45.635)", "--color-error": "oklch(73.95% 0.19 27.33)", "--color-error-content": "oklch(14.79% 0.038 27.33)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, corporate: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(93% 0 0)", "--color-base-300": "oklch(86% 0 0)", "--color-base-content": "oklch(22.389% 0.031 278.072)", "--color-primary": "oklch(58% 0.158 241.966)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(55% 0.046 257.417)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(60% 0.118 184.704)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(0% 0 0)", "--color-neutral-content": "oklch(100% 0 0)", "--color-info": "oklch(60% 0.126 221.723)", "--color-info-content": "oklch(100% 0 0)", "--color-success": "oklch(62% 0.194 149.214)", "--color-success-content": "oklch(100% 0 0)", "--color-warning": "oklch(85% 0.199 91.936)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "0.25rem", "--radius-field": "0.25rem", "--radius-box": "0.25rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, pastel: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(98.462% 0.001 247.838)", "--color-base-300": "oklch(92.462% 0.001 247.838)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(90% 0.063 306.703)", "--color-primary-content": "oklch(49% 0.265 301.924)", "--color-secondary": "oklch(89% 0.058 10.001)", "--color-secondary-content": "oklch(51% 0.222 16.935)", "--color-accent": "oklch(90% 0.093 164.15)", "--color-accent-content": "oklch(50% 0.118 165.612)", "--color-neutral": "oklch(55% 0.046 257.417)", "--color-neutral-content": "oklch(92% 0.013 255.508)", "--color-info": "oklch(86% 0.127 207.078)", "--color-info-content": "oklch(52% 0.105 223.128)", "--color-success": "oklch(87% 0.15 154.449)", "--color-success-content": "oklch(52% 0.154 150.069)", "--color-warning": "oklch(83% 0.128 66.29)", "--color-warning-content": "oklch(55% 0.195 38.402)", "--color-error": "oklch(80% 0.114 19.571)", "--color-error-content": "oklch(50% 0.213 27.518)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "0", "--noise": "0" }, bumblebee: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97% 0 0)", "--color-base-300": "oklch(92% 0 0)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(85% 0.199 91.936)", "--color-primary-content": "oklch(42% 0.095 57.708)", "--color-secondary": "oklch(75% 0.183 55.934)", "--color-secondary-content": "oklch(40% 0.123 38.172)", "--color-accent": "oklch(0% 0 0)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(37% 0.01 67.558)", "--color-neutral-content": "oklch(92% 0.003 48.717)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(39% 0.09 240.876)", "--color-success": "oklch(76% 0.177 163.223)", "--color-success-content": "oklch(37% 0.077 168.94)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(39% 0.141 25.723)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, coffee: { "color-scheme": "dark", "--color-base-100": "oklch(24% 0.023 329.708)", "--color-base-200": "oklch(21% 0.021 329.708)", "--color-base-300": "oklch(16% 0.019 329.708)", "--color-base-content": "oklch(72.354% 0.092 79.129)", "--color-primary": "oklch(71.996% 0.123 62.756)", "--color-primary-content": "oklch(14.399% 0.024 62.756)", "--color-secondary": "oklch(34.465% 0.029 199.194)", "--color-secondary-content": "oklch(86.893% 0.005 199.194)", "--color-accent": "oklch(42.621% 0.074 224.389)", "--color-accent-content": "oklch(88.524% 0.014 224.389)", "--color-neutral": "oklch(16.51% 0.015 326.261)", "--color-neutral-content": "oklch(83.302% 0.003 326.261)", "--color-info": "oklch(79.49% 0.063 184.558)", "--color-info-content": "oklch(15.898% 0.012 184.558)", "--color-success": "oklch(74.722% 0.072 131.116)", "--color-success-content": "oklch(14.944% 0.014 131.116)", "--color-warning": "oklch(88.15% 0.14 87.722)", "--color-warning-content": "oklch(17.63% 0.028 87.722)", "--color-error": "oklch(77.318% 0.128 31.871)", "--color-error-content": "oklch(15.463% 0.025 31.871)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, silk: { "color-scheme": "light", "--color-base-100": "oklch(97% 0.0035 67.78)", "--color-base-200": "oklch(95% 0.0081 61.42)", "--color-base-300": "oklch(90% 0.0081 61.42)", "--color-base-content": "oklch(40% 0.0081 61.42)", "--color-primary": "oklch(23.27% 0.0249 284.3)", "--color-primary-content": "oklch(94.22% 0.2505 117.44)", "--color-secondary": "oklch(23.27% 0.0249 284.3)", "--color-secondary-content": "oklch(73.92% 0.2135 50.94)", "--color-accent": "oklch(23.27% 0.0249 284.3)", "--color-accent-content": "oklch(88.92% 0.2061 189.9)", "--color-neutral": "oklch(20% 0 0)", "--color-neutral-content": "oklch(80% 0.0081 61.42)", "--color-info": "oklch(80.39% 0.1148 241.68)", "--color-info-content": "oklch(30.39% 0.1148 241.68)", "--color-success": "oklch(83.92% 0.0901 136.87)", "--color-success-content": "oklch(23.92% 0.0901 136.87)", "--color-warning": "oklch(83.92% 0.1085 80)", "--color-warning-content": "oklch(43.92% 0.1085 80)", "--color-error": "oklch(75.1% 0.1814 22.37)", "--color-error-content": "oklch(35.1% 0.1814 22.37)", "--radius-selector": "2rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "1", "--noise": "0" }, sunset: { "color-scheme": "dark", "--color-base-100": "oklch(22% 0.019 237.69)", "--color-base-200": "oklch(20% 0.019 237.69)", "--color-base-300": "oklch(18% 0.019 237.69)", "--color-base-content": "oklch(77.383% 0.043 245.096)", "--color-primary": "oklch(74.703% 0.158 39.947)", "--color-primary-content": "oklch(14.94% 0.031 39.947)", "--color-secondary": "oklch(72.537% 0.177 2.72)", "--color-secondary-content": "oklch(14.507% 0.035 2.72)", "--color-accent": "oklch(71.294% 0.166 299.844)", "--color-accent-content": "oklch(14.258% 0.033 299.844)", "--color-neutral": "oklch(26% 0.019 237.69)", "--color-neutral-content": "oklch(70% 0.019 237.69)", "--color-info": "oklch(85.559% 0.085 206.015)", "--color-info-content": "oklch(17.111% 0.017 206.015)", "--color-success": "oklch(85.56% 0.085 144.778)", "--color-success-content": "oklch(17.112% 0.017 144.778)", "--color-warning": "oklch(85.569% 0.084 74.427)", "--color-warning-content": "oklch(17.113% 0.016 74.427)", "--color-error": "oklch(85.511% 0.078 16.886)", "--color-error-content": "oklch(17.102% 0.015 16.886)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, synthwave: { "color-scheme": "dark", "--color-base-100": "oklch(15% 0.09 281.288)", "--color-base-200": "oklch(20% 0.09 281.288)", "--color-base-300": "oklch(25% 0.09 281.288)", "--color-base-content": "oklch(78% 0.115 274.713)", "--color-primary": "oklch(71% 0.202 349.761)", "--color-primary-content": "oklch(28% 0.109 3.907)", "--color-secondary": "oklch(82% 0.111 230.318)", "--color-secondary-content": "oklch(29% 0.066 243.157)", "--color-accent": "oklch(75% 0.183 55.934)", "--color-accent-content": "oklch(26% 0.079 36.259)", "--color-neutral": "oklch(45% 0.24 277.023)", "--color-neutral-content": "oklch(87% 0.065 274.039)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(77% 0.152 181.912)", "--color-success-content": "oklch(27% 0.046 192.524)", "--color-warning": "oklch(90% 0.182 98.111)", "--color-warning-content": "oklch(42% 0.095 57.708)", "--color-error": "oklch(73.7% 0.121 32.639)", "--color-error-content": "oklch(23.501% 0.096 290.329)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, dim: { "color-scheme": "dark", "--color-base-100": "oklch(30.857% 0.023 264.149)", "--color-base-200": "oklch(28.036% 0.019 264.182)", "--color-base-300": "oklch(26.346% 0.018 262.177)", "--color-base-content": "oklch(82.901% 0.031 222.959)", "--color-primary": "oklch(86.133% 0.141 139.549)", "--color-primary-content": "oklch(17.226% 0.028 139.549)", "--color-secondary": "oklch(73.375% 0.165 35.353)", "--color-secondary-content": "oklch(14.675% 0.033 35.353)", "--color-accent": "oklch(74.229% 0.133 311.379)", "--color-accent-content": "oklch(14.845% 0.026 311.379)", "--color-neutral": "oklch(24.731% 0.02 264.094)", "--color-neutral-content": "oklch(82.901% 0.031 222.959)", "--color-info": "oklch(86.078% 0.142 206.182)", "--color-info-content": "oklch(17.215% 0.028 206.182)", "--color-success": "oklch(86.171% 0.142 166.534)", "--color-success-content": "oklch(17.234% 0.028 166.534)", "--color-warning": "oklch(86.163% 0.142 94.818)", "--color-warning-content": "oklch(17.232% 0.028 94.818)", "--color-error": "oklch(82.418% 0.099 33.756)", "--color-error-content": "oklch(16.483% 0.019 33.756)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, abyss: { "color-scheme": "dark", "--color-base-100": "oklch(20% 0.08 209)", "--color-base-200": "oklch(15% 0.08 209)", "--color-base-300": "oklch(10% 0.08 209)", "--color-base-content": "oklch(90% 0.076 70.697)", "--color-primary": "oklch(92% 0.2653 125)", "--color-primary-content": "oklch(50% 0.2653 125)", "--color-secondary": "oklch(83.27% 0.0764 298.3)", "--color-secondary-content": "oklch(43.27% 0.0764 298.3)", "--color-accent": "oklch(43% 0 0)", "--color-accent-content": "oklch(98% 0 0)", "--color-neutral": "oklch(30% 0.08 209)", "--color-neutral-content": "oklch(90% 0.076 70.697)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(79% 0.209 151.711)", "--color-success-content": "oklch(26% 0.065 152.934)", "--color-warning": "oklch(84.8% 0.1962 84.62)", "--color-warning-content": "oklch(44.8% 0.1962 84.62)", "--color-error": "oklch(65% 0.1985 24.22)", "--color-error-content": "oklch(27% 0.1985 24.22)", "--radius-selector": "2rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, forest: { "color-scheme": "dark", "--color-base-100": "oklch(20.84% 0.008 17.911)", "--color-base-200": "oklch(18.522% 0.007 17.911)", "--color-base-300": "oklch(16.203% 0.007 17.911)", "--color-base-content": "oklch(83.768% 0.001 17.911)", "--color-primary": "oklch(68.628% 0.185 148.958)", "--color-primary-content": "oklch(0% 0 0)", "--color-secondary": "oklch(69.776% 0.135 168.327)", "--color-secondary-content": "oklch(13.955% 0.027 168.327)", "--color-accent": "oklch(70.628% 0.119 185.713)", "--color-accent-content": "oklch(14.125% 0.023 185.713)", "--color-neutral": "oklch(30.698% 0.039 171.364)", "--color-neutral-content": "oklch(86.139% 0.007 171.364)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, night: { "color-scheme": "dark", "--color-base-100": "oklch(20.768% 0.039 265.754)", "--color-base-200": "oklch(19.314% 0.037 265.754)", "--color-base-300": "oklch(17.86% 0.034 265.754)", "--color-base-content": "oklch(84.153% 0.007 265.754)", "--color-primary": "oklch(75.351% 0.138 232.661)", "--color-primary-content": "oklch(15.07% 0.027 232.661)", "--color-secondary": "oklch(68.011% 0.158 276.934)", "--color-secondary-content": "oklch(13.602% 0.031 276.934)", "--color-accent": "oklch(72.36% 0.176 350.048)", "--color-accent-content": "oklch(14.472% 0.035 350.048)", "--color-neutral": "oklch(27.949% 0.036 260.03)", "--color-neutral-content": "oklch(85.589% 0.007 260.03)", "--color-info": "oklch(68.455% 0.148 237.251)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(78.452% 0.132 181.911)", "--color-success-content": "oklch(15.69% 0.026 181.911)", "--color-warning": "oklch(83.242% 0.139 82.95)", "--color-warning-content": "oklch(16.648% 0.027 82.95)", "--color-error": "oklch(71.785% 0.17 13.118)", "--color-error-content": "oklch(14.357% 0.034 13.118)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, caramellatte: { "color-scheme": "light", "--color-base-100": "oklch(98% 0.016 73.684)", "--color-base-200": "oklch(95% 0.038 75.164)", "--color-base-300": "oklch(90% 0.076 70.697)", "--color-base-content": "oklch(40% 0.123 38.172)", "--color-primary": "oklch(0% 0 0)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(22.45% 0.075 37.85)", "--color-secondary-content": "oklch(90% 0.076 70.697)", "--color-accent": "oklch(46.44% 0.111 37.85)", "--color-accent-content": "oklch(90% 0.076 70.697)", "--color-neutral": "oklch(55% 0.195 38.402)", "--color-neutral-content": "oklch(98% 0.016 73.684)", "--color-info": "oklch(42% 0.199 265.638)", "--color-info-content": "oklch(90% 0.076 70.697)", "--color-success": "oklch(43% 0.095 166.913)", "--color-success-content": "oklch(90% 0.076 70.697)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(39% 0.141 25.723)", "--radius-selector": "2rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "1", "--noise": "1" }, autumn: { "color-scheme": "light", "--color-base-100": "oklch(95.814% 0 0)", "--color-base-200": "oklch(89.107% 0 0)", "--color-base-300": "oklch(82.4% 0 0)", "--color-base-content": "oklch(19.162% 0 0)", "--color-primary": "oklch(40.723% 0.161 17.53)", "--color-primary-content": "oklch(88.144% 0.032 17.53)", "--color-secondary": "oklch(61.676% 0.169 23.865)", "--color-secondary-content": "oklch(12.335% 0.033 23.865)", "--color-accent": "oklch(73.425% 0.094 60.729)", "--color-accent-content": "oklch(14.685% 0.018 60.729)", "--color-neutral": "oklch(54.367% 0.037 51.902)", "--color-neutral-content": "oklch(90.873% 0.007 51.902)", "--color-info": "oklch(69.224% 0.097 207.284)", "--color-info-content": "oklch(13.844% 0.019 207.284)", "--color-success": "oklch(60.995% 0.08 174.616)", "--color-success-content": "oklch(12.199% 0.016 174.616)", "--color-warning": "oklch(70.081% 0.164 56.844)", "--color-warning-content": "oklch(14.016% 0.032 56.844)", "--color-error": "oklch(53.07% 0.241 24.16)", "--color-error-content": "oklch(90.614% 0.048 24.16)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, emerald: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(93% 0 0)", "--color-base-300": "oklch(86% 0 0)", "--color-base-content": "oklch(35.519% 0.032 262.988)", "--color-primary": "oklch(76.662% 0.135 153.45)", "--color-primary-content": "oklch(33.387% 0.04 162.24)", "--color-secondary": "oklch(61.302% 0.202 261.294)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(72.772% 0.149 33.2)", "--color-accent-content": "oklch(0% 0 0)", "--color-neutral": "oklch(35.519% 0.032 262.988)", "--color-neutral-content": "oklch(98.462% 0.001 247.838)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, cupcake: { "color-scheme": "light", "--color-base-100": "oklch(97.788% 0.004 56.375)", "--color-base-200": "oklch(93.982% 0.007 61.449)", "--color-base-300": "oklch(91.586% 0.006 53.44)", "--color-base-content": "oklch(23.574% 0.066 313.189)", "--color-primary": "oklch(85% 0.138 181.071)", "--color-primary-content": "oklch(43% 0.078 188.216)", "--color-secondary": "oklch(89% 0.061 343.231)", "--color-secondary-content": "oklch(45% 0.187 3.815)", "--color-accent": "oklch(90% 0.076 70.697)", "--color-accent-content": "oklch(47% 0.157 37.304)", "--color-neutral": "oklch(27% 0.006 286.033)", "--color-neutral-content": "oklch(92% 0.004 286.32)", "--color-info": "oklch(68% 0.169 237.323)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(69% 0.17 162.48)", "--color-success-content": "oklch(26% 0.051 172.552)", "--color-warning": "oklch(79% 0.184 86.047)", "--color-warning-content": "oklch(28% 0.066 53.813)", "--color-error": "oklch(64% 0.246 16.439)", "--color-error-content": "oklch(27% 0.105 12.094)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "1", "--noise": "0" }, cmyk: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(95% 0 0)", "--color-base-300": "oklch(90% 0 0)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(71.772% 0.133 239.443)", "--color-primary-content": "oklch(14.354% 0.026 239.443)", "--color-secondary": "oklch(64.476% 0.202 359.339)", "--color-secondary-content": "oklch(12.895% 0.04 359.339)", "--color-accent": "oklch(94.228% 0.189 105.306)", "--color-accent-content": "oklch(18.845% 0.037 105.306)", "--color-neutral": "oklch(21.778% 0 0)", "--color-neutral-content": "oklch(84.355% 0 0)", "--color-info": "oklch(68.475% 0.094 217.284)", "--color-info-content": "oklch(13.695% 0.018 217.284)", "--color-success": "oklch(46.949% 0.162 321.406)", "--color-success-content": "oklch(89.389% 0.032 321.406)", "--color-warning": "oklch(71.236% 0.159 52.023)", "--color-warning-content": "oklch(14.247% 0.031 52.023)", "--color-error": "oklch(62.013% 0.208 28.717)", "--color-error-content": "oklch(12.402% 0.041 28.717)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, business: { "color-scheme": "dark", "--color-base-100": "oklch(24.353% 0 0)", "--color-base-200": "oklch(22.648% 0 0)", "--color-base-300": "oklch(20.944% 0 0)", "--color-base-content": "oklch(84.87% 0 0)", "--color-primary": "oklch(41.703% 0.099 251.473)", "--color-primary-content": "oklch(88.34% 0.019 251.473)", "--color-secondary": "oklch(64.092% 0.027 229.389)", "--color-secondary-content": "oklch(12.818% 0.005 229.389)", "--color-accent": "oklch(67.271% 0.167 35.791)", "--color-accent-content": "oklch(13.454% 0.033 35.791)", "--color-neutral": "oklch(27.441% 0.013 253.041)", "--color-neutral-content": "oklch(85.488% 0.002 253.041)", "--color-info": "oklch(62.616% 0.143 240.033)", "--color-info-content": "oklch(12.523% 0.028 240.033)", "--color-success": "oklch(70.226% 0.094 156.596)", "--color-success-content": "oklch(14.045% 0.018 156.596)", "--color-warning": "oklch(77.482% 0.115 81.519)", "--color-warning-content": "oklch(15.496% 0.023 81.519)", "--color-error": "oklch(51.61% 0.146 29.674)", "--color-error-content": "oklch(90.322% 0.029 29.674)", "--radius-selector": "0rem", "--radius-field": "0.25rem", "--radius-box": "0.25rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, winter: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97.466% 0.011 259.822)", "--color-base-300": "oklch(93.268% 0.016 262.751)", "--color-base-content": "oklch(41.886% 0.053 255.824)", "--color-primary": "oklch(56.86% 0.255 257.57)", "--color-primary-content": "oklch(91.372% 0.051 257.57)", "--color-secondary": "oklch(42.551% 0.161 282.339)", "--color-secondary-content": "oklch(88.51% 0.032 282.339)", "--color-accent": "oklch(59.939% 0.191 335.171)", "--color-accent-content": "oklch(11.988% 0.038 335.171)", "--color-neutral": "oklch(19.616% 0.063 257.651)", "--color-neutral-content": "oklch(83.923% 0.012 257.651)", "--color-info": "oklch(88.127% 0.085 214.515)", "--color-info-content": "oklch(17.625% 0.017 214.515)", "--color-success": "oklch(80.494% 0.077 197.823)", "--color-success-content": "oklch(16.098% 0.015 197.823)", "--color-warning": "oklch(89.172% 0.045 71.47)", "--color-warning-content": "oklch(17.834% 0.009 71.47)", "--color-error": "oklch(73.092% 0.11 20.076)", "--color-error-content": "oklch(14.618% 0.022 20.076)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, halloween: { "color-scheme": "dark", "--color-base-100": "oklch(21% 0.006 56.043)", "--color-base-200": "oklch(14% 0.004 49.25)", "--color-base-300": "oklch(0% 0 0)", "--color-base-content": "oklch(84.955% 0 0)", "--color-primary": "oklch(77.48% 0.204 60.62)", "--color-primary-content": "oklch(19.693% 0.004 196.779)", "--color-secondary": "oklch(45.98% 0.248 305.03)", "--color-secondary-content": "oklch(89.196% 0.049 305.03)", "--color-accent": "oklch(64.8% 0.223 136.073)", "--color-accent-content": "oklch(0% 0 0)", "--color-neutral": "oklch(24.371% 0.046 65.681)", "--color-neutral-content": "oklch(84.874% 0.009 65.681)", "--color-info": "oklch(54.615% 0.215 262.88)", "--color-info-content": "oklch(90.923% 0.043 262.88)", "--color-success": "oklch(62.705% 0.169 149.213)", "--color-success-content": "oklch(12.541% 0.033 149.213)", "--color-warning": "oklch(66.584% 0.157 58.318)", "--color-warning-content": "oklch(13.316% 0.031 58.318)", "--color-error": "oklch(65.72% 0.199 27.33)", "--color-error-content": "oklch(13.144% 0.039 27.33)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, fantasy: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(93% 0 0)", "--color-base-300": "oklch(86% 0 0)", "--color-base-content": "oklch(27.807% 0.029 256.847)", "--color-primary": "oklch(37.45% 0.189 325.02)", "--color-primary-content": "oklch(87.49% 0.037 325.02)", "--color-secondary": "oklch(53.92% 0.162 241.36)", "--color-secondary-content": "oklch(90.784% 0.032 241.36)", "--color-accent": "oklch(75.98% 0.204 56.72)", "--color-accent-content": "oklch(15.196% 0.04 56.72)", "--color-neutral": "oklch(27.807% 0.029 256.847)", "--color-neutral-content": "oklch(85.561% 0.005 256.847)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, wireframe: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97% 0 0)", "--color-base-300": "oklch(94% 0 0)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(87% 0 0)", "--color-primary-content": "oklch(26% 0 0)", "--color-secondary": "oklch(87% 0 0)", "--color-secondary-content": "oklch(26% 0 0)", "--color-accent": "oklch(87% 0 0)", "--color-accent-content": "oklch(26% 0 0)", "--color-neutral": "oklch(87% 0 0)", "--color-neutral-content": "oklch(26% 0 0)", "--color-info": "oklch(44% 0.11 240.79)", "--color-info-content": "oklch(90% 0.058 230.902)", "--color-success": "oklch(43% 0.095 166.913)", "--color-success-content": "oklch(90% 0.093 164.15)", "--color-warning": "oklch(47% 0.137 46.201)", "--color-warning-content": "oklch(92% 0.12 95.746)", "--color-error": "oklch(44% 0.177 26.899)", "--color-error-content": "oklch(88% 0.062 18.334)", "--radius-selector": "0rem", "--radius-field": "0.25rem", "--radius-box": "0.25rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" } }; + +// packages/daisyui/theme/index.js +var theme_default = plugin.withOptions((options = {}) => { + return ({ addBase }) => { + const { + name = "custom-theme", + default: isDefault = false, + prefersdark = false, + "color-scheme": colorScheme = "normal", + root = ":root", + ...customThemeTokens + } = options; + let selector = `${root}:has(input.theme-controller[value=${name}]:checked),[data-theme="${name}"]`; + if (isDefault) { + selector = `:where(${root}),${selector}`; + } + let themeTokens = { ...customThemeTokens }; + if (object_default[name]) { + const builtinTheme = object_default[name]; + themeTokens = { + ...builtinTheme, + ...customThemeTokens, + "color-scheme": colorScheme || builtinTheme.colorScheme + }; + } + const baseStyles = { + [selector]: { + "color-scheme": themeTokens["color-scheme"] || colorScheme, + ...themeTokens + } + }; + if (prefersdark) { + addBase({ + "@media (prefers-color-scheme: dark)": { + [root]: baseStyles[selector] + } + }); + } + addBase(baseStyles); + }; +}); + + +/* + + MIT License + + Copyright (c) 2020 Pouya Saadeghi โ€“ https://daisyui.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +*/ diff --git a/website/assets/vendor/daisyui.js b/website/assets/vendor/daisyui.js new file mode 100644 index 0000000..46bf6bf --- /dev/null +++ b/website/assets/vendor/daisyui.js @@ -0,0 +1,1031 @@ +/** ๐ŸŒผ + * @license MIT + * daisyUI bundle + * https://daisyui.com/ + */ + +var __defProp = Object.defineProperty; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __moduleCache = /* @__PURE__ */ new WeakMap; +var __toCommonJS = (from) => { + var entry = __moduleCache.get(from), desc; + if (entry) + return entry; + entry = __defProp({}, "__esModule", { value: true }); + if (from && typeof from === "object" || typeof from === "function") + __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, { + get: () => from[key], + enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable + })); + __moduleCache.set(from, entry); + return entry; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { + get: all[name], + enumerable: true, + configurable: true, + set: (newValue) => all[name] = () => newValue + }); +}; + +// packages/daisyui/index.js +var exports_daisyui = {}; +__export(exports_daisyui, { + default: () => daisyui_default +}); +module.exports = __toCommonJS(exports_daisyui); + +// packages/daisyui/functions/themeOrder.js +var themeOrder_default = [ + "light", + "dark", + "cupcake", + "bumblebee", + "emerald", + "corporate", + "synthwave", + "retro", + "cyberpunk", + "valentine", + "halloween", + "garden", + "forest", + "aqua", + "lofi", + "pastel", + "fantasy", + "wireframe", + "black", + "luxury", + "dracula", + "cmyk", + "autumn", + "business", + "acid", + "lemonade", + "night", + "coffee", + "winter", + "dim", + "nord", + "sunset", + "caramellatte", + "abyss", + "silk" +]; + +// packages/daisyui/functions/pluginOptionsHandler.js +var pluginOptionsHandler = (() => { + let firstRun = true; + return (options, addBase, themesObject, packageVersion) => { + const { + logs = true, + root = ":root", + themes = ["light --default", "dark --prefersdark"], + include, + exclude, + prefix = "" + } = options || {}; + if (logs !== false && firstRun) { + console.log(`${atob("Lyoh")} ${decodeURIComponent("%F0%9F%8C%BC")} ${atob("ZGFpc3lVSQ==")} ${packageVersion} ${atob("Ki8=")}`); + firstRun = false; + } + const applyTheme = (themeName, flags) => { + const theme = themesObject[themeName]; + if (theme) { + let selector = `${root}:has(input.theme-controller[value=${themeName}]:checked),[data-theme=${themeName}]`; + if (flags.includes("--default")) { + selector = `:where(${root}),${selector}`; + } + addBase({ [selector]: theme }); + if (flags.includes("--prefersdark")) { + addBase({ "@media (prefers-color-scheme: dark)": { [root]: theme } }); + } + } + }; + if (themes === "all") { + if (themesObject["light"]) { + applyTheme("light", ["--default"]); + } + if (themesObject["dark"]) { + addBase({ "@media (prefers-color-scheme: dark)": { [root]: themesObject["dark"] } }); + } + themeOrder_default.forEach((themeName) => { + if (themesObject[themeName]) { + applyTheme(themeName, []); + } + }); + } else if (themes) { + const themeArray = Array.isArray(themes) ? themes : [themes]; + if (themeArray.length === 1 && themeArray[0].includes("--default")) { + const [themeName, ...flags] = themeArray[0].split(" "); + applyTheme(themeName, flags); + return { include, exclude, prefix }; + } + themeArray.forEach((themeOption) => { + const [themeName, ...flags] = themeOption.split(" "); + if (flags.includes("--default")) { + applyTheme(themeName, ["--default"]); + } + }); + themeArray.forEach((themeOption) => { + const [themeName, ...flags] = themeOption.split(" "); + if (flags.includes("--prefersdark")) { + addBase({ "@media (prefers-color-scheme: dark)": { [root]: themesObject[themeName] } }); + } + }); + themeArray.forEach((themeOption) => { + const [themeName] = themeOption.split(" "); + applyTheme(themeName, []); + }); + } + return { include, exclude, prefix }; + }; +})(); + +// packages/daisyui/functions/plugin.js +var plugin = { + withOptions: (pluginFunction, configFunction = () => ({})) => { + const optionsFunction = (options) => { + const handler = pluginFunction(options); + const config = configFunction(options); + return { handler, config }; + }; + optionsFunction.__isOptionsFunction = true; + return optionsFunction; + } +}; + +// packages/daisyui/functions/variables.js +var variables_default = { + colors: { + "base-100": "var(--color-base-100)", + "base-200": "var(--color-base-200)", + "base-300": "var(--color-base-300)", + "base-content": "var(--color-base-content)", + primary: "var(--color-primary)", + "primary-content": "var(--color-primary-content)", + secondary: "var(--color-secondary)", + "secondary-content": "var(--color-secondary-content)", + accent: "var(--color-accent)", + "accent-content": "var(--color-accent-content)", + neutral: "var(--color-neutral)", + "neutral-content": "var(--color-neutral-content)", + info: "var(--color-info)", + "info-content": "var(--color-info-content)", + success: "var(--color-success)", + "success-content": "var(--color-success-content)", + warning: "var(--color-warning)", + "warning-content": "var(--color-warning-content)", + error: "var(--color-error)", + "error-content": "var(--color-error-content)" + }, + borderRadius: { + selector: "var(--radius-selector)", + field: "var(--radius-field)", + box: "var(--radius-box)" + } +}; + +// packages/daisyui/theme/object.js +var object_default = { cyberpunk: { "color-scheme": "light", "--color-base-100": "oklch(94.51% 0.179 104.32)", "--color-base-200": "oklch(91.51% 0.179 104.32)", "--color-base-300": "oklch(85.51% 0.179 104.32)", "--color-base-content": "oklch(0% 0 0)", "--color-primary": "oklch(74.22% 0.209 6.35)", "--color-primary-content": "oklch(14.844% 0.041 6.35)", "--color-secondary": "oklch(83.33% 0.184 204.72)", "--color-secondary-content": "oklch(16.666% 0.036 204.72)", "--color-accent": "oklch(71.86% 0.217 310.43)", "--color-accent-content": "oklch(14.372% 0.043 310.43)", "--color-neutral": "oklch(23.04% 0.065 269.31)", "--color-neutral-content": "oklch(94.51% 0.179 104.32)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "0rem", "--radius-field": "0rem", "--radius-box": "0rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, acid: { "color-scheme": "light", "--color-base-100": "oklch(98% 0 0)", "--color-base-200": "oklch(95% 0 0)", "--color-base-300": "oklch(91% 0 0)", "--color-base-content": "oklch(0% 0 0)", "--color-primary": "oklch(71.9% 0.357 330.759)", "--color-primary-content": "oklch(14.38% 0.071 330.759)", "--color-secondary": "oklch(73.37% 0.224 48.25)", "--color-secondary-content": "oklch(14.674% 0.044 48.25)", "--color-accent": "oklch(92.78% 0.264 122.962)", "--color-accent-content": "oklch(18.556% 0.052 122.962)", "--color-neutral": "oklch(21.31% 0.128 278.68)", "--color-neutral-content": "oklch(84.262% 0.025 278.68)", "--color-info": "oklch(60.72% 0.227 252.05)", "--color-info-content": "oklch(12.144% 0.045 252.05)", "--color-success": "oklch(85.72% 0.266 158.53)", "--color-success-content": "oklch(17.144% 0.053 158.53)", "--color-warning": "oklch(91.01% 0.212 100.5)", "--color-warning-content": "oklch(18.202% 0.042 100.5)", "--color-error": "oklch(64.84% 0.293 29.349)", "--color-error-content": "oklch(12.968% 0.058 29.349)", "--radius-selector": "1rem", "--radius-field": "1rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, black: { "color-scheme": "dark", "--color-base-100": "oklch(0% 0 0)", "--color-base-200": "oklch(19% 0 0)", "--color-base-300": "oklch(22% 0 0)", "--color-base-content": "oklch(87.609% 0 0)", "--color-primary": "oklch(35% 0 0)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(35% 0 0)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(35% 0 0)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(35% 0 0)", "--color-neutral-content": "oklch(100% 0 0)", "--color-info": "oklch(45.201% 0.313 264.052)", "--color-info-content": "oklch(89.04% 0.062 264.052)", "--color-success": "oklch(51.975% 0.176 142.495)", "--color-success-content": "oklch(90.395% 0.035 142.495)", "--color-warning": "oklch(96.798% 0.211 109.769)", "--color-warning-content": "oklch(19.359% 0.042 109.769)", "--color-error": "oklch(62.795% 0.257 29.233)", "--color-error-content": "oklch(12.559% 0.051 29.233)", "--radius-selector": "0rem", "--radius-field": "0rem", "--radius-box": "0rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, dark: { "color-scheme": "dark", "--color-base-100": "oklch(25.33% 0.016 252.42)", "--color-base-200": "oklch(23.26% 0.014 253.1)", "--color-base-300": "oklch(21.15% 0.012 254.09)", "--color-base-content": "oklch(97.807% 0.029 256.847)", "--color-primary": "oklch(58% 0.233 277.117)", "--color-primary-content": "oklch(96% 0.018 272.314)", "--color-secondary": "oklch(65% 0.241 354.308)", "--color-secondary-content": "oklch(94% 0.028 342.258)", "--color-accent": "oklch(77% 0.152 181.912)", "--color-accent-content": "oklch(38% 0.063 188.416)", "--color-neutral": "oklch(14% 0.005 285.823)", "--color-neutral-content": "oklch(92% 0.004 286.32)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(76% 0.177 163.223)", "--color-success-content": "oklch(37% 0.077 168.94)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(71% 0.194 13.428)", "--color-error-content": "oklch(27% 0.105 12.094)", "--radius-selector": "0.5rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, light: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(98% 0 0)", "--color-base-300": "oklch(95% 0 0)", "--color-base-content": "oklch(21% 0.006 285.885)", "--color-primary": "oklch(45% 0.24 277.023)", "--color-primary-content": "oklch(93% 0.034 272.788)", "--color-secondary": "oklch(65% 0.241 354.308)", "--color-secondary-content": "oklch(94% 0.028 342.258)", "--color-accent": "oklch(77% 0.152 181.912)", "--color-accent-content": "oklch(38% 0.063 188.416)", "--color-neutral": "oklch(14% 0.005 285.823)", "--color-neutral-content": "oklch(92% 0.004 286.32)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(76% 0.177 163.223)", "--color-success-content": "oklch(37% 0.077 168.94)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(71% 0.194 13.428)", "--color-error-content": "oklch(27% 0.105 12.094)", "--radius-selector": "0.5rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, luxury: { "color-scheme": "dark", "--color-base-100": "oklch(14.076% 0.004 285.822)", "--color-base-200": "oklch(20.219% 0.004 308.229)", "--color-base-300": "oklch(23.219% 0.004 308.229)", "--color-base-content": "oklch(75.687% 0.123 76.89)", "--color-primary": "oklch(100% 0 0)", "--color-primary-content": "oklch(20% 0 0)", "--color-secondary": "oklch(27.581% 0.064 261.069)", "--color-secondary-content": "oklch(85.516% 0.012 261.069)", "--color-accent": "oklch(36.674% 0.051 338.825)", "--color-accent-content": "oklch(87.334% 0.01 338.825)", "--color-neutral": "oklch(24.27% 0.057 59.825)", "--color-neutral-content": "oklch(93.203% 0.089 90.861)", "--color-info": "oklch(79.061% 0.121 237.133)", "--color-info-content": "oklch(15.812% 0.024 237.133)", "--color-success": "oklch(78.119% 0.192 132.154)", "--color-success-content": "oklch(15.623% 0.038 132.154)", "--color-warning": "oklch(86.127% 0.136 102.891)", "--color-warning-content": "oklch(17.225% 0.027 102.891)", "--color-error": "oklch(71.753% 0.176 22.568)", "--color-error-content": "oklch(14.35% 0.035 22.568)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, dracula: { "color-scheme": "dark", "--color-base-100": "oklch(28.822% 0.022 277.508)", "--color-base-200": "oklch(26.805% 0.02 277.508)", "--color-base-300": "oklch(24.787% 0.019 277.508)", "--color-base-content": "oklch(97.747% 0.007 106.545)", "--color-primary": "oklch(75.461% 0.183 346.812)", "--color-primary-content": "oklch(15.092% 0.036 346.812)", "--color-secondary": "oklch(74.202% 0.148 301.883)", "--color-secondary-content": "oklch(14.84% 0.029 301.883)", "--color-accent": "oklch(83.392% 0.124 66.558)", "--color-accent-content": "oklch(16.678% 0.024 66.558)", "--color-neutral": "oklch(39.445% 0.032 275.524)", "--color-neutral-content": "oklch(87.889% 0.006 275.524)", "--color-info": "oklch(88.263% 0.093 212.846)", "--color-info-content": "oklch(17.652% 0.018 212.846)", "--color-success": "oklch(87.099% 0.219 148.024)", "--color-success-content": "oklch(17.419% 0.043 148.024)", "--color-warning": "oklch(95.533% 0.134 112.757)", "--color-warning-content": "oklch(19.106% 0.026 112.757)", "--color-error": "oklch(68.22% 0.206 24.43)", "--color-error-content": "oklch(13.644% 0.041 24.43)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, retro: { "color-scheme": "light", "--color-base-100": "oklch(91.637% 0.034 90.515)", "--color-base-200": "oklch(88.272% 0.049 91.774)", "--color-base-300": "oklch(84.133% 0.065 90.856)", "--color-base-content": "oklch(41% 0.112 45.904)", "--color-primary": "oklch(80% 0.114 19.571)", "--color-primary-content": "oklch(39% 0.141 25.723)", "--color-secondary": "oklch(92% 0.084 155.995)", "--color-secondary-content": "oklch(44% 0.119 151.328)", "--color-accent": "oklch(68% 0.162 75.834)", "--color-accent-content": "oklch(41% 0.112 45.904)", "--color-neutral": "oklch(44% 0.011 73.639)", "--color-neutral-content": "oklch(86% 0.005 56.366)", "--color-info": "oklch(58% 0.158 241.966)", "--color-info-content": "oklch(96% 0.059 95.617)", "--color-success": "oklch(51% 0.096 186.391)", "--color-success-content": "oklch(96% 0.059 95.617)", "--color-warning": "oklch(64% 0.222 41.116)", "--color-warning-content": "oklch(96% 0.059 95.617)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(40% 0.123 38.172)", "--radius-selector": "0.25rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, lofi: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97% 0 0)", "--color-base-300": "oklch(94% 0 0)", "--color-base-content": "oklch(0% 0 0)", "--color-primary": "oklch(15.906% 0 0)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(21.455% 0.001 17.278)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(26.861% 0 0)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(0% 0 0)", "--color-neutral-content": "oklch(100% 0 0)", "--color-info": "oklch(79.54% 0.103 205.9)", "--color-info-content": "oklch(15.908% 0.02 205.9)", "--color-success": "oklch(90.13% 0.153 164.14)", "--color-success-content": "oklch(18.026% 0.03 164.14)", "--color-warning": "oklch(88.37% 0.135 79.94)", "--color-warning-content": "oklch(17.674% 0.027 79.94)", "--color-error": "oklch(78.66% 0.15 28.47)", "--color-error-content": "oklch(15.732% 0.03 28.47)", "--radius-selector": "2rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, valentine: { "color-scheme": "light", "--color-base-100": "oklch(97% 0.014 343.198)", "--color-base-200": "oklch(94% 0.028 342.258)", "--color-base-300": "oklch(89% 0.061 343.231)", "--color-base-content": "oklch(52% 0.223 3.958)", "--color-primary": "oklch(65% 0.241 354.308)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(62% 0.265 303.9)", "--color-secondary-content": "oklch(97% 0.014 308.299)", "--color-accent": "oklch(82% 0.111 230.318)", "--color-accent-content": "oklch(39% 0.09 240.876)", "--color-neutral": "oklch(40% 0.153 2.432)", "--color-neutral-content": "oklch(89% 0.061 343.231)", "--color-info": "oklch(86% 0.127 207.078)", "--color-info-content": "oklch(44% 0.11 240.79)", "--color-success": "oklch(84% 0.143 164.978)", "--color-success-content": "oklch(43% 0.095 166.913)", "--color-warning": "oklch(75% 0.183 55.934)", "--color-warning-content": "oklch(26% 0.079 36.259)", "--color-error": "oklch(63% 0.237 25.331)", "--color-error-content": "oklch(97% 0.013 17.38)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, nord: { "color-scheme": "light", "--color-base-100": "oklch(95.127% 0.007 260.731)", "--color-base-200": "oklch(93.299% 0.01 261.788)", "--color-base-300": "oklch(89.925% 0.016 262.749)", "--color-base-content": "oklch(32.437% 0.022 264.182)", "--color-primary": "oklch(59.435% 0.077 254.027)", "--color-primary-content": "oklch(11.887% 0.015 254.027)", "--color-secondary": "oklch(69.651% 0.059 248.687)", "--color-secondary-content": "oklch(13.93% 0.011 248.687)", "--color-accent": "oklch(77.464% 0.062 217.469)", "--color-accent-content": "oklch(15.492% 0.012 217.469)", "--color-neutral": "oklch(45.229% 0.035 264.131)", "--color-neutral-content": "oklch(89.925% 0.016 262.749)", "--color-info": "oklch(69.207% 0.062 332.664)", "--color-info-content": "oklch(13.841% 0.012 332.664)", "--color-success": "oklch(76.827% 0.074 131.063)", "--color-success-content": "oklch(15.365% 0.014 131.063)", "--color-warning": "oklch(85.486% 0.089 84.093)", "--color-warning-content": "oklch(17.097% 0.017 84.093)", "--color-error": "oklch(60.61% 0.12 15.341)", "--color-error-content": "oklch(12.122% 0.024 15.341)", "--radius-selector": "1rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, lemonade: { "color-scheme": "light", "--color-base-100": "oklch(98.71% 0.02 123.72)", "--color-base-200": "oklch(91.8% 0.018 123.72)", "--color-base-300": "oklch(84.89% 0.017 123.72)", "--color-base-content": "oklch(19.742% 0.004 123.72)", "--color-primary": "oklch(58.92% 0.199 134.6)", "--color-primary-content": "oklch(11.784% 0.039 134.6)", "--color-secondary": "oklch(77.75% 0.196 111.09)", "--color-secondary-content": "oklch(15.55% 0.039 111.09)", "--color-accent": "oklch(85.39% 0.201 100.73)", "--color-accent-content": "oklch(17.078% 0.04 100.73)", "--color-neutral": "oklch(30.98% 0.075 108.6)", "--color-neutral-content": "oklch(86.196% 0.015 108.6)", "--color-info": "oklch(86.19% 0.047 224.14)", "--color-info-content": "oklch(17.238% 0.009 224.14)", "--color-success": "oklch(86.19% 0.047 157.85)", "--color-success-content": "oklch(17.238% 0.009 157.85)", "--color-warning": "oklch(86.19% 0.047 102.15)", "--color-warning-content": "oklch(17.238% 0.009 102.15)", "--color-error": "oklch(86.19% 0.047 25.85)", "--color-error-content": "oklch(17.238% 0.009 25.85)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, garden: { "color-scheme": "light", "--color-base-100": "oklch(92.951% 0.002 17.197)", "--color-base-200": "oklch(86.445% 0.002 17.197)", "--color-base-300": "oklch(79.938% 0.001 17.197)", "--color-base-content": "oklch(16.961% 0.001 17.32)", "--color-primary": "oklch(62.45% 0.278 3.836)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(48.495% 0.11 355.095)", "--color-secondary-content": "oklch(89.699% 0.022 355.095)", "--color-accent": "oklch(56.273% 0.054 154.39)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(24.155% 0.049 89.07)", "--color-neutral-content": "oklch(92.951% 0.002 17.197)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, aqua: { "color-scheme": "dark", "--color-base-100": "oklch(37% 0.146 265.522)", "--color-base-200": "oklch(28% 0.091 267.935)", "--color-base-300": "oklch(22% 0.091 267.935)", "--color-base-content": "oklch(90% 0.058 230.902)", "--color-primary": "oklch(85.661% 0.144 198.645)", "--color-primary-content": "oklch(40.124% 0.068 197.603)", "--color-secondary": "oklch(60.682% 0.108 309.782)", "--color-secondary-content": "oklch(96% 0.016 293.756)", "--color-accent": "oklch(93.426% 0.102 94.555)", "--color-accent-content": "oklch(18.685% 0.02 94.555)", "--color-neutral": "oklch(27% 0.146 265.522)", "--color-neutral-content": "oklch(80% 0.146 265.522)", "--color-info": "oklch(54.615% 0.215 262.88)", "--color-info-content": "oklch(90.923% 0.043 262.88)", "--color-success": "oklch(62.705% 0.169 149.213)", "--color-success-content": "oklch(12.541% 0.033 149.213)", "--color-warning": "oklch(66.584% 0.157 58.318)", "--color-warning-content": "oklch(27% 0.077 45.635)", "--color-error": "oklch(73.95% 0.19 27.33)", "--color-error-content": "oklch(14.79% 0.038 27.33)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, corporate: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(93% 0 0)", "--color-base-300": "oklch(86% 0 0)", "--color-base-content": "oklch(22.389% 0.031 278.072)", "--color-primary": "oklch(58% 0.158 241.966)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(55% 0.046 257.417)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(60% 0.118 184.704)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(0% 0 0)", "--color-neutral-content": "oklch(100% 0 0)", "--color-info": "oklch(60% 0.126 221.723)", "--color-info-content": "oklch(100% 0 0)", "--color-success": "oklch(62% 0.194 149.214)", "--color-success-content": "oklch(100% 0 0)", "--color-warning": "oklch(85% 0.199 91.936)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "0.25rem", "--radius-field": "0.25rem", "--radius-box": "0.25rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, pastel: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(98.462% 0.001 247.838)", "--color-base-300": "oklch(92.462% 0.001 247.838)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(90% 0.063 306.703)", "--color-primary-content": "oklch(49% 0.265 301.924)", "--color-secondary": "oklch(89% 0.058 10.001)", "--color-secondary-content": "oklch(51% 0.222 16.935)", "--color-accent": "oklch(90% 0.093 164.15)", "--color-accent-content": "oklch(50% 0.118 165.612)", "--color-neutral": "oklch(55% 0.046 257.417)", "--color-neutral-content": "oklch(92% 0.013 255.508)", "--color-info": "oklch(86% 0.127 207.078)", "--color-info-content": "oklch(52% 0.105 223.128)", "--color-success": "oklch(87% 0.15 154.449)", "--color-success-content": "oklch(52% 0.154 150.069)", "--color-warning": "oklch(83% 0.128 66.29)", "--color-warning-content": "oklch(55% 0.195 38.402)", "--color-error": "oklch(80% 0.114 19.571)", "--color-error-content": "oklch(50% 0.213 27.518)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "0", "--noise": "0" }, bumblebee: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97% 0 0)", "--color-base-300": "oklch(92% 0 0)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(85% 0.199 91.936)", "--color-primary-content": "oklch(42% 0.095 57.708)", "--color-secondary": "oklch(75% 0.183 55.934)", "--color-secondary-content": "oklch(40% 0.123 38.172)", "--color-accent": "oklch(0% 0 0)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(37% 0.01 67.558)", "--color-neutral-content": "oklch(92% 0.003 48.717)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(39% 0.09 240.876)", "--color-success": "oklch(76% 0.177 163.223)", "--color-success-content": "oklch(37% 0.077 168.94)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(39% 0.141 25.723)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, coffee: { "color-scheme": "dark", "--color-base-100": "oklch(24% 0.023 329.708)", "--color-base-200": "oklch(21% 0.021 329.708)", "--color-base-300": "oklch(16% 0.019 329.708)", "--color-base-content": "oklch(72.354% 0.092 79.129)", "--color-primary": "oklch(71.996% 0.123 62.756)", "--color-primary-content": "oklch(14.399% 0.024 62.756)", "--color-secondary": "oklch(34.465% 0.029 199.194)", "--color-secondary-content": "oklch(86.893% 0.005 199.194)", "--color-accent": "oklch(42.621% 0.074 224.389)", "--color-accent-content": "oklch(88.524% 0.014 224.389)", "--color-neutral": "oklch(16.51% 0.015 326.261)", "--color-neutral-content": "oklch(83.302% 0.003 326.261)", "--color-info": "oklch(79.49% 0.063 184.558)", "--color-info-content": "oklch(15.898% 0.012 184.558)", "--color-success": "oklch(74.722% 0.072 131.116)", "--color-success-content": "oklch(14.944% 0.014 131.116)", "--color-warning": "oklch(88.15% 0.14 87.722)", "--color-warning-content": "oklch(17.63% 0.028 87.722)", "--color-error": "oklch(77.318% 0.128 31.871)", "--color-error-content": "oklch(15.463% 0.025 31.871)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, silk: { "color-scheme": "light", "--color-base-100": "oklch(97% 0.0035 67.78)", "--color-base-200": "oklch(95% 0.0081 61.42)", "--color-base-300": "oklch(90% 0.0081 61.42)", "--color-base-content": "oklch(40% 0.0081 61.42)", "--color-primary": "oklch(23.27% 0.0249 284.3)", "--color-primary-content": "oklch(94.22% 0.2505 117.44)", "--color-secondary": "oklch(23.27% 0.0249 284.3)", "--color-secondary-content": "oklch(73.92% 0.2135 50.94)", "--color-accent": "oklch(23.27% 0.0249 284.3)", "--color-accent-content": "oklch(88.92% 0.2061 189.9)", "--color-neutral": "oklch(20% 0 0)", "--color-neutral-content": "oklch(80% 0.0081 61.42)", "--color-info": "oklch(80.39% 0.1148 241.68)", "--color-info-content": "oklch(30.39% 0.1148 241.68)", "--color-success": "oklch(83.92% 0.0901 136.87)", "--color-success-content": "oklch(23.92% 0.0901 136.87)", "--color-warning": "oklch(83.92% 0.1085 80)", "--color-warning-content": "oklch(43.92% 0.1085 80)", "--color-error": "oklch(75.1% 0.1814 22.37)", "--color-error-content": "oklch(35.1% 0.1814 22.37)", "--radius-selector": "2rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "1", "--noise": "0" }, sunset: { "color-scheme": "dark", "--color-base-100": "oklch(22% 0.019 237.69)", "--color-base-200": "oklch(20% 0.019 237.69)", "--color-base-300": "oklch(18% 0.019 237.69)", "--color-base-content": "oklch(77.383% 0.043 245.096)", "--color-primary": "oklch(74.703% 0.158 39.947)", "--color-primary-content": "oklch(14.94% 0.031 39.947)", "--color-secondary": "oklch(72.537% 0.177 2.72)", "--color-secondary-content": "oklch(14.507% 0.035 2.72)", "--color-accent": "oklch(71.294% 0.166 299.844)", "--color-accent-content": "oklch(14.258% 0.033 299.844)", "--color-neutral": "oklch(26% 0.019 237.69)", "--color-neutral-content": "oklch(70% 0.019 237.69)", "--color-info": "oklch(85.559% 0.085 206.015)", "--color-info-content": "oklch(17.111% 0.017 206.015)", "--color-success": "oklch(85.56% 0.085 144.778)", "--color-success-content": "oklch(17.112% 0.017 144.778)", "--color-warning": "oklch(85.569% 0.084 74.427)", "--color-warning-content": "oklch(17.113% 0.016 74.427)", "--color-error": "oklch(85.511% 0.078 16.886)", "--color-error-content": "oklch(17.102% 0.015 16.886)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, synthwave: { "color-scheme": "dark", "--color-base-100": "oklch(15% 0.09 281.288)", "--color-base-200": "oklch(20% 0.09 281.288)", "--color-base-300": "oklch(25% 0.09 281.288)", "--color-base-content": "oklch(78% 0.115 274.713)", "--color-primary": "oklch(71% 0.202 349.761)", "--color-primary-content": "oklch(28% 0.109 3.907)", "--color-secondary": "oklch(82% 0.111 230.318)", "--color-secondary-content": "oklch(29% 0.066 243.157)", "--color-accent": "oklch(75% 0.183 55.934)", "--color-accent-content": "oklch(26% 0.079 36.259)", "--color-neutral": "oklch(45% 0.24 277.023)", "--color-neutral-content": "oklch(87% 0.065 274.039)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(77% 0.152 181.912)", "--color-success-content": "oklch(27% 0.046 192.524)", "--color-warning": "oklch(90% 0.182 98.111)", "--color-warning-content": "oklch(42% 0.095 57.708)", "--color-error": "oklch(73.7% 0.121 32.639)", "--color-error-content": "oklch(23.501% 0.096 290.329)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, dim: { "color-scheme": "dark", "--color-base-100": "oklch(30.857% 0.023 264.149)", "--color-base-200": "oklch(28.036% 0.019 264.182)", "--color-base-300": "oklch(26.346% 0.018 262.177)", "--color-base-content": "oklch(82.901% 0.031 222.959)", "--color-primary": "oklch(86.133% 0.141 139.549)", "--color-primary-content": "oklch(17.226% 0.028 139.549)", "--color-secondary": "oklch(73.375% 0.165 35.353)", "--color-secondary-content": "oklch(14.675% 0.033 35.353)", "--color-accent": "oklch(74.229% 0.133 311.379)", "--color-accent-content": "oklch(14.845% 0.026 311.379)", "--color-neutral": "oklch(24.731% 0.02 264.094)", "--color-neutral-content": "oklch(82.901% 0.031 222.959)", "--color-info": "oklch(86.078% 0.142 206.182)", "--color-info-content": "oklch(17.215% 0.028 206.182)", "--color-success": "oklch(86.171% 0.142 166.534)", "--color-success-content": "oklch(17.234% 0.028 166.534)", "--color-warning": "oklch(86.163% 0.142 94.818)", "--color-warning-content": "oklch(17.232% 0.028 94.818)", "--color-error": "oklch(82.418% 0.099 33.756)", "--color-error-content": "oklch(16.483% 0.019 33.756)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, abyss: { "color-scheme": "dark", "--color-base-100": "oklch(20% 0.08 209)", "--color-base-200": "oklch(15% 0.08 209)", "--color-base-300": "oklch(10% 0.08 209)", "--color-base-content": "oklch(90% 0.076 70.697)", "--color-primary": "oklch(92% 0.2653 125)", "--color-primary-content": "oklch(50% 0.2653 125)", "--color-secondary": "oklch(83.27% 0.0764 298.3)", "--color-secondary-content": "oklch(43.27% 0.0764 298.3)", "--color-accent": "oklch(43% 0 0)", "--color-accent-content": "oklch(98% 0 0)", "--color-neutral": "oklch(30% 0.08 209)", "--color-neutral-content": "oklch(90% 0.076 70.697)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(79% 0.209 151.711)", "--color-success-content": "oklch(26% 0.065 152.934)", "--color-warning": "oklch(84.8% 0.1962 84.62)", "--color-warning-content": "oklch(44.8% 0.1962 84.62)", "--color-error": "oklch(65% 0.1985 24.22)", "--color-error-content": "oklch(27% 0.1985 24.22)", "--radius-selector": "2rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, forest: { "color-scheme": "dark", "--color-base-100": "oklch(20.84% 0.008 17.911)", "--color-base-200": "oklch(18.522% 0.007 17.911)", "--color-base-300": "oklch(16.203% 0.007 17.911)", "--color-base-content": "oklch(83.768% 0.001 17.911)", "--color-primary": "oklch(68.628% 0.185 148.958)", "--color-primary-content": "oklch(0% 0 0)", "--color-secondary": "oklch(69.776% 0.135 168.327)", "--color-secondary-content": "oklch(13.955% 0.027 168.327)", "--color-accent": "oklch(70.628% 0.119 185.713)", "--color-accent-content": "oklch(14.125% 0.023 185.713)", "--color-neutral": "oklch(30.698% 0.039 171.364)", "--color-neutral-content": "oklch(86.139% 0.007 171.364)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, night: { "color-scheme": "dark", "--color-base-100": "oklch(20.768% 0.039 265.754)", "--color-base-200": "oklch(19.314% 0.037 265.754)", "--color-base-300": "oklch(17.86% 0.034 265.754)", "--color-base-content": "oklch(84.153% 0.007 265.754)", "--color-primary": "oklch(75.351% 0.138 232.661)", "--color-primary-content": "oklch(15.07% 0.027 232.661)", "--color-secondary": "oklch(68.011% 0.158 276.934)", "--color-secondary-content": "oklch(13.602% 0.031 276.934)", "--color-accent": "oklch(72.36% 0.176 350.048)", "--color-accent-content": "oklch(14.472% 0.035 350.048)", "--color-neutral": "oklch(27.949% 0.036 260.03)", "--color-neutral-content": "oklch(85.589% 0.007 260.03)", "--color-info": "oklch(68.455% 0.148 237.251)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(78.452% 0.132 181.911)", "--color-success-content": "oklch(15.69% 0.026 181.911)", "--color-warning": "oklch(83.242% 0.139 82.95)", "--color-warning-content": "oklch(16.648% 0.027 82.95)", "--color-error": "oklch(71.785% 0.17 13.118)", "--color-error-content": "oklch(14.357% 0.034 13.118)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, caramellatte: { "color-scheme": "light", "--color-base-100": "oklch(98% 0.016 73.684)", "--color-base-200": "oklch(95% 0.038 75.164)", "--color-base-300": "oklch(90% 0.076 70.697)", "--color-base-content": "oklch(40% 0.123 38.172)", "--color-primary": "oklch(0% 0 0)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(22.45% 0.075 37.85)", "--color-secondary-content": "oklch(90% 0.076 70.697)", "--color-accent": "oklch(46.44% 0.111 37.85)", "--color-accent-content": "oklch(90% 0.076 70.697)", "--color-neutral": "oklch(55% 0.195 38.402)", "--color-neutral-content": "oklch(98% 0.016 73.684)", "--color-info": "oklch(42% 0.199 265.638)", "--color-info-content": "oklch(90% 0.076 70.697)", "--color-success": "oklch(43% 0.095 166.913)", "--color-success-content": "oklch(90% 0.076 70.697)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(39% 0.141 25.723)", "--radius-selector": "2rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "1", "--noise": "1" }, autumn: { "color-scheme": "light", "--color-base-100": "oklch(95.814% 0 0)", "--color-base-200": "oklch(89.107% 0 0)", "--color-base-300": "oklch(82.4% 0 0)", "--color-base-content": "oklch(19.162% 0 0)", "--color-primary": "oklch(40.723% 0.161 17.53)", "--color-primary-content": "oklch(88.144% 0.032 17.53)", "--color-secondary": "oklch(61.676% 0.169 23.865)", "--color-secondary-content": "oklch(12.335% 0.033 23.865)", "--color-accent": "oklch(73.425% 0.094 60.729)", "--color-accent-content": "oklch(14.685% 0.018 60.729)", "--color-neutral": "oklch(54.367% 0.037 51.902)", "--color-neutral-content": "oklch(90.873% 0.007 51.902)", "--color-info": "oklch(69.224% 0.097 207.284)", "--color-info-content": "oklch(13.844% 0.019 207.284)", "--color-success": "oklch(60.995% 0.08 174.616)", "--color-success-content": "oklch(12.199% 0.016 174.616)", "--color-warning": "oklch(70.081% 0.164 56.844)", "--color-warning-content": "oklch(14.016% 0.032 56.844)", "--color-error": "oklch(53.07% 0.241 24.16)", "--color-error-content": "oklch(90.614% 0.048 24.16)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, emerald: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(93% 0 0)", "--color-base-300": "oklch(86% 0 0)", "--color-base-content": "oklch(35.519% 0.032 262.988)", "--color-primary": "oklch(76.662% 0.135 153.45)", "--color-primary-content": "oklch(33.387% 0.04 162.24)", "--color-secondary": "oklch(61.302% 0.202 261.294)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(72.772% 0.149 33.2)", "--color-accent-content": "oklch(0% 0 0)", "--color-neutral": "oklch(35.519% 0.032 262.988)", "--color-neutral-content": "oklch(98.462% 0.001 247.838)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, cupcake: { "color-scheme": "light", "--color-base-100": "oklch(97.788% 0.004 56.375)", "--color-base-200": "oklch(93.982% 0.007 61.449)", "--color-base-300": "oklch(91.586% 0.006 53.44)", "--color-base-content": "oklch(23.574% 0.066 313.189)", "--color-primary": "oklch(85% 0.138 181.071)", "--color-primary-content": "oklch(43% 0.078 188.216)", "--color-secondary": "oklch(89% 0.061 343.231)", "--color-secondary-content": "oklch(45% 0.187 3.815)", "--color-accent": "oklch(90% 0.076 70.697)", "--color-accent-content": "oklch(47% 0.157 37.304)", "--color-neutral": "oklch(27% 0.006 286.033)", "--color-neutral-content": "oklch(92% 0.004 286.32)", "--color-info": "oklch(68% 0.169 237.323)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(69% 0.17 162.48)", "--color-success-content": "oklch(26% 0.051 172.552)", "--color-warning": "oklch(79% 0.184 86.047)", "--color-warning-content": "oklch(28% 0.066 53.813)", "--color-error": "oklch(64% 0.246 16.439)", "--color-error-content": "oklch(27% 0.105 12.094)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "1", "--noise": "0" }, cmyk: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(95% 0 0)", "--color-base-300": "oklch(90% 0 0)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(71.772% 0.133 239.443)", "--color-primary-content": "oklch(14.354% 0.026 239.443)", "--color-secondary": "oklch(64.476% 0.202 359.339)", "--color-secondary-content": "oklch(12.895% 0.04 359.339)", "--color-accent": "oklch(94.228% 0.189 105.306)", "--color-accent-content": "oklch(18.845% 0.037 105.306)", "--color-neutral": "oklch(21.778% 0 0)", "--color-neutral-content": "oklch(84.355% 0 0)", "--color-info": "oklch(68.475% 0.094 217.284)", "--color-info-content": "oklch(13.695% 0.018 217.284)", "--color-success": "oklch(46.949% 0.162 321.406)", "--color-success-content": "oklch(89.389% 0.032 321.406)", "--color-warning": "oklch(71.236% 0.159 52.023)", "--color-warning-content": "oklch(14.247% 0.031 52.023)", "--color-error": "oklch(62.013% 0.208 28.717)", "--color-error-content": "oklch(12.402% 0.041 28.717)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, business: { "color-scheme": "dark", "--color-base-100": "oklch(24.353% 0 0)", "--color-base-200": "oklch(22.648% 0 0)", "--color-base-300": "oklch(20.944% 0 0)", "--color-base-content": "oklch(84.87% 0 0)", "--color-primary": "oklch(41.703% 0.099 251.473)", "--color-primary-content": "oklch(88.34% 0.019 251.473)", "--color-secondary": "oklch(64.092% 0.027 229.389)", "--color-secondary-content": "oklch(12.818% 0.005 229.389)", "--color-accent": "oklch(67.271% 0.167 35.791)", "--color-accent-content": "oklch(13.454% 0.033 35.791)", "--color-neutral": "oklch(27.441% 0.013 253.041)", "--color-neutral-content": "oklch(85.488% 0.002 253.041)", "--color-info": "oklch(62.616% 0.143 240.033)", "--color-info-content": "oklch(12.523% 0.028 240.033)", "--color-success": "oklch(70.226% 0.094 156.596)", "--color-success-content": "oklch(14.045% 0.018 156.596)", "--color-warning": "oklch(77.482% 0.115 81.519)", "--color-warning-content": "oklch(15.496% 0.023 81.519)", "--color-error": "oklch(51.61% 0.146 29.674)", "--color-error-content": "oklch(90.322% 0.029 29.674)", "--radius-selector": "0rem", "--radius-field": "0.25rem", "--radius-box": "0.25rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, winter: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97.466% 0.011 259.822)", "--color-base-300": "oklch(93.268% 0.016 262.751)", "--color-base-content": "oklch(41.886% 0.053 255.824)", "--color-primary": "oklch(56.86% 0.255 257.57)", "--color-primary-content": "oklch(91.372% 0.051 257.57)", "--color-secondary": "oklch(42.551% 0.161 282.339)", "--color-secondary-content": "oklch(88.51% 0.032 282.339)", "--color-accent": "oklch(59.939% 0.191 335.171)", "--color-accent-content": "oklch(11.988% 0.038 335.171)", "--color-neutral": "oklch(19.616% 0.063 257.651)", "--color-neutral-content": "oklch(83.923% 0.012 257.651)", "--color-info": "oklch(88.127% 0.085 214.515)", "--color-info-content": "oklch(17.625% 0.017 214.515)", "--color-success": "oklch(80.494% 0.077 197.823)", "--color-success-content": "oklch(16.098% 0.015 197.823)", "--color-warning": "oklch(89.172% 0.045 71.47)", "--color-warning-content": "oklch(17.834% 0.009 71.47)", "--color-error": "oklch(73.092% 0.11 20.076)", "--color-error-content": "oklch(14.618% 0.022 20.076)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, halloween: { "color-scheme": "dark", "--color-base-100": "oklch(21% 0.006 56.043)", "--color-base-200": "oklch(14% 0.004 49.25)", "--color-base-300": "oklch(0% 0 0)", "--color-base-content": "oklch(84.955% 0 0)", "--color-primary": "oklch(77.48% 0.204 60.62)", "--color-primary-content": "oklch(19.693% 0.004 196.779)", "--color-secondary": "oklch(45.98% 0.248 305.03)", "--color-secondary-content": "oklch(89.196% 0.049 305.03)", "--color-accent": "oklch(64.8% 0.223 136.073)", "--color-accent-content": "oklch(0% 0 0)", "--color-neutral": "oklch(24.371% 0.046 65.681)", "--color-neutral-content": "oklch(84.874% 0.009 65.681)", "--color-info": "oklch(54.615% 0.215 262.88)", "--color-info-content": "oklch(90.923% 0.043 262.88)", "--color-success": "oklch(62.705% 0.169 149.213)", "--color-success-content": "oklch(12.541% 0.033 149.213)", "--color-warning": "oklch(66.584% 0.157 58.318)", "--color-warning-content": "oklch(13.316% 0.031 58.318)", "--color-error": "oklch(65.72% 0.199 27.33)", "--color-error-content": "oklch(13.144% 0.039 27.33)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, fantasy: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(93% 0 0)", "--color-base-300": "oklch(86% 0 0)", "--color-base-content": "oklch(27.807% 0.029 256.847)", "--color-primary": "oklch(37.45% 0.189 325.02)", "--color-primary-content": "oklch(87.49% 0.037 325.02)", "--color-secondary": "oklch(53.92% 0.162 241.36)", "--color-secondary-content": "oklch(90.784% 0.032 241.36)", "--color-accent": "oklch(75.98% 0.204 56.72)", "--color-accent-content": "oklch(15.196% 0.04 56.72)", "--color-neutral": "oklch(27.807% 0.029 256.847)", "--color-neutral-content": "oklch(85.561% 0.005 256.847)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, wireframe: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97% 0 0)", "--color-base-300": "oklch(94% 0 0)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(87% 0 0)", "--color-primary-content": "oklch(26% 0 0)", "--color-secondary": "oklch(87% 0 0)", "--color-secondary-content": "oklch(26% 0 0)", "--color-accent": "oklch(87% 0 0)", "--color-accent-content": "oklch(26% 0 0)", "--color-neutral": "oklch(87% 0 0)", "--color-neutral-content": "oklch(26% 0 0)", "--color-info": "oklch(44% 0.11 240.79)", "--color-info-content": "oklch(90% 0.058 230.902)", "--color-success": "oklch(43% 0.095 166.913)", "--color-success-content": "oklch(90% 0.093 164.15)", "--color-warning": "oklch(47% 0.137 46.201)", "--color-warning-content": "oklch(92% 0.12 95.746)", "--color-error": "oklch(44% 0.177 26.899)", "--color-error-content": "oklch(88% 0.062 18.334)", "--radius-selector": "0rem", "--radius-field": "0.25rem", "--radius-box": "0.25rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" } }; + +// packages/daisyui/base/rootscrolllock/object.js +var object_default2 = { ':root:has( .modal-open, .modal[open], .modal:target, .modal-toggle:checked, .drawer:not([class*="drawer-open"]) > .drawer-toggle:checked )': { overflow: "hidden" } }; + +// packages/daisyui/functions/addPrefix.js +var defaultExcludedPrefixes = ["color-", "size-", "radius-", "border", "depth", "noise"]; +var shouldExcludeVariable = (variableName, excludedPrefixes) => { + if (variableName.startsWith("tw")) { + return true; + } + return excludedPrefixes.some((excludedPrefix) => variableName.startsWith(excludedPrefix)); +}; +var prefixVariable = (variableName, prefix, excludedPrefixes) => { + if (shouldExcludeVariable(variableName, excludedPrefixes)) { + return variableName; + } + return `${prefix}${variableName}`; +}; +var getPrefixedSelector = (selector, prefix) => { + if (!selector.startsWith(".")) + return selector; + return `.${prefix}${selector.slice(1)}`; +}; +var getPrefixedKey = (key, prefix, excludedPrefixes) => { + const prefixAmpDot = prefix ? `&.${prefix}` : ""; + if (!prefix) + return key; + if (key.startsWith("--")) { + const variableName = key.slice(2); + return `--${prefixVariable(variableName, prefix, excludedPrefixes)}`; + } + if (key.startsWith("@") || key.startsWith("[")) { + return key; + } + if (key.startsWith("&")) { + if (key.match(/:[a-z-]+\(/)) { + return key.replace(/\.([\w-]+)/g, `.${prefix}$1`); + } + if (key.startsWith("&.")) { + return `${prefixAmpDot}${key.slice(2)}`; + } + return key.replace(/\.([\w-]+)/g, `.${prefix}$1`); + } + if (key.startsWith(":")) { + return key.replace(/\.([\w-]+)/g, `.${prefix}$1`); + } + if (key.includes(".") && !key.includes(" ") && !key.includes(">") && !key.includes("+") && !key.includes("~")) { + return key.split(".").filter(Boolean).map((part) => prefix + part).join(".").replace(/^/, "."); + } + if (key.includes(">") || key.includes("+") || key.includes("~")) { + if (key.includes(",")) { + return key.split(/\s*,\s*/).map((part) => { + return part.replace(/\.([\w-]+)/g, `.${prefix}$1`); + }).join(", "); + } + let processedKey = key.replace(/\.([\w-]+)/g, `.${prefix}$1`); + if (processedKey.startsWith(">") || processedKey.startsWith("+") || processedKey.startsWith("~")) { + processedKey = ` ${processedKey}`; + } + return processedKey; + } + if (key.includes(" ")) { + return key.split(/\s+/).map((part) => { + if (part.startsWith(".")) { + return getPrefixedSelector(part, prefix); + } + return part; + }).join(" "); + } + if (key.includes(":")) { + const [selector, ...pseudo] = key.split(":"); + if (selector.startsWith(".")) { + return `${getPrefixedSelector(selector, prefix)}:${pseudo.join(":")}`; + } + return key.replace(/\.([\w-]+)/g, `.${prefix}$1`); + } + if (key.startsWith(".")) { + return getPrefixedSelector(key, prefix); + } + return key; +}; +var processArrayValue = (value, prefix, excludedPrefixes) => { + return value.map((item) => { + if (typeof item === "string") { + if (item.startsWith(".")) { + return prefix ? `.${prefix}${item.slice(1)}` : item; + } + return processStringValue(item, prefix, excludedPrefixes); + } + return item; + }); +}; +var processStringValue = (value, prefix, excludedPrefixes) => { + if (prefix === 0) + return value; + return value.replace(/var\(--([^)]+)\)/g, (match, variableName) => { + if (shouldExcludeVariable(variableName, excludedPrefixes)) { + return match; + } + return `var(--${prefix}${variableName})`; + }); +}; +var processValue = (value, prefix, excludedPrefixes) => { + if (Array.isArray(value)) { + return processArrayValue(value, prefix, excludedPrefixes); + } else if (typeof value === "object" && value !== null) { + return addPrefix(value, prefix, excludedPrefixes); + } else if (typeof value === "string") { + return processStringValue(value, prefix, excludedPrefixes); + } else { + return value; + } +}; +var addPrefix = (obj, prefix, excludedPrefixes = defaultExcludedPrefixes) => { + return Object.entries(obj).reduce((result, [key, value]) => { + const newKey = getPrefixedKey(key, prefix, excludedPrefixes); + result[newKey] = processValue(value, prefix, excludedPrefixes); + return result; + }, {}); +}; + +// packages/daisyui/base/rootscrolllock/index.js +var rootscrolllock_default = ({ addBase, prefix = "" }) => { + const prefixedrootscrolllock = addPrefix(object_default2, prefix); + addBase({ ...prefixedrootscrolllock }); +}; + +// packages/daisyui/base/rootcolor/object.js +var object_default3 = { ":root, [data-theme]": { "background-color": "var(--root-bg, var(--color-base-100))", color: "var(--color-base-content)" } }; + +// packages/daisyui/base/rootcolor/index.js +var rootcolor_default = ({ addBase, prefix = "" }) => { + const prefixedrootcolor = addPrefix(object_default3, prefix); + addBase({ ...prefixedrootcolor }); +}; + +// packages/daisyui/base/scrollbar/object.js +var object_default4 = { ":root": { "scrollbar-color": "color-mix(in oklch, currentColor 35%, #0000) #0000" } }; + +// packages/daisyui/base/scrollbar/index.js +var scrollbar_default = ({ addBase, prefix = "" }) => { + const prefixedscrollbar = addPrefix(object_default4, prefix); + addBase({ ...prefixedscrollbar }); +}; + +// packages/daisyui/base/properties/object.js +var object_default5 = { "@property --radialprogress": { syntax: '""', inherits: "true", "initial-value": "0%" } }; + +// packages/daisyui/base/properties/index.js +var properties_default = ({ addBase, prefix = "" }) => { + const prefixedproperties = addPrefix(object_default5, prefix); + addBase({ ...prefixedproperties }); +}; + +// packages/daisyui/base/rootscrollgutter/object.js +var object_default6 = { ":where( :root:has( .modal-open, .modal[open], .modal:target, .modal-toggle:checked, .drawer:not(.drawer-open) > .drawer-toggle:checked ) )": { "scrollbar-gutter": "stable", "background-image": "linear-gradient(var(--color-base-100), var(--color-base-100))", "--root-bg": "color-mix(in srgb, var(--color-base-100), oklch(0% 0 0) 40%)" }, ":where(.modal[open], .modal-open, .modal-toggle:checked + .modal):not(.modal-start, .modal-end)": { "scrollbar-gutter": "stable" } }; + +// packages/daisyui/base/rootscrollgutter/index.js +var rootscrollgutter_default = ({ addBase, prefix = "" }) => { + const prefixedrootscrollgutter = addPrefix(object_default6, prefix); + addBase({ ...prefixedrootscrollgutter }); +}; + +// packages/daisyui/base/svg/object.js +var object_default7 = { ":root": { "--fx-noise": `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E")` }, ".chat": { "--mask-chat": `url("data:image/svg+xml,%3csvg width='13' height='13' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M0 11.5004C0 13.0004 2 13.0004 2 13.0004H12H13V0.00036329L12.5 0C12.5 0 11.977 2.09572 11.8581 2.50033C11.6075 3.35237 10.9149 4.22374 9 5.50036C6 7.50036 0 10.0004 0 11.5004Z'/%3e%3c/svg%3e")` } }; + +// packages/daisyui/base/svg/index.js +var svg_default = ({ addBase, prefix = "" }) => { + const prefixedsvg = addPrefix(object_default7, prefix); + addBase({ ...prefixedsvg }); +}; + +// packages/daisyui/components/drawer/object.js +var object_default8 = { ".drawer": { position: "relative", display: "grid", width: "100%", "grid-auto-columns": "max-content auto" }, ".drawer-content": { "grid-column-start": "2", "grid-row-start": "1", "min-width": "calc(0.25rem * 0)" }, ".drawer-side": { "pointer-events": "none", visibility: "hidden", position: "fixed", "inset-inline-start": "calc(0.25rem * 0)", top: "calc(0.25rem * 0)", "z-index": 1, "grid-column-start": "1", "grid-row-start": "1", display: "grid", width: "100%", "grid-template-columns": "repeat(1, minmax(0, 1fr))", "grid-template-rows": "repeat(1, minmax(0, 1fr))", "align-items": "flex-start", "justify-items": "start", "overflow-x": "hidden", "overflow-y": "hidden", "overscroll-behavior": "contain", opacity: "0%", transition: "opacity 0.2s ease-out 0.1s allow-discrete, visibility 0.3s ease-out 0.1s allow-discrete", height: ["100vh", "100dvh"], "> .drawer-overlay": { position: "sticky", top: "calc(0.25rem * 0)", cursor: "pointer", "place-self": "stretch", "background-color": "oklch(0% 0 0 / 40%)" }, "> *": { "grid-column-start": "1", "grid-row-start": "1" }, "> *:not(.drawer-overlay)": { "will-change": "transform", transition: "translate 0.3s ease-out", translate: "-100%", '[dir="rtl"] &': { translate: "100%" } } }, ".drawer-toggle": { position: "fixed", height: "calc(0.25rem * 0)", width: "calc(0.25rem * 0)", appearance: "none", opacity: "0%", "&:checked": { "& ~ .drawer-side": { "pointer-events": "auto", visibility: "visible", "overflow-y": "auto", opacity: "100%", "& > *:not(.drawer-overlay)": { translate: "0%" } } }, "&:focus-visible ~ .drawer-content label.drawer-button": { outline: "2px solid", "outline-offset": "2px" } }, ".drawer-end": { "grid-auto-columns": "auto max-content", "> .drawer-toggle": { "& ~ .drawer-content": { "grid-column-start": "1" }, "& ~ .drawer-side": { "grid-column-start": "2", "justify-items": "end" }, "& ~ .drawer-side > *:not(.drawer-overlay)": { translate: "100%", '[dir="rtl"] &': { translate: "-100%" } }, "&:checked ~ .drawer-side > *:not(.drawer-overlay)": { translate: "0%" } } }, ".drawer-open": { "> .drawer-side": { "overflow-y": "auto" }, "> .drawer-toggle": { display: "none", "& ~ .drawer-side": { "pointer-events": "auto", visibility: "visible", position: "sticky", display: "block", width: "auto", "overscroll-behavior": "auto", opacity: "100%", "& > .drawer-overlay": { cursor: "default", "background-color": "transparent" }, "& > *:not(.drawer-overlay)": { translate: "0%", '[dir="rtl"] &': { translate: "0%" } } }, "&:checked ~ .drawer-side": { "pointer-events": "auto", visibility: "visible" } } } }; + +// packages/daisyui/components/drawer/index.js +var drawer_default = ({ addComponents, prefix = "" }) => { + const prefixeddrawer = addPrefix(object_default8, prefix); + addComponents({ ...prefixeddrawer }); +}; + +// packages/daisyui/components/link/object.js +var object_default9 = { ".link": { cursor: "pointer", "text-decoration-line": "underline", "&:focus": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:focus-visible": { outline: "2px solid currentColor", "outline-offset": "2px" } }, ".link-hover": { "text-decoration-line": "none", "&:hover": { "@media (hover: hover)": { "text-decoration-line": "underline" } } }, ".link-primary": { color: "var(--color-primary)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-primary) 80%, #000)" } } }, ".link-secondary": { color: "var(--color-secondary)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-secondary) 80%, #000)" } } }, ".link-accent": { color: "var(--color-accent)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-accent) 80%, #000)" } } }, ".link-neutral": { color: "var(--color-neutral)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-neutral) 80%, #000)" } } }, ".link-success": { color: "var(--color-success)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-success) 80%, #000)" } } }, ".link-info": { color: "var(--color-info)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-info) 80%, #000)" } } }, ".link-warning": { color: "var(--color-warning)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-warning) 80%, #000)" } } }, ".link-error": { color: "var(--color-error)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-error) 80%, #000)" } } } }; + +// packages/daisyui/components/link/index.js +var link_default = ({ addComponents, prefix = "" }) => { + const prefixedlink = addPrefix(object_default9, prefix); + addComponents({ ...prefixedlink }); +}; + +// packages/daisyui/components/stat/object.js +var object_default10 = { ".stats": { position: "relative", display: "inline-grid", "grid-auto-flow": "column", "overflow-x": "auto", "border-radius": "var(--radius-box)" }, ".stat": { display: "inline-grid", width: "100%", "column-gap": "calc(0.25rem * 4)", "padding-inline": "calc(0.25rem * 6)", "padding-block": "calc(0.25rem * 4)", "grid-template-columns": "repeat(1, 1fr)", "&:not(:last-child)": { "border-inline-end": "var(--border) dashed color-mix(in oklab, currentColor 10%, #0000)", "border-block-end": "none" } }, ".stat-figure": { "grid-column-start": "2", "grid-row": "span 3 / span 3", "grid-row-start": "1", "place-self": "center", "justify-self": "flex-end" }, ".stat-title": { "grid-column-start": "1", "white-space": "nowrap", color: "color-mix(in oklab, var(--color-base-content) 60%, transparent)", "font-size": "0.75rem" }, ".stat-value": { "grid-column-start": "1", "white-space": "nowrap", "font-size": "2rem", "font-weight": 800 }, ".stat-desc": { "grid-column-start": "1", "white-space": "nowrap", color: "color-mix(in oklab, var(--color-base-content) 60%, transparent)", "font-size": "0.75rem" }, ".stat-actions": { "grid-column-start": "1", "white-space": "nowrap" }, ".stats-horizontal": { "grid-auto-flow": "column", "overflow-x": "auto", ".stat:not(:last-child)": { "border-inline-end": "var(--border) dashed color-mix(in oklab, currentColor 10%, #0000)", "border-block-end": "none" } }, ".stats-vertical": { "grid-auto-flow": "row", "overflow-y": "auto", ".stat:not(:last-child)": { "border-inline-end": "none", "border-block-end": "var(--border) dashed color-mix(in oklab, currentColor 10%, #0000)" } } }; + +// packages/daisyui/components/stat/index.js +var stat_default = ({ addComponents, prefix = "" }) => { + const prefixedstat = addPrefix(object_default10, prefix); + addComponents({ ...prefixedstat }); +}; + +// packages/daisyui/components/carousel/object.js +var object_default11 = { ".carousel": { display: "inline-flex", "overflow-x": "scroll", "scroll-snap-type": "x mandatory", "scroll-behavior": "smooth", "scrollbar-width": "none", "&::-webkit-scrollbar": { display: "none" } }, ".carousel-vertical": { "flex-direction": "column", "overflow-y": "scroll", "scroll-snap-type": "y mandatory" }, ".carousel-horizontal": { "flex-direction": "row", "overflow-x": "scroll", "scroll-snap-type": "x mandatory" }, ".carousel-item": { "box-sizing": "content-box", display: "flex", flex: "none", "scroll-snap-align": "start" }, ".carousel-start": { ".carousel-item": { "scroll-snap-align": "start" } }, ".carousel-center": { ".carousel-item": { "scroll-snap-align": "center" } }, ".carousel-end": { ".carousel-item": { "scroll-snap-align": "end" } } }; + +// packages/daisyui/components/carousel/index.js +var carousel_default = ({ addComponents, prefix = "" }) => { + const prefixedcarousel = addPrefix(object_default11, prefix); + addComponents({ ...prefixedcarousel }); +}; + +// packages/daisyui/components/divider/object.js +var object_default12 = { ".divider": { display: "flex", height: "calc(0.25rem * 4)", "flex-direction": "row", "align-items": "center", "align-self": "stretch", "white-space": "nowrap", margin: "var(--divider-m, 1rem 0)", "--divider-color": "color-mix(in oklab, var(--color-base-content) 10%, transparent)", "&:before, &:after": { content: '""', height: "calc(0.25rem * 0.5)", width: "100%", "flex-grow": 1, "background-color": "var(--divider-color)" }, "@media print": { "&:before, &:after": { border: "0.5px solid" } }, "&:not(:empty)": { gap: "calc(0.25rem * 4)" } }, ".divider-horizontal": { "--divider-m": "0 1rem", "&.divider": { height: "auto", width: "calc(0.25rem * 4)", "flex-direction": "column", "&:before": { height: "100%", width: "calc(0.25rem * 0.5)" }, "&:after": { height: "100%", width: "calc(0.25rem * 0.5)" } } }, ".divider-vertical": { "--divider-m": "1rem 0", "&.divider": { height: "calc(0.25rem * 4)", width: "auto", "flex-direction": "row", "&:before": { height: "calc(0.25rem * 0.5)", width: "100%" }, "&:after": { height: "calc(0.25rem * 0.5)", width: "100%" } } }, ".divider-neutral": { "&:before, &:after": { "background-color": "var(--color-neutral)" } }, ".divider-primary": { "&:before, &:after": { "background-color": "var(--color-primary)" } }, ".divider-secondary": { "&:before, &:after": { "background-color": "var(--color-secondary)" } }, ".divider-accent": { "&:before, &:after": { "background-color": "var(--color-accent)" } }, ".divider-success": { "&:before, &:after": { "background-color": "var(--color-success)" } }, ".divider-warning": { "&:before, &:after": { "background-color": "var(--color-warning)" } }, ".divider-info": { "&:before, &:after": { "background-color": "var(--color-info)" } }, ".divider-error": { "&:before, &:after": { "background-color": "var(--color-error)" } }, ".divider-start:before": { display: "none" }, ".divider-end:after": { display: "none" } }; + +// packages/daisyui/components/divider/index.js +var divider_default = ({ addComponents, prefix = "" }) => { + const prefixeddivider = addPrefix(object_default12, prefix); + addComponents({ ...prefixeddivider }); +}; + +// packages/daisyui/components/mask/object.js +var object_default13 = { ".mask": { display: "inline-block", "vertical-align": "middle", "mask-size": "contain", "mask-repeat": "no-repeat", "mask-position": "center" }, ".mask-half-1": { "mask-size": "200%", "mask-position": ["left", "left"], '&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *)': { "mask-position": "right" } }, ".mask-half-2": { "mask-size": "200%", "mask-position": ["right", "right"], '&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *)': { "mask-position": "left" } }, ".mask-squircle": { "mask-image": `url("data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M100 0C20 0 0 20 0 100s20 100 100 100 100-20 100-100S180 0 100 0Z'/%3e%3c/svg%3e")` }, ".mask-decagon": { "mask-image": `url("data:image/svg+xml,%3csvg width='192' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 0 58.779 19.098 36.327 50v61.804l-36.327 50L96 200l-58.779-19.098-36.327-50V69.098l36.327-50z' fill-rule='evenodd'/%3e%3c/svg%3e")` }, ".mask-diamond": { "mask-image": `url("data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m100 0 100 100-100 100L0 100z' fill-rule='evenodd'/%3e%3c/svg%3e")` }, ".mask-heart": { "mask-image": `url("data:image/svg+xml,%3csvg width='200' height='185' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M100 184.606a15.384 15.384 0 0 1-8.653-2.678C53.565 156.28 37.205 138.695 28.182 127.7 8.952 104.264-.254 80.202.005 54.146.308 24.287 24.264 0 53.406 0c21.192 0 35.869 11.937 44.416 21.879a2.884 2.884 0 0 0 4.356 0C110.725 11.927 125.402 0 146.594 0c29.142 0 53.098 24.287 53.4 54.151.26 26.061-8.956 50.122-28.176 73.554-9.023 10.994-25.383 28.58-63.165 54.228a15.384 15.384 0 0 1-8.653 2.673Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e")` }, ".mask-hexagon": { "mask-image": `url("data:image/svg+xml,%3csvg width='182' height='201' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M.3 65.486c0-9.196 6.687-20.063 14.211-25.078l61.86-35.946c8.36-5.016 20.899-5.016 29.258 0l61.86 35.946c8.36 5.015 14.211 15.882 14.211 25.078v71.055c0 9.196-6.687 20.063-14.211 25.079l-61.86 35.945c-8.36 4.18-20.899 4.18-29.258 0L14.51 161.62C6.151 157.44.3 145.737.3 136.54V65.486Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e")` }, ".mask-hexagon-2": { "mask-image": `url("data:image/svg+xml,%3csvg width='200' height='182' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M64.786 181.4c-9.196 0-20.063-6.687-25.079-14.21L3.762 105.33c-5.016-8.36-5.016-20.9 0-29.259l35.945-61.86C44.723 5.851 55.59 0 64.786 0h71.055c9.196 0 20.063 6.688 25.079 14.211l35.945 61.86c4.18 8.36 4.18 20.899 0 29.258l-35.945 61.86c-4.18 8.36-15.883 14.211-25.079 14.211H64.786Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e")` }, ".mask-circle": { "mask-image": `url("data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle fill='black' cx='100' cy='100' r='100' fill-rule='evenodd'/%3e%3c/svg%3e")` }, ".mask-pentagon": { "mask-image": `url("data:image/svg+xml,%3csvg width='192' height='181' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 0 95.106 69.098-36.327 111.804H37.22L.894 69.098z' fill-rule='evenodd'/%3e%3c/svg%3e")` }, ".mask-star": { "mask-image": `url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 137.263-58.779 42.024 22.163-68.389L.894 68.481l72.476-.243L96 0l22.63 68.238 72.476.243-58.49 42.417 22.163 68.389z' fill-rule='evenodd'/%3e%3c/svg%3e")` }, ".mask-star-2": { "mask-image": `url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 153.044-58.779 26.243 7.02-63.513L.894 68.481l63.117-13.01L96 0l31.989 55.472 63.117 13.01-43.347 47.292 7.02 63.513z' fill-rule='evenodd'/%3e%3c/svg%3e")` }, ".mask-triangle": { "mask-image": `url("data:image/svg+xml,%3csvg width='174' height='149' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m87 148.476-86.603.185L43.86 74.423 87 0l43.14 74.423 43.463 74.238z' fill-rule='evenodd'/%3e%3c/svg%3e")` }, ".mask-triangle-2": { "mask-image": `url("data:image/svg+xml,%3csvg width='174' height='150' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m87 .738 86.603-.184-43.463 74.238L87 149.214 43.86 74.792.397.554z' fill-rule='evenodd'/%3e%3c/svg%3e")` }, ".mask-triangle-3": { "mask-image": `url("data:image/svg+xml,%3csvg width='150' height='174' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m149.369 87.107.185 86.603-74.239-43.463L.893 87.107l74.422-43.14L149.554.505z' fill-rule='evenodd'/%3e%3c/svg%3e")` }, ".mask-triangle-4": { "mask-image": `url("data:image/svg+xml,%3csvg width='150' height='174' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M.631 87.107.446.505l74.239 43.462 74.422 43.14-74.422 43.14L.446 173.71z' fill-rule='evenodd'/%3e%3c/svg%3e")` } }; + +// packages/daisyui/components/mask/index.js +var mask_default = ({ addComponents, prefix = "" }) => { + const prefixedmask = addPrefix(object_default13, prefix); + addComponents({ ...prefixedmask }); +}; + +// packages/daisyui/components/fieldset/object.js +var object_default14 = { ".fieldset": { display: "grid", gap: "calc(0.25rem * 1.5)", "padding-block": "calc(0.25rem * 1)", "font-size": "0.75rem", "grid-template-columns": "1fr", "grid-auto-rows": "max-content" }, ".fieldset-legend": { "margin-bottom": "calc(0.25rem * -1)", display: "flex", "align-items": "center", "justify-content": "space-between", gap: "calc(0.25rem * 2)", "padding-block": "calc(0.25rem * 2)", color: "var(--color-base-content)", "font-weight": 600 }, ".fieldset-label": { display: "flex", "align-items": "center", gap: "calc(0.25rem * 1.5)", color: "color-mix(in oklab, var(--color-base-content) 60%, transparent)", "&:has(input)": { cursor: "pointer" } } }; + +// packages/daisyui/components/fieldset/index.js +var fieldset_default = ({ addComponents, prefix = "" }) => { + const prefixedfieldset = addPrefix(object_default14, prefix); + addComponents({ ...prefixedfieldset }); +}; + +// packages/daisyui/components/dropdown/object.js +var object_default15 = { ".dropdown": { position: "relative", display: "inline-block", "position-area": "var(--anchor-v, bottom) var(--anchor-h, span-right)", "& > *:not(summary):focus": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, ".dropdown-content": { position: "absolute" }, "&:not(details, .dropdown-open, .dropdown-hover:hover, :focus-within)": { ".dropdown-content": { display: "none", "transform-origin": "top", opacity: "0%", scale: "95%" } }, "&[popover], .dropdown-content": { "z-index": 999, animation: "dropdown 0.2s", "transition-property": "opacity, scale, display", "transition-behavior": "allow-discrete", "transition-duration": "0.2s", "transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)" }, "@starting-style": { "&[popover], .dropdown-content": { scale: "95%", opacity: 0 } }, "&.dropdown-open, &:not(.dropdown-hover):focus, &:focus-within": { "> [tabindex]:first-child": { "pointer-events": "none" }, ".dropdown-content": { opacity: "100%" } }, "&.dropdown-hover:hover": { ".dropdown-content": { opacity: "100%", scale: "100%" } }, "&:is(details)": { summary: { "&::-webkit-details-marker": { display: "none" } } }, "&.dropdown-open, &:focus, &:focus-within": { ".dropdown-content": { scale: "100%" } }, "&:where([popover])": { background: "#0000" }, "&[popover]": { position: "fixed", color: "inherit", "@supports not (position-area: bottom)": { margin: "auto", "&.dropdown-open:not(:popover-open)": { display: "none", "transform-origin": "top", opacity: "0%", scale: "95%" }, "&::backdrop": { "background-color": "color-mix(in oklab, #000 30%, #0000)" } }, "&:not(.dropdown-open, :popover-open)": { display: "none", "transform-origin": "top", opacity: "0%", scale: "95%" } } }, ".dropdown-start": { "--anchor-h": "span-right", ":where(.dropdown-content)": { "inset-inline-end": "auto" }, "&.dropdown-left": { "--anchor-h": "left", "--anchor-v": "span-bottom", ".dropdown-content": { top: "calc(0.25rem * 0)", bottom: "auto" } }, "&.dropdown-right": { "--anchor-h": "right", "--anchor-v": "span-bottom", ".dropdown-content": { top: "calc(0.25rem * 0)", bottom: "auto" } } }, ".dropdown-center": { "--anchor-h": "center", ":where(.dropdown-content)": { "inset-inline-end": "calc(1/2 * 100%)", translate: "50% 0", '[dir="rtl"] &': { translate: "-50% 0" } }, "&.dropdown-left": { "--anchor-h": "left", "--anchor-v": "center", ".dropdown-content": { top: "auto", bottom: "calc(1/2 * 100%)", translate: "0 50%" } }, "&.dropdown-right": { "--anchor-h": "right", "--anchor-v": "center", ".dropdown-content": { top: "auto", bottom: "calc(1/2 * 100%)", translate: "0 50%" } } }, ".dropdown-end": { "--anchor-h": "span-left", ":where(.dropdown-content)": { "inset-inline-end": "calc(0.25rem * 0)", translate: "0 0" }, "&.dropdown-left": { "--anchor-h": "left", "--anchor-v": "span-top", ".dropdown-content": { top: "auto", bottom: "calc(0.25rem * 0)" } }, "&.dropdown-right": { "--anchor-h": "right", "--anchor-v": "span-top", ".dropdown-content": { top: "auto", bottom: "calc(0.25rem * 0)" } } }, ".dropdown-left": { "--anchor-h": "left", "--anchor-v": "span-bottom", ".dropdown-content": { "inset-inline-end": "100%", top: "calc(0.25rem * 0)", bottom: "auto", "transform-origin": "right" } }, ".dropdown-right": { "--anchor-h": "right", "--anchor-v": "span-bottom", ".dropdown-content": { "inset-inline-start": "100%", top: "calc(0.25rem * 0)", bottom: "auto", "transform-origin": "left" } }, ".dropdown-bottom": { "--anchor-v": "bottom", ".dropdown-content": { top: "100%", bottom: "auto", "transform-origin": "top" } }, ".dropdown-top": { "--anchor-v": "top", ".dropdown-content": { top: "auto", bottom: "100%", "transform-origin": "bottom" } }, "@keyframes dropdown": { "0%": { opacity: 0 } } }; + +// packages/daisyui/components/dropdown/index.js +var dropdown_default = ({ addComponents, prefix = "" }) => { + const prefixeddropdown = addPrefix(object_default15, prefix); + addComponents({ ...prefixeddropdown }); +}; + +// packages/daisyui/components/card/object.js +var object_default16 = { ".card": { position: "relative", display: "flex", "flex-direction": "column", "border-radius": "var(--radius-box)", "outline-width": "2px", transition: "outline 0.2s ease-in-out", outline: "0 solid #0000", "outline-offset": "2px", "&:focus": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:focus-visible": { "outline-color": "currentColor" }, ":where(figure:first-child)": { overflow: "hidden", "border-start-start-radius": "inherit", "border-start-end-radius": "inherit", "border-end-start-radius": "unset", "border-end-end-radius": "unset" }, ":where(figure:last-child)": { overflow: "hidden", "border-start-start-radius": "unset", "border-start-end-radius": "unset", "border-end-start-radius": "inherit", "border-end-end-radius": "inherit" }, "&:where(.card-border)": { border: "var(--border) solid var(--color-base-200)" }, "&:where(.card-dash)": { border: "var(--border) dashed var(--color-base-200)" }, "&.image-full": { display: "grid", "> *": { "grid-column-start": "1", "grid-row-start": "1" }, "> .card-body": { position: "relative", color: "var(--color-neutral-content)" }, ":where(figure)": { overflow: "hidden", "border-radius": "inherit" }, "> figure img": { height: "100%", "object-fit": "cover", filter: "brightness(28%)" } }, figure: { display: "flex", "align-items": "center", "justify-content": "center" }, '&:has(> input:is(input[type="checkbox"], input[type="radio"]))': { cursor: "pointer", "user-select": "none" }, "&:has(> :checked)": { outline: "2px solid currentColor" } }, ".card-title": { display: "flex", "align-items": "center", gap: "calc(0.25rem * 2)", "font-size": "var(--cardtitle-fs, 1.125rem)", "font-weight": 600 }, ".card-body": { display: "flex", flex: "auto", "flex-direction": "column", gap: "calc(0.25rem * 2)", padding: "var(--card-p, 1.5rem)", "font-size": "var(--card-fs, 0.875rem)", ":where(p)": { "flex-grow": 1 } }, ".card-actions": { display: "flex", "flex-wrap": "wrap", "align-items": "flex-start", gap: "calc(0.25rem * 2)" }, ".card-xs": { ".card-body": { "--card-p": "0.5rem", "--card-fs": "0.6875rem" }, ".card-title": { "--cardtitle-fs": "0.875rem" } }, ".card-sm": { ".card-body": { "--card-p": "1rem", "--card-fs": "0.75rem" }, ".card-title": { "--cardtitle-fs": "1rem" } }, ".card-md": { ".card-body": { "--card-p": "1.5rem", "--card-fs": "0.875rem" }, ".card-title": { "--cardtitle-fs": "1.125rem" } }, ".card-lg": { ".card-body": { "--card-p": "2rem", "--card-fs": "1rem" }, ".card-title": { "--cardtitle-fs": "1.25rem" } }, ".card-xl": { ".card-body": { "--card-p": "2.5rem", "--card-fs": "1.125rem" }, ".card-title": { "--cardtitle-fs": "1.375rem" } }, ".card-side": { "align-items": "stretch", "flex-direction": "row", ":where(figure:first-child)": { overflow: "hidden", "border-start-start-radius": "inherit", "border-start-end-radius": "unset", "border-end-start-radius": "inherit", "border-end-end-radius": "unset" }, ":where(figure:last-child)": { overflow: "hidden", "border-start-start-radius": "unset", "border-start-end-radius": "inherit", "border-end-start-radius": "unset", "border-end-end-radius": "inherit" }, "figure > *": { "max-width": "unset" }, ":where(figure > *)": { width: "100%", height: "100%", "object-fit": "cover" } } }; + +// packages/daisyui/components/card/index.js +var card_default = ({ addComponents, prefix = "" }) => { + const prefixedcard = addPrefix(object_default16, prefix); + addComponents({ ...prefixedcard }); +}; + +// packages/daisyui/components/steps/object.js +var object_default17 = { ".steps": { display: "inline-grid", "grid-auto-flow": "column", overflow: "hidden", "overflow-x": "auto", "counter-reset": "step", "grid-auto-columns": "1fr", ".step": { display: "grid", "grid-template-columns": ["repeat(1, minmax(0, 1fr))", "auto"], "grid-template-rows": ["repeat(2, minmax(0, 1fr))", "40px 1fr"], "place-items": "center", "text-align": "center", "min-width": "4rem", "--step-bg": "var(--color-base-300)", "--step-fg": "var(--color-base-content)", "&:before": { top: "calc(0.25rem * 0)", "grid-column-start": "1", "grid-row-start": "1", height: "calc(0.25rem * 2)", width: "100%", border: "1px solid", color: "var(--step-bg)", "background-color": "var(--step-bg)", "--tw-content": '""', content: "var(--tw-content)", "margin-inline-start": "-100%" }, "> .step-icon, &:not(:has(.step-icon)):after": { content: "counter(step)", "counter-increment": "step", "z-index": 1, color: "var(--step-fg)", "background-color": "var(--step-bg)", border: "1px solid var(--step-bg)", position: "relative", "grid-column-start": "1", "grid-row-start": "1", display: "grid", height: "calc(0.25rem * 8)", width: "calc(0.25rem * 8)", "place-items": "center", "place-self": "center", "border-radius": "calc(infinity * 1px)" }, "&:first-child:before": { content: "none" }, "&[data-content]:after": { content: "attr(data-content)" } }, ".step-neutral": { "+ .step-neutral:before, &:after, > .step-icon": { "--step-bg": "var(--color-neutral)", "--step-fg": "var(--color-neutral-content)" } }, ".step-primary": { "+ .step-primary:before, &:after, > .step-icon": { "--step-bg": "var(--color-primary)", "--step-fg": "var(--color-primary-content)" } }, ".step-secondary": { "+ .step-secondary:before, &:after, > .step-icon": { "--step-bg": "var(--color-secondary)", "--step-fg": "var(--color-secondary-content)" } }, ".step-accent": { "+ .step-accent:before, &:after, > .step-icon": { "--step-bg": "var(--color-accent)", "--step-fg": "var(--color-accent-content)" } }, ".step-info": { "+ .step-info:before, &:after, > .step-icon": { "--step-bg": "var(--color-info)", "--step-fg": "var(--color-info-content)" } }, ".step-success": { "+ .step-success:before, &:after, > .step-icon": { "--step-bg": "var(--color-success)", "--step-fg": "var(--color-success-content)" } }, ".step-warning": { "+ .step-warning:before, &:after, > .step-icon": { "--step-bg": "var(--color-warning)", "--step-fg": "var(--color-warning-content)" } }, ".step-error": { "+ .step-error:before, &:after, > .step-icon": { "--step-bg": "var(--color-error)", "--step-fg": "var(--color-error-content)" } } }, ".steps-horizontal": { "grid-auto-columns": "1fr", display: "inline-grid", "grid-auto-flow": "column", overflow: "hidden", "overflow-x": "auto", ".step": { display: "grid", "grid-template-columns": ["repeat(1, minmax(0, 1fr))", "auto"], "grid-template-rows": ["repeat(2, minmax(0, 1fr))", "40px 1fr"], "place-items": "center", "text-align": "center", "min-width": "4rem", "&:before": { height: "calc(0.25rem * 2)", width: "100%", translate: "0", content: '""', "margin-inline-start": "-100%" }, '[dir="rtl"] &:before': { translate: "0" } } }, ".steps-vertical": { "grid-auto-rows": "1fr", "grid-auto-flow": "row", ".step": { display: "grid", "grid-template-columns": ["repeat(2, minmax(0, 1fr))", "40px 1fr"], "grid-template-rows": ["repeat(1, minmax(0, 1fr))", "auto"], gap: "0.5rem", "min-height": "4rem", "justify-items": "start", "&:before": { height: "100%", width: "calc(0.25rem * 2)", translate: "-50% -50%", "margin-inline-start": "50%" }, '[dir="rtl"] &:before': { translate: "50% -50%" } } } }; + +// packages/daisyui/components/steps/index.js +var steps_default = ({ addComponents, prefix = "" }) => { + const prefixedsteps = addPrefix(object_default17, prefix); + addComponents({ ...prefixedsteps }); +}; + +// packages/daisyui/components/alert/object.js +var object_default18 = { ".alert": { display: "grid", "align-items": "center", gap: "calc(0.25rem * 4)", "border-radius": "var(--radius-box)", "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 3)", color: "var(--color-base-content)", "background-color": "var(--alert-color, var(--color-base-200))", "justify-content": "start", "justify-items": "start", "grid-auto-flow": "column", "grid-template-columns": "auto", "text-align": "start", border: "var(--border) solid var(--color-base-200)", "font-size": "0.875rem", "line-height": "1.25rem", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)", "box-shadow": "0 3px 0 -2px oklch(100% 0 0 / calc(var(--depth) * 0.08)) inset, 0 1px color-mix( in oklab, color-mix(in oklab, #000 20%, var(--alert-color, var(--color-base-200))) calc(var(--depth) * 20%), #0000 ), 0 4px 3px -2px oklch(0% 0 0 / calc(var(--depth) * 0.08))", "&:has(:nth-child(2))": { "grid-template-columns": "auto minmax(auto, 1fr)" }, "&.alert-outline": { "background-color": "transparent", color: "var(--alert-color)", "box-shadow": "none", "background-image": "none" }, "&.alert-dash": { "background-color": "transparent", color: "var(--alert-color)", "border-style": "dashed", "box-shadow": "none", "background-image": "none" }, "&.alert-soft": { color: "var(--alert-color, var(--color-base-content))", background: "color-mix( in oklab, var(--alert-color, var(--color-base-content)) 8%, var(--color-base-100) )", "border-color": "color-mix( in oklab, var(--alert-color, var(--color-base-content)) 10%, var(--color-base-100) )", "box-shadow": "none", "background-image": "none" } }, ".alert-info": { "border-color": "var(--color-info)", color: "var(--color-info-content)", "--alert-color": "var(--color-info)" }, ".alert-success": { "border-color": "var(--color-success)", color: "var(--color-success-content)", "--alert-color": "var(--color-success)" }, ".alert-warning": { "border-color": "var(--color-warning)", color: "var(--color-warning-content)", "--alert-color": "var(--color-warning)" }, ".alert-error": { "border-color": "var(--color-error)", color: "var(--color-error-content)", "--alert-color": "var(--color-error)" }, ".alert-vertical": { "justify-content": "center", "justify-items": "center", "grid-auto-flow": "row", "grid-template-columns": "auto", "text-align": "center", "&:has(:nth-child(2))": { "grid-template-columns": "auto" } }, ".alert-horizontal": { "justify-content": "start", "justify-items": "start", "grid-auto-flow": "column", "grid-template-columns": "auto", "text-align": "start", "&:has(:nth-child(2))": { "grid-template-columns": "auto minmax(auto, 1fr)" } } }; + +// packages/daisyui/components/alert/index.js +var alert_default = ({ addComponents, prefix = "" }) => { + const prefixedalert = addPrefix(object_default18, prefix); + addComponents({ ...prefixedalert }); +}; + +// packages/daisyui/components/kbd/object.js +var object_default19 = { ".kbd": { display: "inline-flex", "align-items": "center", "justify-content": "center", "border-radius": "var(--radius-field)", "background-color": "var(--color-base-200)", "vertical-align": "middle", "padding-left": "0.5em", "padding-right": "0.5em", border: "var(--border) solid color-mix(in srgb, var(--color-base-content) 20%, #0000)", "border-bottom": "calc(var(--border) + 1px) solid color-mix(in srgb, var(--color-base-content) 20%, #0000)", "--size": "calc(var(--size-selector, 0.25rem) * 6)", "font-size": "0.875rem", height: "var(--size)", "min-width": "var(--size)" }, ".kbd-xs": { "--size": "calc(var(--size-selector, 0.25rem) * 4)", "font-size": "0.625rem" }, ".kbd-sm": { "--size": "calc(var(--size-selector, 0.25rem) * 5)", "font-size": "0.75rem" }, ".kbd-md": { "--size": "calc(var(--size-selector, 0.25rem) * 6)", "font-size": "0.875rem" }, ".kbd-lg": { "--size": "calc(var(--size-selector, 0.25rem) * 7)", "font-size": "1rem" }, ".kbd-xl": { "--size": "calc(var(--size-selector, 0.25rem) * 8)", "font-size": "1.125rem" } }; + +// packages/daisyui/components/kbd/index.js +var kbd_default = ({ addComponents, prefix = "" }) => { + const prefixedkbd = addPrefix(object_default19, prefix); + addComponents({ ...prefixedkbd }); +}; + +// packages/daisyui/components/select/object.js +var object_default20 = { ".select": { border: "var(--border) solid #0000", position: "relative", display: "inline-flex", "flex-shrink": 1, appearance: "none", "align-items": "center", gap: "calc(0.25rem * 1.5)", "background-color": "var(--color-base-100)", "padding-inline-start": "calc(0.25rem * 4)", "padding-inline-end": "calc(0.25rem * 7)", "vertical-align": "middle", width: "clamp(3rem, 20rem, 100%)", height: "var(--size)", "font-size": "0.875rem", "border-start-start-radius": "var(--join-ss, var(--radius-field))", "border-start-end-radius": "var(--join-se, var(--radius-field))", "border-end-start-radius": "var(--join-es, var(--radius-field))", "border-end-end-radius": "var(--join-ee, var(--radius-field))", "background-image": "linear-gradient(45deg, #0000 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, #0000 50%)", "background-position": "calc(100% - 20px) calc(1px + 50%), calc(100% - 16.1px) calc(1px + 50%)", "background-size": "4px 4px, 4px 4px", "background-repeat": "no-repeat", "text-overflow": "ellipsis", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset", "border-color": "var(--input-color)", "--input-color": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", "--size": "calc(var(--size-field, 0.25rem) * 10)", '[dir="rtl"] &': { "background-position": "calc(0% + 12px) calc(1px + 50%), calc(0% + 16px) calc(1px + 50%)" }, select: { "margin-inline-start": "calc(0.25rem * -4)", "margin-inline-end": "calc(0.25rem * -7)", width: "calc(100% + 2.75rem)", appearance: "none", "padding-inline-start": "calc(0.25rem * 4)", "padding-inline-end": "calc(0.25rem * 7)", height: "calc(100% - 2px)", background: "inherit", "border-radius": "inherit", "border-style": "none", "&:focus, &:focus-within": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:not(:last-child)": { "margin-inline-end": "calc(0.25rem * -5.5)", "background-image": "none" } }, "&:focus, &:focus-within": { "--input-color": "var(--color-base-content)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)", outline: "2px solid var(--input-color)", "outline-offset": "2px", isolation: "isolate", "z-index": 1 }, "&:has(> select[disabled]), &:is(:disabled, [disabled])": { cursor: "not-allowed", "border-color": "var(--color-base-200)", "background-color": "var(--color-base-200)", color: "color-mix(in oklab, var(--color-base-content) 40%, transparent)", "&::placeholder": { color: "color-mix(in oklab, var(--color-base-content) 20%, transparent)" } }, "&:has(> select[disabled]) > select[disabled]": { cursor: "not-allowed" } }, ".select-ghost": { "background-color": "transparent", transition: "background-color 0.2s", "box-shadow": "none", "border-color": "#0000", "&:focus, &:focus-within": { "background-color": "var(--color-base-100)", color: "var(--color-base-content)", "border-color": "#0000", "box-shadow": "none" } }, ".select-neutral": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-neutral)" } }, ".select-primary": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-primary)" } }, ".select-secondary": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-secondary)" } }, ".select-accent": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-accent)" } }, ".select-info": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-info)" } }, ".select-success": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-success)" } }, ".select-warning": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-warning)" } }, ".select-error": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-error)" } }, ".select-xs": { "--size": "calc(var(--size-field, 0.25rem) * 6)", "font-size": "0.6875rem" }, ".select-sm": { "--size": "calc(var(--size-field, 0.25rem) * 8)", "font-size": "0.75rem" }, ".select-md": { "--size": "calc(var(--size-field, 0.25rem) * 10)", "font-size": "0.875rem" }, ".select-lg": { "--size": "calc(var(--size-field, 0.25rem) * 12)", "font-size": "1.125rem" }, ".select-xl": { "--size": "calc(var(--size-field, 0.25rem) * 14)", "font-size": "1.375rem" } }; + +// packages/daisyui/components/select/index.js +var select_default = ({ addComponents, prefix = "" }) => { + const prefixedselect = addPrefix(object_default20, prefix); + addComponents({ ...prefixedselect }); +}; + +// packages/daisyui/components/progress/object.js +var object_default21 = { ".progress": { position: "relative", height: "calc(0.25rem * 2)", width: "100%", appearance: "none", overflow: "hidden", "border-radius": "var(--radius-box)", "background-color": "color-mix(in oklab, currentColor 20%, transparent)", color: "var(--color-base-content)", "&:indeterminate": { "background-image": "repeating-linear-gradient( 90deg, currentColor -1%, currentColor 10%, #0000 10%, #0000 90% )", "background-size": "200%", "background-position-x": "15%", animation: "progress 5s ease-in-out infinite", "@supports (-moz-appearance: none)": { "&::-moz-progress-bar": { "background-color": "transparent", "background-image": "repeating-linear-gradient( 90deg, currentColor -1%, currentColor 10%, #0000 10%, #0000 90% )", "background-size": "200%", "background-position-x": "15%", animation: "progress 5s ease-in-out infinite" } } }, "@supports (-moz-appearance: none)": { "&::-moz-progress-bar": { "border-radius": "var(--radius-box)", "background-color": "currentColor" } }, "@supports (-webkit-appearance: none)": { "&::-webkit-progress-bar": { "border-radius": "var(--radius-box)", "background-color": "transparent" }, "&::-webkit-progress-value": { "border-radius": "var(--radius-box)", "background-color": "currentColor" } } }, ".progress-primary": { color: "var(--color-primary)" }, ".progress-secondary": { color: "var(--color-secondary)" }, ".progress-accent": { color: "var(--color-accent)" }, ".progress-neutral": { color: "var(--color-neutral)" }, ".progress-info": { color: "var(--color-info)" }, ".progress-success": { color: "var(--color-success)" }, ".progress-warning": { color: "var(--color-warning)" }, ".progress-error": { color: "var(--color-error)" }, "@keyframes progress": { "50%": { "background-position-x": "-115%" } } }; + +// packages/daisyui/components/progress/index.js +var progress_default = ({ addComponents, prefix = "" }) => { + const prefixedprogress = addPrefix(object_default21, prefix); + addComponents({ ...prefixedprogress }); +}; + +// packages/daisyui/components/fileinput/object.js +var object_default22 = { ".file-input": { cursor: ["pointer", "pointer"], border: "var(--border) solid #0000", display: "inline-flex", appearance: "none", "align-items": "center", "background-color": "var(--color-base-100)", "vertical-align": "middle", "webkit-user-select": "none", "user-select": "none", width: "clamp(3rem, 20rem, 100%)", height: "var(--size)", "padding-inline-end": "0.75rem", "font-size": "0.875rem", "line-height": 2, "border-start-start-radius": "var(--join-ss, var(--radius-field))", "border-start-end-radius": "var(--join-se, var(--radius-field))", "border-end-start-radius": "var(--join-es, var(--radius-field))", "border-end-end-radius": "var(--join-ee, var(--radius-field))", "border-color": "var(--input-color)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset", "--size": "calc(var(--size-field, 0.25rem) * 10)", "--input-color": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", "&::file-selector-button": { "margin-inline-end": "calc(0.25rem * 4)", cursor: "pointer", "padding-inline": "calc(0.25rem * 4)", "webkit-user-select": "none", "user-select": "none", height: "calc(100% + var(--border) * 2)", "margin-block": "calc(var(--border) * -1)", "margin-inline-start": "calc(var(--border) * -1)", "font-size": "0.875rem", color: "var(--btn-fg)", "border-width": "var(--border)", "border-style": "solid", "border-color": "var(--btn-border)", "border-start-start-radius": "calc(var(--join-ss, var(--radius-field) - var(--border)))", "border-end-start-radius": "calc(var(--join-es, var(--radius-field) - var(--border)))", "font-weight": 600, "background-color": "var(--btn-bg)", "background-size": "calc(var(--noise) * 100%)", "background-image": "var(--btn-noise)", "text-shadow": "0 0.5px oklch(1 0 0 / calc(var(--depth) * 0.15))", "box-shadow": "0 0.5px 0 0.5px color-mix( in oklab, color-mix(in oklab, white 30%, var(--btn-bg)) calc(var(--depth) * 20%), #0000 ) inset, var(--btn-shadow)", "--size": "calc(var(--size-field, 0.25rem) * 10)", "--btn-bg": "var(--btn-color, var(--color-base-200))", "--btn-fg": "var(--color-base-content)", "--btn-border": "color-mix(in oklab, var(--btn-bg), #000 5%)", "--btn-shadow": `0 3px 2px -2px color-mix(in oklab, var(--btn-bg) 30%, #0000), + 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) 30%, #0000)`, "--btn-noise": "var(--fx-noise)" }, "&:focus": { "--input-color": "var(--color-base-content)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) 10%, #0000)", outline: "2px solid var(--input-color)", "outline-offset": "2px", isolation: "isolate" }, "&:has(> input[disabled]), &:is(:disabled, [disabled])": { cursor: "not-allowed", "border-color": "var(--color-base-200)", "background-color": "var(--color-base-200)", "&::placeholder": { color: "color-mix(in oklab, var(--color-base-content) 20%, transparent)" }, "box-shadow": "none", color: "color-mix(in oklch, var(--color-base-content) 20%, #0000)", "&::file-selector-button": { cursor: "not-allowed", "border-color": "var(--color-base-200)", "background-color": "var(--color-base-200)", "--btn-border": "#0000", "--btn-noise": "none", "--btn-fg": "color-mix(in oklch, var(--color-base-content) 20%, #0000)" } } }, ".file-input-ghost": { "background-color": "transparent", transition: "background-color 0.2s", "box-shadow": "none", "border-color": "#0000", "&::file-selector-button": { "margin-inline-start": "calc(0.25rem * 0)", "margin-inline-end": "calc(0.25rem * 4)", height: "100%", cursor: "pointer", "padding-inline": "calc(0.25rem * 4)", "webkit-user-select": "none", "user-select": "none", "margin-block": "0", "border-start-end-radius": "calc(var(--join-ss, var(--radius-field) - var(--border)))", "border-end-end-radius": "calc(var(--join-es, var(--radius-field) - var(--border)))" }, "&:focus, &:focus-within": { "background-color": "var(--color-base-100)", color: "var(--color-base-content)", "border-color": "#0000", "box-shadow": "none" } }, ".file-input-neutral": { "--btn-color": "var(--color-neutral)", "&::file-selector-button": { color: "var(--color-neutral-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-neutral)" } }, ".file-input-primary": { "--btn-color": "var(--color-primary)", "&::file-selector-button": { color: "var(--color-primary-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-primary)" } }, ".file-input-secondary": { "--btn-color": "var(--color-secondary)", "&::file-selector-button": { color: "var(--color-secondary-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-secondary)" } }, ".file-input-accent": { "--btn-color": "var(--color-accent)", "&::file-selector-button": { color: "var(--color-accent-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-accent)" } }, ".file-input-info": { "--btn-color": "var(--color-info)", "&::file-selector-button": { color: "var(--color-info-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-info)" } }, ".file-input-success": { "--btn-color": "var(--color-success)", "&::file-selector-button": { color: "var(--color-success-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-success)" } }, ".file-input-warning": { "--btn-color": "var(--color-warning)", "&::file-selector-button": { color: "var(--color-warning-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-warning)" } }, ".file-input-error": { "--btn-color": "var(--color-error)", "&::file-selector-button": { color: "var(--color-error-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-error)" } }, ".file-input-xs": { "--size": "calc(var(--size-field, 0.25rem) * 6)", "font-size": "0.6875rem", "line-height": "1rem", "&::file-selector-button": { "font-size": "0.6875rem" } }, ".file-input-sm": { "--size": "calc(var(--size-field, 0.25rem) * 8)", "font-size": "0.75rem", "line-height": "1.5rem", "&::file-selector-button": { "font-size": "0.75rem" } }, ".file-input-md": { "--size": "calc(var(--size-field, 0.25rem) * 10)", "font-size": "0.875rem", "line-height": 2, "&::file-selector-button": { "font-size": "0.875rem" } }, ".file-input-lg": { "--size": "calc(var(--size-field, 0.25rem) * 12)", "font-size": "1.125rem", "line-height": "2.5rem", "&::file-selector-button": { "font-size": "1.125rem" } }, ".file-input-xl": { "padding-inline-end": "calc(0.25rem * 6)", "--size": "calc(var(--size-field, 0.25rem) * 14)", "font-size": "1.125rem", "line-height": "3rem", "&::file-selector-button": { "font-size": "1.375rem" } } }; + +// packages/daisyui/components/fileinput/index.js +var fileinput_default = ({ addComponents, prefix = "" }) => { + const prefixedfileinput = addPrefix(object_default22, prefix); + addComponents({ ...prefixedfileinput }); +}; + +// packages/daisyui/components/modal/object.js +var object_default23 = { ".modal": { "pointer-events": "none", visibility: "hidden", position: "fixed", inset: "calc(0.25rem * 0)", margin: "calc(0.25rem * 0)", display: "grid", height: "100%", "max-height": "none", width: "100%", "max-width": "none", "align-items": "center", "justify-items": "center", "background-color": "transparent", padding: "calc(0.25rem * 0)", color: "inherit", "overflow-x": "hidden", transition: "translate 0.3s ease-out, visibility 0.3s allow-discrete, background-color 0.3s ease-out, opacity 0.1s ease-out", "overflow-y": "hidden", "overscroll-behavior": "contain", "z-index": 999, "&::backdrop": { display: "none" }, "&.modal-open, &[open], &:target": { "pointer-events": "auto", visibility: "visible", opacity: "100%", "background-color": "oklch(0% 0 0/ 0.4)", ".modal-box": { translate: "0 0", scale: "1", opacity: 1 } }, "@starting-style": { "&.modal-open, &[open], &:target": { visibility: "hidden", opacity: "0%" } } }, ".modal-action": { "margin-top": "calc(0.25rem * 6)", display: "flex", "justify-content": "flex-end", gap: "calc(0.25rem * 2)" }, ".modal-toggle": { position: "fixed", height: "calc(0.25rem * 0)", width: "calc(0.25rem * 0)", appearance: "none", opacity: "0%", "&:checked + .modal": { "pointer-events": "auto", visibility: "visible", opacity: "100%", "background-color": "oklch(0% 0 0/ 0.4)", ".modal-box": { translate: "0 0", scale: "1", opacity: 1 } }, "@starting-style": { "&:checked + .modal": { visibility: "hidden", opacity: "0%" } } }, ".modal-backdrop": { "grid-column-start": "1", "grid-row-start": "1", display: "grid", "align-self": "stretch", "justify-self": "stretch", color: "transparent", "z-index": -1, button: { cursor: "pointer" } }, ".modal-box": { "grid-column-start": "1", "grid-row-start": "1", "max-height": "100vh", width: "calc(11/12 * 100%)", "max-width": "32rem", "background-color": "var(--color-base-100)", padding: "calc(0.25rem * 6)", transition: "translate 0.3s ease-out, scale 0.3s ease-out, opacity 0.2s ease-out 0.05s, box-shadow 0.3s ease-out", "border-top-left-radius": "var(--modal-tl, var(--radius-box))", "border-top-right-radius": "var(--modal-tr, var(--radius-box))", "border-bottom-left-radius": "var(--modal-bl, var(--radius-box))", "border-bottom-right-radius": "var(--modal-br, var(--radius-box))", scale: "95%", opacity: 0, "box-shadow": "oklch(0% 0 0/ 0.25) 0px 25px 50px -12px", "overflow-y": "auto", "overscroll-behavior": "contain" }, ".modal-top": { "place-items": "start", ":where(.modal-box)": { height: "auto", width: "100%", "max-width": "none", "max-height": "calc(100vh - 5em)", translate: "0 -100%", scale: "1", "--modal-tl": "0", "--modal-tr": "0", "--modal-bl": "var(--radius-box)", "--modal-br": "var(--radius-box)" } }, ".modal-middle": { "place-items": "center", ":where(.modal-box)": { height: "auto", width: "calc(11/12 * 100%)", "max-width": "32rem", "max-height": "calc(100vh - 5em)", translate: "0 2%", scale: "98%", "--modal-tl": "var(--radius-box)", "--modal-tr": "var(--radius-box)", "--modal-bl": "var(--radius-box)", "--modal-br": "var(--radius-box)" } }, ".modal-bottom": { "place-items": "end", ":where(.modal-box)": { height: "auto", width: "100%", "max-width": "none", "max-height": "calc(100vh - 5em)", translate: "0 100%", scale: "1", "--modal-tl": "var(--radius-box)", "--modal-tr": "var(--radius-box)", "--modal-bl": "0", "--modal-br": "0" } }, ".modal-start": { "place-items": "start", ":where(.modal-box)": { height: "100vh", "max-height": "none", width: "auto", "max-width": "none", translate: "-100% 0", scale: "1", "--modal-tl": "0", "--modal-tr": "var(--radius-box)", "--modal-bl": "0", "--modal-br": "var(--radius-box)" } }, ".modal-end": { "place-items": "end", ":where(.modal-box)": { height: "100vh", "max-height": "none", width: "auto", "max-width": "none", translate: "100% 0", scale: "1", "--modal-tl": "var(--radius-box)", "--modal-tr": "0", "--modal-bl": "var(--radius-box)", "--modal-br": "0" } } }; + +// packages/daisyui/components/modal/index.js +var modal_default = ({ addComponents, prefix = "" }) => { + const prefixedmodal = addPrefix(object_default23, prefix); + addComponents({ ...prefixedmodal }); +}; + +// packages/daisyui/components/footer/object.js +var object_default24 = { ".footer": { display: "grid", width: "100%", "grid-auto-flow": "row", "place-items": "start", "column-gap": "calc(0.25rem * 4)", "row-gap": "calc(0.25rem * 10)", "font-size": "0.875rem", "line-height": "1.25rem", "& > *": { display: "grid", "place-items": "start", gap: "calc(0.25rem * 2)" }, "&.footer-center": { "grid-auto-flow": "column dense", "place-items": "center", "text-align": "center", "& > *": { "place-items": "center" } } }, ".footer-title": { "margin-bottom": "calc(0.25rem * 2)", "text-transform": "uppercase", opacity: "60%", "font-weight": 600 }, ".footer-horizontal": { "grid-auto-flow": "column", "&.footer-center": { "grid-auto-flow": "row dense" } }, ".footer-vertical": { "grid-auto-flow": "row", "&.footer-center": { "grid-auto-flow": "column dense" } } }; + +// packages/daisyui/components/footer/index.js +var footer_default = ({ addComponents, prefix = "" }) => { + const prefixedfooter = addPrefix(object_default24, prefix); + addComponents({ ...prefixedfooter }); +}; + +// packages/daisyui/components/table/object.js +var object_default25 = { ".table": { "font-size": "0.875rem", position: "relative", width: "100%", "border-radius": "var(--radius-box)", "text-align": "left", '&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *)': { "text-align": "right" }, "tr.row-hover": { "&, &:nth-child(even)": { "&:hover": { "@media (hover: hover)": { "background-color": "var(--color-base-200)" } } } }, ":where(th, td)": { "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 3)", "vertical-align": "middle" }, ":where(thead, tfoot)": { "white-space": "nowrap", color: "color-mix(in oklab, var(--color-base-content) 60%, transparent)", "font-size": "0.875rem", "font-weight": 600 }, ":where(tfoot)": { "border-top": "var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)" }, ":where(.table-pin-rows thead tr)": { position: "sticky", top: "calc(0.25rem * 0)", "z-index": 1, "background-color": "var(--color-base-100)" }, ":where(.table-pin-rows tfoot tr)": { position: "sticky", bottom: "calc(0.25rem * 0)", "z-index": 1, "background-color": "var(--color-base-100)" }, ":where(.table-pin-cols tr th)": { position: "sticky", right: "calc(0.25rem * 0)", left: "calc(0.25rem * 0)", "background-color": "var(--color-base-100)" }, ":where(thead tr, tbody tr:not(:last-child))": { "border-bottom": "var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)" } }, ".table-zebra": { tbody: { tr: { "&:where(:nth-child(even))": { "background-color": "var(--color-base-200)", ":where(.table-pin-cols tr th)": { "background-color": "var(--color-base-200)" } }, "&.row-hover": { "&, &:where(:nth-child(even))": { "&:hover": { "@media (hover: hover)": { "background-color": "var(--color-base-300)" } } } } } } }, ".table-xs": { ":not(thead, tfoot) tr": { "font-size": "0.6875rem" }, ":where(th, td)": { "padding-inline": "calc(0.25rem * 2)", "padding-block": "calc(0.25rem * 1)" } }, ".table-sm": { ":not(thead, tfoot) tr": { "font-size": "0.75rem" }, ":where(th, td)": { "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 2)" } }, ".table-md": { ":not(thead, tfoot) tr": { "font-size": "0.875rem" }, ":where(th, td)": { "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 3)" } }, ".table-lg": { ":not(thead, tfoot) tr": { "font-size": "1.125rem" }, ":where(th, td)": { "padding-inline": "calc(0.25rem * 5)", "padding-block": "calc(0.25rem * 4)" } }, ".table-xl": { ":not(thead, tfoot) tr": { "font-size": "1.375rem" }, ":where(th, td)": { "padding-inline": "calc(0.25rem * 6)", "padding-block": "calc(0.25rem * 5)" } } }; + +// packages/daisyui/components/table/index.js +var table_default = ({ addComponents, prefix = "" }) => { + const prefixedtable = addPrefix(object_default25, prefix); + addComponents({ ...prefixedtable }); +}; + +// packages/daisyui/components/avatar/object.js +var object_default26 = { ".avatar-group": { display: "flex", overflow: "hidden", ":where(.avatar)": { overflow: "hidden", "border-radius": "calc(infinity * 1px)", border: "4px solid var(--color-base-100)" } }, ".avatar": { position: "relative", display: "inline-flex", "vertical-align": "middle", "& > div": { display: "block", "aspect-ratio": "1 / 1", overflow: "hidden" }, img: { height: "100%", width: "100%", "object-fit": "cover" } }, ".avatar-placeholder": { "& > div": { display: "flex", "align-items": "center", "justify-content": "center" } }, ".avatar-online": { "&:before": { content: '""', position: "absolute", "z-index": 1, display: "block", "border-radius": "calc(infinity * 1px)", "background-color": "var(--color-success)", outline: "2px solid var(--color-base-100)", width: "15%", height: "15%", top: "7%", right: "7%" } }, ".avatar-offline": { "&:before": { content: '""', position: "absolute", "z-index": 1, display: "block", "border-radius": "calc(infinity * 1px)", "background-color": "var(--color-base-300)", outline: "2px solid var(--color-base-100)", width: "15%", height: "15%", top: "7%", right: "7%" } } }; + +// packages/daisyui/components/avatar/index.js +var avatar_default = ({ addComponents, prefix = "" }) => { + const prefixedavatar = addPrefix(object_default26, prefix); + addComponents({ ...prefixedavatar }); +}; + +// packages/daisyui/components/input/object.js +var object_default27 = { ".input": { cursor: "text", border: "var(--border) solid #0000", position: "relative", display: "inline-flex", "flex-shrink": 1, appearance: "none", "align-items": "center", gap: "calc(0.25rem * 2)", "background-color": "var(--color-base-100)", "padding-inline": "calc(0.25rem * 3)", "vertical-align": "middle", "white-space": "nowrap", width: "clamp(3rem, 20rem, 100%)", height: "var(--size)", "font-size": "0.875rem", "border-start-start-radius": "var(--join-ss, var(--radius-field))", "border-start-end-radius": "var(--join-se, var(--radius-field))", "border-end-start-radius": "var(--join-es, var(--radius-field))", "border-end-end-radius": "var(--join-ee, var(--radius-field))", "border-color": "var(--input-color)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset", "--size": "calc(var(--size-field, 0.25rem) * 10)", "--input-color": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", "&:where(input)": { display: "inline-flex" }, ":where(input)": { display: "inline-flex", height: "100%", width: "100%", appearance: "none", "background-color": "transparent", border: "none", "&:focus, &:focus-within": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } } }, ':where(input[type="date"])': { display: "inline-block" }, "&:focus, &:focus-within": { "--input-color": "var(--color-base-content)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)", outline: "2px solid var(--input-color)", "outline-offset": "2px", isolation: "isolate", "z-index": 1 }, "&:has(> input[disabled]), &:is(:disabled, [disabled])": { cursor: "not-allowed", "border-color": "var(--color-base-200)", "background-color": "var(--color-base-200)", color: "color-mix(in oklab, var(--color-base-content) 40%, transparent)", "&::placeholder": { color: "color-mix(in oklab, var(--color-base-content) 20%, transparent)" }, "box-shadow": "none" }, "&:has(> input[disabled]) > input[disabled]": { cursor: "not-allowed" }, "&::-webkit-date-and-time-value": { "text-align": "inherit" }, '&[type="number"]': { "&::-webkit-inner-spin-button": { "margin-block": "calc(0.25rem * -3)", "margin-inline-end": "calc(0.25rem * -3)" } }, "&::-webkit-calendar-picker-indicator": { position: "absolute", "inset-inline-end": "0.75em" } }, ".input-ghost": { "background-color": "transparent", "box-shadow": "none", "border-color": "#0000", "&:focus, &:focus-within": { "background-color": "var(--color-base-100)", color: "var(--color-base-content)", "border-color": "#0000", "box-shadow": "none" } }, ".input-neutral": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-neutral)" } }, ".input-primary": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-primary)" } }, ".input-secondary": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-secondary)" } }, ".input-accent": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-accent)" } }, ".input-info": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-info)" } }, ".input-success": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-success)" } }, ".input-warning": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-warning)" } }, ".input-error": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-error)" } }, ".input-xs": { "--size": "calc(var(--size-field, 0.25rem) * 6)", "font-size": "0.6875rem", '&[type="number"]': { "&::-webkit-inner-spin-button": { "margin-block": "calc(0.25rem * -1)", "margin-inline-end": "calc(0.25rem * -3)" } } }, ".input-sm": { "--size": "calc(var(--size-field, 0.25rem) * 8)", "font-size": "0.75rem", '&[type="number"]': { "&::-webkit-inner-spin-button": { "margin-block": "calc(0.25rem * -2)", "margin-inline-end": "calc(0.25rem * -3)" } } }, ".input-md": { "--size": "calc(var(--size-field, 0.25rem) * 10)", "font-size": "0.875rem", '&[type="number"]': { "&::-webkit-inner-spin-button": { "margin-block": "calc(0.25rem * -3)", "margin-inline-end": "calc(0.25rem * -3)" } } }, ".input-lg": { "--size": "calc(var(--size-field, 0.25rem) * 12)", "font-size": "1.125rem", '&[type="number"]': { "&::-webkit-inner-spin-button": { "margin-block": "calc(0.25rem * -3)", "margin-inline-end": "calc(0.25rem * -3)" } } }, ".input-xl": { "--size": "calc(var(--size-field, 0.25rem) * 14)", "font-size": "1.375rem", '&[type="number"]': { "&::-webkit-inner-spin-button": { "margin-block": "calc(0.25rem * -4)", "margin-inline-end": "calc(0.25rem * -3)" } } } }; + +// packages/daisyui/components/input/index.js +var input_default = ({ addComponents, prefix = "" }) => { + const prefixedinput = addPrefix(object_default27, prefix); + addComponents({ ...prefixedinput }); +}; + +// packages/daisyui/components/checkbox/object.js +var object_default28 = { ".checkbox": { border: "var(--border) solid var(--input-color, color-mix(in oklab, var(--color-base-content) 20%, #0000))", position: "relative", "flex-shrink": 0, cursor: "pointer", appearance: "none", "border-radius": "var(--radius-selector)", padding: "calc(0.25rem * 1)", "vertical-align": "middle", color: "var(--color-base-content)", "box-shadow": "0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 0 #0000 inset, 0 0 #0000", transition: "background-color 0.2s, box-shadow 0.2s", "--size": "calc(var(--size-selector, 0.25rem) * 6)", width: "var(--size)", height: "var(--size)", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)", "&:before": { "--tw-content": '""', content: "var(--tw-content)", display: "block", width: "100%", height: "100%", rotate: "45deg", "background-color": "currentColor", opacity: "0%", transition: "clip-path 0.3s, opacity 0.1s, rotate 0.3s, translate 0.3s", "transition-delay": "0.1s", "clip-path": "polygon(20% 100%, 20% 80%, 50% 80%, 50% 80%, 70% 80%, 70% 100%)", "box-shadow": "0px 3px 0 0px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset", "font-size": "1rem", "line-height": 0.75 }, "&:focus-visible": { outline: "2px solid var(--input-color, currentColor)", "outline-offset": "2px" }, '&:checked, &[aria-checked="true"]': { "background-color": "var(--input-color, #0000)", "box-shadow": "0 0 #0000 inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1))", "&:before": { "clip-path": "polygon(20% 100%, 20% 80%, 50% 80%, 50% 0%, 70% 0%, 70% 100%)", opacity: "100%" }, "@media (forced-colors: active)": { "&:before": { rotate: "0deg", "background-color": "transparent", "--tw-content": '"โœ”๏ธŽ"', "clip-path": "none" } }, "@media print": { "&:before": { rotate: "0deg", "background-color": "transparent", "--tw-content": '"โœ”๏ธŽ"', "clip-path": "none" } } }, "&:indeterminate": { "&:before": { rotate: "0deg", opacity: "100%", translate: "0 -35%", "clip-path": "polygon(20% 100%, 20% 80%, 50% 80%, 50% 80%, 80% 80%, 80% 100%)" } } }, ".checkbox-primary": { color: "var(--color-primary-content)", "--input-color": "var(--color-primary)" }, ".checkbox-secondary": { color: "var(--color-secondary-content)", "--input-color": "var(--color-secondary)" }, ".checkbox-accent": { color: "var(--color-accent-content)", "--input-color": "var(--color-accent)" }, ".checkbox-neutral": { color: "var(--color-neutral-content)", "--input-color": "var(--color-neutral)" }, ".checkbox-info": { color: "var(--color-info-content)", "--input-color": "var(--color-info)" }, ".checkbox-success": { color: "var(--color-success-content)", "--input-color": "var(--color-success)" }, ".checkbox-warning": { color: "var(--color-warning-content)", "--input-color": "var(--color-warning)" }, ".checkbox-error": { color: "var(--color-error-content)", "--input-color": "var(--color-error)" }, ".checkbox:disabled": { cursor: "not-allowed", opacity: "20%" }, ".checkbox-xs": { padding: "0.125rem", "--size": "calc(var(--size-selector, 0.25rem) * 4)" }, ".checkbox-sm": { padding: "0.1875rem", "--size": "calc(var(--size-selector, 0.25rem) * 5)" }, ".checkbox-md": { padding: "0.25rem", "--size": "calc(var(--size-selector, 0.25rem) * 6)" }, ".checkbox-lg": { padding: "0.3125rem", "--size": "calc(var(--size-selector, 0.25rem) * 7)" }, ".checkbox-xl": { padding: "0.375rem", "--size": "calc(var(--size-selector, 0.25rem) * 8)" } }; + +// packages/daisyui/components/checkbox/index.js +var checkbox_default = ({ addComponents, prefix = "" }) => { + const prefixedcheckbox = addPrefix(object_default28, prefix); + addComponents({ ...prefixedcheckbox }); +}; + +// packages/daisyui/components/badge/object.js +var object_default29 = { ".badge": { display: "inline-flex", "align-items": "center", "justify-content": "center", gap: "calc(0.25rem * 2)", "border-radius": "var(--radius-selector)", "vertical-align": "middle", color: "var(--badge-fg)", border: "var(--border) solid var(--badge-color, var(--color-base-200))", "font-size": "0.875rem", width: "fit-content", "padding-inline": "calc(0.25rem * 3 - var(--border))", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)", "background-color": "var(--badge-bg)", "--badge-bg": "var(--badge-color, var(--color-base-100))", "--badge-fg": "var(--color-base-content)", "--size": "calc(var(--size-selector, 0.25rem) * 6)", height: "var(--size)", "&.badge-outline": { "--badge-fg": "var(--badge-color)", "--badge-bg": "#0000", "background-image": "none", "border-color": "currentColor" }, "&.badge-dash": { "--badge-fg": "var(--badge-color)", "--badge-bg": "#0000", "background-image": "none", "border-color": "currentColor", "border-style": "dashed" }, "&.badge-soft": { color: "var(--badge-color, var(--color-base-content))", "background-color": "color-mix( in oklab, var(--badge-color, var(--color-base-content)) 8%, var(--color-base-100) )", "border-color": "color-mix( in oklab, var(--badge-color, var(--color-base-content)) 10%, var(--color-base-100) )", "background-image": "none" } }, ".badge-primary": { "--badge-color": "var(--color-primary)", "--badge-fg": "var(--color-primary-content)" }, ".badge-secondary": { "--badge-color": "var(--color-secondary)", "--badge-fg": "var(--color-secondary-content)" }, ".badge-accent": { "--badge-color": "var(--color-accent)", "--badge-fg": "var(--color-accent-content)" }, ".badge-neutral": { "--badge-color": "var(--color-neutral)", "--badge-fg": "var(--color-neutral-content)" }, ".badge-info": { "--badge-color": "var(--color-info)", "--badge-fg": "var(--color-info-content)" }, ".badge-success": { "--badge-color": "var(--color-success)", "--badge-fg": "var(--color-success-content)" }, ".badge-warning": { "--badge-color": "var(--color-warning)", "--badge-fg": "var(--color-warning-content)" }, ".badge-error": { "--badge-color": "var(--color-error)", "--badge-fg": "var(--color-error-content)" }, ".badge-ghost": { "border-color": "var(--color-base-200)", "background-color": "var(--color-base-200)", color: "var(--color-base-content)", "background-image": "none" }, ".badge-xs": { "--size": "calc(var(--size-selector, 0.25rem) * 4)", "font-size": "0.625rem", "padding-inline": "calc(0.25rem * 2 - var(--border))" }, ".badge-sm": { "--size": "calc(var(--size-selector, 0.25rem) * 5)", "font-size": "0.75rem", "padding-inline": "calc(0.25rem * 2.5 - var(--border))" }, ".badge-md": { "--size": "calc(var(--size-selector, 0.25rem) * 6)", "font-size": "0.875rem", "padding-inline": "calc(0.25rem * 3 - var(--border))" }, ".badge-lg": { "--size": "calc(var(--size-selector, 0.25rem) * 7)", "font-size": "1rem", "padding-inline": "calc(0.25rem * 3.5 - var(--border))" }, ".badge-xl": { "--size": "calc(var(--size-selector, 0.25rem) * 8)", "font-size": "1.125rem", "padding-inline": "calc(0.25rem * 4 - var(--border))" } }; + +// packages/daisyui/components/badge/index.js +var badge_default = ({ addComponents, prefix = "" }) => { + const prefixedbadge = addPrefix(object_default29, prefix); + addComponents({ ...prefixedbadge }); +}; + +// packages/daisyui/components/status/object.js +var object_default30 = { ".status": { display: "inline-block", "aspect-ratio": "1 / 1", width: "calc(0.25rem * 2)", height: "calc(0.25rem * 2)", "border-radius": "var(--radius-selector)", "background-color": "color-mix(in oklab, var(--color-base-content) 20%, transparent)", "background-position": "center", "background-repeat": "no-repeat", "vertical-align": "middle", color: "color-mix(in srgb, #000 30%, transparent)", "@supports (color: color-mix(in lab, red, red))": { color: "color-mix(in oklab, var(--color-black) 30%, transparent)" }, "background-image": "radial-gradient( circle at 35% 30%, oklch(1 0 0 / calc(var(--depth) * 0.5)), #0000 )", "box-shadow": "0 2px 3px -1px color-mix(in oklab, currentColor calc(var(--depth) * 100%), #0000)" }, ".status-primary": { "background-color": "var(--color-primary)", color: "var(--color-primary)" }, ".status-secondary": { "background-color": "var(--color-secondary)", color: "var(--color-secondary)" }, ".status-accent": { "background-color": "var(--color-accent)", color: "var(--color-accent)" }, ".status-neutral": { "background-color": "var(--color-neutral)", color: "var(--color-neutral)" }, ".status-info": { "background-color": "var(--color-info)", color: "var(--color-info)" }, ".status-success": { "background-color": "var(--color-success)", color: "var(--color-success)" }, ".status-warning": { "background-color": "var(--color-warning)", color: "var(--color-warning)" }, ".status-error": { "background-color": "var(--color-error)", color: "var(--color-error)" }, ".status-xs": { width: "calc(0.25rem * 0.5)", height: "calc(0.25rem * 0.5)" }, ".status-sm": { width: "calc(0.25rem * 1)", height: "calc(0.25rem * 1)" }, ".status-md": { width: "calc(0.25rem * 2)", height: "calc(0.25rem * 2)" }, ".status-lg": { width: "calc(0.25rem * 3)", height: "calc(0.25rem * 3)" }, ".status-xl": { width: "calc(0.25rem * 4)", height: "calc(0.25rem * 4)" } }; + +// packages/daisyui/components/status/index.js +var status_default = ({ addComponents, prefix = "" }) => { + const prefixedstatus = addPrefix(object_default30, prefix); + addComponents({ ...prefixedstatus }); +}; + +// packages/daisyui/components/diff/object.js +var object_default31 = { ".diff": { position: "relative", display: "grid", width: "100%", overflow: "hidden", "webkit-user-select": "none", "user-select": "none", direction: "ltr", "container-type": "inline-size", "grid-template-columns": "auto 1fr", "&:focus-visible, &:has(.diff-item-1:focus-visible)": { "outline-style": "var(--tw-outline-style)", "outline-width": "2px", "outline-offset": "1px", "outline-color": "var(--color-base-content)" }, "&:focus-visible": { "outline-style": "var(--tw-outline-style)", "outline-width": "2px", "outline-offset": "1px", "outline-color": "var(--color-base-content)", ".diff-resizer": { "min-width": "90cqi", "max-width": "90cqi" } }, "&:has(.diff-item-2:focus-visible)": { "outline-style": "var(--tw-outline-style)", "outline-width": "2px", "outline-offset": "1px", ".diff-resizer": { "min-width": "10cqi", "max-width": "10cqi" } }, "@supports (-webkit-overflow-scrolling: touch) and (overflow: -webkit-paged-x)": { "&:focus": { ".diff-resizer": { "min-width": "10cqi", "max-width": "10cqi" } }, "&:has(.diff-item-1:focus)": { ".diff-resizer": { "min-width": "90cqi", "max-width": "90cqi" } } } }, ".diff-resizer": { position: "relative", top: "calc(1/2 * 100%)", "z-index": 1, "grid-column-start": "1", "grid-row-start": "1", height: "calc(0.25rem * 2)", width: "50cqi", "max-width": "calc(100cqi - 1rem)", "min-width": "1rem", resize: "horizontal", overflow: "hidden", opacity: "0%", transform: "scaleY(3) translate(0.35rem, 0.08rem)", cursor: "ew-resize", "transform-origin": "100% 100%", "clip-path": "inset(calc(100% - 0.75rem) 0 0 calc(100% - 0.75rem))", transition: "min-width 0.3s ease-out, max-width 0.3s ease-out" }, ".diff-item-2": { position: "relative", "grid-column-start": "1", "grid-row-start": "1", "&:after": { "pointer-events": "none", position: "absolute", top: "calc(1/2 * 100%)", right: "1px", bottom: "calc(0.25rem * 0)", "z-index": 2, "border-radius": "calc(infinity * 1px)", "background-color": "color-mix(in oklab, var(--color-base-100) 50%, transparent)", width: "1.2rem", height: "1.8rem", border: "2px solid var(--color-base-100)", content: '""', outline: "1px solid color-mix(in oklab, var(--color-base-content) 5%, #0000)", "outline-offset": "-3px", "backdrop-filter": "blur(8px)", "box-shadow": "0 1px 2px 0 oklch(0% 0 0 / 0.1)", translate: "50% -50%" }, "> *": { "pointer-events": "none", position: "absolute", top: "calc(0.25rem * 0)", bottom: "calc(0.25rem * 0)", left: "calc(0.25rem * 0)", height: "100%", width: "100cqi", "max-width": "none", "object-fit": "cover", "object-position": "center" }, "@supports (-webkit-overflow-scrolling: touch) and (overflow: -webkit-paged-x)": { "&:after": { content: "none" } } }, ".diff-item-1": { position: "relative", "z-index": 1, "grid-column-start": "1", "grid-row-start": "1", overflow: "hidden", "border-right": "2px solid var(--color-base-100)", "> *": { "pointer-events": "none", position: "absolute", top: "calc(0.25rem * 0)", bottom: "calc(0.25rem * 0)", left: "calc(0.25rem * 0)", height: "100%", width: "100cqi", "max-width": "none", "object-fit": "cover", "object-position": "center" } } }; + +// packages/daisyui/components/diff/index.js +var diff_default = ({ addComponents, prefix = "" }) => { + const prefixeddiff = addPrefix(object_default31, prefix); + addComponents({ ...prefixeddiff }); +}; + +// packages/daisyui/components/hero/object.js +var object_default32 = { ".hero": { display: "grid", width: "100%", "place-items": "center", "background-size": "cover", "background-position": "center", "& > *": { "grid-column-start": "1", "grid-row-start": "1" } }, ".hero-overlay": { "grid-column-start": "1", "grid-row-start": "1", height: "100%", width: "100%", "background-color": "color-mix(in oklab, var(--color-neutral) 50%, transparent)" }, ".hero-content": { isolation: "isolate", display: "flex", "max-width": "80rem", "align-items": "center", "justify-content": "center", gap: "calc(0.25rem * 4)", padding: "calc(0.25rem * 4)" } }; + +// packages/daisyui/components/hero/index.js +var hero_default = ({ addComponents, prefix = "" }) => { + const prefixedhero = addPrefix(object_default32, prefix); + addComponents({ ...prefixedhero }); +}; + +// packages/daisyui/components/toggle/object.js +var object_default33 = { ".toggle": { border: "var(--border) solid currentColor", color: "var(--input-color)", position: "relative", display: "inline-grid", "flex-shrink": 0, cursor: "pointer", appearance: "none", "place-content": "center", "vertical-align": "middle", "webkit-user-select": "none", "user-select": "none", "grid-template-columns": "0fr 1fr 1fr", "--radius-selector-max": `calc( + var(--radius-selector) + var(--radius-selector) + var(--radius-selector) + )`, "border-radius": "calc( var(--radius-selector) + min(var(--toggle-p), var(--radius-selector-max)) + min(var(--border), var(--radius-selector-max)) )", padding: "var(--toggle-p)", "box-shadow": "0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000) inset", transition: "color 0.3s, grid-template-columns 0.2s", "--input-color": "color-mix(in oklab, var(--color-base-content) 50%, #0000)", "--toggle-p": "calc(var(--size) * 0.125)", "--size": "calc(var(--size-selector, 0.25rem) * 6)", width: "calc((var(--size) * 2) - (var(--border) + var(--toggle-p)) * 2)", height: "var(--size)", "> *": { "z-index": 1, "grid-column": "span 1 / span 1", "grid-column-start": "2", "grid-row-start": "1", height: "100%", cursor: "pointer", appearance: "none", "background-color": "transparent", padding: "calc(0.25rem * 0.5)", transition: "opacity 0.2s, rotate 0.4s", border: "none", "&:focus": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:nth-child(2)": { color: "var(--color-base-100)", rotate: "0deg" }, "&:nth-child(3)": { color: "var(--color-base-100)", opacity: "0%", rotate: "-15deg" } }, "&:has(:checked)": { "> :nth-child(2)": { opacity: "0%", rotate: "15deg" }, "> :nth-child(3)": { opacity: "100%", rotate: "0deg" } }, "&:before": { position: "relative", "inset-inline-start": "calc(0.25rem * 0)", "grid-column-start": "2", "grid-row-start": "1", "aspect-ratio": "1 / 1", height: "100%", "border-radius": "var(--radius-selector)", "background-color": "currentColor", translate: "0", "--tw-content": '""', content: "var(--tw-content)", transition: "background-color 0.1s, translate 0.2s, inset-inline-start 0.2s", "box-shadow": "0 -1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000)", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)" }, "@media (forced-colors: active)": { "&:before": { "outline-style": "var(--tw-outline-style)", "outline-width": "1px", "outline-offset": "calc(1px * -1)" } }, "@media print": { "&:before": { outline: "0.25rem solid", "outline-offset": "-1rem" } }, "&:focus-visible, &:has(:focus-visible)": { outline: "2px solid currentColor", "outline-offset": "2px" }, '&:checked, &[aria-checked="true"], &:has(> input:checked)': { "grid-template-columns": "1fr 1fr 0fr", "background-color": "var(--color-base-100)", "--input-color": "var(--color-base-content)", "&:before": { "background-color": "currentColor" }, "@starting-style": { "&:before": { opacity: 0 } } }, "&:indeterminate": { "grid-template-columns": "0.5fr 1fr 0.5fr" }, "&:disabled": { cursor: "not-allowed", opacity: "30%", "&:before": { "background-color": "transparent", border: "var(--border) solid currentColor" } } }, ".toggle-primary": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-primary)" } }, ".toggle-secondary": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-secondary)" } }, ".toggle-accent": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-accent)" } }, ".toggle-neutral": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-neutral)" } }, ".toggle-success": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-success)" } }, ".toggle-warning": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-warning)" } }, ".toggle-info": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-info)" } }, ".toggle-error": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-error)" } }, ".toggle-xs": { '&:is([type="checkbox"]), &:has([type="checkbox"])': { "--size": "calc(var(--size-selector, 0.25rem) * 4)" } }, ".toggle-sm": { '&:is([type="checkbox"]), &:has([type="checkbox"])': { "--size": "calc(var(--size-selector, 0.25rem) * 5)" } }, ".toggle-md": { '&:is([type="checkbox"]), &:has([type="checkbox"])': { "--size": "calc(var(--size-selector, 0.25rem) * 6)" } }, ".toggle-lg": { '&:is([type="checkbox"]), &:has([type="checkbox"])': { "--size": "calc(var(--size-selector, 0.25rem) * 7)" } }, ".toggle-xl": { '&:is([type="checkbox"]), &:has([type="checkbox"])': { "--size": "calc(var(--size-selector, 0.25rem) * 8)" } } }; + +// packages/daisyui/components/toggle/index.js +var toggle_default = ({ addComponents, prefix = "" }) => { + const prefixedtoggle = addPrefix(object_default33, prefix); + addComponents({ ...prefixedtoggle }); +}; + +// packages/daisyui/components/stack/object.js +var object_default34 = { ".stack": { display: "inline-grid", "grid-template-columns": "3px 4px 1fr 4px 3px", "grid-template-rows": "3px 4px 1fr 4px 3px", "& > *": { height: "100%", width: "100%", "&:nth-child(n + 2)": { width: "100%", opacity: "70%" }, "&:nth-child(2)": { "z-index": 2, opacity: "90%" }, "&:nth-child(1)": { "z-index": 3, width: "100%" } }, "&, &.stack-bottom": { "> *": { "grid-column": "3 / 4", "grid-row": "3 / 6", "&:nth-child(2)": { "grid-column": "2 / 5", "grid-row": "2 / 5" }, "&:nth-child(1)": { "grid-column": "1 / 6", "grid-row": "1 / 4" } } }, "&.stack-top": { "> *": { "grid-column": "3 / 4", "grid-row": "1 / 4", "&:nth-child(2)": { "grid-column": "2 / 5", "grid-row": "2 / 5" }, "&:nth-child(1)": { "grid-column": "1 / 6", "grid-row": "3 / 6" } } }, "&.stack-start": { "> *": { "grid-column": "1 / 4", "grid-row": "3 / 4", "&:nth-child(2)": { "grid-column": "2 / 5", "grid-row": "2 / 5" }, "&:nth-child(1)": { "grid-column": "3 / 6", "grid-row": "1 / 6" } } }, "&.stack-end": { "> *": { "grid-column": "3 / 6", "grid-row": "3 / 4", "&:nth-child(2)": { "grid-column": "2 / 5", "grid-row": "2 / 5" }, "&:nth-child(1)": { "grid-column": "1 / 4", "grid-row": "1 / 6" } } } } }; + +// packages/daisyui/components/stack/index.js +var stack_default = ({ addComponents, prefix = "" }) => { + const prefixedstack = addPrefix(object_default34, prefix); + addComponents({ ...prefixedstack }); +}; + +// packages/daisyui/components/navbar/object.js +var object_default35 = { ".navbar": { display: "flex", width: "100%", "align-items": "center", padding: "0.5rem", "min-height": "4rem" }, ".navbar-start": { display: "inline-flex", "align-items": "center", width: "50%", "justify-content": "flex-start" }, ".navbar-center": { display: "inline-flex", "align-items": "center", "flex-shrink": 0 }, ".navbar-end": { display: "inline-flex", "align-items": "center", width: "50%", "justify-content": "flex-end" } }; + +// packages/daisyui/components/navbar/index.js +var navbar_default = ({ addComponents, prefix = "" }) => { + const prefixednavbar = addPrefix(object_default35, prefix); + addComponents({ ...prefixednavbar }); +}; + +// packages/daisyui/components/label/object.js +var object_default36 = { ".label": { display: "inline-flex", "align-items": "center", gap: "calc(0.25rem * 1.5)", "white-space": "nowrap", color: "color-mix(in oklab, currentColor 60%, transparent)", "&:has(input)": { cursor: "pointer" }, "&:is(.input > *, .select > *)": { display: "flex", height: "calc(100% - 0.5rem)", "align-items": "center", "padding-inline": "calc(0.25rem * 3)", "white-space": "nowrap", "font-size": "inherit", "&:first-child": { "margin-inline-start": "calc(0.25rem * -3)", "margin-inline-end": "calc(0.25rem * 3)", "border-inline-end": "var(--border) solid color-mix(in oklab, currentColor 10%, #0000)" }, "&:last-child": { "margin-inline-start": "calc(0.25rem * 3)", "margin-inline-end": "calc(0.25rem * -3)", "border-inline-start": "var(--border) solid color-mix(in oklab, currentColor 10%, #0000)" } } }, ".floating-label": { position: "relative", display: "block", input: { display: "block", "&::placeholder": { transition: "top 0.1s ease-out, translate 0.1s ease-out, scale 0.1s ease-out, opacity 0.1s ease-out" } }, textarea: { "&::placeholder": { transition: "top 0.1s ease-out, translate 0.1s ease-out, scale 0.1s ease-out, opacity 0.1s ease-out" } }, "> span": { position: "absolute", "inset-inline-start": "calc(0.25rem * 3)", "z-index": 1, "background-color": "var(--color-base-100)", "padding-inline": "calc(0.25rem * 1)", opacity: "0%", "font-size": "0.875rem", top: "calc(var(--size-field, 0.25rem) * 10 / 2)", "line-height": 1, "border-radius": "2px", "pointer-events": "none", translate: "0 -50%", transition: "top 0.1s ease-out, translate 0.1s ease-out, scale 0.1s ease-out, opacity 0.1s ease-out" }, "&:focus-within, &:not(:has(input:placeholder-shown, textarea:placeholder-shown))": { "::placeholder": { opacity: "0%", top: "0", translate: "-12.5% calc(-50% - 0.125em)", scale: "0.75", "pointer-events": "auto" }, "> span": { opacity: "100%", top: "0", translate: "-12.5% calc(-50% - 0.125em)", scale: "0.75", "pointer-events": "auto", "z-index": 2 } }, "&:has(:disabled, [disabled])": { "> span": { opacity: "0%" } }, "&:has(.input-xs, .select-xs, .textarea-xs) span": { "font-size": "0.6875rem", top: "calc(var(--size-field, 0.25rem) * 6 / 2)" }, "&:has(.input-sm, .select-sm, .textarea-sm) span": { "font-size": "0.75rem", top: "calc(var(--size-field, 0.25rem) * 8 / 2)" }, "&:has(.input-md, .select-md, .textarea-md) span": { "font-size": "0.875rem", top: "calc(var(--size-field, 0.25rem) * 10 / 2)" }, "&:has(.input-lg, .select-lg, .textarea-lg) span": { "font-size": "1.125rem", top: "calc(var(--size-field, 0.25rem) * 12 / 2)" }, "&:has(.input-xl, .select-xl, .textarea-xl) span": { "font-size": "1.375rem", top: "calc(var(--size-field, 0.25rem) * 14 / 2)" } } }; + +// packages/daisyui/components/label/index.js +var label_default = ({ addComponents, prefix = "" }) => { + const prefixedlabel = addPrefix(object_default36, prefix); + addComponents({ ...prefixedlabel }); +}; + +// packages/daisyui/components/menu/object.js +var object_default37 = { ".menu": { display: "flex", width: "fit-content", "flex-direction": "column", "flex-wrap": "wrap", padding: "calc(0.25rem * 2)", "--menu-active-fg": "var(--color-neutral-content)", "--menu-active-bg": "var(--color-neutral)", "font-size": "0.875rem", ":where(li ul)": { position: "relative", "margin-inline-start": "calc(0.25rem * 4)", "padding-inline-start": "calc(0.25rem * 2)", "white-space": "nowrap", "&:before": { position: "absolute", "inset-inline-start": "calc(0.25rem * 0)", top: "calc(0.25rem * 3)", bottom: "calc(0.25rem * 3)", "background-color": "var(--color-base-content)", opacity: "10%", width: "var(--border)", content: '""' } }, ":where(li > .menu-dropdown:not(.menu-dropdown-show))": { display: "none" }, ":where(li:not(.menu-title) > *:not(ul, details, .menu-title, .btn)), :where(li:not(.menu-title) > details > summary:not(.menu-title))": { display: "grid", "grid-auto-flow": "column", "align-content": "flex-start", "align-items": "center", gap: "calc(0.25rem * 2)", "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 1.5)", "text-align": "start", "transition-property": "color, background-color, box-shadow", "transition-duration": "0.2s", "transition-timing-function": "cubic-bezier(0, 0, 0.2, 1)", "grid-auto-columns": "minmax(auto, max-content) auto max-content", "text-wrap": "balance", "user-select": "none" }, ":where(li > details > summary)": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" }, "&::-webkit-details-marker": { display: "none" } }, ":where(li > details > summary), :where(li > .menu-dropdown-toggle)": { "&:after": { "justify-self": "flex-end", display: "block", height: "0.375rem", width: "0.375rem", rotate: "-135deg", translate: "0 -1px", "transition-property": "rotate, translate", "transition-duration": "0.2s", content: '""', "transform-origin": "50% 50%", "box-shadow": "2px 2px inset", "pointer-events": "none" } }, ":where(li > details[open] > summary):after, :where(li > .menu-dropdown-toggle.menu-dropdown-show):after": { rotate: "45deg", translate: "0 1px" }, ":where( li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title), li:not(.menu-title, .disabled) > details > summary:not(.menu-title) ):not(.menu-active, :active, .btn)": { "&.menu-focus, &:focus-visible": { cursor: "pointer", "background-color": "color-mix(in oklab, var(--color-base-content) 10%, transparent)", color: "var(--color-base-content)", "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } } }, ":where( li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title):not(.menu-active, :active, .btn):hover, li:not(.menu-title, .disabled) > details > summary:not(.menu-title):not(.menu-active, :active, .btn):hover )": { cursor: "pointer", "background-color": "color-mix(in oklab, var(--color-base-content) 10%, transparent)", "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" }, "box-shadow": "0 1px oklch(0% 0 0 / 0.01) inset, 0 -1px oklch(100% 0 0 / 0.01) inset" }, ":where(li:empty)": { "background-color": "var(--color-base-content)", opacity: "10%", margin: "0.5rem 1rem", height: "1px" }, ":where(li)": { position: "relative", display: "flex", "flex-shrink": 0, "flex-direction": "column", "flex-wrap": "wrap", "align-items": "stretch", ".badge": { "justify-self": "flex-end" }, "& > *:not(ul, .menu-title, details, .btn):active, & > *:not(ul, .menu-title, details, .btn).menu-active, & > details > summary:active": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" }, color: "var(--menu-active-fg)", "background-color": "var(--menu-active-bg)", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)", "&:not(&:active)": { "box-shadow": "0 2px calc(var(--depth) * 3px) -2px var(--menu-active-bg)" } }, "&.menu-disabled": { "pointer-events": "none", color: "color-mix(in oklab, var(--color-base-content) 20%, transparent)" } }, ".dropdown:focus-within": { ".menu-dropdown-toggle:after": { rotate: "45deg", translate: "0 1px" } }, ".dropdown-content": { "margin-top": "calc(0.25rem * 2)", padding: "calc(0.25rem * 2)", "&:before": { display: "none" } } }, ".menu-title": { "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 2)", color: "color-mix(in oklab, var(--color-base-content) 40%, transparent)", "font-size": "0.875rem", "font-weight": 600 }, ".menu-horizontal": { display: "inline-flex", "flex-direction": "row", "& > li:not(.menu-title) > details > ul": { position: "absolute", "margin-inline-start": "calc(0.25rem * 0)", "margin-top": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 2)", "padding-inline-end": "calc(0.25rem * 2)" }, "& > li > details > ul": { "&:before": { content: "none" } }, ":where(& > li:not(.menu-title) > details > ul)": { "border-radius": "var(--radius-box)", "background-color": "var(--color-base-100)", "box-shadow": "0 1px 3px 0 oklch(0% 0 0/0.1), 0 1px 2px -1px oklch(0% 0 0/0.1)" } }, ".menu-vertical": { display: "inline-flex", "flex-direction": "column", "& > li:not(.menu-title) > details > ul": { position: "relative", "margin-inline-start": "calc(0.25rem * 4)", "margin-top": "calc(0.25rem * 0)", "padding-block": "calc(0.25rem * 0)", "padding-inline-end": "calc(0.25rem * 0)" } }, ".menu-xs": { ":where(li:not(.menu-title) > *:not(ul, details, .menu-title)), :where(li:not(.menu-title) > details > summary:not(.menu-title))": { "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 2)", "padding-block": "calc(0.25rem * 1)", "font-size": "0.6875rem" }, ".menu-title": { "padding-inline": "calc(0.25rem * 2)", "padding-block": "calc(0.25rem * 1)" } }, ".menu-sm": { ":where(li:not(.menu-title) > *:not(ul, details, .menu-title)), :where(li:not(.menu-title) > details > summary:not(.menu-title))": { "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 2.5)", "padding-block": "calc(0.25rem * 1)", "font-size": "0.75rem" }, ".menu-title": { "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 2)" } }, ".menu-md": { ":where(li:not(.menu-title) > *:not(ul, details, .menu-title)), :where(li:not(.menu-title) > details > summary:not(.menu-title))": { "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 1.5)", "font-size": "0.875rem" }, ".menu-title": { "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 2)" } }, ".menu-lg": { ":where(li:not(.menu-title) > *:not(ul, details, .menu-title)), :where(li:not(.menu-title) > details > summary:not(.menu-title))": { "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 1.5)", "font-size": "1.125rem" }, ".menu-title": { "padding-inline": "calc(0.25rem * 6)", "padding-block": "calc(0.25rem * 3)" } }, ".menu-xl": { ":where(li:not(.menu-title) > *:not(ul, details, .menu-title)), :where(li:not(.menu-title) > details > summary:not(.menu-title))": { "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 5)", "padding-block": "calc(0.25rem * 1.5)", "font-size": "1.375rem" }, ".menu-title": { "padding-inline": "calc(0.25rem * 6)", "padding-block": "calc(0.25rem * 3)" } } }; + +// packages/daisyui/components/menu/index.js +var menu_default = ({ addComponents, prefix = "" }) => { + const prefixedmenu = addPrefix(object_default37, prefix); + addComponents({ ...prefixedmenu }); +}; + +// packages/daisyui/components/toast/object.js +var object_default38 = { ".toast": { position: "fixed", "inset-inline-start": "auto", "inset-inline-end": "calc(0.25rem * 4)", top: "auto", bottom: "calc(0.25rem * 4)", display: "flex", "flex-direction": "column", gap: "calc(0.25rem * 2)", "background-color": "transparent", translate: "var(--toast-x, 0) var(--toast-y, 0)", width: "max-content", "max-width": "calc(100vw - 2rem)", "& > *": { animation: "toast 0.25s ease-out" }, "&:where(.toast-start)": { "inset-inline-start": "calc(0.25rem * 4)", "inset-inline-end": "auto", "--toast-x": "0" }, "&:where(.toast-center)": { "inset-inline-start": "calc(1/2 * 100%)", "inset-inline-end": "calc(1/2 * 100%)", "--toast-x": "-50%" }, "&:where(.toast-end)": { "inset-inline-start": "auto", "inset-inline-end": "calc(0.25rem * 4)", "--toast-x": "0" }, "&:where(.toast-bottom)": { top: "auto", bottom: "calc(0.25rem * 4)", "--toast-y": "0" }, "&:where(.toast-middle)": { top: "calc(1/2 * 100%)", bottom: "auto", "--toast-y": "-50%" }, "&:where(.toast-top)": { top: "calc(0.25rem * 4)", bottom: "auto", "--toast-y": "0" } }, "@keyframes toast": { "0%": { scale: "0.9", opacity: 0 }, "100%": { scale: "1", opacity: 1 } } }; + +// packages/daisyui/components/toast/index.js +var toast_default = ({ addComponents, prefix = "" }) => { + const prefixedtoast = addPrefix(object_default38, prefix); + addComponents({ ...prefixedtoast }); +}; + +// packages/daisyui/components/button/object.js +var object_default39 = { ":where(.btn)": { width: "unset" }, ".btn": { display: "inline-flex", "flex-shrink": 0, cursor: "pointer", "flex-wrap": "nowrap", "align-items": "center", "justify-content": "center", gap: "calc(0.25rem * 1.5)", "text-align": "center", "vertical-align": "middle", "outline-offset": "2px", "webkit-user-select": "none", "user-select": "none", "padding-inline": "var(--btn-p)", color: "var(--btn-fg)", "--tw-prose-links": "var(--btn-fg)", height: "var(--size)", "font-size": "var(--fontsize, 0.875rem)", "font-weight": 600, "outline-color": "var(--btn-color, var(--color-base-content))", "transition-property": "color, background-color, border-color, box-shadow", "transition-timing-function": "cubic-bezier(0, 0, 0.2, 1)", "transition-duration": "0.2s", "border-start-start-radius": "var(--join-ss, var(--radius-field))", "border-start-end-radius": "var(--join-se, var(--radius-field))", "border-end-start-radius": "var(--join-es, var(--radius-field))", "border-end-end-radius": "var(--join-ee, var(--radius-field))", "background-color": "var(--btn-bg)", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--btn-noise)", "border-width": "var(--border)", "border-style": "solid", "border-color": "var(--btn-border)", "text-shadow": "0 0.5px oklch(100% 0 0 / calc(var(--depth) * 0.15))", "touch-action": "manipulation", "box-shadow": "0 0.5px 0 0.5px oklch(100% 0 0 / calc(var(--depth) * 6%)) inset, var(--btn-shadow)", "--size": "calc(var(--size-field, 0.25rem) * 10)", "--btn-bg": "var(--btn-color, var(--color-base-200))", "--btn-fg": "var(--color-base-content)", "--btn-p": "1rem", "--btn-border": "color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%))", "--btn-shadow": `0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), + 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)`, "--btn-noise": "var(--fx-noise)", ".prose &": { "text-decoration-line": "none" }, "@media (hover: hover)": { "&:hover": { "--btn-bg": "color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%)" } }, "&:focus-visible": { "outline-width": "2px", "outline-style": "solid", isolation: "isolate" }, "&:active:not(.btn-active)": { translate: "0 0.5px", "--btn-bg": "color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 5%)", "--btn-border": "color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%)", "--btn-shadow": "0 0 0 0 oklch(0% 0 0/0), 0 0 0 0 oklch(0% 0 0/0)" }, "&:is(:disabled, [disabled], .btn-disabled)": { "&:not(.btn-link, .btn-ghost)": { "background-color": "color-mix(in oklab, var(--color-base-content) 10%, transparent)", "box-shadow": "none" }, "pointer-events": "none", "--btn-border": "#0000", "--btn-noise": "none", "--btn-fg": "color-mix(in oklch, var(--color-base-content) 20%, #0000)", "@media (hover: hover)": { "&:hover": { "pointer-events": "none", "background-color": "color-mix(in oklab, var(--color-neutral) 20%, transparent)", "--btn-border": "#0000", "--btn-fg": "color-mix(in oklch, var(--color-base-content) 20%, #0000)" } } }, '&:is(input[type="checkbox"], input[type="radio"])': { appearance: "none", "&::after": { content: "attr(aria-label)" } }, "&:where(input:checked:not(.filter .btn))": { "--btn-color": "var(--color-primary)", "--btn-fg": "var(--color-primary-content)", isolation: "isolate" } }, ".btn-active": { "--btn-bg": "color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%)", "--btn-shadow": "0 0 0 0 oklch(0% 0 0/0), 0 0 0 0 oklch(0% 0 0/0)", isolation: "isolate" }, ".btn-primary": { "--btn-color": "var(--color-primary)", "--btn-fg": "var(--color-primary-content)" }, ".btn-secondary": { "--btn-color": "var(--color-secondary)", "--btn-fg": "var(--color-secondary-content)" }, ".btn-accent": { "--btn-color": "var(--color-accent)", "--btn-fg": "var(--color-accent-content)" }, ".btn-neutral": { "--btn-color": "var(--color-neutral)", "--btn-fg": "var(--color-neutral-content)" }, ".btn-info": { "--btn-color": "var(--color-info)", "--btn-fg": "var(--color-info-content)" }, ".btn-success": { "--btn-color": "var(--color-success)", "--btn-fg": "var(--color-success-content)" }, ".btn-warning": { "--btn-color": "var(--color-warning)", "--btn-fg": "var(--color-warning-content)" }, ".btn-error": { "--btn-color": "var(--color-error)", "--btn-fg": "var(--color-error-content)" }, ".btn-ghost": { "&:not(.btn-active, :hover, :active:focus, :focus-visible)": { "--btn-shadow": '""', "--btn-bg": "#0000", "--btn-border": "#0000", "--btn-noise": "none", "&:not(:disabled, [disabled], .btn-disabled)": { "outline-color": "currentColor", "--btn-fg": "currentColor" } } }, ".btn-link": { "text-decoration-line": "underline", "outline-color": "currentColor", "--btn-border": "#0000", "--btn-bg": "#0000", "--btn-fg": "var(--color-primary)", "--btn-noise": "none", "--btn-shadow": '""', "&:is(.btn-active, :hover, :active:focus, :focus-visible)": { "text-decoration-line": "underline", "--btn-border": "#0000", "--btn-bg": "#0000" } }, ".btn-outline": { "&:not( .btn-active, :hover, :active:focus, :focus-visible, :disabled, [disabled], .btn-disabled, :checked )": { "--btn-shadow": '""', "--btn-bg": "#0000", "--btn-fg": "var(--btn-color)", "--btn-border": "var(--btn-color)", "--btn-noise": "none" }, "@media (hover: none)": { "&:hover:not( .btn-active, :active, :focus-visible, :disabled, [disabled], .btn-disabled, :checked )": { "--btn-shadow": '""', "--btn-bg": "#0000", "--btn-fg": "var(--btn-color)", "--btn-border": "var(--btn-color)", "--btn-noise": "none" } } }, ".btn-dash": { "&:not( .btn-active, :hover, :active:focus, :focus-visible, :disabled, [disabled], .btn-disabled, :checked )": { "--btn-shadow": '""', "border-style": "dashed", "--btn-bg": "#0000", "--btn-fg": "var(--btn-color)", "--btn-border": "var(--btn-color)", "--btn-noise": "none" }, "@media (hover: none)": { "&:hover:not( .btn-active, :active, :focus-visible, :disabled, [disabled], .btn-disabled, :checked )": { "--btn-shadow": '""', "border-style": "dashed", "--btn-bg": "#0000", "--btn-fg": "var(--btn-color)", "--btn-border": "var(--btn-color)", "--btn-noise": "none" } } }, ".btn-soft": { "&:not(.btn-active, :hover, :active:focus, :focus-visible, :disabled, [disabled], .btn-disabled)": { "--btn-shadow": '""', "--btn-fg": "var(--btn-color, var(--color-base-content))", "--btn-bg": `color-mix( + in oklab, + var(--btn-color, var(--color-base-content)) 8%, + var(--color-base-100) + )`, "--btn-border": `color-mix( + in oklab, + var(--btn-color, var(--color-base-content)) 10%, + var(--color-base-100) + )`, "--btn-noise": "none" }, "@media (hover: none)": { "&:hover:not(.btn-active, :active, :focus-visible, :disabled, [disabled], .btn-disabled)": { "--btn-shadow": '""', "--btn-fg": "var(--btn-color, var(--color-base-content))", "--btn-bg": `color-mix( + in oklab, + var(--btn-color, var(--color-base-content)) 8%, + var(--color-base-100) + )`, "--btn-border": `color-mix( + in oklab, + var(--btn-color, var(--color-base-content)) 10%, + var(--color-base-100) + )`, "--btn-noise": "none" } } }, ".btn-xs": { "--fontsize": "0.6875rem", "--btn-p": "0.5rem", "--size": "calc(var(--size-field, 0.25rem) * 6)" }, ".btn-sm": { "--fontsize": "0.75rem", "--btn-p": "0.75rem", "--size": "calc(var(--size-field, 0.25rem) * 8)" }, ".btn-md": { "--fontsize": "0.875rem", "--btn-p": "1rem", "--size": "calc(var(--size-field, 0.25rem) * 10)" }, ".btn-lg": { "--fontsize": "1.125rem", "--btn-p": "1.25rem", "--size": "calc(var(--size-field, 0.25rem) * 12)" }, ".btn-xl": { "--fontsize": "1.375rem", "--btn-p": "1.5rem", "--size": "calc(var(--size-field, 0.25rem) * 14)" }, ".btn-square": { "padding-inline": "calc(0.25rem * 0)", width: "var(--size)", height: "var(--size)" }, ".btn-circle": { "border-radius": "calc(infinity * 1px)", "padding-inline": "calc(0.25rem * 0)", width: "var(--size)", height: "var(--size)" }, ".btn-wide": { width: "100%", "max-width": "calc(0.25rem * 64)" }, ".btn-block": { width: "100%" } }; + +// packages/daisyui/components/button/index.js +var button_default = ({ addComponents, prefix = "" }) => { + const prefixedbutton = addPrefix(object_default39, prefix); + addComponents({ ...prefixedbutton }); +}; + +// packages/daisyui/components/list/object.js +var object_default40 = { ".list": { display: "flex", "flex-direction": "column", "font-size": "0.875rem", ":where(.list-row)": { "--list-grid-cols": "minmax(0, auto) 1fr", position: "relative", display: "grid", "grid-auto-flow": "column", gap: "calc(0.25rem * 4)", "border-radius": "var(--radius-box)", padding: "calc(0.25rem * 4)", "word-break": "break-word", "grid-template-columns": "var(--list-grid-cols)", "&:has(.list-col-grow:nth-child(1))": { "--list-grid-cols": "1fr" }, "&:has(.list-col-grow:nth-child(2))": { "--list-grid-cols": "minmax(0, auto) 1fr" }, "&:has(.list-col-grow:nth-child(3))": { "--list-grid-cols": "minmax(0, auto) minmax(0, auto) 1fr" }, "&:has(.list-col-grow:nth-child(4))": { "--list-grid-cols": "minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr" }, "&:has(.list-col-grow:nth-child(5))": { "--list-grid-cols": "minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr" }, "&:has(.list-col-grow:nth-child(6))": { "--list-grid-cols": `minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) + minmax(0, auto) 1fr` }, ":not(.list-col-wrap)": { "grid-row-start": "1" } }, "& > :not(:last-child)": { "&.list-row, .list-row": { "&:after": { content: '""', "border-bottom": "var(--border) solid", "inset-inline": "var(--radius-box)", position: "absolute", bottom: "calc(0.25rem * 0)", "border-color": "color-mix(in oklab, var(--color-base-content) 5%, transparent)" } } } }, ".list-col-wrap": { "grid-row-start": "2" } }; + +// packages/daisyui/components/list/index.js +var list_default = ({ addComponents, prefix = "" }) => { + const prefixedlist = addPrefix(object_default40, prefix); + addComponents({ ...prefixedlist }); +}; + +// packages/daisyui/components/mockup/object.js +var object_default41 = { ".mockup-code": { position: "relative", overflow: "hidden", "overflow-x": "auto", "border-radius": "var(--radius-box)", "background-color": "var(--color-neutral)", "padding-block": "calc(0.25rem * 5)", color: "var(--color-neutral-content)", "font-size": "0.875rem", direction: "ltr", "&:before": { content: '""', "margin-bottom": "calc(0.25rem * 4)", display: "block", height: "calc(0.25rem * 3)", width: "calc(0.25rem * 3)", "border-radius": "calc(infinity * 1px)", opacity: "30%", "box-shadow": "1.4em 0, 2.8em 0, 4.2em 0" }, pre: { "padding-right": "calc(0.25rem * 5)", "&:before": { content: '""', "margin-right": "2ch" }, "&[data-prefix]": { "&:before": { content: "attr(data-prefix)", display: "inline-block", width: "calc(0.25rem * 8)", "text-align": "right", opacity: "50%" } } } }, ".mockup-window": { position: "relative", display: "flex", "flex-direction": "column", overflow: "hidden", "overflow-x": "auto", "border-radius": "var(--radius-box)", "padding-top": "calc(0.25rem * 5)", "&:before": { content: '""', "margin-bottom": "calc(0.25rem * 4)", display: "block", "aspect-ratio": "1 / 1", height: "calc(0.25rem * 3)", "flex-shrink": 0, "align-self": "flex-start", "border-radius": "calc(infinity * 1px)", opacity: "30%", "box-shadow": "1.4em 0, 2.8em 0, 4.2em 0" }, '[dir="rtl"] &:before': { "align-self": "flex-end" }, "pre[data-prefix]": { "&:before": { content: "attr(data-prefix)", display: "inline-block", "text-align": "right" } } }, ".mockup-browser": { position: "relative", overflow: "hidden", "overflow-x": "auto", "border-radius": "var(--radius-box)", "pre[data-prefix]": { "&:before": { content: "attr(data-prefix)", display: "inline-block", "text-align": "right" } }, ".mockup-browser-toolbar": { "margin-block": "calc(0.25rem * 3)", display: "inline-flex", width: "100%", "align-items": "center", "padding-right": "1.4em", '&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *)': { "flex-direction": "row-reverse" }, "&:before": { content: '""', "margin-right": "4.8rem", display: "inline-block", "aspect-ratio": "1 / 1", height: "calc(0.25rem * 3)", "border-radius": "calc(infinity * 1px)", opacity: "30%", "box-shadow": "1.4em 0, 2.8em 0, 4.2em 0" }, ".input": { "margin-inline": "auto", display: "flex", height: "100%", "align-items": "center", gap: "calc(0.25rem * 2)", overflow: "hidden", "background-color": "var(--color-base-200)", "text-overflow": "ellipsis", "white-space": "nowrap", "font-size": "0.75rem", direction: "ltr", "&:before": { content: '""', width: "calc(0.25rem * 4)", height: "calc(0.25rem * 4)", opacity: "30%", "background-image": `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='currentColor' class='size-4'%3E%3Cpath fill-rule='evenodd' d='M9.965 11.026a5 5 0 1 1 1.06-1.06l2.755 2.754a.75.75 0 1 1-1.06 1.06l-2.755-2.754ZM10.5 7a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0Z' clip-rule='evenodd' /%3E%3C/svg%3E%0A")` } } } }, ".mockup-phone": { display: "inline-grid", "justify-items": "center", border: "6px solid #6b6b6b", "border-radius": "65px", "background-color": "#000", padding: "11px", overflow: "hidden" }, ".mockup-phone-camera": { "grid-column": "1/1", "grid-row": "1/1", background: "#000", height: "32px", width: "126px", "border-radius": "17px", "z-index": 1, "margin-top": "6px" }, ".mockup-phone-display": { "grid-column": "1/1", "grid-row": "1/1", overflow: "hidden", "border-radius": "49px", width: "390px", height: "845px" } }; + +// packages/daisyui/components/mockup/index.js +var mockup_default = ({ addComponents, prefix = "" }) => { + const prefixedmockup = addPrefix(object_default41, prefix); + addComponents({ ...prefixedmockup }); +}; + +// packages/daisyui/components/calendar/object.js +var object_default42 = { ".cally": { "font-size": "0.7rem", "&::part(container)": { padding: "0.5rem 1rem", "user-select": "none" }, "::part(th)": { "font-weight": "normal", "block-size": "auto" }, "&::part(header)": { direction: "ltr" }, "::part(head)": { opacity: 0.5, "font-size": "0.7rem" }, "&::part(button)": { "border-radius": "var(--radius-field)", border: "none", padding: "0.5rem", background: "#0000" }, "&::part(button):hover": { background: "var(--color-base-200)" }, "::part(day)": { "border-radius": "var(--radius-field)", "font-size": "0.7rem" }, "::part(button day today)": { background: "var(--color-primary)", color: "var(--color-primary-content)" }, "::part(selected)": { color: "var(--color-base-100)", background: "var(--color-base-content)", "border-radius": "var(--radius-field)" }, "::part(range-inner)": { "border-radius": "0" }, "::part(range-start)": { "border-start-end-radius": "0", "border-end-end-radius": "0" }, "::part(range-end)": { "border-start-start-radius": "0", "border-end-start-radius": "0" }, "::part(range-start range-end)": { "border-radius": "var(--radius-field)" }, "calendar-month": { width: "100%" } }, ".react-day-picker": { "user-select": "none", "background-color": "var(--color-base-100)", "border-radius": "var(--radius-box)", border: "var(--border) solid var(--color-base-200)", "font-size": "0.75rem", display: "inline-block", position: "relative", overflow: "clip", '&[dir="rtl"]': { ".rdp-nav": { ".rdp-chevron": { "transform-origin": "50%", transform: "rotate(180deg)" } } }, "*": { "box-sizing": "border-box" }, ".rdp-day": { width: "2.25rem", height: "2.25rem", "text-align": "center" }, ".rdp-day_button": { cursor: "pointer", font: "inherit", color: "inherit", width: "2.25rem", height: "2.25rem", border: "2px solid #0000", "border-radius": "var(--radius-field)", background: "0 0", "justify-content": "center", "align-items": "center", margin: "0", padding: "0", display: "flex", "&:disabled": { cursor: "revert" }, "&:hover": { "background-color": "var(--color-base-200)" } }, ".rdp-caption_label": { "z-index": 1, "white-space": "nowrap", border: "0", "align-items": "center", display: "inline-flex", position: "relative" }, ".rdp-button_next": { "border-radius": "var(--radius-field)", "&:hover": { "background-color": "var(--color-base-200)" } }, ".rdp-button_previous": { "border-radius": "var(--radius-field)", "&:hover": { "background-color": "var(--color-base-200)" } }, ".rdp-button_next, .rdp-button_previous": { cursor: "pointer", font: "inherit", color: "inherit", appearance: "none", width: "2.25rem", height: "2.25rem", background: "0 0", border: "none", "justify-content": "center", "align-items": "center", margin: "0", padding: "0", display: "inline-flex", position: "relative", "&:disabled": { cursor: "revert", opacity: 0.5 } }, ".rdp-chevron": { fill: "var(--color-base-content)", width: "1rem", height: "1rem", display: "inline-block" }, ".rdp-dropdowns": { "align-items": "center", gap: "0.5rem", display: "inline-flex", position: "relative" }, ".rdp-dropdown": { "z-index": 2, opacity: 0, appearance: "none", cursor: "inherit", "line-height": "inherit", border: "none", width: "100%", margin: "0", padding: "0", position: "absolute", "inset-block": "0", "inset-inline-start": "0", "&:focus-visible": { "~ .rdp-caption_label": { outline: ["5px auto highlight", "5px auto -webkit-focus-ring-color"] } } }, ".rdp-dropdown_root": { "align-items": "center", display: "inline-flex", position: "relative", '&[data-disabled="true"]': { ".rdp-chevron": { opacity: 0.5 } } }, ".rdp-month_caption": { height: "2.75rem", "font-size": "0.75rem", "font-weight": "inherit", "place-content": "center", display: "flex" }, ".rdp-months": { gap: "2rem", "flex-wrap": "wrap", "max-width": "fit-content", padding: "0.5rem", display: "flex", position: "relative" }, ".rdp-month_grid": { "border-collapse": "collapse" }, ".rdp-nav": { height: "2.75rem", "inset-block-start": "0", "inset-inline-end": "0", "justify-content": "space-between", "align-items": "center", width: "100%", "padding-inline": "0.5rem", display: "flex", position: "absolute", top: "0.25rem" }, ".rdp-weekday": { opacity: 0.6, padding: "0.5rem 0rem", "text-align": "center", "font-size": "smaller", "font-weight": 500 }, ".rdp-week_number": { opacity: 0.6, height: "2.25rem", width: "2.25rem", border: "none", "border-radius": "100%", "text-align": "center", "font-size": "small", "font-weight": 400 }, ".rdp-today:not(.rdp-outside)": { ".rdp-day_button": { background: "var(--color-primary)", color: "var(--color-primary-content)" } }, ".rdp-selected": { "font-weight": "inherit", "font-size": "0.75rem", ".rdp-day_button": { color: "var(--color-base-100)", "background-color": "var(--color-base-content)", "border-radius": "var(--radius-field)", border: "none", "&:hover": { "background-color": "var(--color-base-content)" } } }, ".rdp-outside": { opacity: 0.75 }, ".rdp-disabled": { opacity: 0.5 }, ".rdp-hidden": { visibility: "hidden", color: "var(--color-base-content)" }, ".rdp-range_start": { ".rdp-day_button": { "border-radius": "var(--radius-field) 0 0 var(--radius-field)" } }, ".rdp-range_start .rdp-day_button": { "background-color": "var(--color-base-content)", color: "var(--color-base-content)" }, ".rdp-range_middle": { "background-color": "var(--color-base-200)" }, ".rdp-range_middle .rdp-day_button": { border: "unset", "border-radius": "unset", color: "inherit" }, ".rdp-range_end": { color: "var(--color-base-content)", ".rdp-day_button": { "border-radius": "0 var(--radius-field) var(--radius-field) 0" } }, ".rdp-range_end .rdp-day_button": { color: "var(--color-base-content)", "background-color": "var(--color-base-content)" }, ".rdp-range_start.rdp-range_end": { background: "revert" }, ".rdp-focusable": { cursor: "pointer" }, ".rdp-footer": { "border-top": "var(--border) solid var(--color-base-200)", padding: "0.5rem" } }, ".pika-single": { "&:is(div)": { "user-select": "none", "font-size": "0.75rem", "z-index": 999, display: "inline-block", position: "relative", color: "var(--color-base-content)", "background-color": "var(--color-base-100)", "border-radius": "var(--radius-box)", border: "var(--border) solid var(--color-base-200)", padding: "0.5rem", "&:before, &:after": { content: '""', display: "table" }, "&:after": { clear: "both" }, "&.is-hidden": { display: "none" }, "&.is-bound": { position: "absolute" }, ".pika-lendar": { "css-float": "left" }, ".pika-title": { position: "relative", "text-align": "center", select: { cursor: "pointer", position: "absolute", "z-index": 999, margin: "0", left: "0", top: "5px", opacity: 0 } }, ".pika-label": { display: "inline-block", position: "relative", "z-index": 999, overflow: "hidden", margin: "0", padding: "5px 3px", "background-color": "var(--color-base-100)" }, ".pika-prev, .pika-next": { display: "block", cursor: "pointer", position: "absolute", top: "0", outline: "none", border: "0", width: "2.25rem", height: "2.25rem", color: "#0000", "font-size": "1.2em", "border-radius": "var(--radius-field)", "&:hover": { "background-color": "var(--color-base-200)" }, "&.is-disabled": { cursor: "default", opacity: 0.2 }, "&:before": { display: "inline-block", width: "2.25rem", height: "2.25rem", "line-height": 2.25, color: "var(--color-base-content)" } }, ".pika-prev": { left: "0", "&:before": { content: '"โ€น"' } }, ".pika-next": { right: "0", "&:before": { content: '"โ€บ"' } }, ".pika-select": { display: "inline-block" }, ".pika-table": { width: "100%", "border-collapse": "collapse", "border-spacing": "0", border: "0", "th, td": { padding: "0" }, th: { opacity: 0.6, "text-align": "center", width: "2.25rem", height: "2.25rem" } }, ".pika-button": { cursor: "pointer", display: "block", outline: "none", border: "0", margin: "0", width: "2.25rem", height: "2.25rem", padding: "5px", "text-align": ["right", "center"] }, ".pika-week": { color: "var(--color-base-content)" }, ".is-today": { ".pika-button": { background: "var(--color-primary)", color: "var(--color-primary-content)" } }, ".is-selected, .has-event": { ".pika-button": { "&, &:hover": { color: "var(--color-base-100)", "background-color": "var(--color-base-content)", "border-radius": "var(--radius-field)" } } }, ".has-event": { ".pika-button": { background: "var(--color-base-primary)" } }, ".is-disabled, .is-inrange": { ".pika-button": { background: "var(--color-base-primary)" } }, ".is-startrange": { ".pika-button": { color: "var(--color-base-100)", background: "var(--color-base-content)", "border-radius": "var(--radius-field)" } }, ".is-endrange": { ".pika-button": { color: "var(--color-base-100)", background: "var(--color-base-content)", "border-radius": "var(--radius-field)" } }, ".is-disabled": { ".pika-button": { "pointer-events": "none", cursor: "default", color: "var(--color-base-content)", opacity: 0.3 } }, ".is-outside-current-month": { ".pika-button": { color: "var(--color-base-content)", opacity: 0.3 } }, ".is-selection-disabled": { "pointer-events": "none", cursor: "default" }, ".pika-button:hover, .pika-row.pick-whole-week:hover .pika-button": { color: "var(--color-base-content)", "background-color": "var(--color-base-200)", "border-radius": "var(--radius-field)" }, ".pika-table abbr": { "text-decoration": "none", "font-weight": "normal" } } } }; + +// packages/daisyui/components/calendar/index.js +var calendar_default = ({ addComponents, prefix = "" }) => { + const prefixedcalendar = addPrefix(object_default42, prefix); + addComponents({ ...prefixedcalendar }); +}; + +// packages/daisyui/components/indicator/object.js +var object_default43 = { ".indicator": { position: "relative", display: "inline-flex", width: "max-content", ":where(.indicator-item)": { "z-index": 1, position: "absolute", "white-space": "nowrap", top: "var(--inidicator-t, 0)", bottom: "var(--inidicator-b, auto)", left: "var(--inidicator-s, auto)", right: "var(--inidicator-e, 0)", translate: "var(--inidicator-x, 50%) var(--indicator-y, -50%)" } }, ".indicator-start": { "--inidicator-s": "0", "--inidicator-e": "auto", "--inidicator-x": "-50%" }, ".indicator-center": { "--inidicator-s": "50%", "--inidicator-e": "50%", "--inidicator-x": "-50%", '[dir="rtl"] &': { "--inidicator-x": "50%" } }, ".indicator-end": { "--inidicator-s": "auto", "--inidicator-e": "0", "--inidicator-x": "50%" }, ".indicator-bottom": { "--inidicator-t": "auto", "--inidicator-b": "0", "--indicator-y": "50%" }, ".indicator-middle": { "--inidicator-t": "50%", "--inidicator-b": "50%", "--indicator-y": "-50%" }, ".indicator-top": { "--inidicator-t": "0", "--inidicator-b": "auto", "--indicator-y": "-50%" } }; + +// packages/daisyui/components/indicator/index.js +var indicator_default = ({ addComponents, prefix = "" }) => { + const prefixedindicator = addPrefix(object_default43, prefix); + addComponents({ ...prefixedindicator }); +}; + +// packages/daisyui/components/rating/object.js +var object_default44 = { ".rating": { position: "relative", display: "inline-flex", "vertical-align": "middle", "& input": { border: "none", appearance: "none" }, ":where(*)": { animation: "rating 0.25s ease-out", height: "calc(0.25rem * 6)", width: "calc(0.25rem * 6)", "border-radius": "0", "background-color": "var(--color-base-content)", opacity: "20%", "&:is(input)": { cursor: "pointer" } }, "& .rating-hidden": { width: "calc(0.25rem * 2)", "background-color": "transparent" }, 'input[type="radio"]:checked': { "background-image": "none" }, "*": { '&:checked, &[aria-checked="true"], &[aria-current="true"], &:has(~ *:checked, ~ *[aria-checked="true"], ~ *[aria-current="true"])': { opacity: "100%" }, "&:focus-visible": { transition: "scale 0.2s ease-out", scale: "1.1" } }, "& *:active:focus": { animation: "none", scale: "1.1" }, "&.rating-xs :where(*:not(.rating-hidden))": { width: "calc(0.25rem * 4)", height: "calc(0.25rem * 4)" }, "&.rating-sm :where(*:not(.rating-hidden))": { width: "calc(0.25rem * 5)", height: "calc(0.25rem * 5)" }, "&.rating-md :where(*:not(.rating-hidden))": { width: "calc(0.25rem * 6)", height: "calc(0.25rem * 6)" }, "&.rating-lg :where(*:not(.rating-hidden))": { width: "calc(0.25rem * 7)", height: "calc(0.25rem * 7)" }, "&.rating-xl :where(*:not(.rating-hidden))": { width: "calc(0.25rem * 8)", height: "calc(0.25rem * 8)" } }, ".rating-half": { ":where(*:not(.rating-hidden))": { width: "calc(0.25rem * 3)" }, "&.rating-xs *:not(.rating-hidden)": { width: "calc(0.25rem * 2)" }, "&.rating-sm *:not(.rating-hidden)": { width: "calc(0.25rem * 2.5)" }, "&.rating-md *:not(.rating-hidden)": { width: "calc(0.25rem * 3)" }, "&.rating-lg *:not(.rating-hidden)": { width: ".875rem" }, "&.rating-xl *:not(.rating-hidden)": { width: "calc(0.25rem * 4)" } }, "@keyframes rating": { "0%, 40%": { scale: "1.1", filter: "brightness(1.05) contrast(1.05)" } } }; + +// packages/daisyui/components/rating/index.js +var rating_default = ({ addComponents, prefix = "" }) => { + const prefixedrating = addPrefix(object_default44, prefix); + addComponents({ ...prefixedrating }); +}; + +// packages/daisyui/components/tab/object.js +var object_default45 = { ".tabs": { display: "flex", "flex-wrap": "wrap", "--tabs-height": "auto", "--tabs-direction": "row", height: "var(--tabs-height)", "flex-direction": "var(--tabs-direction)" }, ".tab": { position: "relative", display: "inline-flex", cursor: "pointer", appearance: "none", "flex-wrap": "wrap", "align-items": "center", "justify-content": "center", "text-align": "center", "webkit-user-select": "none", "user-select": "none", "&:hover": { "@media (hover: hover)": { color: "var(--color-base-content)" } }, "--tab-p": "1rem", "--tab-bg": "var(--color-base-100)", "--tab-border-color": "var(--color-base-300)", "--tab-radius-ss": "0", "--tab-radius-se": "0", "--tab-radius-es": "0", "--tab-radius-ee": "0", "--tab-order": "0", "--tab-radius-min": "calc(0.75rem - var(--border))", "border-color": "#0000", order: "var(--tab-order)", height: "calc(var(--size-field, 0.25rem) * 10)", "font-size": "0.875rem", "padding-inline-start": "var(--tab-p)", "padding-inline-end": "var(--tab-p)", '&:is(input[type="radio"])': { "min-width": "fit-content", "&:after": { content: "attr(aria-label)" } }, "&:is(label)": { position: "relative", input: { position: "absolute", inset: "calc(0.25rem * 0)", cursor: "pointer", appearance: "none", opacity: "0%" } }, '&:checked, &:is(label:has(:checked)), &:is(.tab-active, [aria-selected="true"])': { "& + .tab-content": { display: "block", height: "100%" } }, '&:not(:checked, label:has(:checked), :hover, .tab-active, [aria-selected="true"])': { color: "color-mix(in oklab, var(--color-base-content) 50%, transparent)" }, "&:not(input):empty": { "flex-grow": 1, cursor: "default" }, "&:focus": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:focus-visible, &:is(label:has(:checked:focus-visible))": { outline: "2px solid currentColor", "outline-offset": "-5px" }, "&[disabled]": { "pointer-events": "none", opacity: "40%" } }, ".tab-disabled": { "pointer-events": "none", opacity: "40%" }, ".tabs-border": { ".tab": { "--tab-border-color": "#0000 #0000 var(--tab-border-color) #0000", position: "relative", "border-radius": "var(--radius-field)", "&:before": { "--tw-content": '""', content: "var(--tw-content)", "background-color": "var(--tab-border-color)", transition: "background-color 0.2s ease", width: "80%", height: "3px", "border-radius": "var(--radius-field)", bottom: "0", left: "10%", position: "absolute" }, '&:is(.tab-active, [aria-selected="true"]):not(.tab-disabled, [disabled]), &:is(input:checked), &:is(label:has(:checked))': { "&:before": { "--tab-border-color": "currentColor", "border-top": "3px solid" } } } }, ".tabs-lift": { "--tabs-height": "auto", "--tabs-direction": "row", "> .tab": { "--tab-border": "0 0 var(--border) 0", "--tab-radius-ss": "min(var(--radius-field), var(--tab-radius-min))", "--tab-radius-se": "min(var(--radius-field), var(--tab-radius-min))", "--tab-radius-es": "0", "--tab-radius-ee": "0", "--tab-paddings": "var(--border) var(--tab-p) 0 var(--tab-p)", "--tab-border-colors": "#0000 #0000 var(--tab-border-color) #0000", "--tab-corner-width": "calc(100% + min(var(--radius-field), var(--tab-radius-min)) * 2)", "--tab-corner-height": "min(var(--radius-field), var(--tab-radius-min))", "--tab-corner-position": "top left, top right", "border-width": "var(--tab-border)", "border-start-start-radius": "var(--tab-radius-ss)", "border-start-end-radius": "var(--tab-radius-se)", "border-end-start-radius": "var(--tab-radius-es)", "border-end-end-radius": "var(--tab-radius-ee)", padding: "var(--tab-paddings)", "border-color": "var(--tab-border-colors)", '&:is(.tab-active, [aria-selected="true"]):not(.tab-disabled, [disabled]), &:is(input:checked, label:has(:checked))': { "--tab-border": "var(--border) var(--border) 0 var(--border)", "--tab-border-colors": `var(--tab-border-color) var(--tab-border-color) #0000 + var(--tab-border-color)`, "--tab-paddings": `0 calc(var(--tab-p) - var(--border)) var(--border) + calc(var(--tab-p) - var(--border))`, "--tab-inset": "auto auto 0 auto", "--tab-grad": "calc(69% - var(--border))", "--radius-start": `radial-gradient( + circle at top left, + #0000 var(--tab-grad), + var(--tab-border-color) calc(var(--tab-grad) + 0.25px), + var(--tab-border-color) calc(var(--tab-grad) + var(--border)), + var(--tab-bg) calc(var(--tab-grad) + var(--border) + 0.25px) + )`, "--radius-end": `radial-gradient( + circle at top right, + #0000 var(--tab-grad), + var(--tab-border-color) calc(var(--tab-grad) + 0.25px), + var(--tab-border-color) calc(var(--tab-grad) + var(--border)), + var(--tab-bg) calc(var(--tab-grad) + var(--border) + 0.25px) + )`, "background-color": "var(--tab-bg)", "&:before": { "z-index": 1, content: '""', display: "block", position: "absolute", width: "var(--tab-corner-width)", height: "var(--tab-corner-height)", "background-position": "var(--tab-corner-position)", "background-image": "var(--radius-start), var(--radius-end)", "background-size": "min(var(--radius-field), var(--tab-radius-min)) min(var(--radius-field), var(--tab-radius-min))", "background-repeat": "no-repeat", inset: "var(--tab-inset)" }, "&:first-child:before": { "--radius-start": "none" }, '[dir="rtl"] &:first-child:before': { transform: "rotateY(180deg)" }, "&:last-child:before": { "--radius-end": "none" }, '[dir="rtl"] &:last-child:before': { transform: "rotateY(180deg)" } } }, "&:has(.tab-content)": { "> .tab:first-child": { '&:not(.tab-active, [aria-selected="true"])': { "--tab-border-colors": `var(--tab-border-color) var(--tab-border-color) #0000 + var(--tab-border-color)` } } }, ".tab-content": { "--tabcontent-margin": "calc(-1 * var(--border)) 0 0 0", "--tabcontent-radius-ss": "0", "--tabcontent-radius-se": "var(--radius-box)", "--tabcontent-radius-es": "var(--radius-box)", "--tabcontent-radius-ee": "var(--radius-box)" }, ':checked, label:has(:checked), :is(.tab-active, [aria-selected="true"])': { "& + .tab-content": { "&:nth-child(1), &:nth-child(n + 3)": { "--tabcontent-radius-ss": "var(--radius-box)" } } } }, ".tabs-top": { "--tabs-height": "auto", "--tabs-direction": "row", ".tab": { "--tab-order": "0", "--tab-border": "0 0 var(--border) 0", "--tab-radius-ss": "min(var(--radius-field), var(--tab-radius-min))", "--tab-radius-se": "min(var(--radius-field), var(--tab-radius-min))", "--tab-radius-es": "0", "--tab-radius-ee": "0", "--tab-paddings": "var(--border) var(--tab-p) 0 var(--tab-p)", "--tab-border-colors": "#0000 #0000 var(--tab-border-color) #0000", "--tab-corner-width": "calc(100% + min(var(--radius-field), var(--tab-radius-min)) * 2)", "--tab-corner-height": "min(var(--radius-field), var(--tab-radius-min))", "--tab-corner-position": "top left, top right", '&:is(.tab-active, [aria-selected="true"]):not(.tab-disabled, [disabled]), &:is(input:checked), &:is(label:has(:checked))': { "--tab-border": "var(--border) var(--border) 0 var(--border)", "--tab-border-colors": `var(--tab-border-color) var(--tab-border-color) #0000 + var(--tab-border-color)`, "--tab-paddings": `0 calc(var(--tab-p) - var(--border)) var(--border) + calc(var(--tab-p) - var(--border))`, "--tab-inset": "auto auto 0 auto", "--radius-start": `radial-gradient( + circle at top left, + #0000 var(--tab-grad), + var(--tab-border-color) calc(var(--tab-grad) + 0.25px), + var(--tab-border-color) calc(var(--tab-grad) + var(--border)), + var(--tab-bg) calc(var(--tab-grad) + var(--border) + 0.25px) + )`, "--radius-end": `radial-gradient( + circle at top right, + #0000 var(--tab-grad), + var(--tab-border-color) calc(var(--tab-grad) + 0.25px), + var(--tab-border-color) calc(var(--tab-grad) + var(--border)), + var(--tab-bg) calc(var(--tab-grad) + var(--border) + 0.25px) + )` } }, "&:has(.tab-content)": { "> .tab:first-child": { '&:not(.tab-active, [aria-selected="true"])': { "--tab-border-colors": `var(--tab-border-color) var(--tab-border-color) #0000 + var(--tab-border-color)` } } }, ".tab-content": { "--tabcontent-order": "1", "--tabcontent-margin": "calc(-1 * var(--border)) 0 0 0", "--tabcontent-radius-ss": "0", "--tabcontent-radius-se": "var(--radius-box)", "--tabcontent-radius-es": "var(--radius-box)", "--tabcontent-radius-ee": "var(--radius-box)" }, ':checked, label:has(:checked), :is(.tab-active, [aria-selected="true"])': { "& + .tab-content": { "&:nth-child(1), &:nth-child(n + 3)": { "--tabcontent-radius-ss": "var(--radius-box)" } } } }, ".tabs-bottom": { "--tabs-height": "auto", "--tabs-direction": "row", ".tab": { "--tab-order": "1", "--tab-border": "var(--border) 0 0 0", "--tab-radius-ss": "0", "--tab-radius-se": "0", "--tab-radius-es": "min(var(--radius-field), var(--tab-radius-min))", "--tab-radius-ee": "min(var(--radius-field), var(--tab-radius-min))", "--tab-border-colors": "var(--tab-border-color) #0000 #0000 #0000", "--tab-paddings": "0 var(--tab-p) var(--border) var(--tab-p)", "--tab-corner-width": "calc(100% + min(var(--radius-field), var(--tab-radius-min)) * 2)", "--tab-corner-height": "min(var(--radius-field), var(--tab-radius-min))", "--tab-corner-position": "top left, top right", '&:is(.tab-active, [aria-selected="true"]):not(.tab-disabled, [disabled]), &:is(input:checked), &:is(label:has(:checked))': { "--tab-border": "0 var(--border) var(--border) var(--border)", "--tab-border-colors": `#0000 var(--tab-border-color) var(--tab-border-color) + var(--tab-border-color)`, "--tab-paddings": `var(--border) calc(var(--tab-p) - var(--border)) 0 + calc(var(--tab-p) - var(--border))`, "--tab-inset": "0 auto auto auto", "--radius-start": `radial-gradient( + circle at bottom left, + #0000 var(--tab-grad), + var(--tab-border-color) calc(var(--tab-grad) + 0.25px), + var(--tab-border-color) calc(var(--tab-grad) + var(--border)), + var(--tab-bg) calc(var(--tab-grad) + var(--border) + 0.25px) + )`, "--radius-end": `radial-gradient( + circle at bottom right, + #0000 var(--tab-grad), + var(--tab-border-color) calc(var(--tab-grad) + 0.25px), + var(--tab-border-color) calc(var(--tab-grad) + var(--border)), + var(--tab-bg) calc(var(--tab-grad) + var(--border) + 0.25px) + )` } }, "&:has(.tab-content)": { "> .tab:first-child": { '&:not(.tab-active, [aria-selected="true"])': { "--tab-border-colors": `#0000 var(--tab-border-color) var(--tab-border-color) + var(--tab-border-color)` } } }, ".tab-content": { "--tabcontent-order": "0", "--tabcontent-margin": "0 0 calc(-1 * var(--border)) 0", "--tabcontent-radius-ss": "var(--radius-box)", "--tabcontent-radius-se": "var(--radius-box)", "--tabcontent-radius-es": "0", "--tabcontent-radius-ee": "var(--radius-box)" }, '> :checked, > :is(label:has(:checked)), > :is(.tab-active, [aria-selected="true"])': { "& + .tab-content:not(:nth-child(2))": { "--tabcontent-radius-es": "var(--radius-box)" } } }, ".tabs-box": { "background-color": "var(--color-base-200)", padding: "calc(0.25rem * 1)", "--tabs-box-radius": "calc(var(--radius-field) + var(--radius-field) + var(--radius-field))", "border-radius": "calc(var(--radius-field) + min(0.25rem, var(--tabs-box-radius)))", "box-shadow": "0 -0.5px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 0.5px oklch(0% 0 0 / calc(var(--depth) * 0.05)) inset", ".tab": { "border-radius": "var(--radius-field)", "border-style": "none", "&:focus-visible, &:is(label:has(:checked:focus-visible))": { "outline-offset": "2px" } }, '> :is(.tab-active, [aria-selected="true"]):not(.tab-disabled, [disabled]), > :is(input:checked), > :is(label:has(:checked))': { "background-color": "var(--tab-bg, var(--color-base-100))", "box-shadow": "0 1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px 1px -1px color-mix(in oklab, var(--color-neutral) calc(var(--depth) * 50%), #0000), 0 1px 6px -4px color-mix(in oklab, var(--color-neutral) calc(var(--depth) * 100%), #0000)", "@media (forced-colors: active)": { border: "1px solid" } } }, ".tab-content": { order: [1, "var(--tabcontent-order)"], display: "none", "border-color": "transparent", "--tabcontent-radius-ss": "0", "--tabcontent-radius-se": "0", "--tabcontent-radius-es": "0", "--tabcontent-radius-ee": "0", "--tabcontent-order": "1", width: "100%", margin: "var(--tabcontent-margin)", "border-width": "var(--border)", "border-start-start-radius": "var(--tabcontent-radius-ss)", "border-start-end-radius": "var(--tabcontent-radius-se)", "border-end-start-radius": "var(--tabcontent-radius-es)", "border-end-end-radius": "var(--tabcontent-radius-ee)" }, ".tabs-xs": { ":where(.tab)": { height: "calc(var(--size-field, 0.25rem) * 6)", "font-size": "0.75rem", "--tab-p": "0.375rem", "--tab-radius-min": "calc(0.5rem - var(--border))" } }, ".tabs-sm": { ":where(.tab)": { height: "calc(var(--size-field, 0.25rem) * 8)", "font-size": "0.875rem", "--tab-p": "0.5rem", "--tab-radius-min": "calc(0.5rem - var(--border))" } }, ".tabs-md": { ":where(.tab)": { height: "calc(var(--size-field, 0.25rem) * 10)", "font-size": "0.875rem", "--tab-p": "0.75rem", "--tab-radius-min": "calc(0.75rem - var(--border))" } }, ".tabs-lg": { ":where(.tab)": { height: "calc(var(--size-field, 0.25rem) * 12)", "font-size": "1.125rem", "--tab-p": "1rem", "--tab-radius-min": "calc(1.5rem - var(--border))" } }, ".tabs-xl": { ":where(.tab)": { height: "calc(var(--size-field, 0.25rem) * 14)", "font-size": "1.125rem", "--tab-p": "1.25rem", "--tab-radius-min": "calc(2rem - var(--border))" } } }; + +// packages/daisyui/components/tab/index.js +var tab_default = ({ addComponents, prefix = "" }) => { + const prefixedtab = addPrefix(object_default45, prefix); + addComponents({ ...prefixedtab }); +}; + +// packages/daisyui/components/filter/object.js +var object_default46 = { ".filter": { display: "flex", "flex-wrap": "wrap", 'input[type="radio"]': { width: "auto" }, input: { overflow: "hidden", opacity: "100%", scale: "1", transition: "margin 0.1s, opacity 0.3s, padding 0.3s, border-width 0.1s", "&:not(:last-child)": { "margin-inline-end": "calc(0.25rem * 1)" }, "&.filter-reset": { "aspect-ratio": "1 / 1", "&::after": { content: '"ร—"' } } }, "&:not(:has(input:checked:not(.filter-reset)))": { '.filter-reset, input[type="reset"]': { scale: "0", "border-width": "0", "margin-inline": "calc(0.25rem * 0)", width: "calc(0.25rem * 0)", "padding-inline": "calc(0.25rem * 0)", opacity: "0%" } }, "&:has(input:checked:not(.filter-reset))": { 'input:not(:checked, .filter-reset, input[type="reset"])': { scale: "0", "border-width": "0", "margin-inline": "calc(0.25rem * 0)", width: "calc(0.25rem * 0)", "padding-inline": "calc(0.25rem * 0)", opacity: "0%" } } } }; + +// packages/daisyui/components/filter/index.js +var filter_default = ({ addComponents, prefix = "" }) => { + const prefixedfilter = addPrefix(object_default46, prefix); + addComponents({ ...prefixedfilter }); +}; + +// packages/daisyui/components/chat/object.js +var object_default47 = { ".chat": { display: "grid", "column-gap": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 1)" }, ".chat-bubble": { position: "relative", display: "block", width: "fit-content", "border-radius": "var(--radius-field)", "background-color": "var(--color-base-300)", "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 2)", color: "var(--color-base-content)", "grid-row-end": "3", "min-height": "2rem", "min-width": "2.5rem", "max-width": "90%", "&:before": { position: "absolute", bottom: "calc(0.25rem * 0)", height: "calc(0.25rem * 3)", width: "calc(0.25rem * 3)", "background-color": "inherit", content: '""', "mask-repeat": "no-repeat", "mask-image": "var(--mask-chat)", "mask-position": "0px -1px", "mask-size": "13px" } }, ".chat-bubble-primary": { "background-color": "var(--color-primary)", color: "var(--color-primary-content)" }, ".chat-bubble-secondary": { "background-color": "var(--color-secondary)", color: "var(--color-secondary-content)" }, ".chat-bubble-accent": { "background-color": "var(--color-accent)", color: "var(--color-accent-content)" }, ".chat-bubble-neutral": { "background-color": "var(--color-neutral)", color: "var(--color-neutral-content)" }, ".chat-bubble-info": { "background-color": "var(--color-info)", color: "var(--color-info-content)" }, ".chat-bubble-success": { "background-color": "var(--color-success)", color: "var(--color-success-content)" }, ".chat-bubble-warning": { "background-color": "var(--color-warning)", color: "var(--color-warning-content)" }, ".chat-bubble-error": { "background-color": "var(--color-error)", color: "var(--color-error-content)" }, ".chat-image": { "grid-row": "span 2 / span 2", "align-self": "flex-end" }, ".chat-header": { "grid-row-start": "1", display: "flex", gap: "calc(0.25rem * 1)", "font-size": "0.6875rem" }, ".chat-footer": { "grid-row-start": "3", display: "flex", gap: "calc(0.25rem * 1)", "font-size": "0.6875rem" }, ".chat-start": { "place-items": "start", "grid-template-columns": "auto 1fr", ".chat-header": { "grid-column-start": "2" }, ".chat-footer": { "grid-column-start": "2" }, ".chat-image": { "grid-column-start": "1" }, ".chat-bubble": { "grid-column-start": "2", "border-end-start-radius": "0", "&:before": { transform: "rotateY(0deg)", "inset-inline-start": "-0.75rem" }, '[dir="rtl"] &:before': { transform: "rotateY(180deg)" } } }, ".chat-end": { "place-items": "end", "grid-template-columns": "1fr auto", ".chat-header": { "grid-column-start": "1" }, ".chat-footer": { "grid-column-start": "1" }, ".chat-image": { "grid-column-start": "2" }, ".chat-bubble": { "grid-column-start": "1", "border-end-end-radius": "0", "&:before": { transform: "rotateY(180deg)", "inset-inline-start": "100%" }, '[dir="rtl"] &:before': { transform: "rotateY(0deg)" } } } }; + +// packages/daisyui/components/chat/index.js +var chat_default = ({ addComponents, prefix = "" }) => { + const prefixedchat = addPrefix(object_default47, prefix); + addComponents({ ...prefixedchat }); +}; + +// packages/daisyui/components/radialprogress/object.js +var object_default48 = { ".radial-progress": { position: "relative", display: "inline-grid", height: "var(--size)", width: "var(--size)", "place-content": "center", "border-radius": "calc(infinity * 1px)", "background-color": "transparent", "vertical-align": "middle", "box-sizing": "content-box", "--value": "0", "--size": "5rem", "--thickness": "calc(var(--size) / 10)", "--radialprogress": "calc(var(--value) * 1%)", transition: "--radialprogress 0.3s linear", "&:before": { position: "absolute", inset: "calc(0.25rem * 0)", "border-radius": "calc(infinity * 1px)", content: '""', background: "radial-gradient(farthest-side, currentColor 98%, #0000) top/var(--thickness) var(--thickness) no-repeat, conic-gradient(currentColor var(--radialprogress), #0000 0)", "webkit-mask": "radial-gradient( farthest-side, #0000 calc(100% - var(--thickness)), #000 calc(100% + 0.5px - var(--thickness)) )", mask: "radial-gradient( farthest-side, #0000 calc(100% - var(--thickness)), #000 calc(100% + 0.5px - var(--thickness)) )" }, "&:after": { position: "absolute", "border-radius": "calc(infinity * 1px)", "background-color": "currentColor", transition: "transform 0.3s linear", content: '""', inset: "calc(50% - var(--thickness) / 2)", transform: "rotate(calc(var(--value) * 3.6deg - 90deg)) translate(calc(var(--size) / 2 - 50%))" } } }; + +// packages/daisyui/components/radialprogress/index.js +var radialprogress_default = ({ addComponents, prefix = "" }) => { + const prefixedradialprogress = addPrefix(object_default48, prefix); + addComponents({ ...prefixedradialprogress }); +}; + +// packages/daisyui/components/countdown/object.js +var object_default49 = { ".countdown": { display: "inline-flex", "&.countdown": { "line-height": "1em" }, "& > *": { display: "inline-block", "overflow-y": "hidden", height: "1em", "&:before": { position: "relative", content: '"00\\A 01\\A 02\\A 03\\A 04\\A 05\\A 06\\A 07\\A 08\\A 09\\A 10\\A 11\\A 12\\A 13\\A 14\\A 15\\A 16\\A 17\\A 18\\A 19\\A 20\\A 21\\A 22\\A 23\\A 24\\A 25\\A 26\\A 27\\A 28\\A 29\\A 30\\A 31\\A 32\\A 33\\A 34\\A 35\\A 36\\A 37\\A 38\\A 39\\A 40\\A 41\\A 42\\A 43\\A 44\\A 45\\A 46\\A 47\\A 48\\A 49\\A 50\\A 51\\A 52\\A 53\\A 54\\A 55\\A 56\\A 57\\A 58\\A 59\\A 60\\A 61\\A 62\\A 63\\A 64\\A 65\\A 66\\A 67\\A 68\\A 69\\A 70\\A 71\\A 72\\A 73\\A 74\\A 75\\A 76\\A 77\\A 78\\A 79\\A 80\\A 81\\A 82\\A 83\\A 84\\A 85\\A 86\\A 87\\A 88\\A 89\\A 90\\A 91\\A 92\\A 93\\A 94\\A 95\\A 96\\A 97\\A 98\\A 99\\A"', "white-space": "pre", top: "calc(var(--value) * -1em)", "text-align": "center", transition: "all 1s cubic-bezier(1, 0, 0, 1)" } } } }; + +// packages/daisyui/components/countdown/index.js +var countdown_default = ({ addComponents, prefix = "" }) => { + const prefixedcountdown = addPrefix(object_default49, prefix); + addComponents({ ...prefixedcountdown }); +}; + +// packages/daisyui/components/tooltip/object.js +var object_default50 = { ".tooltip": { position: "relative", display: "inline-block", "--tt-bg": "var(--color-neutral)", "--tt-off": "calc(100% + 0.5rem)", "--tt-tail": "calc(100% + 1px + 0.25rem)", "> :where(.tooltip-content), &:where([data-tip]):before": { position: "absolute", "max-width": "20rem", "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 2)", "padding-block": "calc(0.25rem * 1)", "text-align": "center", "white-space": "normal", color: "var(--color-neutral-content)", opacity: "0%", "font-size": "0.875rem", "line-height": 1.25, transition: "opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms", "background-color": "var(--tt-bg)", width: "max-content", "pointer-events": "none", "z-index": 1, "--tw-content": "attr(data-tip)", content: "var(--tw-content)" }, "&:after": { position: ["absolute", "absolute"], opacity: "0%", "background-color": "var(--tt-bg)", transition: "opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms", content: '""', "pointer-events": "none", width: "0.625rem", height: "0.25rem", display: "block", "mask-repeat": "no-repeat", "mask-position": "-1px 0", "--mask-tooltip": `url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A")`, "mask-image": "var(--mask-tooltip)" }, '&.tooltip-open, &[data-tip]:not([data-tip=""]):hover, &:not(:has(.tooltip-content:empty)):has(.tooltip-content):hover, &:has(:focus-visible)': { "> .tooltip-content, &[data-tip]:before, &:after": { opacity: "100%", "--tt-pos": "0rem", transition: "opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0ms" } } }, ".tooltip, .tooltip-top": { "> .tooltip-content, &[data-tip]:before": { transform: "translateX(-50%) translateY(var(--tt-pos, 0.25rem))", inset: "auto auto var(--tt-off) 50%" }, "&:after": { transform: "translateX(-50%) translateY(var(--tt-pos, 0.25rem))", inset: "auto auto var(--tt-tail) 50%" } }, ".tooltip-bottom": { "> .tooltip-content, &[data-tip]:before": { transform: "translateX(-50%) translateY(var(--tt-pos, -0.25rem))", inset: "var(--tt-off) auto auto 50%" }, "&:after": { transform: "translateX(-50%) translateY(var(--tt-pos, -0.25rem)) rotate(180deg)", inset: "var(--tt-tail) auto auto 50%" } }, ".tooltip-left": { "> .tooltip-content, &[data-tip]:before": { transform: "translateX(calc(var(--tt-pos, 0.25rem) - 0.25rem)) translateY(-50%)", inset: "50% var(--tt-off) auto auto" }, "&:after": { transform: "translateX(var(--tt-pos, 0.25rem)) translateY(-50%) rotate(-90deg)", inset: "50% calc(var(--tt-tail) + 1px) auto auto" } }, ".tooltip-right": { "> .tooltip-content, &[data-tip]:before": { transform: "translateX(calc(var(--tt-pos, -0.25rem) + 0.25rem)) translateY(-50%)", inset: "50% auto auto var(--tt-off)" }, "&:after": { transform: "translateX(var(--tt-pos, -0.25rem)) translateY(-50%) rotate(90deg)", inset: "50% auto auto calc(var(--tt-tail) + 1px)" } }, ".tooltip-primary": { "--tt-bg": "var(--color-primary)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-primary-content)" } }, ".tooltip-secondary": { "--tt-bg": "var(--color-secondary)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-secondary-content)" } }, ".tooltip-accent": { "--tt-bg": "var(--color-accent)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-accent-content)" } }, ".tooltip-info": { "--tt-bg": "var(--color-info)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-info-content)" } }, ".tooltip-success": { "--tt-bg": "var(--color-success)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-success-content)" } }, ".tooltip-warning": { "--tt-bg": "var(--color-warning)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-warning-content)" } }, ".tooltip-error": { "--tt-bg": "var(--color-error)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-error-content)" } } }; + +// packages/daisyui/components/tooltip/index.js +var tooltip_default = ({ addComponents, prefix = "" }) => { + const prefixedtooltip = addPrefix(object_default50, prefix); + addComponents({ ...prefixedtooltip }); +}; + +// packages/daisyui/components/timeline/object.js +var object_default51 = { ".timeline": { position: "relative", display: "flex", "> li": { position: "relative", display: "grid", "flex-shrink": 0, "align-items": "center", "grid-template-rows": "var(--timeline-row-start, minmax(0, 1fr)) auto var( --timeline-row-end, minmax(0, 1fr) )", "grid-template-columns": "var(--timeline-col-start, minmax(0, 1fr)) auto var( --timeline-col-end, minmax(0, 1fr) )", "> hr": { border: "none", width: "100%", "&:first-child": { "grid-column-start": "1", "grid-row-start": "2" }, "&:last-child": { "grid-column-start": "3", "grid-column-end": "none", "grid-row-start": "2", "grid-row-end": "auto" }, "@media print": { border: "0.1px solid var(--color-base-300)" } } }, ":where(hr)": { height: "calc(0.25rem * 1)", "background-color": "var(--color-base-300)" }, "&:has(.timeline-middle hr)": { "&:first-child": { "border-start-start-radius": "0", "border-end-start-radius": "0", "border-start-end-radius": "var(--radius-selector)", "border-end-end-radius": "var(--radius-selector)" }, "&:last-child": { "border-start-start-radius": "var(--radius-selector)", "border-end-start-radius": "var(--radius-selector)", "border-start-end-radius": "0", "border-end-end-radius": "0" } }, "&:not(:has(.timeline-middle))": { ":first-child hr:last-child": { "border-start-start-radius": "var(--radius-selector)", "border-end-start-radius": "var(--radius-selector)", "border-start-end-radius": "0", "border-end-end-radius": "0" }, ":last-child hr:first-child": { "border-start-start-radius": "0", "border-end-start-radius": "0", "border-start-end-radius": "var(--radius-selector)", "border-end-end-radius": "var(--radius-selector)" } } }, ".timeline-box": { border: "var(--border) solid", "border-radius": "var(--radius-box)", "border-color": "var(--color-base-300)", "background-color": "var(--color-base-100)", "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 2)", "font-size": "0.75rem", "box-shadow": "0 1px 2px 0 oklch(0% 0 0/0.05)" }, ".timeline-start": { "grid-column-start": "1", "grid-column-end": "4", "grid-row-start": "1", "grid-row-end": "2", margin: "calc(0.25rem * 1)", "align-self": "flex-end", "justify-self": "center" }, ".timeline-middle": { "grid-column-start": "2", "grid-row-start": "2" }, ".timeline-end": { "grid-column-start": "1", "grid-column-end": "4", "grid-row-start": "3", "grid-row-end": "4", margin: "calc(0.25rem * 1)", "align-self": "flex-start", "justify-self": "center" }, ".timeline-compact": { "--timeline-row-start": "0", ".timeline-start": { "grid-column-start": "1", "grid-column-end": "4", "grid-row-start": "3", "grid-row-end": "4", "align-self": "flex-start", "justify-self": "center" }, "li:has(.timeline-start)": { ".timeline-end": { "grid-column-start": "none", "grid-row-start": "auto" } }, "&.timeline-vertical": { "> li": { "--timeline-col-start": "0" }, ".timeline-start": { "grid-column-start": "3", "grid-column-end": "4", "grid-row-start": "1", "grid-row-end": "4", "align-self": "center", "justify-self": "flex-start" }, "li:has(.timeline-start)": { ".timeline-end": { "grid-column-start": "auto", "grid-row-start": "none" } } } }, ".timeline-snap-icon": { "> li": { "--timeline-col-start": "0.5rem", "--timeline-row-start": "minmax(0, 1fr)" } }, ".timeline-vertical": { "flex-direction": "column", "> li": { "justify-items": "center", "--timeline-row-start": "minmax(0, 1fr)", "--timeline-row-end": "minmax(0, 1fr)", "> hr": { height: "100%", width: "calc(0.25rem * 1)", "&:first-child": { "grid-column-start": "2", "grid-row-start": "1" }, "&:last-child": { "grid-column-start": "2", "grid-column-end": "auto", "grid-row-start": "3", "grid-row-end": "none" } } }, ".timeline-start": { "grid-column-start": "1", "grid-column-end": "2", "grid-row-start": "1", "grid-row-end": "4", "align-self": "center", "justify-self": "flex-end" }, ".timeline-end": { "grid-column-start": "3", "grid-column-end": "4", "grid-row-start": "1", "grid-row-end": "4", "align-self": "center", "justify-self": "flex-start" }, "&:has(.timeline-middle)": { "> li": { "> hr": { "&:first-child": { "border-top-left-radius": "0", "border-top-right-radius": "0", "border-bottom-right-radius": "var(--radius-selector)", "border-bottom-left-radius": "var(--radius-selector)" }, "&:last-child": { "border-top-left-radius": "var(--radius-selector)", "border-top-right-radius": "var(--radius-selector)", "border-bottom-right-radius": "0", "border-bottom-left-radius": "0" } } } }, "&:not(:has(.timeline-middle))": { ":first-child": { "> hr:last-child": { "border-top-left-radius": "var(--radius-selector)", "border-top-right-radius": "var(--radius-selector)", "border-bottom-right-radius": "0", "border-bottom-left-radius": "0" } }, ":last-child": { "> hr:first-child": { "border-top-left-radius": "0", "border-top-right-radius": "0", "border-bottom-right-radius": "var(--radius-selector)", "border-bottom-left-radius": "var(--radius-selector)" } } }, "&.timeline-snap-icon": { "> li": { "--timeline-col-start": "minmax(0, 1fr)", "--timeline-row-start": "0.5rem" } } }, ".timeline-horizontal": { "flex-direction": "row", "> li": { "align-items": "center", "> hr": { height: "calc(0.25rem * 1)", width: "100%", "&:first-child": { "grid-column-start": "1", "grid-row-start": "2" }, "&:last-child": { "grid-column-start": "3", "grid-column-end": "none", "grid-row-start": "2", "grid-row-end": "auto" } } }, ".timeline-start": { "grid-column-start": "1", "grid-column-end": "4", "grid-row-start": "1", "grid-row-end": "2", "align-self": "flex-end", "justify-self": "center" }, ".timeline-end": { "grid-column-start": "1", "grid-column-end": "4", "grid-row-start": "3", "grid-row-end": "4", "align-self": "flex-start", "justify-self": "center" }, "&:has(.timeline-middle)": { "> li": { "> hr": { "&:first-child": { "border-start-start-radius": "0", "border-end-start-radius": "0", "border-start-end-radius": "var(--radius-selector)", "border-end-end-radius": "var(--radius-selector)" }, "&:last-child": { "border-start-start-radius": "var(--radius-selector)", "border-end-start-radius": "var(--radius-selector)", "border-start-end-radius": "0", "border-end-end-radius": "0" } } } }, "&:not(:has(.timeline-middle))": { ":first-child": { "> hr:last-child": { "border-start-start-radius": "var(--radius-selector)", "border-end-start-radius": "var(--radius-selector)", "border-start-end-radius": "0", "border-end-end-radius": "0" } }, ":last-child": { "> hr:first-child": { "border-start-start-radius": "0", "border-end-start-radius": "0", "border-start-end-radius": "var(--radius-selector)", "border-end-end-radius": "var(--radius-selector)" } } } } }; + +// packages/daisyui/components/timeline/index.js +var timeline_default = ({ addComponents, prefix = "" }) => { + const prefixedtimeline = addPrefix(object_default51, prefix); + addComponents({ ...prefixedtimeline }); +}; + +// packages/daisyui/components/textarea/object.js +var object_default52 = { ".textarea": { border: "var(--border) solid #0000", "min-height": "calc(0.25rem * 20)", "flex-shrink": 1, appearance: "none", "border-radius": "var(--radius-field)", "background-color": "var(--color-base-100)", "padding-block": "calc(0.25rem * 2)", "vertical-align": "middle", width: "clamp(3rem, 20rem, 100%)", "padding-inline-start": "0.75rem", "padding-inline-end": "0.75rem", "font-size": "0.875rem", "border-color": "var(--input-color)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset", "--input-color": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", textarea: { appearance: "none", "background-color": "transparent", border: "none", "&:focus, &:focus-within": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } } }, "&:focus, &:focus-within": { "--input-color": "var(--color-base-content)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)", outline: "2px solid var(--input-color)", "outline-offset": "2px", isolation: "isolate" }, "&:has(> textarea[disabled]), &:is(:disabled, [disabled])": { cursor: "not-allowed", "border-color": "var(--color-base-200)", "background-color": "var(--color-base-200)", color: "color-mix(in oklab, var(--color-base-content) 40%, transparent)", "&::placeholder": { color: "color-mix(in oklab, var(--color-base-content) 20%, transparent)" }, "box-shadow": "none" }, "&:has(> textarea[disabled]) > textarea[disabled]": { cursor: "not-allowed" } }, ".textarea-ghost": { "background-color": "transparent", "box-shadow": "none", "border-color": "#0000", "&:focus, &:focus-within": { "background-color": "var(--color-base-100)", color: "var(--color-base-content)", "border-color": "#0000", "box-shadow": "none" } }, ".textarea-neutral": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-neutral)" } }, ".textarea-primary": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-primary)" } }, ".textarea-secondary": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-secondary)" } }, ".textarea-accent": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-accent)" } }, ".textarea-info": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-info)" } }, ".textarea-success": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-success)" } }, ".textarea-warning": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-warning)" } }, ".textarea-error": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-error)" } }, ".textarea-xs": { "font-size": "0.6875rem" }, ".textarea-sm": { "font-size": "0.75rem" }, ".textarea-md": { "font-size": "0.875rem" }, ".textarea-lg": { "font-size": "1.125rem" }, ".textarea-xl": { "font-size": "1.375rem" } }; + +// packages/daisyui/components/textarea/index.js +var textarea_default = ({ addComponents, prefix = "" }) => { + const prefixedtextarea = addPrefix(object_default52, prefix); + addComponents({ ...prefixedtextarea }); +}; + +// packages/daisyui/components/range/object.js +var object_default53 = { ".range": { appearance: "none", "webkit-appearance": "none", "--range-thumb": "var(--color-base-100)", "--range-thumb-size": "calc(var(--size-selector, 0.25rem) * 6)", "--range-progress": "currentColor", "--range-fill": "1", "--range-p": "0.25rem", "--range-bg": "color-mix(in oklab, currentColor 10%, #0000)", cursor: "pointer", overflow: "hidden", "background-color": "transparent", "vertical-align": "middle", width: "clamp(3rem, 20rem, 100%)", "--radius-selector-max": `calc( + var(--radius-selector) + var(--radius-selector) + var(--radius-selector) + )`, "border-radius": "calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)))", border: "none", height: "var(--range-thumb-size)", '[dir="rtl"] &': { "--range-dir": "-1" }, "&:focus": { outline: "none" }, "&:focus-visible": { outline: "2px solid", "outline-offset": "2px" }, "&::-webkit-slider-runnable-track": { width: "100%", "background-color": "var(--range-bg)", "border-radius": "var(--radius-selector)", height: "calc(var(--range-thumb-size) * 0.5)" }, "@media (forced-colors: active)": [{ "&::-webkit-slider-runnable-track": { border: "1px solid" } }, { "&::-moz-range-track": { border: "1px solid" } }], "&::-webkit-slider-thumb": { position: "relative", "box-sizing": "border-box", "border-radius": "calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)))", "background-color": "currentColor", height: "var(--range-thumb-size)", width: "var(--range-thumb-size)", border: "var(--range-p) solid", appearance: "none", "webkit-appearance": "none", top: "50%", color: "var(--range-progress)", transform: "translateY(-50%)", "box-shadow": "0 -1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, calc((var(--range-dir, 1) * -100rem) - (var(--range-dir, 1) * var(--range-thumb-size) / 2)) 0 0 calc(100rem * var(--range-fill))" }, "&::-moz-range-track": { width: "100%", "background-color": "var(--range-bg)", "border-radius": "var(--radius-selector)", height: "calc(var(--range-thumb-size) * 0.5)" }, "&::-moz-range-thumb": { position: "relative", "box-sizing": "border-box", "border-radius": "calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)))", "background-color": "currentColor", height: "var(--range-thumb-size)", width: "var(--range-thumb-size)", border: "var(--range-p) solid", top: "50%", color: "var(--range-progress)", "box-shadow": "0 -1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, calc((var(--range-dir, 1) * -100rem) - (var(--range-dir, 1) * var(--range-thumb-size) / 2)) 0 0 calc(100rem * var(--range-fill))" }, "&:disabled": { cursor: "not-allowed", opacity: "30%" } }, ".range-primary": { color: "var(--color-primary)", "--range-thumb": "var(--color-primary-content)" }, ".range-secondary": { color: "var(--color-secondary)", "--range-thumb": "var(--color-secondary-content)" }, ".range-accent": { color: "var(--color-accent)", "--range-thumb": "var(--color-accent-content)" }, ".range-neutral": { color: "var(--color-neutral)", "--range-thumb": "var(--color-neutral-content)" }, ".range-success": { color: "var(--color-success)", "--range-thumb": "var(--color-success-content)" }, ".range-warning": { color: "var(--color-warning)", "--range-thumb": "var(--color-warning-content)" }, ".range-info": { color: "var(--color-info)", "--range-thumb": "var(--color-info-content)" }, ".range-error": { color: "var(--color-error)", "--range-thumb": "var(--color-error-content)" }, ".range-xs": { "--range-thumb-size": "calc(var(--size-selector, 0.25rem) * 4)" }, ".range-sm": { "--range-thumb-size": "calc(var(--size-selector, 0.25rem) * 5)" }, ".range-md": { "--range-thumb-size": "calc(var(--size-selector, 0.25rem) * 6)" }, ".range-lg": { "--range-thumb-size": "calc(var(--size-selector, 0.25rem) * 7)" }, ".range-xl": { "--range-thumb-size": "calc(var(--size-selector, 0.25rem) * 8)" } }; + +// packages/daisyui/components/range/index.js +var range_default = ({ addComponents, prefix = "" }) => { + const prefixedrange = addPrefix(object_default53, prefix); + addComponents({ ...prefixedrange }); +}; + +// packages/daisyui/components/dock/object.js +var object_default54 = { ".dock": { position: "fixed", right: "calc(0.25rem * 0)", bottom: "calc(0.25rem * 0)", left: "calc(0.25rem * 0)", "z-index": 1, display: "flex", width: "100%", "flex-direction": "row", "align-items": "center", "justify-content": "space-around", "background-color": "var(--color-base-100)", padding: "calc(0.25rem * 2)", color: "currentColor", "border-top": "0.5px solid color-mix(in oklab, var(--color-base-content) 5%, #0000)", height: ["4rem", "calc(4rem + env(safe-area-inset-bottom))"], "padding-bottom": "env(safe-area-inset-bottom)", "> *": { position: "relative", "margin-bottom": "calc(0.25rem * 2)", display: "flex", height: "100%", "max-width": "calc(0.25rem * 32)", "flex-shrink": 1, "flex-basis": "100%", cursor: "pointer", "flex-direction": "column", "align-items": "center", "justify-content": "center", gap: "1px", "border-radius": "var(--radius-box)", "background-color": "transparent", transition: "opacity 0.2s ease-out", "@media (hover: hover)": { "&:hover": { opacity: "80%" } }, '&[aria-disabled="true"], &[disabled]': { "&, &:hover": { "pointer-events": "none", color: "color-mix(in oklab, var(--color-base-content) 10%, transparent)", opacity: "100%" } }, ".dock-label": { "font-size": "0.6875rem" }, "&:after": { content: '""', position: "absolute", height: "calc(0.25rem * 1)", width: "calc(0.25rem * 6)", "border-radius": "calc(infinity * 1px)", "background-color": "transparent", bottom: "0.2rem", "border-top": "3px solid transparent", transition: "background-color 0.1s ease-out, text-color 0.1s ease-out, width 0.1s ease-out" } } }, ".dock-active": { "&:after": { width: "calc(0.25rem * 10)", "background-color": "currentColor", color: "currentColor" } }, ".dock-xs": { height: ["3rem", "calc(3rem + env(safe-area-inset-bottom))"], ".dock-active": { "&:after": { bottom: "-0.1rem" } }, ".dock-label": { "font-size": "0.625rem" } }, ".dock-sm": { height: ["calc(0.25rem * 14)", "3.5rem", "calc(3.5rem + env(safe-area-inset-bottom))"], ".dock-active": { "&:after": { bottom: "-0.1rem" } }, ".dock-label": { "font-size": "0.625rem" } }, ".dock-md": { height: ["4rem", "calc(4rem + env(safe-area-inset-bottom))"], ".dock-label": { "font-size": "0.6875rem" } }, ".dock-lg": { height: ["4.5rem", "calc(4.5rem + env(safe-area-inset-bottom))"], ".dock-active": { "&:after": { bottom: "0.4rem" } }, ".dock-label": { "font-size": "0.6875rem" } }, ".dock-xl": { height: ["5rem", "calc(5rem + env(safe-area-inset-bottom))"], ".dock-active": { "&:after": { bottom: "0.4rem" } }, ".dock-label": { "font-size": "0.75rem" } } }; + +// packages/daisyui/components/dock/index.js +var dock_default = ({ addComponents, prefix = "" }) => { + const prefixeddock = addPrefix(object_default54, prefix); + addComponents({ ...prefixeddock }); +}; + +// packages/daisyui/components/breadcrumbs/object.js +var object_default55 = { ".breadcrumbs": { "max-width": "100%", "overflow-x": "auto", "padding-block": "calc(0.25rem * 2)", "> menu, > ul, > ol": { display: "flex", "min-height": "min-content", "align-items": "center", "white-space": "nowrap", "> li": { display: "flex", "align-items": "center", "> *": { display: "flex", cursor: "pointer", "align-items": "center", gap: "calc(0.25rem * 2)", "&:hover": { "@media (hover: hover)": { "text-decoration-line": "underline" } }, "&:focus": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:focus-visible": { outline: "2px solid currentColor", "outline-offset": "2px" } }, "& + *:before": { content: '""', "margin-right": "calc(0.25rem * 3)", "margin-left": "calc(0.25rem * 2)", display: "block", height: "calc(0.25rem * 1.5)", width: "calc(0.25rem * 1.5)", opacity: "40%", rotate: "45deg", "border-top": "1px solid", "border-right": "1px solid", "background-color": "#0000" }, '[dir="rtl"] & + *:before': { rotate: "-135deg" } } } } }; + +// packages/daisyui/components/breadcrumbs/index.js +var breadcrumbs_default = ({ addComponents, prefix = "" }) => { + const prefixedbreadcrumbs = addPrefix(object_default55, prefix); + addComponents({ ...prefixedbreadcrumbs }); +}; + +// packages/daisyui/components/radio/object.js +var object_default56 = { ".radio": { position: "relative", "flex-shrink": 0, cursor: "pointer", appearance: "none", "border-radius": "calc(infinity * 1px)", padding: "calc(0.25rem * 1)", "vertical-align": "middle", border: "var(--border) solid var(--input-color, color-mix(in srgb, currentColor 20%, #0000))", "box-shadow": "0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset", "--size": "calc(var(--size-selector, 0.25rem) * 6)", width: "var(--size)", height: "var(--size)", color: "var(--input-color, currentColor)", "&:before": { display: "block", width: "100%", height: "100%", "border-radius": "calc(infinity * 1px)", "--tw-content": '""', content: "var(--tw-content)", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)" }, "&:focus-visible": { outline: "2px solid currentColor" }, '&:checked, &[aria-checked="true"]': { animation: "radio 0.2s ease-out", "border-color": "currentColor", "background-color": "var(--color-base-100)", "&:before": { "background-color": "currentColor", "box-shadow": "0 -1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1))" }, "@media (forced-colors: active)": { "&:before": { "outline-style": "var(--tw-outline-style)", "outline-width": "1px", "outline-offset": "calc(1px * -1)" } }, "@media print": { "&:before": { outline: "0.25rem solid", "outline-offset": "-1rem" } } } }, ".radio-primary": { "--input-color": "var(--color-primary)" }, ".radio-secondary": { "--input-color": "var(--color-secondary)" }, ".radio-accent": { "--input-color": "var(--color-accent)" }, ".radio-neutral": { "--input-color": "var(--color-neutral)" }, ".radio-info": { "--input-color": "var(--color-info)" }, ".radio-success": { "--input-color": "var(--color-success)" }, ".radio-warning": { "--input-color": "var(--color-warning)" }, ".radio-error": { "--input-color": "var(--color-error)" }, ".radio:disabled": { cursor: "not-allowed", opacity: "20%" }, ".radio-xs": { padding: "0.125rem", '&:is([type="radio"])': { "--size": "calc(var(--size-selector, 0.25rem) * 4)" } }, ".radio-sm": { padding: "0.1875rem", '&:is([type="radio"])': { "--size": "calc(var(--size-selector, 0.25rem) * 5)" } }, ".radio-md": { padding: "0.25rem", '&:is([type="radio"])': { "--size": "calc(var(--size-selector, 0.25rem) * 6)" } }, ".radio-lg": { padding: "0.3125rem", '&:is([type="radio"])': { "--size": "calc(var(--size-selector, 0.25rem) * 7)" } }, ".radio-xl": { padding: "0.375rem", '&:is([type="radio"])': { "--size": "calc(var(--size-selector, 0.25rem) * 8)" } }, "@keyframes radio": { "0%": { padding: "5px" }, "50%": { padding: "3px" } } }; + +// packages/daisyui/components/radio/index.js +var radio_default = ({ addComponents, prefix = "" }) => { + const prefixedradio = addPrefix(object_default56, prefix); + addComponents({ ...prefixedradio }); +}; + +// packages/daisyui/components/skeleton/object.js +var object_default57 = { ".skeleton": { "border-radius": "var(--radius-box)", "background-color": "var(--color-base-300)", "@media (prefers-reduced-motion: reduce)": { "transition-duration": "15s" }, "will-change": "background-position", animation: "skeleton 1.8s ease-in-out infinite", "background-image": "linear-gradient( 105deg, #0000 0% 40%, var(--color-base-100) 50%, #0000 60% 100% )", "background-size": "200% auto", "background-repeat": "no-repeat", "background-position-x": "-50%" }, "@keyframes skeleton": { "0%": { "background-position": "150%" }, "100%": { "background-position": "-50%" } } }; + +// packages/daisyui/components/skeleton/index.js +var skeleton_default = ({ addComponents, prefix = "" }) => { + const prefixedskeleton = addPrefix(object_default57, prefix); + addComponents({ ...prefixedskeleton }); +}; + +// packages/daisyui/components/loading/object.js +var object_default58 = { ".loading": { "pointer-events": "none", display: "inline-block", "aspect-ratio": "1 / 1", "background-color": "currentColor", "vertical-align": "middle", width: "calc(var(--size-selector, 0.25rem) * 6)", "mask-size": "100%", "mask-repeat": "no-repeat", "mask-position": "center", "mask-image": `url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")` }, ".loading-spinner": { "mask-image": `url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")` }, ".loading-dots": { "mask-image": `url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E")` }, ".loading-ring": { "mask-image": `url("data:image/svg+xml,%3Csvg width='44' height='44' viewBox='0 0 44 44' xmlns='http://www.w3.org/2000/svg' stroke='white'%3E%3Cg fill='none' fill-rule='evenodd' stroke-width='2'%3E%3Ccircle cx='22' cy='22' r='1'%3E%3Canimate attributeName='r' begin='0s' dur='1.8s' values='1;20' calcMode='spline' keyTimes='0;1' keySplines='0.165,0.84,0.44,1' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-opacity' begin='0s' dur='1.8s' values='1;0' calcMode='spline' keyTimes='0;1' keySplines='0.3,0.61,0.355,1' repeatCount='indefinite'/%3E%3C/circle%3E%3Ccircle cx='22' cy='22' r='1'%3E%3Canimate attributeName='r' begin='-0.9s' dur='1.8s' values='1;20' calcMode='spline' keyTimes='0;1' keySplines='0.165,0.84,0.44,1' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-opacity' begin='-0.9s' dur='1.8s' values='1;0' calcMode='spline' keyTimes='0;1' keySplines='0.3,0.61,0.355,1' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")` }, ".loading-ball": { "mask-image": `url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cellipse cx='12' cy='5' rx='4' ry='4'%3E%3Canimate attributeName='cy' values='5;20;20.5;20;5' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3Canimate attributeName='rx' values='4;4;4.8;4;4' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='ry' values='4;4;3;4;4' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite'/%3E%3C/ellipse%3E%3C/svg%3E")` }, ".loading-bars": { "mask-image": `url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='1' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3C/rect%3E%3Crect x='9' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3C/rect%3E%3Crect x='17' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3C/rect%3E%3C/svg%3E")` }, ".loading-infinity": { "mask-image": `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' style='shape-rendering:auto;' width='200px' height='200px' viewBox='0 0 100 100' preserveAspectRatio='xMidYMid'%3E%3Cpath fill='none' stroke='black' stroke-width='10' stroke-dasharray='205.271 51.318' d='M24.3 30C11.4 30 5 43.3 5 50s6.4 20 19.3 20c19.3 0 32.1-40 51.4-40C88.6 30 95 43.3 95 50s-6.4 20-19.3 20C56.4 70 43.6 30 24.3 30z' stroke-linecap='round' style='transform:scale(0.8);transform-origin:50px 50px'%3E%3Canimate attributeName='stroke-dashoffset' repeatCount='indefinite' dur='2s' keyTimes='0;1' values='0;256.589'/%3E%3C/path%3E%3C/svg%3E")` }, ".loading-xs": { width: "calc(var(--size-selector, 0.25rem) * 4)" }, ".loading-sm": { width: "calc(var(--size-selector, 0.25rem) * 5)" }, ".loading-md": { width: "calc(var(--size-selector, 0.25rem) * 6)" }, ".loading-lg": { width: "calc(var(--size-selector, 0.25rem) * 7)" }, ".loading-xl": { width: "calc(var(--size-selector, 0.25rem) * 8)" } }; + +// packages/daisyui/components/loading/index.js +var loading_default = ({ addComponents, prefix = "" }) => { + const prefixedloading = addPrefix(object_default58, prefix); + addComponents({ ...prefixedloading }); +}; + +// packages/daisyui/components/validator/object.js +var object_default59 = { ".validator": { "&:user-valid, &:has(:user-valid)": { '&, &:focus, &:checked, &[aria-checked="true"], &:focus-within': { "--input-color": "var(--color-success)" } }, "&:user-invalid, &:has(:user-invalid), &[aria-invalid]": { '&, &:focus, &:checked, &[aria-checked="true"], &:focus-within': { "--input-color": "var(--color-error)" }, "& ~ .validator-hint": { visibility: "visible", display: "block", color: "var(--color-error)" } } }, ".validator-hint": { visibility: "hidden", "margin-top": "calc(0.25rem * 2)", "font-size": "0.75rem" } }; + +// packages/daisyui/components/validator/index.js +var validator_default = ({ addComponents, prefix = "" }) => { + const prefixedvalidator = addPrefix(object_default59, prefix); + addComponents({ ...prefixedvalidator }); +}; + +// packages/daisyui/components/collapse/object.js +var object_default60 = { ".collapse:not(td, tr, colgroup)": { visibility: "visible" }, ".collapse": { position: "relative", display: "grid", overflow: "hidden", "border-radius": "var(--radius-box, 1rem)", width: "100%", "grid-template-rows": "max-content 0fr", transition: "grid-template-rows 0.2s", isolation: "isolate", '> input:is([type="checkbox"], [type="radio"])': { "grid-column-start": "1", "grid-row-start": "1", appearance: "none", opacity: 0, "z-index": 1, width: "100%", padding: "1rem", "padding-inline-end": "3rem", "min-height": "3.75rem", transition: "background-color 0.2s ease-out" }, '&:is([open], :focus:not(.collapse-close)), &:not(.collapse-close):has(> input:is([type="checkbox"], [type="radio"]):checked)': { "grid-template-rows": "max-content 1fr" }, '&:is([open], :focus:not(.collapse-close)) > .collapse-content, &:not(.collapse-close) > :where(input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-content)': { visibility: "visible", "min-height": "fit-content" }, '&:focus-visible, &:has(> input:is([type="checkbox"], [type="radio"]):focus-visible)': { "outline-color": "var(--color-base-content)", "outline-style": "solid", "outline-width": "2px", "outline-offset": "2px" }, "&:not(.collapse-close)": { '> input[type="checkbox"], > input[type="radio"]:not(:checked), > .collapse-title': { cursor: "pointer" } }, "&:focus:not(.collapse-close, .collapse[open]) > .collapse-title": { cursor: "unset" }, '&:is([open], :focus:not(.collapse-close)) > :where(.collapse-content), &:not(.collapse-close) > :where(input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-content)': { "padding-bottom": "1rem", transition: "padding 0.2s ease-out, background-color 0.2s ease-out" }, "&:is([open])": { "&.collapse-arrow": { "> .collapse-title:after": { transform: "translateY(-50%) rotate(225deg)" } } }, "&.collapse-open": { "&.collapse-arrow": { "> .collapse-title:after": { transform: "translateY(-50%) rotate(225deg)" } }, "&.collapse-plus": { "> .collapse-title:after": { content: '"โˆ’"' } } }, "&.collapse-arrow:focus:not(.collapse-close)": { "> .collapse-title:after": { transform: "translateY(-50%) rotate(225deg)" } }, "&.collapse-arrow:not(.collapse-close)": { '> input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-title:after': { transform: "translateY(-50%) rotate(225deg)" } }, "&[open]": { "&.collapse-plus": { "> .collapse-title:after": { content: '"โˆ’"' } } }, "&.collapse-plus:focus:not(.collapse-close)": { "> .collapse-title:after": { content: '"โˆ’"' } }, "&.collapse-plus:not(.collapse-close)": { '> input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-title:after': { content: '"โˆ’"' } } }, ".collapse-title, .collapse-content": { "grid-column-start": "1", "grid-row-start": "1" }, ".collapse-content": { visibility: "hidden", "grid-column-start": "1", "grid-row-start": "2", "min-height": "0", "padding-left": "1rem", "padding-right": "1rem", cursor: "unset", transition: "visibility 0.2s, padding 0.2s ease-out, background-color 0.2s ease-out" }, ".collapse:is(details)": { width: "100%", "& summary": { position: "relative", display: "block", "&::-webkit-details-marker": { display: "none" } } }, ".collapse:is(details) summary": { outline: "none" }, ".collapse-arrow": { "> .collapse-title:after": { position: "absolute", display: "block", height: "0.5rem", width: "0.5rem", transform: "translateY(-100%) rotate(45deg)", "transition-property": "all", "transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)", "transition-duration": "0.2s", top: "1.9rem", "inset-inline-end": "1.4rem", content: '""', "transform-origin": "75% 75%", "box-shadow": "2px 2px", "pointer-events": "none" } }, ".collapse-plus": { "> .collapse-title:after": { position: "absolute", display: "block", height: "0.5rem", width: "0.5rem", "transition-property": "all", "transition-duration": "300ms", "transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)", top: "0.9rem", "inset-inline-end": "1.4rem", content: '"+"', "pointer-events": "none" } }, ".collapse-title": { position: "relative", width: "100%", padding: "1rem", "padding-inline-end": "3rem", "min-height": "3.75rem", transition: "background-color 0.2s ease-out" }, ".collapse-open": { "grid-template-rows": "max-content 1fr", "> .collapse-content": { visibility: "visible", "min-height": "fit-content", "padding-bottom": "1rem", transition: "padding 0.2s ease-out, background-color 0.2s ease-out" } } }; + +// packages/daisyui/components/collapse/index.js +var collapse_default = ({ addComponents, prefix = "" }) => { + const prefixedcollapse = addPrefix(object_default60, prefix); + addComponents({ ...prefixedcollapse }); +}; + +// packages/daisyui/components/swap/object.js +var object_default61 = { ".swap": { position: "relative", display: "inline-grid", cursor: "pointer", "place-content": "center", "vertical-align": "middle", "webkit-user-select": "none", "user-select": "none", input: { appearance: "none", border: "none" }, "> *": { "grid-column-start": "1", "grid-row-start": "1", "transition-property": "transform, rotate, opacity", "transition-duration": "0.2s", "transition-timing-function": "cubic-bezier(0, 0, 0.2, 1)" }, ".swap-on, .swap-indeterminate, input:indeterminate ~ .swap-on": { opacity: "0%" }, "input:is(:checked, :indeterminate)": { "& ~ .swap-off": { opacity: "0%" } }, "input:checked ~ .swap-on, input:indeterminate ~ .swap-indeterminate": { opacity: "100%", "backface-visibility": "visible" } }, ".swap-active": { ".swap-off": { opacity: "0%" }, ".swap-on": { opacity: "100%" } }, ".swap-rotate": { ".swap-on, input:indeterminate ~ .swap-on": { rotate: "45deg" }, "input:is(:checked, :indeterminate) ~ .swap-on, &.swap-active .swap-on": { rotate: "0deg" }, "input:is(:checked, :indeterminate) ~ .swap-off, &.swap-active .swap-off": { rotate: "calc(45deg * -1)" } }, ".swap-flip": { "transform-style": "preserve-3d", perspective: "20rem", ".swap-on, .swap-indeterminate, input:indeterminate ~ .swap-on": { transform: "rotateY(180deg)", "backface-visibility": "hidden" }, "input:is(:checked, :indeterminate) ~ .swap-on, &.swap-active .swap-on": { transform: "rotateY(0deg)" }, "input:is(:checked, :indeterminate) ~ .swap-off, &.swap-active .swap-off": { transform: "rotateY(-180deg)", "backface-visibility": "hidden", opacity: "100%" } } }; + +// packages/daisyui/components/swap/index.js +var swap_default = ({ addComponents, prefix = "" }) => { + const prefixedswap = addPrefix(object_default61, prefix); + addComponents({ ...prefixedswap }); +}; + +// packages/daisyui/utilities/typography/object.js +var object_default62 = { ":root .prose": { "--tw-prose-body": "color-mix(in oklab, var(--color-base-content) 80%, #0000)", "--tw-prose-headings": "var(--color-base-content)", "--tw-prose-lead": "var(--color-base-content)", "--tw-prose-links": "var(--color-base-content)", "--tw-prose-bold": "var(--color-base-content)", "--tw-prose-counters": "var(--color-base-content)", "--tw-prose-bullets": "color-mix(in oklab, var(--color-base-content) 50%, #0000)", "--tw-prose-hr": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", "--tw-prose-quotes": "var(--color-base-content)", "--tw-prose-quote-borders": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", "--tw-prose-captions": "color-mix(in oklab, var(--color-base-content) 50%, #0000)", "--tw-prose-code": "var(--color-base-content)", "--tw-prose-pre-code": "var(--color-neutral-content)", "--tw-prose-pre-bg": "var(--color-neutral)", "--tw-prose-th-borders": "color-mix(in oklab, var(--color-base-content) 50%, #0000)", "--tw-prose-td-borders": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", "--tw-prose-kbd": "color-mix(in oklab, var(--color-base-content) 80%, #0000)", ":where(code):not(pre > code)": { "background-color": "var(--color-base-200)", "border-radius": "var(--radius-selector)", border: "var(--border) solid var(--color-base-300)", "padding-inline": "0.5em", "font-weight": "inherit", "&:before, &:after": { display: "none" } } } }; + +// packages/daisyui/utilities/typography/index.js +var typography_default = ({ addUtilities, prefix = "" }) => { + const prefixedtypography = addPrefix(object_default62, prefix); + addUtilities({ ...prefixedtypography }); +}; + +// packages/daisyui/utilities/glass/object.js +var object_default63 = { ".glass": { border: "none", "backdrop-filter": "blur(var(--glass-blur, 40px))", "background-color": "#0000", "background-image": "linear-gradient( 135deg, oklch(100% 0 0 / var(--glass-opacity, 30%)) 0%, oklch(0% 0 0 / 0%) 100% ), linear-gradient( var(--glass-reflect-degree, 100deg), oklch(100% 0 0 / var(--glass-reflect-opacity, 5%)) 25%, oklch(0% 0 0 / 0%) 25% )", "box-shadow": "0 0 0 1px oklch(100% 0 0 / var(--glass-border-opacity, 20%)) inset, 0 0 0 2px oklch(0% 0 0 / 5%)", "text-shadow": "0 1px oklch(0% 0 0 / var(--glass-text-shadow-opacity, 5%))" } }; + +// packages/daisyui/utilities/glass/index.js +var glass_default = ({ addUtilities, prefix = "" }) => { + const prefixedglass = addPrefix(object_default63, prefix); + addUtilities({ ...prefixedglass }); +}; + +// packages/daisyui/utilities/join/object.js +var object_default64 = { ".join": { display: "inline-flex", "align-items": "stretch", "--join-ss": "0", "--join-se": "0", "--join-es": "0", "--join-ee": "0", ":where(.join-item)": { "border-start-start-radius": "var(--join-ss, 0)", "border-start-end-radius": "var(--join-se, 0)", "border-end-start-radius": "var(--join-es, 0)", "border-end-end-radius": "var(--join-ee, 0)", "*": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" } }, "> .join-item:where(:first-child)": { "--join-ss": "var(--radius-field)", "--join-se": "0", "--join-es": "var(--radius-field)", "--join-ee": "0" }, ":first-child:not(:last-child)": { ":where(.join-item)": { "--join-ss": "var(--radius-field)", "--join-se": "0", "--join-es": "var(--radius-field)", "--join-ee": "0" } }, "> .join-item:where(:last-child)": { "--join-ss": "0", "--join-se": "var(--radius-field)", "--join-es": "0", "--join-ee": "var(--radius-field)" }, ":last-child:not(:first-child)": { ":where(.join-item)": { "--join-ss": "0", "--join-se": "var(--radius-field)", "--join-es": "0", "--join-ee": "var(--radius-field)" } }, "> .join-item:where(:only-child)": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" }, ":only-child": { ":where(.join-item)": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" } } }, ".join-item": { "&:where(*:not(:first-child, :disabled, [disabled], .btn-disabled))": { "margin-inline-start": "calc(var(--border, 1px) * -1)", "margin-block-start": "0" } }, ".join-vertical": { "flex-direction": "column", "> .join-item:first-child": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "0", "--join-ee": "0" }, ":first-child:not(:last-child)": { ".join-item": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "0", "--join-ee": "0" } }, "> .join-item:last-child": { "--join-ss": "0", "--join-se": "0", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" }, ":last-child:not(:first-child)": { ".join-item": { "--join-ss": "0", "--join-se": "0", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" } }, "> .join-item:only-child": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" }, ":only-child": { ".join-item": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" } }, ".join-item": { "&:where(*:not(:first-child))": { "margin-inline-start": "0", "margin-block-start": "calc(var(--border, 1px) * -1)" } } }, ".join-horizontal": { "flex-direction": "row", "> .join-item:first-child": { "--join-ss": "var(--radius-field)", "--join-se": "0", "--join-es": "var(--radius-field)", "--join-ee": "0" }, ":first-child:not(:last-child)": { ".join-item": { "--join-ss": "var(--radius-field)", "--join-se": "0", "--join-es": "var(--radius-field)", "--join-ee": "0" } }, "> .join-item:last-child": { "--join-ss": "0", "--join-se": "var(--radius-field)", "--join-es": "0", "--join-ee": "var(--radius-field)" }, ":last-child:not(:first-child)": { ".join-item": { "--join-ss": "0", "--join-se": "var(--radius-field)", "--join-es": "0", "--join-ee": "var(--radius-field)" } }, "> .join-item:only-child": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" }, ":only-child": { ".join-item": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" } }, ".join-item": { "&:where(*:not(:first-child))": { "margin-inline-start": "calc(var(--border, 1px) * -1)", "margin-block-start": "0" } } } }; + +// packages/daisyui/utilities/join/index.js +var join_default = ({ addUtilities, prefix = "" }) => { + const prefixedjoin = addPrefix(object_default64, prefix); + addUtilities({ ...prefixedjoin }); +}; + +// packages/daisyui/utilities/radius/object.js +var object_default65 = { ".rounded-box": { "border-radius": "var(--radius-box)" }, ".rounded-field": { "border-radius": "var(--radius-field)" }, ".rounded-selector": { "border-radius": "var(--radius-selector)" }, ".rounded-t-box": { "border-top-left-radius": "var(--radius-box)", "border-top-right-radius": "var(--radius-box)" }, ".rounded-b-box": { "border-bottom-left-radius": "var(--radius-box)", "border-bottom-right-radius": "var(--radius-box)" }, ".rounded-l-box": { "border-top-left-radius": "var(--radius-box)", "border-bottom-left-radius": "var(--radius-box)" }, ".rounded-r-box": { "border-top-right-radius": "var(--radius-box)", "border-bottom-right-radius": "var(--radius-box)" }, ".rounded-tl-box": { "border-top-left-radius": "var(--radius-box)" }, ".rounded-tr-box": { "border-top-right-radius": "var(--radius-box)" }, ".rounded-br-box": { "border-bottom-right-radius": "var(--radius-box)" }, ".rounded-bl-box": { "border-bottom-left-radius": "var(--radius-box)" }, ".rounded-t-field": { "border-top-left-radius": "var(--radius-field)", "border-top-right-radius": "var(--radius-field)" }, ".rounded-b-field": { "border-bottom-left-radius": "var(--radius-field)", "border-bottom-right-radius": "var(--radius-field)" }, ".rounded-l-field": { "border-top-left-radius": "var(--radius-field)", "border-bottom-left-radius": "var(--radius-field)" }, ".rounded-r-field": { "border-top-right-radius": "var(--radius-field)", "border-bottom-right-radius": "var(--radius-field)" }, ".rounded-tl-field": { "border-top-left-radius": "var(--radius-field)" }, ".rounded-tr-field": { "border-top-right-radius": "var(--radius-field)" }, ".rounded-br-field": { "border-bottom-right-radius": "var(--radius-field)" }, ".rounded-bl-field": { "border-bottom-left-radius": "var(--radius-field)" }, ".rounded-t-selector": { "border-top-left-radius": "var(--radius-selector)", "border-top-right-radius": "var(--radius-selector)" }, ".rounded-b-selector": { "border-bottom-left-radius": "var(--radius-selector)", "border-bottom-right-radius": "var(--radius-selector)" }, ".rounded-l-selector": { "border-top-left-radius": "var(--radius-selector)", "border-bottom-left-radius": "var(--radius-selector)" }, ".rounded-r-selector": { "border-top-right-radius": "var(--radius-selector)", "border-bottom-right-radius": "var(--radius-selector)" }, ".rounded-tl-selector": { "border-top-left-radius": "var(--radius-selector)" }, ".rounded-tr-selector": { "border-top-right-radius": "var(--radius-selector)" }, ".rounded-br-selector": { "border-bottom-right-radius": "var(--radius-selector)" }, ".rounded-bl-selector": { "border-bottom-left-radius": "var(--radius-selector)" } }; + +// packages/daisyui/utilities/radius/index.js +var radius_default = ({ addUtilities, prefix = "" }) => { + const prefixedradius = addPrefix(object_default65, prefix); + addUtilities({ ...prefixedradius }); +}; + +// packages/daisyui/imports.js +var base = { rootscrolllock: rootscrolllock_default, rootcolor: rootcolor_default, scrollbar: scrollbar_default, properties: properties_default, rootscrollgutter: rootscrollgutter_default, svg: svg_default }; +var components = { drawer: drawer_default, link: link_default, stat: stat_default, carousel: carousel_default, divider: divider_default, mask: mask_default, fieldset: fieldset_default, dropdown: dropdown_default, card: card_default, steps: steps_default, alert: alert_default, kbd: kbd_default, select: select_default, progress: progress_default, fileinput: fileinput_default, modal: modal_default, footer: footer_default, table: table_default, avatar: avatar_default, input: input_default, checkbox: checkbox_default, badge: badge_default, status: status_default, diff: diff_default, hero: hero_default, toggle: toggle_default, stack: stack_default, navbar: navbar_default, label: label_default, menu: menu_default, toast: toast_default, button: button_default, list: list_default, mockup: mockup_default, calendar: calendar_default, indicator: indicator_default, rating: rating_default, tab: tab_default, filter: filter_default, chat: chat_default, radialprogress: radialprogress_default, countdown: countdown_default, tooltip: tooltip_default, timeline: timeline_default, textarea: textarea_default, range: range_default, dock: dock_default, breadcrumbs: breadcrumbs_default, radio: radio_default, skeleton: skeleton_default, loading: loading_default, validator: validator_default, collapse: collapse_default, swap: swap_default }; +var utilities = { typography: typography_default, glass: glass_default, join: join_default, radius: radius_default }; + +// packages/daisyui/index.js +var version = "5.0.35"; +var daisyui_default = plugin.withOptions((options) => { + return ({ addBase, addComponents, addUtilities }) => { + const { + include, + exclude, + prefix = "" + } = pluginOptionsHandler(options, addBase, object_default, version); + const shouldIncludeItem = (name) => { + if (include && exclude) { + return include.includes(name) && !exclude.includes(name); + } + if (include) { + return include.includes(name); + } + if (exclude) { + return !exclude.includes(name); + } + return true; + }; + Object.entries(base).forEach(([name, item]) => { + if (!shouldIncludeItem(name)) + return; + item({ addBase, prefix }); + }); + Object.entries(components).forEach(([name, item]) => { + if (!shouldIncludeItem(name)) + return; + item({ addComponents, prefix }); + }); + Object.entries(utilities).forEach(([name, item]) => { + if (!shouldIncludeItem(name)) + return; + item({ addUtilities, prefix }); + }); + }; +}, () => ({ + theme: { + extend: variables_default + } +})); + + +/* + + MIT License + + Copyright (c) 2020 Pouya Saadeghi โ€“ https://daisyui.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +*/ diff --git a/website/assets/vendor/heroicons.js b/website/assets/vendor/heroicons.js new file mode 100644 index 0000000..296f80e --- /dev/null +++ b/website/assets/vendor/heroicons.js @@ -0,0 +1,43 @@ +const plugin = require("tailwindcss/plugin") +const fs = require("fs") +const path = require("path") + +module.exports = plugin(function({matchComponents, theme}) { + let iconsDir = path.join(__dirname, "../../deps/heroicons/optimized") + let values = {} + let icons = [ + ["", "/24/outline"], + ["-solid", "/24/solid"], + ["-mini", "/20/solid"], + ["-micro", "/16/solid"] + ] + icons.forEach(([suffix, dir]) => { + fs.readdirSync(path.join(iconsDir, dir)).forEach(file => { + let name = path.basename(file, ".svg") + suffix + values[name] = {name, fullPath: path.join(iconsDir, dir, file)} + }) + }) + matchComponents({ + "hero": ({name, fullPath}) => { + let content = fs.readFileSync(fullPath).toString().replace(/\r?\n|\r/g, "") + content = encodeURIComponent(content) + let size = theme("spacing.6") + if (name.endsWith("-mini")) { + size = theme("spacing.5") + } else if (name.endsWith("-micro")) { + size = theme("spacing.4") + } + return { + [`--hero-${name}`]: `url('data:image/svg+xml;utf8,${content}')`, + "-webkit-mask": `var(--hero-${name})`, + "mask": `var(--hero-${name})`, + "mask-repeat": "no-repeat", + "background-color": "currentColor", + "vertical-align": "middle", + "display": "inline-block", + "width": size, + "height": size + } + } + }, {values}) +}) diff --git a/website/assets/vendor/topbar.js b/website/assets/vendor/topbar.js new file mode 100644 index 0000000..0552337 --- /dev/null +++ b/website/assets/vendor/topbar.js @@ -0,0 +1,138 @@ +/** + * @license MIT + * topbar 3.0.0 + * http://buunguyen.github.io/topbar + * Copyright (c) 2024 Buu Nguyen + */ +(function (window, document) { + "use strict"; + + var canvas, + currentProgress, + showing, + progressTimerId = null, + fadeTimerId = null, + delayTimerId = null, + addEvent = function (elem, type, handler) { + if (elem.addEventListener) elem.addEventListener(type, handler, false); + else if (elem.attachEvent) elem.attachEvent("on" + type, handler); + else elem["on" + type] = handler; + }, + options = { + autoRun: true, + barThickness: 3, + barColors: { + 0: "rgba(26, 188, 156, .9)", + ".25": "rgba(52, 152, 219, .9)", + ".50": "rgba(241, 196, 15, .9)", + ".75": "rgba(230, 126, 34, .9)", + "1.0": "rgba(211, 84, 0, .9)", + }, + shadowBlur: 10, + shadowColor: "rgba(0, 0, 0, .6)", + className: null, + }, + repaint = function () { + canvas.width = window.innerWidth; + canvas.height = options.barThickness * 5; // need space for shadow + + var ctx = canvas.getContext("2d"); + ctx.shadowBlur = options.shadowBlur; + ctx.shadowColor = options.shadowColor; + + var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0); + for (var stop in options.barColors) + lineGradient.addColorStop(stop, options.barColors[stop]); + ctx.lineWidth = options.barThickness; + ctx.beginPath(); + ctx.moveTo(0, options.barThickness / 2); + ctx.lineTo( + Math.ceil(currentProgress * canvas.width), + options.barThickness / 2 + ); + ctx.strokeStyle = lineGradient; + ctx.stroke(); + }, + createCanvas = function () { + canvas = document.createElement("canvas"); + var style = canvas.style; + style.position = "fixed"; + style.top = style.left = style.right = style.margin = style.padding = 0; + style.zIndex = 100001; + style.display = "none"; + if (options.className) canvas.classList.add(options.className); + addEvent(window, "resize", repaint); + }, + topbar = { + config: function (opts) { + for (var key in opts) + if (options.hasOwnProperty(key)) options[key] = opts[key]; + }, + show: function (delay) { + if (showing) return; + if (delay) { + if (delayTimerId) return; + delayTimerId = setTimeout(() => topbar.show(), delay); + } else { + showing = true; + if (fadeTimerId !== null) window.cancelAnimationFrame(fadeTimerId); + if (!canvas) createCanvas(); + if (!canvas.parentElement) document.body.appendChild(canvas); + canvas.style.opacity = 1; + canvas.style.display = "block"; + topbar.progress(0); + if (options.autoRun) { + (function loop() { + progressTimerId = window.requestAnimationFrame(loop); + topbar.progress( + "+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2) + ); + })(); + } + } + }, + progress: function (to) { + if (typeof to === "undefined") return currentProgress; + if (typeof to === "string") { + to = + (to.indexOf("+") >= 0 || to.indexOf("-") >= 0 + ? currentProgress + : 0) + parseFloat(to); + } + currentProgress = to > 1 ? 1 : to; + repaint(); + return currentProgress; + }, + hide: function () { + clearTimeout(delayTimerId); + delayTimerId = null; + if (!showing) return; + showing = false; + if (progressTimerId != null) { + window.cancelAnimationFrame(progressTimerId); + progressTimerId = null; + } + (function loop() { + if (topbar.progress("+.1") >= 1) { + canvas.style.opacity -= 0.05; + if (canvas.style.opacity <= 0.05) { + canvas.style.display = "none"; + fadeTimerId = null; + return; + } + } + fadeTimerId = window.requestAnimationFrame(loop); + })(); + }, + }; + + if (typeof module === "object" && typeof module.exports === "object") { + module.exports = topbar; + } else if (typeof define === "function" && define.amd) { + define(function () { + return topbar; + }); + } else { + this.topbar = topbar; + } +}.call(this, window, document)); diff --git a/website/config/config.exs b/website/config/config.exs new file mode 100644 index 0000000..d37d33c --- /dev/null +++ b/website/config/config.exs @@ -0,0 +1,65 @@ +# This file is responsible for configuring your application +# and its dependencies with the aid of the Config module. +# +# This configuration file is loaded before any dependency and +# is restricted to this project. + +# General application configuration +import Config + +config :website, + namespace: Demo, + generators: [timestamp_type: :utc_datetime] + +# Configure the endpoint +config :website, DemoWeb.Endpoint, + url: [host: "localhost"], + adapter: Bandit.PhoenixAdapter, + render_errors: [ + formats: [html: DemoWeb.ErrorHTML, json: DemoWeb.ErrorJSON], + layout: false + ], + pubsub_server: Demo.PubSub, + live_view: [signing_salt: "X+z9lCVz"] + +# Configure the mailer +# +# By default it uses the "Local" adapter which stores the emails +# locally. You can see the emails in your browser, at "/dev/mailbox". +# +# For production it's recommended to configure a different adapter +# at the `config/runtime.exs`. +config :website, Demo.Mailer, adapter: Swoosh.Adapters.Local + +# Configure esbuild (the version is required) +config :esbuild, + version: "0.25.4", + website: [ + args: + ~w(js/app.js --bundle --target=es2022 --outdir=../priv/static/assets/js --external:/fonts/* --external:/images/* --alias:@=.), + cd: Path.expand("../assets", __DIR__), + env: %{"NODE_PATH" => [Path.expand("../deps", __DIR__), Mix.Project.build_path()]} + ] + +# Configure tailwind (the version is required) +config :tailwind, + version: "4.1.12", + website: [ + args: ~w( + --input=assets/css/app.css + --output=priv/static/assets/css/app.css + ), + cd: Path.expand("..", __DIR__) + ] + +# Configure Elixir's Logger +config :logger, :default_formatter, + format: "$time $metadata[$level] $message\n", + metadata: [:request_id] + +# Use Jason for JSON parsing in Phoenix +config :phoenix, :json_library, Jason + +# Import environment specific config. This must remain at the bottom +# of this file so it overrides the configuration defined above. +import_config "#{config_env()}.exs" diff --git a/website/config/dev.exs b/website/config/dev.exs new file mode 100644 index 0000000..117ecc4 --- /dev/null +++ b/website/config/dev.exs @@ -0,0 +1,82 @@ +import Config + +# For development, we disable any cache and enable +# debugging and code reloading. +# +# The watchers configuration can be used to run external +# watchers to your application. For example, we can use it +# to bundle .js and .css sources. +config :website, DemoWeb.Endpoint, + # Binding to loopback ipv4 address prevents access from other machines. + # Change to `ip: {0, 0, 0, 0}` to allow access from other machines. + http: [ip: {127, 0, 0, 1}], + check_origin: false, + code_reloader: true, + debug_errors: true, + secret_key_base: "Tc4MuO4fBQdoicv8o7TBbFW/FeR+l1ttH1rwIUScVcbxwNZnKHmZRuiceT3idqnZ", + watchers: [ + esbuild: {Esbuild, :install_and_run, [:website, ~w(--sourcemap=inline --watch)]}, + tailwind: {Tailwind, :install_and_run, [:website, ~w(--watch)]} + ] + +# ## SSL Support +# +# In order to use HTTPS in development, a self-signed +# certificate can be generated by running the following +# Mix task: +# +# mix phx.gen.cert +# +# Run `mix help phx.gen.cert` for more information. +# +# The `http:` config above can be replaced with: +# +# https: [ +# port: 4001, +# cipher_suite: :strong, +# keyfile: "priv/cert/selfsigned_key.pem", +# certfile: "priv/cert/selfsigned.pem" +# ], +# +# If desired, both `http:` and `https:` keys can be +# configured to run both http and https servers on +# different ports. + +# Reload browser tabs when matching files change. +config :website, DemoWeb.Endpoint, + live_reload: [ + web_console_logger: true, + patterns: [ + # Static assets, except user uploads + ~r"priv/static/(?!uploads/).*\.(js|css|png|jpeg|jpg|gif|svg)$", + # Gettext translations + ~r"priv/gettext/.*\.po$", + # Router, Controllers, LiveViews and LiveComponents + ~r"lib/website_web/router\.ex$", + ~r"lib/website_web/(controllers|live|components)/.*\.(ex|heex)$" + ] + ] + +# Enable dev routes for dashboard and mailbox +config :website, dev_routes: true + +# Do not include metadata nor timestamps in development logs +config :logger, :default_formatter, format: "[$level] $message\n" + +# Set a higher stacktrace during development. Avoid configuring such +# in production as building large stacktraces may be expensive. +config :phoenix, :stacktrace_depth, 20 + +# Initialize plugs at runtime for faster development compilation +config :phoenix, :plug_init_mode, :runtime + +config :phoenix_live_view, + # Include debug annotations and locations in rendered markup. + # Changing this configuration will require mix clean and a full recompile. + debug_heex_annotations: true, + debug_attributes: true, + # Enable helpful, but potentially expensive runtime checks + enable_expensive_runtime_checks: true + +# Disable swoosh api client as it is only required for production adapters. +config :swoosh, :api_client, false diff --git a/website/config/prod.exs b/website/config/prod.exs new file mode 100644 index 0000000..66c14eb --- /dev/null +++ b/website/config/prod.exs @@ -0,0 +1,32 @@ +import Config + +# Note we also include the path to a cache manifest +# containing the digested version of static files. This +# manifest is generated by the `mix assets.deploy` task, +# which you should run after static files are built and +# before starting your production server. +config :website, DemoWeb.Endpoint, cache_static_manifest: "priv/static/cache_manifest.json" + +# Force using SSL in production. This also sets the "strict-security-transport" header, +# known as HSTS. If you have a health check endpoint, you may want to exclude it below. +# Note `:force_ssl` is required to be set at compile-time. +config :website, DemoWeb.Endpoint, + force_ssl: [ + rewrite_on: [:x_forwarded_proto], + exclude: [ + # paths: ["/health"], + hosts: ["localhost", "127.0.0.1"] + ] + ] + +# Configure Swoosh API Client +config :swoosh, api_client: Swoosh.ApiClient.Req + +# Disable Swoosh Local Memory Storage +config :swoosh, local: false + +# Do not print debug messages in production +config :logger, level: :info + +# Runtime production configuration, including reading +# of environment variables, is done on config/runtime.exs. diff --git a/website/config/runtime.exs b/website/config/runtime.exs new file mode 100644 index 0000000..7e1a7e8 --- /dev/null +++ b/website/config/runtime.exs @@ -0,0 +1,102 @@ +import Config + +# config/runtime.exs is executed for all environments, including +# during releases. It is executed after compilation and before the +# system starts, so it is typically used to load production configuration +# and secrets from environment variables or elsewhere. Do not define +# any compile-time configuration in here, as it won't be applied. +# The block below contains prod specific runtime configuration. + +# ## Using releases +# +# If you use `mix release`, you need to explicitly enable the server +# by passing the PHX_SERVER=true when you start it: +# +# PHX_SERVER=true bin/website start +# +# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server` +# script that automatically sets the env var above. +if System.get_env("PHX_SERVER") do + config :website, DemoWeb.Endpoint, server: true +end + +config :website, DemoWeb.Endpoint, http: [port: String.to_integer(System.get_env("PORT", "4000"))] + +if config_env() == :prod do + # The secret key base is used to sign/encrypt cookies and other secrets. + # A default value is used in config/dev.exs and config/test.exs but you + # want to use a different value for prod and you most likely don't want + # to check this value into version control, so we use an environment + # variable instead. + secret_key_base = + System.get_env("SECRET_KEY_BASE") || + raise """ + environment variable SECRET_KEY_BASE is missing. + You can generate one by calling: mix phx.gen.secret + """ + + host = System.get_env("PHX_HOST") || "example.com" + + config :website, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY") + + config :website, DemoWeb.Endpoint, + url: [host: host, port: 443, scheme: "https"], + http: [ + # Enable IPv6 and bind on all interfaces. + # Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access. + # See the documentation on https://hexdocs.pm/bandit/Bandit.html#t:options/0 + # for details about using IPv6 vs IPv4 and loopback vs public addresses. + ip: {0, 0, 0, 0, 0, 0, 0, 0} + ], + secret_key_base: secret_key_base + + # ## SSL Support + # + # To get SSL working, you will need to add the `https` key + # to your endpoint configuration: + # + # config :website, DemoWeb.Endpoint, + # https: [ + # ..., + # port: 443, + # cipher_suite: :strong, + # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"), + # certfile: System.get_env("SOME_APP_SSL_CERT_PATH") + # ] + # + # The `cipher_suite` is set to `:strong` to support only the + # latest and more secure SSL ciphers. This means old browsers + # and clients may not be supported. You can set it to + # `:compatible` for wider support. + # + # `:keyfile` and `:certfile` expect an absolute path to the key + # and cert in disk or a relative path inside priv, for example + # "priv/ssl/server.key". For all supported SSL configuration + # options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1 + # + # We also recommend setting `force_ssl` in your config/prod.exs, + # ensuring no data is ever sent via http, always redirecting to https: + # + # config :website, DemoWeb.Endpoint, + # force_ssl: [hsts: true] + # + # Check `Plug.SSL` for all available options in `force_ssl`. + + # ## Configuring the mailer + # + # In production you need to configure the mailer to use a different adapter. + # Here is an example configuration for Mailgun: + # + # config :website, Demo.Mailer, + # adapter: Swoosh.Adapters.Mailgun, + # api_key: System.get_env("MAILGUN_API_KEY"), + # domain: System.get_env("MAILGUN_DOMAIN") + # + # Most non-SMTP adapters require an API client. Swoosh supports Req, Hackney, + # and Finch out-of-the-box. This configuration is typically done at + # compile-time in your config/prod.exs: + # + # config :swoosh, :api_client, Swoosh.ApiClient.Req + # + # See https://hexdocs.pm/swoosh/Swoosh.html#module-installation for details. +end diff --git a/website/config/test.exs b/website/config/test.exs new file mode 100644 index 0000000..4bc9e1a --- /dev/null +++ b/website/config/test.exs @@ -0,0 +1,28 @@ +import Config + +# We don't run a server during test. If one is required, +# you can enable the server option below. +config :website, DemoWeb.Endpoint, + http: [ip: {127, 0, 0, 1}, port: 4002], + secret_key_base: "E2HJYcgXOpdGGAsp1J7epDZtW0nxvFKTlCRTBd5DkY52UxOWWKJjfUm4/RrR2gzb", + server: false + +# In test we don't send emails +config :website, Demo.Mailer, adapter: Swoosh.Adapters.Test + +# Disable swoosh api client as it is only required for production adapters +config :swoosh, :api_client, false + +# Print only warnings and errors during test +config :logger, level: :warning + +# Initialize plugs at runtime for faster test compilation +config :phoenix, :plug_init_mode, :runtime + +# Enable helpful, but potentially expensive runtime checks +config :phoenix_live_view, + enable_expensive_runtime_checks: true + +# Sort query params output of verified routes for robust url comparisons +config :phoenix, + sort_verified_routes_query_params: true diff --git a/website/lib/website.ex b/website/lib/website.ex new file mode 100644 index 0000000..3f1ac75 --- /dev/null +++ b/website/lib/website.ex @@ -0,0 +1,9 @@ +defmodule Demo do + @moduledoc """ + Demo keeps the contexts that define your domain + and business logic. + + Contexts are also responsible for managing your data, regardless + if it comes from the database, an external API or others. + """ +end diff --git a/website/lib/website/application.ex b/website/lib/website/application.ex new file mode 100644 index 0000000..d344fcb --- /dev/null +++ b/website/lib/website/application.ex @@ -0,0 +1,33 @@ +defmodule Demo.Application do + # See https://hexdocs.pm/elixir/Application.html + # for more information on OTP Applications + @moduledoc false + + use Application + + @impl true + def start(_type, _args) do + children = [ + DemoWeb.Telemetry, + {DNSCluster, query: Application.get_env(:website, :dns_cluster_query) || :ignore}, + {Phoenix.PubSub, name: Demo.PubSub}, + # Start a worker by calling: Demo.Worker.start_link(arg) + # {Demo.Worker, arg}, + # Start to serve requests, typically the last entry + DemoWeb.Endpoint + ] + + # See https://hexdocs.pm/elixir/Supervisor.html + # for other strategies and supported options + opts = [strategy: :one_for_one, name: Demo.Supervisor] + Supervisor.start_link(children, opts) + end + + # Tell Phoenix to update the endpoint configuration + # whenever the application is updated. + @impl true + def config_change(changed, _new, removed) do + DemoWeb.Endpoint.config_change(changed, removed) + :ok + end +end diff --git a/website/lib/website/lua_sandbox.ex b/website/lib/website/lua_sandbox.ex new file mode 100644 index 0000000..994d1e7 --- /dev/null +++ b/website/lib/website/lua_sandbox.ex @@ -0,0 +1,621 @@ +defmodule Website.LuaSandbox do + @moduledoc """ + Safe(-ish) execution wrapper around `Lua.eval!/2`. + + Runs user-submitted Lua snippets in a supervised, time-bounded task and + captures any output produced via the `print` builtin. The host VM is + sandboxed via the library's default deny-list (no `io.*`, `os.*`, + `require`, `package`, `load`, etc.), and execution is killed if it + exceeds the configured timeout. + """ + + alias Lua.Compiler.Prototype + alias Lua.Compiler.Instruction + + @default_timeout_ms 1_000 + + @doc """ + Compiles a Lua snippet into a `Lua.Chunk` (without running it) and + returns the chunk plus the disassembled prototype tree. Returns + `{:error, formatted_messages}` if parsing or compilation fails. + """ + @spec compile(String.t()) :: + {:ok, Lua.Chunk.t(), [map()]} | {:error, [String.t()]} + def compile(source) when is_binary(source) do + case Lua.parse_chunk(source) do + {:ok, %Lua.Chunk{prototype: proto} = chunk} -> + {:ok, chunk, disassemble(proto)} + + {:error, messages} -> + {:error, messages} + end + end + + @doc """ + Executes a Lua snippet under a sandboxed VM, capturing `print` output, + returned values, and any error. Returns a `t:result/0` map. + """ + @type result :: %{ + status: :ok | :error | :timeout, + output: String.t(), + returns: [term()], + error: nil | String.t(), + duration_us: non_neg_integer(), + bytecode: [map()] + } + + @spec run(String.t(), keyword()) :: result() + def run(source, opts \\ []) when is_binary(source) do + timeout = Keyword.get(opts, :timeout_ms, @default_timeout_ms) + + parent = self() + ref = make_ref() + + task = + Task.async(fn -> + send(parent, {ref, :starting}) + do_run(source) + end) + + receive do + {^ref, :starting} -> :ok + after + 100 -> :ok + end + + case Task.yield(task, timeout) || Task.shutdown(task, :brutal_kill) do + {:ok, result} -> + result + + nil -> + %{ + status: :timeout, + output: "", + returns: [], + error: "Execution timed out after #{timeout}ms", + duration_us: timeout * 1000, + bytecode: [] + } + end + end + + defp do_run(source) do + started = System.monotonic_time(:microsecond) + output_pid = start_output_collector() + + lua = + Lua.new() + |> Lua.set!([:print], fn args -> + line = + args + |> Enum.map(&to_lua_string/1) + |> Enum.join("\t") + + send(output_pid, {:line, line}) + [] + end) + + try do + bytecode = + case Lua.parse_chunk(source) do + {:ok, %Lua.Chunk{prototype: proto}} -> disassemble(proto) + _ -> [] + end + + {results, _lua} = Lua.eval!(lua, source) + + %{ + status: :ok, + output: collect_output(output_pid), + returns: Enum.map(results, &inspect_value/1), + error: nil, + duration_us: System.monotonic_time(:microsecond) - started, + bytecode: bytecode + } + rescue + e in [Lua.CompilerException, Lua.RuntimeException] -> + %{ + status: :error, + output: collect_output(output_pid), + returns: [], + error: e |> Exception.message() |> strip_ansi(), + duration_us: System.monotonic_time(:microsecond) - started, + bytecode: [] + } + + e -> + %{ + status: :error, + output: collect_output(output_pid), + returns: [], + error: e |> Exception.message() |> strip_ansi(), + duration_us: System.monotonic_time(:microsecond) - started, + bytecode: [] + } + end + end + + defp strip_ansi(s) when is_binary(s) do + String.replace(s, ~r/\e\[[0-9;]*[a-zA-Z]/, "") + end + + defp start_output_collector do + spawn_link(fn -> collect_loop([]) end) + end + + defp collect_loop(acc) do + receive do + {:line, line} -> + collect_loop([line | acc]) + + {:dump, from} -> + send(from, {:lines, Enum.reverse(acc)}) + end + end + + defp collect_output(pid) do + send(pid, {:dump, self()}) + + receive do + {:lines, lines} -> Enum.join(lines, "\n") + after + 50 -> "" + end + end + + defp to_lua_string(nil), do: "nil" + defp to_lua_string(true), do: "true" + defp to_lua_string(false), do: "false" + defp to_lua_string(s) when is_binary(s), do: s + defp to_lua_string(n) when is_integer(n), do: Integer.to_string(n) + + defp to_lua_string(n) when is_float(n) do + if n == trunc(n) and abs(n) < 1.0e15 do + "#{trunc(n)}.0" + else + Float.to_string(n) + end + end + + defp to_lua_string({:tref, id}), do: "table: 0x#{Integer.to_string(id, 16)}" + defp to_lua_string(other), do: inspect(other) + + defp inspect_value(v), do: inspect(v, pretty: true, limit: 50) + + # ---- Disassembly ---- + + @doc """ + Walks a `%Lua.Compiler.Prototype{}` (and its nested prototypes) and + returns a flat list of "proto blocks" suitable for rendering in a + compiler-explorer view. + + Each block looks like: + + %{ + index: 0, + name: "main chunk" | "function #1", + param_count: 0, + is_vararg: true, + max_registers: 4, + instructions: [ + %{pc: 0, line: nil, op: :load_env, args: [0], pretty: "load_env r0"}, + ... + ] + } + """ + def disassemble(%Prototype{} = proto) do + {blocks, _} = walk_proto(proto, "main chunk", 0, []) + Enum.reverse(blocks) + end + + defp walk_proto(%Prototype{} = proto, name, next_index, acc) do + {instrs, _last_line} = + Enum.map_reduce(Enum.with_index(proto.instructions), nil, fn {ins, pc}, line -> + case ins do + {:source_line, ln, _file} -> + {%{pc: pc, line: ln, op: :source_line, args: [ln], pretty: "; line #{ln}"}, ln} + + tuple when is_tuple(tuple) -> + [op | args] = Tuple.to_list(tuple) + {%{pc: pc, line: line, op: op, args: args, pretty: pretty_ins(op, args)}, line} + + atom when is_atom(atom) -> + {%{pc: pc, line: line, op: atom, args: [], pretty: Atom.to_string(atom)}, line} + end + end) + + block = %{ + index: next_index, + name: name, + param_count: proto.param_count, + is_vararg: proto.is_vararg, + max_registers: proto.max_registers, + upvalue_count: length(proto.upvalue_descriptors), + source: proto.source, + lines: proto.lines, + instructions: instrs + } + + acc = [block | acc] + next_index = next_index + 1 + + Enum.reduce(Enum.with_index(proto.prototypes), {acc, next_index}, fn {child, child_local_idx}, + {acc, next_idx} -> + name = "function ##{next_idx} (proto[#{child_local_idx}])" + walk_proto(child, name, next_idx, acc) + end) + end + + defp pretty_ins(op, args), do: "#{op} #{format_op_args(op, args)}" + + # All-register triadic arithmetic and comparison ops + defp format_op_args(op, [a, b, c]) + when op in [ + :add, + :subtract, + :multiply, + :divide, + :floor_divide, + :modulo, + :power, + :concatenate, + :bitwise_and, + :bitwise_or, + :bitwise_xor, + :shift_left, + :shift_right, + :equal, + :less_than, + :less_equal + ], + do: "r#{a}, r#{b}, r#{c}" + + defp format_op_args(op, [a, b]) + when op in [:negate, :not, :length, :bitwise_not, :move], + do: "r#{a}, r#{b}" + + defp format_op_args(:load_constant, [d, val]), do: "r#{d}, #{format_lit(val)}" + defp format_op_args(:load_nil, [d, count]), do: "r#{d}, #{count}" + defp format_op_args(:load_boolean, [d, v]), do: "r#{d}, #{v}" + defp format_op_args(:load_env, [d]), do: "r#{d}" + defp format_op_args(:get_upvalue, [d, idx]), do: "r#{d}, up[#{idx}]" + defp format_op_args(:set_upvalue, [idx, s]), do: "up[#{idx}], r#{s}" + defp format_op_args(:get_open_upvalue, [d, r]), do: "r#{d}, r#{r}" + defp format_op_args(:set_open_upvalue, [r, s]), do: "r#{r}, r#{s}" + defp format_op_args(:get_global, [d, name]), do: ~s|r#{d}, _G["#{name}"]| + defp format_op_args(:set_global, [name, s]), do: ~s|_G["#{name}"], r#{s}| + defp format_op_args(:new_table, [d, a, h]), do: "r#{d}, array=#{a}, hash=#{h}" + defp format_op_args(:get_table, [d, t, k | _]), do: "r#{d}, r#{t}[#{pretty_arg(k)}]" + defp format_op_args(:set_table, [t, k, v | _]), do: "r#{t}[#{pretty_arg(k)}], r#{v}" + defp format_op_args(:get_field, [d, t, name | _]), do: ~s|r#{d}, r#{t}.#{name}| + defp format_op_args(:set_field, [t, name, v | _]), do: ~s|r#{t}.#{name}, r#{v}| + defp format_op_args(:set_list, [t, s, c, o]), do: "r#{t}, start=#{s}, count=#{c}, off=#{o}" + + defp format_op_args(:call, [b, ac, rc | _]), + do: "r#{b}, args=#{count(ac)}, results=#{count(rc)}" + + defp format_op_args(:tail_call, [b, ac | _]), do: "r#{b}, args=#{count(ac)}" + defp format_op_args(:return, [b, c]), do: "r#{b}, count=#{count(c)}" + defp format_op_args(:return_vararg, _), do: "(varargs)" + defp format_op_args(:vararg, [b, c]), do: "r#{b}, count=#{count(c)}" + defp format_op_args(:self, [b, o, name | _]), do: "r#{b}, r#{o}, .#{name}" + defp format_op_args(:closure, [d, idx]), do: "r#{d}, proto[#{idx}]" + defp format_op_args(:test, [r | _]), do: "r#{r}" + defp format_op_args(:test_true, [r | _]), do: "r#{r}" + defp format_op_args(:test_and, [d, s | _]), do: "r#{d}, r#{s}" + defp format_op_args(:test_or, [d, s | _]), do: "r#{d}, r#{s}" + defp format_op_args(:numeric_for, [b | _]), do: "r#{b}" + defp format_op_args(:generic_for, [b, vc | _]), do: "r#{b}, vars=#{vc}" + defp format_op_args(:scope, [n | _]), do: "registers=#{n}" + defp format_op_args(:source_line, [ln]), do: "line #{ln}" + defp format_op_args(_op, args), do: args |> Enum.map(&pretty_arg/1) |> Enum.join(", ") + + defp pretty_arg({:constant, val}), do: format_lit(val) + defp pretty_arg({:global, name}), do: ~s|<#{name}>| + defp pretty_arg(atom) when is_atom(atom), do: inspect(atom) + defp pretty_arg(n) when is_integer(n), do: Integer.to_string(n) + defp pretty_arg(other), do: inspect(other, limit: 25) + + defp format_lit(val) when is_binary(val), do: inspect(val) + defp format_lit(val), do: inspect(val, limit: 20) + + defp count({:multi, n}), do: "multi(#{n})" + defp count(:varargs), do: "..." + defp count(n) when is_integer(n), do: Integer.to_string(n) + defp count(other), do: inspect(other) + + @doc """ + Returns a list of canonical example snippets for the playground/tour. + Each snippet has an id, title, blurb, and Lua source. + """ + def examples do + [ + %{ + id: "hello", + title: "Hello, Lua", + blurb: "Your first Lua program on the BEAM.", + source: ~s|print("Hello, Lua on the BEAM!")\nreturn 42\n| + }, + %{ + id: "fib", + title: "Recursive Fibonacci", + blurb: "Classic recursion. Watch the closure prototype and tail-calls in the bytecode.", + source: """ + local function fib(n) + if n < 2 then return n end + return fib(n - 1) + fib(n - 2) + end + + for i = 0, 10 do + print(i, fib(i)) + end + + return fib(15) + """ + }, + %{ + id: "tables", + title: "Tables & iteration", + blurb: "Lua's one true data structure. Mix array and hash parts freely.", + source: """ + local people = { + { name = "Joe Armstrong", role = "co-creator of Erlang" }, + { name = "Robert Virding", role = "co-creator of Erlang" }, + { name = "Mike Williams", role = "co-creator of Erlang" }, + { name = "Josรฉ Valim", role = "creator of Elixir" }, + { name = "Chris McCord", role = "creator of Phoenix" }, + } + + for i, p in ipairs(people) do + print(i, p.name, "->", p.role) + end + + return #people + """ + }, + %{ + id: "closures", + title: "Closures & upvalues", + blurb: "Counter factory โ€” see how upvalues are captured in the bytecode.", + source: """ + local function make_counter(start) + local n = start or 0 + return function() + n = n + 1 + return n + end + end + + local c = make_counter(10) + print(c(), c(), c()) + return c() + """ + }, + %{ + id: "patterns", + title: "String patterns", + blurb: "Lua's tiny but mighty pattern engine โ€” no regex needed.", + source: """ + local s = "the quick brown fox" + for word in string.gmatch(s, "%a+") do + print(word, #word) + end + + return (string.gsub(s, "(%a+)", function(w) + return w:upper() + end)) + """ + }, + %{ + id: "metatables", + title: "Metatables", + blurb: "Operator overloading via __add. Lua's secret weapon for DSLs.", + source: """ + local Vec = {} + Vec.__index = Vec + Vec.__add = function(a, b) + return setmetatable({ x = a.x + b.x, y = a.y + b.y }, Vec) + end + Vec.__tostring = function(v) + return string.format("(%g, %g)", v.x, v.y) + end + + local function vec(x, y) + return setmetatable({ x = x, y = y }, Vec) + end + + local a = vec(1, 2) + local b = vec(3, 4) + print(tostring(a + b)) + return (a + b).x, (a + b).y + """ + }, + %{ + id: "error", + title: "Compile error", + blurb: "See the friendly compiler error path.", + source: """ + local x = 10 + local y = 20 + return x + + """ + }, + %{ + id: "runtime-error", + title: "Runtime error", + blurb: "Watch the VM blame the offending local by name, with a real stack trace.", + source: """ + local function greet(person) + return "hi, " .. person.name + end + + local visitors = { + { name = "Ada" }, + { name = "Joe" }, + nil, -- oops! + } + + print(greet(visitors[1])) + print(greet(visitors[2])) + print(greet(visitors[3])) -- boom + """ + } + ] + end + + @doc """ + Returns the ordered list of tour lessons. Each lesson is a small + bite-sized snippet with prose and explanation. + """ + def tour_lessons do + [ + %{ + slug: "values", + title: "Values & types", + body: """ + Lua has just eight types: `nil`, `boolean`, `number`, `string`, + `function`, `userdata`, `thread`, and `table`. Numbers are 64-bit + integers *or* floats โ€” Lua picks whichever fits. Strings are + interned immutable byte sequences. + """, + source: """ + print(type(nil), type(true), type(1), type(1.5)) + print(type("hi"), type(print), type({})) + return 1 + 2, 1 / 2, 1 // 2 + """ + }, + %{ + slug: "control-flow", + title: "Control flow", + body: """ + `if`/`elseif`/`else`, `while`, `repeat..until`, and both numeric + and generic `for` loops. Falsy values are `nil` and `false` โ€” only. + `0`, `""`, and `{}` are all truthy. + """, + source: """ + local function sign(n) + if n > 0 then return 1 + elseif n < 0 then return -1 + else return 0 end + end + + for i = -2, 2 do print(i, sign(i)) end + return sign(42) + """ + }, + %{ + slug: "tables", + title: "Tables are everything", + body: """ + Tables are *the* data structure: arrays, hash maps, records, + objects, modules โ€” all tables. Indexed from `1` by convention, + with `#t` giving the length of the array part. + """, + source: """ + local t = { 10, 20, 30, name = "trio" } + print(t[1], t[2], t[3], t.name, #t) + + t[#t + 1] = 40 + for i, v in ipairs(t) do print(i, v) end + + return t.name, #t + """ + }, + %{ + slug: "functions", + title: "First-class functions", + body: """ + Functions are values. They can be passed around, returned, + and stored in tables. Multiple return values are first-class: + `return a, b, c`. + """, + source: """ + local function divmod(a, b) + return a // b, a % b + end + + local q, r = divmod(17, 5) + print(q, r) + return divmod(100, 7) + """ + }, + %{ + slug: "closures", + title: "Closures & upvalues", + body: """ + Inner functions capture outer locals by reference โ€” these + captured bindings are called *upvalues*. Run this snippet and + click "Show bytecode" to watch the upvalue descriptors appear + on the closure. + """, + source: """ + local function make_adder(n) + return function(x) return x + n end + end + + local add5 = make_adder(5) + print(add5(10), add5(100)) + return add5(0) + """ + }, + %{ + slug: "metatables", + title: "Metatables", + body: """ + Every table can have a *metatable* that customises operators, + indexing, and tostring. This is how Lua does inheritance, + operator overloading, and OO โ€” all from one mechanism. + """, + source: """ + local Stack = {}; Stack.__index = Stack + function Stack.new() return setmetatable({ n = 0 }, Stack) end + function Stack:push(v) self.n = self.n + 1; self[self.n] = v end + function Stack:pop() local v = self[self.n]; self[self.n] = nil; self.n = self.n - 1; return v end + + local s = Stack.new() + s:push(1); s:push(2); s:push(3) + print(s:pop(), s:pop(), s:pop()) + return s.n + """ + }, + %{ + slug: "strings", + title: "Pattern matching", + body: """ + Lua's pattern engine is smaller than regex but covers most + needs: `%a` letters, `%d` digits, `%s` spaces, `*` zero-or-more, + `+` one-or-more, captures with `()`. + """, + source: """ + local s = "2026-05-23 21:00:00" + local y, m, d = string.match(s, "(%d+)-(%d+)-(%d+)") + print(y, m, d) + return y .. "/" .. m .. "/" .. d + """ + }, + %{ + slug: "errors", + title: "Errors & pcall", + body: """ + Errors are raised with `error()` and caught with `pcall` (or + `xpcall` for a custom handler). No try/catch โ€” just protected + calls returning a status and value. + """, + source: """ + local ok, err = pcall(function() + error("boom!") + end) + print(ok, err) + + local ok2, val = pcall(function() return 42 end) + print(ok2, val) + return ok, ok2 + """ + } + ] + end + + # Quiet unused-warning on Instruction (kept for future opcode docs) + @doc false + def _instructions, do: Instruction +end diff --git a/website/lib/website/mailer.ex b/website/lib/website/mailer.ex new file mode 100644 index 0000000..8e1ec1d --- /dev/null +++ b/website/lib/website/mailer.ex @@ -0,0 +1,3 @@ +defmodule Demo.Mailer do + use Swoosh.Mailer, otp_app: :website +end diff --git a/website/lib/website_web.ex b/website/lib/website_web.ex new file mode 100644 index 0000000..1526230 --- /dev/null +++ b/website/lib/website_web.ex @@ -0,0 +1,114 @@ +defmodule DemoWeb do + @moduledoc """ + The entrypoint for defining your web interface, such + as controllers, components, channels, and so on. + + This can be used in your application as: + + use DemoWeb, :controller + use DemoWeb, :html + + The definitions below will be executed for every controller, + component, etc, so keep them short and clean, focused + on imports, uses and aliases. + + Do NOT define functions inside the quoted expressions + below. Instead, define additional modules and import + those modules here. + """ + + def static_paths, do: ~w(assets fonts images favicon.ico robots.txt) + + def router do + quote do + use Phoenix.Router, helpers: false + + # Import common connection and controller functions to use in pipelines + import Plug.Conn + import Phoenix.Controller + import Phoenix.LiveView.Router + end + end + + def channel do + quote do + use Phoenix.Channel + end + end + + def controller do + quote do + use Phoenix.Controller, formats: [:html, :json] + + use Gettext, backend: DemoWeb.Gettext + + import Plug.Conn + + unquote(verified_routes()) + end + end + + def live_view do + quote do + use Phoenix.LiveView + + unquote(html_helpers()) + end + end + + def live_component do + quote do + use Phoenix.LiveComponent + + unquote(html_helpers()) + end + end + + def html do + quote do + use Phoenix.Component + + # Import convenience functions from controllers + import Phoenix.Controller, + only: [get_csrf_token: 0, view_module: 1, view_template: 1] + + # Include general helpers for rendering HTML + unquote(html_helpers()) + end + end + + defp html_helpers do + quote do + # Translation + use Gettext, backend: DemoWeb.Gettext + + # HTML escaping functionality + import Phoenix.HTML + # Core UI components + import DemoWeb.CoreComponents + + # Common modules used in templates + alias Phoenix.LiveView.JS + alias DemoWeb.Layouts + + # Routes generation with the ~p sigil + unquote(verified_routes()) + end + end + + def verified_routes do + quote do + use Phoenix.VerifiedRoutes, + endpoint: DemoWeb.Endpoint, + router: DemoWeb.Router, + statics: DemoWeb.static_paths() + end + end + + @doc """ + When used, dispatch to the appropriate controller/live_view/etc. + """ + defmacro __using__(which) when is_atom(which) do + apply(__MODULE__, which, []) + end +end diff --git a/website/lib/website_web/components/core_components.ex b/website/lib/website_web/components/core_components.ex new file mode 100644 index 0000000..a7bb4aa --- /dev/null +++ b/website/lib/website_web/components/core_components.ex @@ -0,0 +1,505 @@ +defmodule DemoWeb.CoreComponents do + @moduledoc """ + Provides core UI components. + + At first glance, this module may seem daunting, but its goal is to provide + core building blocks for your application, such as tables, forms, and + inputs. The components consist mostly of markup and are well-documented + with doc strings and declarative assigns. You may customize and style + them in any way you want, based on your application growth and needs. + + The foundation for styling is Tailwind CSS, a utility-first CSS framework, + augmented with daisyUI, a Tailwind CSS plugin that provides UI components + and themes. Here are useful references: + + * [daisyUI](https://daisyui.com/docs/intro/) - a good place to get + started and see the available components. + + * [Tailwind CSS](https://tailwindcss.com) - the foundational framework + we build on. You will use it for layout, sizing, flexbox, grid, and + spacing. + + * [Heroicons](https://heroicons.com) - see `icon/1` for usage. + + * [Phoenix.Component](https://hexdocs.pm/phoenix_live_view/Phoenix.Component.html) - + the component system used by Phoenix. Some components, such as `<.link>` + and `<.form>`, are defined there. + + """ + use Phoenix.Component + use Gettext, backend: DemoWeb.Gettext + + alias Phoenix.LiveView.JS + + @doc """ + Renders flash notices. + + ## Examples + + <.flash kind={:info} flash={@flash} /> + <.flash + id="welcome-back" + kind={:info} + phx-mounted={show("#welcome-back") |> JS.remove_attribute("hidden")} + hidden + > + Welcome Back! + + """ + attr :id, :string, doc: "the optional id of flash container" + attr :flash, :map, default: %{}, doc: "the map of flash messages to display" + attr :title, :string, default: nil + attr :kind, :atom, values: [:info, :error], doc: "used for styling and flash lookup" + attr :rest, :global, doc: "the arbitrary HTML attributes to add to the flash container" + + slot :inner_block, doc: "the optional inner block that renders the flash message" + + def flash(assigns) do + assigns = assign_new(assigns, :id, fn -> "flash-#{assigns.kind}" end) + + ~H""" +
hide("##{@id}")} + role="alert" + class="toast toast-top toast-end z-50" + {@rest} + > +
+ <.icon :if={@kind == :info} name="hero-information-circle" class="size-5 shrink-0" /> + <.icon :if={@kind == :error} name="hero-exclamation-circle" class="size-5 shrink-0" /> +
+

{@title}

+

{msg}

+
+
+ +
+
+ """ + end + + @doc """ + Renders a button with navigation support. + + ## Examples + + <.button>Send! + <.button phx-click="go" variant="primary">Send! + <.button navigate={~p"/"}>Home + """ + attr :rest, :global, include: ~w(href navigate patch method download name value disabled) + attr :class, :any + attr :variant, :string, values: ~w(primary) + slot :inner_block, required: true + + def button(%{rest: rest} = assigns) do + variants = %{"primary" => "btn-primary", nil => "btn-primary btn-soft"} + + assigns = + assign_new(assigns, :class, fn -> + ["btn", Map.fetch!(variants, assigns[:variant])] + end) + + if rest[:href] || rest[:navigate] || rest[:patch] do + ~H""" + <.link class={@class} {@rest}> + {render_slot(@inner_block)} + + """ + else + ~H""" + + """ + end + end + + @doc """ + Renders an input with label and error messages. + + A `Phoenix.HTML.FormField` may be passed as argument, + which is used to retrieve the input name, id, and values. + Otherwise all attributes may be passed explicitly. + + ## Types + + This function accepts all HTML input types, considering that: + + * You may also set `type="select"` to render a ` + """ + end + + def input(%{type: "checkbox"} = assigns) do + assigns = + assign_new(assigns, :checked, fn -> + Phoenix.HTML.Form.normalize_value("checkbox", assigns[:value]) + end) + + ~H""" +
+ + <.error :for={msg <- @errors}>{msg} +
+ """ + end + + def input(%{type: "select"} = assigns) do + ~H""" +
+ + <.error :for={msg <- @errors}>{msg} +
+ """ + end + + def input(%{type: "textarea"} = assigns) do + ~H""" +
+ + <.error :for={msg <- @errors}>{msg} +
+ """ + end + + # All other inputs text, datetime-local, url, password, etc. are handled here... + def input(assigns) do + ~H""" +
+ + <.error :for={msg <- @errors}>{msg} +
+ """ + end + + # Helper used by inputs to generate form errors + defp error(assigns) do + ~H""" +

+ <.icon name="hero-exclamation-circle" class="size-5" /> + {render_slot(@inner_block)} +

+ """ + end + + @doc """ + Renders a header with title. + """ + slot :inner_block, required: true + slot :subtitle + slot :actions + + def header(assigns) do + ~H""" +
+
+

+ {render_slot(@inner_block)} +

+

+ {render_slot(@subtitle)} +

+
+
{render_slot(@actions)}
+
+ """ + end + + @doc """ + Renders a table with generic styling. + + ## Examples + + <.table id="users" rows={@users}> + <:col :let={user} label="id">{user.id} + <:col :let={user} label="username">{user.username} + + """ + attr :id, :string, required: true + attr :rows, :list, required: true + attr :row_id, :any, default: nil, doc: "the function for generating the row id" + attr :row_click, :any, default: nil, doc: "the function for handling phx-click on each row" + + attr :row_item, :any, + default: &Function.identity/1, + doc: "the function for mapping each row before calling the :col and :action slots" + + slot :col, required: true do + attr :label, :string + end + + slot :action, doc: "the slot for showing user actions in the last table column" + + def table(assigns) do + assigns = + with %{rows: %Phoenix.LiveView.LiveStream{}} <- assigns do + assign(assigns, row_id: assigns.row_id || fn {id, _item} -> id end) + end + + ~H""" + + + + + + + + + + + + + +
{col[:label]} + {gettext("Actions")} +
+ {render_slot(col, @row_item.(row))} + +
+ <%= for action <- @action do %> + {render_slot(action, @row_item.(row))} + <% end %> +
+
+ """ + end + + @doc """ + Renders a data list. + + ## Examples + + <.list> + <:item title="Title">{@post.title} + <:item title="Views">{@post.views} + + """ + slot :item, required: true do + attr :title, :string, required: true + end + + def list(assigns) do + ~H""" +
    +
  • +
    +
    {item.title}
    +
    {render_slot(item)}
    +
    +
  • +
+ """ + end + + @doc """ + Renders a [Heroicon](https://heroicons.com). + + Heroicons come in three styles โ€“ outline, solid, and mini. + By default, the outline style is used, but solid and mini may + be applied by using the `-solid` and `-mini` suffix. + + You can customize the size and colors of the icons by setting + width, height, and background color classes. + + Icons are extracted from the `deps/heroicons` directory and bundled within + your compiled app.css by the plugin in `assets/vendor/heroicons.js`. + + ## Examples + + <.icon name="hero-x-mark" /> + <.icon name="hero-arrow-path" class="ml-1 size-3 motion-safe:animate-spin" /> + """ + attr :name, :string, required: true + attr :class, :any, default: "size-4" + + def icon(%{name: "hero-" <> _} = assigns) do + ~H""" + + """ + end + + ## JS Commands + + def show(js \\ %JS{}, selector) do + JS.show(js, + to: selector, + time: 300, + transition: + {"transition-all ease-out duration-300", + "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95", + "opacity-100 translate-y-0 sm:scale-100"} + ) + end + + def hide(js \\ %JS{}, selector) do + JS.hide(js, + to: selector, + time: 200, + transition: + {"transition-all ease-in duration-200", "opacity-100 translate-y-0 sm:scale-100", + "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"} + ) + end + + @doc """ + Translates an error message using gettext. + """ + def translate_error({msg, opts}) do + # When using gettext, we typically pass the strings we want + # to translate as a static argument: + # + # # Translate the number of files with plural rules + # dngettext("errors", "1 file", "%{count} files", count) + # + # However the error messages in our forms and APIs are generated + # dynamically, so we need to translate them by calling Gettext + # with our gettext backend as first argument. Translations are + # available in the errors.po file (as we use the "errors" domain). + if count = opts[:count] do + Gettext.dngettext(DemoWeb.Gettext, "errors", msg, msg, count, opts) + else + Gettext.dgettext(DemoWeb.Gettext, "errors", msg, opts) + end + end + + @doc """ + Translates the errors for a field from a keyword list of errors. + """ + def translate_errors(errors, field) when is_list(errors) do + for {^field, {msg, opts}} <- errors, do: translate_error({msg, opts}) + end +end diff --git a/website/lib/website_web/components/layouts.ex b/website/lib/website_web/components/layouts.ex new file mode 100644 index 0000000..6943da9 --- /dev/null +++ b/website/lib/website_web/components/layouts.ex @@ -0,0 +1,249 @@ +defmodule DemoWeb.Layouts do + @moduledoc """ + This module holds layouts and related functionality + used by your application. + """ + use DemoWeb, :html + + # Embed all files in layouts/* within this module. + # The default root.html.heex file contains the HTML + # skeleton of your application, namely HTML headers + # and other static content. + embed_templates "layouts/*" + + @doc """ + Renders your app layout. + + This function is typically invoked from every template, + and it often contains your application menu, sidebar, + or similar. + + ## Examples + + +

Content

+
+ + """ + attr :flash, :map, required: true, doc: "the map of flash messages" + + attr :current_scope, :map, + default: nil, + doc: "the current [scope](https://hexdocs.pm/phoenix/scopes.html)" + + slot :inner_block, required: true + + attr :active, :atom, default: nil + + def app(assigns) do + ~H""" + <.site_nav active={@active} /> +
+ {render_slot(@inner_block)} +
+ <.site_footer /> + <.flash_group flash={@flash} /> + """ + end + + attr :active, :atom, default: nil + + def site_nav(assigns) do + ~H""" +
+
+ + <.lua_mark class="h-8 w-8 transition-transform group-hover:rotate-12" /> + + Lua.ex + + + + + + + +
+ """ + end + + attr :href, :string, required: true + attr :active, :boolean, default: false + slot :inner_block, required: true + + def nav_link(assigns) do + ~H""" + <.link + navigate={@href} + class={[ + "btn btn-ghost btn-sm font-medium", + @active && "text-primary bg-primary/10" + ]} + > + {render_slot(@inner_block)} + + """ + end + + def site_footer(assigns) do + ~H""" +
+
+
+ <.lua_mark class="h-5 w-5 opacity-70" /> + + Lua on the BEAM + · an Elixir-native Lua 5.3 VM + +
+ +
+
+ """ + end + + attr :class, :string, default: "" + + def lua_mark(assigns) do + ~H""" + + """ + end + + @doc """ + Shows the flash group with standard titles and content. + + ## Examples + + <.flash_group flash={@flash} /> + """ + attr :flash, :map, required: true, doc: "the map of flash messages" + attr :id, :string, default: "flash-group", doc: "the optional id of flash container" + + def flash_group(assigns) do + ~H""" +
+ <.flash kind={:info} flash={@flash} /> + <.flash kind={:error} flash={@flash} /> + + <.flash + id="client-error" + kind={:error} + title={gettext("We can't find the internet")} + phx-disconnected={show(".phx-client-error #client-error") |> JS.remove_attribute("hidden")} + phx-connected={hide("#client-error") |> JS.set_attribute({"hidden", ""})} + hidden + > + {gettext("Attempting to reconnect")} + <.icon name="hero-arrow-path" class="ml-1 size-3 motion-safe:animate-spin" /> + + + <.flash + id="server-error" + kind={:error} + title={gettext("Something went wrong!")} + phx-disconnected={show(".phx-server-error #server-error") |> JS.remove_attribute("hidden")} + phx-connected={hide("#server-error") |> JS.set_attribute({"hidden", ""})} + hidden + > + {gettext("Attempting to reconnect")} + <.icon name="hero-arrow-path" class="ml-1 size-3 motion-safe:animate-spin" /> + +
+ """ + end + + @doc """ + Provides dark vs light theme toggle based on themes defined in app.css. + + See in root.html.heex which applies the theme before page load. + """ + def theme_toggle(assigns) do + ~H""" +
+
+ + + + + + +
+ """ + end +end diff --git a/website/lib/website_web/components/layouts/root.html.heex b/website/lib/website_web/components/layouts/root.html.heex new file mode 100644 index 0000000..6ac3f21 --- /dev/null +++ b/website/lib/website_web/components/layouts/root.html.heex @@ -0,0 +1,34 @@ + + + + + + + <.live_title default="Lua on the BEAM" suffix=" ยท Lua.ex" phx-no-format>{assigns[:page_title]} + + + + + + {@inner_content} + + diff --git a/website/lib/website_web/controllers/error_html.ex b/website/lib/website_web/controllers/error_html.ex new file mode 100644 index 0000000..2d3df6a --- /dev/null +++ b/website/lib/website_web/controllers/error_html.ex @@ -0,0 +1,24 @@ +defmodule DemoWeb.ErrorHTML do + @moduledoc """ + This module is invoked by your endpoint in case of errors on HTML requests. + + See config/config.exs. + """ + use DemoWeb, :html + + # If you want to customize your error pages, + # uncomment the embed_templates/1 call below + # and add pages to the error directory: + # + # * lib/website_web/controllers/error_html/404.html.heex + # * lib/website_web/controllers/error_html/500.html.heex + # + # embed_templates "error_html/*" + + # The default is to render a plain text page based on + # the template name. For example, "404.html" becomes + # "Not Found". + def render(template, _assigns) do + Phoenix.Controller.status_message_from_template(template) + end +end diff --git a/website/lib/website_web/controllers/error_json.ex b/website/lib/website_web/controllers/error_json.ex new file mode 100644 index 0000000..91b0710 --- /dev/null +++ b/website/lib/website_web/controllers/error_json.ex @@ -0,0 +1,21 @@ +defmodule DemoWeb.ErrorJSON do + @moduledoc """ + This module is invoked by your endpoint in case of errors on JSON requests. + + See config/config.exs. + """ + + # If you want to customize a particular status code, + # you may add your own clauses, such as: + # + # def render("500.json", _assigns) do + # %{errors: %{detail: "Internal Server Error"}} + # end + + # By default, Phoenix returns the status message from + # the template name. For example, "404.json" becomes + # "Not Found". + def render(template, _assigns) do + %{errors: %{detail: Phoenix.Controller.status_message_from_template(template)}} + end +end diff --git a/website/lib/website_web/controllers/page_controller.ex b/website/lib/website_web/controllers/page_controller.ex new file mode 100644 index 0000000..3464c0c --- /dev/null +++ b/website/lib/website_web/controllers/page_controller.ex @@ -0,0 +1,7 @@ +defmodule DemoWeb.PageController do + use DemoWeb, :controller + + def home(conn, _params) do + render(conn, :home) + end +end diff --git a/website/lib/website_web/controllers/page_html.ex b/website/lib/website_web/controllers/page_html.ex new file mode 100644 index 0000000..0d04475 --- /dev/null +++ b/website/lib/website_web/controllers/page_html.ex @@ -0,0 +1,50 @@ +defmodule DemoWeb.PageHTML do + @moduledoc """ + This module contains pages rendered by PageController. + + See the `page_html` directory for all templates available. + """ + use DemoWeb, :html + + embed_templates "page_html/*" + + attr :icon, :string, required: true + attr :title, :string, required: true + attr :accent, :string, default: "primary" + slot :inner_block, required: true + + def feature(assigns) do + ~H""" +
+
+ <.icon name={@icon} class={["size-5", accent_text(@accent)]} /> +
+

{@title}

+
+ {render_slot(@inner_block)} +
+
+ """ + end + + defp accent_bg("primary"), do: "bg-primary/15" + defp accent_bg("secondary"), do: "bg-secondary/15" + defp accent_bg("accent"), do: "bg-accent/15" + defp accent_bg("success"), do: "bg-success/15" + defp accent_bg("info"), do: "bg-info/15" + defp accent_bg("warning"), do: "bg-warning/15" + defp accent_bg("error"), do: "bg-error/15" + defp accent_bg(_), do: "bg-primary/15" + + defp accent_text("primary"), do: "text-primary" + defp accent_text("secondary"), do: "text-secondary" + defp accent_text("accent"), do: "text-accent" + defp accent_text("success"), do: "text-success" + defp accent_text("info"), do: "text-info" + defp accent_text("warning"), do: "text-warning" + defp accent_text("error"), do: "text-error" + defp accent_text(_), do: "text-primary" +end diff --git a/website/lib/website_web/controllers/page_html/home.html.heex b/website/lib/website_web/controllers/page_html/home.html.heex new file mode 100644 index 0000000..2cb4095 --- /dev/null +++ b/website/lib/website_web/controllers/page_html/home.html.heex @@ -0,0 +1,341 @@ + + <%!-- ============== HERO ============== --%> +
+ + + +
+
+
+
+ + Pure Elixir · Lua 5.3 · runs on the BEAM +
+

+ Lua, on the + + BEAM. + +
Scriptable, sandboxed, stupid fast. +

+

+ An Elixir-native Lua 5.3 virtual machine. Embed user-supplied scripting in + your Phoenix app with zero NIFs, zero shelling out, and a beautiful + Elixir API. Watch every opcode the VM actually executes. +

+ +
+ <.link navigate={~p"/playground"} class="btn btn-primary btn-lg shadow-lg"> + <.icon name="hero-play-micro" class="size-5" /> Open the Playground + + <.link navigate={~p"/tour"} class="btn btn-ghost btn-lg border border-base-300"> + Take the Tour <.icon name="hero-arrow-right-micro" class="size-4" /> + +
+ +
+
+ <.icon name="hero-shield-check-micro" class="size-4 text-success" /> + Sandboxed by default +
+
+ <.icon name="hero-bolt-micro" class="size-4 text-warning" /> + Register-based VM +
+
+ <.icon name="hero-cube-micro" class="size-4 text-info" /> + Zero NIFs, zero C +
+
+
+ +
+ +
+
+
+ + + +
+
script.exs
+
โ–ถ 4 ยตs
+
+
## Embed Lua in your Elixir app
+## with a single function call.
+
+defmodule MyApp.Rules do
+  use Lua.API, scope: "rules"
+
+  deflua double(n), do: n * 2
+end
+
+## Now your Elixir function is
+## callable from any Lua script:
+
+lua = Lua.new() |> Lua.load_api(MyApp.Rules)
+
+{[10], _lua} = Lua.eval!(lua, """
+  return rules.double(5)
+""")
+
+
+ + <%!-- floating chip --%> + +
+
+
+
+ + <%!-- ============== FEATURE GRID ============== --%> +
+
+
+ Why this exists +
+

+ Everything you'd want in a scripting layer +

+

+ Built to let your users write code inside your product, without ever + leaving the safety of the BEAM. +

+
+ +
+ <.feature + icon="hero-cpu-chip-micro" + title="Pure Elixir VM" + accent="primary" + > + Lexer, parser, register-based VM, and stdlib โ€” all written in idiomatic + Elixir. Drops into any Phoenix or OTP release. + + + <.feature + icon="hero-lock-closed-micro" + title="Sandboxed by default" + accent="success" + > + io, os, require, and friends are + disabled. Expose exactly the surface area you want โ€” nothing more. + + + <.feature + icon="hero-puzzle-piece-micro" + title="Elixir โ†” Lua interop" + accent="info" + > + Use deflua to expose any Elixir function. Call Lua back + from Elixir with Lua.call_function!/3. + + + <.feature + icon="hero-sparkles-micro" + title="Compile-time sigil" + accent="accent" + > + ~LUA validates syntax at compile time. + Add the c modifier and ship a pre-compiled chunk in your release. + + + <.feature + icon="hero-document-magnifying-glass-micro" + title="See the bytecode" + accent="warning" + > + Every Lua chunk compiles to a register-based opcode stream. + Inspect every instruction in the playground. + + + <.feature + icon="hero-academic-cap-micro" + title="Beautiful errors" + accent="error" + > + Real stack traces, real source lines, useful messages. Errors blame the + callee by name โ€” none of that "attempt to call a nil value" nonsense. + +
+
+ + <%!-- ============== COMPILER EXPLORER PROMO ============== --%> +
+
+
+
+
+ <.icon name="hero-magnifying-glass-circle-micro" class="size-4" /> Compiler Explorer +
+

+ See your Lua, as the VM sees it. +

+

+ Like Godbolt, but for Lua bytecode. Type a snippet on the left, watch + the opcodes appear on the right โ€” instruction by instruction, + register by register. Toggle prototypes for nested closures and follow + every closure, call, + and return. +

+
+ <.link navigate={~p"/playground/fib"} class="btn btn-primary"> + Explore fib(15) + bytecode <.icon name="hero-arrow-right-micro" class="size-4" /> + +
+
+ +
+
+
+
-- main.lua
+
local function fib(n)
+  if n < 2 then return n end
+  return fib(n - 1)
+       + fib(n - 2)
+end
+
+return fib(15)
+
+
+
; bytecode
+
+
closure r2, p0
+
move r1, r2
+
get_field r3, r0, "fib"
+
load_constant r4, 15
+
call r3, 1, 2
+
return r3, 1
+
; proto[0] (fib)
+
load_constant r2, 2
+
less_than r3, r1, r2
+
test r3, โ€ฆ
+
return r1, 1
+
โ€ฆ
+
+
+
+
+
+
+
+ + <%!-- ============== EMBED EXAMPLE ============== --%> +
+
+
+
+ For your app +
+

+ Drop in. Wire up. Ship. +

+

+ Define an API module with use Lua.API. Annotate functions + with deflua. Load it into a Lua VM. That's it โ€” your + users can now write Lua scripts that call back into your Elixir code, + safely. +

+
    +
  • + <.icon name="hero-check-circle-micro" class="size-5 text-success shrink-0 mt-0.5" /> + Reactive workflows, rules engines, plug-in systems +
  • +
  • + <.icon name="hero-check-circle-micro" class="size-5 text-success shrink-0 mt-0.5" /> + User-supplied formulas inside SaaS dashboards +
  • +
  • + <.icon name="hero-check-circle-micro" class="size-5 text-success shrink-0 mt-0.5" /> + Game logic, automation, embedded DSLs +
  • +
+
+ +
+
+ + + + queue.exs +
+
defmodule Queue do
+  use Lua.API, scope: "q"
+
+  deflua push(v), state do
+    queue = Lua.get!(state, [:my_queue])
+    {[], state} = Lua.call_function!(
+      state, [:table, :insert], [queue, v]
+    )
+    {[], state}
+  end
+end
+
+lua =
+  Lua.new()
+  |> Lua.load_api(Queue)
+  |> Lua.set!([:my_queue], [])
+
+Lua.eval!(lua, """
+  q.push("hello")
+  q.push("world")
+""")
+
+
+
+ + <%!-- ============== CTA ============== --%> +
+
+

+ Go play. Then read the docs. +

+

+ The fastest way to understand this VM is to write Lua and watch the + opcodes flow. +

+
+ <.link navigate={~p"/playground"} class="btn btn-primary btn-lg shadow-lg"> + Open the Playground <.icon name="hero-arrow-right-micro" class="size-4" /> + + + <.icon name="hero-book-open-micro" class="size-4" /> Read the docs + +
+
+ + {"{:lua, \"~> 1.0.0-rc.1\"}"} + +
+
+
+
diff --git a/website/lib/website_web/endpoint.ex b/website/lib/website_web/endpoint.ex new file mode 100644 index 0000000..93251d8 --- /dev/null +++ b/website/lib/website_web/endpoint.ex @@ -0,0 +1,58 @@ +defmodule DemoWeb.Endpoint do + use Phoenix.Endpoint, otp_app: :website + + # The session will be stored in the cookie and signed, + # this means its contents can be read but not tampered with. + # Set :encryption_salt if you would also like to encrypt it. + @session_options [ + store: :cookie, + key: "_website_key", + signing_salt: "GltKFM/w", + same_site: "Lax" + ] + + socket "/live", Phoenix.LiveView.Socket, + websocket: [connect_info: [session: @session_options]], + longpoll: [connect_info: [session: @session_options]] + + # Serve at "/" the static files from "priv/static" directory. + # + # When code reloading is disabled (e.g., in production), + # the `gzip` option is enabled to serve compressed + # static files generated by running `phx.digest`. + plug Plug.Static, + at: "/", + from: :website, + gzip: not code_reloading?, + only: DemoWeb.static_paths(), + raise_on_missing_only: code_reloading? + + if Mix.env() == :dev do + plug Tidewave + end + + # Code reloading can be explicitly enabled under the + # :code_reloader configuration of your endpoint. + if code_reloading? do + socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket + plug Phoenix.LiveReloader + plug Phoenix.CodeReloader + end + + plug Phoenix.LiveDashboard.RequestLogger, + param_key: "request_logger", + cookie_key: "request_logger" + + plug Plug.RequestId + plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint] + + plug Plug.Parsers, + parsers: [:urlencoded, :multipart, :json], + pass: ["*/*"], + json_decoder: Phoenix.json_library() + + plug Plug.MethodOverride + plug Plug.Head + plug Plug.Session, @session_options + plug DemoWeb.Router +end diff --git a/website/lib/website_web/gettext.ex b/website/lib/website_web/gettext.ex new file mode 100644 index 0000000..fc63960 --- /dev/null +++ b/website/lib/website_web/gettext.ex @@ -0,0 +1,25 @@ +defmodule DemoWeb.Gettext do + @moduledoc """ + A module providing Internationalization with a gettext-based API. + + By using [Gettext](https://hexdocs.pm/gettext), your module compiles translations + that you can use in your application. To use this Gettext backend module, + call `use Gettext` and pass it as an option: + + use Gettext, backend: DemoWeb.Gettext + + # Simple translation + gettext("Here is the string to translate") + + # Plural translation + ngettext("Here is the string to translate", + "Here are the strings to translate", + 3) + + # Domain-based translation + dgettext("errors", "Here is the error message to translate") + + See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage. + """ + use Gettext.Backend, otp_app: :website +end diff --git a/website/lib/website_web/live/playground_live.ex b/website/lib/website_web/live/playground_live.ex new file mode 100644 index 0000000..e8b2174 --- /dev/null +++ b/website/lib/website_web/live/playground_live.ex @@ -0,0 +1,597 @@ +defmodule DemoWeb.PlaygroundLive do + use DemoWeb, :live_view + + alias Website.LuaSandbox + + @impl true + def mount(_params, _session, socket) do + socket = + socket + |> assign(:page_title, "Playground") + |> assign(:examples, LuaSandbox.examples()) + |> assign(:active_example, "hello") + |> assign(:source, default_source("hello")) + |> assign(:result, nil) + |> assign(:running, false) + |> assign(:show_bytecode, true) + |> assign(:selected_block, 0) + |> assign(:hover_line, nil) + + {:ok, socket} + end + + @impl true + def handle_params(params, _url, socket) do + case params do + %{"example" => id} -> + if Enum.any?(LuaSandbox.examples(), &(&1.id == id)) do + {:noreply, + socket + |> assign(:active_example, id) + |> assign(:source, default_source(id)) + |> assign(:result, nil) + |> assign(:selected_block, 0)} + else + {:noreply, socket} + end + + _ -> + {:noreply, socket} + end + end + + @impl true + def handle_event("source-changed", %{"source" => source}, socket) do + {:noreply, assign(socket, :source, source)} + end + + def handle_event("load-example", %{"id" => id}, socket) do + {:noreply, + socket + |> assign(:active_example, id) + |> assign(:source, default_source(id)) + |> assign(:result, nil) + |> assign(:selected_block, 0) + |> push_patch(to: ~p"/playground/#{id}")} + end + + def handle_event("run", %{"source" => source}, socket) do + socket = assign(socket, source: source, running: true) + send(self(), {:run, source}) + {:noreply, socket} + end + + def handle_event("toggle-bytecode", _, socket) do + {:noreply, update(socket, :show_bytecode, &(!&1))} + end + + def handle_event("select-block", %{"index" => idx}, socket) do + {:noreply, assign(socket, :selected_block, String.to_integer(idx))} + end + + def handle_event("hover-line", %{"line" => line}, socket) do + parsed = + case line do + nil -> nil + "" -> nil + s -> String.to_integer(s) + end + + {:noreply, assign(socket, :hover_line, parsed)} + end + + def handle_event("clear", _params, socket) do + {:noreply, + socket + |> assign(:source, "") + |> assign(:result, nil) + |> assign(:selected_block, 0)} + end + + @impl true + def handle_info({:run, source}, socket) do + result = LuaSandbox.run(source, timeout_ms: 1500) + + {:noreply, + socket + |> assign(:running, false) + |> assign(:result, result) + |> assign(:selected_block, 0)} + end + + defp default_source(id) do + case Enum.find(LuaSandbox.examples(), &(&1.id == id)) do + nil -> hd(LuaSandbox.examples()).source + ex -> ex.source + end + end + + @impl true + def render(assigns) do + ~H""" + +
+
+
+

+ Lua Playground +

+

+ Write Lua, run it on the BEAM, and watch the + register-based bytecode + this VM actually executes. No JavaScript Lua โ€” every byte is Elixir. +

+
+
+ + +
+
+ +
+ <%= for ex <- @examples do %> + + <% end %> +
+ +
+
+ <.editor_panel source={@source} running={@running} /> + <.output_panel result={@result} running={@running} /> +
+ + <%= if @show_bytecode do %> + <.bytecode_panel + result={@result} + source={@source} + selected={@selected_block} + hover_line={@hover_line} + /> + <% end %> +
+ +
+ <.kbd_card> + <:label>Run + โŒ˜ + โ†ต + + <.kbd_card> + <:label>Indent + Tab / Shift + + Tab + + <.kbd_card> + <:label>Heads-up + + Snippets run in a sandboxed VM with a 1.5s timeout. + + +
+
+
+ """ + end + + slot :label, required: true + slot :inner_block, required: true + + defp kbd_card(assigns) do + ~H""" +
+ + {render_slot(@label)} + + + {render_slot(@inner_block)} + +
+ """ + end + + attr :source, :string, required: true + attr :running, :boolean, required: true + + defp editor_panel(assigns) do + ~H""" +
+
+
+ + + + main.lua +
+ +
+
+ +
+
+ """ + end + + attr :result, :map, default: nil + attr :running, :boolean, required: true + + defp output_panel(assigns) do + ~H""" +
+
+
Output
+
+ <%= cond do %> + <% @running -> %> + executingโ€ฆ + <% match?(%{status: :ok}, @result) -> %> + + ok · {format_us(@result.duration_us)} + + <% match?(%{status: :timeout}, @result) -> %> + timeout + <% match?(%{status: :error}, @result) -> %> + error + <% true -> %> + idle + <% end %> +
+
+
+ <%= cond do %> + <% @running -> %> +
Running on the BEAMโ€ฆ
+ <% match?(%{status: :error}, @result) -> %> +
<%= @result.error %>
+ <%= if @result.output != "" do %> +
+
+ Output before error +
+
<%= @result.output %>
+
+ <% end %> + <% match?(%{status: :timeout}, @result) -> %> +
{@result.error}
+ <% match?(%{status: :ok}, @result) -> %> + <%= if @result.output != "" do %> +
<%= @result.output %>
+ <% end %> + <%= if @result.returns != [] do %> +
+
+ <.icon name="hero-arrow-uturn-left-micro" class="size-3" /> returned +
+
<%= Enum.join(@result.returns, ", ") %>
+
+ <% end %> + <%= if @result.output == "" and @result.returns == [] do %> +
+ (no output, no return values) +
+ <% end %> + <% true -> %> +
+ Hit Run + or press โŒ˜ โ†ต + to execute. +
+ <% end %> +
+
+ """ + end + + attr :result, :map, default: nil + attr :source, :string, required: true + attr :selected, :integer, required: true + attr :hover_line, :integer, default: nil + + defp bytecode_panel(assigns) do + bytecode = + cond do + match?(%{bytecode: [_ | _]}, assigns.result) -> + assigns.result.bytecode + + true -> + case LuaSandbox.compile(assigns.source) do + {:ok, _chunk, blocks} -> blocks + {:error, _} -> [] + end + end + + assigns = assign(assigns, :bytecode, bytecode) + + ~H""" +
+
+
+ Bytecode · Lua.Compiler.Prototype +
+
+ <%= if @bytecode != [] do %> + {length(@bytecode)} proto{if length(@bytecode) != 1, do: "s"} + <% else %> + โ€” + <% end %> +
+
+ + <%= if @bytecode == [] do %> +
+ Bytecode appears here after a successful parse. +
+ <% else %> + <%= if length(@bytecode) > 1 do %> +
+ <%= for block <- @bytecode do %> + + <% end %> +
+ <% end %> + + <%= for block <- @bytecode, block.index == @selected do %> +
+ <.meta_pill label="params" value={block.param_count} /> + <.meta_pill label="vararg" value={if block.is_vararg, do: "yes", else: "no"} /> + <.meta_pill label="registers" value={block.max_registers} /> + <.meta_pill label="upvalues" value={block.upvalue_count} /> +
+ +
+ + + <%= for ins <- block.instructions do %> + + + + + + <% end %> + +
+ {pad_pc(ins.pc)} + + <%= if ins.line do %> + L{ins.line} + <% end %> + + {ins.op} + {" "} + {format_args(ins.op, ins.args)} +
+
+ <% end %> + <% end %> +
+ """ + end + + attr :label, :string, required: true + attr :value, :any, required: true + + defp meta_pill(assigns) do + ~H""" +
+
+ {@label} +
+
{@value}
+
+ """ + end + + defp pad_pc(n), do: n |> Integer.to_string() |> String.pad_leading(3, "0") + + # Per-opcode rendering โ€” argument positions vary by opcode, so we tag the + # ones that are register indices with `r` and leave counts/values bare. + defp format_args(op, args), do: do_format(op, args) + + # All-register triadic arithmetic and comparison ops + defp do_format(op, [a, b, c]) + when op in [ + :add, + :subtract, + :multiply, + :divide, + :floor_divide, + :modulo, + :power, + :concatenate, + :bitwise_and, + :bitwise_or, + :bitwise_xor, + :shift_left, + :shift_right, + :equal, + :less_than, + :less_equal + ], + do: "r#{a}, r#{b}, r#{c}" + + # Unary register ops + defp do_format(op, [a, b]) + when op in [:negate, :not, :length, :bitwise_not, :move], + do: "r#{a}, r#{b}" + + defp do_format(:load_constant, [dest, val]), do: "r#{dest}, #{format_lit(val)}" + defp do_format(:load_nil, [dest, count]), do: "r#{dest}, #{count}" + defp do_format(:load_boolean, [dest, val]), do: "r#{dest}, #{val}" + defp do_format(:load_env, [dest]), do: "r#{dest}" + + defp do_format(:get_upvalue, [dest, idx]), do: "r#{dest}, up[#{idx}]" + defp do_format(:set_upvalue, [idx, src]), do: "up[#{idx}], r#{src}" + defp do_format(:get_open_upvalue, [dest, reg]), do: "r#{dest}, r#{reg}" + defp do_format(:set_open_upvalue, [reg, src]), do: "r#{reg}, r#{src}" + defp do_format(:get_global, [dest, name]), do: ~s|r#{dest}, _G["#{name}"]| + defp do_format(:set_global, [name, src]), do: ~s|_G["#{name}"], r#{src}| + + defp do_format(:new_table, [dest, a, h]), do: "r#{dest}, array=#{a}, hash=#{h}" + + defp do_format(:get_table, [d, t, k | _]), + do: "r#{d}, r#{t}[#{format_arg(k)}]" + + defp do_format(:set_table, [t, k, v | _]), + do: "r#{t}[#{format_arg(k)}], r#{v}" + + defp do_format(:get_field, [d, t, name | _]), do: ~s|r#{d}, r#{t}.#{name}| + defp do_format(:set_field, [t, name, v | _]), do: ~s|r#{t}.#{name}, r#{v}| + + defp do_format(:set_list, [t, start, count, offset]), + do: "r#{t}, start=#{start}, count=#{count}, off=#{offset}" + + defp do_format(:call, [base, argc, resc | _]), + do: "r#{base}, args=#{count_fmt(argc)}, results=#{count_fmt(resc)}" + + defp do_format(:tail_call, [base, argc | _]), + do: "r#{base}, args=#{count_fmt(argc)}" + + defp do_format(:return, [base, count]), do: "r#{base}, count=#{count_fmt(count)}" + defp do_format(:return_vararg, _), do: "(varargs)" + defp do_format(:vararg, [base, count]), do: "r#{base}, count=#{count_fmt(count)}" + defp do_format(:self, [base, obj, name | _]), do: "r#{base}, r#{obj}, .#{name}" + defp do_format(:closure, [dest, proto_idx]), do: "r#{dest}, proto[#{proto_idx}]" + + defp do_format(:test, [reg | _]), do: "r#{reg}" + defp do_format(:test_true, [reg | _]), do: "r#{reg}" + defp do_format(:test_and, [dest, src | _]), do: "r#{dest}, r#{src}" + defp do_format(:test_or, [dest, src | _]), do: "r#{dest}, r#{src}" + defp do_format(:numeric_for, [base | _]), do: "r#{base}" + + defp do_format(:generic_for, [base, var_count | _]), + do: "r#{base}, vars=#{var_count}" + + defp do_format(:scope, [n | _]), do: "registers=#{n}" + defp do_format(:source_line, [ln]), do: "line #{ln}" + defp do_format(_, args), do: args |> Enum.map(&format_arg/1) |> Enum.join(", ") + + defp format_arg({:constant, val}), do: format_lit(val) + defp format_arg({:global, name}), do: ~s|<#{name}>| + defp format_arg(atom) when is_atom(atom), do: inspect(atom) + defp format_arg(n) when is_integer(n), do: Integer.to_string(n) + defp format_arg(other), do: inspect(other, limit: 20) + + defp format_lit(val) when is_binary(val), do: inspect(val) + defp format_lit(val), do: inspect(val, limit: 20) + + defp count_fmt({:multi, n}), do: "multi(#{n})" + defp count_fmt(:varargs), do: "..." + defp count_fmt(n) when is_integer(n), do: Integer.to_string(n) + defp count_fmt(other), do: inspect(other) + + defp op_class(:source_line), do: "text-base-content/40" + + defp op_class(op) when op in [:return, :return_vararg, :tail_call], + do: "text-accent font-semibold" + + defp op_class(op) + when op in [:call, :closure, :self, :vararg], + do: "text-primary font-semibold" + + defp op_class(op) + when op in [ + :test, + :test_true, + :test_and, + :test_or, + :while_loop, + :repeat_loop, + :numeric_for, + :generic_for, + :break, + :scope + ], + do: "text-warning font-semibold" + + defp op_class(op) + when op in [ + :add, + :subtract, + :multiply, + :divide, + :floor_divide, + :modulo, + :power, + :concatenate, + :negate, + :equal, + :less_than, + :less_equal, + :length, + :not, + :bitwise_and, + :bitwise_or, + :bitwise_xor, + :shift_left, + :shift_right, + :bitwise_not + ], + do: "text-secondary font-semibold" + + defp op_class(op) + when op in [:new_table, :set_list, :get_table, :set_table, :get_field, :set_field], + do: "text-info font-semibold" + + defp op_class(_), do: "text-success font-semibold" + + defp format_us(us) when us < 1_000, do: "#{us} ยตs" + defp format_us(us) when us < 1_000_000, do: "#{Float.round(us / 1_000, 2)} ms" + defp format_us(us), do: "#{Float.round(us / 1_000_000, 3)} s" +end diff --git a/website/lib/website_web/live/tour_live.ex b/website/lib/website_web/live/tour_live.ex new file mode 100644 index 0000000..5aca9cb --- /dev/null +++ b/website/lib/website_web/live/tour_live.ex @@ -0,0 +1,331 @@ +defmodule DemoWeb.TourLive do + use DemoWeb, :live_view + + alias Website.LuaSandbox + + @impl true + def mount(_params, _session, socket) do + lessons = LuaSandbox.tour_lessons() + + socket = + socket + |> assign(:page_title, "Tour of Lua") + |> assign(:lessons, lessons) + |> assign(:lesson, hd(lessons)) + |> assign(:source, hd(lessons).source) + |> assign(:result, nil) + |> assign(:running, false) + |> assign(:show_bytecode, false) + + {:ok, socket} + end + + @impl true + def handle_params(params, _url, socket) do + case params do + %{"slug" => slug} -> + case Enum.find(socket.assigns.lessons, &(&1.slug == slug)) do + nil -> + {:noreply, push_patch(socket, to: ~p"/tour")} + + lesson -> + {:noreply, + socket + |> assign(:lesson, lesson) + |> assign(:source, lesson.source) + |> assign(:result, nil)} + end + + _ -> + {:noreply, socket} + end + end + + @impl true + def handle_event("source-changed", %{"source" => source}, socket) do + {:noreply, assign(socket, :source, source)} + end + + def handle_event("run", %{"source" => source}, socket) do + send(self(), {:run, source}) + {:noreply, assign(socket, source: source, running: true)} + end + + def handle_event("reset", _params, socket) do + {:noreply, + socket + |> assign(:source, socket.assigns.lesson.source) + |> assign(:result, nil)} + end + + def handle_event("toggle-bytecode", _, socket) do + {:noreply, update(socket, :show_bytecode, &(!&1))} + end + + @impl true + def handle_info({:run, source}, socket) do + result = LuaSandbox.run(source, timeout_ms: 1000) + {:noreply, socket |> assign(:result, result) |> assign(:running, false)} + end + + defp lesson_index(lessons, lesson) do + Enum.find_index(lessons, &(&1.slug == lesson.slug)) || 0 + end + + defp prev_lesson(lessons, lesson) do + idx = lesson_index(lessons, lesson) + if idx > 0, do: Enum.at(lessons, idx - 1), else: nil + end + + defp next_lesson(lessons, lesson) do + idx = lesson_index(lessons, lesson) + Enum.at(lessons, idx + 1) + end + + @impl true + def render(assigns) do + ~H""" + +
+
+ + +
+
+ Lesson {lesson_index(@lessons, @lesson) + 1} of {length(@lessons)} +
+

+ {@lesson.title} +

+
+ <%= for paragraph <- String.split(@lesson.body, "\n\n") do %> +

{raw(render_inline(paragraph))}

+ <% end %> +
+ +
+
+
+
+ {@lesson.slug}.lua +
+
+ + + +
+
+
+ +
+
+
+ + <.tour_output result={@result} running={@running} /> + + <%= if @show_bytecode do %> + <.tour_bytecode source={@source} result={@result} /> + <% end %> + +
+ <%= if prev = prev_lesson(@lessons, @lesson) do %> + <.link patch={~p"/tour/#{prev.slug}"} class="btn btn-ghost"> + <.icon name="hero-arrow-left-micro" class="size-4" /> {prev.title} + + <% else %> + <.link navigate={~p"/playground"} class="btn btn-ghost"> + <.icon name="hero-arrow-left-micro" class="size-4" /> Playground + + <% end %> + + <%= if nxt = next_lesson(@lessons, @lesson) do %> + <.link patch={~p"/tour/#{nxt.slug}"} class="btn btn-primary"> + {nxt.title} <.icon name="hero-arrow-right-micro" class="size-4" /> + + <% else %> + <.link navigate={~p"/playground"} class="btn btn-primary"> + Open the full playground <.icon name="hero-arrow-right-micro" class="size-4" /> + + <% end %> +
+
+
+
+
+ """ + end + + attr :result, :map, default: nil + attr :running, :boolean, required: true + + defp tour_output(assigns) do + ~H""" +
+
+ + Output + + + <%= cond do %> + <% @running -> %> + runningโ€ฆ + <% match?(%{status: :ok}, @result) -> %> + ok + <% match?(%{status: :error}, @result) -> %> + error + <% true -> %> + idle + <% end %> + +
+
+ <%= cond do %> + <% @running -> %> + โ€ฆ + <% match?(%{status: :error}, @result) -> %> +
<%= @result.error %>
+ <% match?(%{status: :ok}, @result) -> %> + <%= if @result.output != "" do %> +
<%= @result.output %>
+ <% end %> + <%= if @result.returns != [] do %> +
+ โ†’ {Enum.join(@result.returns, ", ")} +
+ <% end %> + <%= if @result.output == "" and @result.returns == [] do %> + (no output) + <% end %> + <% true -> %> + Hit Run to execute. + <% end %> +
+
+ """ + end + + attr :source, :string, required: true + attr :result, :map, default: nil + + defp tour_bytecode(assigns) do + blocks = + cond do + match?(%{bytecode: [_ | _]}, assigns.result) -> + assigns.result.bytecode + + true -> + case LuaSandbox.compile(assigns.source) do + {:ok, _, bs} -> bs + _ -> [] + end + end + + assigns = assign(assigns, :blocks, blocks) + + ~H""" +
+
+ Compiled bytecode +
+
+ <%= for block <- @blocks do %> +
+ ; {block.name} ยท registers={block.max_registers} ยท upvalues={block.upvalue_count} +
+ <%= for ins <- block.instructions do %> +
+ {ins.pc} + {ins.pretty} +
+ <% end %> + <% end %> + <%= if @blocks == [] do %> +
+ Run the snippet to see bytecode. +
+ <% end %> +
+
+ """ + end + + defp render_inline(text) do + text + |> String.replace( + ~r/`([^`]+)`/, + ~s|\\1| + ) + end +end diff --git a/website/lib/website_web/router.ex b/website/lib/website_web/router.ex new file mode 100644 index 0000000..7d596c2 --- /dev/null +++ b/website/lib/website_web/router.ex @@ -0,0 +1,48 @@ +defmodule DemoWeb.Router do + use DemoWeb, :router + + pipeline :browser do + plug :accepts, ["html"] + plug :fetch_session + plug :fetch_live_flash + plug :put_root_layout, html: {DemoWeb.Layouts, :root} + plug :protect_from_forgery + plug :put_secure_browser_headers + end + + pipeline :api do + plug :accepts, ["json"] + end + + scope "/", DemoWeb do + pipe_through :browser + + get "/", PageController, :home + live "/playground", PlaygroundLive, :index + live "/playground/:example", PlaygroundLive, :example + live "/tour", TourLive, :index + live "/tour/:slug", TourLive, :lesson + end + + # Other scopes may use custom stacks. + # scope "/api", DemoWeb do + # pipe_through :api + # end + + # Enable LiveDashboard and Swoosh mailbox preview in development + if Application.compile_env(:website, :dev_routes) do + # If you want to use the LiveDashboard in production, you should put + # it behind authentication and allow only admins to access it. + # If your application does not have an admins-only section yet, + # you can use Plug.BasicAuth to set up some basic authentication + # as long as you are also using SSL (which you should anyway). + import Phoenix.LiveDashboard.Router + + scope "/dev" do + pipe_through :browser + + live_dashboard "/dashboard", metrics: DemoWeb.Telemetry + forward "/mailbox", Plug.Swoosh.MailboxPreview + end + end +end diff --git a/website/lib/website_web/telemetry.ex b/website/lib/website_web/telemetry.ex new file mode 100644 index 0000000..69f85a8 --- /dev/null +++ b/website/lib/website_web/telemetry.ex @@ -0,0 +1,70 @@ +defmodule DemoWeb.Telemetry do + use Supervisor + import Telemetry.Metrics + + def start_link(arg) do + Supervisor.start_link(__MODULE__, arg, name: __MODULE__) + end + + @impl true + def init(_arg) do + children = [ + # Telemetry poller will execute the given period measurements + # every 10_000ms. Learn more here: https://hexdocs.pm/telemetry_metrics + {:telemetry_poller, measurements: periodic_measurements(), period: 10_000} + # Add reporters as children of your supervision tree. + # {Telemetry.Metrics.ConsoleReporter, metrics: metrics()} + ] + + Supervisor.init(children, strategy: :one_for_one) + end + + def metrics do + [ + # Phoenix Metrics + summary("phoenix.endpoint.start.system_time", + unit: {:native, :millisecond} + ), + summary("phoenix.endpoint.stop.duration", + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.start.system_time", + tags: [:route], + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.exception.duration", + tags: [:route], + unit: {:native, :millisecond} + ), + summary("phoenix.router_dispatch.stop.duration", + tags: [:route], + unit: {:native, :millisecond} + ), + summary("phoenix.socket_connected.duration", + unit: {:native, :millisecond} + ), + sum("phoenix.socket_drain.count"), + summary("phoenix.channel_joined.duration", + unit: {:native, :millisecond} + ), + summary("phoenix.channel_handled_in.duration", + tags: [:event], + unit: {:native, :millisecond} + ), + + # VM Metrics + summary("vm.memory.total", unit: {:byte, :kilobyte}), + summary("vm.total_run_queue_lengths.total"), + summary("vm.total_run_queue_lengths.cpu"), + summary("vm.total_run_queue_lengths.io") + ] + end + + defp periodic_measurements do + [ + # A module, function and arguments to be invoked periodically. + # This function must call :telemetry.execute/3 and a metric must be added above. + # {DemoWeb, :count_users, []} + ] + end +end diff --git a/website/mix.exs b/website/mix.exs new file mode 100644 index 0000000..d961c88 --- /dev/null +++ b/website/mix.exs @@ -0,0 +1,90 @@ +defmodule Demo.MixProject do + use Mix.Project + + def project do + [ + app: :website, + version: "0.1.0", + elixir: "~> 1.15", + elixirc_paths: elixirc_paths(Mix.env()), + start_permanent: Mix.env() == :prod, + aliases: aliases(), + deps: deps(), + compilers: [:phoenix_live_view] ++ Mix.compilers(), + listeners: [Phoenix.CodeReloader] + ] + end + + # Configuration for the OTP application. + # + # Type `mix help compile.app` for more information. + def application do + [ + mod: {Demo.Application, []}, + extra_applications: [:logger, :runtime_tools] + ] + end + + def cli do + [ + preferred_envs: [precommit: :test] + ] + end + + # Specifies which paths to compile per environment. + defp elixirc_paths(:test), do: ["lib", "test/support"] + defp elixirc_paths(_), do: ["lib"] + + # Specifies your project dependencies. + # + # Type `mix help deps` for examples and options. + defp deps do + [ + {:tidewave, "~> 0.5", only: [:dev]}, + {:lua, path: ".."}, + {:phoenix, "~> 1.8.7"}, + {:phoenix_html, "~> 4.1"}, + {:phoenix_live_reload, "~> 1.2", only: :dev}, + {:phoenix_live_view, "~> 1.1.0"}, + {:lazy_html, ">= 0.1.0", only: :test}, + {:phoenix_live_dashboard, "~> 0.8.3"}, + {:esbuild, "~> 0.10", runtime: Mix.env() == :dev}, + {:tailwind, "~> 0.3", runtime: Mix.env() == :dev}, + {:heroicons, + github: "tailwindlabs/heroicons", + tag: "v2.2.0", + sparse: "optimized", + app: false, + compile: false, + depth: 1}, + {:swoosh, "~> 1.16"}, + {:req, "~> 0.5"}, + {:telemetry_metrics, "~> 1.0"}, + {:telemetry_poller, "~> 1.0"}, + {:gettext, "~> 1.0"}, + {:jason, "~> 1.2"}, + {:dns_cluster, "~> 0.2.0"}, + {:bandit, "~> 1.5"} + ] + end + + # Aliases are shortcuts or tasks specific to the current project. + # For example, to install project dependencies and perform other setup tasks, run: + # + # $ mix setup + # + # See the documentation for `Mix` for more info on aliases. + defp aliases do + [ + setup: ["deps.get", "assets.setup", "assets.build"], + "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"], + "assets.build": ["compile", "tailwind website", "esbuild website"], + "assets.deploy": [ + "tailwind website --minify", + "esbuild website --minify", + "phx.digest" + ], + precommit: ["compile --warnings-as-errors", "deps.unlock --unused", "format", "test"] + ] + end +end diff --git a/website/mix.lock b/website/mix.lock new file mode 100644 index 0000000..26e15a2 --- /dev/null +++ b/website/mix.lock @@ -0,0 +1,42 @@ +%{ + "bandit": {:hex, :bandit, "1.11.1", "1eb33123cc3c17ae0c3447874eb83399ee530f960c39711ed240342fbd4865fa", [:mix], [{:hpax, "~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.18", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "d4401016df9abbc6dcd325c0b78b2b193e7c7c96bb68f31e576112be025d84a5"}, + "cc_precompiler": {:hex, :cc_precompiler, "0.1.11", "8c844d0b9fb98a3edea067f94f616b3f6b29b959b6b3bf25fee94ffe34364768", [:mix], [{:elixir_make, "~> 0.7", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "3427232caf0835f94680e5bcf082408a70b48ad68a5f5c0b02a3bea9f3a075b9"}, + "circular_buffer": {:hex, :circular_buffer, "1.0.1", "01f0e3d5fe945080692cf6521c0988e9dbb5dc312831cefe77e5b63a4e658160", [:mix], [], "hexpm", "7d4ece3137d49c1f8dd0b3e0aa7c484f4d83a0be5d4b516c282085c1d5f2d7b9"}, + "dns_cluster": {:hex, :dns_cluster, "0.2.0", "aa8eb46e3bd0326bd67b84790c561733b25c5ba2fe3c7e36f28e88f384ebcb33", [:mix], [], "hexpm", "ba6f1893411c69c01b9e8e8f772062535a4cf70f3f35bcc964a324078d8c8240"}, + "elixir_make": {:hex, :elixir_make, "0.9.0", "6484b3cd8c0cee58f09f05ecaf1a140a8c97670671a6a0e7ab4dc326c3109726", [:mix], [], "hexpm", "db23d4fd8b757462ad02f8aa73431a426fe6671c80b200d9710caf3d1dd0ffdb"}, + "esbuild": {:hex, :esbuild, "0.10.0", "b0aa3388a1c23e727c5a3e7427c932d89ee791746b0081bbe56103e9ef3d291f", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "468489cda427b974a7cc9f03ace55368a83e1a7be12fba7e30969af78e5f8c70"}, + "expo": {:hex, :expo, "1.1.1", "4202e1d2ca6e2b3b63e02f69cfe0a404f77702b041d02b58597c00992b601db5", [:mix], [], "hexpm", "5fb308b9cb359ae200b7e23d37c76978673aa1b06e2b3075d814ce12c5811640"}, + "file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"}, + "finch": {:hex, :finch, "0.22.0", "5c48fa6f9706a78eb9036cacb67b8b996b4e66d111c543f4c29bb0f879a6806b", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.8", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b94e83c47780fc6813f746a1f1a34ee65cda42da4c5ea26a68f0acc4498e23dc"}, + "fine": {:hex, :fine, "0.1.6", "4bf7151493443c454aac9f2fa2f34f5fefd0346a83fb5586a016c4a135c63247", [:mix], [], "hexpm", "5638eb4495488e885ebec167fa57973e5c35e1a50c344eb7666c90ec1c4e3b12"}, + "gettext": {:hex, :gettext, "1.0.2", "5457e1fd3f4abe47b0e13ff85086aabae760497a3497909b8473e0acee57673b", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "eab805501886802071ad290714515c8c4a17196ea76e5afc9d06ca85fb1bfeb3"}, + "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "0435d4ca364a608cc75e2f8683d374e55abbae26", [tag: "v2.2.0", sparse: "optimized", depth: 1]}, + "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, + "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, + "jason": {:hex, :jason, "1.4.5", "2e3a008590b0b8d7388c20293e9dcc9cf3e5d642fd2a114e4cbbb52e595d940a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b0c823996102bcd0239b3c2444eb00409b72f6a140c1950bc8b457d836b30684"}, + "lazy_html": {:hex, :lazy_html, "0.1.11", "136c8e9cd616b4f4e9c1562daa683880891120b759606dc4c3b6b18058ba5d79", [: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", "3b1be592929c31eca1a21673d25696e5c14cddfe922d9d1a3e3b48be4163883b"}, + "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, + "mint": {:hex, :mint, "1.8.0", "b964eaf4416f2dee2ba88968d52239fca5621b0402b9c95f55a08eb9d74803e9", [: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", "f3c572c11355eccf00f22275e9b42463bc17bd28db13be1e28f8e0bb4adbc849"}, + "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, + "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, + "phoenix": {:hex, :phoenix, "1.8.7", "d8d755b4ff4b449f610223dd706b4ae64155cb720d3dc09c706c079ecea189e4", [: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", "47352f72d6ab31009ef77516b1b3a14745be97b54061fd458031b9d8294869d5"}, + "phoenix_html": {:hex, :phoenix_html, "4.3.0", "d3577a5df4b6954cd7890c84d955c470b5310bb49647f0a114a6eeecc850f7ad", [:mix], [], "hexpm", "3eaa290a78bab0f075f791a46a981bbe769d94bc776869f4f3063a14f30497ad"}, + "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.7", "405880012cb4b706f26dd1c6349125bfc903fb9e44d1ea668adaf4e04d4884b7", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "3a8625cab39ec261d48a13b7468dc619c0ede099601b084e343968309bd4d7d7"}, + "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.6.2", "b18b0773a1ba77f28c52decbb0f10fd1ac4d3ae5b8632399bbf6986e3b665f62", [:mix], [{:file_system, "~> 0.2.10 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "d1f89c18114c50d394721365ffb428cce24f1c13de0467ffa773e2ff4a30d5b9"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "1.1.30", "a84af1610755dc208da35d4d45564485edbf18c3f3c77373c4a650dc994cdcdb", [:mix], [{:igniter, ">= 0.6.16 and < 1.0.0-0", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:lazy_html, "~> 0.1.0", [hex: :lazy_html, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0 or ~> 1.8.0-rc", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, 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.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a353c51ac1e3190910f01a6100c7d5cc02c5e22e7374fd817bd3aedd21149039"}, + "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.2.0", "ff3a5616e1bed6804de7773b92cbccfc0b0f473faf1f63d7daf1206c7aeaaa6f", [:mix], [], "hexpm", "adc313a5bf7136039f63cfd9668fde73bba0765e0614cba80c06ac9460ff3e96"}, + "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, + "plug": {:hex, :plug, "1.19.2", "e4950525b22c6789dfb38a3f95d47171ba159da3fc5a33be9643b43d5e8adb98", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b6fce20a56af5e60fa5dfecf3f907bb98ec981be43c79a3809a499bc3d133de0"}, + "plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"}, + "req": {:hex, :req, "0.5.18", "48e6431cb4135e8a7815e745177485369a9b4a9924d5fe68ca00eb09ceaed1ef", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.21.0 or ~> 0.22.0", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "fa03812c440a9754bf34355e0c5d4f3ed316458db62e3284b7a352ef8dc0b996"}, + "swoosh": {:hex, :swoosh, "1.25.2", "cd3e53b0391439395492e5dce8c22288733f22603e21136162d03cd153669be9", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:idna, "~> 6.0", [hex: :idna, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5.10 or ~> 0.6 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "0aecf65b2845f13f4d440e0945715432bbde2d815e2302adf7df549cd9bdafed"}, + "tailwind": {:hex, :tailwind, "0.4.1", "e7bcc222fe96a1e55f948e76d13dd84a1a7653fb051d2a167135db3b4b08d3e9", [:mix], [], "hexpm", "6249d4f9819052911120dbdbe9e532e6bd64ea23476056adb7f730aa25c220d1"}, + "telemetry": {:hex, :telemetry, "1.4.2", "a0cb522801dffb1c49fe6e30561badffc7b6d0e180db1300df759faa22062855", [:rebar3], [], "hexpm", "928f6495066506077862c0d1646609eed891a4326bee3126ba54b60af61febb1"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"}, + "telemetry_poller": {:hex, :telemetry_poller, "1.3.0", "d5c46420126b5ac2d72bc6580fb4f537d35e851cc0f8dbd571acf6d6e10f5ec7", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "51f18bed7128544a50f75897db9974436ea9bfba560420b646af27a9a9b35211"}, + "thousand_island": {:hex, :thousand_island, "1.4.3", "2158209580f633be38d43ec4e3ce0a01079592b9657afff9080d5d8ca149a3af", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6e4ce09b0fd761a58594d02814d40f77daff460c48a7354a15ab353bb998ea0b"}, + "tidewave": {:hex, :tidewave, "0.5.6", "91f35540b5599640443f1d3a1c6166bf506e202840261a6344e384e8813c1f64", [:mix], [{:circular_buffer, "~> 0.4 or ~> 1.0", [hex: :circular_buffer, repo: "hexpm", optional: false]}, {:igniter, "~> 0.6", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_live_reload, ">= 1.6.1", [hex: :phoenix_live_reload, repo: "hexpm", optional: true]}, {:plug, "~> 1.17", [hex: :plug, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}], "hexpm", "dc82d52b8b6ffc04680544b17cd340c7d4166bb0d63999eb960850526866b533"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.1", "a48703a25c170eedadca83b11e88985af08d35f37c6f664d6dcfb106a97782fc", [:rebar3], [], "hexpm", "b3a917854ce3ae233619744ad1e0102e05673136776fb2fa76234f3e03b23642"}, + "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, + "websock_adapter": {:hex, :websock_adapter, "0.5.9", "43dc3ba6d89ef5dec5b1d0a39698436a1e856d000d84bf31a3149862b01a287f", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "5534d5c9adad3c18a0f58a9371220d75a803bf0b9a3d87e6fe072faaeed76a08"}, +} diff --git a/website/priv/gettext/en/LC_MESSAGES/errors.po b/website/priv/gettext/en/LC_MESSAGES/errors.po new file mode 100644 index 0000000..cdec3a1 --- /dev/null +++ b/website/priv/gettext/en/LC_MESSAGES/errors.po @@ -0,0 +1,11 @@ +## `msgid`s in this file come from POT (.pot) files. +## +## Do not add, change, or remove `msgid`s manually here as +## they're tied to the ones in the corresponding POT file +## (with the same domain). +## +## Use `mix gettext.extract --merge` or `mix gettext.merge` +## to merge POT files into PO files. +msgid "" +msgstr "" +"Language: en\n" diff --git a/website/priv/gettext/errors.pot b/website/priv/gettext/errors.pot new file mode 100644 index 0000000..d6f47fa --- /dev/null +++ b/website/priv/gettext/errors.pot @@ -0,0 +1,10 @@ +## This is a PO Template file. +## +## `msgid`s here are often extracted from source code. +## Add new translations manually only if they're dynamic +## translations that can't be statically extracted. +## +## Run `mix gettext.extract` to bring this file up to +## date. Leave `msgstr`s empty as changing them here has no +## effect: edit them in PO (`.po`) files instead. + diff --git a/website/priv/static/favicon.ico b/website/priv/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7f372bfc21cdd8cb47585339d5fa4d9dd424402f GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=@t!V@Ar*{oFEH`~d50E!_s``s q?{G*w(7?#d#v@^nKnY_HKaYb01EZMZjMqTJ89ZJ6T-G@yGywoKK_h|y literal 0 HcmV?d00001 diff --git a/website/priv/static/images/logo.svg b/website/priv/static/images/logo.svg new file mode 100644 index 0000000..9f26bab --- /dev/null +++ b/website/priv/static/images/logo.svg @@ -0,0 +1,6 @@ + diff --git a/website/priv/static/robots.txt b/website/priv/static/robots.txt new file mode 100644 index 0000000..26e06b5 --- /dev/null +++ b/website/priv/static/robots.txt @@ -0,0 +1,5 @@ +# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file +# +# To ban all spiders from the entire site uncomment the next two lines: +# User-agent: * +# Disallow: / diff --git a/website/test/support/conn_case.ex b/website/test/support/conn_case.ex new file mode 100644 index 0000000..e51004a --- /dev/null +++ b/website/test/support/conn_case.ex @@ -0,0 +1,37 @@ +defmodule DemoWeb.ConnCase do + @moduledoc """ + This module defines the test case to be used by + tests that require setting up a connection. + + Such tests rely on `Phoenix.ConnTest` and also + import other functionality to make it easier + to build common data structures and query the data layer. + + Finally, if the test case interacts with the database, + we enable the SQL sandbox, so changes done to the database + are reverted at the end of every test. If you are using + PostgreSQL, you can even run database tests asynchronously + by setting `use DemoWeb.ConnCase, async: true`, although + this option is not recommended for other databases. + """ + + use ExUnit.CaseTemplate + + using do + quote do + # The default endpoint for testing + @endpoint DemoWeb.Endpoint + + use DemoWeb, :verified_routes + + # Import conveniences for testing with connections + import Plug.Conn + import Phoenix.ConnTest + import DemoWeb.ConnCase + end + end + + setup _tags do + {:ok, conn: Phoenix.ConnTest.build_conn()} + end +end diff --git a/website/test/test_helper.exs b/website/test/test_helper.exs new file mode 100644 index 0000000..869559e --- /dev/null +++ b/website/test/test_helper.exs @@ -0,0 +1 @@ +ExUnit.start() diff --git a/website/test/website_web/controllers/error_html_test.exs b/website/test/website_web/controllers/error_html_test.exs new file mode 100644 index 0000000..893fcac --- /dev/null +++ b/website/test/website_web/controllers/error_html_test.exs @@ -0,0 +1,14 @@ +defmodule DemoWeb.ErrorHTMLTest do + use DemoWeb.ConnCase, async: true + + # Bring render_to_string/4 for testing custom views + import Phoenix.Template, only: [render_to_string: 4] + + test "renders 404.html" do + assert render_to_string(DemoWeb.ErrorHTML, "404", "html", []) == "Not Found" + end + + test "renders 500.html" do + assert render_to_string(DemoWeb.ErrorHTML, "500", "html", []) == "Internal Server Error" + end +end diff --git a/website/test/website_web/controllers/error_json_test.exs b/website/test/website_web/controllers/error_json_test.exs new file mode 100644 index 0000000..aa12730 --- /dev/null +++ b/website/test/website_web/controllers/error_json_test.exs @@ -0,0 +1,12 @@ +defmodule DemoWeb.ErrorJSONTest do + use DemoWeb.ConnCase, async: true + + test "renders 404" do + assert DemoWeb.ErrorJSON.render("404.json", %{}) == %{errors: %{detail: "Not Found"}} + end + + test "renders 500" do + assert DemoWeb.ErrorJSON.render("500.json", %{}) == + %{errors: %{detail: "Internal Server Error"}} + end +end diff --git a/website/test/website_web/controllers/page_controller_test.exs b/website/test/website_web/controllers/page_controller_test.exs new file mode 100644 index 0000000..4a52cb4 --- /dev/null +++ b/website/test/website_web/controllers/page_controller_test.exs @@ -0,0 +1,10 @@ +defmodule DemoWeb.PageControllerTest do + use DemoWeb.ConnCase + + test "GET / renders the Lua showcase landing page", %{conn: conn} do + body = conn |> get(~p"/") |> html_response(200) + assert body =~ "Lua, on the" + assert body =~ "Playground" + assert body =~ "Tour" + end +end From 4de733d415d39190ec02398c01a61516f1a1b092 Mon Sep 17 00:00:00 2001 From: Dave Lucia Date: Sun, 24 May 2026 19:28:56 -0400 Subject: [PATCH 02/20] feat(website): syntax-highlighted rotating code blocks + home polish Adds a Makeup-backed `<.code_block>` component used across the home, playground, and tour pages, plus a CodeRotator JS hook that cycles through labelled snippets. Snippets live in their own module so they can be unit-tested and edited without heredoc-in-heredoc pain. Also fixes two display issues in the home hero: - Moves the "~LUA sigil" floating chip from `-bottom-4 -left-4` (which covered the rotator dots) to `top-full mt-3` so it sits cleanly below the code panel. - Reflows the queue.exs and formulas.exs embed snippets so they fit the panel without horizontal clipping. --- website/assets/css/app.css | 113 ++++++++ website/assets/js/app.js | 255 ++++++++++++++---- website/assets/package-lock.json | 253 +++++++++++++++++ website/assets/package.json | 17 ++ .../website_web/components/core_components.ex | 83 ++++++ .../controllers/page_html/home.html.heex | 91 +++---- website/lib/website_web/endpoint.ex | 2 +- website/lib/website_web/highlight.ex | 104 +++++++ .../lib/website_web/live/playground_live.ex | 27 +- website/lib/website_web/live/tour_live.ex | 16 +- website/lib/website_web/snippets.ex | 146 ++++++++++ website/mix.exs | 4 +- website/mix.lock | 3 + 13 files changed, 1005 insertions(+), 109 deletions(-) create mode 100644 website/assets/package-lock.json create mode 100644 website/assets/package.json create mode 100644 website/lib/website_web/highlight.ex create mode 100644 website/lib/website_web/snippets.ex diff --git a/website/assets/css/app.css b/website/assets/css/app.css index cc9a7f1..3d5474f 100644 --- a/website/assets/css/app.css +++ b/website/assets/css/app.css @@ -103,3 +103,116 @@ [data-phx-session], [data-phx-teleported-src] { display: contents } /* This file is for your main application CSS */ + +/* Makeup syntax highlighting โ€” mapped to daisyUI theme tokens so it + adapts to both `light` and `dark` themes without two stylesheets. + Token classes are Pygments-compatible. */ +.highlight { + color: var(--color-base-content); +} + +/* Comments */ +.highlight .c, +.highlight .c1, +.highlight .cm, +.highlight .cs, +.highlight .ch, +.highlight .cp, +.highlight .cpf { + color: color-mix(in oklch, var(--color-base-content) 40%, transparent); + font-style: italic; +} + +/* Keywords (do, end, defmodule, case, whenโ€ฆ) */ +.highlight .k, +.highlight .kd, +.highlight .kn, +.highlight .kp, +.highlight .kr, +.highlight .kt { + color: var(--color-primary); + font-weight: 500; +} + +/* Pseudo keywords / builtin constants (true, false, nil) */ +.highlight .kc, +.highlight .bp { + color: var(--color-warning); +} + +/* Module names */ +.highlight .nc, +.highlight .nn { + color: var(--color-secondary); +} + +/* Function names */ +.highlight .nf, +.highlight .fm { + color: var(--color-info); +} + +/* Atoms (:foo) */ +.highlight .ss { + color: var(--color-accent); +} + +/* Strings */ +.highlight .s, +.highlight .s1, +.highlight .s2, +.highlight .sb, +.highlight .sc, +.highlight .sd, +.highlight .se, +.highlight .sh, +.highlight .si, +.highlight .sx, +.highlight .sr, +.highlight .dl { + color: var(--color-accent); +} + +/* String interpolation punctuation: visually quieter */ +.highlight .si .o, +.highlight .si .p { + color: color-mix(in oklch, var(--color-accent) 70%, transparent); +} + +/* Numbers */ +.highlight .m, +.highlight .mi, +.highlight .mf, +.highlight .mh, +.highlight .mo, +.highlight .mb, +.highlight .il { + color: var(--color-warning); +} + +/* Operators, punctuation: inherit but muted */ +.highlight .o, +.highlight .ow, +.highlight .p { + color: color-mix(in oklch, var(--color-base-content) 70%, transparent); +} + +/* Variables / identifiers */ +.highlight .n, +.highlight .nv, +.highlight .nb, +.highlight .nl, +.highlight .py { + color: var(--color-base-content); +} + +/* Module attributes (@moduledoc, @spec) */ +.highlight .na { + color: var(--color-info); +} + +/* Errors should not vanish silently */ +.highlight .err { + color: var(--color-error); +} + diff --git a/website/assets/js/app.js b/website/assets/js/app.js index df7e8ce..7220c31 100644 --- a/website/assets/js/app.js +++ b/website/assets/js/app.js @@ -25,60 +25,226 @@ import {LiveSocket} from "phoenix_live_view" import {hooks as colocatedHooks} from "phoenix-colocated/website" import topbar from "../vendor/topbar" +import {EditorView, keymap, lineNumbers, highlightActiveLine, drawSelection, dropCursor, rectangularSelection, crosshairCursor, highlightSpecialChars} from "@codemirror/view" +import {EditorState, Compartment} from "@codemirror/state" +import {defaultKeymap, history, historyKeymap, indentWithTab} from "@codemirror/commands" +import {StreamLanguage, syntaxHighlighting, defaultHighlightStyle, indentOnInput, bracketMatching, foldKeymap} from "@codemirror/language" +import {closeBrackets, closeBracketsKeymap} from "@codemirror/autocomplete" +import {highlightSelectionMatches, searchKeymap} from "@codemirror/search" +import {lua} from "@codemirror/legacy-modes/mode/lua" +import {oneDark} from "@codemirror/theme-one-dark" + +const themeCompartment = new Compartment() + +const editorTheme = EditorView.theme({ + "&": { + height: "100%", + fontSize: "13px", + backgroundColor: "transparent", + }, + "&.cm-focused": { + outline: "none", + }, + ".cm-content": { + fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace", + padding: "12px 0", + caretColor: "var(--color-primary, #6366f1)", + }, + ".cm-scroller": { + fontFamily: "inherit", + overflow: "auto", + lineHeight: "1.55", + }, + ".cm-gutters": { + backgroundColor: "transparent", + border: "none", + color: "color-mix(in oklch, currentColor 35%, transparent)", + }, + ".cm-activeLineGutter, .cm-activeLine": { + backgroundColor: "color-mix(in oklch, currentColor 6%, transparent)", + }, + ".cm-lineNumbers .cm-gutterElement": { + padding: "0 12px 0 8px", + minWidth: "2.5em", + }, +}) + +function darkActive() { + const t = document.documentElement.dataset.theme + if (t === "dark") return true + if (t === "light") return false + return window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches +} + +function themeExt() { + return darkActive() ? oneDark : [] +} + const LuaEditor = { mounted() { - const ta = this.el.querySelector("textarea") - if (!ta) return + const textarea = this.el.querySelector("textarea") + if (!textarea) return - ta.addEventListener("keydown", (e) => { - // Cmd/Ctrl + Enter -> submit form - if ((e.metaKey || e.ctrlKey) && e.key === "Enter") { - e.preventDefault() - const form = ta.closest("form") - if (form) form.requestSubmit() - return + this.textarea = textarea + // Hide the underlying textarea but keep it in the form. + textarea.style.display = "none" + textarea.setAttribute("tabindex", "-1") + textarea.setAttribute("aria-hidden", "true") + + const submitForm = () => { + const form = this.el.closest("form") + if (form) form.requestSubmit() + return true + } + + const syncToTextarea = () => { + const val = this.view.state.doc.toString() + if (this.textarea.value !== val) { + this.textarea.value = val + // Trigger phx-change on the form + this.textarea.dispatchEvent(new Event("input", {bubbles: true})) } + } - // Tab / Shift+Tab indentation - if (e.key === "Tab") { - e.preventDefault() - const start = ta.selectionStart - const end = ta.selectionEnd - const before = ta.value.slice(0, start) - const sel = ta.value.slice(start, end) - const after = ta.value.slice(end) - - if (e.shiftKey) { - // De-indent each line in selection by removing up to 2 leading spaces - const lineStart = before.lastIndexOf("\n") + 1 - const block = ta.value.slice(lineStart, end) - const dedented = block.replace(/^( ?)/gm, "") - const newVal = ta.value.slice(0, lineStart) + dedented + after - ta.value = newVal - const delta = block.length - dedented.length - ta.selectionStart = Math.max(lineStart, start - 2) - ta.selectionEnd = Math.max(lineStart, end - delta) - } else if (sel.includes("\n")) { - // Indent each line of multi-line selection - const lineStart = before.lastIndexOf("\n") + 1 - const block = ta.value.slice(lineStart, end) - const indented = block.replace(/^/gm, " ") - ta.value = ta.value.slice(0, lineStart) + indented + after - const delta = indented.length - block.length - ta.selectionStart = start + 2 - ta.selectionEnd = end + delta - } else { - // Single position: insert two spaces - ta.value = before + " " + after - ta.selectionStart = ta.selectionEnd = start + 2 - } - ta.dispatchEvent(new Event("input", {bubbles: true})) - return + this.view = new EditorView({ + doc: textarea.value, + parent: this.el, + extensions: [ + lineNumbers(), + highlightSpecialChars(), + history(), + drawSelection(), + dropCursor(), + EditorState.allowMultipleSelections.of(true), + indentOnInput(), + bracketMatching(), + closeBrackets(), + rectangularSelection(), + crosshairCursor(), + highlightActiveLine(), + highlightSelectionMatches(), + StreamLanguage.define(lua), + syntaxHighlighting(defaultHighlightStyle, {fallback: true}), + keymap.of([ + {key: "Mod-Enter", run: submitForm, preventDefault: true}, + ...closeBracketsKeymap, + ...defaultKeymap, + ...searchKeymap, + ...historyKeymap, + ...foldKeymap, + indentWithTab, + ]), + EditorView.updateListener.of((update) => { + if (update.docChanged) syncToTextarea() + }), + editorTheme, + themeCompartment.of(themeExt()), + ], + }) + + // Sync initial value (in case textarea had different value) + syncToTextarea() + + // Listen for server-pushed source updates (e.g. when loading an example) + this.handleEvent("lua-editor:set-source", ({source, target}) => { + if (target && target !== this.el.id) return + const current = this.view.state.doc.toString() + if (current === source) return + this.view.dispatch({ + changes: {from: 0, to: this.view.state.doc.length, insert: source}, + }) + }) + + // Listen for theme changes on the element so highlight updates live. + this.themeObserver = new MutationObserver(() => { + this.view.dispatch({effects: themeCompartment.reconfigure(themeExt())}) + }) + this.themeObserver.observe(document.documentElement, { + attributes: true, + attributeFilter: ["data-theme"], + }) + }, + + destroyed() { + if (this.themeObserver) this.themeObserver.disconnect() + if (this.view) this.view.destroy() + }, +} + +// Manages a multi-snippet code block rendered by +// `DemoWeb.CoreComponents.code_block/1`. The component renders every +// snippet server-side, stacked in a single grid cell so the container +// reserves the tallest snippet's height. This code picks a random +// initial snippet and wires the dot buttons below the block for +// manual switching โ€” no auto-advance, no page jumps. +// +// Lives outside the LiveView hooks because the marketing pages are +// controller-rendered, not LiveViews. +function startCodeRotator(el) { + if (el.__codeRotator) return + const snippets = Array.from(el.querySelectorAll("[data-snippet-index]")) + if (snippets.length < 2) return + + const filename = document.querySelector( + `[data-code-filename-for="${el.id}"]` + ) + const dotsContainer = document.querySelector( + `[data-code-dots-for="${el.id}"]` + ) + const dots = dotsContainer + ? Array.from(dotsContainer.querySelectorAll("[data-snippet-target]")) + : [] + + const show = (idx) => { + snippets.forEach((node, i) => { + const active = i === idx + node.classList.toggle("invisible", !active) + node.setAttribute("aria-hidden", active ? "false" : "true") + }) + dots.forEach((dot, i) => { + if (i === idx) { + dot.setAttribute("data-active", "") + } else { + dot.removeAttribute("data-active") } }) + if (filename) { + const label = snippets[idx].dataset.label + if (label) filename.textContent = label + } + } + + const initial = Math.floor(Math.random() * snippets.length) + show(initial) + + const onClick = (event) => { + const target = event.target.closest("[data-snippet-target]") + if (!target || !dotsContainer.contains(target)) return + const idx = parseInt(target.dataset.snippetTarget, 10) + if (Number.isFinite(idx)) show(idx) + } + + if (dotsContainer) dotsContainer.addEventListener("click", onClick) + + el.__codeRotator = { + stop() { + if (dotsContainer) dotsContainer.removeEventListener("click", onClick) + el.__codeRotator = null + }, } } +function initCodeRotators(root = document) { + root.querySelectorAll("pre.highlight[data-rotate]").forEach(startCodeRotator) +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", () => initCodeRotators()) +} else { + initCodeRotators() +} +window.addEventListener("phx:page-loading-stop", () => initCodeRotators()) + const hooks = {...colocatedHooks, LuaEditor} const csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") @@ -136,4 +302,3 @@ if (process.env.NODE_ENV === "development") { window.liveReloader = reloader }) } - diff --git a/website/assets/package-lock.json b/website/assets/package-lock.json new file mode 100644 index 0000000..6392744 --- /dev/null +++ b/website/assets/package-lock.json @@ -0,0 +1,253 @@ +{ + "name": "website-assets", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "website-assets", + "version": "0.0.0", + "dependencies": { + "@codemirror/commands": "^6.6.0", + "@codemirror/language": "^6.10.2", + "@codemirror/legacy-modes": "^6.4.0", + "@codemirror/state": "^6.4.1", + "@codemirror/theme-one-dark": "^6.1.2", + "@codemirror/view": "^6.26.3", + "codemirror": "^6.0.1", + "phoenix": "../deps/phoenix", + "phoenix_html": "../deps/phoenix_html", + "phoenix_live_view": "../deps/phoenix_live_view" + } + }, + "../deps/phoenix": { + "version": "1.8.7", + "license": "MIT", + "devDependencies": { + "@babel/cli": "7.28.6", + "@babel/core": "7.29.0", + "@babel/preset-env": "7.29.3", + "@eslint/js": "^10.0.1", + "@stylistic/eslint-plugin": "^5.0.0", + "documentation": "^14.0.3", + "eslint": "10.2.1", + "eslint-plugin-jest": "29.15.2", + "jest": "^30.0.0", + "jest-environment-jsdom": "^30.0.0", + "jsdom": "^29.0.1", + "mock-socket": "^9.3.1" + } + }, + "../deps/phoenix_html": { + "version": "4.3.0" + }, + "../deps/phoenix_live_view": { + "version": "1.1.30", + "license": "MIT", + "dependencies": { + "morphdom": "2.7.8" + }, + "devDependencies": { + "@babel/cli": "7.27.2", + "@babel/core": "7.27.4", + "@babel/preset-env": "7.27.2", + "@babel/preset-typescript": "^7.27.1", + "@eslint/js": "^9.29.0", + "@playwright/test": "^1.56.1", + "@types/jest": "^30.0.0", + "@types/phoenix": "^1.6.6", + "css.escape": "^1.5.1", + "eslint": "9.29.0", + "eslint-plugin-jest": "28.14.0", + "eslint-plugin-playwright": "^2.2.0", + "globals": "^16.2.0", + "jest": "^30.0.0", + "jest-environment-jsdom": "^30.0.0", + "jest-monocart-coverage": "^1.1.1", + "monocart-reporter": "^2.9.21", + "phoenix": "1.7.21", + "prettier": "3.5.3", + "ts-jest": "^29.4.0", + "typescript": "^5.8.3", + "typescript-eslint": "^8.34.0" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.2", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.2.tgz", + "integrity": "sha512-G5FPkgIiLjOgZMjqVjvuKQ1rGPtHogLldJr33eFJdVLtmwY+giGrlv/ewljLz6b9BSQLkjxuwBc6g6omDM+YxQ==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz", + "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz", + "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/legacy-modes": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.5.3.tgz", + "integrity": "sha512-xCsmIzH78MyWkib9jlPaaun57XNkfbMIhagfaZVd0iLTqlpw3jXaIcbZm72MTmmn64eTZpBVNjbyYh+QXnxRsg==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.6.tgz", + "integrity": "sha512-6Kp7r6XfCi/D/5sdXieMfg9pJU1bUEx96WITuLU6ESaKizCz0QHFMjY/TaFSbigDdEAIgi93itLBIUETP4oK+A==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.42.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.0.tgz", + "integrity": "sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz", + "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/theme-one-dark": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", + "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.43.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.0.tgz", + "integrity": "sha512-V7ZCLQO3Jus9hzh2jVCCPW3mO4IBMr43O37PqSUYautJSnnJF41YlgLw21x0fLJTYvJ+Vkm6Gp+qKGH9pltgXA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.6.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@lezer/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", + "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "license": "MIT" + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", + "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "license": "MIT" + }, + "node_modules/codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, + "node_modules/phoenix": { + "resolved": "../deps/phoenix", + "link": true + }, + "node_modules/phoenix_html": { + "resolved": "../deps/phoenix_html", + "link": true + }, + "node_modules/phoenix_live_view": { + "resolved": "../deps/phoenix_live_view", + "link": true + }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + } + } +} diff --git a/website/assets/package.json b/website/assets/package.json new file mode 100644 index 0000000..2a94ed8 --- /dev/null +++ b/website/assets/package.json @@ -0,0 +1,17 @@ +{ + "name": "website-assets", + "version": "0.0.0", + "private": true, + "dependencies": { + "@codemirror/commands": "^6.6.0", + "@codemirror/language": "^6.10.2", + "@codemirror/legacy-modes": "^6.4.0", + "@codemirror/state": "^6.4.1", + "@codemirror/theme-one-dark": "^6.1.2", + "@codemirror/view": "^6.26.3", + "codemirror": "^6.0.1", + "phoenix": "../deps/phoenix", + "phoenix_html": "../deps/phoenix_html", + "phoenix_live_view": "../deps/phoenix_live_view" + } +} diff --git a/website/lib/website_web/components/core_components.ex b/website/lib/website_web/components/core_components.ex index a7bb4aa..aff6633 100644 --- a/website/lib/website_web/components/core_components.ex +++ b/website/lib/website_web/components/core_components.ex @@ -452,6 +452,89 @@ defmodule DemoWeb.CoreComponents do """ end + @doc """ + Renders a syntax-highlighted code block, optionally rotating through + several snippets. + + ## Examples + + <.code_block language={:elixir} source={~S\"\"\" + defmodule Foo do + end + \"\"\"} /> + + <.code_block + language={:elixir} + rotate + interval={4500} + snippets={[ + %{label: "queue.exs", source: "..."}, + %{label: "filter.exs", source: "..."} + ]} + /> + + When `snippets` is given, all snippets are rendered server-side and + stacked in a CSS grid cell so the container reserves the height of + the tallest snippet. The `CodeRotator` JS hook picks a random initial + snippet and renders dots below the code for manual switching. Each + snippet may include an optional `:label` that swaps into the chrome + filename slot. + """ + attr :id, :string, required: true + attr :language, :atom, default: :elixir + attr :source, :string, default: nil + attr :snippets, :list, default: nil + attr :rotate, :boolean, default: false + attr :class, :string, default: "p-5 font-mono text-[13px] leading-6 overflow-x-auto" + attr :rest, :global + + def code_block(assigns) do + snippets = + cond do + is_list(assigns[:snippets]) and assigns[:snippets] != [] -> assigns.snippets + is_binary(assigns[:source]) -> [%{source: assigns.source}] + true -> [] + end + + rotate? = assigns[:rotate] and length(snippets) > 1 + + assigns = + assigns + |> assign(:resolved_snippets, Enum.with_index(snippets)) + |> assign(:rotate?, rotate?) + + ~H""" +
+
+
+ +
+
+
+ """ + end + ## JS Commands def show(js \\ %JS{}, selector) do diff --git a/website/lib/website_web/controllers/page_html/home.html.heex b/website/lib/website_web/controllers/page_html/home.html.heex index 2cb4095..418bd74 100644 --- a/website/lib/website_web/controllers/page_html/home.html.heex +++ b/website/lib/website_web/controllers/page_html/home.html.heex @@ -63,38 +63,35 @@ class="absolute -inset-6 rounded-3xl bg-gradient-to-br from-primary/20 via-accent/10 to-transparent blur-2xl" >
-
+
-
script.exs
+
+ script.exs +
โ–ถ 4 ยตs
-
## Embed Lua in your Elixir app
-## with a single function call.
-
-defmodule MyApp.Rules do
-  use Lua.API, scope: "rules"
-
-  deflua double(n), do: n * 2
-end
-
-## Now your Elixir function is
-## callable from any Lua script:
-
-lua = Lua.new() |> Lua.load_api(MyApp.Rules)
-
-{[10], _lua} = Lua.eval!(lua, """
-  return rules.double(5)
-""")
-
+ <.code_block + id="hero-snippets" + language={:elixir} + rotate + class="px-5 py-4 font-mono text-[13px] leading-6 overflow-x-auto" + snippets={DemoWeb.Snippets.hero()} + />
<%!-- floating chip --%> -
-
+
- queue.exs + + queue.exs +
-
defmodule Queue do
-  use Lua.API, scope: "q"
-
-  deflua push(v), state do
-    queue = Lua.get!(state, [:my_queue])
-    {[], state} = Lua.call_function!(
-      state, [:table, :insert], [queue, v]
-    )
-    {[], state}
-  end
-end
-
-lua =
-  Lua.new()
-  |> Lua.load_api(Queue)
-  |> Lua.set!([:my_queue], [])
-
-Lua.eval!(lua, """
-  q.push("hello")
-  q.push("world")
-""")
+ <.code_block + id="embed-snippets" + language={:elixir} + rotate + snippets={DemoWeb.Snippets.embed()} + />
diff --git a/website/lib/website_web/endpoint.ex b/website/lib/website_web/endpoint.ex index 93251d8..34c96b1 100644 --- a/website/lib/website_web/endpoint.ex +++ b/website/lib/website_web/endpoint.ex @@ -28,7 +28,7 @@ defmodule DemoWeb.Endpoint do raise_on_missing_only: code_reloading? if Mix.env() == :dev do - plug Tidewave + plug Tidewave, team: [id: "tv-labs", token: "6jxcajjjd63jqd5yfk7zvvcucgi3lpsf4yoqeuq"] end # Code reloading can be explicitly enabled under the diff --git a/website/lib/website_web/highlight.ex b/website/lib/website_web/highlight.ex new file mode 100644 index 0000000..30ff5a9 --- /dev/null +++ b/website/lib/website_web/highlight.ex @@ -0,0 +1,104 @@ +defmodule DemoWeb.Highlight do + @moduledoc """ + Server-rendered syntax highlighting. + + Elixir runs through Makeup (`Makeup.Lexers.ElixirLexer`). Lua uses a + small hand-rolled tokenizer in this module โ€” `makeup_lua` doesn't + exist on Hex and the static snippets we render don't need a full + Lua 5.3 lexer. Both paths emit Pygments-style class names so the + same CSS in `app.css` styles them. + """ + + @lua_keywords ~w(and break do else elseif end for function goto + if in local not or repeat return then until while) + + @lua_kc ~w(true false nil) + + # Matches in priority order. Longest/most-specific patterns first. + # Each entry is {regex, css_class}. A `nil` class means "no span". + @lua_patterns [ + {~r/\A--\[\[[\s\S]*?(?:\]\]|\z)/, "cm"}, + {~r/\A--[^\r\n]*/, "c1"}, + {~r/\A"(?:\\.|[^"\\\r\n])*"/, "s2"}, + {~r/\A'(?:\\.|[^'\\\r\n])*'/, "s1"}, + {~r/\A\[\[[\s\S]*?(?:\]\]|\z)/, "s"}, + {~r/\A0[xX][\da-fA-F]+(?:\.[\da-fA-F]*)?(?:[pP][+-]?\d+)?/, "mh"}, + {~r/\A\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/, "mf"}, + {~r/\A(?:\.\.\.|\.\.|::|==|~=|<=|>=|<<|>>|\/\/|[+\-*\/%^#=<>~])/, "o"}, + {~r/\A[(){}\[\],;:.]/, "p"}, + {~r/\A[A-Za-z_][A-Za-z0-9_]*/, :ident}, + {~r/\A[\s]+/, nil} + ] + + @doc """ + Returns inner HTML for `source` highlighted in the given language, + ready to embed inside `
โ€ฆ
`. + + Supported: `:elixir`, `:lua`. Anything else falls back to escaped + plain text so an unknown language can never crash a page render. + """ + def to_html(source, language \\ :elixir) + + def to_html(source, :elixir) when is_binary(source) do + source + |> Makeup.highlight_inner_html(lexer: Makeup.Lexers.ElixirLexer) + |> Phoenix.HTML.raw() + end + + def to_html(source, :lua) when is_binary(source) do + source + |> tokenize_lua([]) + |> Phoenix.HTML.raw() + end + + def to_html(source, _other) when is_binary(source) do + Phoenix.HTML.html_escape(source) + end + + defp tokenize_lua("", acc), do: acc |> Enum.reverse() |> IO.iodata_to_binary() + + defp tokenize_lua(source, acc) do + {chunk, class, rest} = match_lua(source) + escaped = chunk |> Phoenix.HTML.html_escape() |> Phoenix.HTML.safe_to_string() + + fragment = + case class do + nil -> escaped + cls -> [~s(), escaped, ""] + end + + tokenize_lua(rest, [fragment | acc]) + end + + defp match_lua(source) do + Enum.find_value(@lua_patterns, fn {regex, class} -> + case Regex.run(regex, source, return: :index) do + [{0, len}] -> + {chunk, rest} = String.split_at(source, len) + {chunk, resolve_lua_class(class, chunk), rest} + + _ -> + nil + end + end) || fallback_lua(source) + end + + defp resolve_lua_class(:ident, chunk) do + cond do + chunk in @lua_kc -> "kc" + chunk in @lua_keywords -> "k" + true -> "n" + end + end + + defp resolve_lua_class(class, _chunk), do: class + + # No pattern matched (e.g. a stray UTF-8 char). Consume one codepoint + # raw so we make forward progress without blowing up the page. + defp fallback_lua(source) do + case String.next_codepoint(source) do + {cp, rest} -> {cp, nil, rest} + nil -> {"", nil, ""} + end + end +end diff --git a/website/lib/website_web/live/playground_live.ex b/website/lib/website_web/live/playground_live.ex index e8b2174..e6dc9be 100644 --- a/website/lib/website_web/live/playground_live.ex +++ b/website/lib/website_web/live/playground_live.ex @@ -24,13 +24,17 @@ defmodule DemoWeb.PlaygroundLive do def handle_params(params, _url, socket) do case params do %{"example" => id} -> - if Enum.any?(LuaSandbox.examples(), &(&1.id == id)) do + if Enum.any?(LuaSandbox.examples(), &(&1.id == id)) and + socket.assigns.active_example != id do + source = default_source(id) + {:noreply, socket |> assign(:active_example, id) - |> assign(:source, default_source(id)) + |> assign(:source, source) |> assign(:result, nil) - |> assign(:selected_block, 0)} + |> assign(:selected_block, 0) + |> push_event("lua-editor:set-source", %{source: source})} else {:noreply, socket} end @@ -46,12 +50,15 @@ defmodule DemoWeb.PlaygroundLive do end def handle_event("load-example", %{"id" => id}, socket) do + source = default_source(id) + {:noreply, socket |> assign(:active_example, id) - |> assign(:source, default_source(id)) + |> assign(:source, source) |> assign(:result, nil) |> assign(:selected_block, 0) + |> push_event("lua-editor:set-source", %{source: source}) |> push_patch(to: ~p"/playground/#{id}")} end @@ -85,7 +92,8 @@ defmodule DemoWeb.PlaygroundLive do socket |> assign(:source, "") |> assign(:result, nil) - |> assign(:selected_block, 0)} + |> assign(:selected_block, 0) + |> push_event("lua-editor:set-source", %{source: ""})} end @impl true @@ -242,13 +250,18 @@ defmodule DemoWeb.PlaygroundLive do <% end %> -
+
diff --git a/website/lib/website_web/live/tour_live.ex b/website/lib/website_web/live/tour_live.ex index 5aca9cb..d321100 100644 --- a/website/lib/website_web/live/tour_live.ex +++ b/website/lib/website_web/live/tour_live.ex @@ -52,10 +52,13 @@ defmodule DemoWeb.TourLive do end def handle_event("reset", _params, socket) do + source = socket.assigns.lesson.source + {:noreply, socket - |> assign(:source, socket.assigns.lesson.source) - |> assign(:result, nil)} + |> assign(:source, source) + |> assign(:result, nil) + |> push_event("lua-editor:set-source", %{source: source})} end def handle_event("toggle-bytecode", _, socket) do @@ -176,12 +179,17 @@ defmodule DemoWeb.TourLive do
-
+
diff --git a/website/lib/website_web/snippets.ex b/website/lib/website_web/snippets.ex new file mode 100644 index 0000000..0a04d1e --- /dev/null +++ b/website/lib/website_web/snippets.ex @@ -0,0 +1,146 @@ +defmodule DemoWeb.Snippets do + @moduledoc """ + Source for the rotating code snippets shown on the marketing pages. + + Keeping them in a module (rather than inline in `.heex`) sidesteps + heredoc-inside-heredoc escape headaches and makes the snippets + unit-testable. + """ + + @hero [ + %{ + label: "rules.exs", + source: """ + # Embed Lua in your Elixir app + # with a single function call. + + defmodule MyApp.Rules do + use Lua.API, scope: "rules" + + deflua double(n), do: n * 2 + end + + # Now your Elixir function is + # callable from any Lua script: + + lua = Lua.new() |> Lua.load_api(MyApp.Rules) + + {[10], _lua} = Lua.eval!(lua, "return rules.double(5)") + """ + }, + %{ + label: "sigil.exs", + source: ~S''' + # Compile Lua at compile-time with the + # ~LUA sigil. `c` returns a compiled chunk, + # ready to run on any state. + + import Lua, only: [sigil_LUA: 2] + + chunk = ~LUA""" + local total = 0 + for i = 1, 100 do total = total + i end + return total + """c + + {[5050], _state} = Lua.run(Lua.new(), chunk) + ''' + }, + %{ + label: "sandbox.exs", + source: """ + # Sandboxed by default. No file system, + # no os.execute, no surprise side-effects. + + lua = Lua.new() + + {:error, err} = + Lua.eval(lua, "return os.execute('rm -rf /')") + + # err.message =~ "attempted to call" + """ + } + ] + + @embed [ + %{ + label: "queue.exs", + source: """ + defmodule Queue do + use Lua.API, scope: "q" + + deflua push(v), state do + queue = Lua.get!(state, [:my_queue]) + + {[], state} = + Lua.call_function!( + state, + [:table, :insert], + [queue, v] + ) + + {[], state} + end + end + + lua = + Lua.new() + |> Lua.load_api(Queue) + |> Lua.set!([:my_queue], []) + + Lua.eval!(lua, \"\"\" + q.push("hello") + q.push("world") + \"\"\") + """ + }, + %{ + label: "formulas.exs", + source: """ + # Let your users define formulas in Lua + # that call back into your domain code. + + defmodule Pricing do + use Lua.API, scope: "pricing" + + deflua discount(amount, pct) do + amount * (1 - pct / 100) + end + end + + lua = Lua.new() |> Lua.load_api(Pricing) + + {[result], _} = + Lua.eval!(lua, "return pricing.discount(100, 15)") + """ + }, + %{ + label: "plugins.exs", + source: """ + # Plug-in system: ship a Lua VM per tenant, + # preload their script, and call into it. + + defmodule Tenant do + def run(script, event) do + Lua.new() + |> Lua.set!([:event], event) + |> Lua.eval!(script) + end + end + + script = ~S\"\"\" + if event.amount > 1000 then + return "review" + else + return "auto-approve" + end + \"\"\" + + {["review"], _} = Tenant.run(script, %{amount: 5_000}) + """ + } + ] + + def hero, do: @hero + def embed, do: @embed +end diff --git a/website/mix.exs b/website/mix.exs index d961c88..c0f0689 100644 --- a/website/mix.exs +++ b/website/mix.exs @@ -64,7 +64,9 @@ defmodule Demo.MixProject do {:gettext, "~> 1.0"}, {:jason, "~> 1.2"}, {:dns_cluster, "~> 0.2.0"}, - {:bandit, "~> 1.5"} + {:bandit, "~> 1.5"}, + {:makeup, "~> 1.2"}, + {:makeup_elixir, "~> 1.0"} ] end diff --git a/website/mix.lock b/website/mix.lock index 26e15a2..fa6950e 100644 --- a/website/mix.lock +++ b/website/mix.lock @@ -15,9 +15,12 @@ "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "jason": {:hex, :jason, "1.4.5", "2e3a008590b0b8d7388c20293e9dcc9cf3e5d642fd2a114e4cbbb52e595d940a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b0c823996102bcd0239b3c2444eb00409b72f6a140c1950bc8b457d836b30684"}, "lazy_html": {:hex, :lazy_html, "0.1.11", "136c8e9cd616b4f4e9c1562daa683880891120b759606dc4c3b6b18058ba5d79", [: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", "3b1be592929c31eca1a21673d25696e5c14cddfe922d9d1a3e3b48be4163883b"}, + "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, + "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"}, "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, "mint": {:hex, :mint, "1.8.0", "b964eaf4416f2dee2ba88968d52239fca5621b0402b9c95f55a08eb9d74803e9", [: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", "f3c572c11355eccf00f22275e9b42463bc17bd28db13be1e28f8e0bb4adbc849"}, "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"}, "phoenix": {:hex, :phoenix, "1.8.7", "d8d755b4ff4b449f610223dd706b4ae64155cb720d3dc09c706c079ecea189e4", [: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", "47352f72d6ab31009ef77516b1b3a14745be97b54061fd458031b9d8294869d5"}, "phoenix_html": {:hex, :phoenix_html, "4.3.0", "d3577a5df4b6954cd7890c84d955c470b5310bb49647f0a114a6eeecc850f7ad", [:mix], [], "hexpm", "3eaa290a78bab0f075f791a46a981bbe769d94bc776869f4f3063a14f30497ad"}, From b86ad6acea11e1f4e4785667a4383b78ab08471b Mon Sep 17 00:00:00 2001 From: Dave Lucia Date: Sun, 24 May 2026 21:38:30 -0400 Subject: [PATCH 03/20] content redesign --- mix.exs | 1 + mix.lock | 23 +- website/assets/css/app.css | 35 ++ website/assets/js/app.js | 201 +++++++++- website/lib/website/lua_sandbox.ex | 231 ++++++++++- website/lib/website_web/bytecode.ex | 229 +++++++++++ website/lib/website_web/components/layouts.ex | 234 +++++++++-- .../components/layouts/root.html.heex | 37 ++ .../controllers/page_controller.ex | 22 +- .../controllers/page_html/home.html.heex | 353 +++++++++++++++-- website/lib/website_web/live/opcodes_live.ex | 276 +++++++++++++ .../lib/website_web/live/playground_live.ex | 370 ++++++++---------- website/lib/website_web/live/tour_live.ex | 26 +- website/lib/website_web/router.ex | 1 + website/lib/website_web/snippets.ex | 42 ++ website/priv/static/images/favicon.svg | 14 + website/priv/static/images/og.svg | 110 ++++++ 17 files changed, 1934 insertions(+), 271 deletions(-) create mode 100644 website/lib/website_web/bytecode.ex create mode 100644 website/lib/website_web/live/opcodes_live.ex create mode 100644 website/priv/static/images/favicon.svg create mode 100644 website/priv/static/images/og.svg diff --git a/mix.exs b/mix.exs index 443605e..0096174 100644 --- a/mix.exs +++ b/mix.exs @@ -60,6 +60,7 @@ defmodule Lua.MixProject do # Run "mix help deps" to learn about dependencies. defp deps do [ + {:tidewave, "~> 0.5", only: [:dev]}, {:usage_rules, "~> 0.1", only: [:dev]}, {:ex_doc, "~> 0.38", only: :dev, runtime: false}, {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false}, diff --git a/mix.lock b/mix.lock index af5f7cb..fdd7c1d 100644 --- a/mix.lock +++ b/mix.lock @@ -1,34 +1,39 @@ %{ "benchee": {:hex, :benchee, "1.5.0", "4d812c31d54b0ec0167e91278e7de3f596324a78a096fd3d0bea68bb0c513b10", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}, {:statistex, "~> 1.1", [hex: :statistex, repo: "hexpm", optional: false]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "5b075393aea81b8ae74eadd1c28b1d87e8a63696c649d8293db7c4df3eb67535"}, + "circular_buffer": {:hex, :circular_buffer, "1.0.1", "01f0e3d5fe945080692cf6521c0988e9dbb5dc312831cefe77e5b63a4e658160", [:mix], [], "hexpm", "7d4ece3137d49c1f8dd0b3e0aa7c484f4d83a0be5d4b516c282085c1d5f2d7b9"}, "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, "dialyxir": {:hex, :dialyxir, "1.4.7", "dda948fcee52962e4b6c5b4b16b2d8fa7d50d8645bbae8b8685c3f9ecb7f5f4d", [:mix], [{:erlex, ">= 0.2.8", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b34527202e6eb8cee198efec110996c25c5898f43a4094df157f8d28f27d9efe"}, "earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"}, "erlex": {:hex, :erlex, "0.2.8", "cd8116f20f3c0afe376d1e8d1f0ae2452337729f68be016ea544a72f767d9c12", [:mix], [], "hexpm", "9d66ff9fedf69e49dc3fd12831e12a8a37b76f8651dd21cd45fcf5561a8a7590"}, + "ex_ast": {:hex, :ex_ast, "0.12.0", "052ad63711da41b7efbfb3490dbf3d757bb67caec17d02f6deb0db4a0363e5f6", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.7", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "66b4797f157d32f0a63c6da227515f78816c0ac8f621f6d7a2b22108e7b4dd85"}, "ex_doc": {:hex, :ex_doc, "0.39.2", "da5549bbce34c5fb0811f829f9f6b7a13d5607b222631d9e989447096f295c57", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "62665526a88c207653dbcee2aac66c2c229d7c18a70ca4ffc7f74f9e01324daa"}, - "finch": {:hex, :finch, "0.21.0", "b1c3b2d48af02d0c66d2a9ebfb5622be5c5ecd62937cf79a88a7f98d48a8290c", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "87dc6e169794cb2570f75841a19da99cfde834249568f2a5b121b809588a4377"}, + "finch": {:hex, :finch, "0.22.0", "5c48fa6f9706a78eb9036cacb67b8b996b4e66d111c543f4c29bb0f879a6806b", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.8", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b94e83c47780fc6813f746a1f1a34ee65cda42da4c5ea26a68f0acc4498e23dc"}, "glob_ex": {:hex, :glob_ex, "0.1.11", "cb50d3f1ef53f6ca04d6252c7fde09fd7a1cf63387714fe96f340a1349e62c93", [:mix], [], "hexpm", "342729363056e3145e61766b416769984c329e4378f1d558b63e341020525de4"}, "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, - "igniter": {:hex, :igniter, "0.7.2", "81c132c0df95963c7a228f74a32d3348773743ed9651f24183bfce0fe6ff16d1", [:mix], [{:glob_ex, "~> 0.1.7", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:owl, "~> 0.11", [hex: :owl, repo: "hexpm", optional: false]}, {:phx_new, "~> 1.7", [hex: :phx_new, repo: "hexpm", optional: true]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}, {:rewrite, ">= 1.1.1 and < 2.0.0-0", [hex: :rewrite, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.4", [hex: :sourceror, repo: "hexpm", optional: false]}, {:spitfire, ">= 0.1.3 and < 1.0.0-0", [hex: :spitfire, repo: "hexpm", optional: false]}], "hexpm", "f4cab73ec31f4fb452de1a17037f8a08826105265aa2d76486fcb848189bef9b"}, - "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, + "igniter": {:hex, :igniter, "0.8.0", "c7cab589440e5f20ff68e00f60eb094378114dab3105c0784ce8140f8dfdd2c0", [:mix], [{:ex_ast, "~> 0.5", [hex: :ex_ast, repo: "hexpm", optional: false]}, {:glob_ex, "~> 0.1.7", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:owl, "~> 0.11", [hex: :owl, repo: "hexpm", optional: false]}, {:phx_new, "~> 1.7", [hex: :phx_new, repo: "hexpm", optional: true]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}, {:rewrite, ">= 1.1.1 and < 2.0.0-0", [hex: :rewrite, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.4", [hex: :sourceror, repo: "hexpm", optional: false]}, {:spitfire, ">= 0.1.3 and < 1.0.0-0", [hex: :spitfire, repo: "hexpm", optional: false]}], "hexpm", "fcd99096fde4797f7b48bebddcfc58785569acd696346a3eb385bf813f47a7cc"}, + "jason": {:hex, :jason, "1.4.5", "2e3a008590b0b8d7388c20293e9dcc9cf3e5d642fd2a114e4cbbb52e595d940a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b0c823996102bcd0239b3c2444eb00409b72f6a140c1950bc8b457d836b30684"}, "luaport": {:hex, :luaport, "1.6.3", "df26eb476e4e8a372dc8c812f59ef3280b34743dc04ec339b646491a488b2560", [:rebar3], [], "hexpm", "3df1f51b82b62ed3b128d0d7c6caee4c5143c3bed498737f12302f7bf98b75a1"}, "luerl": {:hex, :luerl, "1.5.1", "f6700420950fc6889137e7a0c11c4a8467dea04a8c23f707a40d83566d14e786", [:rebar3], [], "hexpm", "abf88d849baa0d5dca93b245a8688d4de2ee3d588159bb2faf51e15946509390"}, "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, "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_erlang": {:hex, :makeup_erlang, "1.0.2", "03e1804074b3aa64d5fad7aa64601ed0fb395337b982d9bcf04029d68d51b6a7", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "af33ff7ef368d5893e4a267933e7744e46ce3cf1f61e2dccf53a111ed3aa3727"}, "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, - "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"}, + "mint": {:hex, :mint, "1.8.0", "b964eaf4416f2dee2ba88968d52239fca5621b0402b9c95f55a08eb9d74803e9", [: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", "f3c572c11355eccf00f22275e9b42463bc17bd28db13be1e28f8e0bb4adbc849"}, "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"}, "owl": {:hex, :owl, "0.13.0", "26010e066d5992774268f3163506972ddac0a7e77bfe57fa42a250f24d6b876e", [:mix], [{:ucwidth, "~> 0.2", [hex: :ucwidth, repo: "hexpm", optional: true]}], "hexpm", "59bf9d11ce37a4db98f57cb68fbfd61593bf419ec4ed302852b6683d3d2f7475"}, - "req": {:hex, :req, "0.5.17", "0096ddd5b0ed6f576a03dde4b158a0c727215b15d2795e59e0916c6971066ede", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "0b8bc6ffdfebbc07968e59d3ff96d52f2202d0536f10fef4dc11dc02a2a43e39"}, - "rewrite": {:hex, :rewrite, "1.2.0", "80220eb14010e175b67c939397e1a8cdaa2c32db6e2e0a9d5e23e45c0414ce21", [:mix], [{:glob_ex, "~> 0.1", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.0", [hex: :sourceror, repo: "hexpm", optional: false]}, {:text_diff, "~> 0.1", [hex: :text_diff, repo: "hexpm", optional: false]}], "hexpm", "a1cd702bbb9d51613ab21091f04a386d750fc6f4516b81900df082d78b2d8c50"}, - "sourceror": {:hex, :sourceror, "1.10.1", "325753ed460fe9fa34ebb4deda76d57b2e1507dcd78a5eb9e1c41bfb78b7cdfe", [:mix], [], "hexpm", "288f3079d93865cd1e3e20df5b884ef2cb440e0e03e8ae393624ee8a770ba588"}, - "spitfire": {:hex, :spitfire, "0.3.2", "476b7b5151fd053a864dae7b5eaeed01811e8b2ff3f24f3c048af1c9dfee5e3d", [:mix], [], "hexpm", "014f7b8c6dd45d1e3b08103c7e61515a590efc872441cf3e933a20efa4b5c46c"}, + "plug": {:hex, :plug, "1.19.2", "e4950525b22c6789dfb38a3f95d47171ba159da3fc5a33be9643b43d5e8adb98", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b6fce20a56af5e60fa5dfecf3f907bb98ec981be43c79a3809a499bc3d133de0"}, + "plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"}, + "req": {:hex, :req, "0.5.18", "48e6431cb4135e8a7815e745177485369a9b4a9924d5fe68ca00eb09ceaed1ef", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.21.0 or ~> 0.22.0", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "fa03812c440a9754bf34355e0c5d4f3ed316458db62e3284b7a352ef8dc0b996"}, + "rewrite": {:hex, :rewrite, "1.3.0", "67448ba7975690b35ba7e7f35717efcce317dbd5963cb0577aa7325c1923121a", [:mix], [{:glob_ex, "~> 0.1", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.0", [hex: :sourceror, repo: "hexpm", optional: false]}, {:text_diff, "~> 0.1", [hex: :text_diff, repo: "hexpm", optional: false]}], "hexpm", "d111ac7ff3a58a802ef4f193bbd1831e00a9c57b33276e5068e8390a212714a5"}, + "sourceror": {:hex, :sourceror, "1.12.0", "da354c5f35aad3cc1132f5d5b0d8437d865e2661c263260480bab51b5eedb437", [:mix], [], "hexpm", "755703683bd014ebcd5de9acc24b68fb874a660a568d1d63f8f98cd8a6ef9cd0"}, + "spitfire": {:hex, :spitfire, "0.3.12", "0f7780e4c6ea3753b65ea0c4924f3dfd5c21a51aaa734ffb9dd0b68d2544f27e", [:mix], [], "hexpm", "a389931287b85330c0e954ab06447e198516ab368a232a0200ed77ca13ca9acf"}, "statistex": {:hex, :statistex, "1.1.0", "7fec1eb2f580a0d2c1a05ed27396a084ab064a40cfc84246dbfb0c72a5c761e5", [:mix], [], "hexpm", "f5950ea26ad43246ba2cce54324ac394a4e7408fdcf98b8e230f503a0cba9cf5"}, "stream_data": {:hex, :stream_data, "1.2.0", "58dd3f9e88afe27dc38bef26fce0c84a9e7a96772b2925c7b32cd2435697a52b", [:mix], [], "hexpm", "eb5c546ee3466920314643edf68943a5b14b32d1da9fe01698dc92b73f89a9ed"}, "styler": {:hex, :styler, "1.10.1", "9229050c978bfaaab1d94e8673843576d0127d48fe64824a30babde3d6342475", [:mix], [], "hexpm", "d86cbcc70e8ab424393af313d1d885931ba9dc7c383d7dd30f4ab255a8d39f73"}, - "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, + "telemetry": {:hex, :telemetry, "1.4.2", "a0cb522801dffb1c49fe6e30561badffc7b6d0e180db1300df759faa22062855", [:rebar3], [], "hexpm", "928f6495066506077862c0d1646609eed891a4326bee3126ba54b60af61febb1"}, "text_diff": {:hex, :text_diff, "0.1.0", "1caf3175e11a53a9a139bc9339bd607c47b9e376b073d4571c031913317fecaa", [:mix], [], "hexpm", "d1ffaaecab338e49357b6daa82e435f877e0649041ace7755583a0ea3362dbd7"}, + "tidewave": {:hex, :tidewave, "0.5.6", "91f35540b5599640443f1d3a1c6166bf506e202840261a6344e384e8813c1f64", [:mix], [{:circular_buffer, "~> 0.4 or ~> 1.0", [hex: :circular_buffer, repo: "hexpm", optional: false]}, {:igniter, "~> 0.6", [hex: :igniter, repo: "hexpm", optional: true]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_live_reload, ">= 1.6.1", [hex: :phoenix_live_reload, repo: "hexpm", optional: true]}, {:plug, "~> 1.17", [hex: :plug, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}], "hexpm", "dc82d52b8b6ffc04680544b17cd340c7d4166bb0d63999eb960850526866b533"}, "usage_rules": {:hex, :usage_rules, "0.1.26", "19d38c8b9b5c35434eae44f7e4554caeb5f08037a1d45a6b059a9782543ac22e", [:mix], [{:igniter, ">= 0.6.6 and < 1.0.0-0", [hex: :igniter, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}], "hexpm", "9f0d203aa288e1b48318929066778ec26fc423fd51f08518c5b47f58ad5caca9"}, } diff --git a/website/assets/css/app.css b/website/assets/css/app.css index 3d5474f..943bc45 100644 --- a/website/assets/css/app.css +++ b/website/assets/css/app.css @@ -102,6 +102,41 @@ /* Make LiveView wrapper divs transparent for layout */ [data-phx-session], [data-phx-teleported-src] { display: contents } +/* Crescent Drop mark โ€” theme-aware CSS variables consumed by the + inline SVG defined in DemoWeb.Layouts.lua_mark/1 and lua_orbit/1. + Light theme: near-black ink drop with a Phoenix-orange satellite. + Dark theme: Elixir-purple drop with a near-white satellite. */ +:root { + --lua-drop-from: oklch(22% 0.04 280); + --lua-drop-to: oklch(32% 0.06 280); + --lua-satellite: oklch(70% 0.213 47.604); +} +[data-theme=dark] { + --lua-drop-from: oklch(58% 0.233 277.117); + --lua-drop-to: oklch(60% 0.25 292.717); + --lua-satellite: oklch(95% 0.02 280); +} + +/* Orbital satellite โ€” rotates around the SVG's geometric center. + `transform-box: view-box` resolves the origin in viewBox units so + `transform-origin: 32px 32px` is the center of our 64x64 viewBox. */ +.lua-orbit-satellite { + transform-box: view-box; + transform-origin: 32px 32px; +} + +@keyframes lua-orbit { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +@media (prefers-reduced-motion: no-preference) { + .lua-orbit-satellite { + animation: lua-orbit 24s linear infinite; + animation-delay: -12s; + } +} + /* This file is for your main application CSS */ /* Makeup syntax highlighting โ€” mapped to daisyUI theme tokens so it diff --git a/website/assets/js/app.js b/website/assets/js/app.js index 7220c31..7c93153 100644 --- a/website/assets/js/app.js +++ b/website/assets/js/app.js @@ -80,6 +80,9 @@ function themeExt() { return darkActive() ? oneDark : [] } +// localStorage key used by the playground editor's autosave. +const PLAYGROUND_STORAGE_KEY = "playground:source" + const LuaEditor = { mounted() { const textarea = this.el.querySelector("textarea") @@ -91,6 +94,21 @@ const LuaEditor = { textarea.setAttribute("tabindex", "-1") textarea.setAttribute("aria-hidden", "true") + const storageKey = this.el.dataset.storageKey + const restoreFromStorage = (() => { + if (!storageKey) return null + const url = new URL(window.location.href) + if (url.pathname !== "/playground") return null + if (url.searchParams.has("source")) return null + try { + const saved = window.localStorage.getItem(storageKey) + if (!saved || saved === textarea.value) return null + return saved + } catch (e) { + return null + } + })() + const submitForm = () => { const form = this.el.closest("form") if (form) form.requestSubmit() @@ -104,6 +122,34 @@ const LuaEditor = { // Trigger phx-change on the form this.textarea.dispatchEvent(new Event("input", {bubbles: true})) } + if (storageKey) { + try { + window.localStorage.setItem(storageKey, val) + } catch (e) { + /* quota or private mode โ€” ignore */ + } + } + } + + let lastLine = null + const pushLine = (n) => { + if (n == null) return + if (n === lastLine) return + lastLine = n + this.pushEvent("hover-line", {line: String(n)}) + } + + const pushCursorLine = () => { + const state = this.view.state + const head = state.selection.main.head + pushLine(state.doc.lineAt(head).number) + } + + const pushHoverLine = (event) => { + if (!this.view) return + const pos = this.view.posAtCoords({x: event.clientX, y: event.clientY}) + if (pos == null) return + pushLine(this.view.state.doc.lineAt(pos).number) } this.view = new EditorView({ @@ -136,15 +182,28 @@ const LuaEditor = { ]), EditorView.updateListener.of((update) => { if (update.docChanged) syncToTextarea() + if (update.docChanged || update.selectionSet) pushCursorLine() }), editorTheme, themeCompartment.of(themeExt()), ], }) + // Restore from localStorage if applicable, before sync. + if (restoreFromStorage) { + this.view.dispatch({ + changes: {from: 0, to: this.view.state.doc.length, insert: restoreFromStorage}, + }) + } + // Sync initial value (in case textarea had different value) syncToTextarea() + // Push line on mouse hover so users can scrub the editor and watch + // the bytecode panel light up without clicking. Throttled by line. + this.view.scrollDOM.addEventListener("mousemove", pushHoverLine) + this._hoverHandler = pushHoverLine + // Listen for server-pushed source updates (e.g. when loading an example) this.handleEvent("lua-editor:set-source", ({source, target}) => { if (target && target !== this.el.id) return @@ -155,6 +214,21 @@ const LuaEditor = { }) }) + // Listen for server-pushed cursor focus (e.g. clicking a bytecode row) + this.handleEvent("lua-editor:focus-line", ({line, target}) => { + if (target && target !== this.el.id) return + const lineNum = parseInt(line, 10) + if (!Number.isFinite(lineNum)) return + const doc = this.view.state.doc + if (lineNum < 1 || lineNum > doc.lines) return + const info = doc.line(lineNum) + this.view.dispatch({ + selection: {anchor: info.from}, + effects: EditorView.scrollIntoView(info.from, {y: "center"}), + }) + this.view.focus() + }) + // Listen for theme changes on the element so highlight updates live. this.themeObserver = new MutationObserver(() => { this.view.dispatch({effects: themeCompartment.reconfigure(themeExt())}) @@ -167,6 +241,9 @@ const LuaEditor = { destroyed() { if (this.themeObserver) this.themeObserver.disconnect() + if (this._hoverHandler && this.view) { + this.view.scrollDOM.removeEventListener("mousemove", this._hoverHandler) + } if (this.view) this.view.destroy() }, } @@ -245,7 +322,129 @@ if (document.readyState === "loading") { } window.addEventListener("phx:page-loading-stop", () => initCodeRotators()) -const hooks = {...colocatedHooks, LuaEditor} +// Compresses a string with gzip and returns a URL-safe base64 string +// without padding. Used for `?source=` shareable playground links. +async function gzipBase64Url(text) { + if (typeof CompressionStream === "undefined") { + // Fallback for older browsers: raw base64 (no compression). + return btoa(unescape(encodeURIComponent(text))) + .replace(/\+/g, "-") + .replace(/\//g, "_") + .replace(/=+$/, "") + } + const bytes = new TextEncoder().encode(text) + const stream = new Blob([bytes]).stream().pipeThrough(new CompressionStream("gzip")) + const gzipped = new Uint8Array(await new Response(stream).arrayBuffer()) + let bin = "" + for (let i = 0; i < gzipped.length; i++) bin += String.fromCharCode(gzipped[i]) + return btoa(bin).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "") +} + +const ShareSnippet = { + mounted() { + this.el.addEventListener("click", async (e) => { + e.preventDefault() + const textarea = document.getElementById("lua-source") + if (!textarea) return + const label = this.el.querySelector("[data-share-label]") + const original = label ? label.textContent : null + try { + const encoded = await gzipBase64Url(textarea.value || "") + const url = new URL(window.location.href) + url.pathname = "/playground" + url.search = "?source=" + encoded + const shareUrl = url.toString() + if (navigator.clipboard && window.isSecureContext) { + await navigator.clipboard.writeText(shareUrl) + } else { + // Fallback: temporary textarea + execCommand + const t = document.createElement("textarea") + t.value = shareUrl + t.style.position = "fixed" + t.style.opacity = "0" + document.body.appendChild(t) + t.select() + document.execCommand("copy") + document.body.removeChild(t) + } + // Replace current URL silently so the share state survives reloads + window.history.replaceState({}, "", shareUrl) + if (label) { + label.textContent = "Copied!" + this.el.classList.add("text-success") + setTimeout(() => { + label.textContent = original + this.el.classList.remove("text-success") + }, 1600) + } + } catch (err) { + console.error("Share failed:", err) + if (label) label.textContent = "Failed" + } + }) + }, +} + +// Document-level copy handler. Works for both LiveView- and controller- +// rendered pages because it delegates on bubbling click events. +// +// Usage on any element: +// +// +// +// Add a child to get a transient "Copied!" label +// after a successful copy. +async function doCopy(el) { + let text = el.dataset.copy + if (!text && el.dataset.copyTarget) { + const target = document.querySelector(el.dataset.copyTarget) + if (target) text = target.innerText + } + if (!text) return + const label = el.querySelector("[data-copy-label]") + const original = label ? label.textContent : null + try { + if (navigator.clipboard && window.isSecureContext) { + await navigator.clipboard.writeText(text) + } else { + const t = document.createElement("textarea") + t.value = text + t.style.position = "fixed" + t.style.opacity = "0" + document.body.appendChild(t) + t.select() + document.execCommand("copy") + document.body.removeChild(t) + } + if (label) { + label.textContent = "Copied!" + el.classList.add("text-success") + setTimeout(() => { + label.textContent = original + el.classList.remove("text-success") + }, 1400) + } + } catch (err) { + console.error("Copy failed:", err) + } +} + +document.addEventListener("click", (e) => { + const btn = e.target.closest("[data-copy], [data-copy-target]") + if (!btn) return + e.preventDefault() + doCopy(btn) +}) + +// LiveView hook stub โ€” still useful when a button needs the LiveView +// lifecycle (e.g. to fire pushEvent after a successful copy). +const CopyButton = { + mounted() { + // No-op: the document-level handler above already wires clicks. + }, +} + +const hooks = {...colocatedHooks, LuaEditor, ShareSnippet, CopyButton} const csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") const liveSocket = new LiveSocket("/live", Socket, { diff --git a/website/lib/website/lua_sandbox.ex b/website/lib/website/lua_sandbox.ex index 994d1e7..031ba60 100644 --- a/website/lib/website/lua_sandbox.ex +++ b/website/lib/website/lua_sandbox.ex @@ -430,6 +430,25 @@ defmodule Website.LuaSandbox do return (a + b).x, (a + b).y """ }, + %{ + id: "sandbox", + title: "Sandbox escape", + blurb: + "Watch the VM refuse to run dangerous stdlib calls โ€” this is the reason it's agent-ready.", + source: """ + -- The host process never had to defend itself. + local ok, err = pcall(function() + return os.execute("rm -rf /") + end) + print("os.execute ok?", ok) + print("err:", err) + + local ok2 = pcall(io.open, "/etc/passwd", "r") + print("io.open ok?", ok2) + + return ok, ok2 + """ + }, %{ id: "error", title: "Compile error", @@ -465,19 +484,22 @@ defmodule Website.LuaSandbox do @doc """ Returns the ordered list of tour lessons. Each lesson is a small - bite-sized snippet with prose and explanation. + bite-sized snippet with prose and explanation, plus an optional + one-sentence learning objective and a "try it" exercise prompt. """ def tour_lessons do [ %{ slug: "values", title: "Values & types", + objective: "Recognise Lua's eight types and how its dual integer/float numbers behave.", body: """ Lua has just eight types: `nil`, `boolean`, `number`, `string`, `function`, `userdata`, `thread`, and `table`. Numbers are 64-bit integers *or* floats โ€” Lua picks whichever fits. Strings are interned immutable byte sequences. """, + exercise: "Add a line that prints `type(3.0 == 3)` and predict the result before running.", source: """ print(type(nil), type(true), type(1), type(1.5)) print(type("hi"), type(print), type({})) @@ -487,11 +509,13 @@ defmodule Website.LuaSandbox do %{ slug: "control-flow", title: "Control flow", + objective: "Use `if`/`for`/`while` and learn which values Lua treats as falsy.", body: """ `if`/`elseif`/`else`, `while`, `repeat..until`, and both numeric and generic `for` loops. Falsy values are `nil` and `false` โ€” only. `0`, `""`, and `{}` are all truthy. """, + exercise: "Change the threshold in `sign` so that very-small floats are treated as zero.", source: """ local function sign(n) if n > 0 then return 1 @@ -506,11 +530,13 @@ defmodule Website.LuaSandbox do %{ slug: "tables", title: "Tables are everything", + objective: "Understand Lua's one data structure โ€” arrays, records, hashes, all in one shape.", body: """ Tables are *the* data structure: arrays, hash maps, records, objects, modules โ€” all tables. Indexed from `1` by convention, with `#t` giving the length of the array part. """, + exercise: "Add `t.kind = 'numeric'` and print `t.kind`. Does `#t` change?", source: """ local t = { 10, 20, 30, name = "trio" } print(t[1], t[2], t[3], t.name, #t) @@ -524,11 +550,14 @@ defmodule Website.LuaSandbox do %{ slug: "functions", title: "First-class functions", + objective: "Pass and return functions, and unpack multiple return values.", body: """ Functions are values. They can be passed around, returned, and stored in tables. Multiple return values are first-class: `return a, b, c`. """, + exercise: + "Capture only the *quotient* from `divmod(17, 5)` and discard the remainder โ€” what's the idiomatic way?", source: """ local function divmod(a, b) return a // b, a % b @@ -539,15 +568,68 @@ defmodule Website.LuaSandbox do return divmod(100, 7) """ }, + %{ + slug: "varargs", + title: "Varargs & multiple returns", + objective: "Use `...` to accept variable arguments and forward them with `select`.", + body: """ + A function declared with `...` receives any number of extra + arguments. `select("#", ...)` is the count, `select(n, ...)` is + the tail starting at position `n`. Multiple returns flatten + when they're the last expression in a call. + """, + exercise: + "Add a `min(...)` function next to `sum` that returns the smallest argument. Use `math.huge` as the seed.", + source: """ + local function sum(...) + local n = select("#", ...) + local total = 0 + for i = 1, n do total = total + select(i, ...) end + return total, n + end + + print(sum(1, 2, 3, 4, 5)) -- 15, 5 + print(sum()) -- 0, 0 + return sum(10, 20, 30) + """ + }, + %{ + slug: "method-syntax", + title: "Method syntax: `:` vs `.`", + objective: "Read OO-style Lua and know when `self` is implicitly passed.", + body: """ + `obj:method(args)` is sugar for `obj.method(obj, args)` โ€” the + colon implicitly threads `obj` as the first argument. Use `:` + when calling methods, and `function T:foo(...)` when declaring + them. The two forms below produce the same bytecode. + """, + exercise: "Toggle 'Bytecode' on and compare the disassembly for the two `greet` calls.", + source: """ + local Greeter = { lang = "en" } + + function Greeter:hello(name) + return self.lang .. ":hello " .. name + end + + local g = Greeter + print(g:hello("Ada")) -- method call + print(g.hello(g, "Joe")) -- equivalent + return g:hello("Linus") + """ + }, %{ slug: "closures", title: "Closures & upvalues", + objective: + "Capture an outer-scope binding and watch the `:closure` op build the function at runtime.", body: """ Inner functions capture outer locals by reference โ€” these captured bindings are called *upvalues*. Run this snippet and - click "Show bytecode" to watch the upvalue descriptors appear - on the closure. + click "Bytecode" to watch the `closure` opcode and the upvalue + descriptors on the prototype. """, + exercise: + "Make `make_adder` return *two* closures, one that adds and one that subtracts. They should share the same `n`.", source: """ local function make_adder(n) return function(x) return x + n end @@ -561,11 +643,14 @@ defmodule Website.LuaSandbox do %{ slug: "metatables", title: "Metatables", + objective: "Override operators and indexing to build OO-style classes from plain tables.", body: """ Every table can have a *metatable* that customises operators, indexing, and tostring. This is how Lua does inheritance, operator overloading, and OO โ€” all from one mechanism. """, + exercise: + "Add a `__tostring` metamethod on `Stack` that returns `'Stack(n=...)'` and `print(s)` it.", source: """ local Stack = {}; Stack.__index = Stack function Stack.new() return setmetatable({ n = 0 }, Stack) end @@ -581,11 +666,14 @@ defmodule Website.LuaSandbox do %{ slug: "strings", title: "Pattern matching", + objective: "Use Lua patterns โ€” smaller than regex, big enough for 90% of jobs.", body: """ Lua's pattern engine is smaller than regex but covers most needs: `%a` letters, `%d` digits, `%s` spaces, `*` zero-or-more, `+` one-or-more, captures with `()`. """, + exercise: + "Match an ISO date *with optional time* and capture only year/month/day, ignoring the rest.", source: """ local s = "2026-05-23 21:00:00" local y, m, d = string.match(s, "(%d+)-(%d+)-(%d+)") @@ -596,11 +684,14 @@ defmodule Website.LuaSandbox do %{ slug: "errors", title: "Errors & pcall", + objective: "Raise and catch errors without leaving the VM. No try/catch needed.", body: """ Errors are raised with `error()` and caught with `pcall` (or `xpcall` for a custom handler). No try/catch โ€” just protected calls returning a status and value. """, + exercise: + "Wrap the failing call with `xpcall` and a handler that prefixes the error with `'oops: '`.", source: """ local ok, err = pcall(function() error("boom!") @@ -611,6 +702,140 @@ defmodule Website.LuaSandbox do print(ok2, val) return ok, ok2 """ + }, + %{ + slug: "stdlib", + title: "The standard library", + objective: "Get comfortable with `string`, `table`, and `math` โ€” the three you'll reach for daily.", + body: """ + Lua ships a small but well-shaped stdlib. `string` has format, + upper/lower, find/match/gmatch/gsub, byte/char. `table` has + insert/remove/concat/sort/unpack. `math` has floor/ceil/abs/min/ + max/random/sqrt/log/sin/cos. There's no `os` or `io` in this + sandbox โ€” see the *Sandbox* lesson for why. + """, + exercise: "Sort `nums` in place using `table.sort(nums, function(a,b) return a > b end)` and print it.", + source: """ + local nums = { 5, 1, 4, 2, 3 } + print(table.concat(nums, ",")) + table.sort(nums) + print(table.concat(nums, ",")) + + print(string.format("pi โ‰ˆ %.5f", math.pi)) + return math.floor(math.pi), math.ceil(math.pi) + """ + }, + %{ + slug: "sandbox", + title: "The sandbox", + objective: "See what's blocked by default โ€” the reason this VM is agent-ready.", + body: """ + This playground runs your code in a sandboxed VM: dangerous + functions like `os.execute`, `io.open`, `require`, and `load` + are stubbed to raise. Those are the libraries a host + application typically locks down before exposing a scripting + surface to users or LLMs. The block below tries to escape; it + produces a friendly error instead of a catastrophe. + """, + exercise: + "Try your own escape โ€” `io.open('/etc/passwd', 'r')` or `require('os')`. Same outcome.", + source: """ + -- This is what the agent-tool pitch protects you from: + local ok, err = pcall(function() + return os.execute("rm -rf /") + end) + print("ok?", ok) + print("err:", err) + + -- The names exist, but they refuse to do real work: + local ok2 = pcall(io.open, "/etc/passwd", "r") + print("io.open?", ok2) + + return ok, ok2 + """ + }, + %{ + slug: "interop", + title: "Talking to Elixir", + objective: + "Read how `deflua` exposes Elixir functions to Lua โ€” the secret behind the agent-tool pitch.", + body: """ + This snippet runs on the playground sandbox, where only safe + Lua-level functions are exposed. In your *own* Elixir app you + can register any function with `deflua` and call it from Lua. + + The snippet on the right is what your host module looks like โ€” + we render it as a Lua call so you can see the bytecode that an + agent's script would compile to. The actual Elixir definition + of `pricing.discount` lives in your codebase. + """, + exercise: + "Add another call after the existing one with a different discount percentage. Watch the `call` opcode in the bytecode.", + source: """ + -- The Elixir side (in your project): + -- defmodule Pricing do + -- use Lua.API, scope: "pricing" + -- deflua discount(amount, pct), do: amount * (1 - pct/100) + -- end + -- + -- In the playground we stub `pricing` so you can see the shape: + pricing = { discount = function(amount, pct) + return amount * (1 - pct / 100) + end } + + local total = pricing.discount(100, 15) + print("after 15% off:", total) + return total + """ + }, + %{ + slug: "sigil", + title: "The `~LUA` sigil", + objective: + "Embed compile-time-validated Lua inside Elixir โ€” and pre-compile it for zero per-call parsing.", + body: """ + `~LUA"..."` parses your Lua at *Elixir compile time*. A typo in + the script becomes a compile error in your release, not a + runtime surprise on a Tuesday. Add the `c` modifier and the + sigil emits a pre-compiled `Lua.Chunk` โ€” repeated runs skip + the parser entirely. + + The snippet below is Elixir, not Lua โ€” but you can run the Lua + portion in the playground to see the bytecode the sigil + compiles to. + """, + exercise: + "Change `n + 1` to `n + ` (drop the operand) and run โ€” see the compile error path light up the editor.", + source: """ + -- The Lua body of `~LUA"..."c` โ€” try editing this and toggling + -- 'Bytecode' to see what your release would ship. + local total = 0 + for i = 1, 100 do total = total + i end + return total + """ + }, + %{ + slug: "bytecode", + title: "The bytecode model", + objective: + "Read a disassembled prototype: instructions, registers, upvalues, and nested protos.", + body: """ + The compiler in this library lowers Lua to a stream of + *register-based* opcodes โ€” no labels, no PC-relative jumps. + Each `function` becomes a `%Lua.Compiler.Prototype{}` with its + own register window and upvalue descriptors. Toggle 'Bytecode' + to see the layout. Full reference at + `/reference/opcodes`. + """, + exercise: + "Toggle 'Bytecode' on. Find the `closure` opcode that builds the inner function and the `call` that invokes it.", + source: """ + local function double(n) + return n * 2 + end + + return double(21) + """ } ] end diff --git a/website/lib/website_web/bytecode.ex b/website/lib/website_web/bytecode.ex new file mode 100644 index 0000000..3098911 --- /dev/null +++ b/website/lib/website_web/bytecode.ex @@ -0,0 +1,229 @@ +defmodule DemoWeb.Bytecode do + @moduledoc """ + Shared helpers for rendering register-based bytecode in HEEx templates. + + Centralises opcode colouring (`op_class/1`) and per-opcode argument + formatting (`format_args/2`) so the home-page teaser, playground, + tour, and opcode reference page all stay in sync. + """ + + @doc """ + Returns the Tailwind/DaisyUI class string for an opcode, used to + colour-code the mnemonic in disassembly listings. + """ + def op_class(:source_line), do: "text-base-content/40" + + def op_class(op) when op in [:return, :return_vararg, :tail_call], + do: "text-accent font-semibold" + + def op_class(op) when op in [:call, :closure, :self, :vararg], + do: "text-primary font-semibold" + + def op_class(op) + when op in [ + :test, + :test_true, + :test_and, + :test_or, + :while_loop, + :repeat_loop, + :numeric_for, + :generic_for, + :break, + :scope + ], + do: "text-warning font-semibold" + + def op_class(op) + when op in [ + :add, + :subtract, + :multiply, + :divide, + :floor_divide, + :modulo, + :power, + :concatenate, + :negate, + :equal, + :less_than, + :less_equal, + :length, + :not, + :bitwise_and, + :bitwise_or, + :bitwise_xor, + :shift_left, + :shift_right, + :bitwise_not + ], + do: "text-secondary font-semibold" + + def op_class(op) + when op in [:new_table, :set_list, :get_table, :set_table, :get_field, :set_field], + do: "text-info font-semibold" + + def op_class(_), do: "text-success font-semibold" + + @doc """ + Renders the argument list for an opcode as a human-readable string. + + Mirrors the formatting used by `Website.LuaSandbox.disassemble/1`'s + `:pretty` field, but exposed separately so callers can colour the + op mnemonic independently. + """ + def format_args(op, args), do: do_format(op, args) + + defp do_format(op, [a, b, c]) + when op in [ + :add, + :subtract, + :multiply, + :divide, + :floor_divide, + :modulo, + :power, + :concatenate, + :bitwise_and, + :bitwise_or, + :bitwise_xor, + :shift_left, + :shift_right, + :equal, + :less_than, + :less_equal + ], + do: "r#{a}, r#{b}, r#{c}" + + defp do_format(op, [a, b]) + when op in [:negate, :not, :length, :bitwise_not, :move], + do: "r#{a}, r#{b}" + + defp do_format(:load_constant, [d, val]), do: "r#{d}, #{format_lit(val)}" + defp do_format(:load_nil, [d, count]), do: "r#{d}, #{count}" + defp do_format(:load_boolean, [d, v]), do: "r#{d}, #{v}" + defp do_format(:load_env, [d]), do: "r#{d}" + defp do_format(:get_upvalue, [d, idx]), do: "r#{d}, up[#{idx}]" + defp do_format(:set_upvalue, [idx, s]), do: "up[#{idx}], r#{s}" + defp do_format(:get_open_upvalue, [d, r]), do: "r#{d}, r#{r}" + defp do_format(:set_open_upvalue, [r, s]), do: "r#{r}, r#{s}" + defp do_format(:get_global, [d, name]), do: ~s|r#{d}, _G["#{name}"]| + defp do_format(:set_global, [name, s]), do: ~s|_G["#{name}"], r#{s}| + defp do_format(:new_table, [d, a, h]), do: "r#{d}, array=#{a}, hash=#{h}" + defp do_format(:get_table, [d, t, k | _]), do: "r#{d}, r#{t}[#{format_arg(k)}]" + defp do_format(:set_table, [t, k, v | _]), do: "r#{t}[#{format_arg(k)}], r#{v}" + defp do_format(:get_field, [d, t, name | _]), do: ~s|r#{d}, r#{t}.#{name}| + defp do_format(:set_field, [t, name, v | _]), do: ~s|r#{t}.#{name}, r#{v}| + + defp do_format(:set_list, [t, s, c, o]), + do: "r#{t}, start=#{s}, count=#{c}, off=#{o}" + + defp do_format(:call, [b, ac, rc | _]), + do: "r#{b}, args=#{count_fmt(ac)}, results=#{count_fmt(rc)}" + + defp do_format(:tail_call, [b, ac | _]), do: "r#{b}, args=#{count_fmt(ac)}" + defp do_format(:return, [b, c]), do: "r#{b}, count=#{count_fmt(c)}" + defp do_format(:return_vararg, _), do: "(varargs)" + defp do_format(:vararg, [b, c]), do: "r#{b}, count=#{count_fmt(c)}" + defp do_format(:self, [b, o, name | _]), do: "r#{b}, r#{o}, .#{name}" + defp do_format(:closure, [d, idx]), do: "r#{d}, proto[#{idx}]" + defp do_format(:test, [r | _]), do: "r#{r}" + defp do_format(:test_true, [r | _]), do: "r#{r}" + defp do_format(:test_and, [d, s | _]), do: "r#{d}, r#{s}" + defp do_format(:test_or, [d, s | _]), do: "r#{d}, r#{s}" + defp do_format(:numeric_for, [b | _]), do: "r#{b}" + defp do_format(:generic_for, [b, vc | _]), do: "r#{b}, vars=#{vc}" + defp do_format(:scope, [n | _]), do: "registers=#{n}" + defp do_format(:source_line, [ln]), do: "line #{ln}" + defp do_format(_, args), do: args |> Enum.map(&format_arg/1) |> Enum.join(", ") + + defp format_arg({:constant, val}), do: format_lit(val) + defp format_arg({:global, name}), do: ~s|<#{name}>| + defp format_arg(atom) when is_atom(atom), do: inspect(atom) + defp format_arg(n) when is_integer(n), do: Integer.to_string(n) + defp format_arg(other), do: inspect(other, limit: 20) + + defp format_lit(val) when is_binary(val), do: inspect(val) + defp format_lit(val), do: inspect(val, limit: 20) + + defp count_fmt({:multi, n}), do: "multi(#{n})" + defp count_fmt(:varargs), do: "..." + defp count_fmt(n) when is_integer(n), do: Integer.to_string(n) + defp count_fmt(other), do: inspect(other) + + @doc """ + Returns a curated map of opcode โ†’ short human-readable description. + + Used by the opcode reference page and as tooltip text in the + playground. Not exhaustive โ€” covers the ops users will actually see + in the playground examples. + """ + def opcode_doc(op) do + Map.get(opcode_docs(), op) + end + + def opcode_docs do + %{ + load_env: "Load the global environment table (`_ENV`) into a register.", + load_constant: "Load a literal value (number, string, nil, bool) into a register.", + load_nil: "Set N consecutive registers to nil.", + load_boolean: "Load a boolean literal into a register.", + move: "Copy one register to another.", + get_global: "Read a global variable by name.", + set_global: "Write a global variable by name.", + get_upvalue: "Read a captured outer-scope binding (upvalue).", + set_upvalue: "Write a captured outer-scope binding (upvalue).", + get_open_upvalue: + "Read a still-on-the-stack upvalue (set before the parent function returned).", + set_open_upvalue: "Write an open upvalue while the parent is still live.", + new_table: "Allocate a new table with the given array/hash pre-sizing.", + get_table: "Read t[k] into a register.", + set_table: "Write t[k] from a register.", + get_field: "Read t.name (string-keyed field) โ€” faster path than get_table.", + set_field: "Write t.name from a register.", + set_list: "Bulk-write a slice of registers into the array part of a table.", + self: + "Method-call shim: load t and t.name into adjacent registers for `obj:method(...)`.", + closure: "Build a closure from a nested prototype, capturing its upvalues.", + call: "Call a function. Args/results encoded as fixed counts, multi, or varargs.", + tail_call: "Tail-position call โ€” replaces the current frame instead of pushing.", + return: "Return zero or more values from the current function.", + return_vararg: "Return whatever varargs the current function received.", + vararg: "Materialise `...` into consecutive registers.", + add: "Numeric addition.", + subtract: "Numeric subtraction.", + multiply: "Numeric multiplication.", + divide: "Float division (`/`).", + floor_divide: "Integer floor division (`//`).", + modulo: "Modulo (`%`).", + power: "Exponentiation (`^`).", + negate: "Numeric negation.", + concatenate: "String concatenation (`..`).", + length: "`#x` โ€” string length, array length, or `__len` metamethod.", + not: "Logical not.", + equal: "Equality comparison (`==`).", + less_than: "Less-than comparison (`<`).", + less_equal: "Less-or-equal comparison (`<=`).", + bitwise_and: "Bitwise AND (`&`).", + bitwise_or: "Bitwise OR (`|`).", + bitwise_xor: "Bitwise XOR (`~` binary).", + bitwise_not: "Bitwise NOT (`~` unary).", + shift_left: "Bit shift left (`<<`).", + shift_right: "Bit shift right (`>>`).", + test: "If register is truthy, run the next continuation; else fall through.", + test_true: "If register is truthy, fall through; else skip.", + test_and: + "Short-circuit AND: if src is falsy, copy to dest and skip; else continue.", + test_or: + "Short-circuit OR: if src is truthy, copy to dest and skip; else continue.", + while_loop: "While-loop control: test, body, jump back.", + repeat_loop: "Repeat-until control: body, test, jump back.", + numeric_for: + "Numeric for-loop: increments the loop variable and continues until done.", + generic_for: "Generic for-loop over an iterator (`pairs`, `ipairs`, custom).", + break: "Jump out of the nearest enclosing loop.", + scope: "Allocate a new register-window for the enclosing block.", + source_line: "Source-line marker (used for error traces and stepping)." + } + end +end diff --git a/website/lib/website_web/components/layouts.ex b/website/lib/website_web/components/layouts.ex index 6943da9..21ba0a3 100644 --- a/website/lib/website_web/components/layouts.ex +++ b/website/lib/website_web/components/layouts.ex @@ -57,14 +57,12 @@ defmodule DemoWeb.Layouts do Lua.ex -
-
- -
- - + + - <.tour_output result={@result} running={@running} /> + <%= if runnable?(@lesson) do %> + <.tour_output result={@result} running={@running} /> + <% end %> + <% end %> <%= if ex = Map.get(@lesson, :exercise) do %>
@@ -221,11 +296,27 @@ defmodule DemoWeb.TourLive do
<% end %> - <%= if @show_bytecode do %> + <%= if @show_bytecode and has_editor?(@lesson) and runnable?(@lesson) do %> <.tour_bytecode source={@source} result={@result} /> <% end %> -
+ <%= if (refs = Map.get(@lesson, :see_also)) && refs != [] do %> +
+ + See also + + <%= for slug <- refs, target = lesson_by_slug(@lessons, slug), target != nil do %> + <.link + patch={~p"/tour/#{target.slug}"} + class="inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs bg-base-200 hover:bg-base-300/70 border border-base-300/60 text-base-content/80" + > + {target.title} + + <% end %> +
+ <% end %> + +
<%= if prev = prev_lesson(@lessons, @lesson) do %> <.link patch={~p"/tour/#{prev.slug}"} class="btn btn-ghost"> <.icon name="hero-arrow-left-micro" class="size-4" /> {prev.title} @@ -364,11 +455,39 @@ defmodule DemoWeb.TourLive do defp format_us(us) when is_integer(us), do: "#{Float.round(us / 1_000_000, 3)} s" + defp roman(1), do: "I" + defp roman(2), do: "II" + defp roman(3), do: "III" + defp roman(4), do: "IV" + defp roman(5), do: "V" + defp roman(n), do: Integer.to_string(n) + + defp chapter_label(chapter) do + case Enum.find_index(LuaSandbox.chapters(), fn {slug, _} -> slug == chapter end) do + nil -> "?" + idx -> roman(idx + 1) + end + end + + # Markdown-lite for lesson body / objective / exercise text: + # `code` โ†’ styled inline code + # [text](url) โ†’ anchor (external links open a new tab) defp render_inline(text) do - text - |> String.replace( - ~r/`([^`]+)`/, - ~s|\\1| - ) + text = + Regex.replace(~r/\[([^\]]+)\]\(([^)]+)\)/, text, fn _full, anchor, url -> + link_html(anchor, url) + end) + + Regex.replace(~r/`([^`]+)`/, text, fn _full, code -> + ~s|#{code}| + end) + end + + defp link_html(text, "http" <> _ = url) do + ~s|#{text}| + end + + defp link_html(text, url) do + ~s|#{text}| end end diff --git a/website/test/website/lua_examples_test.exs b/website/test/website/lua_examples_test.exs index 914066e..eda23b0 100644 --- a/website/test/website/lua_examples_test.exs +++ b/website/test/website/lua_examples_test.exs @@ -3,11 +3,18 @@ defmodule Website.LuaExamplesTest do alias Website.LuaSandbox + # Lessons marked `runnable: false` (e.g. coroutines) ship a snippet for + # display but can't execute under the current sandbox. They're covered + # by the rubric tests below; we just skip them from the run-it loop. + @runnable_tour Enum.filter(LuaSandbox.tour_lessons(), &Map.get(&1, :runnable, true)) + @all Enum.map(LuaSandbox.home_snippets(), &{"home", &1}) ++ Enum.map(LuaSandbox.examples(), &{"playground", &1}) ++ - Enum.map(LuaSandbox.tour_lessons(), &{"tour", &1}) + Enum.map(@runnable_tour, &{"tour", &1}) - for {source, example} <- @all do + # Lessons without a `:source` (e.g. the closing "where next" page) are + # prose-only and have nothing to compile or run. + for {source, example} <- @all, Map.has_key?(example, :source) do @example example @expect Map.get(example, :expect, :ok) @label "#{source}/#{example[:id] || example[:slug]}" @@ -39,4 +46,108 @@ defmodule Website.LuaExamplesTest do end end end + + describe "tour rubric" do + @lessons LuaSandbox.tour_lessons() + + test "every lesson belongs to a known chapter" do + known = Map.new(LuaSandbox.chapters()) + + for lesson <- @lessons do + assert is_atom(lesson.chapter) and Map.has_key?(known, lesson.chapter), + "lesson #{lesson.slug} has unknown chapter #{inspect(lesson.chapter)}" + end + end + + test "every lesson has a non-empty slug, title, objective, body" do + for lesson <- @lessons do + for key <- [:slug, :title, :objective, :body] do + val = Map.fetch!(lesson, key) + + assert is_binary(val) and val != "", + "lesson #{lesson.slug} missing #{key} (got #{inspect(val)})" + end + end + end + + test "every lesson title is <= 32 characters" do + for %{slug: slug, title: title} <- @lessons do + assert String.length(title) <= 32, + "lesson #{slug} title too long (#{String.length(title)}): #{inspect(title)}" + end + end + + test "every lesson body is <= 90 words" do + for %{slug: slug, body: body} <- @lessons do + words = body |> String.split(~r/\s+/, trim: true) |> length() + + assert words <= 90, + "lesson #{slug} body has #{words} words (limit 90)" + end + end + + test "lesson source is within the chapter's line budget" do + for lesson <- @lessons, + source = Map.get(lesson, :source), + is_binary(source) do + line_count = source |> String.trim_trailing() |> String.split("\n") |> length() + limit = if lesson.chapter == :integration, do: 12, else: 18 + + assert line_count <= limit, + "lesson #{lesson.slug} (#{lesson.chapter}) has #{line_count} source lines (limit #{limit})" + end + end + + test "every `see_also` slug points at a real lesson" do + slugs = MapSet.new(@lessons, & &1.slug) + + for lesson <- @lessons, + ref <- Map.get(lesson, :see_also, []) do + assert MapSet.member?(slugs, ref), + "lesson #{lesson.slug} references unknown see_also #{inspect(ref)}" + end + end + + test "chapter IV lessons carry an `:elixir_source` companion pane" do + for lesson <- @lessons, lesson.chapter == :integration do + assert is_binary(Map.get(lesson, :elixir_source)) and + Map.get(lesson, :elixir_source) != "", + "integration lesson #{lesson.slug} missing :elixir_source" + end + end + + test "every named Lua.ex API in chapter IV resolves at runtime" do + # Catches API drift: if Lua.ex renames or removes one of these + # symbols, the tour's Chapter IV goes silently stale. + lua_funcs = [ + {Lua, :new, 0}, + {Lua, :eval!, 2}, + {Lua, :set!, 3}, + {Lua, :get!, 2}, + {Lua, :get!, 3}, + {Lua, :call_function!, 3}, + {Lua, :load_api, 2}, + {Lua, :put_private, 3}, + {Lua, :get_private!, 2} + ] + + for {mod, fun, arity} <- lua_funcs do + Code.ensure_loaded(mod) + + assert function_exported?(mod, fun, arity), + "Lua.ex API drift: #{inspect(mod)}.#{fun}/#{arity} no longer exists" + end + + # Macros aren't reported by function_exported?, so check separately. + Code.ensure_loaded(Lua) + + assert macro_exported?(Lua, :sigil_LUA, 2), + "Lua.ex API drift: Lua.sigil_LUA/2 macro no longer exists" + + Code.ensure_loaded(Lua.API) + + assert macro_exported?(Lua.API, :deflua, 2) or macro_exported?(Lua.API, :deflua, 3), + "Lua.ex API drift: Lua.API.deflua macro no longer exists" + end + end end From db0e4f0ec52a1b983b9e9b2f4802fcf2c8273969 Mon Sep 17 00:00:00 2001 From: Dave Lucia Date: Mon, 25 May 2026 08:25:31 -0400 Subject: [PATCH 11/20] cleanup --- website/lib/website_web/components/layouts.ex | 24 +++ .../controllers/page_html/home.html.heex | 10 + website/priv/static/images/og.svg | 171 +++++++----------- 3 files changed, 97 insertions(+), 108 deletions(-) diff --git a/website/lib/website_web/components/layouts.ex b/website/lib/website_web/components/layouts.ex index 41216f0..36fc88a 100644 --- a/website/lib/website_web/components/layouts.ex +++ b/website/lib/website_web/components/layouts.ex @@ -298,6 +298,30 @@ defmodule DemoWeb.Layouts do attr :class, :string, default: "" + @doc """ + TV Labs wordmark (brand mark + "tv labs" lockup). Color inherits from `currentColor`. + """ + def tvlabs_wordmark(assigns) do + ~H""" + + + + + + + + + + """ + end + + attr :class, :string, default: "" + def lua_orbit(assigns) do ~H""" Zero NIFs, zero C
+ + + Built at + +
diff --git a/website/priv/static/images/og.svg b/website/priv/static/images/og.svg index 2a1db16..810aa80 100644 --- a/website/priv/static/images/og.svg +++ b/website/priv/static/images/og.svg @@ -1,156 +1,111 @@ - + - - - - + + + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - + - - - - - - + + - + - - - - + - - - + - - + Lua.ex - - LUA 5.3 ON THE BEAM - - - + + Lua, on the - + BEAM. - - - Scriptable. Sandboxed. Stupid easy. + + + A pure-Elixir Lua 5.3 VM. + + + Sandboxed, scriptable, agent-ready. - - - - - - Pure Elixir VM - - - - - Sandboxed - - - - - Agent-ready - + + + PURE ELIXIR VMยทSANDBOXEDยทDEFLUA MACRO + + + + + github.com/tv-labs/lua + + + + + + + + + + + + + BUILT AT + + + + + - - - - - - - - - - - - agent_tools.exs + + + + + agent_tools.exs - - defmodule MyAgent.Tools do - use Lua.API, scope: "tools" + + defmodule MyAgent.Tools do + use Lua.API, scope: "tools" - deflua search(query) do - MyApp.Search.run(query) - end + deflua search(query) do + MyApp.Search.run(query) + end - end + end - # One sandboxed VM per chat. - lua = Lua.new() - |> Lua.load_api(MyAgent.Tools) + # one sandboxed VM per chat + lua = Lua.new() + |> Lua.load_api(MyAgent.Tools) - Lua.eval!(lua, llm_script) + Lua.eval!(lua, llm_script) - - - - deflua.com - ยท - hexdocs.pm/lua - ยท - github.com/tv-labs/lua - From 9da506a4040c6b183b7c36e9b70bdb63553266d3 Mon Sep 17 00:00:00 2001 From: Dave Lucia Date: Mon, 25 May 2026 08:32:11 -0400 Subject: [PATCH 12/20] website: polish hero TV Labs attribution + tighten OG image Lift the TV Labs wordmark slightly and bump to h-6 so it sits flush with the "BUILT AT" label, and tighten hero bottom padding so the section doesn't leave a visual gap below the new attribution row. --- .../controllers/page_html/home.html.heex | 4 ++-- website/priv/static/images/og.png | Bin 219997 -> 94750 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/website/lib/website_web/controllers/page_html/home.html.heex b/website/lib/website_web/controllers/page_html/home.html.heex index 4a42374..e693b3d 100644 --- a/website/lib/website_web/controllers/page_html/home.html.heex +++ b/website/lib/website_web/controllers/page_html/home.html.heex @@ -18,7 +18,7 @@ >
-
+
@@ -69,7 +69,7 @@ class="mt-8 inline-flex items-center gap-2.5 text-sm text-base-content/55 hover:text-base-content transition-colors group" > Built at - +
diff --git a/website/priv/static/images/og.png b/website/priv/static/images/og.png index 7e493e49dde97c9f03491d8560f29ed7d16e6da5..c261f2cba282733f2851338387ca1cb2b7c6cbed 100644 GIT binary patch literal 94750 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 bhFdfX*{XmYOsNfUTEtmRLsZe}i{bwVf6RG$ literal 219997 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�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 Date: Mon, 25 May 2026 10:38:48 -0400 Subject: [PATCH 13/20] mobile fixes --- website/assets/css/app.css | 10 + website/lib/website_web/components/layouts.ex | 291 +++++++++++------- website/lib/website_web/live/tour_live.ex | 105 ++++--- 3 files changed, 254 insertions(+), 152 deletions(-) diff --git a/website/assets/css/app.css b/website/assets/css/app.css index 943bc45..cf4ff2f 100644 --- a/website/assets/css/app.css +++ b/website/assets/css/app.css @@ -102,6 +102,16 @@ /* Make LiveView wrapper divs transparent for layout */ [data-phx-session], [data-phx-teleported-src] { display: contents } +/* Restore the standard
collapse behavior. Tailwind v4 + daisyUI + preflight removes the user-agent rule that hides non-summary children when + the disclosure is closed, which breaks the mobile nav/footer/tour + collapsibles. Site code re-overrides this with `lg:[&>...]:!block` / + `sm:[&>...]:!block` where the content must remain visible at larger + viewports regardless of the `open` attribute. */ +details:not([open]) > *:not(summary) { + display: none; +} + /* Crescent Drop mark โ€” theme-aware CSS variables consumed by the inline SVG defined in DemoWeb.Layouts.lua_mark/1 and lua_orbit/1. Light theme: near-black ink drop with a Phoenix-orange satellite. diff --git a/website/lib/website_web/components/layouts.ex b/website/lib/website_web/components/layouts.ex index 36fc88a..15ef66e 100644 --- a/website/lib/website_web/components/layouts.ex +++ b/website/lib/website_web/components/layouts.ex @@ -51,7 +51,7 @@ defmodule DemoWeb.Layouts do def site_nav(assigns) do ~H"""
-
+
<.lua_mark class="h-8 w-8 transition-transform group-hover:rotate-12" /> @@ -93,6 +93,64 @@ defmodule DemoWeb.Layouts do Try it <.icon name="hero-arrow-right-micro" class="size-4" /> + +
""" @@ -118,10 +176,10 @@ defmodule DemoWeb.Layouts do def site_footer(assigns) do ~H""" -