{"version":3,"file":"CalendarTable.cjs","sources":["../../../src/components/Calendar/CalendarTable.tsx"],"sourcesContent":["import dayjs from 'dayjs'\nimport {\n  type ComponentPropsWithoutRef,\n  type FC,\n  type MouseEvent,\n  memo,\n  useCallback,\n  useMemo,\n} from 'react'\nimport { tv } from 'tailwind-variants'\n\nimport { useIntl } from '../../intl'\nimport { UnstyledButton } from '../Button'\n\nimport { isBetween } from './calendarHelper'\n\ntype AbstractProps = {\n  /** 現在の日付 */\n  current: {\n    day: DayJsType\n    months: Array<Array<number | null>>\n  }\n  /** 選択可能な開始日 */\n  from: Date\n  /** 選択可能な終了日 */\n  to: Date\n  /** トリガのセレクトイベントを処理するハンドラ */\n  onSelectDate: (e: MouseEvent, date: Date) => void\n  /** 選択された日付 */\n  selectedDayText: string\n}\ntype Props = AbstractProps & Omit<ComponentPropsWithoutRef<'table'>, keyof AbstractProps>\n\ntype DayJsType = ReturnType<typeof dayjs>\n\n// 2024年1月の最初の週の日曜日を基準日として定義\nconst BASE_CALENDAR_START = dayjs('2024-01-07')\n\nconst classNameGenerator = tv({\n  slots: {\n    wrapper: 'shr-px-0.75 shr-pb-1 shr-pt-0.25',\n    table: 'smarthr-ui-CalendarTable shr-border-spacing-0 shr-text-base shr-text-black',\n    th: 'smarthr-ui-CalendarTable-headCell shr-px-0 shr-py-0.5 shr-text-center shr-align-middle shr-font-normal shr-text-grey',\n    td: 'smarthr-ui-CalendarTable-dataCell shr-p-0 shr-align-middle',\n    cellButton:\n      'shr-group shr-flex shr-items-center shr-justify-center shr-px-0.5 shr-py-0.25 disabled:shr-cursor-not-allowed disabled:shr-text-disabled',\n    dateCell: [\n      'shr-box-border shr-flex shr-h-[1.75rem] shr-w-[1.75rem] shr-items-center shr-justify-center shr-rounded-[50%] shr-leading-[0] group-[:not(:disabled)]:group-hover:shr-bg-base-grey group-[:not(:disabled)]:group-hover:shr-text-black',\n      '[[aria-pressed=\"true\"]>&&&]:shr-bg-main [[aria-pressed=\"true\"]>&&&]:shr-text-white',\n      '[[data-is-today=\"true\"]>&&&]:shr-border-shorthand [[aria-pressed=\"true\"]>&&&]:contrast-more:shr-border-high-contrast',\n    ],\n  },\n})\n\nexport const CalendarTable: FC<Props> = ({\n  current,\n  from,\n  to,\n  onSelectDate,\n  selectedDayText,\n  className,\n  ...rest\n}) => {\n  const { formatDate, getWeekStartDay } = useIntl()\n\n  const classNames = useMemo(() => {\n    const { wrapper, table, th, td, cellButton, dateCell } = classNameGenerator()\n\n    return {\n      wrapper: wrapper({ className }),\n      table: table(),\n      th: th(),\n      td: td(),\n      cellButton: cellButton(),\n      dateCell: dateCell(),\n    }\n  }, [className])\n\n  // ロケールに応じた週の開始日から国際化された曜日名を生成\n  const daysInWeek = useMemo(() => {\n    const weekStartDay = getWeekStartDay()\n    const days = []\n\n    for (let i = 0; i < 7; i++) {\n      const dayOfWeek = (weekStartDay + i) % 7\n      const baseDate = BASE_CALENDAR_START.add(dayOfWeek, 'day').toDate()\n      days.push(\n        formatDate({\n          date: baseDate,\n          parts: ['weekday'],\n          options: { capitalizeFirstLetter: true },\n        }),\n      )\n    }\n\n    return days\n  }, [formatDate, getWeekStartDay])\n\n  // HINT: dayjsのisSameは文字列でも比較可能なため、cacheが効きやすいstringにする\n  const nowDateText = dayjs().startOf('date').toString()\n\n  return (\n    <div className={classNames.wrapper}>\n      <table {...rest} className={classNames.table}>\n        <MemoizedThead thStyle={classNames.th} daysInWeek={daysInWeek} />\n        <tbody>\n          {current.months.map((week, weekIndex) => (\n            <tr key={weekIndex}>\n              {week.map((date, dateIndex) =>\n                date ? (\n                  <SelectTdButton\n                    key={dateIndex}\n                    date={date}\n                    currentDay={current.day}\n                    selectedDayText={selectedDayText}\n                    from={from}\n                    to={to}\n                    nowDateText={nowDateText}\n                    onClick={onSelectDate}\n                    classNames={classNames}\n                  />\n                ) : (\n                  <NullTd key={dateIndex} className={classNames.td} />\n                ),\n              )}\n            </tr>\n          ))}\n        </tbody>\n      </table>\n    </div>\n  )\n}\n\nconst MemoizedThead = memo<{ thStyle: string; daysInWeek: string[] }>(({ thStyle, daysInWeek }) => (\n  <thead>\n    <tr>\n      {daysInWeek.map((day) => (\n        <th key={day} className={thStyle}>\n          {day}\n        </th>\n      ))}\n    </tr>\n  </thead>\n))\n\nconst NullTd = memo<{ className: string }>(({ className }) => <td className={className} />)\n\nconst SelectTdButton = memo<{\n  date: number\n  currentDay: DayJsType\n  selectedDayText: string\n  from: Date\n  to: Date\n  nowDateText: string\n  onClick: Props['onSelectDate']\n  classNames: {\n    td: string\n    cellButton: string\n    dateCell: string\n  }\n}>(({ date, currentDay, selectedDayText, from, to, nowDateText, onClick, classNames }) => {\n  const target = useMemo(() => {\n    const day = currentDay.date(date)\n\n    return {\n      day,\n      date: day.toDate(),\n    }\n  }, [currentDay, date])\n  const disabled = useMemo(() => !isBetween(target.date, from, to), [target.date, from, to])\n  const ariaPressed = useMemo(\n    () => target.day.isSame(selectedDayText, 'date'),\n    [selectedDayText, target.day],\n  )\n  const dataIsToday = useMemo(\n    () => target.day.isSame(nowDateText, 'date'),\n    [nowDateText, target.day],\n  )\n\n  const actualOnClick = useCallback(\n    (e: MouseEvent<HTMLButtonElement>) => {\n      onClick(e, target.date)\n    },\n    [onClick, target.date],\n  )\n\n  return (\n    <td className={classNames.td}>\n      <UnstyledButton\n        type=\"button\"\n        disabled={disabled}\n        aria-pressed={ariaPressed}\n        onClick={actualOnClick}\n        className={classNames.cellButton}\n        data-is-today={dataIsToday}\n      >\n        <SelectButtonTdDateCell className={classNames.dateCell}>{date}</SelectButtonTdDateCell>\n      </UnstyledButton>\n    </td>\n  )\n})\n\nconst SelectButtonTdDateCell = memo<{ children: number; className: string }>(\n  ({ children, className }) => <span className={className}>{children}</span>,\n)\n"],"names":["dayjs","tv","useIntl","useMemo","_jsx","_jsxs","memo","isBetween","useCallback","UnstyledButton"],"mappings":";;;;;;;;;;;;;;AAmCA;AACA,MAAM,mBAAmB,GAAGA,SAAK,CAAC,YAAY,CAAC;AAE/C,MAAM,kBAAkB,GAAGC,QAAE,CAAC;AAC5B,IAAA,KAAK,EAAE;AACL,QAAA,OAAO,EAAE,kCAAkC;AAC3C,QAAA,KAAK,EAAE,4EAA4E;AACnF,QAAA,EAAE,EAAE,sHAAsH;AAC1H,QAAA,EAAE,EAAE,4DAA4D;AAChE,QAAA,UAAU,EACR,0IAA0I;AAC5I,QAAA,QAAQ,EAAE;YACR,uOAAuO;YACvO,oFAAoF;YACpF,sHAAsH;AACvH,SAAA;AACF,KAAA;AACF,CAAA,CAAC;MAEW,aAAa,GAAc,CAAC,EACvC,OAAO,EACP,IAAI,EACJ,EAAE,EACF,YAAY,EACZ,eAAe,EACf,SAAS,EACT,GAAG,IAAI,EACR,KAAI;IACH,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAGC,oBAAO,EAAE;AAEjD,IAAA,MAAM,UAAU,GAAGC,aAAO,CAAC,MAAK;AAC9B,QAAA,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,kBAAkB,EAAE;QAE7E,OAAO;AACL,YAAA,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;YAC/B,KAAK,EAAE,KAAK,EAAE;YACd,EAAE,EAAE,EAAE,EAAE;YACR,EAAE,EAAE,EAAE,EAAE;YACR,UAAU,EAAE,UAAU,EAAE;YACxB,QAAQ,EAAE,QAAQ,EAAE;SACrB;AACH,IAAA,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;;AAGf,IAAA,MAAM,UAAU,GAAGA,aAAO,CAAC,MAAK;AAC9B,QAAA,MAAM,YAAY,GAAG,eAAe,EAAE;QACtC,MAAM,IAAI,GAAG,EAAE;AAEf,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,SAAS,GAAG,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC;AACxC,YAAA,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE;AACnE,YAAA,IAAI,CAAC,IAAI,CACP,UAAU,CAAC;AACT,gBAAA,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,CAAC,SAAS,CAAC;AAClB,gBAAA,OAAO,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE;AACzC,aAAA,CAAC,CACH;QACH;AAEA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;;AAGjC,IAAA,MAAM,WAAW,GAAGH,SAAK,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;AAEtD,IAAA,QACEI,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,UAAU,CAAC,OAAO,EAAA,QAAA,EAChCC,eAAA,CAAA,OAAA,EAAA,EAAA,GAAW,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,EAAA,QAAA,EAAA,CAC1CD,cAAA,CAAC,aAAa,EAAA,EAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,EAAA,CAAI,EACjEA,cAAA,CAAA,OAAA,EAAA,EAAA,QAAA,EACG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,MAClCA,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EACG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,KACxB,IAAI,IACFA,cAAA,CAAC,cAAc,EAAA,EAEb,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,OAAO,CAAC,GAAG,EACvB,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,EAAE,EACN,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,UAAU,EAAA,EARjB,SAAS,CASd,KAEFA,cAAA,CAAC,MAAM,EAAA,EAAiB,SAAS,EAAE,UAAU,CAAC,EAAE,EAAA,EAAnC,SAAS,CAA8B,CACrD,CACF,EAAA,EAjBM,SAAS,CAkBb,CACN,CAAC,EAAA,CACI,CAAA,EAAA,CACF,EAAA,CACJ;AAEV;AAEA,MAAM,aAAa,GAAGE,UAAI,CAA4C,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAC5FF,oCACEA,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EACG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,MAClBA,cAAA,CAAA,IAAA,EAAA,EAAc,SAAS,EAAE,OAAO,EAAA,QAAA,EAC7B,GAAG,EAAA,EADG,GAAG,CAEP,CACN,CAAC,GACC,EAAA,CACC,CACT,CAAC;AAEF,MAAM,MAAM,GAAGE,UAAI,CAAwB,CAAC,EAAE,SAAS,EAAE,KAAKF,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAE,SAAS,EAAA,CAAI,CAAC;AAE3F,MAAM,cAAc,GAAGE,UAAI,CAaxB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,KAAI;AACvF,IAAA,MAAM,MAAM,GAAGH,aAAO,CAAC,MAAK;QAC1B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAEjC,OAAO;YACL,GAAG;AACH,YAAA,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE;SACnB;AACH,IAAA,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACtB,IAAA,MAAM,QAAQ,GAAGA,aAAO,CAAC,MAAM,CAACI,4CAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1F,MAAM,WAAW,GAAGJ,aAAO,CACzB,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,EAChD,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,CAC9B;IACD,MAAM,WAAW,GAAGA,aAAO,CACzB,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,EAC5C,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAC1B;AAED,IAAA,MAAM,aAAa,GAAGK,iBAAW,CAC/B,CAAC,CAAgC,KAAI;AACnC,QAAA,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC;IACzB,CAAC,EACD,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CACvB;IAED,QACEJ,uBAAI,SAAS,EAAE,UAAU,CAAC,EAAE,YAC1BA,cAAA,CAACK,+CAAc,IACb,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,EAAA,cAAA,EACJ,WAAW,EACzB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,UAAU,CAAC,UAAU,EAAA,eAAA,EACjB,WAAW,EAAA,QAAA,EAE1BL,cAAA,CAAC,sBAAsB,EAAA,EAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAA,QAAA,EAAG,IAAI,EAAA,CAA0B,EAAA,CACxE,EAAA,CACd;AAET,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAGE,UAAI,CACjC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAKF,yBAAM,SAAS,EAAE,SAAS,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAQ,CAC3E;;;;"}