defmodule Skua.Components.Date do @moduledoc """ A date input — a hidden ISO `` that carries the value plus a trigger that opens a keyboard-navigable calendar (W3C APG date-grid pattern). <.date_input field={@form[:due_on]} label="Due date" /> <.date_input field={@form[:start]} min="2026-01-01" max="2026-12-31" /> The hidden input holds `yyyy-mm-dd`, so `phx-change`/`phx-submit` and Ecto `:date` casting work unchanged. The calendar grid supports arrow keys (±1 day / ±1 week), Home/End (week), PageUp/PageDown (month), and Enter/Space to pick. """ use Phoenix.Component alias Skua.Components.Form alias Skua.Field attr :field, Phoenix.HTML.FormField, default: nil attr :id, :string, default: nil attr :name, :string, default: nil attr :value, :any, default: nil, doc: "ISO yyyy-mm-dd" attr :min, :string, default: nil attr :max, :string, default: nil attr :today, :string, default: nil attr :label, :string, default: nil attr :hint, :string, default: nil attr :errors, :list, default: nil attr :required, :boolean, default: false attr :placeholder, :string, default: "Pick a date…" attr :time, :boolean, default: false, doc: "also pick a time (datetime value)" attr :time_format, :string, default: "12", values: ~w(12 24), doc: "12h AM/PM or 24h military" def date_input(assigns) do assigns = assigns |> assign_new(:time, fn -> false end) |> assign_new(:time_format, fn -> "12" end) |> Field.normalize() |> then(fn a -> assign(a, :id, a.id || "sk-date") end) assigns = assigns |> assign(:value, iso(assigns.value)) |> assign(:describedby, describedby(assigns)) ~H"""