Date Picker

Visual date selector.

18/08/2026 (DD/MM/YYYY)
MTWTFSS 3456789 10111213141516 17181920212223

html

<div class="dp">
  <label class="dp__label" for="dp-1">Appointment date</label>
  <details class="dp__details">
    <summary class="dp__summary" id="dp-1">
      <span class="dp__value">18/08/2026</span>
      <span class="dp__format">(DD/MM/YYYY)</span>
    </summary>
    <div class="dp__panel" style="--accent:#D9C8F0;">
      <div class="dp__grid">
        <span class="dp__day dp__day--head">M</span><span class="dp__day dp__day--head">T</span><span class="dp__day dp__day--head">W</span><span class="dp__day dp__day--head">T</span><span class="dp__day dp__day--head">F</span><span class="dp__day dp__day--head">S</span><span class="dp__day dp__day--head">S</span>
        <span class="dp__day">3</span><span class="dp__day">4</span><span class="dp__day">5</span><span class="dp__day">6</span><span class="dp__day">7</span><span class="dp__day">8</span><span class="dp__day">9</span>
        <span class="dp__day">10</span><span class="dp__day">11</span><span class="dp__day">12</span><span class="dp__day">13</span><span class="dp__day">14</span><span class="dp__day">15</span><span class="dp__day">16</span>
        <span class="dp__day dp__day--sel">17</span><span class="dp__day dp__day--today">18</span><span class="dp__day">19</span><span class="dp__day">20</span><span class="dp__day">21</span><span class="dp__day">22</span><span class="dp__day">23</span>
      </div>
    </div>
  </details>
</div>
<style>
.dp { font: 14px system-ui, sans-serif; color: #241430; max-width: 260px; }
.dp__label { display: block; margin-bottom: 6px; font-weight: 500; }
.dp__req { color: #241430; }
.dp__summary { display: flex; justify-content: space-between; gap: 8px; align-items: center; list-style: none; cursor: pointer; padding: 10px 12px; border: 1.5px solid #24143040; border-radius: 8px; background: #FAF7F2; }
.dp__summary::-webkit-details-marker { display: none; }
.dp__format { color: #24143099; font-size: 12px; }
.dp__details[open] .dp__summary { border-color: var(--accent); }
.dp__panel { margin-top: 8px; padding: 10px; border: 1.5px solid #24143020; border-radius: 8px; }
.dp__grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; text-align: center; font-size: 12px; }
.dp__day--head { color: #24143080; font-weight: 600; }
.dp__day--today { border: 1.5px solid var(--accent); border-radius: 4px; }
.dp__day--sel { background: var(--accent); border-radius: 4px; }
</style>

tailwind

<div class="font-sans text-sm text-[#241430] max-w-[260px]">
  <label class="block mb-1.5 font-medium" for="dp-tw-1">Appointment date</label>
  <details class="dp-tw-details">
    <summary id="dp-tw-1" class="flex justify-between items-center gap-2 list-none cursor-pointer px-3 py-2.5 border-[1.5px] border-[#24143040] rounded-lg bg-[#FAF7F2]" style="border-color:#D9C8F0;">
      <span>18/08/2026</span>
      <span class="text-xs text-[#24143099]">(DD/MM/YYYY)</span>
    </summary>
    <div class="mt-2 p-2.5 border-[1.5px] border-[#24143020] rounded-lg grid grid-cols-7 gap-1 text-center text-xs">
      <span class="font-semibold text-[#24143080]">M</span><span class="font-semibold text-[#24143080]">T</span><span class="font-semibold text-[#24143080]">W</span><span class="font-semibold text-[#24143080]">T</span><span class="font-semibold text-[#24143080]">F</span><span class="font-semibold text-[#24143080]">S</span><span class="font-semibold text-[#24143080]">S</span>
      <span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span>
      <span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span><span>16</span>
      <span class="rounded" style="background:#D9C8F0;">17</span><span class="rounded border-[1.5px]" style="border-color:#D9C8F0;">18</span><span>19</span><span>20</span><span>21</span><span>22</span><span>23</span>
    </div>
  </details>
</div>
<style>
.dp-tw-details summary::-webkit-details-marker { display: none; }
</style>

react

export function DatePicker({
  label = "Appointment date",
  format = "DD/MM/YYYY",
  value = "18/08/2026",
  accent = "#D9C8F0",
  required = false,
}) {
  return (
    <div style={{ fontFamily: "system-ui, sans-serif", fontSize: 14, color: "#241430", maxWidth: 260 }}>
      <label style={{ display: "block", marginBottom: 6, fontWeight: 500 }}>{label}{required && " *"}</label>
      <details>
        <summary style={{
          display: "flex", justifyContent: "space-between", alignItems: "center", gap: 8, listStyle: "none",
          cursor: "pointer", padding: "10px 12px", border: `1.5px solid ${accent}`, borderRadius: 8, background: "#FAF7F2",
        }}>
          <span>{value}</span>
          <span style={{ color: "#24143099", fontSize: 12 }}>({format})</span>
        </summary>
        <div style={{ marginTop: 8, padding: 10, border: "1.5px solid #24143020", borderRadius: 8, display: "grid", gridTemplateColumns: "repeat(7, 1fr)", gap: 4, textAlign: "center", fontSize: 12 }}>
          {["M","T","W","T","F","S","S"].map((d, i) => <span key={i} style={{ fontWeight: 600, color: "#24143080" }}>{d}</span>)}
          {[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23].map((d) => (
            <span key={d} style={{
              borderRadius: 4,
              background: d === 17 ? accent : undefined,
              border: d === 18 ? `1.5px solid ${accent}` : undefined,
            }}>{d}</span>
          ))}
        </div>
      </details>
    </div>
  );
}