{
  "id": "calendar-popover",
  "name": "CalendarPopover",
  "kind": "component",
  "status": "stable-reference",
  "summary": "Date picker popover based on Task Manager DateDropdown and nodedc-calendar-shell styling.",
  "implementation": {
    "baseLibrary": "react-day-picker@9.5.0",
    "localePackage": "date-fns@4.1.0",
    "launcherComponent": "NodeDcDateField renders NodeDcDropdown + NodeDcCalendar; NodeDcCalendar delegates the month grid/range math to DayPicker instead of a hand-written grid.",
    "isolation": "Calendar logic and styling live in src/shared/nodedc-ui/Calendar.tsx and src/shared/nodedc-ui/calendar.css. Feature screens must consume NodeDcDateField or NodeDcCalendar directly instead of creating local date wrappers."
  },
  "sourceRefs": [
    {
      "project": "nodedc_taskmanager",
      "file": "plane-src/apps/web/core/components/dropdowns/date.tsx",
      "exports": ["DateDropdown"]
    },
    {
      "project": "nodedc_taskmanager",
      "file": "plane-src/apps/web/styles/globals.css",
      "classes": ["nodedc-calendar-shell"]
    },
    {
      "project": "nodedc_launcher",
      "file": "src/shared/nodedc-ui/Calendar.tsx",
      "exports": [
        "NodeDcDateField",
        "NodeDcCalendar",
        "NodeDcDateFieldProps",
        "NodeDcCalendarProps",
        "NodeDcCalendarRangePreview",
        "NodeDcDateInput",
        "NodeDcWeekStartsOn"
      ]
    },
    {
      "project": "nodedc_launcher",
      "file": "src/shared/nodedc-ui/calendar.css",
      "classes": ["nodedc-ui-calendar", "nodedc-ui-calendar-frame", "nodedc-ui-date-trigger"]
    },
    {
      "project": "nodedc_launcher",
      "file": "src/widgets/admin-overlay/AdminOverlay.tsx",
      "consumers": ["ClientsSection", "ClientEditorModal", "InvitesSection"]
    }
  ],
  "anatomy": [
    "date trigger button",
    "portal dropdown surface",
    "calendar shell",
    "month/year controls",
    "day buttons",
    "single or range mode"
  ],
  "visualContract": {
    "surface": "DropdownSurface",
    "calendarRadius": "1.1rem",
    "dayButtonRadius": "999px",
    "selectedRangeFill": "continuous accent row fill under the day numbers; row breaks create rounded start/end caps",
    "todayMarker": "today is always a circular ring marker; inside an accent range the ring uses the dark on-accent color and the day cell remains range-filled, not solid-filled",
    "outsideDays": "muted"
  },
  "behaviorContract": [
    "Default placement bottom-start.",
    "Render through portal.",
    "Support minDate, maxDate, clearable value, closeOnSelect, empty labels, popover width, and start-of-week preference.",
    "Close on select when closeOnSelect is true.",
    "When rangePreview or rangeStart/rangeEnd are present, render a continuous accent range preview while still selecting one field value.",
    "When only one date is present, render a single circular selected date.",
    "Today must not be solid-filled. It uses an inset circular ring both outside and inside a range; inside a range the row fill remains visible behind the ring."
  ],
  "currentConsumers": [
    "Client demo/contract/paid dates",
    "Invite expiration dates",
    "Any future date field in admin modals and tables"
  ]
}
