Initial commit: Pi Station - Pi Day party game
Torey Heinz
committed Mar 14, 2026
commit 9109710b8ef6b76662e75e332cabc50d9f65e7cb
Showing 67
changed files with
5589 additions
and 0 deletions
.formatter.exs
+6
-0
| @@ | @@ -0,0 +1,6 @@ |
| + | [ |
| + | import_deps: [:ecto, :ecto_sql, :phoenix], |
| + | subdirectories: ["priv/*/migrations"], |
| + | plugins: [Phoenix.LiveView.HTMLFormatter], |
| + | inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"] |
| + | ] |
.gitignore
+37
-0
| @@ | @@ -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"). |
| + | pi_day-*.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/ |
| + | |
README.md
+18
-0
| @@ | @@ -0,0 +1,18 @@ |
| + | # PiDay |
| + | |
| + | 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 |
assets/css/app.css
+105
-0
| @@ | @@ -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/pi_day_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 */ |
assets/js/app.js
+83
-0
| @@ | @@ -0,0 +1,83 @@ |
| + | // 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 `<link>` 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/pi_day" |
| + | import topbar from "../vendor/topbar" |
| + | |
| + | const csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") |
| + | const liveSocket = new LiveSocket("/live", Socket, { |
| + | longPollFallbackMs: 2500, |
| + | params: {_csrf_token: csrfToken}, |
| + | hooks: {...colocatedHooks}, |
| + | }) |
| + | |
| + | // 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 |
| + | }) |
| + | } |
| + | |
assets/js/game.js
+148
-0
| @@ | @@ -0,0 +1,148 @@ |
| + | import Phaser from "phaser" |
| + | import { Socket, Presence } from "phoenix" |
| + | import { HubScene } from "./game/HubScene" |
| + | import { PiMemoryGame } from "./game/PiMemoryGame" |
| + | import { MonteCarloGame } from "./game/MonteCarloGame" |
| + | import { SliceThePiGame } from "./game/SliceThePiGame" |
| + | |
| + | // --- Phoenix Socket Connection --- |
| + | const socket = new Socket("/game_socket", { |
| + | params: { token: window.PLAYER_TOKEN } |
| + | }) |
| + | socket.connect() |
| + | |
| + | const hubChannel = socket.channel("game:hub", {}) |
| + | const miniChannel = (gameType) => { |
| + | const ch = socket.channel(`game:mini:${gameType}`, {}) |
| + | ch.join() |
| + | return ch |
| + | } |
| + | |
| + | const presence = new Presence(hubChannel) |
| + | |
| + | // --- Phaser Game Config --- |
| + | const config = { |
| + | type: Phaser.AUTO, |
| + | parent: "game-canvas", |
| + | width: 800, |
| + | height: 600, |
| + | backgroundColor: "#0a0a2e", |
| + | scale: { |
| + | mode: Phaser.Scale.FIT, |
| + | autoCenter: Phaser.Scale.CENTER_BOTH, |
| + | }, |
| + | scene: [HubScene], |
| + | physics: { |
| + | default: "arcade", |
| + | arcade: { debug: false } |
| + | }, |
| + | input: { |
| + | activePointers: 2, |
| + | } |
| + | } |
| + | |
| + | const game = new Phaser.Game(config) |
| + | |
| + | // Pass dependencies to scene |
| + | game.registry.set("hubChannel", hubChannel) |
| + | game.registry.set("presence", presence) |
| + | game.registry.set("socket", socket) |
| + | game.registry.set("miniChannel", miniChannel) |
| + | |
| + | // Join hub channel |
| + | hubChannel.join() |
| + | .receive("ok", () => console.log("Joined hub!")) |
| + | .receive("error", (resp) => console.error("Unable to join hub", resp)) |
| + | |
| + | // --- Mini-game Manager (exposed globally for HTML overlay) --- |
| + | window.piStation = { |
| + | openMiniGame(gameType) { |
| + | const overlay = document.getElementById("mini-game-overlay") |
| + | const content = document.getElementById("mini-game-content") |
| + | overlay.classList.add("active") |
| + | |
| + | // Notify hub we're in a game |
| + | hubChannel.push("enter_game", { game: gameType }) |
| + | |
| + | const channel = miniChannel(gameType) |
| + | |
| + | switch (gameType) { |
| + | case "pi_memory": |
| + | PiMemoryGame.start(content, channel) |
| + | break |
| + | case "monte_carlo": |
| + | MonteCarloGame.start(content, channel) |
| + | break |
| + | case "slice_the_pi": |
| + | SliceThePiGame.start(content, channel) |
| + | break |
| + | } |
| + | |
| + | window.piStation._currentChannel = channel |
| + | window.piStation._currentGame = gameType |
| + | }, |
| + | |
| + | closeMiniGame() { |
| + | const overlay = document.getElementById("mini-game-overlay") |
| + | overlay.classList.remove("active") |
| + | |
| + | // Clear content safely |
| + | const content = document.getElementById("mini-game-content") |
| + | while (content.firstChild) content.removeChild(content.firstChild) |
| + | |
| + | hubChannel.push("leave_game", {}) |
| + | |
| + | if (window.piStation._currentChannel) { |
| + | window.piStation._currentChannel.leave() |
| + | window.piStation._currentChannel = null |
| + | } |
| + | window.piStation._currentGame = null |
| + | }, |
| + | |
| + | _currentChannel: null, |
| + | _currentGame: null, |
| + | } |
| + | |
| + | // --- Players List UI (using safe DOM methods) --- |
| + | const playersListEl = document.getElementById("players-list") |
| + | |
| + | const avatarSymbols = { |
| + | pi: "\u03C0", sigma: "\u03A3", delta: "\u0394", omega: "\u03A9", |
| + | theta: "\u03B8", lambda: "\u03BB", phi: "\u03C6", psi: "\u03C8", |
| + | epsilon: "\u03B5", zeta: "\u03B6" |
| + | } |
| + | |
| + | function updatePlayersList() { |
| + | const players = [] |
| + | presence.list((id, { metas: [meta] }) => { |
| + | players.push({ id, ...meta }) |
| + | }) |
| + | |
| + | players.sort((a, b) => (b.score || 0) - (a.score || 0)) |
| + | |
| + | // Clear existing entries safely |
| + | while (playersListEl.firstChild) playersListEl.removeChild(playersListEl.firstChild) |
| + | |
| + | players.forEach(p => { |
| + | const entry = document.createElement("div") |
| + | entry.className = "player-entry" |
| + | |
| + | const avatar = document.createElement("span") |
| + | avatar.className = "player-avatar" |
| + | avatar.textContent = avatarSymbols[p.avatar_key] || "?" |
| + | |
| + | const name = document.createElement("span") |
| + | name.textContent = p.name |
| + | |
| + | const score = document.createElement("span") |
| + | score.className = "player-score" |
| + | score.textContent = p.score || 0 |
| + | |
| + | entry.appendChild(avatar) |
| + | entry.appendChild(name) |
| + | entry.appendChild(score) |
| + | playersListEl.appendChild(entry) |
| + | }) |
| + | } |
| + | |
| + | presence.onSync(() => updatePlayersList()) |
assets/js/game/HubScene.js
+361
-0
| @@ | @@ -0,0 +1,361 @@ |
| + | import Phaser from "phaser" |
| + | import nipplejs from "nipplejs" |
| + | |
| + | const AVATAR_SYMBOLS = { |
| + | pi: "\u03C0", sigma: "\u03A3", delta: "\u0394", omega: "\u03A9", |
| + | theta: "\u03B8", lambda: "\u03BB", phi: "\u03C6", psi: "\u03C8", |
| + | epsilon: "\u03B5", zeta: "\u03B6" |
| + | } |
| + | |
| + | const AVATAR_COLORS = { |
| + | pi: 0x06b6d4, sigma: 0x8b5cf6, delta: 0xf59e0b, omega: 0xef4444, |
| + | theta: 0x22c55e, lambda: 0xec4899, phi: 0x3b82f6, psi: 0xf97316, |
| + | epsilon: 0x14b8a6, zeta: 0xa855f7 |
| + | } |
| + | |
| + | // Game station definitions |
| + | const STATIONS = [ |
| + | { x: 150, y: 150, game: "pi_memory", label: "Pi Memory\nSprint", icon: "\u{1F9E0}", color: 0x06b6d4 }, |
| + | { x: 650, y: 150, game: "monte_carlo", label: "Monte Carlo\nPi", icon: "\u{1F3AF}", color: 0x8b5cf6 }, |
| + | { x: 400, y: 450, game: "slice_the_pi", label: "Slice\nthe Pi", icon: "\u{1FA93}", color: 0xf59e0b }, |
| + | ] |
| + | |
| + | export class HubScene extends Phaser.Scene { |
| + | constructor() { |
| + | super({ key: "HubScene" }) |
| + | this.otherPlayers = {} |
| + | this.moveSpeed = 200 |
| + | this.joystickVector = { x: 0, y: 0 } |
| + | } |
| + | |
| + | create() { |
| + | this.hubChannel = this.registry.get("hubChannel") |
| + | this.presence = this.registry.get("presence") |
| + | |
| + | this.drawRoom() |
| + | this.createStations() |
| + | this.createPlayer() |
| + | this.setupControls() |
| + | this.setupPresence() |
| + | this.setupChat() |
| + | |
| + | // Title text |
| + | this.add.text(400, 30, "Pi Station", { |
| + | fontSize: "24px", fontFamily: "monospace", color: "#a78bfa", |
| + | }).setOrigin(0.5) |
| + | |
| + | // Instructions |
| + | this.add.text(400, 570, "Walk to a station and tap it to play!", { |
| + | fontSize: "14px", fontFamily: "monospace", color: "#6366f1", |
| + | }).setOrigin(0.5) |
| + | } |
| + | |
| + | drawRoom() { |
| + | // Floor grid |
| + | const g = this.add.graphics() |
| + | |
| + | // Dark background |
| + | g.fillStyle(0x0a0a2e) |
| + | g.fillRect(0, 0, 800, 600) |
| + | |
| + | // Grid lines |
| + | g.lineStyle(1, 0x1e1b4b, 0.3) |
| + | for (let x = 0; x <= 800; x += 40) { |
| + | g.moveTo(x, 0); g.lineTo(x, 600) |
| + | } |
| + | for (let y = 0; y <= 600; y += 40) { |
| + | g.moveTo(0, y); g.lineTo(800, y) |
| + | } |
| + | g.strokePath() |
| + | |
| + | // Border |
| + | g.lineStyle(3, 0x6366f1, 0.5) |
| + | g.strokeRect(20, 20, 760, 560) |
| + | |
| + | // Pi decorations scattered around |
| + | const piPositions = [ |
| + | [80, 500], [720, 80], [720, 500], [250, 300], [550, 300] |
| + | ] |
| + | piPositions.forEach(([x, y]) => { |
| + | this.add.text(x, y, "\u03C0", { |
| + | fontSize: "40px", color: "#1e1b4b", |
| + | }).setOrigin(0.5).setAlpha(0.3) |
| + | }) |
| + | |
| + | // "3.14" large watermark |
| + | this.add.text(400, 300, "3.14", { |
| + | fontSize: "120px", fontFamily: "monospace", color: "#1e1b4b", |
| + | }).setOrigin(0.5).setAlpha(0.15) |
| + | } |
| + | |
| + | createStations() { |
| + | this.stationZones = [] |
| + | |
| + | STATIONS.forEach(station => { |
| + | // Glow circle |
| + | const glow = this.add.circle(station.x, station.y, 50, station.color, 0.15) |
| + | this.tweens.add({ |
| + | targets: glow, alpha: { from: 0.1, to: 0.3 }, |
| + | duration: 1500, yoyo: true, repeat: -1, |
| + | }) |
| + | |
| + | // Station circle |
| + | const circle = this.add.circle(station.x, station.y, 35, station.color, 0.6) |
| + | circle.setStrokeStyle(2, station.color) |
| + | |
| + | // Icon |
| + | this.add.text(station.x, station.y - 5, station.icon, { |
| + | fontSize: "24px" |
| + | }).setOrigin(0.5) |
| + | |
| + | // Label |
| + | this.add.text(station.x, station.y + 50, station.label, { |
| + | fontSize: "11px", fontFamily: "monospace", color: "#e2e8f0", |
| + | align: "center", |
| + | }).setOrigin(0.5) |
| + | |
| + | // Interactive zone |
| + | const zone = this.add.zone(station.x, station.y, 80, 80).setInteractive() |
| + | zone.on("pointerdown", () => { |
| + | const dist = Phaser.Math.Distance.Between( |
| + | this.player.x, this.player.y, station.x, station.y |
| + | ) |
| + | if (dist < 120) { |
| + | window.piStation.openMiniGame(station.game) |
| + | } |
| + | }) |
| + | |
| + | this.stationZones.push({ zone, station }) |
| + | }) |
| + | } |
| + | |
| + | createPlayer() { |
| + | const x = 400, y = 300 |
| + | const avatarKey = window.PLAYER_AVATAR |
| + | const color = AVATAR_COLORS[avatarKey] || 0x06b6d4 |
| + | |
| + | // Player container |
| + | this.player = this.add.container(x, y) |
| + | |
| + | // Shadow |
| + | const shadow = this.add.ellipse(0, 12, 30, 10, 0x000000, 0.3) |
| + | |
| + | // Body circle |
| + | const body = this.add.circle(0, 0, 18, color) |
| + | body.setStrokeStyle(2, 0xffffff, 0.5) |
| + | |
| + | // Avatar symbol |
| + | const symbol = this.add.text(0, 0, AVATAR_SYMBOLS[avatarKey] || "?", { |
| + | fontSize: "18px", fontFamily: "serif", color: "#ffffff", |
| + | }).setOrigin(0.5) |
| + | |
| + | // Name tag |
| + | const nameTag = this.add.text(0, -30, window.PLAYER_NAME, { |
| + | fontSize: "11px", fontFamily: "monospace", color: "#ffffff", |
| + | backgroundColor: "rgba(0,0,0,0.5)", padding: { x: 4, y: 2 }, |
| + | }).setOrigin(0.5) |
| + | |
| + | this.player.add([shadow, body, symbol, nameTag]) |
| + | this.player.setDepth(10) |
| + | |
| + | // Chat bubble (hidden by default) |
| + | this.chatBubble = this.add.text(0, -50, "", { |
| + | fontSize: "10px", fontFamily: "monospace", color: "#ffffff", |
| + | backgroundColor: "rgba(99,102,241,0.8)", padding: { x: 6, y: 3 }, |
| + | wordWrap: { width: 120 }, |
| + | }).setOrigin(0.5).setVisible(false) |
| + | this.player.add(this.chatBubble) |
| + | |
| + | // Proximity highlight for stations |
| + | this.proximityText = this.add.text(400, 530, "", { |
| + | fontSize: "16px", fontFamily: "monospace", color: "#22d3ee", |
| + | }).setOrigin(0.5).setDepth(20) |
| + | } |
| + | |
| + | setupControls() { |
| + | // Keyboard |
| + | this.cursors = this.input.keyboard.createCursorKeys() |
| + | this.wasd = this.input.keyboard.addKeys({ |
| + | up: Phaser.Input.Keyboard.KeyCodes.W, |
| + | down: Phaser.Input.Keyboard.KeyCodes.S, |
| + | left: Phaser.Input.Keyboard.KeyCodes.A, |
| + | right: Phaser.Input.Keyboard.KeyCodes.D, |
| + | }) |
| + | |
| + | // Mobile joystick |
| + | if ("ontouchstart" in window) { |
| + | const joystickZone = document.createElement("div") |
| + | joystickZone.style.cssText = "position:fixed;bottom:0;left:0;width:50%;height:40%;z-index:40;" |
| + | document.body.appendChild(joystickZone) |
| + | |
| + | const manager = nipplejs.create({ |
| + | zone: joystickZone, |
| + | mode: "dynamic", |
| + | color: "rgba(99,102,241,0.5)", |
| + | size: 100, |
| + | }) |
| + | |
| + | manager.on("move", (_evt, data) => { |
| + | const force = Math.min(data.force, 2) / 2 |
| + | this.joystickVector.x = Math.cos(data.angle.radian) * force |
| + | this.joystickVector.y = -Math.sin(data.angle.radian) * force |
| + | }) |
| + | |
| + | manager.on("end", () => { |
| + | this.joystickVector.x = 0 |
| + | this.joystickVector.y = 0 |
| + | }) |
| + | } |
| + | |
| + | // Throttled position broadcast |
| + | this.lastBroadcast = 0 |
| + | this.broadcastInterval = 50 // ms |
| + | } |
| + | |
| + | setupPresence() { |
| + | this.presence.onSync(() => { |
| + | const presences = {} |
| + | this.presence.list((id, { metas: [meta] }) => { |
| + | presences[id] = meta |
| + | }) |
| + | |
| + | // Remove players who left |
| + | Object.keys(this.otherPlayers).forEach(id => { |
| + | if (!presences[id]) { |
| + | this.otherPlayers[id].destroy() |
| + | delete this.otherPlayers[id] |
| + | } |
| + | }) |
| + | |
| + | // Update or add players |
| + | Object.entries(presences).forEach(([id, meta]) => { |
| + | if (id === window.PLAYER_ID) return |
| + | |
| + | if (this.otherPlayers[id]) { |
| + | // Smoothly move existing player |
| + | this.tweens.add({ |
| + | targets: this.otherPlayers[id], |
| + | x: meta.x, y: meta.y, |
| + | duration: 100, ease: "Linear", |
| + | }) |
| + | } else { |
| + | // Create new player |
| + | this.otherPlayers[id] = this.createOtherPlayer(meta) |
| + | } |
| + | }) |
| + | }) |
| + | } |
| + | |
| + | createOtherPlayer(meta) { |
| + | const color = AVATAR_COLORS[meta.avatar_key] || 0x888888 |
| + | const container = this.add.container(meta.x, meta.y) |
| + | |
| + | const shadow = this.add.ellipse(0, 12, 30, 10, 0x000000, 0.3) |
| + | const body = this.add.circle(0, 0, 18, color, 0.7) |
| + | body.setStrokeStyle(2, 0xffffff, 0.3) |
| + | |
| + | const symbol = this.add.text(0, 0, AVATAR_SYMBOLS[meta.avatar_key] || "?", { |
| + | fontSize: "18px", fontFamily: "serif", color: "#ffffff", |
| + | }).setOrigin(0.5).setAlpha(0.9) |
| + | |
| + | const nameTag = this.add.text(0, -30, meta.name, { |
| + | fontSize: "10px", fontFamily: "monospace", color: "#cccccc", |
| + | backgroundColor: "rgba(0,0,0,0.4)", padding: { x: 4, y: 2 }, |
| + | }).setOrigin(0.5) |
| + | |
| + | // Status indicator |
| + | const statusText = meta.status !== "hub" ? meta.status : "" |
| + | const status = this.add.text(0, 25, statusText ? `Playing: ${statusText}` : "", { |
| + | fontSize: "8px", fontFamily: "monospace", color: "#22d3ee", |
| + | }).setOrigin(0.5) |
| + | |
| + | container.add([shadow, body, symbol, nameTag, status]) |
| + | container.setDepth(5) |
| + | |
| + | return container |
| + | } |
| + | |
| + | setupChat() { |
| + | this.hubChannel.on("chat", ({ player_id, name, message }) => { |
| + | if (player_id === window.PLAYER_ID) { |
| + | this.showChatBubble(this.player, message, this.chatBubble) |
| + | } else if (this.otherPlayers[player_id]) { |
| + | const bubble = this.add.text( |
| + | this.otherPlayers[player_id].x, |
| + | this.otherPlayers[player_id].y - 50, |
| + | message, |
| + | { |
| + | fontSize: "10px", fontFamily: "monospace", color: "#ffffff", |
| + | backgroundColor: "rgba(99,102,241,0.8)", padding: { x: 6, y: 3 }, |
| + | wordWrap: { width: 120 }, |
| + | } |
| + | ).setOrigin(0.5).setDepth(20) |
| + | |
| + | this.time.delayedCall(3000, () => bubble.destroy()) |
| + | } |
| + | }) |
| + | } |
| + | |
| + | showChatBubble(container, message, bubble) { |
| + | bubble.setText(message).setVisible(true) |
| + | this.time.delayedCall(3000, () => bubble.setVisible(false)) |
| + | } |
| + | |
| + | update(time) { |
| + | if (!this.player) return |
| + | |
| + | // Movement |
| + | let vx = 0, vy = 0 |
| + | |
| + | // Keyboard |
| + | if (this.cursors.left.isDown || this.wasd.left.isDown) vx = -1 |
| + | if (this.cursors.right.isDown || this.wasd.right.isDown) vx = 1 |
| + | if (this.cursors.up.isDown || this.wasd.up.isDown) vy = -1 |
| + | if (this.cursors.down.isDown || this.wasd.down.isDown) vy = 1 |
| + | |
| + | // Joystick override |
| + | if (Math.abs(this.joystickVector.x) > 0.1 || Math.abs(this.joystickVector.y) > 0.1) { |
| + | vx = this.joystickVector.x |
| + | vy = this.joystickVector.y |
| + | } |
| + | |
| + | // Normalize diagonal movement |
| + | if (vx !== 0 && vy !== 0) { |
| + | const len = Math.sqrt(vx * vx + vy * vy) |
| + | vx /= len |
| + | vy /= len |
| + | } |
| + | |
| + | // Apply movement |
| + | const speed = this.moveSpeed * (1 / 60) |
| + | this.player.x = Phaser.Math.Clamp(this.player.x + vx * speed, 40, 760) |
| + | this.player.y = Phaser.Math.Clamp(this.player.y + vy * speed, 40, 560) |
| + | |
| + | // Check station proximity |
| + | let nearStation = null |
| + | STATIONS.forEach(station => { |
| + | const dist = Phaser.Math.Distance.Between( |
| + | this.player.x, this.player.y, station.x, station.y |
| + | ) |
| + | if (dist < 120) nearStation = station |
| + | }) |
| + | |
| + | this.proximityText.setText( |
| + | nearStation ? `Tap ${nearStation.icon} to play ${nearStation.label.replace("\n", " ")}!` : "" |
| + | ) |
| + | |
| + | // Broadcast position (throttled) |
| + | if (time - this.lastBroadcast > this.broadcastInterval && (vx !== 0 || vy !== 0)) { |
| + | this.hubChannel.push("move", { |
| + | x: Math.round(this.player.x), |
| + | y: Math.round(this.player.y) |
| + | }) |
| + | this.lastBroadcast = time |
| + | } |
| + | |
| + | // Sort players by Y for depth |
| + | this.children.list |
| + | .filter(c => c.type === "Container") |
| + | .forEach(c => c.setDepth(c.y)) |
| + | } |
| + | } |
assets/js/game/MonteCarloGame.js
+195
-0
| @@ | @@ -0,0 +1,195 @@ |
| + | export const MonteCarloGame = { |
| + | start(container, channel) { |
| + | while (container.firstChild) container.removeChild(container.firstChild) |
| + | |
| + | const CANVAS_SIZE = 300 |
| + | const MAX_DARTS = 200 |
| + | let dartsInCircle = 0 |
| + | let totalDarts = 0 |
| + | let submitted = false |
| + | |
| + | // Build UI |
| + | const title = document.createElement("div") |
| + | title.className = "mg-title" |
| + | title.textContent = "Monte Carlo Pi" |
| + | |
| + | const subtitle = document.createElement("div") |
| + | subtitle.className = "mg-subtitle" |
| + | subtitle.textContent = "Tap to throw darts! Estimate Pi by the ratio of hits inside the circle." |
| + | |
| + | const canvas = document.createElement("canvas") |
| + | canvas.id = "mc-canvas" |
| + | canvas.width = CANVAS_SIZE |
| + | canvas.height = CANVAS_SIZE |
| + | canvas.style.cssText = "border-radius:0.75rem;border:2px solid rgba(255,255,255,0.2);touch-action:none;cursor:crosshair;" |
| + | const ctx = canvas.getContext("2d") |
| + | |
| + | const stats = document.createElement("div") |
| + | stats.className = "mc-stats" |
| + | |
| + | const dartsStatEl = createStat("0 / " + MAX_DARTS, "Darts") |
| + | const estimateStatEl = createStat("?.????", "Pi Estimate") |
| + | const actualStatEl = createStat("3.1416", "Actual Pi") |
| + | stats.appendChild(dartsStatEl.container) |
| + | stats.appendChild(estimateStatEl.container) |
| + | stats.appendChild(actualStatEl.container) |
| + | |
| + | const resultArea = document.createElement("div") |
| + | resultArea.style.cssText = "margin-top: 1rem; min-height: 3rem;" |
| + | |
| + | container.appendChild(title) |
| + | container.appendChild(subtitle) |
| + | container.appendChild(canvas) |
| + | container.appendChild(stats) |
| + | container.appendChild(resultArea) |
| + | |
| + | // Draw initial state |
| + | drawBackground(ctx, CANVAS_SIZE) |
| + | |
| + | // Handle dart throws |
| + | canvas.addEventListener("pointerdown", (e) => { |
| + | if (totalDarts >= MAX_DARTS || submitted) return |
| + | |
| + | const rect = canvas.getBoundingClientRect() |
| + | const scaleX = CANVAS_SIZE / rect.width |
| + | const scaleY = CANVAS_SIZE / rect.height |
| + | const x = (e.clientX - rect.left) * scaleX |
| + | const y = (e.clientY - rect.top) * scaleY |
| + | |
| + | throwDart(x, y) |
| + | }) |
| + | |
| + | // Also support rapid tapping / random throw button |
| + | const rapidBtn = document.createElement("button") |
| + | rapidBtn.className = "mg-btn" |
| + | rapidBtn.textContent = "Throw 10 Random Darts" |
| + | rapidBtn.addEventListener("click", () => { |
| + | for (let i = 0; i < 10 && totalDarts < MAX_DARTS; i++) { |
| + | throwDart(Math.random() * CANVAS_SIZE, Math.random() * CANVAS_SIZE) |
| + | } |
| + | }) |
| + | container.appendChild(rapidBtn) |
| + | |
| + | function throwDart(x, y) { |
| + | totalDarts++ |
| + | |
| + | // Check if inside circle (centered, radius = CANVAS_SIZE/2) |
| + | const cx = CANVAS_SIZE / 2 |
| + | const cy = CANVAS_SIZE / 2 |
| + | const r = CANVAS_SIZE / 2 |
| + | const dist = Math.sqrt((x - cx) ** 2 + (y - cy) ** 2) |
| + | const inside = dist <= r |
| + | |
| + | if (inside) dartsInCircle++ |
| + | |
| + | // Draw dart |
| + | ctx.beginPath() |
| + | ctx.arc(x, y, 3, 0, Math.PI * 2) |
| + | ctx.fillStyle = inside ? "#22d3ee" : "#ef4444" |
| + | ctx.fill() |
| + | |
| + | // Update stats |
| + | const estimate = totalDarts > 0 ? (4 * dartsInCircle / totalDarts) : 0 |
| + | dartsStatEl.value.textContent = `${totalDarts} / ${MAX_DARTS}` |
| + | estimateStatEl.value.textContent = estimate.toFixed(4) |
| + | |
| + | // Color estimate based on accuracy |
| + | const error = Math.abs(estimate - Math.PI) |
| + | if (error < 0.05) { |
| + | estimateStatEl.value.style.color = "#22c55e" |
| + | } else if (error < 0.2) { |
| + | estimateStatEl.value.style.color = "#f59e0b" |
| + | } else { |
| + | estimateStatEl.value.style.color = "#22d3ee" |
| + | } |
| + | |
| + | // Auto-submit when all darts thrown |
| + | if (totalDarts >= MAX_DARTS && !submitted) { |
| + | submitted = true |
| + | const finalEstimate = 4 * dartsInCircle / totalDarts |
| + | |
| + | channel.push("mc_submit", { |
| + | estimate: parseFloat(finalEstimate.toFixed(6)), |
| + | darts: totalDarts |
| + | }).receive("ok", ({ score, error: err }) => { |
| + | while (resultArea.firstChild) resultArea.removeChild(resultArea.firstChild) |
| + | |
| + | const result = document.createElement("div") |
| + | result.style.cssText = "color: #22d3ee; font-size: 1.3rem; margin-bottom: 0.5rem;" |
| + | result.textContent = `Your estimate: ${finalEstimate.toFixed(4)}` |
| + | |
| + | const errorEl = document.createElement("div") |
| + | errorEl.style.cssText = "color: #a78bfa; margin-bottom: 0.5rem;" |
| + | errorEl.textContent = `Error: ${err} | Score: ${score} points` |
| + | |
| + | const playAgain = document.createElement("button") |
| + | playAgain.className = "mg-btn" |
| + | playAgain.textContent = "Play Again" |
| + | playAgain.addEventListener("click", () => MonteCarloGame.start(container, channel)) |
| + | |
| + | const close = document.createElement("button") |
| + | close.className = "mg-btn secondary" |
| + | close.textContent = "Back to Hub" |
| + | close.addEventListener("click", () => window.piStation.closeMiniGame()) |
| + | |
| + | resultArea.appendChild(result) |
| + | resultArea.appendChild(errorEl) |
| + | resultArea.appendChild(playAgain) |
| + | resultArea.appendChild(close) |
| + | }) |
| + | |
| + | rapidBtn.style.display = "none" |
| + | } |
| + | } |
| + | |
| + | // Listen for other players' results |
| + | channel.on("mc_result", ({ name, estimate, score }) => { |
| + | const announcement = document.createElement("div") |
| + | announcement.style.cssText = "color: #a78bfa; font-size: 0.8rem; margin-top: 0.25rem;" |
| + | announcement.textContent = `${name} estimated ${estimate.toFixed(4)} (${score} pts)` |
| + | resultArea.appendChild(announcement) |
| + | setTimeout(() => { if (announcement.parentNode) announcement.parentNode.removeChild(announcement) }, 5000) |
| + | }) |
| + | } |
| + | } |
| + | |
| + | function drawBackground(ctx, size) { |
| + | // Square background |
| + | ctx.fillStyle = "#1e1b4b" |
| + | ctx.fillRect(0, 0, size, size) |
| + | |
| + | // Circle |
| + | ctx.beginPath() |
| + | ctx.arc(size / 2, size / 2, size / 2, 0, Math.PI * 2) |
| + | ctx.fillStyle = "rgba(99, 102, 241, 0.15)" |
| + | ctx.fill() |
| + | ctx.strokeStyle = "rgba(99, 102, 241, 0.5)" |
| + | ctx.lineWidth = 2 |
| + | ctx.stroke() |
| + | |
| + | // Crosshairs |
| + | ctx.strokeStyle = "rgba(255, 255, 255, 0.1)" |
| + | ctx.lineWidth = 1 |
| + | ctx.beginPath() |
| + | ctx.moveTo(size / 2, 0); ctx.lineTo(size / 2, size) |
| + | ctx.moveTo(0, size / 2); ctx.lineTo(size, size / 2) |
| + | ctx.stroke() |
| + | } |
| + | |
| + | function createStat(initialValue, label) { |
| + | const c = document.createElement("div") |
| + | c.className = "mc-stat" |
| + | |
| + | const v = document.createElement("div") |
| + | v.className = "mc-stat-value" |
| + | v.textContent = initialValue |
| + | |
| + | const l = document.createElement("div") |
| + | l.className = "mc-stat-label" |
| + | l.textContent = label |
| + | |
| + | c.appendChild(v) |
| + | c.appendChild(l) |
| + | |
| + | return { container: c, value: v, label: l } |
| + | } |
assets/js/game/PiMemoryGame.js
+193
-0
| @@ | @@ -0,0 +1,193 @@ |
| + | // Pi digits after the "3." |
| + | const PI_DIGITS = "14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196" |
| + | |
| + | export const PiMemoryGame = { |
| + | start(container, channel) { |
| + | // Clear container safely |
| + | while (container.firstChild) container.removeChild(container.firstChild) |
| + | |
| + | let position = 0 |
| + | let gameOver = false |
| + | let startTime = null |
| + | |
| + | // Build UI |
| + | const title = document.createElement("div") |
| + | title.className = "mg-title" |
| + | title.textContent = "Pi Memory Sprint" |
| + | |
| + | const subtitle = document.createElement("div") |
| + | subtitle.className = "mg-subtitle" |
| + | subtitle.textContent = "Type the digits of Pi: 3." |
| + | |
| + | const display = document.createElement("div") |
| + | display.className = "pi-display" |
| + | display.textContent = "3." |
| + | |
| + | const scoreDisplay = document.createElement("div") |
| + | scoreDisplay.style.cssText = "font-size: 1.2rem; color: #a78bfa; margin: 0.5rem 0;" |
| + | scoreDisplay.textContent = "Digits: 0" |
| + | |
| + | const raceContainer = document.createElement("div") |
| + | raceContainer.style.cssText = "margin: 0.5rem 0; min-height: 2rem;" |
| + | raceContainer.id = "pi-race" |
| + | |
| + | const numpad = document.createElement("div") |
| + | numpad.className = "pi-numpad" |
| + | |
| + | const resultArea = document.createElement("div") |
| + | resultArea.style.cssText = "margin: 1rem 0; min-height: 3rem;" |
| + | |
| + | container.appendChild(title) |
| + | container.appendChild(subtitle) |
| + | container.appendChild(display) |
| + | container.appendChild(scoreDisplay) |
| + | container.appendChild(raceContainer) |
| + | container.appendChild(numpad) |
| + | container.appendChild(resultArea) |
| + | |
| + | // Create numpad buttons |
| + | for (let i = 1; i <= 9; i++) { |
| + | const btn = document.createElement("button") |
| + | btn.textContent = String(i) |
| + | btn.addEventListener("click", () => handleDigit(String(i))) |
| + | numpad.appendChild(btn) |
| + | } |
| + | const zeroBtn = document.createElement("button") |
| + | zeroBtn.className = "zero" |
| + | zeroBtn.textContent = "0" |
| + | zeroBtn.addEventListener("click", () => handleDigit("0")) |
| + | numpad.appendChild(zeroBtn) |
| + | |
| + | function handleDigit(digit) { |
| + | if (gameOver) return |
| + | if (!startTime) startTime = Date.now() |
| + | |
| + | const expected = PI_DIGITS[position] |
| + | |
| + | if (digit === expected) { |
| + | position++ |
| + | display.textContent = "3." + PI_DIGITS.substring(0, position) |
| + | scoreDisplay.textContent = `Digits: ${position}` |
| + | |
| + | // Scroll display to show latest digits |
| + | display.scrollLeft = display.scrollWidth |
| + | |
| + | channel.push("pi_check_digit", { position: position - 1, digit }) |
| + | |
| + | // Milestone celebrations |
| + | if (position === 10 || position === 25 || position === 50 || position === 100) { |
| + | const milestone = document.createElement("div") |
| + | milestone.style.cssText = "color: #22d3ee; font-size: 1.5rem; animation: pulse 0.5s;" |
| + | milestone.textContent = `${position} digits!` |
| + | resultArea.appendChild(milestone) |
| + | setTimeout(() => { if (milestone.parentNode) milestone.parentNode.removeChild(milestone) }, 2000) |
| + | } |
| + | } else { |
| + | // Wrong digit — game over |
| + | gameOver = true |
| + | const elapsed = ((Date.now() - startTime) / 1000).toFixed(1) |
| + | |
| + | numpad.style.opacity = "0.3" |
| + | numpad.style.pointerEvents = "none" |
| + | |
| + | const wrongIndicator = document.createElement("span") |
| + | wrongIndicator.style.cssText = "color: #ef4444; text-decoration: line-through;" |
| + | wrongIndicator.textContent = digit |
| + | display.appendChild(wrongIndicator) |
| + | |
| + | const correctIndicator = document.createElement("span") |
| + | correctIndicator.style.cssText = "color: #22c55e;" |
| + | correctIndicator.textContent = ` (${expected})` |
| + | display.appendChild(correctIndicator) |
| + | |
| + | // Submit score |
| + | channel.push("pi_game_over", { score: position }) |
| + | .receive("ok", () => { |
| + | while (resultArea.firstChild) resultArea.removeChild(resultArea.firstChild) |
| + | |
| + | const result = document.createElement("div") |
| + | result.style.cssText = "color: #22d3ee; font-size: 1.5rem; margin-bottom: 0.5rem;" |
| + | result.textContent = `${position} digits in ${elapsed}s!` |
| + | resultArea.appendChild(result) |
| + | |
| + | const playAgain = document.createElement("button") |
| + | playAgain.className = "mg-btn" |
| + | playAgain.textContent = "Play Again" |
| + | playAgain.addEventListener("click", () => PiMemoryGame.start(container, channel)) |
| + | resultArea.appendChild(playAgain) |
| + | |
| + | const close = document.createElement("button") |
| + | close.className = "mg-btn secondary" |
| + | close.textContent = "Back to Hub" |
| + | close.addEventListener("click", () => window.piStation.closeMiniGame()) |
| + | resultArea.appendChild(close) |
| + | }) |
| + | } |
| + | } |
| + | |
| + | // Listen for other players' progress |
| + | channel.on("pi_progress", ({ name, position: pos }) => { |
| + | updateRace(name, pos, raceContainer) |
| + | }) |
| + | |
| + | channel.on("pi_score", ({ name, score }) => { |
| + | const announcement = document.createElement("div") |
| + | announcement.style.cssText = "color: #a78bfa; font-size: 0.8rem; margin-top: 0.25rem;" |
| + | announcement.textContent = `${name} got ${score} digits!` |
| + | raceContainer.appendChild(announcement) |
| + | setTimeout(() => { if (announcement.parentNode) announcement.parentNode.removeChild(announcement) }, 5000) |
| + | }) |
| + | |
| + | // Keyboard support |
| + | function keyHandler(e) { |
| + | if (e.key >= "0" && e.key <= "9") { |
| + | handleDigit(e.key) |
| + | } |
| + | } |
| + | document.addEventListener("keydown", keyHandler) |
| + | |
| + | // Cleanup on close |
| + | const origClose = window.piStation.closeMiniGame |
| + | window.piStation.closeMiniGame = function() { |
| + | document.removeEventListener("keydown", keyHandler) |
| + | channel.off("pi_progress") |
| + | channel.off("pi_score") |
| + | window.piStation.closeMiniGame = origClose |
| + | origClose() |
| + | } |
| + | } |
| + | } |
| + | |
| + | function updateRace(name, position, raceContainer) { |
| + | let entry = raceContainer.querySelector(`[data-player="${CSS.escape(name)}"]`) |
| + | if (!entry) { |
| + | entry = document.createElement("div") |
| + | entry.setAttribute("data-player", name) |
| + | entry.style.cssText = "display:flex;align-items:center;gap:0.5rem;font-size:0.75rem;color:#e2e8f0;margin:0.15rem 0;" |
| + | raceContainer.appendChild(entry) |
| + | } |
| + | |
| + | // Clear and rebuild entry |
| + | while (entry.firstChild) entry.removeChild(entry.firstChild) |
| + | |
| + | const nameSpan = document.createElement("span") |
| + | nameSpan.style.cssText = "width:60px;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;" |
| + | nameSpan.textContent = name |
| + | |
| + | const barOuter = document.createElement("div") |
| + | barOuter.style.cssText = "flex:1;height:8px;background:rgba(255,255,255,0.1);border-radius:4px;overflow:hidden;" |
| + | |
| + | const barInner = document.createElement("div") |
| + | const width = Math.min(position, 100) |
| + | barInner.style.cssText = `height:100%;background:linear-gradient(90deg,#06b6d4,#8b5cf6);border-radius:4px;width:${width}%;transition:width 0.3s;` |
| + | |
| + | barOuter.appendChild(barInner) |
| + | |
| + | const posSpan = document.createElement("span") |
| + | posSpan.style.cssText = "color:#22d3ee;min-width:2rem;" |
| + | posSpan.textContent = position |
| + | |
| + | entry.appendChild(nameSpan) |
| + | entry.appendChild(barOuter) |
| + | entry.appendChild(posSpan) |
| + | } |
assets/js/game/SliceThePiGame.js
+230
-0
| @@ | @@ -0,0 +1,230 @@ |
| + | const ROUND_TIME = 10 // seconds per question |
| + | const TOTAL_QUESTIONS = 10 |
| + | |
| + | export const SliceThePiGame = { |
| + | start(container, channel) { |
| + | while (container.firstChild) container.removeChild(container.firstChild) |
| + | |
| + | let score = 0 |
| + | let streak = 0 |
| + | let correctCount = 0 |
| + | let questionNum = 0 |
| + | let timerInterval = null |
| + | let questionStartTime = null |
| + | let answering = false |
| + | |
| + | // Build UI |
| + | const title = document.createElement("div") |
| + | title.className = "mg-title" |
| + | title.textContent = "Slice the Pi" |
| + | |
| + | const subtitle = document.createElement("div") |
| + | subtitle.className = "mg-subtitle" |
| + | subtitle.textContent = "Answer circle math questions! Speed matters!" |
| + | |
| + | const timerEl = document.createElement("div") |
| + | timerEl.className = "slice-timer" |
| + | timerEl.textContent = ROUND_TIME |
| + | |
| + | const progressEl = document.createElement("div") |
| + | progressEl.style.cssText = "color: #a78bfa; font-size: 0.9rem; margin: 0.25rem 0;" |
| + | progressEl.textContent = `Question 0 / ${TOTAL_QUESTIONS}` |
| + | |
| + | const scoreEl = document.createElement("div") |
| + | scoreEl.className = "slice-score-display" |
| + | scoreEl.textContent = `Score: 0 | Streak: 0` |
| + | |
| + | const questionEl = document.createElement("div") |
| + | questionEl.className = "slice-question" |
| + | |
| + | const choicesEl = document.createElement("div") |
| + | choicesEl.className = "slice-choices" |
| + | |
| + | const feedbackEl = document.createElement("div") |
| + | feedbackEl.style.cssText = "min-height: 2rem; margin: 0.5rem 0; font-size: 1rem;" |
| + | |
| + | const resultArea = document.createElement("div") |
| + | resultArea.style.cssText = "margin-top: 1rem;" |
| + | |
| + | container.appendChild(title) |
| + | container.appendChild(subtitle) |
| + | container.appendChild(timerEl) |
| + | container.appendChild(progressEl) |
| + | container.appendChild(scoreEl) |
| + | container.appendChild(questionEl) |
| + | container.appendChild(choicesEl) |
| + | container.appendChild(feedbackEl) |
| + | container.appendChild(resultArea) |
| + | |
| + | function nextQuestion() { |
| + | if (questionNum >= TOTAL_QUESTIONS) { |
| + | endGame() |
| + | return |
| + | } |
| + | |
| + | answering = true |
| + | questionNum++ |
| + | progressEl.textContent = `Question ${questionNum} / ${TOTAL_QUESTIONS}` |
| + | feedbackEl.textContent = "" |
| + | |
| + | channel.push("slice_get_problem", {}) |
| + | .receive("ok", (problem) => { |
| + | questionEl.textContent = problem.question |
| + | questionStartTime = Date.now() |
| + | |
| + | // Clear choices |
| + | while (choicesEl.firstChild) choicesEl.removeChild(choicesEl.firstChild) |
| + | |
| + | problem.choices.forEach(choice => { |
| + | const btn = document.createElement("button") |
| + | btn.className = "slice-choice" |
| + | btn.textContent = choice |
| + | btn.addEventListener("click", () => handleAnswer(choice, problem.answer, btn)) |
| + | choicesEl.appendChild(btn) |
| + | }) |
| + | |
| + | // Start timer |
| + | let timeLeft = ROUND_TIME |
| + | timerEl.textContent = timeLeft |
| + | timerEl.style.color = "#22d3ee" |
| + | |
| + | if (timerInterval) clearInterval(timerInterval) |
| + | timerInterval = setInterval(() => { |
| + | timeLeft-- |
| + | timerEl.textContent = timeLeft |
| + | |
| + | if (timeLeft <= 3) timerEl.style.color = "#ef4444" |
| + | else if (timeLeft <= 5) timerEl.style.color = "#f59e0b" |
| + | |
| + | if (timeLeft <= 0) { |
| + | clearInterval(timerInterval) |
| + | handleTimeout() |
| + | } |
| + | }, 1000) |
| + | }) |
| + | } |
| + | |
| + | function handleAnswer(chosen, correct, btnEl) { |
| + | if (!answering) return |
| + | answering = false |
| + | clearInterval(timerInterval) |
| + | |
| + | const timeMs = Date.now() - questionStartTime |
| + | const isCorrect = Math.abs(chosen - correct) < 0.01 |
| + | |
| + | // Highlight choices |
| + | const buttons = choicesEl.querySelectorAll("button") |
| + | buttons.forEach(btn => { |
| + | const val = parseFloat(btn.textContent) |
| + | if (Math.abs(val - correct) < 0.01) { |
| + | btn.className = "slice-choice correct" |
| + | } else if (btn === btnEl && !isCorrect) { |
| + | btn.className = "slice-choice wrong" |
| + | } |
| + | btn.style.pointerEvents = "none" |
| + | }) |
| + | |
| + | if (isCorrect) { |
| + | streak++ |
| + | correctCount++ |
| + | } else { |
| + | streak = 0 |
| + | } |
| + | |
| + | channel.push("slice_answer", { |
| + | correct: isCorrect, |
| + | time_ms: timeMs, |
| + | streak: streak |
| + | }).receive("ok", ({ points }) => { |
| + | score += points |
| + | scoreEl.textContent = `Score: ${score} | Streak: ${streak}` |
| + | |
| + | if (isCorrect) { |
| + | feedbackEl.style.color = "#22c55e" |
| + | feedbackEl.textContent = `Correct! +${points} points (${(timeMs / 1000).toFixed(1)}s)` |
| + | } else { |
| + | feedbackEl.style.color = "#ef4444" |
| + | feedbackEl.textContent = "Wrong!" |
| + | } |
| + | |
| + | setTimeout(nextQuestion, 1500) |
| + | }) |
| + | } |
| + | |
| + | function handleTimeout() { |
| + | answering = false |
| + | streak = 0 |
| + | feedbackEl.style.color = "#ef4444" |
| + | feedbackEl.textContent = "Time's up!" |
| + | scoreEl.textContent = `Score: ${score} | Streak: ${streak}` |
| + | |
| + | // Show correct answer |
| + | const buttons = choicesEl.querySelectorAll("button") |
| + | buttons.forEach(btn => { |
| + | btn.style.pointerEvents = "none" |
| + | }) |
| + | |
| + | channel.push("slice_answer", { correct: false, time_ms: ROUND_TIME * 1000, streak: 0 }) |
| + | |
| + | setTimeout(nextQuestion, 1500) |
| + | } |
| + | |
| + | function endGame() { |
| + | clearInterval(timerInterval) |
| + | questionEl.textContent = "" |
| + | while (choicesEl.firstChild) choicesEl.removeChild(choicesEl.firstChild) |
| + | timerEl.textContent = "" |
| + | |
| + | channel.push("slice_game_over", { |
| + | score: score, |
| + | correct: correctCount, |
| + | total: TOTAL_QUESTIONS |
| + | }).receive("ok", () => { |
| + | while (resultArea.firstChild) resultArea.removeChild(resultArea.firstChild) |
| + | |
| + | const result = document.createElement("div") |
| + | result.style.cssText = "font-size: 1.5rem; color: #22d3ee; margin-bottom: 0.5rem;" |
| + | result.textContent = `Final Score: ${score}` |
| + | |
| + | const details = document.createElement("div") |
| + | details.style.cssText = "color: #a78bfa; margin-bottom: 1rem;" |
| + | details.textContent = `${correctCount} / ${TOTAL_QUESTIONS} correct` |
| + | |
| + | const playAgain = document.createElement("button") |
| + | playAgain.className = "mg-btn" |
| + | playAgain.textContent = "Play Again" |
| + | playAgain.addEventListener("click", () => SliceThePiGame.start(container, channel)) |
| + | |
| + | const close = document.createElement("button") |
| + | close.className = "mg-btn secondary" |
| + | close.textContent = "Back to Hub" |
| + | close.addEventListener("click", () => window.piStation.closeMiniGame()) |
| + | |
| + | resultArea.appendChild(result) |
| + | resultArea.appendChild(details) |
| + | resultArea.appendChild(playAgain) |
| + | resultArea.appendChild(close) |
| + | }) |
| + | } |
| + | |
| + | // Listen for others' activity |
| + | channel.on("slice_correct", ({ name, streak: s }) => { |
| + | const announcement = document.createElement("div") |
| + | announcement.style.cssText = "color: #a78bfa; font-size: 0.75rem;" |
| + | announcement.textContent = `${name} got one right! (streak: ${s})` |
| + | feedbackEl.appendChild(announcement) |
| + | setTimeout(() => { if (announcement.parentNode) announcement.parentNode.removeChild(announcement) }, 3000) |
| + | }) |
| + | |
| + | channel.on("slice_score", ({ name, score: s }) => { |
| + | const announcement = document.createElement("div") |
| + | announcement.style.cssText = "color: #22d3ee; font-size: 0.8rem; margin-top: 0.25rem;" |
| + | announcement.textContent = `${name} finished with ${s} points!` |
| + | resultArea.appendChild(announcement) |
| + | setTimeout(() => { if (announcement.parentNode) announcement.parentNode.removeChild(announcement) }, 5000) |
| + | }) |
| + | |
| + | // Start! |
| + | nextQuestion() |
| + | } |
| + | } |
assets/package-lock.json
+34
-0
| @@ | @@ -0,0 +1,34 @@ |
| + | { |
| + | "name": "assets", |
| + | "lockfileVersion": 3, |
| + | "requires": true, |
| + | "packages": { |
| + | "": { |
| + | "dependencies": { |
| + | "nipplejs": "^0.10.2", |
| + | "phaser": "^3.90.0" |
| + | } |
| + | }, |
| + | "node_modules/eventemitter3": { |
| + | "version": "5.0.4", |
| + | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", |
| + | "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", |
| + | "license": "MIT" |
| + | }, |
| + | "node_modules/nipplejs": { |
| + | "version": "0.10.2", |
| + | "resolved": "https://registry.npmjs.org/nipplejs/-/nipplejs-0.10.2.tgz", |
| + | "integrity": "sha512-XGxFY8C2DOtobf1fK+MXINTzkkXJLjZDDpfQhOUZf4TSytbc9s4bmA0lB9eKKM8iDivdr9NQkO7DpIQfsST+9g==", |
| + | "license": "MIT" |
| + | }, |
| + | "node_modules/phaser": { |
| + | "version": "3.90.0", |
| + | "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.90.0.tgz", |
| + | "integrity": "sha512-/cziz/5ZIn02uDkC9RzN8VF9x3Gs3XdFFf9nkiMEQT3p7hQlWuyjy4QWosU802qqno2YSLn2BfqwOKLv/sSVfQ==", |
| + | "license": "MIT", |
| + | "dependencies": { |
| + | "eventemitter3": "^5.0.1" |
| + | } |
| + | } |
| + | } |
| + | } |
assets/package.json
+6
-0
| @@ | @@ -0,0 +1,6 @@ |
| + | { |
| + | "dependencies": { |
| + | "nipplejs": "^0.10.2", |
| + | "phaser": "^3.90.0" |
| + | } |
| + | } |
assets/tsconfig.json
+32
-0
| @@ | @@ -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/**/*"] |
| + | } |
assets/vendor/daisyui-theme.js
+124
-0
| @@ | @@ -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. |
| + | |
| + | */ |
assets/vendor/daisyui.js
+1031
-0
| @@ | @@ -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: '"<percentage>"', 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. |
| + | |
| + | */ |
assets/vendor/heroicons.js
+43
-0
| @@ | @@ -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}) |
| + | }) |
assets/vendor/topbar.js
+138
-0
| @@ | @@ -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)); |
config/config.exs
+71
-0
| @@ | @@ -0,0 +1,71 @@ |
| + | # 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 :pi_day, |
| + | ecto_repos: [PiDay.Repo], |
| + | generators: [timestamp_type: :utc_datetime] |
| + | |
| + | # Configures the endpoint |
| + | config :pi_day, PiDayWeb.Endpoint, |
| + | url: [host: "localhost"], |
| + | adapter: Bandit.PhoenixAdapter, |
| + | render_errors: [ |
| + | formats: [html: PiDayWeb.ErrorHTML, json: PiDayWeb.ErrorJSON], |
| + | layout: false |
| + | ], |
| + | pubsub_server: PiDay.PubSub, |
| + | live_view: [signing_salt: "Ey7Yu97I"] |
| + | |
| + | # Configures 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 :pi_day, PiDay.Mailer, adapter: Swoosh.Adapters.Local |
| + | |
| + | # Configure esbuild (the version is required) |
| + | config :esbuild, |
| + | version: "0.25.4", |
| + | pi_day: [ |
| + | 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()]} |
| + | ], |
| + | pi_day_game: [ |
| + | args: |
| + | ~w(js/game.js --bundle --target=es2022 --outdir=../priv/static/assets/js --external:/fonts/* --external:/images/*), |
| + | cd: Path.expand("../assets", __DIR__), |
| + | env: %{"NODE_PATH" => [Path.expand("../deps", __DIR__)]} |
| + | ] |
| + | |
| + | # Configure tailwind (the version is required) |
| + | config :tailwind, |
| + | version: "4.1.7", |
| + | pi_day: [ |
| + | args: ~w( |
| + | --input=assets/css/app.css |
| + | --output=priv/static/assets/css/app.css |
| + | ), |
| + | cd: Path.expand("..", __DIR__) |
| + | ] |
| + | |
| + | # Configures 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" |
config/dev.exs
+89
-0
| @@ | @@ -0,0 +1,89 @@ |
| + | import Config |
| + | |
| + | # Configure your database |
| + | config :pi_day, PiDay.Repo, |
| + | username: "postgres", |
| + | password: "postgres", |
| + | hostname: "localhost", |
| + | database: "pi_day_dev", |
| + | stacktrace: true, |
| + | show_sensitive_data_on_connection_error: true, |
| + | pool_size: 10 |
| + | |
| + | # 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 :pi_day, PiDayWeb.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: {0, 0, 0, 0}, port: String.to_integer(System.get_env("PORT") || "4000")], |
| + | check_origin: false, |
| + | code_reloader: true, |
| + | debug_errors: true, |
| + | secret_key_base: "b68PkvJ+B8hGBNRGW4UYx+aNDxeZkdsnJ8zj5D6lvIuDQTSK7v4L3qT6N7EBIap6", |
| + | watchers: [ |
| + | esbuild: {Esbuild, :install_and_run, [:pi_day, ~w(--sourcemap=inline --watch)]}, |
| + | esbuild_game: {Esbuild, :install_and_run, [:pi_day_game, ~w(--sourcemap=inline --watch)]}, |
| + | tailwind: {Tailwind, :install_and_run, [:pi_day, ~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. |
| + | |
| + | # Watch static and templates for browser reloading. |
| + | config :pi_day, PiDayWeb.Endpoint, |
| + | live_reload: [ |
| + | web_console_logger: true, |
| + | patterns: [ |
| + | ~r"priv/static/(?!uploads/).*(js|css|png|jpeg|jpg|gif|svg)$", |
| + | ~r"priv/gettext/.*(po)$", |
| + | ~r"lib/pi_day_web/(?:controllers|live|components|router)/?.*\.(ex|heex)$" |
| + | ] |
| + | ] |
| + | |
| + | # Enable dev routes for dashboard and mailbox |
| + | config :pi_day, 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 |
config/prod.exs
+20
-0
| @@ | @@ -0,0 +1,20 @@ |
| + | 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 :pi_day, PiDayWeb.Endpoint, cache_static_manifest: "priv/static/cache_manifest.json" |
| + | |
| + | # Configures 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. |
config/runtime.exs
+119
-0
| @@ | @@ -0,0 +1,119 @@ |
| + | 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/pi_day 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 :pi_day, PiDayWeb.Endpoint, server: true |
| + | end |
| + | |
| + | if config_env() == :prod do |
| + | database_url = |
| + | System.get_env("DATABASE_URL") || |
| + | raise """ |
| + | environment variable DATABASE_URL is missing. |
| + | For example: ecto://USER:PASS@HOST/DATABASE |
| + | """ |
| + | |
| + | maybe_ipv6 = if System.get_env("ECTO_IPV6") in ~w(true 1), do: [:inet6], else: [] |
| + | |
| + | config :pi_day, PiDay.Repo, |
| + | # ssl: true, |
| + | url: database_url, |
| + | pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"), |
| + | # For machines with several cores, consider starting multiple pools of `pool_size` |
| + | # pool_count: 4, |
| + | socket_options: maybe_ipv6 |
| + | |
| + | # 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" |
| + | port = String.to_integer(System.get_env("PORT") || "4000") |
| + | |
| + | config :pi_day, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY") |
| + | |
| + | config :pi_day, PiDayWeb.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}, |
| + | port: port |
| + | ], |
| + | 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 :pi_day, PiDayWeb.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 :pi_day, PiDayWeb.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 :pi_day, PiDay.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 |
config/test.exs
+37
-0
| @@ | @@ -0,0 +1,37 @@ |
| + | import Config |
| + | |
| + | # Configure your database |
| + | # |
| + | # The MIX_TEST_PARTITION environment variable can be used |
| + | # to provide built-in test partitioning in CI environment. |
| + | # Run `mix help test` for more information. |
| + | config :pi_day, PiDay.Repo, |
| + | username: "postgres", |
| + | password: "postgres", |
| + | hostname: "localhost", |
| + | database: "pi_day_test#{System.get_env("MIX_TEST_PARTITION")}", |
| + | pool: Ecto.Adapters.SQL.Sandbox, |
| + | pool_size: System.schedulers_online() * 2 |
| + | |
| + | # We don't run a server during test. If one is required, |
| + | # you can enable the server option below. |
| + | config :pi_day, PiDayWeb.Endpoint, |
| + | http: [ip: {127, 0, 0, 1}, port: 4002], |
| + | secret_key_base: "dsAyc7Z4NNH2wCtP3pR8HwfAWm0bDWw5G9iFxsmCQNwZ9lXOuhy2eXKpHIubwI/4", |
| + | server: false |
| + | |
| + | # In test we don't send emails |
| + | config :pi_day, PiDay.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 |
pi_day.ex b/lib/pi_day.ex
+9
-0
| @@ | @@ -0,0 +1,9 @@ |
| + | defmodule PiDay do |
| + | @moduledoc """ |
| + | PiDay 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 |
pi_day/application.ex b/lib/pi_day/application.ex
+32
-0
| @@ | @@ -0,0 +1,32 @@ |
| + | defmodule PiDay.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 = [ |
| + | PiDayWeb.Telemetry, |
| + | PiDay.Repo, |
| + | {DNSCluster, query: Application.get_env(:pi_day, :dns_cluster_query) || :ignore}, |
| + | {Phoenix.PubSub, name: PiDay.PubSub}, |
| + | PiDayWeb.Presence, |
| + | PiDayWeb.Endpoint |
| + | ] |
| + | |
| + | # See https://hexdocs.pm/elixir/Supervisor.html |
| + | # for other strategies and supported options |
| + | opts = [strategy: :one_for_one, name: PiDay.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 |
| + | PiDayWeb.Endpoint.config_change(changed, removed) |
| + | :ok |
| + | end |
| + | end |
pi_day/game.ex b/lib/pi_day/game.ex
+146
-0
| @@ | @@ -0,0 +1,146 @@ |
| + | defmodule PiDay.Game do |
| + | import Ecto.Query |
| + | alias PiDay.Repo |
| + | alias PiDay.Game.{Player, Score} |
| + | |
| + | # --- Players --- |
| + | |
| + | def create_player(attrs) do |
| + | %Player{} |
| + | |> Player.changeset(attrs) |
| + | |> Repo.insert() |
| + | end |
| + | |
| + | def get_player(id), do: Repo.get(Player, id) |
| + | |
| + | def get_player_by_token(token) do |
| + | Repo.get_by(Player, session_token: token) |
| + | end |
| + | |
| + | # --- Scores --- |
| + | |
| + | def record_score(attrs) do |
| + | result = |
| + | %Score{} |
| + | |> Score.changeset(attrs) |
| + | |> Repo.insert() |
| + | |
| + | case result do |
| + | {:ok, score} -> |
| + | update_total_score(score.player_id) |
| + | Phoenix.PubSub.broadcast(PiDay.PubSub, "leaderboard", {:score_updated, score}) |
| + | {:ok, score} |
| + | |
| + | error -> |
| + | error |
| + | end |
| + | end |
| + | |
| + | defp update_total_score(player_id) do |
| + | total = |
| + | Score |
| + | |> where(player_id: ^player_id) |
| + | |> select([s], sum(s.score)) |
| + | |> Repo.one() || 0 |
| + | |
| + | Player |
| + | |> where(id: ^player_id) |
| + | |> Repo.update_all(set: [total_score: total]) |
| + | end |
| + | |
| + | def leaderboard(limit \\ 20) do |
| + | Player |
| + | |> where([p], p.total_score > 0) |
| + | |> order_by([p], desc: p.total_score) |
| + | |> limit(^limit) |
| + | |> Repo.all() |
| + | end |
| + | |
| + | def top_scores(game_type, limit \\ 10) do |
| + | Score |
| + | |> where(game_type: ^game_type) |
| + | |> order_by(desc: :score) |
| + | |> limit(^limit) |
| + | |> preload(:player) |
| + | |> Repo.all() |
| + | end |
| + | |
| + | # First 2000 digits of pi after "3." |
| + | @pi_digits "14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009946576407895126946839835259570982582262052248940772671947826848260147699090264013639443745530506820349625245174939965143142980919065925093722169646151570985838741059788595977297549893016175392846813826868386894277415599185592524595395943104997252468084598727364469584865383673622262609912460805124388439045124413654976278079771569143599770012961608944169486855584840635" |
| + | |
| + | def pi_digits, do: @pi_digits |
| + | |
| + | def check_pi_digit(position, digit) when is_integer(position) and position >= 0 do |
| + | expected = String.at(@pi_digits, position) |
| + | expected == digit |
| + | end |
| + | |
| + | # --- Math problems for Slice the Pi --- |
| + | |
| + | def generate_math_problem do |
| + | type = Enum.random([:circumference, :area, :arc_length, :sector_area]) |
| + | generate_problem(type) |
| + | end |
| + | |
| + | defp generate_problem(:circumference) do |
| + | r = Enum.random(1..20) |
| + | answer = Float.round(2 * :math.pi() * r, 2) |
| + | wrong = generate_wrong_answers(answer) |
| + | |
| + | %{ |
| + | question: "What is the circumference of a circle with radius #{r}?", |
| + | answer: answer, |
| + | choices: Enum.shuffle([answer | wrong]), |
| + | type: :circumference |
| + | } |
| + | end |
| + | |
| + | defp generate_problem(:area) do |
| + | r = Enum.random(1..15) |
| + | answer = Float.round(:math.pi() * r * r, 2) |
| + | wrong = generate_wrong_answers(answer) |
| + | |
| + | %{ |
| + | question: "What is the area of a circle with radius #{r}?", |
| + | answer: answer, |
| + | choices: Enum.shuffle([answer | wrong]), |
| + | type: :area |
| + | } |
| + | end |
| + | |
| + | defp generate_problem(:arc_length) do |
| + | r = Enum.random(2..12) |
| + | angle = Enum.random([30, 45, 60, 90, 120, 180]) |
| + | answer = Float.round(2 * :math.pi() * r * (angle / 360), 2) |
| + | wrong = generate_wrong_answers(answer) |
| + | |
| + | %{ |
| + | question: "Arc length: radius=#{r}, central angle=#{angle} degrees?", |
| + | answer: answer, |
| + | choices: Enum.shuffle([answer | wrong]), |
| + | type: :arc_length |
| + | } |
| + | end |
| + | |
| + | defp generate_problem(:sector_area) do |
| + | r = Enum.random(2..10) |
| + | angle = Enum.random([30, 45, 60, 90, 120, 180]) |
| + | answer = Float.round(:math.pi() * r * r * (angle / 360), 2) |
| + | wrong = generate_wrong_answers(answer) |
| + | |
| + | %{ |
| + | question: "Sector area: radius=#{r}, angle=#{angle} degrees?", |
| + | answer: answer, |
| + | choices: Enum.shuffle([answer | wrong]), |
| + | type: :sector_area |
| + | } |
| + | end |
| + | |
| + | defp generate_wrong_answers(correct) do |
| + | [ |
| + | Float.round(correct * 0.5, 2), |
| + | Float.round(correct * 1.5, 2), |
| + | Float.round(correct + :math.pi(), 2) |
| + | ] |
| + | end |
| + | end |
pi_day/game/player.ex b/lib/pi_day/game/player.ex
+43
-0
| @@ | @@ -0,0 +1,43 @@ |
| + | defmodule PiDay.Game.Player do |
| + | use Ecto.Schema |
| + | import Ecto.Changeset |
| + | |
| + | @primary_key {:id, :binary_id, autogenerate: true} |
| + | @foreign_key_type :binary_id |
| + | |
| + | schema "players" do |
| + | field :name, :string |
| + | field :avatar_key, :string |
| + | field :session_token, :string |
| + | field :total_score, :integer, default: 0 |
| + | |
| + | has_many :game_scores, PiDay.Game.Score |
| + | |
| + | timestamps(type: :utc_datetime) |
| + | end |
| + | |
| + | @avatars ~w(pi sigma delta omega theta lambda phi psi epsilon zeta) |
| + | |
| + | def avatars, do: @avatars |
| + | |
| + | def changeset(player, attrs) do |
| + | player |
| + | |> cast(attrs, [:name, :avatar_key]) |
| + | |> validate_required([:name, :avatar_key]) |
| + | |> validate_length(:name, min: 1, max: 20) |
| + | |> validate_inclusion(:avatar_key, @avatars) |
| + | |> put_session_token() |
| + | end |
| + | |
| + | defp put_session_token(changeset) do |
| + | if get_field(changeset, :session_token) do |
| + | changeset |
| + | else |
| + | put_change(changeset, :session_token, generate_token()) |
| + | end |
| + | end |
| + | |
| + | defp generate_token do |
| + | :crypto.strong_rand_bytes(32) |> Base.url_encode64(padding: false) |
| + | end |
| + | end |
pi_day/game/score.ex b/lib/pi_day/game/score.ex
+27
-0
| @@ | @@ -0,0 +1,27 @@ |
| + | defmodule PiDay.Game.Score do |
| + | use Ecto.Schema |
| + | import Ecto.Changeset |
| + | |
| + | @primary_key {:id, :binary_id, autogenerate: true} |
| + | @foreign_key_type :binary_id |
| + | |
| + | schema "game_scores" do |
| + | field :game_type, :string |
| + | field :score, :integer, default: 0 |
| + | field :metadata, :map, default: %{} |
| + | |
| + | belongs_to :player, PiDay.Game.Player |
| + | |
| + | timestamps(type: :utc_datetime, updated_at: false) |
| + | end |
| + | |
| + | @game_types ~w(pi_memory monte_carlo slice_the_pi) |
| + | |
| + | def changeset(score, attrs) do |
| + | score |
| + | |> cast(attrs, [:player_id, :game_type, :score, :metadata]) |
| + | |> validate_required([:player_id, :game_type, :score]) |
| + | |> validate_inclusion(:game_type, @game_types) |
| + | |> foreign_key_constraint(:player_id) |
| + | end |
| + | end |
pi_day/mailer.ex b/lib/pi_day/mailer.ex
+3
-0
| @@ | @@ -0,0 +1,3 @@ |
| + | defmodule PiDay.Mailer do |
| + | use Swoosh.Mailer, otp_app: :pi_day |
| + | end |
pi_day/repo.ex b/lib/pi_day/repo.ex
+5
-0
| @@ | @@ -0,0 +1,5 @@ |
| + | defmodule PiDay.Repo do |
| + | use Ecto.Repo, |
| + | otp_app: :pi_day, |
| + | adapter: Ecto.Adapters.Postgres |
| + | end |
pi_day_web.ex b/lib/pi_day_web.ex
+114
-0
| @@ | @@ -0,0 +1,114 @@ |
| + | defmodule PiDayWeb 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 PiDayWeb, :controller |
| + | use PiDayWeb, :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: PiDayWeb.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: PiDayWeb.Gettext |
| + | |
| + | # HTML escaping functionality |
| + | import Phoenix.HTML |
| + | # Core UI components |
| + | import PiDayWeb.CoreComponents |
| + | |
| + | # Common modules used in templates |
| + | alias Phoenix.LiveView.JS |
| + | alias PiDayWeb.Layouts |
| + | |
| + | # Routes generation with the ~p sigil |
| + | unquote(verified_routes()) |
| + | end |
| + | end |
| + | |
| + | def verified_routes do |
| + | quote do |
| + | use Phoenix.VerifiedRoutes, |
| + | endpoint: PiDayWeb.Endpoint, |
| + | router: PiDayWeb.Router, |
| + | statics: PiDayWeb.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 |
pi_day_web/channels/game_channel.ex b/lib/pi_day_web/channels/game_channel.ex
+66
-0
| @@ | @@ -0,0 +1,66 @@ |
| + | defmodule PiDayWeb.GameChannel do |
| + | use PiDayWeb, :channel |
| + | |
| + | alias PiDayWeb.Presence |
| + | |
| + | @impl true |
| + | def join("game:hub", _payload, socket) do |
| + | send(self(), :after_join) |
| + | {:ok, socket} |
| + | end |
| + | |
| + | @impl true |
| + | def handle_info(:after_join, socket) do |
| + | player = socket.assigns.player |
| + | |
| + | {:ok, _} = |
| + | Presence.track(socket, player.id, %{ |
| + | name: player.name, |
| + | avatar_key: player.avatar_key, |
| + | x: 400, |
| + | y: 300, |
| + | score: player.total_score, |
| + | status: "hub" |
| + | }) |
| + | |
| + | push(socket, "presence_state", Presence.list(socket)) |
| + | {:noreply, socket} |
| + | end |
| + | |
| + | @impl true |
| + | def handle_in("move", %{"x" => x, "y" => y}, socket) do |
| + | player = socket.assigns.player |
| + | |
| + | Presence.update(socket, player.id, fn meta -> |
| + | %{meta | x: x, y: y} |
| + | end) |
| + | |
| + | {:noreply, socket} |
| + | end |
| + | |
| + | def handle_in("chat", %{"message" => message}, socket) do |
| + | player = socket.assigns.player |
| + | broadcast!(socket, "chat", %{player_id: player.id, name: player.name, message: String.slice(message, 0, 100)}) |
| + | {:noreply, socket} |
| + | end |
| + | |
| + | def handle_in("enter_game", %{"game" => game_type}, socket) do |
| + | player = socket.assigns.player |
| + | |
| + | Presence.update(socket, player.id, fn meta -> |
| + | %{meta | status: game_type} |
| + | end) |
| + | |
| + | {:noreply, socket} |
| + | end |
| + | |
| + | def handle_in("leave_game", _payload, socket) do |
| + | player = socket.assigns.player |
| + | |
| + | Presence.update(socket, player.id, fn meta -> |
| + | %{meta | status: "hub"} |
| + | end) |
| + | |
| + | {:noreply, socket} |
| + | end |
| + | end |
pi_day_web/channels/mini_game_channel.ex b/lib/pi_day_web/channels/mini_game_channel.ex
+114
-0
| @@ | @@ -0,0 +1,114 @@ |
| + | defmodule PiDayWeb.MiniGameChannel do |
| + | use PiDayWeb, :channel |
| + | |
| + | alias PiDay.Game |
| + | |
| + | @impl true |
| + | def join("game:mini:" <> game_type, _payload, socket) when game_type in ~w(pi_memory monte_carlo slice_the_pi) do |
| + | socket = assign(socket, :game_type, game_type) |
| + | {:ok, socket} |
| + | end |
| + | |
| + | def join(_, _, _), do: {:error, %{reason: "invalid game"}} |
| + | |
| + | # --- Pi Memory Sprint --- |
| + | |
| + | @impl true |
| + | def handle_in("pi_check_digit", %{"position" => pos, "digit" => digit}, socket) do |
| + | correct = Game.check_pi_digit(pos, digit) |
| + | |
| + | if correct do |
| + | broadcast!(socket, "pi_progress", %{ |
| + | player_id: socket.assigns.player.id, |
| + | name: socket.assigns.player.name, |
| + | position: pos + 1 |
| + | }) |
| + | end |
| + | |
| + | {:reply, {:ok, %{correct: correct}}, socket} |
| + | end |
| + | |
| + | def handle_in("pi_game_over", %{"score" => score}, socket) do |
| + | player = socket.assigns.player |
| + | |
| + | Game.record_score(%{ |
| + | player_id: player.id, |
| + | game_type: "pi_memory", |
| + | score: score, |
| + | metadata: %{digits: score} |
| + | }) |
| + | |
| + | broadcast!(socket, "pi_score", %{ |
| + | player_id: player.id, |
| + | name: player.name, |
| + | score: score |
| + | }) |
| + | |
| + | {:reply, {:ok, %{recorded: true}}, socket} |
| + | end |
| + | |
| + | # --- Monte Carlo Pi --- |
| + | |
| + | def handle_in("mc_submit", %{"estimate" => estimate, "darts" => darts}, socket) do |
| + | player = socket.assigns.player |
| + | error = abs(estimate - :math.pi()) |
| + | score = max(0, round(1000 - error * 1000)) |
| + | |
| + | Game.record_score(%{ |
| + | player_id: player.id, |
| + | game_type: "monte_carlo", |
| + | score: score, |
| + | metadata: %{estimate: estimate, darts: darts, error: Float.round(error, 6)} |
| + | }) |
| + | |
| + | broadcast!(socket, "mc_result", %{ |
| + | player_id: player.id, |
| + | name: player.name, |
| + | estimate: estimate, |
| + | score: score |
| + | }) |
| + | |
| + | {:reply, {:ok, %{score: score, error: Float.round(error, 6)}}, socket} |
| + | end |
| + | |
| + | # --- Slice the Pi (speed math) --- |
| + | |
| + | def handle_in("slice_get_problem", _payload, socket) do |
| + | problem = Game.generate_math_problem() |
| + | {:reply, {:ok, problem}, socket} |
| + | end |
| + | |
| + | def handle_in("slice_answer", %{"correct" => correct, "time_ms" => time_ms, "streak" => streak}, socket) do |
| + | player = socket.assigns.player |
| + | points = if correct, do: max(10, 100 - div(time_ms, 100)) + streak * 10, else: 0 |
| + | |
| + | if correct do |
| + | broadcast!(socket, "slice_correct", %{ |
| + | player_id: player.id, |
| + | name: player.name, |
| + | streak: streak |
| + | }) |
| + | end |
| + | |
| + | {:reply, {:ok, %{points: points}}, socket} |
| + | end |
| + | |
| + | def handle_in("slice_game_over", %{"score" => score, "correct" => correct, "total" => total}, socket) do |
| + | player = socket.assigns.player |
| + | |
| + | Game.record_score(%{ |
| + | player_id: player.id, |
| + | game_type: "slice_the_pi", |
| + | score: score, |
| + | metadata: %{correct: correct, total: total} |
| + | }) |
| + | |
| + | broadcast!(socket, "slice_score", %{ |
| + | player_id: player.id, |
| + | name: player.name, |
| + | score: score |
| + | }) |
| + | |
| + | {:reply, {:ok, %{recorded: true}}, socket} |
| + | end |
| + | end |
pi_day_web/channels/presence.ex b/lib/pi_day_web/channels/presence.ex
+5
-0
| @@ | @@ -0,0 +1,5 @@ |
| + | defmodule PiDayWeb.Presence do |
| + | use Phoenix.Presence, |
| + | otp_app: :pi_day, |
| + | pubsub_server: PiDay.PubSub |
| + | end |
pi_day_web/channels/user_socket.ex b/lib/pi_day_web/channels/user_socket.ex
+19
-0
| @@ | @@ -0,0 +1,19 @@ |
| + | defmodule PiDayWeb.UserSocket do |
| + | use Phoenix.Socket |
| + | |
| + | channel "game:hub", PiDayWeb.GameChannel |
| + | channel "game:mini:*", PiDayWeb.MiniGameChannel |
| + | |
| + | @impl true |
| + | def connect(%{"token" => token}, socket, _connect_info) do |
| + | case PiDay.Game.get_player_by_token(token) do |
| + | nil -> :error |
| + | player -> {:ok, assign(socket, :player, player)} |
| + | end |
| + | end |
| + | |
| + | def connect(_params, _socket, _connect_info), do: :error |
| + | |
| + | @impl true |
| + | def id(socket), do: "user_socket:#{socket.assigns.player.id}" |
| + | end |
pi_day_web/components/core_components.ex b/lib/pi_day_web/components/core_components.ex
+472
-0
| @@ | @@ -0,0 +1,472 @@ |
| + | defmodule PiDayWeb.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: PiDayWeb.Gettext |
| + | |
| + | alias Phoenix.LiveView.JS |
| + | |
| + | @doc """ |
| + | Renders flash notices. |
| + | |
| + | ## Examples |
| + | |
| + | <.flash kind={:info} flash={@flash} /> |
| + | <.flash kind={:info} phx-mounted={show("#flash")}>Welcome Back!</.flash> |
| + | """ |
| + | 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""" |
| + | <div |
| + | :if={msg = render_slot(@inner_block) || Phoenix.Flash.get(@flash, @kind)} |
| + | id={@id} |
| + | phx-click={JS.push("lv:clear-flash", value: %{key: @kind}) |> hide("##{@id}")} |
| + | role="alert" |
| + | class="toast toast-top toast-end z-50" |
| + | {@rest} |
| + | > |
| + | <div class={[ |
| + | "alert w-80 sm:w-96 max-w-80 sm:max-w-96 text-wrap", |
| + | @kind == :info && "alert-info", |
| + | @kind == :error && "alert-error" |
| + | ]}> |
| + | <.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" /> |
| + | <div> |
| + | <p :if={@title} class="font-semibold">{@title}</p> |
| + | <p>{msg}</p> |
| + | </div> |
| + | <div class="flex-1" /> |
| + | <button type="button" class="group self-start cursor-pointer" aria-label={gettext("close")}> |
| + | <.icon name="hero-x-mark" class="size-5 opacity-40 group-hover:opacity-70" /> |
| + | </button> |
| + | </div> |
| + | </div> |
| + | """ |
| + | end |
| + | |
| + | @doc """ |
| + | Renders a button with navigation support. |
| + | |
| + | ## Examples |
| + | |
| + | <.button>Send!</.button> |
| + | <.button phx-click="go" variant="primary">Send!</.button> |
| + | <.button navigate={~p"/"}>Home</.button> |
| + | """ |
| + | attr :rest, :global, include: ~w(href navigate patch method download name value disabled) |
| + | attr :class, :string |
| + | 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)} |
| + | </.link> |
| + | """ |
| + | else |
| + | ~H""" |
| + | <button class={@class} {@rest}> |
| + | {render_slot(@inner_block)} |
| + | </button> |
| + | """ |
| + | 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 `<select>` tag |
| + | |
| + | * `type="checkbox"` is used exclusively to render boolean values |
| + | |
| + | * For live file uploads, see `Phoenix.Component.live_file_input/1` |
| + | |
| + | See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input |
| + | for more information. Unsupported types, such as hidden and radio, |
| + | are best written directly in your templates. |
| + | |
| + | ## Examples |
| + | |
| + | <.input field={@form[:email]} type="email" /> |
| + | <.input name="my-input" errors={["oh no!"]} /> |
| + | """ |
| + | attr :id, :any, default: nil |
| + | attr :name, :any |
| + | attr :label, :string, default: nil |
| + | attr :value, :any |
| + | |
| + | attr :type, :string, |
| + | default: "text", |
| + | values: ~w(checkbox color date datetime-local email file month number password |
| + | search select tel text textarea time url week) |
| + | |
| + | attr :field, Phoenix.HTML.FormField, |
| + | doc: "a form field struct retrieved from the form, for example: @form[:email]" |
| + | |
| + | attr :errors, :list, default: [] |
| + | attr :checked, :boolean, doc: "the checked flag for checkbox inputs" |
| + | attr :prompt, :string, default: nil, doc: "the prompt for select inputs" |
| + | attr :options, :list, doc: "the options to pass to Phoenix.HTML.Form.options_for_select/2" |
| + | attr :multiple, :boolean, default: false, doc: "the multiple flag for select inputs" |
| + | attr :class, :string, default: nil, doc: "the input class to use over defaults" |
| + | attr :error_class, :string, default: nil, doc: "the input error class to use over defaults" |
| + | |
| + | attr :rest, :global, |
| + | include: ~w(accept autocomplete capture cols disabled form list max maxlength min minlength |
| + | multiple pattern placeholder readonly required rows size step) |
| + | |
| + | def input(%{field: %Phoenix.HTML.FormField{} = field} = assigns) do |
| + | errors = if Phoenix.Component.used_input?(field), do: field.errors, else: [] |
| + | |
| + | assigns |
| + | |> assign(field: nil, id: assigns.id || field.id) |
| + | |> assign(:errors, Enum.map(errors, &translate_error(&1))) |
| + | |> assign_new(:name, fn -> if assigns.multiple, do: field.name <> "[]", else: field.name end) |
| + | |> assign_new(:value, fn -> field.value end) |
| + | |> input() |
| + | end |
| + | |
| + | def input(%{type: "checkbox"} = assigns) do |
| + | assigns = |
| + | assign_new(assigns, :checked, fn -> |
| + | Phoenix.HTML.Form.normalize_value("checkbox", assigns[:value]) |
| + | end) |
| + | |
| + | ~H""" |
| + | <div class="fieldset mb-2"> |
| + | <label> |
| + | <input type="hidden" name={@name} value="false" disabled={@rest[:disabled]} /> |
| + | <span class="label"> |
| + | <input |
| + | type="checkbox" |
| + | id={@id} |
| + | name={@name} |
| + | value="true" |
| + | checked={@checked} |
| + | class={@class || "checkbox checkbox-sm"} |
| + | {@rest} |
| + | />{@label} |
| + | </span> |
| + | </label> |
| + | <.error :for={msg <- @errors}>{msg}</.error> |
| + | </div> |
| + | """ |
| + | end |
| + | |
| + | def input(%{type: "select"} = assigns) do |
| + | ~H""" |
| + | <div class="fieldset mb-2"> |
| + | <label> |
| + | <span :if={@label} class="label mb-1">{@label}</span> |
| + | <select |
| + | id={@id} |
| + | name={@name} |
| + | class={[@class || "w-full select", @errors != [] && (@error_class || "select-error")]} |
| + | multiple={@multiple} |
| + | {@rest} |
| + | > |
| + | <option :if={@prompt} value="">{@prompt}</option> |
| + | {Phoenix.HTML.Form.options_for_select(@options, @value)} |
| + | </select> |
| + | </label> |
| + | <.error :for={msg <- @errors}>{msg}</.error> |
| + | </div> |
| + | """ |
| + | end |
| + | |
| + | def input(%{type: "textarea"} = assigns) do |
| + | ~H""" |
| + | <div class="fieldset mb-2"> |
| + | <label> |
| + | <span :if={@label} class="label mb-1">{@label}</span> |
| + | <textarea |
| + | id={@id} |
| + | name={@name} |
| + | class={[ |
| + | @class || "w-full textarea", |
| + | @errors != [] && (@error_class || "textarea-error") |
| + | ]} |
| + | {@rest} |
| + | >{Phoenix.HTML.Form.normalize_value("textarea", @value)}</textarea> |
| + | </label> |
| + | <.error :for={msg <- @errors}>{msg}</.error> |
| + | </div> |
| + | """ |
| + | end |
| + | |
| + | # All other inputs text, datetime-local, url, password, etc. are handled here... |
| + | def input(assigns) do |
| + | ~H""" |
| + | <div class="fieldset mb-2"> |
| + | <label> |
| + | <span :if={@label} class="label mb-1">{@label}</span> |
| + | <input |
| + | type={@type} |
| + | name={@name} |
| + | id={@id} |
| + | value={Phoenix.HTML.Form.normalize_value(@type, @value)} |
| + | class={[ |
| + | @class || "w-full input", |
| + | @errors != [] && (@error_class || "input-error") |
| + | ]} |
| + | {@rest} |
| + | /> |
| + | </label> |
| + | <.error :for={msg <- @errors}>{msg}</.error> |
| + | </div> |
| + | """ |
| + | end |
| + | |
| + | # Helper used by inputs to generate form errors |
| + | defp error(assigns) do |
| + | ~H""" |
| + | <p class="mt-1.5 flex gap-2 items-center text-sm text-error"> |
| + | <.icon name="hero-exclamation-circle" class="size-5" /> |
| + | {render_slot(@inner_block)} |
| + | </p> |
| + | """ |
| + | end |
| + | |
| + | @doc """ |
| + | Renders a header with title. |
| + | """ |
| + | slot :inner_block, required: true |
| + | slot :subtitle |
| + | slot :actions |
| + | |
| + | def header(assigns) do |
| + | ~H""" |
| + | <header class={[@actions != [] && "flex items-center justify-between gap-6", "pb-4"]}> |
| + | <div> |
| + | <h1 class="text-lg font-semibold leading-8"> |
| + | {render_slot(@inner_block)} |
| + | </h1> |
| + | <p :if={@subtitle != []} class="text-sm text-base-content/70"> |
| + | {render_slot(@subtitle)} |
| + | </p> |
| + | </div> |
| + | <div class="flex-none">{render_slot(@actions)}</div> |
| + | </header> |
| + | """ |
| + | end |
| + | |
| + | @doc """ |
| + | Renders a table with generic styling. |
| + | |
| + | ## Examples |
| + | |
| + | <.table id="users" rows={@users}> |
| + | <:col :let={user} label="id">{user.id}</:col> |
| + | <:col :let={user} label="username">{user.username}</:col> |
| + | </.table> |
| + | """ |
| + | 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""" |
| + | <table class="table table-zebra"> |
| + | <thead> |
| + | <tr> |
| + | <th :for={col <- @col}>{col[:label]}</th> |
| + | <th :if={@action != []}> |
| + | <span class="sr-only">{gettext("Actions")}</span> |
| + | </th> |
| + | </tr> |
| + | </thead> |
| + | <tbody id={@id} phx-update={is_struct(@rows, Phoenix.LiveView.LiveStream) && "stream"}> |
| + | <tr :for={row <- @rows} id={@row_id && @row_id.(row)}> |
| + | <td |
| + | :for={col <- @col} |
| + | phx-click={@row_click && @row_click.(row)} |
| + | class={@row_click && "hover:cursor-pointer"} |
| + | > |
| + | {render_slot(col, @row_item.(row))} |
| + | </td> |
| + | <td :if={@action != []} class="w-0 font-semibold"> |
| + | <div class="flex gap-4"> |
| + | <%= for action <- @action do %> |
| + | {render_slot(action, @row_item.(row))} |
| + | <% end %> |
| + | </div> |
| + | </td> |
| + | </tr> |
| + | </tbody> |
| + | </table> |
| + | """ |
| + | end |
| + | |
| + | @doc """ |
| + | Renders a data list. |
| + | |
| + | ## Examples |
| + | |
| + | <.list> |
| + | <:item title="Title">{@post.title}</:item> |
| + | <:item title="Views">{@post.views}</:item> |
| + | </.list> |
| + | """ |
| + | slot :item, required: true do |
| + | attr :title, :string, required: true |
| + | end |
| + | |
| + | def list(assigns) do |
| + | ~H""" |
| + | <ul class="list"> |
| + | <li :for={item <- @item} class="list-row"> |
| + | <div class="list-col-grow"> |
| + | <div class="font-bold">{item.title}</div> |
| + | <div>{render_slot(item)}</div> |
| + | </div> |
| + | </li> |
| + | </ul> |
| + | """ |
| + | 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, :string, default: "size-4" |
| + | |
| + | def icon(%{name: "hero-" <> _} = assigns) do |
| + | ~H""" |
| + | <span class={[@name, @class]} /> |
| + | """ |
| + | 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(PiDayWeb.Gettext, "errors", msg, msg, count, opts) |
| + | else |
| + | Gettext.dgettext(PiDayWeb.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 |
pi_day_web/components/layouts.ex b/lib/pi_day_web/components/layouts.ex
+154
-0
| @@ | @@ -0,0 +1,154 @@ |
| + | defmodule PiDayWeb.Layouts do |
| + | @moduledoc """ |
| + | This module holds layouts and related functionality |
| + | used by your application. |
| + | """ |
| + | use PiDayWeb, :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 |
| + | |
| + | <Layouts.app flash={@flash}> |
| + | <h1>Content</h1> |
| + | </Layouts.app> |
| + | |
| + | """ |
| + | 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 |
| + | |
| + | def app(assigns) do |
| + | ~H""" |
| + | <header class="navbar px-4 sm:px-6 lg:px-8"> |
| + | <div class="flex-1"> |
| + | <a href="/" class="flex-1 flex w-fit items-center gap-2"> |
| + | <img src={~p"/images/logo.svg"} width="36" /> |
| + | <span class="text-sm font-semibold">v{Application.spec(:phoenix, :vsn)}</span> |
| + | </a> |
| + | </div> |
| + | <div class="flex-none"> |
| + | <ul class="flex flex-column px-1 space-x-4 items-center"> |
| + | <li> |
| + | <a href="https://phoenixframework.org/" class="btn btn-ghost">Website</a> |
| + | </li> |
| + | <li> |
| + | <a href="https://github.com/phoenixframework/phoenix" class="btn btn-ghost">GitHub</a> |
| + | </li> |
| + | <li> |
| + | <.theme_toggle /> |
| + | </li> |
| + | <li> |
| + | <a href="https://hexdocs.pm/phoenix/overview.html" class="btn btn-primary"> |
| + | Get Started <span aria-hidden="true">→</span> |
| + | </a> |
| + | </li> |
| + | </ul> |
| + | </div> |
| + | </header> |
| + | |
| + | <main class="px-4 py-20 sm:px-6 lg:px-8"> |
| + | <div class="mx-auto max-w-2xl space-y-4"> |
| + | {render_slot(@inner_block)} |
| + | </div> |
| + | </main> |
| + | |
| + | <.flash_group flash={@flash} /> |
| + | """ |
| + | 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""" |
| + | <div id={@id} aria-live="polite"> |
| + | <.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> |
| + | |
| + | <.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" /> |
| + | </.flash> |
| + | </div> |
| + | """ |
| + | end |
| + | |
| + | @doc """ |
| + | Provides dark vs light theme toggle based on themes defined in app.css. |
| + | |
| + | See <head> in root.html.heex which applies the theme before page load. |
| + | """ |
| + | def theme_toggle(assigns) do |
| + | ~H""" |
| + | <div class="card relative flex flex-row items-center border-2 border-base-300 bg-base-300 rounded-full"> |
| + | <div class="absolute w-1/3 h-full rounded-full border-1 border-base-200 bg-base-100 brightness-200 left-0 [[data-theme=light]_&]:left-1/3 [[data-theme=dark]_&]:left-2/3 transition-[left]" /> |
| + | |
| + | <button |
| + | class="flex p-2 cursor-pointer w-1/3" |
| + | phx-click={JS.dispatch("phx:set-theme")} |
| + | data-phx-theme="system" |
| + | > |
| + | <.icon name="hero-computer-desktop-micro" class="size-4 opacity-75 hover:opacity-100" /> |
| + | </button> |
| + | |
| + | <button |
| + | class="flex p-2 cursor-pointer w-1/3" |
| + | phx-click={JS.dispatch("phx:set-theme")} |
| + | data-phx-theme="light" |
| + | > |
| + | <.icon name="hero-sun-micro" class="size-4 opacity-75 hover:opacity-100" /> |
| + | </button> |
| + | |
| + | <button |
| + | class="flex p-2 cursor-pointer w-1/3" |
| + | phx-click={JS.dispatch("phx:set-theme")} |
| + | data-phx-theme="dark" |
| + | > |
| + | <.icon name="hero-moon-micro" class="size-4 opacity-75 hover:opacity-100" /> |
| + | </button> |
| + | </div> |
| + | """ |
| + | end |
| + | end |
pi_day_web/components/layouts/root.html.heex b/lib/pi_day_web/components/layouts/root.html.heex
+36
-0
| @@ | @@ -0,0 +1,36 @@ |
| + | <!DOCTYPE html> |
| + | <html lang="en"> |
| + | <head> |
| + | <meta charset="utf-8" /> |
| + | <meta name="viewport" content="width=device-width, initial-scale=1" /> |
| + | <meta name="csrf-token" content={get_csrf_token()} /> |
| + | <.live_title default="PiDay" suffix=" · Phoenix Framework"> |
| + | {assigns[:page_title]} |
| + | </.live_title> |
| + | <link phx-track-static rel="stylesheet" href={~p"/assets/css/app.css"} /> |
| + | <script defer phx-track-static type="text/javascript" src={~p"/assets/js/app.js"}> |
| + | </script> |
| + | <script> |
| + | (() => { |
| + | const setTheme = (theme) => { |
| + | if (theme === "system") { |
| + | localStorage.removeItem("phx:theme"); |
| + | document.documentElement.removeAttribute("data-theme"); |
| + | } else { |
| + | localStorage.setItem("phx:theme", theme); |
| + | document.documentElement.setAttribute("data-theme", theme); |
| + | } |
| + | }; |
| + | if (!document.documentElement.hasAttribute("data-theme")) { |
| + | setTheme(localStorage.getItem("phx:theme") || "system"); |
| + | } |
| + | window.addEventListener("storage", (e) => e.key === "phx:theme" && setTheme(e.newValue || "system")); |
| + | |
| + | window.addEventListener("phx:set-theme", (e) => setTheme(e.target.dataset.phxTheme)); |
| + | })(); |
| + | </script> |
| + | </head> |
| + | <body> |
| + | {@inner_content} |
| + | </body> |
| + | </html> |
pi_day_web/controllers/error_html.ex b/lib/pi_day_web/controllers/error_html.ex
+24
-0
| @@ | @@ -0,0 +1,24 @@ |
| + | defmodule PiDayWeb.ErrorHTML do |
| + | @moduledoc """ |
| + | This module is invoked by your endpoint in case of errors on HTML requests. |
| + | |
| + | See config/config.exs. |
| + | """ |
| + | use PiDayWeb, :html |
| + | |
| + | # If you want to customize your error pages, |
| + | # uncomment the embed_templates/1 call below |
| + | # and add pages to the error directory: |
| + | # |
| + | # * lib/pi_day_web/controllers/error_html/404.html.heex |
| + | # * lib/pi_day_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 |
pi_day_web/controllers/error_json.ex b/lib/pi_day_web/controllers/error_json.ex
+21
-0
| @@ | @@ -0,0 +1,21 @@ |
| + | defmodule PiDayWeb.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 |
pi_day_web/controllers/game_controller.ex b/lib/pi_day_web/controllers/game_controller.ex
+11
-0
| @@ | @@ -0,0 +1,11 @@ |
| + | defmodule PiDayWeb.GameController do |
| + | use PiDayWeb, :controller |
| + | |
| + | def play(conn, _params) do |
| + | player = conn.assigns.current_player |
| + | |
| + | conn |
| + | |> put_layout(false) |
| + | |> render(:play, player: player) |
| + | end |
| + | end |
pi_day_web/controllers/game_html.ex b/lib/pi_day_web/controllers/game_html.ex
+5
-0
| @@ | @@ -0,0 +1,5 @@ |
| + | defmodule PiDayWeb.GameHTML do |
| + | use PiDayWeb, :html |
| + | |
| + | embed_templates "game_html/*" |
| + | end |
pi_day_web/controllers/game_html/play.html.heex b/lib/pi_day_web/controllers/game_html/play.html.heex
+126
-0
| @@ | @@ -0,0 +1,126 @@ |
| + | <!DOCTYPE html> |
| + | <html lang="en"> |
| + | <head> |
| + | <meta charset="utf-8" /> |
| + | <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> |
| + | <meta name="csrf-token" content={get_csrf_token()} /> |
| + | <title>Pi Station</title> |
| + | <link rel="stylesheet" href={~p"/assets/css/app.css"} /> |
| + | <style> |
| + | * { margin: 0; padding: 0; box-sizing: border-box; } |
| + | html, body { width: 100%; height: 100%; overflow: hidden; background: #0a0a1a; touch-action: none; } |
| + | #game-container { width: 100%; height: 100%; position: relative; } |
| + | #game-canvas { width: 100%; height: 100%; display: block; } |
| + | |
| + | /* Mini-game overlay */ |
| + | #mini-game-overlay { |
| + | display: none; |
| + | position: fixed; |
| + | inset: 0; |
| + | background: rgba(0,0,0,0.9); |
| + | z-index: 100; |
| + | flex-direction: column; |
| + | align-items: center; |
| + | justify-content: center; |
| + | padding: 1rem; |
| + | } |
| + | #mini-game-overlay.active { display: flex; } |
| + | #mini-game-content { |
| + | width: 100%; |
| + | max-width: 500px; |
| + | max-height: 90vh; |
| + | overflow-y: auto; |
| + | color: white; |
| + | text-align: center; |
| + | } |
| + | |
| + | .mg-title { font-size: 1.5rem; font-weight: bold; margin-bottom: 1rem; } |
| + | .mg-subtitle { font-size: 0.9rem; color: #a78bfa; margin-bottom: 1.5rem; } |
| + | .mg-close { |
| + | position: absolute; top: 1rem; right: 1rem; |
| + | background: rgba(255,255,255,0.1); border: none; color: white; |
| + | width: 40px; height: 40px; border-radius: 50%; font-size: 1.5rem; |
| + | cursor: pointer; |
| + | } |
| + | .mg-btn { |
| + | display: inline-block; padding: 0.75rem 2rem; |
| + | background: linear-gradient(135deg, #06b6d4, #8b5cf6); |
| + | color: white; border: none; border-radius: 0.75rem; |
| + | font-size: 1.1rem; font-weight: bold; cursor: pointer; |
| + | margin: 0.5rem; transition: transform 0.1s; |
| + | } |
| + | .mg-btn:active { transform: scale(0.95); } |
| + | .mg-btn.secondary { background: rgba(255,255,255,0.15); } |
| + | |
| + | /* Pi Memory specific */ |
| + | .pi-display { |
| + | font-family: monospace; font-size: 2rem; letter-spacing: 0.2em; |
| + | color: #22d3ee; margin: 1rem 0; min-height: 3rem; |
| + | word-break: break-all; line-height: 1.5; |
| + | } |
| + | .pi-numpad { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.5rem; max-width: 300px; margin: 1rem auto; } |
| + | .pi-numpad button { |
| + | padding: 1rem; font-size: 1.5rem; font-weight: bold; |
| + | background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.2); |
| + | border-radius: 0.75rem; color: white; cursor: pointer; |
| + | transition: background 0.1s; |
| + | } |
| + | .pi-numpad button:active { background: rgba(139, 92, 246, 0.5); } |
| + | .pi-numpad .zero { grid-column: span 3; } |
| + | |
| + | /* Monte Carlo specific */ |
| + | #mc-canvas { border-radius: 0.75rem; border: 2px solid rgba(255,255,255,0.2); touch-action: none; } |
| + | .mc-stats { display: flex; gap: 1rem; justify-content: center; margin: 1rem 0; flex-wrap: wrap; } |
| + | .mc-stat { background: rgba(255,255,255,0.1); padding: 0.5rem 1rem; border-radius: 0.5rem; } |
| + | .mc-stat-value { font-size: 1.3rem; font-weight: bold; color: #22d3ee; } |
| + | .mc-stat-label { font-size: 0.7rem; color: #a78bfa; } |
| + | |
| + | /* Slice the Pi specific */ |
| + | .slice-question { font-size: 1.2rem; margin: 1rem 0; color: #e2e8f0; min-height: 3rem; } |
| + | .slice-choices { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; max-width: 400px; margin: 1rem auto; } |
| + | .slice-choice { |
| + | padding: 1rem; font-size: 1.1rem; |
| + | background: rgba(255,255,255,0.1); border: 2px solid rgba(255,255,255,0.2); |
| + | border-radius: 0.75rem; color: white; cursor: pointer; |
| + | } |
| + | .slice-choice.correct { background: rgba(34, 197, 94, 0.4); border-color: #22c55e; } |
| + | .slice-choice.wrong { background: rgba(239, 68, 68, 0.4); border-color: #ef4444; } |
| + | .slice-timer { font-size: 3rem; font-weight: bold; color: #22d3ee; } |
| + | .slice-score-display { font-size: 1.2rem; color: #a78bfa; margin: 0.5rem 0; } |
| + | |
| + | /* Players sidebar */ |
| + | #players-list { |
| + | position: fixed; top: 0.5rem; right: 0.5rem; |
| + | background: rgba(0,0,0,0.7); border-radius: 0.75rem; |
| + | padding: 0.5rem; max-width: 150px; z-index: 50; |
| + | max-height: 50vh; overflow-y: auto; |
| + | } |
| + | .player-entry { |
| + | display: flex; align-items: center; gap: 0.3rem; |
| + | padding: 0.25rem 0.5rem; color: white; font-size: 0.7rem; |
| + | } |
| + | .player-avatar { font-size: 1rem; } |
| + | .player-score { color: #22d3ee; margin-left: auto; font-size: 0.6rem; } |
| + | </style> |
| + | </head> |
| + | <body> |
| + | <div id="game-container"> |
| + | <div id="game-canvas"></div> |
| + | </div> |
| + | |
| + | <div id="players-list"></div> |
| + | |
| + | <div id="mini-game-overlay"> |
| + | <button class="mg-close" onclick="window.piStation.closeMiniGame()">×</button> |
| + | <div id="mini-game-content"></div> |
| + | </div> |
| + | |
| + | <script> |
| + | window.PLAYER_TOKEN = "<%= @player.session_token %>"; |
| + | window.PLAYER_ID = "<%= @player.id %>"; |
| + | window.PLAYER_NAME = "<%= @player.name %>"; |
| + | window.PLAYER_AVATAR = "<%= @player.avatar_key %>"; |
| + | </script> |
| + | <script src={~p"/assets/js/game.js"}></script> |
| + | </body> |
| + | </html> |
pi_day_web/controllers/page_controller.ex b/lib/pi_day_web/controllers/page_controller.ex
+31
-0
| @@ | @@ -0,0 +1,31 @@ |
| + | defmodule PiDayWeb.PageController do |
| + | use PiDayWeb, :controller |
| + | |
| + | alias PiDay.Game |
| + | alias PiDay.Game.Player |
| + | |
| + | def home(conn, _params) do |
| + | # If player already has a session, redirect to play |
| + | token = get_session(conn, :player_token) |
| + | |
| + | if token && Game.get_player_by_token(token) do |
| + | redirect(conn, to: ~p"/play") |
| + | else |
| + | render(conn, :home, avatars: Player.avatars()) |
| + | end |
| + | end |
| + | |
| + | def join(conn, %{"player" => player_params}) do |
| + | case Game.create_player(player_params) do |
| + | {:ok, player} -> |
| + | conn |
| + | |> put_session(:player_token, player.session_token) |
| + | |> redirect(to: ~p"/play") |
| + | |
| + | {:error, _changeset} -> |
| + | conn |
| + | |> put_flash(:error, "Could not join. Pick a name and avatar!") |
| + | |> redirect(to: ~p"/") |
| + | end |
| + | end |
| + | end |
pi_day_web/controllers/page_html.ex b/lib/pi_day_web/controllers/page_html.ex
+20
-0
| @@ | @@ -0,0 +1,20 @@ |
| + | defmodule PiDayWeb.PageHTML do |
| + | use PiDayWeb, :html |
| + | |
| + | embed_templates "page_html/*" |
| + | |
| + | @avatar_symbols %{ |
| + | "pi" => "\u03C0", |
| + | "sigma" => "\u03A3", |
| + | "delta" => "\u0394", |
| + | "omega" => "\u03A9", |
| + | "theta" => "\u03B8", |
| + | "lambda" => "\u03BB", |
| + | "phi" => "\u03C6", |
| + | "psi" => "\u03C8", |
| + | "epsilon" => "\u03B5", |
| + | "zeta" => "\u03B6" |
| + | } |
| + | |
| + | def avatar_symbol(key), do: Map.get(@avatar_symbols, key, "?") |
| + | end |
pi_day_web/controllers/page_html/home.html.heex b/lib/pi_day_web/controllers/page_html/home.html.heex
+67
-0
| @@ | @@ -0,0 +1,67 @@ |
| + | <div class="min-h-screen bg-gradient-to-b from-indigo-950 via-purple-950 to-black flex flex-col items-center justify-center px-4 py-8"> |
| + | <Layouts.flash_group flash={@flash} /> |
| + | |
| + | <!-- Pi Symbol Animation --> |
| + | <div class="text-8xl font-bold text-transparent bg-clip-text bg-gradient-to-r from-cyan-400 via-purple-400 to-pink-400 mb-2 animate-pulse"> |
| + | π |
| + | </div> |
| + | |
| + | <h1 class="text-4xl md:text-5xl font-bold text-white mb-2 text-center"> |
| + | Pi Station |
| + | </h1> |
| + | <p class="text-purple-300 text-lg mb-8 text-center"> |
| + | Pi Day Party · March 14, 2026 |
| + | </p> |
| + | |
| + | <!-- Join Form --> |
| + | <div class="bg-white/10 backdrop-blur-md rounded-2xl p-6 w-full max-w-md border border-white/20"> |
| + | <form action="/join" method="post" class="space-y-6"> |
| + | <input type="hidden" name="_csrf_token" value={get_csrf_token()} /> |
| + | |
| + | <div> |
| + | <label class="block text-purple-200 text-sm font-medium mb-2">Your Name</label> |
| + | <input |
| + | type="text" |
| + | name="player[name]" |
| + | placeholder="Enter your name..." |
| + | maxlength="20" |
| + | required |
| + | class="w-full px-4 py-3 bg-white/10 border border-white/20 rounded-xl text-white placeholder-white/40 focus:outline-none focus:ring-2 focus:ring-purple-400 focus:border-transparent text-lg" |
| + | autofocus |
| + | /> |
| + | </div> |
| + | |
| + | <div> |
| + | <label class="block text-purple-200 text-sm font-medium mb-3">Choose Your Avatar</label> |
| + | <div class="grid grid-cols-5 gap-3"> |
| + | <%= for {avatar, index} <- Enum.with_index(@avatars) do %> |
| + | <label class="cursor-pointer"> |
| + | <input |
| + | type="radio" |
| + | name="player[avatar_key]" |
| + | value={avatar} |
| + | class="hidden peer" |
| + | {if index == 0, do: [checked: true], else: []} |
| + | /> |
| + | <div class="w-full aspect-square rounded-xl bg-white/10 border-2 border-transparent peer-checked:border-cyan-400 peer-checked:bg-cyan-400/20 hover:bg-white/20 flex items-center justify-center text-2xl transition-all"> |
| + | <%= avatar_symbol(avatar) %> |
| + | </div> |
| + | <div class="text-center text-xs text-purple-300 mt-1 truncate"><%= avatar %></div> |
| + | </label> |
| + | <% end %> |
| + | </div> |
| + | </div> |
| + | |
| + | <button |
| + | type="submit" |
| + | class="w-full py-4 bg-gradient-to-r from-cyan-500 to-purple-500 hover:from-cyan-400 hover:to-purple-400 text-white font-bold text-lg rounded-xl transition-all transform hover:scale-[1.02] active:scale-[0.98] shadow-lg shadow-purple-500/25" |
| + | > |
| + | Join the Party! |
| + | </button> |
| + | </form> |
| + | </div> |
| + | |
| + | <p class="text-purple-400/60 text-sm mt-6"> |
| + | 3.14159265358979323846... |
| + | </p> |
| + | </div> |
pi_day_web/endpoint.ex b/lib/pi_day_web/endpoint.ex
+58
-0
| @@ | @@ -0,0 +1,58 @@ |
| + | defmodule PiDayWeb.Endpoint do |
| + | use Phoenix.Endpoint, otp_app: :pi_day |
| + | |
| + | # 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: "_pi_day_key", |
| + | signing_salt: "lAv6TvbS", |
| + | same_site: "Lax" |
| + | ] |
| + | |
| + | socket "/live", Phoenix.LiveView.Socket, |
| + | websocket: [connect_info: [session: @session_options]], |
| + | longpoll: [connect_info: [session: @session_options]] |
| + | |
| + | socket "/game_socket", PiDayWeb.UserSocket, |
| + | websocket: true, |
| + | longpoll: false |
| + | |
| + | # 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: :pi_day, |
| + | gzip: not code_reloading?, |
| + | only: PiDayWeb.static_paths() |
| + | |
| + | # 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 |
| + | plug Phoenix.Ecto.CheckRepoStatus, otp_app: :pi_day |
| + | 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 PiDayWeb.Router |
| + | end |
pi_day_web/gettext.ex b/lib/pi_day_web/gettext.ex
+25
-0
| @@ | @@ -0,0 +1,25 @@ |
| + | defmodule PiDayWeb.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: PiDayWeb.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: :pi_day |
| + | end |
pi_day_web/live/spectate_live.ex b/lib/pi_day_web/live/spectate_live.ex
+124
-0
| @@ | @@ -0,0 +1,124 @@ |
| + | defmodule PiDayWeb.SpectateLive do |
| + | use PiDayWeb, :live_view |
| + | |
| + | alias PiDay.Game |
| + | |
| + | @impl true |
| + | def mount(_params, _session, socket) do |
| + | if connected?(socket) do |
| + | Phoenix.PubSub.subscribe(PiDay.PubSub, "leaderboard") |
| + | :timer.send_interval(5000, self(), :refresh_leaderboard) |
| + | end |
| + | |
| + | {:ok, |
| + | assign(socket, |
| + | page_title: "Pi Station - Leaderboard", |
| + | leaderboard: Game.leaderboard(), |
| + | pi_top: Game.top_scores("pi_memory", 5), |
| + | mc_top: Game.top_scores("monte_carlo", 5), |
| + | slice_top: Game.top_scores("slice_the_pi", 5) |
| + | )} |
| + | end |
| + | |
| + | @impl true |
| + | def handle_info(:refresh_leaderboard, socket) do |
| + | {:noreply, |
| + | assign(socket, |
| + | leaderboard: Game.leaderboard(), |
| + | pi_top: Game.top_scores("pi_memory", 5), |
| + | mc_top: Game.top_scores("monte_carlo", 5), |
| + | slice_top: Game.top_scores("slice_the_pi", 5) |
| + | )} |
| + | end |
| + | |
| + | def handle_info({:score_updated, _score}, socket) do |
| + | {:noreply, |
| + | assign(socket, |
| + | leaderboard: Game.leaderboard(), |
| + | pi_top: Game.top_scores("pi_memory", 5), |
| + | mc_top: Game.top_scores("monte_carlo", 5), |
| + | slice_top: Game.top_scores("slice_the_pi", 5) |
| + | )} |
| + | end |
| + | |
| + | @impl true |
| + | def render(assigns) do |
| + | ~H""" |
| + | <div class="min-h-screen bg-gradient-to-b from-indigo-950 via-purple-950 to-black text-white p-6"> |
| + | <div class="max-w-6xl mx-auto"> |
| + | <!-- Header --> |
| + | <div class="text-center mb-8"> |
| + | <div class="text-6xl font-bold text-transparent bg-clip-text bg-gradient-to-r from-cyan-400 via-purple-400 to-pink-400 mb-2"> |
| + | π Station |
| + | </div> |
| + | <p class="text-purple-300 text-xl">Pi Day 2026 · Live Leaderboard</p> |
| + | </div> |
| + | |
| + | <div class="grid grid-cols-1 lg:grid-cols-2 gap-6"> |
| + | <!-- Overall Leaderboard --> |
| + | <div class="lg:col-span-2 bg-white/5 backdrop-blur rounded-2xl p-6 border border-white/10"> |
| + | <h2 class="text-2xl font-bold text-cyan-400 mb-4">Overall Rankings</h2> |
| + | <div class="space-y-2"> |
| + | <%= for {player, idx} <- Enum.with_index(@leaderboard) do %> |
| + | <div class={"flex items-center gap-4 p-3 rounded-xl #{if idx < 3, do: "bg-gradient-to-r from-yellow-500/10 to-transparent", else: "bg-white/5"}"}> |
| + | <div class={"text-2xl font-bold w-10 text-center #{rank_color(idx)}"}> |
| + | #{idx + 1} |
| + | </div> |
| + | <div class="text-2xl"><%= avatar_symbol(player.avatar_key) %></div> |
| + | <div class="flex-1 text-lg font-medium"><%= player.name %></div> |
| + | <div class="text-2xl font-bold text-cyan-400"><%= player.total_score %></div> |
| + | </div> |
| + | <% end %> |
| + | <%= if @leaderboard == [] do %> |
| + | <p class="text-purple-400 text-center py-8">No scores yet — join the game!</p> |
| + | <% end %> |
| + | </div> |
| + | </div> |
| + | |
| + | <!-- Mini-game leaderboards --> |
| + | <.mini_leaderboard title="Pi Memory Sprint" icon="🧠" scores={@pi_top} /> |
| + | <.mini_leaderboard title="Monte Carlo Pi" icon="🎯" scores={@mc_top} /> |
| + | <.mini_leaderboard title="Slice the Pi" icon="🔪" scores={@slice_top} /> |
| + | </div> |
| + | |
| + | <div class="text-center mt-8 text-purple-400/50 text-sm font-mono"> |
| + | 3.14159265358979323846264338327950288419716939937510... |
| + | </div> |
| + | </div> |
| + | </div> |
| + | """ |
| + | end |
| + | |
| + | defp rank_color(0), do: "text-yellow-400" |
| + | defp rank_color(1), do: "text-gray-300" |
| + | defp rank_color(2), do: "text-amber-600" |
| + | defp rank_color(_), do: "text-purple-400" |
| + | |
| + | defp avatar_symbol(key) do |
| + | PiDayWeb.PageHTML.avatar_symbol(key) |
| + | end |
| + | |
| + | attr :title, :string, required: true |
| + | attr :icon, :string, required: true |
| + | attr :scores, :list, required: true |
| + | |
| + | defp mini_leaderboard(assigns) do |
| + | ~H""" |
| + | <div class="bg-white/5 backdrop-blur rounded-2xl p-6 border border-white/10"> |
| + | <h3 class="text-xl font-bold text-purple-300 mb-3"><%= @icon %> <%= @title %></h3> |
| + | <div class="space-y-2"> |
| + | <%= for {score, idx} <- Enum.with_index(@scores) do %> |
| + | <div class="flex items-center gap-3 p-2 bg-white/5 rounded-lg"> |
| + | <span class="text-purple-400 font-bold w-6"><%= idx + 1 %>.</span> |
| + | <span class="flex-1"><%= score.player.name %></span> |
| + | <span class="text-cyan-400 font-bold"><%= score.score %></span> |
| + | </div> |
| + | <% end %> |
| + | <%= if @scores == [] do %> |
| + | <p class="text-purple-400/50 text-center py-4 text-sm">No scores yet</p> |
| + | <% end %> |
| + | </div> |
| + | </div> |
| + | """ |
| + | end |
| + | end |
pi_day_web/plugs/require_player.ex b/lib/pi_day_web/plugs/require_player.ex
+22
-0
| @@ | @@ -0,0 +1,22 @@ |
| + | defmodule PiDayWeb.Plugs.RequirePlayer do |
| + | import Plug.Conn |
| + | import Phoenix.Controller |
| + | |
| + | def init(opts), do: opts |
| + | |
| + | def call(conn, _opts) do |
| + | token = get_session(conn, :player_token) |
| + | |
| + | if token do |
| + | case PiDay.Game.get_player_by_token(token) do |
| + | nil -> |
| + | conn |> redirect(to: "/") |> halt() |
| + | |
| + | player -> |
| + | assign(conn, :current_player, player) |
| + | end |
| + | else |
| + | conn |> redirect(to: "/") |> halt() |
| + | end |
| + | end |
| + | end |
pi_day_web/router.ex b/lib/pi_day_web/router.ex
+47
-0
| @@ | @@ -0,0 +1,47 @@ |
| + | defmodule PiDayWeb.Router do |
| + | use PiDayWeb, :router |
| + | |
| + | pipeline :browser do |
| + | plug :accepts, ["html"] |
| + | plug :fetch_session |
| + | plug :fetch_live_flash |
| + | plug :put_root_layout, html: {PiDayWeb.Layouts, :root} |
| + | plug :protect_from_forgery |
| + | plug :put_secure_browser_headers |
| + | end |
| + | |
| + | pipeline :require_player do |
| + | plug PiDayWeb.Plugs.RequirePlayer |
| + | end |
| + | |
| + | scope "/", PiDayWeb do |
| + | pipe_through :browser |
| + | |
| + | get "/", PageController, :home |
| + | post "/join", PageController, :join |
| + | end |
| + | |
| + | scope "/", PiDayWeb do |
| + | pipe_through [:browser, :require_player] |
| + | |
| + | get "/play", GameController, :play |
| + | end |
| + | |
| + | scope "/", PiDayWeb do |
| + | pipe_through :browser |
| + | |
| + | live "/spectate", SpectateLive |
| + | end |
| + | |
| + | # Enable LiveDashboard and Swoosh mailbox preview in development |
| + | if Application.compile_env(:pi_day, :dev_routes) do |
| + | import Phoenix.LiveDashboard.Router |
| + | |
| + | scope "/dev" do |
| + | pipe_through :browser |
| + | |
| + | live_dashboard "/dashboard", metrics: PiDayWeb.Telemetry |
| + | forward "/mailbox", Plug.Swoosh.MailboxPreview |
| + | end |
| + | end |
| + | end |
pi_day_web/telemetry.ex b/lib/pi_day_web/telemetry.ex
+93
-0
| @@ | @@ -0,0 +1,93 @@ |
| + | defmodule PiDayWeb.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} |
| + | ), |
| + | |
| + | # Database Metrics |
| + | summary("pi_day.repo.query.total_time", |
| + | unit: {:native, :millisecond}, |
| + | description: "The sum of the other measurements" |
| + | ), |
| + | summary("pi_day.repo.query.decode_time", |
| + | unit: {:native, :millisecond}, |
| + | description: "The time spent decoding the data received from the database" |
| + | ), |
| + | summary("pi_day.repo.query.query_time", |
| + | unit: {:native, :millisecond}, |
| + | description: "The time spent executing the query" |
| + | ), |
| + | summary("pi_day.repo.query.queue_time", |
| + | unit: {:native, :millisecond}, |
| + | description: "The time spent waiting for a database connection" |
| + | ), |
| + | summary("pi_day.repo.query.idle_time", |
| + | unit: {:native, :millisecond}, |
| + | description: |
| + | "The time the connection spent waiting before being checked out for the query" |
| + | ), |
| + | |
| + | # 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. |
| + | # {PiDayWeb, :count_users, []} |
| + | ] |
| + | end |
| + | end |
mix.exs
+95
-0
| @@ | @@ -0,0 +1,95 @@ |
| + | defmodule PiDay.MixProject do |
| + | use Mix.Project |
| + | |
| + | def project do |
| + | [ |
| + | app: :pi_day, |
| + | 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: {PiDay.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 |
| + | [ |
| + | {:phoenix, "~> 1.8.1"}, |
| + | {:phoenix_ecto, "~> 4.5"}, |
| + | {:ecto_sql, "~> 3.13"}, |
| + | {:postgrex, ">= 0.0.0"}, |
| + | {: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, "~> 0.26"}, |
| + | {: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", "ecto.setup", "assets.setup", "assets.build"], |
| + | "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"], |
| + | "ecto.reset": ["ecto.drop", "ecto.setup"], |
| + | test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"], |
| + | "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"], |
| + | "assets.build": ["compile", "tailwind pi_day", "esbuild pi_day", "esbuild pi_day_game"], |
| + | "assets.deploy": [ |
| + | "tailwind pi_day --minify", |
| + | "esbuild pi_day --minify", |
| + | "esbuild pi_day_game --minify", |
| + | "phx.digest" |
| + | ], |
| + | precommit: ["compile --warning-as-errors", "deps.unlock --unused", "format", "test"] |
| + | ] |
| + | end |
| + | end |
mix.lock
+46
-0
| @@ | @@ -0,0 +1,46 @@ |
| + | %{ |
| + | "bandit": {:hex, :bandit, "1.10.3", "1e5d168fa79ec8de2860d1b4d878d97d4fbbe2fdbe7b0a7d9315a4359d1d4bb9", [: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", "99a52d909c48db65ca598e1962797659e3c0f1d06e825a50c3d75b74a5e2db18"}, |
| + | "cc_precompiler": {:hex, :cc_precompiler, "0.1.11", "8c844d0b9fb98a3edea067f94f616b3f6b29b959b6b3bf25fee94ffe34364768", [:mix], [{:elixir_make, "~> 0.7", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "3427232caf0835f94680e5bcf082408a70b48ad68a5f5c0b02a3bea9f3a075b9"}, |
| + | "db_connection": {:hex, :db_connection, "2.9.0", "a6a97c5c958a2d7091a58a9be40caf41ab496b0701d21e1d1abff3fa27a7f371", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "17d502eacaf61829db98facf6f20808ed33da6ccf495354a41e64fe42f9c509c"}, |
| + | "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"}, |
| + | "dns_cluster": {:hex, :dns_cluster, "0.2.0", "aa8eb46e3bd0326bd67b84790c561733b25c5ba2fe3c7e36f28e88f384ebcb33", [:mix], [], "hexpm", "ba6f1893411c69c01b9e8e8f772062535a4cf70f3f35bcc964a324078d8c8240"}, |
| + | "ecto": {:hex, :ecto, "3.13.5", "9d4a69700183f33bf97208294768e561f5c7f1ecf417e0fa1006e4a91713a834", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "df9efebf70cf94142739ba357499661ef5dbb559ef902b68ea1f3c1fabce36de"}, |
| + | "ecto_sql": {:hex, :ecto_sql, "3.13.5", "2f8282b2ad97bf0f0d3217ea0a6fff320ead9e2f8770f810141189d182dc304e", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.13.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aa36751f4e6a2b56ae79efb0e088042e010ff4935fc8684e74c23b1f49e25fdc"}, |
| + | "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.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"}, |
| + | "fine": {:hex, :fine, "0.1.4", "b19a89c1476c7c57afb5f9314aed5960b5bc95d5277de4cb5ee8e1d1616ce379", [:mix], [], "hexpm", "be3324cc454a42d80951cf6023b9954e9ff27c6daa255483b3e8d608670303f5"}, |
| + | "gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"}, |
| + | "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.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, |
| + | "lazy_html": {:hex, :lazy_html, "0.1.10", "ffe42a0b4e70859cf21a33e12a251e0c76c1dff76391609bd56702a0ef5bc429", [:make, :mix], [{:cc_precompiler, "~> 0.1", [hex: :cc_precompiler, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.9.0", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:fine, "~> 0.1.0", [hex: :fine, repo: "hexpm", optional: false]}], "hexpm", "50f67e5faa09d45a99c1ddf3fac004f051997877dc8974c5797bb5ccd8e27058"}, |
| + | "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"}, |
| + | "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.5", "919db335247e6d4891764dc3063415b0d2457641c5f9b3751b5df03d8e20bbcf", [: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", "83b2bb125127e02e9f475c8e3e92736325b5b01b0b9b05407bcb4083b7a32485"}, |
| + | "phoenix_ecto": {:hex, :phoenix_ecto, "4.7.0", "75c4b9dfb3efdc42aec2bd5f8bccd978aca0651dbcbc7a3f362ea5d9d43153c6", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.1", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "1d75011e4254cb4ddf823e81823a9629559a1be93b4321a6a5f11a5306fbf4cc"}, |
| + | "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.27", "9afcab28b0c82afdc51044e661bcd5b8de53d242593d34c964a37710b40a42af", [: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", "415735d0b2c612c9104108b35654e977626a0cb346711e1e4f1ed16e3c827ede"}, |
| + | "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.1", "09bac17ae7a001a68ae393658aa23c7e38782be5c5c00c80be82901262c394c0", [: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", "560a0017a8f6d5d30146916862aaf9300b7280063651dd7e532b8be168511e62"}, |
| + | "plug_crypto": {:hex, :plug_crypto, "2.1.1", "19bda8184399cb24afa10be734f84a16ea0a2bc65054e23a62bb10f06bc89491", [:mix], [], "hexpm", "6470bce6ffe41c8bd497612ffde1a7e4af67f36a15eea5f921af71cf3e11247c"}, |
| + | "postgrex": {:hex, :postgrex, "0.22.0", "fb027b58b6eab1f6de5396a2abcdaaeb168f9ed4eccbb594e6ac393b02078cbd", [:mix], [{:db_connection, "~> 2.9", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "a68c4261e299597909e03e6f8ff5a13876f5caadaddd0d23af0d0a61afcc5d84"}, |
| + | "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"}, |
| + | "swoosh": {:hex, :swoosh, "1.23.0", "a1b7f41705357ffb06457d177e734bf378022901ce53889a68bcc59d10a23c27", [: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", "97aaf04481ce8a351e2d15a3907778bdf3b1ea071cfff3eb8728b65943c77f6d"}, |
| + | "tailwind": {:hex, :tailwind, "0.4.1", "e7bcc222fe96a1e55f948e76d13dd84a1a7653fb051d2a167135db3b4b08d3e9", [:mix], [], "hexpm", "6249d4f9819052911120dbdbe9e532e6bd64ea23476056adb7f730aa25c220d1"}, |
| + | "telemetry": {:hex, :telemetry, "1.4.1", "ab6de178e2b29b58e8256b92b382ea3f590a47152ca3651ea857a6cae05ac423", [:rebar3], [], "hexpm", "2172e05a27531d3d31dd9782841065c50dd5c3c7699d95266b2edd54c2dafa1c"}, |
| + | "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"}, |
| + | "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"}, |
| + | } |
priv/gettext/en/LC_MESSAGES/errors.po
+112
-0
| @@ | @@ -0,0 +1,112 @@ |
| + | ## `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" |
| + | |
| + | ## From Ecto.Changeset.cast/4 |
| + | msgid "can't be blank" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.unique_constraint/3 |
| + | msgid "has already been taken" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.put_change/3 |
| + | msgid "is invalid" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.validate_acceptance/3 |
| + | msgid "must be accepted" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.validate_format/3 |
| + | msgid "has invalid format" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.validate_subset/3 |
| + | msgid "has an invalid entry" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.validate_exclusion/3 |
| + | msgid "is reserved" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.validate_confirmation/3 |
| + | msgid "does not match confirmation" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.no_assoc_constraint/3 |
| + | msgid "is still associated with this entry" |
| + | msgstr "" |
| + | |
| + | msgid "are still associated with this entry" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.validate_length/3 |
| + | msgid "should have %{count} item(s)" |
| + | msgid_plural "should have %{count} item(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should be %{count} character(s)" |
| + | msgid_plural "should be %{count} character(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should be %{count} byte(s)" |
| + | msgid_plural "should be %{count} byte(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should have at least %{count} item(s)" |
| + | msgid_plural "should have at least %{count} item(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should be at least %{count} character(s)" |
| + | msgid_plural "should be at least %{count} character(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should be at least %{count} byte(s)" |
| + | msgid_plural "should be at least %{count} byte(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should have at most %{count} item(s)" |
| + | msgid_plural "should have at most %{count} item(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should be at most %{count} character(s)" |
| + | msgid_plural "should be at most %{count} character(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should be at most %{count} byte(s)" |
| + | msgid_plural "should be at most %{count} byte(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | ## From Ecto.Changeset.validate_number/3 |
| + | msgid "must be less than %{number}" |
| + | msgstr "" |
| + | |
| + | msgid "must be greater than %{number}" |
| + | msgstr "" |
| + | |
| + | msgid "must be less than or equal to %{number}" |
| + | msgstr "" |
| + | |
| + | msgid "must be greater than or equal to %{number}" |
| + | msgstr "" |
| + | |
| + | msgid "must be equal to %{number}" |
| + | msgstr "" |
priv/gettext/errors.pot
+109
-0
| @@ | @@ -0,0 +1,109 @@ |
| + | ## 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. |
| + | ## From Ecto.Changeset.cast/4 |
| + | msgid "can't be blank" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.unique_constraint/3 |
| + | msgid "has already been taken" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.put_change/3 |
| + | msgid "is invalid" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.validate_acceptance/3 |
| + | msgid "must be accepted" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.validate_format/3 |
| + | msgid "has invalid format" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.validate_subset/3 |
| + | msgid "has an invalid entry" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.validate_exclusion/3 |
| + | msgid "is reserved" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.validate_confirmation/3 |
| + | msgid "does not match confirmation" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.no_assoc_constraint/3 |
| + | msgid "is still associated with this entry" |
| + | msgstr "" |
| + | |
| + | msgid "are still associated with this entry" |
| + | msgstr "" |
| + | |
| + | ## From Ecto.Changeset.validate_length/3 |
| + | msgid "should have %{count} item(s)" |
| + | msgid_plural "should have %{count} item(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should be %{count} character(s)" |
| + | msgid_plural "should be %{count} character(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should be %{count} byte(s)" |
| + | msgid_plural "should be %{count} byte(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should have at least %{count} item(s)" |
| + | msgid_plural "should have at least %{count} item(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should be at least %{count} character(s)" |
| + | msgid_plural "should be at least %{count} character(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should be at least %{count} byte(s)" |
| + | msgid_plural "should be at least %{count} byte(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should have at most %{count} item(s)" |
| + | msgid_plural "should have at most %{count} item(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should be at most %{count} character(s)" |
| + | msgid_plural "should be at most %{count} character(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | msgid "should be at most %{count} byte(s)" |
| + | msgid_plural "should be at most %{count} byte(s)" |
| + | msgstr[0] "" |
| + | msgstr[1] "" |
| + | |
| + | ## From Ecto.Changeset.validate_number/3 |
| + | msgid "must be less than %{number}" |
| + | msgstr "" |
| + | |
| + | msgid "must be greater than %{number}" |
| + | msgstr "" |
| + | |
| + | msgid "must be less than or equal to %{number}" |
| + | msgstr "" |
| + | |
| + | msgid "must be greater than or equal to %{number}" |
| + | msgstr "" |
| + | |
| + | msgid "must be equal to %{number}" |
| + | msgstr "" |
priv/repo/migrations/.formatter.exs
+4
-0
| @@ | @@ -0,0 +1,4 @@ |
| + | [ |
| + | import_deps: [:ecto_sql], |
| + | inputs: ["*.exs"] |
| + | ] |
priv/repo/migrations/20260314011105_create_players_and_scores.exs
+30
-0
| @@ | @@ -0,0 +1,30 @@ |
| + | defmodule PiDay.Repo.Migrations.CreatePlayersAndScores do |
| + | use Ecto.Migration |
| + | |
| + | def change do |
| + | create table(:players, primary_key: false) do |
| + | add :id, :binary_id, primary_key: true |
| + | add :name, :string, null: false |
| + | add :avatar_key, :string, null: false |
| + | add :session_token, :string, null: false |
| + | add :total_score, :integer, default: 0, null: false |
| + | |
| + | timestamps(type: :utc_datetime) |
| + | end |
| + | |
| + | create unique_index(:players, [:session_token]) |
| + | |
| + | create table(:game_scores, primary_key: false) do |
| + | add :id, :binary_id, primary_key: true |
| + | add :player_id, references(:players, type: :binary_id, on_delete: :delete_all), null: false |
| + | add :game_type, :string, null: false |
| + | add :score, :integer, null: false, default: 0 |
| + | add :metadata, :map, default: %{} |
| + | |
| + | timestamps(type: :utc_datetime, updated_at: false) |
| + | end |
| + | |
| + | create index(:game_scores, [:player_id]) |
| + | create index(:game_scores, [:game_type]) |
| + | end |
| + | end |
priv/repo/seeds.exs
+11
-0
| @@ | @@ -0,0 +1,11 @@ |
| + | # Script for populating the database. You can run it as: |
| + | # |
| + | # mix run priv/repo/seeds.exs |
| + | # |
| + | # Inside the script, you can read and write to any of your |
| + | # repositories directly: |
| + | # |
| + | # PiDay.Repo.insert!(%PiDay.SomeSchema{}) |
| + | # |
| + | # We recommend using the bang functions (`insert!`, `update!` |
| + | # and so on) as they will fail if something goes wrong. |
priv/static/favicon.ico
+0
-0
priv/static/images/logo.svg
+6
-0
| @@ | @@ -0,0 +1,6 @@ |
| + | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 71 48" fill="currentColor" aria-hidden="true"> |
| + | <path |
| + | d="m26.371 33.477-.552-.1c-3.92-.729-6.397-3.1-7.57-6.829-.733-2.324.597-4.035 3.035-4.148 1.995-.092 3.362 1.055 4.57 2.39 1.557 1.72 2.984 3.558 4.514 5.305 2.202 2.515 4.797 4.134 8.347 3.634 3.183-.448 5.958-1.725 8.371-3.828.363-.316.761-.592 1.144-.886l-.241-.284c-2.027.63-4.093.841-6.205.735-3.195-.16-6.24-.828-8.964-2.582-2.486-1.601-4.319-3.746-5.19-6.611-.704-2.315.736-3.934 3.135-3.6.948.133 1.746.56 2.463 1.165.583.493 1.143 1.015 1.738 1.493 2.8 2.25 6.712 2.375 10.265-.068-5.842-.026-9.817-3.24-13.308-7.313-1.366-1.594-2.7-3.216-4.095-4.785-2.698-3.036-5.692-5.71-9.79-6.623C12.8-.623 7.745.14 2.893 2.361 1.926 2.804.997 3.319 0 4.149c.494 0 .763.006 1.032 0 2.446-.064 4.28 1.023 5.602 3.024.962 1.457 1.415 3.104 1.761 4.798.513 2.515.247 5.078.544 7.605.761 6.494 4.08 11.026 10.26 13.346 2.267.852 4.591 1.135 7.172.555ZM10.751 3.852c-.976.246-1.756-.148-2.56-.962 1.377-.343 2.592-.476 3.897-.528-.107.848-.607 1.306-1.336 1.49Zm32.002 37.924c-.085-.626-.62-.901-1.04-1.228-1.857-1.446-4.03-1.958-6.333-2-1.375-.026-2.735-.128-4.031-.61-.595-.22-1.26-.505-1.244-1.272.015-.78.693-1 1.31-1.184.505-.15 1.026-.247 1.6-.382-1.46-.936-2.886-1.065-4.787-.3-2.993 1.202-5.943 1.06-8.926-.017-1.684-.608-3.179-1.563-4.735-2.408l-.077.057c1.29 2.115 3.034 3.817 5.004 5.271 3.793 2.8 7.936 4.471 12.784 3.73A66.714 66.714 0 0 1 37 40.877c1.98-.16 3.866.398 5.753.899Zm-9.14-30.345c-.105-.076-.206-.266-.42-.069 1.745 2.36 3.985 4.098 6.683 5.193 4.354 1.767 8.773 2.07 13.293.51 3.51-1.21 6.033-.028 7.343 3.38.19-3.955-2.137-6.837-5.843-7.401-2.084-.318-4.01.373-5.962.94-5.434 1.575-10.485.798-15.094-2.553Zm27.085 15.425c.708.059 1.416.123 2.124.185-1.6-1.405-3.55-1.517-5.523-1.404-3.003.17-5.167 1.903-7.14 3.972-1.739 1.824-3.31 3.87-5.903 4.604.043.078.054.117.066.117.35.005.699.021 1.047.005 3.768-.17 7.317-.965 10.14-3.7.89-.86 1.685-1.817 2.544-2.71.716-.746 1.584-1.159 2.645-1.07Zm-8.753-4.67c-2.812.246-5.254 1.409-7.548 2.943-1.766 1.18-3.654 1.738-5.776 1.37-.374-.066-.75-.114-1.124-.17l-.013.156c.135.07.265.151.405.207.354.14.702.308 1.07.395 4.083.971 7.992.474 11.516-1.803 2.221-1.435 4.521-1.707 7.013-1.336.252.038.503.083.756.107.234.022.479.255.795.003-2.179-1.574-4.526-2.096-7.094-1.872Zm-10.049-9.544c1.475.051 2.943-.142 4.486-1.059-.452.04-.643.04-.827.076-2.126.424-4.033-.04-5.733-1.383-.623-.493-1.257-.974-1.889-1.457-2.503-1.914-5.374-2.555-8.514-2.5.05.154.054.26.108.315 3.417 3.455 7.371 5.836 12.369 6.008Zm24.727 17.731c-2.114-2.097-4.952-2.367-7.578-.537 1.738.078 3.043.632 4.101 1.728a13 13 0 0 0 1.182 1.106c1.6 1.29 4.311 1.352 5.896.155-1.861-.726-1.861-.726-3.601-2.452Zm-21.058 16.06c-1.858-3.46-4.981-4.24-8.59-4.008a9.667 9.667 0 0 1 2.977 1.39c.84.586 1.547 1.311 2.243 2.055 1.38 1.473 3.534 2.376 4.962 2.07-.656-.412-1.238-.848-1.592-1.507Zl-.006.006-.036-.004.021.018.012.053Za.127.127 0 0 0 .015.043c.005.008.038 0 .058-.002Zl-.008.01.005.026.024.014Z" |
| + | fill="#FD4F00" |
| + | /> |
| + | </svg> |
priv/static/robots.txt
+5
-0
| @@ | @@ -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: / |
controllers/error_html_test.exs b/test/pi_day_web/controllers/error_html_test.exs
+14
-0
| @@ | @@ -0,0 +1,14 @@ |
| + | defmodule PiDayWeb.ErrorHTMLTest do |
| + | use PiDayWeb.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(PiDayWeb.ErrorHTML, "404", "html", []) == "Not Found" |
| + | end |
| + | |
| + | test "renders 500.html" do |
| + | assert render_to_string(PiDayWeb.ErrorHTML, "500", "html", []) == "Internal Server Error" |
| + | end |
| + | end |
controllers/error_json_test.exs b/test/pi_day_web/controllers/error_json_test.exs
+12
-0
| @@ | @@ -0,0 +1,12 @@ |
| + | defmodule PiDayWeb.ErrorJSONTest do |
| + | use PiDayWeb.ConnCase, async: true |
| + | |
| + | test "renders 404" do |
| + | assert PiDayWeb.ErrorJSON.render("404.json", %{}) == %{errors: %{detail: "Not Found"}} |
| + | end |
| + | |
| + | test "renders 500" do |
| + | assert PiDayWeb.ErrorJSON.render("500.json", %{}) == |
| + | %{errors: %{detail: "Internal Server Error"}} |
| + | end |
| + | end |
controllers/page_controller_test.exs b/test/pi_day_web/controllers/page_controller_test.exs
+8
-0
| @@ | @@ -0,0 +1,8 @@ |
| + | defmodule PiDayWeb.PageControllerTest do |
| + | use PiDayWeb.ConnCase |
| + | |
| + | test "GET /", %{conn: conn} do |
| + | conn = get(conn, ~p"/") |
| + | assert html_response(conn, 200) =~ "Peace of mind from prototype to production" |
| + | end |
| + | end |
test/support/conn_case.ex
+38
-0
| @@ | @@ -0,0 +1,38 @@ |
| + | defmodule PiDayWeb.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 PiDayWeb.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 PiDayWeb.Endpoint |
| + | |
| + | use PiDayWeb, :verified_routes |
| + | |
| + | # Import conveniences for testing with connections |
| + | import Plug.Conn |
| + | import Phoenix.ConnTest |
| + | import PiDayWeb.ConnCase |
| + | end |
| + | end |
| + | |
| + | setup tags do |
| + | PiDay.DataCase.setup_sandbox(tags) |
| + | {:ok, conn: Phoenix.ConnTest.build_conn()} |
| + | end |
| + | end |
test/support/data_case.ex
+58
-0
| @@ | @@ -0,0 +1,58 @@ |
| + | defmodule PiDay.DataCase do |
| + | @moduledoc """ |
| + | This module defines the setup for tests requiring |
| + | access to the application's data layer. |
| + | |
| + | You may define functions here to be used as helpers in |
| + | your tests. |
| + | |
| + | 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 PiDay.DataCase, async: true`, although |
| + | this option is not recommended for other databases. |
| + | """ |
| + | |
| + | use ExUnit.CaseTemplate |
| + | |
| + | using do |
| + | quote do |
| + | alias PiDay.Repo |
| + | |
| + | import Ecto |
| + | import Ecto.Changeset |
| + | import Ecto.Query |
| + | import PiDay.DataCase |
| + | end |
| + | end |
| + | |
| + | setup tags do |
| + | PiDay.DataCase.setup_sandbox(tags) |
| + | :ok |
| + | end |
| + | |
| + | @doc """ |
| + | Sets up the sandbox based on the test tags. |
| + | """ |
| + | def setup_sandbox(tags) do |
| + | pid = Ecto.Adapters.SQL.Sandbox.start_owner!(PiDay.Repo, shared: not tags[:async]) |
| + | on_exit(fn -> Ecto.Adapters.SQL.Sandbox.stop_owner(pid) end) |
| + | end |
| + | |
| + | @doc """ |
| + | A helper that transforms changeset errors into a map of messages. |
| + | |
| + | assert {:error, changeset} = Accounts.create_user(%{password: "short"}) |
| + | assert "password is too short" in errors_on(changeset).password |
| + | assert %{password: ["password is too short"]} = errors_on(changeset) |
| + | |
| + | """ |
| + | def errors_on(changeset) do |
| + | Ecto.Changeset.traverse_errors(changeset, fn {message, opts} -> |
| + | Regex.replace(~r"%{(\w+)}", message, fn _, key -> |
| + | opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string() |
| + | end) |
| + | end) |
| + | end |
| + | end |
test/test_helper.exs
+2
-0
| @@ | @@ -0,0 +1,2 @@ |
| + | ExUnit.start() |
| + | Ecto.Adapters.SQL.Sandbox.mode(PiDay.Repo, :manual) |