@softium/calendar 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/i18n.ts","../src/utils/color.ts","../src/components/CategoryItem.tsx","../src/components/CategoryFilter.tsx","../src/utils/date.ts","../src/components/DeleteOptionsDialog.tsx","../src/components/SegmentTabs.tsx","../src/components/RecurrenceSection.tsx","../src/components/EventModal.tsx","../src/components/RecurrenceScopeDialog.tsx","../src/hooks/useCalendar.ts","../src/utils/events.ts","../src/views/DayView.tsx","../src/views/MonthView.tsx","../src/views/WeekView.tsx","../src/views/YearView.tsx","../src/Calendar.tsx","../src/index.ts"],"names":["useState","useRef","useEffect","jsxs","jsx","Check","MoreVertical","Pencil","Trash2","ChevronDown","Plus","Fragment","useMemo","X","Minus","OPTIONS","useCallback","Repeat","startOfDay","HOURS","MIN_EVENT_MINUTES","ChevronLeft","ChevronRight","Undo2","Redo2","Search"],"mappings":"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","file":"index.cjs","sourcesContent":["/** The calendar ships ko/en strings inline (like the source), chosen by `language`. */\nexport type CalLocale = 'ko' | 'en';\n\nexport function pick(language: string, ko: string, en: string): string {\n return language === 'ko' ? ko : en;\n}\n","/** Apple-style category color presets (ported from calendary). */\nexport const COLOR_PRESETS = [\n '#E30000',\n '#FF9500',\n '#FFCC00',\n '#34C759',\n '#30B0C7',\n '#007AFF',\n '#5856D6',\n '#AF52DE',\n '#FF3B30',\n '#A2845E',\n];\n\nconst DEFAULT_COLOR = '#E30000';\n\n/** nearest preset to an arbitrary hex, by RGB euclidean distance */\nexport function findClosestPresetColor(hex: string): string {\n const parse = (h: string): [number, number, number] => {\n const c = h.replace('#', '');\n return [\n Number.parseInt(c.substring(0, 2), 16),\n Number.parseInt(c.substring(2, 4), 16),\n Number.parseInt(c.substring(4, 6), 16),\n ];\n };\n try {\n const [r, g, b] = parse(hex);\n let minDist = Number.POSITIVE_INFINITY;\n let closest = COLOR_PRESETS[0] as string;\n for (const preset of COLOR_PRESETS) {\n const [pr, pg, pb] = parse(preset);\n const dist = (r - pr) ** 2 + (g - pg) ** 2 + (b - pb) ** 2;\n if (dist < minDist) {\n minDist = dist;\n closest = preset;\n }\n }\n return closest;\n } catch {\n return DEFAULT_COLOR;\n }\n}\n\n/** hex → rgba at the given alpha (used for the event-chip fill tint) */\nexport function withAlpha(color: string | undefined, alpha: number): string {\n const hex = (color ?? DEFAULT_COLOR).replace('#', '');\n const r = Number.parseInt(hex.substring(0, 2), 16);\n const g = Number.parseInt(hex.substring(2, 4), 16);\n const b = Number.parseInt(hex.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","import { Check, MoreVertical, Pencil, Trash2 } from 'lucide-react';\nimport { type DragEvent, useEffect, useRef, useState } from 'react';\nimport { pick } from '../i18n';\nimport type { Category } from '../types';\n\nexport interface CategoryItemProps {\n cat: Category;\n index: number;\n checked: boolean;\n language: string;\n colorPalette: string[];\n /** whether this row is in inline-edit mode */\n editing: boolean;\n onToggle: (id: string) => void;\n onEditStart: (cat: Category) => void;\n onEditCommit: (id: string, data: { name: string; color: string }) => void;\n onEditCancel: () => void;\n onDelete: (id: string) => void;\n /** native drag reorder wiring */\n onDragStartRow: (index: number) => void;\n onDragEnterRow: (index: number) => void;\n onDropRow: () => void;\n}\n\n/**\n * CategoryItem — one row in the category list: a color-dot checkbox + name, a\n * hover \"⋯\" menu (edit / delete), an inline edit mode with a color-swatch\n * popover, and native drag-to-reorder. Ported from calendary's\n * DraggableCategoryItem (Google-calendar branches dropped).\n */\nexport function CategoryItem({\n cat,\n index,\n checked,\n language,\n colorPalette,\n editing,\n onToggle,\n onEditStart,\n onEditCommit,\n onEditCancel,\n onDelete,\n onDragStartRow,\n onDragEnterRow,\n onDropRow,\n}: CategoryItemProps) {\n const [menuOpen, setMenuOpen] = useState(false);\n const [editName, setEditName] = useState(cat.name);\n const [editColor, setEditColor] = useState(cat.color);\n const [colorOpen, setColorOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement | null>(null);\n\n // seed the draft whenever we (re)enter edit mode\n useEffect(() => {\n if (editing) {\n setEditName(cat.name);\n setEditColor(cat.color);\n setColorOpen(false);\n }\n }, [editing, cat.name, cat.color]);\n\n // close the row menu on any outside click\n useEffect(() => {\n if (!menuOpen) return;\n const onDown = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setMenuOpen(false);\n };\n document.addEventListener('mousedown', onDown);\n return () => document.removeEventListener('mousedown', onDown);\n }, [menuOpen]);\n\n if (editing) {\n return (\n <div className=\"sft-cal-catrow sft-cal-catrow--editing\" ref={rootRef}>\n <div className=\"sft-cal-catrow__colorwrap\">\n <button\n type=\"button\"\n className=\"sft-cal-catrow__swatch\"\n style={{ background: editColor, borderColor: editColor }}\n onClick={() => setColorOpen((v) => !v)}\n aria-label=\"pick color\"\n />\n {colorOpen && (\n <div className=\"sft-cal-colorgrid\">\n {colorPalette.map((c) => (\n <button\n key={c}\n type=\"button\"\n className=\"sft-cal-colorgrid__swatch\"\n data-active={editColor === c || undefined}\n style={{ background: c }}\n onClick={() => {\n setEditColor(c);\n setColorOpen(false);\n }}\n aria-label={c}\n />\n ))}\n </div>\n )}\n </div>\n <input\n className=\"sft-cal-catrow__name-input\"\n value={editName}\n // biome-ignore lint/a11y/noAutofocus: focus the inline category-rename field on open\n autoFocus\n onChange={(e) => setEditName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && editName.trim())\n onEditCommit(cat.id, { name: editName.trim(), color: editColor });\n else if (e.key === 'Escape') onEditCancel();\n }}\n />\n <button\n type=\"button\"\n className=\"sft-cal-btn sft-cal-btn--primary sft-cal-btn--sm\"\n disabled={!editName.trim()}\n onClick={() => onEditCommit(cat.id, { name: editName.trim(), color: editColor })}\n >\n {pick(language, '저장', 'Save')}\n </button>\n </div>\n );\n }\n\n const onDragStart = (e: DragEvent) => {\n e.dataTransfer.effectAllowed = 'move';\n onDragStartRow(index);\n };\n const onDragEnter = () => onDragEnterRow(index);\n\n return (\n <div\n className=\"sft-cal-catrow\"\n ref={rootRef}\n draggable\n onDragStart={onDragStart}\n onDragEnter={onDragEnter}\n onDragOver={(e) => e.preventDefault()}\n onDrop={onDropRow}\n onDragEnd={onDropRow}\n >\n <button type=\"button\" className=\"sft-cal-catrow__main\" onClick={() => onToggle(cat.id)}>\n <span\n className=\"sft-cal-catrow__dot\"\n data-checked={checked || undefined}\n style={{ background: cat.color, borderColor: cat.color }}\n >\n {checked && <Check size={12} strokeWidth={3} />}\n </span>\n <span className=\"sft-cal-catrow__name\">{cat.name}</span>\n </button>\n\n <div className=\"sft-cal-catrow__menu\">\n <button\n type=\"button\"\n className=\"sft-cal-catrow__menu-trigger\"\n aria-label=\"category menu\"\n onClick={(e) => {\n e.stopPropagation();\n setMenuOpen((v) => !v);\n }}\n >\n <MoreVertical size={16} />\n </button>\n {menuOpen && (\n <div className=\"sft-cal-menu\">\n <button\n type=\"button\"\n className=\"sft-cal-menu__item\"\n onClick={(e) => {\n e.stopPropagation();\n setMenuOpen(false);\n onEditStart(cat);\n }}\n >\n <Pencil size={14} />\n {pick(language, '편집', 'Edit')}\n </button>\n <button\n type=\"button\"\n className=\"sft-cal-menu__item sft-cal-menu__item--danger\"\n onClick={(e) => {\n e.stopPropagation();\n setMenuOpen(false);\n onDelete(cat.id);\n }}\n >\n <Trash2 size={14} />\n {pick(language, '삭제', 'Delete')}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { ChevronDown, Plus } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport { pick } from '../i18n';\nimport type { Category } from '../types';\nimport { COLOR_PRESETS } from '../utils/color';\nimport { CategoryItem } from './CategoryItem';\n\nexport interface CategoryFilterProps {\n categories: Category[];\n selectedCategoryIds: string[];\n language: string;\n onToggle: (id: string) => void;\n onAdd: (data: { name: string; color: string }) => string;\n onUpdate: (id: string, data: { name: string; color: string }) => void;\n onDelete: (id: string) => void;\n onReorder: (from: number, to: number) => void;\n}\n\n/**\n * CategoryFilter — the header's \"N selected\" popover: the multi-select category\n * list (drag-reorderable) plus an inline add row. Ported from calendary's\n * category dropdown.\n */\nexport function CategoryFilter({\n categories,\n selectedCategoryIds,\n language,\n onToggle,\n onAdd,\n onUpdate,\n onDelete,\n onReorder,\n}: CategoryFilterProps) {\n const [open, setOpen] = useState(false);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [showAdd, setShowAdd] = useState(false);\n const [name, setName] = useState('');\n const [color, setColor] = useState(COLOR_PRESETS[0] as string);\n const [colorOpen, setColorOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const dragIndexRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', onDown);\n return () => document.removeEventListener('mousedown', onDown);\n }, [open]);\n\n const allSelected = selectedCategoryIds.length === categories.length;\n const label = allSelected\n ? pick(language, '전체 카테고리', 'All categories')\n : pick(\n language,\n `${selectedCategoryIds.length}개 선택됨`,\n `${selectedCategoryIds.length} selected`,\n );\n\n const usedColors = new Set(categories.map((c) => c.color));\n const nextColor = COLOR_PRESETS.find((c) => !usedColors.has(c)) ?? (COLOR_PRESETS[0] as string);\n\n const commitAdd = () => {\n if (!name.trim()) return;\n onAdd({ name: name.trim(), color });\n setShowAdd(false);\n setName('');\n };\n\n return (\n <div className=\"sft-cal-catfilter\" ref={rootRef}>\n <button\n type=\"button\"\n className=\"sft-cal-catfilter__trigger\"\n aria-haspopup=\"true\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n >\n <span>{label}</span>\n <ChevronDown size={16} />\n </button>\n\n {open && (\n <div className=\"sft-cal-catfilter__popover\">\n <div className=\"sft-cal-catfilter__list\">\n {categories.map((cat, index) => (\n <CategoryItem\n key={cat.id}\n cat={cat}\n index={index}\n checked={selectedCategoryIds.includes(cat.id)}\n language={language}\n colorPalette={COLOR_PRESETS}\n editing={editingId === cat.id}\n onToggle={onToggle}\n onEditStart={(c) => setEditingId(c.id)}\n onEditCommit={(id, data) => {\n onUpdate(id, data);\n setEditingId(null);\n }}\n onEditCancel={() => setEditingId(null)}\n onDelete={onDelete}\n onDragStartRow={(i) => {\n dragIndexRef.current = i;\n }}\n onDragEnterRow={(i) => {\n const from = dragIndexRef.current;\n if (from != null && from !== i) {\n onReorder(from, i);\n dragIndexRef.current = i;\n }\n }}\n onDropRow={() => {\n dragIndexRef.current = null;\n }}\n />\n ))}\n </div>\n\n <div className=\"sft-cal-modal__divider\" />\n\n {showAdd ? (\n <div className=\"sft-cal-catrow sft-cal-catrow--editing\">\n <div className=\"sft-cal-catrow__colorwrap\">\n <button\n type=\"button\"\n className=\"sft-cal-catrow__swatch\"\n style={{ background: color, borderColor: color }}\n onClick={() => setColorOpen((v) => !v)}\n aria-label=\"pick color\"\n />\n {colorOpen && (\n <div className=\"sft-cal-colorgrid\">\n {COLOR_PRESETS.map((c) => (\n <button\n key={c}\n type=\"button\"\n className=\"sft-cal-colorgrid__swatch\"\n data-active={color === c || undefined}\n style={{ background: c }}\n onClick={() => {\n setColor(c);\n setColorOpen(false);\n }}\n aria-label={c}\n />\n ))}\n </div>\n )}\n </div>\n <input\n className=\"sft-cal-catrow__name-input\"\n // biome-ignore lint/a11y/noAutofocus: focus the inline add-category input on open\n autoFocus\n placeholder={pick(language, '카테고리 이름', 'Category name')}\n value={name}\n onChange={(e) => setName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commitAdd();\n else if (e.key === 'Escape') setShowAdd(false);\n }}\n />\n <button\n type=\"button\"\n className=\"sft-cal-btn sft-cal-btn--primary sft-cal-btn--sm\"\n disabled={!name.trim()}\n onClick={commitAdd}\n >\n {pick(language, '저장', 'Save')}\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"sft-cal-modal__ghostrow\"\n onClick={() => {\n setColor(nextColor);\n setName('');\n setShowAdd(true);\n }}\n >\n <Plus size={14} />\n {pick(language, '새 카테고리', 'New category')}\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { ViewType } from '../types';\n\nexport const monthNames: Record<string, string[]> = {\n ko: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n en: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n};\n\nexport const dayNames: Record<string, string[]> = {\n ko: ['일', '월', '화', '수', '목', '금', '토'],\n en: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n};\n\n/** the month grid, including leading/trailing days from adjacent months */\nexport function getDaysInMonth(date: Date): { days: Date[]; rows: number } {\n const year = date.getFullYear();\n const month = date.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n const daysInMonth = lastDay.getDate();\n const startingDayOfWeek = firstDay.getDay();\n\n const days: Date[] = [];\n for (let i = 0; i < startingDayOfWeek; i++) {\n days.push(new Date(year, month, -startingDayOfWeek + i + 1));\n }\n for (let i = 1; i <= daysInMonth; i++) {\n days.push(new Date(year, month, i));\n }\n const weeksNeeded = Math.ceil(days.length / 7);\n const remainingCells = weeksNeeded * 7 - days.length;\n for (let i = 1; i <= remainingCells; i++) {\n days.push(new Date(year, month + 1, i));\n }\n return { days, rows: weeksNeeded };\n}\n\n/** the seven days (Sun→Sat) of the week containing `date` */\nexport function getWeekDays(date: Date): Date[] {\n const day = date.getDay();\n const sunday = new Date(date);\n sunday.setDate(date.getDate() - day);\n const days: Date[] = [];\n for (let i = 0; i < 7; i++) {\n const weekDay = new Date(sunday);\n weekDay.setDate(sunday.getDate() + i);\n days.push(weekDay);\n }\n return days;\n}\n\nexport function isSameDay(a: Date | null, b: Date | null): boolean {\n if (!a || !b) return false;\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function isToday(date: Date | null): boolean {\n return isSameDay(date, new Date());\n}\n\nexport function isCurrentMonth(date: Date | null, currentDate: Date): boolean {\n if (!date) return false;\n return date.getMonth() === currentDate.getMonth();\n}\n\nexport function getPreviousPeriodDate(currentDate: Date, viewType: ViewType): Date {\n const d = new Date(currentDate);\n if (viewType === 'day') d.setDate(currentDate.getDate() - 1);\n else if (viewType === 'week') d.setDate(currentDate.getDate() - 7);\n else if (viewType === 'year') return new Date(currentDate.getFullYear() - 1, 0, 1);\n else return new Date(currentDate.getFullYear(), currentDate.getMonth() - 1, 1);\n return d;\n}\n\nexport function getNextPeriodDate(currentDate: Date, viewType: ViewType): Date {\n const d = new Date(currentDate);\n if (viewType === 'day') d.setDate(currentDate.getDate() + 1);\n else if (viewType === 'week') d.setDate(currentDate.getDate() + 7);\n else if (viewType === 'year') return new Date(currentDate.getFullYear() + 1, 0, 1);\n else return new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);\n return d;\n}\n\n/** YYYY-MM-DD (local) */\nexport function formatDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n// ── time-grid drag math (week/day views) ────────────────────\n// Pure pixel↔minutes helpers shared by WeekView/DayView's drag-to-create and\n// drag-to-move/resize interactions, so both stay in exact agreement on how a\n// mouse position maps to a time-of-day.\n\n/** clientY inside a time-grid column's bounding rect → minutes-of-day (0–1440), unclamped-snap-ready */\nexport function minutesFromY(clientY: number, rect: { top: number; height: number }): number {\n const ratio = (clientY - rect.top) / rect.height;\n return Math.max(0, Math.min(24 * 60, ratio * 24 * 60));\n}\n\n/** round to the nearest `step` minutes (default 15) */\nexport function snapMinutes(minutes: number, step = 15): number {\n return Math.round(minutes / step) * step;\n}\n\n/** minutes-of-day → \"HH:MM\", clamped to a valid time */\nexport function minutesToHHMM(minutes: number): string {\n const m = Math.max(0, Math.min(23 * 60 + 59, Math.round(minutes)));\n const h = Math.floor(m / 60);\n const mm = m % 60;\n return `${String(h).padStart(2, '0')}:${String(mm).padStart(2, '0')}`;\n}\n\n/** \"HH:MM\" → minutes-of-day */\nexport function hhmmToMinutes(hhmm: string | undefined): number {\n if (!hhmm) return 0;\n const [h, m] = hhmm.split(':').map((n) => Number(n));\n return (h || 0) * 60 + (m || 0);\n}\n","import { pick } from '../i18n';\n\nexport type DeleteType = 'this' | 'following' | 'all';\n\nexport interface DeleteOptionsDialogProps {\n language: string;\n selectedDeleteType: DeleteType;\n setSelectedDeleteType: (type: DeleteType) => void;\n onCancel: () => void;\n onDelete: () => void;\n}\n\nconst OPTIONS: { value: DeleteType; ko: string; en: string }[] = [\n { value: 'this', ko: '이 일정만', en: 'This event only' },\n { value: 'following', ko: '이후 모든 일정', en: 'This and following events' },\n { value: 'all', ko: '모든 반복 일정', en: 'All recurring events' },\n];\n\n/**\n * DeleteOptionsDialog — the recurring-event delete scope picker (this / this &\n * following / all), shown in a small centered dialog. Ported from calendary.\n */\nexport function DeleteOptionsDialog({\n language,\n selectedDeleteType,\n setSelectedDeleteType,\n onCancel,\n onDelete,\n}: DeleteOptionsDialogProps) {\n return (\n <div className=\"sft-cal-overlay\" onMouseDown={onCancel}>\n <div\n className=\"sft-cal-confirm\"\n role=\"dialog\"\n aria-modal=\"true\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div className=\"sft-cal-confirm__title\">\n {pick(language, '반복 일정 삭제', 'Delete recurring event')}\n </div>\n <div className=\"sft-cal-confirm__options\">\n {OPTIONS.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n className=\"sft-cal-delopt\"\n data-active={selectedDeleteType === o.value || undefined}\n onClick={() => setSelectedDeleteType(o.value)}\n >\n <span className=\"sft-cal-delopt__radio\" aria-hidden=\"true\" />\n {pick(language, o.ko, o.en)}\n </button>\n ))}\n </div>\n <div className=\"sft-cal-confirm__actions\">\n <button type=\"button\" className=\"sft-cal-btn sft-cal-btn--outline\" onClick={onCancel}>\n {pick(language, '취소', 'Cancel')}\n </button>\n <button type=\"button\" className=\"sft-cal-btn sft-cal-btn--danger\" onClick={onDelete}>\n {pick(language, '삭제', 'Delete')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface SegmentOption<T extends string> {\n value: T;\n label: ReactNode;\n}\n\nexport interface SegmentTabsProps<T extends string> {\n value: T;\n onValueChange: (value: T) => void;\n options: SegmentOption<T>[];\n /** each tab grows to fill (used inside grids/rows). Default false. */\n block?: boolean;\n className?: string;\n}\n\n/**\n * SegmentTabs — an iOS-style segmented control: a muted track with a raised\n * white pill on the active tab. Ported from calendary's SegmentTabs.\n */\nexport function SegmentTabs<T extends string>({\n value,\n onValueChange,\n options,\n block,\n className,\n}: SegmentTabsProps<T>) {\n return (\n <div\n className={`sft-cal-seg${block ? ' sft-cal-seg--block' : ''}${className ? ` ${className}` : ''}`}\n >\n {options.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n className=\"sft-cal-seg__btn\"\n data-active={value === option.value || undefined}\n onClick={() => onValueChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n );\n}\n","import { pick } from '../i18n';\nimport type { RecurrenceFreq } from '../types';\nimport { SegmentTabs } from './SegmentTabs';\n\nexport type RecurrenceEndType = 'never' | 'date' | 'count';\n\nexport interface RecurrenceSectionProps {\n language: string;\n recurrenceFreq: RecurrenceFreq;\n setRecurrenceFreq: (freq: RecurrenceFreq) => void;\n /** weekdays as Mon=0 … Sun=6 */\n selectedWeekdays: number[];\n setSelectedWeekdays: (weekdays: number[]) => void;\n recurrenceEndType: RecurrenceEndType;\n setRecurrenceEndType: (type: RecurrenceEndType) => void;\n recurrenceCount: string | number;\n setRecurrenceCount: (count: string | number) => void;\n recurrenceEndDate: Date | undefined;\n setRecurrenceEndDate: (date: Date | undefined) => void;\n internalStartDate: Date | undefined;\n}\n\nconst WEEKDAYS: { value: number; ko: string; en: string }[] = [\n { value: 0, ko: '월', en: 'M' },\n { value: 1, ko: '화', en: 'T' },\n { value: 2, ko: '수', en: 'W' },\n { value: 3, ko: '목', en: 'T' },\n { value: 4, ko: '금', en: 'F' },\n { value: 5, ko: '토', en: 'S' },\n { value: 6, ko: '일', en: 'S' },\n];\n\n/**\n * RecurrenceSection — frequency segmented tabs, a weekly weekday picker, and an\n * end-condition selector (never / date / count). Ported from calendary. Fully\n * controlled; all state lives in the parent event modal.\n */\nexport function RecurrenceSection({\n language,\n recurrenceFreq,\n setRecurrenceFreq,\n selectedWeekdays,\n setSelectedWeekdays,\n recurrenceEndType,\n setRecurrenceEndType,\n recurrenceCount,\n setRecurrenceCount,\n setRecurrenceEndDate,\n internalStartDate,\n}: RecurrenceSectionProps) {\n const toggleWeekday = (value: number) => {\n if (selectedWeekdays.includes(value)) {\n setSelectedWeekdays(selectedWeekdays.filter((d) => d !== value));\n } else {\n setSelectedWeekdays([...selectedWeekdays, value].sort((a, b) => a - b));\n }\n };\n\n const onEndTypeChange = (type: RecurrenceEndType) => {\n setRecurrenceEndType(type);\n if (type === 'date' && internalStartDate) {\n const oneYearLater = new Date(internalStartDate);\n oneYearLater.setFullYear(oneYearLater.getFullYear() + 1);\n setRecurrenceEndDate(oneYearLater);\n }\n };\n\n return (\n <div className=\"sft-cal-recur\">\n <SegmentTabs\n block\n value={recurrenceFreq}\n onValueChange={(v) => setRecurrenceFreq(v as RecurrenceFreq)}\n options={[\n { value: 'DAILY', label: pick(language, '매일', 'Daily') },\n { value: 'WEEKLY', label: pick(language, '매주', 'Weekly') },\n { value: 'MONTHLY', label: pick(language, '매월', 'Monthly') },\n { value: 'YEARLY', label: pick(language, '매년', 'Yearly') },\n ]}\n />\n\n {recurrenceFreq === 'WEEKLY' && (\n <div className=\"sft-cal-recur__block\">\n <div className=\"sft-cal-label\">{pick(language, '반복 요일', 'Repeat on')}</div>\n <div className=\"sft-cal-recur__weekdays\">\n {WEEKDAYS.map((d) => (\n <button\n key={d.value}\n type=\"button\"\n className=\"sft-cal-recur__weekday\"\n data-active={selectedWeekdays.includes(d.value) || undefined}\n onClick={() => toggleWeekday(d.value)}\n >\n {pick(language, d.ko, d.en)}\n </button>\n ))}\n </div>\n </div>\n )}\n\n <div className=\"sft-cal-recur__block\">\n <div className=\"sft-cal-label\">{pick(language, '종료', 'Ends')}</div>\n <div className=\"sft-cal-recur__end\">\n <SegmentTabs\n block\n value={recurrenceEndType}\n onValueChange={(v) => onEndTypeChange(v as RecurrenceEndType)}\n options={[\n { value: 'never', label: pick(language, '없음', 'Never') },\n { value: 'date', label: pick(language, '날짜', 'Date') },\n { value: 'count', label: pick(language, '횟수', 'Count') },\n ]}\n />\n <div className=\"sft-cal-recur__count\">\n {recurrenceEndType === 'count' && (\n <>\n <input\n className=\"sft-cal-input sft-cal-recur__count-input\"\n type=\"text\"\n inputMode=\"numeric\"\n value={String(recurrenceCount)}\n onChange={(e) => {\n const v = e.target.value;\n if (v === '') setRecurrenceCount('');\n else if (/^[1-9]\\d*$/.test(v)) setRecurrenceCount(Number.parseInt(v, 10));\n }}\n onBlur={() => {\n const n = Number(recurrenceCount);\n if (recurrenceCount === '' || n < 1) setRecurrenceCount(1);\n }}\n />\n <span className=\"sft-cal-recur__count-unit\">{pick(language, '회', 'times')}</span>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { Minus, Plus, Trash2, X } from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { pick } from '../i18n';\nimport type { CalendarEvent, Category, Recurrence, RecurrenceFreq } from '../types';\nimport { COLOR_PRESETS } from '../utils/color';\nimport { formatDate, isSameDay } from '../utils/date';\nimport { CategoryItem } from './CategoryItem';\nimport { DeleteOptionsDialog, type DeleteType } from './DeleteOptionsDialog';\nimport { type RecurrenceEndType, RecurrenceSection } from './RecurrenceSection';\n\nexport interface EventSaveData {\n title: string;\n startTime: string;\n endTime: string;\n description: string;\n categoryId: string;\n startDate: Date;\n endDate?: Date;\n recurrence?: Recurrence;\n}\n\nexport interface EventModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** the event being edited, or null when creating */\n event?: CalendarEvent | null;\n selectedDate: Date | null;\n selectedEndDate?: Date | null;\n defaultStartTime?: string;\n defaultEndTime?: string;\n categories: Category[];\n selectedCategoryIds: string[];\n language: string;\n onSave: (data: EventSaveData) => void;\n onDelete?: (deleteType: DeleteType) => void;\n /** live preview callback (drives the ghost chip in the views) */\n onChange?: (data: EventSaveData | null) => void;\n onToggleCategory: (id: string) => void;\n onAddCategory: (data: { name: string; color: string }) => string;\n onUpdateCategory: (id: string, data: { name: string; color: string }) => void;\n onDeleteCategory: (id: string) => void;\n onReorderCategories: (from: number, to: number) => void;\n}\n\nconst toDateInput = (d: Date | undefined) => (d ? formatDate(d) : '');\nconst fromDateInput = (v: string): Date | undefined => {\n if (!v) return undefined;\n const parts = v.split('-').map(Number);\n return new Date(parts[0] ?? 1970, (parts[1] ?? 1) - 1, parts[2] ?? 1);\n};\n\nconst timeToMinutes = (t: string) => {\n const parts = t.split(':');\n const h = Number(parts[0] ?? 0);\n const m = Number(parts[1] ?? 0);\n return h * 60 + m;\n};\nconst minutesToTime = (mins: number) => {\n const clamped = Math.max(0, Math.min(23 * 60 + 59, mins));\n const h = Math.floor(clamped / 60);\n const m = clamped % 60;\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`;\n};\n\n/** editor weekday (Mon=0…Sun=6) for a JS Date */\nconst weekdayOf = (d: Date) => (d.getDay() + 6) % 7;\n\n/**\n * EventModal — the create/edit event dialog. Ported from calendary's\n * EventCreatePopover into a centered token-CSS modal: title, start/end date,\n * start/end time (duration-preserving), a category picker with inline add/edit,\n * a description field, and a recurrence editor. Save / Cancel / Delete footer;\n * deleting a recurring event opens the scope picker.\n */\nexport function EventModal({\n open,\n onOpenChange,\n event,\n selectedDate,\n selectedEndDate,\n defaultStartTime = '09:00',\n defaultEndTime = '10:00',\n categories,\n selectedCategoryIds,\n language,\n onSave,\n onDelete,\n onChange,\n onToggleCategory,\n onAddCategory,\n onUpdateCategory,\n onDeleteCategory,\n onReorderCategories,\n}: EventModalProps) {\n const [title, setTitle] = useState('');\n const [startTime, setStartTime] = useState(defaultStartTime);\n const [endTime, setEndTime] = useState(defaultEndTime);\n const [description, setDescription] = useState('');\n const [categoryId, setCategoryId] = useState(categories[0]?.id ?? '');\n const [startDate, setStartDate] = useState<Date | undefined>(undefined);\n const [endDate, setEndDate] = useState<Date | undefined>(undefined);\n const [titleFocused, setTitleFocused] = useState(false);\n const [showDescription, setShowDescription] = useState(false);\n\n // recurrence\n const [isRecurring, setIsRecurring] = useState(false);\n const [recurrenceFreq, setRecurrenceFreq] = useState<RecurrenceFreq>('WEEKLY');\n const [selectedWeekdays, setSelectedWeekdays] = useState<number[]>([]);\n const [recurrenceEndType, setRecurrenceEndType] = useState<RecurrenceEndType>('never');\n const [recurrenceEndDate, setRecurrenceEndDate] = useState<Date | undefined>(undefined);\n const [recurrenceCount, setRecurrenceCount] = useState<string | number>(10);\n\n // category add/edit\n const [showAddCategory, setShowAddCategory] = useState(false);\n const [newCategoryName, setNewCategoryName] = useState('');\n const [newCategoryColor, setNewCategoryColor] = useState(COLOR_PRESETS[0] as string);\n const [addColorOpen, setAddColorOpen] = useState(false);\n const [editingCategoryId, setEditingCategoryId] = useState<string | null>(null);\n\n // delete\n const [showDeleteOptions, setShowDeleteOptions] = useState(false);\n const [deleteType, setDeleteType] = useState<DeleteType>('this');\n\n const dragIndexRef = useRef<number | null>(null);\n const prevStartRef = useRef(startTime);\n\n const isEdit = !!event;\n const isPeriod = useMemo(\n () => !!startDate && !!endDate && !isSameDay(startDate, endDate),\n [startDate, endDate],\n );\n\n // seed the form each time the modal opens\n // biome-ignore lint/correctness/useExhaustiveDependencies: intentionally re-seeds only when `open` flips\n useEffect(() => {\n if (!open) return;\n setShowDeleteOptions(false);\n setShowAddCategory(false);\n setEditingCategoryId(null);\n if (event) {\n setTitle(event.title ?? '');\n setStartTime(event.startTime ?? defaultStartTime);\n setEndTime(event.endTime ?? defaultEndTime);\n setDescription(event.description ?? '');\n setCategoryId(event.categoryId ?? categories[0]?.id ?? '');\n setStartDate(event.date);\n setEndDate(event.endDate ?? event.date);\n setShowDescription(!!event.description);\n const rec = event.recurrence;\n setIsRecurring(!!rec);\n if (rec) {\n setRecurrenceFreq(rec.freq);\n setSelectedWeekdays(rec.byweekday ?? []);\n setRecurrenceEndType(rec.until ? 'date' : rec.count ? 'count' : 'never');\n setRecurrenceEndDate(rec.until);\n setRecurrenceCount(rec.count ?? 10);\n } else {\n setSelectedWeekdays([]);\n setRecurrenceEndType('never');\n }\n } else {\n const s = selectedDate ?? new Date();\n setTitle('');\n setStartTime(defaultStartTime);\n setEndTime(defaultEndTime);\n setDescription('');\n setCategoryId(categories[0]?.id ?? '');\n setStartDate(s);\n setEndDate(selectedEndDate ?? s);\n setShowDescription(false);\n setIsRecurring(false);\n setSelectedWeekdays([]);\n setRecurrenceEndType('never');\n setRecurrenceCount(10);\n }\n prevStartRef.current = event?.startTime ?? defaultStartTime;\n }, [open]);\n\n // ESC closes\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onOpenChange(false);\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [open, onOpenChange]);\n\n const buildRecurrence = (): Recurrence | undefined => {\n if (!isRecurring) return undefined;\n const rec: Recurrence = { freq: recurrenceFreq, interval: 1 };\n if (recurrenceFreq === 'WEEKLY' && selectedWeekdays.length > 0)\n rec.byweekday = selectedWeekdays;\n if (recurrenceEndType === 'date' && recurrenceEndDate) rec.until = recurrenceEndDate;\n if (recurrenceEndType === 'count') rec.count = Number(recurrenceCount) || 1;\n return rec;\n };\n\n // live preview — recompute only when a form field actually changes, so we\n // don't feed back into the parent's re-render (which would loop)\n // biome-ignore lint/correctness/useExhaustiveDependencies: deps are the form fields; buildRecurrence is derived from them\n useEffect(() => {\n if (!open || !onChange || !startDate) return;\n onChange({\n title,\n startTime,\n endTime,\n description,\n categoryId,\n startDate,\n endDate: isPeriod ? endDate : undefined,\n recurrence: buildRecurrence(),\n });\n }, [\n open,\n title,\n startTime,\n endTime,\n description,\n categoryId,\n startDate,\n endDate,\n isPeriod,\n isRecurring,\n recurrenceFreq,\n selectedWeekdays,\n recurrenceEndType,\n recurrenceEndDate,\n recurrenceCount,\n ]);\n\n const canSave = title.trim().length > 0 && !!startDate;\n\n const handleSave = () => {\n if (!canSave || !startDate) return;\n onSave({\n title: title.trim(),\n startTime,\n endTime,\n description,\n categoryId,\n startDate,\n endDate: isPeriod ? endDate : undefined,\n recurrence: buildRecurrence(),\n });\n onOpenChange(false);\n };\n\n const handleStartTimeChange = (v: string) => {\n // preserve duration by shifting the end time\n const duration = timeToMinutes(endTime) - timeToMinutes(prevStartRef.current);\n setStartTime(v);\n if (duration > 0) {\n const nextEnd = minutesToTime(timeToMinutes(v) + duration);\n if (timeToMinutes(nextEnd) >= timeToMinutes(v)) setEndTime(nextEnd);\n }\n prevStartRef.current = v;\n };\n\n const handleEndTimeChange = (v: string) => {\n if (timeToMinutes(v) < timeToMinutes(startTime)) return;\n setEndTime(v);\n };\n\n const toggleRecurring = (on: boolean) => {\n setIsRecurring(on);\n if (on && recurrenceFreq === 'WEEKLY' && selectedWeekdays.length === 0 && startDate) {\n setSelectedWeekdays([weekdayOf(startDate)]);\n }\n };\n\n const handleDelete = () => {\n if (event?.recurrence) setShowDeleteOptions(true);\n else onDelete?.('all');\n };\n\n const usedColors = new Set(categories.map((c) => c.color));\n const nextColor = COLOR_PRESETS.find((c) => !usedColors.has(c)) ?? (COLOR_PRESETS[0] as string);\n\n if (!open) return null;\n\n return (\n <div className=\"sft-cal-overlay\" onMouseDown={(e) => e.stopPropagation()}>\n <div className=\"sft-cal-modal\" role=\"dialog\" aria-modal=\"true\">\n {/* title */}\n <div className=\"sft-cal-modal__titlewrap\">\n <input\n className=\"sft-cal-modal__title\"\n value={title}\n placeholder={pick(language, '새 일정', 'New event')}\n onFocus={() => setTitleFocused(true)}\n onBlur={() => setTitleFocused(false)}\n onChange={(e) => setTitle(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) handleSave();\n }}\n />\n <button\n type=\"button\"\n className=\"sft-cal-modal__close\"\n aria-label=\"close\"\n onClick={() => onOpenChange(false)}\n >\n <X size={18} />\n </button>\n <span className=\"sft-cal-modal__underline\" data-active={titleFocused || undefined} />\n </div>\n\n {/* repeat toggle */}\n <label className=\"sft-cal-modal__repeat\">\n <span>{pick(language, '반복', 'Repeat')}</span>\n <input\n type=\"checkbox\"\n className=\"sft-cal-switch\"\n checked={isRecurring}\n onChange={(e) => toggleRecurring(e.target.checked)}\n />\n </label>\n\n {isRecurring && (\n <RecurrenceSection\n language={language}\n recurrenceFreq={recurrenceFreq}\n setRecurrenceFreq={setRecurrenceFreq}\n selectedWeekdays={selectedWeekdays}\n setSelectedWeekdays={setSelectedWeekdays}\n recurrenceEndType={recurrenceEndType}\n setRecurrenceEndType={setRecurrenceEndType}\n recurrenceCount={recurrenceCount}\n setRecurrenceCount={setRecurrenceCount}\n recurrenceEndDate={recurrenceEndDate}\n setRecurrenceEndDate={setRecurrenceEndDate}\n internalStartDate={startDate}\n />\n )}\n\n {/* dates */}\n <div className=\"sft-cal-modal__grid2\">\n <div className=\"sft-cal-field\">\n <div className=\"sft-cal-label\">{pick(language, '시작 날짜', 'Start date')}</div>\n <input\n type=\"date\"\n className=\"sft-cal-input\"\n value={toDateInput(startDate)}\n onChange={(e) => {\n const d = fromDateInput(e.target.value);\n setStartDate(d);\n if (d && (!endDate || endDate < d)) setEndDate(d);\n }}\n />\n </div>\n <div className=\"sft-cal-field\">\n <div className=\"sft-cal-label\">{pick(language, '종료 날짜', 'End date')}</div>\n {isRecurring && recurrenceEndType !== 'date' ? (\n <div className=\"sft-cal-input sft-cal-input--static\">\n {pick(language, '종료일 없음', 'No end date')}\n </div>\n ) : isRecurring && recurrenceEndType === 'date' ? (\n <input\n type=\"date\"\n className=\"sft-cal-input\"\n value={toDateInput(recurrenceEndDate)}\n min={toDateInput(startDate)}\n onChange={(e) => setRecurrenceEndDate(fromDateInput(e.target.value))}\n />\n ) : (\n <input\n type=\"date\"\n className=\"sft-cal-input\"\n value={toDateInput(endDate)}\n min={toDateInput(startDate)}\n onChange={(e) => setEndDate(fromDateInput(e.target.value))}\n />\n )}\n </div>\n </div>\n\n {/* times */}\n <div className=\"sft-cal-modal__grid2\">\n <div className=\"sft-cal-field\">\n <div className=\"sft-cal-label\">{pick(language, '시작 시간', 'Start time')}</div>\n <input\n type=\"time\"\n className=\"sft-cal-input\"\n value={startTime}\n onChange={(e) => handleStartTimeChange(e.target.value)}\n />\n </div>\n <div className=\"sft-cal-field\">\n <div className=\"sft-cal-label\">{pick(language, '종료 시간', 'End time')}</div>\n <input\n type=\"time\"\n className=\"sft-cal-input\"\n value={endTime}\n onChange={(e) => handleEndTimeChange(e.target.value)}\n />\n </div>\n </div>\n\n {/* category */}\n <div className=\"sft-cal-modal__category\">\n <div className=\"sft-cal-modal__cathead\">\n <div className=\"sft-cal-label\">{pick(language, '카테고리', 'Category')}</div>\n </div>\n <div className=\"sft-cal-modal__catlist\">\n {categories.map((cat, index) => (\n <CategoryItem\n key={cat.id}\n cat={cat}\n index={index}\n checked={cat.id === categoryId}\n language={language}\n colorPalette={COLOR_PRESETS}\n editing={editingCategoryId === cat.id}\n onToggle={(id) => setCategoryId(id)}\n onEditStart={(c) => setEditingCategoryId(c.id)}\n onEditCommit={(id, data) => {\n onUpdateCategory(id, data);\n setEditingCategoryId(null);\n }}\n onEditCancel={() => setEditingCategoryId(null)}\n onDelete={(id) => {\n onDeleteCategory(id);\n if (categoryId === id)\n setCategoryId(categories.find((c) => c.id !== id)?.id ?? '');\n }}\n onDragStartRow={(i) => {\n dragIndexRef.current = i;\n }}\n onDragEnterRow={(i) => {\n const from = dragIndexRef.current;\n if (from != null && from !== i) {\n onReorderCategories(from, i);\n dragIndexRef.current = i;\n }\n }}\n onDropRow={() => {\n dragIndexRef.current = null;\n }}\n />\n ))}\n </div>\n\n {showAddCategory ? (\n <div className=\"sft-cal-catrow sft-cal-catrow--editing\">\n <div className=\"sft-cal-catrow__colorwrap\">\n <button\n type=\"button\"\n className=\"sft-cal-catrow__swatch\"\n style={{ background: newCategoryColor, borderColor: newCategoryColor }}\n onClick={() => setAddColorOpen((v) => !v)}\n aria-label=\"pick color\"\n />\n {addColorOpen && (\n <div className=\"sft-cal-colorgrid\">\n {COLOR_PRESETS.map((c) => (\n <button\n key={c}\n type=\"button\"\n className=\"sft-cal-colorgrid__swatch\"\n data-active={newCategoryColor === c || undefined}\n style={{ background: c }}\n onClick={() => {\n setNewCategoryColor(c);\n setAddColorOpen(false);\n }}\n aria-label={c}\n />\n ))}\n </div>\n )}\n </div>\n <input\n className=\"sft-cal-catrow__name-input\"\n // biome-ignore lint/a11y/noAutofocus: focus the freshly-opened inline add-category input\n autoFocus\n placeholder={pick(language, '카테고리 이름', 'Category name')}\n value={newCategoryName}\n onChange={(e) => setNewCategoryName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && newCategoryName.trim()) {\n const id = onAddCategory({\n name: newCategoryName.trim(),\n color: newCategoryColor,\n });\n setCategoryId(id);\n setShowAddCategory(false);\n setNewCategoryName('');\n } else if (e.key === 'Escape') {\n setShowAddCategory(false);\n }\n }}\n />\n <button\n type=\"button\"\n className=\"sft-cal-btn sft-cal-btn--primary sft-cal-btn--sm\"\n disabled={!newCategoryName.trim()}\n onClick={() => {\n const id = onAddCategory({\n name: newCategoryName.trim(),\n color: newCategoryColor,\n });\n setCategoryId(id);\n setShowAddCategory(false);\n setNewCategoryName('');\n }}\n >\n {pick(language, '저장', 'Save')}\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"sft-cal-modal__ghostrow\"\n onClick={() => {\n setNewCategoryColor(nextColor);\n setNewCategoryName('');\n setShowAddCategory(true);\n }}\n >\n <Plus size={14} />\n {pick(language, '새 카테고리', 'New category')}\n </button>\n )}\n </div>\n\n <div className=\"sft-cal-modal__divider\" />\n\n {/* description */}\n {showDescription ? (\n <div className=\"sft-cal-field\">\n <div className=\"sft-cal-modal__cathead\">\n <div className=\"sft-cal-label\">{pick(language, '설명', 'Description')}</div>\n <button\n type=\"button\"\n className=\"sft-cal-modal__collapse\"\n onClick={() => {\n setShowDescription(false);\n setDescription('');\n }}\n >\n <Minus size={14} />\n {pick(language, '접기', 'Collapse')}\n </button>\n </div>\n <textarea\n className=\"sft-cal-textarea\"\n rows={2}\n // biome-ignore lint/a11y/noAutofocus: focus the freshly-revealed description field\n autoFocus\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"sft-cal-modal__ghostrow\"\n onClick={() => setShowDescription(true)}\n >\n <Plus size={14} />\n {pick(language, '설명 추가', 'Add description')}\n </button>\n )}\n\n {/* footer */}\n <div className=\"sft-cal-modal__actions\">\n <button\n type=\"button\"\n className=\"sft-cal-btn sft-cal-btn--outline sft-cal-btn--block\"\n onClick={() => onOpenChange(false)}\n >\n {pick(language, '취소', 'Cancel')}\n </button>\n <button\n type=\"button\"\n className=\"sft-cal-btn sft-cal-btn--primary sft-cal-btn--block\"\n disabled={!canSave}\n onClick={handleSave}\n >\n {isEdit ? pick(language, '수정', 'Update') : pick(language, '추가', 'Add')}\n </button>\n {isEdit && onDelete && (\n <button\n type=\"button\"\n className=\"sft-cal-btn sft-cal-btn--outline sft-cal-btn--icon\"\n aria-label={pick(language, '삭제', 'Delete')}\n onClick={handleDelete}\n >\n <Trash2 size={16} />\n </button>\n )}\n </div>\n </div>\n\n {showDeleteOptions && (\n <DeleteOptionsDialog\n language={language}\n selectedDeleteType={deleteType}\n setSelectedDeleteType={setDeleteType}\n onCancel={() => setShowDeleteOptions(false)}\n onDelete={() => {\n onDelete?.(deleteType);\n setShowDeleteOptions(false);\n onOpenChange(false);\n }}\n />\n )}\n </div>\n );\n}\n","import { pick } from '../i18n';\nimport type { DeleteType } from './DeleteOptionsDialog';\n\nexport interface RecurrenceScopeDialogProps {\n language: string;\n selectedScope: DeleteType;\n setSelectedScope: (type: DeleteType) => void;\n onCancel: () => void;\n onConfirm: () => void;\n}\n\nconst OPTIONS: { value: DeleteType; ko: string; en: string }[] = [\n { value: 'this', ko: '이 일정만', en: 'This event only' },\n { value: 'following', ko: '이후 모든 일정', en: 'This and following events' },\n { value: 'all', ko: '모든 반복 일정', en: 'All recurring events' },\n];\n\n/**\n * RecurrenceScopeDialog — the recurring-event drag-move scope picker (this /\n * this & following / all), shown in a small centered dialog. Same shape as\n * DeleteOptionsDialog but a separate component: the confirm action here is\n * \"move\" (primary button), not \"delete\" (danger button), and the two flows\n * are independent enough that sharing one component wasn't worth the prop\n * branching.\n */\nexport function RecurrenceScopeDialog({\n language,\n selectedScope,\n setSelectedScope,\n onCancel,\n onConfirm,\n}: RecurrenceScopeDialogProps) {\n return (\n <div className=\"sft-cal-overlay\" onMouseDown={onCancel}>\n <div\n className=\"sft-cal-confirm\"\n role=\"dialog\"\n aria-modal=\"true\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <div className=\"sft-cal-confirm__title\">\n {pick(language, '반복 일정 이동', 'Move recurring event')}\n </div>\n <div className=\"sft-cal-confirm__options\">\n {OPTIONS.map((o) => (\n <button\n key={o.value}\n type=\"button\"\n className=\"sft-cal-delopt sft-cal-delopt--accent\"\n data-active={selectedScope === o.value || undefined}\n onClick={() => setSelectedScope(o.value)}\n >\n <span className=\"sft-cal-delopt__radio\" aria-hidden=\"true\" />\n {pick(language, o.ko, o.en)}\n </button>\n ))}\n </div>\n <div className=\"sft-cal-confirm__actions\">\n <button type=\"button\" className=\"sft-cal-btn sft-cal-btn--outline\" onClick={onCancel}>\n {pick(language, '취소', 'Cancel')}\n </button>\n <button type=\"button\" className=\"sft-cal-btn sft-cal-btn--primary\" onClick={onConfirm}>\n {pick(language, '이동', 'Move')}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useCallback, useRef, useState } from 'react';\nimport type { CalendarEvent, Category } from '../types';\n\nlet idSeq = 0;\nconst uid = (prefix: string) => `${prefix}-${Date.now().toString(36)}-${(idSeq++).toString(36)}`;\n\nexport interface UseCalendarOptions {\n initialEvents?: CalendarEvent[];\n initialCategories?: Category[];\n}\n\nexport interface CalendarController {\n events: CalendarEvent[];\n setEvents: React.Dispatch<React.SetStateAction<CalendarEvent[]>>;\n addEvent: (data: Omit<CalendarEvent, 'id'>) => CalendarEvent;\n updateEvent: (id: string, data: Partial<CalendarEvent>) => void;\n deleteEvent: (id: string) => void;\n\n /** undo/redo over event add/update/delete/move (see setEvents) */\n canUndo: boolean;\n canRedo: boolean;\n undo: () => void;\n redo: () => void;\n\n categories: Category[];\n setCategories: React.Dispatch<React.SetStateAction<Category[]>>;\n addCategory: (data: { name: string; color: string }) => string;\n updateCategory: (id: string, data: Partial<Category>) => void;\n deleteCategory: (id: string) => void;\n reorderCategories: (from: number, to: number) => void;\n\n selectedCategoryIds: string[];\n toggleCategory: (id: string) => void;\n setSelectedCategoryIds: React.Dispatch<React.SetStateAction<string[]>>;\n}\n\nconst DEFAULT_CATEGORIES: Category[] = [\n { id: 'personal', name: '개인', color: '#E30000' },\n { id: 'work', name: '업무', color: '#007AFF' },\n { id: 'holiday', name: '휴가', color: '#34C759' },\n];\n\n/**\n * useCalendar — self-contained local state for events + categories + the\n * category filter selection. No server/Google concerns; this is the state a\n * host would otherwise wire to its own backend.\n */\nexport function useCalendar(options: UseCalendarOptions = {}): CalendarController {\n const [events, setEventsRaw] = useState<CalendarEvent[]>(options.initialEvents ?? []);\n const [categories, setCategories] = useState<Category[]>(\n options.initialCategories ?? DEFAULT_CATEGORIES,\n );\n const [selectedCategoryIds, setSelectedCategoryIds] = useState<string[]>(() =>\n (options.initialCategories ?? DEFAULT_CATEGORIES).map((c) => c.id),\n );\n\n // undo/redo: every events mutation goes through setEvents below, which\n // snapshots the pre-mutation array onto `past` and clears `future` — the\n // same pattern as the Sheet component's history stacks\n const [past, setPast] = useState<CalendarEvent[][]>([]);\n const [future, setFuture] = useState<CalendarEvent[][]>([]);\n const eventsRef = useRef(events);\n eventsRef.current = events;\n\n const setEvents = useCallback((updater: React.SetStateAction<CalendarEvent[]>) => {\n setPast((p) => [...p, eventsRef.current]);\n setFuture([]);\n setEventsRaw(updater);\n }, []);\n\n const undo = useCallback(() => {\n setPast((p) => {\n if (!p.length) return p;\n const prev = p[p.length - 1] as CalendarEvent[];\n setFuture((f) => [...f, eventsRef.current]);\n setEventsRaw(prev);\n return p.slice(0, -1);\n });\n }, []);\n\n const redo = useCallback(() => {\n setFuture((f) => {\n if (!f.length) return f;\n const next = f[f.length - 1] as CalendarEvent[];\n setPast((p) => [...p, eventsRef.current]);\n setEventsRaw(next);\n return f.slice(0, -1);\n });\n }, []);\n\n const addEvent = useCallback(\n (data: Omit<CalendarEvent, 'id'>) => {\n const event: CalendarEvent = { ...data, id: uid('evt') };\n setEvents((prev) => [...prev, event]);\n return event;\n },\n [setEvents],\n );\n\n const updateEvent = useCallback(\n (id: string, data: Partial<CalendarEvent>) => {\n setEvents((prev) => prev.map((e) => (e.id === id ? { ...e, ...data } : e)));\n },\n [setEvents],\n );\n\n const deleteEvent = useCallback(\n (id: string) => {\n setEvents((prev) => prev.filter((e) => e.id !== id));\n },\n [setEvents],\n );\n\n const addCategory = useCallback((data: { name: string; color: string }) => {\n const id = uid('cat');\n setCategories((prev) => [...prev, { id, name: data.name, color: data.color }]);\n setSelectedCategoryIds((prev) => [...prev, id]);\n return id;\n }, []);\n\n const updateCategory = useCallback((id: string, data: Partial<Category>) => {\n setCategories((prev) => prev.map((c) => (c.id === id ? { ...c, ...data } : c)));\n }, []);\n\n const deleteCategory = useCallback(\n (id: string) => {\n setCategories((prev) => (prev.length <= 1 ? prev : prev.filter((c) => c.id !== id)));\n setSelectedCategoryIds((prev) => prev.filter((c) => c !== id));\n setEvents((prev) => prev.filter((e) => e.categoryId !== id));\n },\n [setEvents],\n );\n\n const reorderCategories = useCallback((from: number, to: number) => {\n setCategories((prev) => {\n if (from === to || from < 0 || to < 0 || from >= prev.length || to >= prev.length)\n return prev;\n const next = [...prev];\n const [moved] = next.splice(from, 1);\n if (!moved) return prev;\n next.splice(to, 0, moved);\n return next;\n });\n }, []);\n\n const toggleCategory = useCallback((id: string) => {\n setSelectedCategoryIds((prev) =>\n prev.includes(id) ? prev.filter((c) => c !== id) : [...prev, id],\n );\n }, []);\n\n return {\n events,\n setEvents,\n addEvent,\n updateEvent,\n deleteEvent,\n canUndo: past.length > 0,\n canRedo: future.length > 0,\n undo,\n redo,\n categories,\n setCategories,\n addCategory,\n updateCategory,\n deleteCategory,\n reorderCategories,\n selectedCategoryIds,\n toggleCategory,\n setSelectedCategoryIds,\n };\n}\n","import type { CalendarEvent, Recurrence } from '../types';\nimport { isSameDay } from './date';\n\n/** editor weekday index (Mon=0…Sun=6) → JS getDay() (Sun=0…Sat=6) */\nconst toJsDay = (editorIndex: number) => (editorIndex + 1) % 7;\n/** JS getDay() → editor weekday index */\nconst toEditorDay = (jsDay: number) => (jsDay + 6) % 7;\n\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\n/**\n * All occurrence *dates* of a recurring series that fall in [from, to]\n * (inclusive), honouring interval / byweekday / until / count. No rrule dep —\n * a compact engine covering DAILY / WEEKLY / MONTHLY / YEARLY. Exported for\n * \"this and following\" recurrence splits (see Calendar.tsx's\n * handleRecurrenceScopeConfirm), which needs to know how many occurrences\n * land before a given split date to carry over a correct remaining `count`.\n */\nexport function occurrencesInRange(base: Date, rec: Recurrence, from: Date, to: Date): Date[] {\n const interval = Math.max(1, rec.interval || 1);\n const out: Date[] = [];\n const until = rec.until ? startOfDay(rec.until) : null;\n const maxCount = rec.count ?? Number.POSITIVE_INFINITY;\n const windowFrom = startOfDay(from);\n const windowTo = startOfDay(to);\n const GUARD = 5000; // hard stop against pathological configs\n\n let produced = 0;\n\n const consider = (d: Date): boolean => {\n // returns false when we've gone past every stopping condition\n const day = startOfDay(d);\n if (until && day > until) return false;\n if (produced >= maxCount) return false;\n produced += 1;\n if (day >= windowFrom && day <= windowTo) out.push(day);\n return true;\n };\n\n if (rec.freq === 'WEEKLY' && rec.byweekday && rec.byweekday.length > 0) {\n // walk week by week; within each active week emit the selected weekdays\n const weekdays = [...rec.byweekday].map(toJsDay).sort((a, b) => a - b);\n // anchor to the Sunday of the base week\n const weekStart = startOfDay(base);\n weekStart.setDate(weekStart.getDate() - weekStart.getDay());\n for (let w = 0; w < GUARD; w++) {\n const wkStart = new Date(weekStart);\n wkStart.setDate(weekStart.getDate() + w * 7 * interval);\n if (wkStart > windowTo && produced > 0) break;\n let stop = false;\n for (const jsDay of weekdays) {\n const d = new Date(wkStart);\n d.setDate(wkStart.getDate() + jsDay);\n if (startOfDay(d) < startOfDay(base)) continue; // before series start\n if (!consider(d)) {\n stop = true;\n break;\n }\n }\n if (stop) break;\n if (produced >= maxCount) break;\n if (wkStart > windowTo) break;\n }\n return out;\n }\n\n // DAILY / WEEKLY(no byweekday) / MONTHLY / YEARLY — step from the base date\n for (let i = 0; i < GUARD; i++) {\n const d = new Date(base);\n if (rec.freq === 'DAILY') d.setDate(base.getDate() + i * interval);\n else if (rec.freq === 'WEEKLY') d.setDate(base.getDate() + i * 7 * interval);\n else if (rec.freq === 'MONTHLY') d.setMonth(base.getMonth() + i * interval);\n else d.setFullYear(base.getFullYear() + i * interval); // YEARLY\n if (!consider(d)) break;\n if (startOfDay(d) > windowTo && produced > 0 && maxCount === Number.POSITIVE_INFINITY) break;\n }\n return out;\n}\n\n/**\n * Expand every recurring master in `events` into concrete instances that fall\n * inside [startDate, endDate]; non-recurring events pass through unchanged.\n */\nexport function expandRecurringEvents(\n events: CalendarEvent[],\n startDate: Date,\n endDate: Date,\n): CalendarEvent[] {\n const expanded: CalendarEvent[] = [];\n for (const event of events) {\n if (!event.recurrence) {\n expanded.push(event);\n continue;\n }\n const occurrences = occurrencesInRange(event.date, event.recurrence, startDate, endDate);\n for (const occ of occurrences) {\n const excluded = event.exdate?.some((ex) => isSameDay(ex, occ));\n if (excluded) continue;\n // preserve the original time-of-day on each instance\n const date = new Date(\n occ.getFullYear(),\n occ.getMonth(),\n occ.getDate(),\n event.date.getHours(),\n event.date.getMinutes(),\n );\n expanded.push({\n ...event,\n id: `${event.id}-recur-${date.getTime()}`,\n date,\n isRecurringInstance: true,\n recurringEventId: event.id,\n });\n }\n }\n return expanded;\n}\n\n/** whether `date` falls inside an event's [date, endDate] span (day-granular) */\nexport function eventCoversDate(event: CalendarEvent, date: Date): boolean {\n if (isSameDay(event.date, date)) return true;\n if (!event.endDate) return false;\n const check = startOfDay(date).getTime();\n return check >= startOfDay(event.date).getTime() && check <= startOfDay(event.endDate).getTime();\n}\n\n/** events on a given date, category-filtered, sorted by start time */\nexport function getEventsForDate(\n date: Date | null,\n events: CalendarEvent[],\n selectedCategoryIds: string[],\n): CalendarEvent[] {\n if (!date) return [];\n return events\n .filter((event) => {\n if (!eventCoversDate(event, date)) return false;\n if (event.categoryId && !selectedCategoryIds.includes(event.categoryId)) return false;\n return true;\n })\n .sort((a, b) => {\n if (!a.startTime && !b.startTime) return 0;\n if (!a.startTime) return 1;\n if (!b.startTime) return -1;\n const ap = a.startTime.split(':');\n const bp = b.startTime.split(':');\n const aMin = Number(ap[0] ?? 0) * 60 + Number(ap[1] ?? 0);\n const bMin = Number(bp[0] ?? 0) * 60 + Number(bp[1] ?? 0);\n return aMin - bMin;\n });\n}\n\n/** first free hour (\"HH:00\") on a date, 09:00–23:00, else 09:00 */\nexport function getNextAvailableTime(date: Date | null, events: CalendarEvent[]): string {\n if (!date) return '09:00';\n const dayEvents = events.filter((e) => isSameDay(e.date, date));\n for (let hour = 9; hour < 24; hour++) {\n const timeStr = `${hour.toString().padStart(2, '0')}:00`;\n if (!dayEvents.some((e) => e.startTime === timeStr)) return timeStr;\n }\n return '09:00';\n}\n\nconst toEditorWeekday = toEditorDay;\nexport { toEditorWeekday };\n","import { Repeat } from 'lucide-react';\nimport {\n type MouseEvent as ReactMouseEvent,\n type PointerEvent as ReactPointerEvent,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { pick } from '../i18n';\nimport type { CalendarEvent, Category, PreviewEvent } from '../types';\nimport { withAlpha } from '../utils/color';\nimport { dayNames, hhmmToMinutes, minutesFromY, minutesToHHMM, snapMinutes } from '../utils/date';\nimport { expandRecurringEvents } from '../utils/events';\n\nexport interface DayViewProps {\n currentDate: Date;\n events: CalendarEvent[];\n selectedCategoryIds: string[];\n categories: Category[];\n language: string;\n selectedEvent: CalendarEvent | null;\n previewEvent: PreviewEvent | null;\n onEventClick: (event: CalendarEvent, element?: HTMLElement) => void;\n onAddEventClick: (date: Date, hour?: number, clientX?: number, clientY?: number) => void;\n /** drag an empty time-grid area (snapped to 15 min) to create a timed event */\n onTimeRangeSelect: (date: Date, startMin: number, endMin: number) => void;\n /** drag (any event) or resize (non-recurring only) to a new start/end\n * time. For a recurring event, the host is expected to resolve a\n * \"this/following/all\" scope before actually committing */\n onEventTimeChange: (event: CalendarEvent, startMin: number, endMin: number) => void;\n}\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\nconst MIN_EVENT_MINUTES = 15;\n\ntype MoveMode = 'move' | 'resize-start' | 'resize-end';\n\n/** DayView — a single-day × 24-hour time grid. */\nexport function DayView({\n currentDate,\n events,\n selectedCategoryIds,\n categories,\n language,\n selectedEvent,\n previewEvent,\n onEventClick,\n onAddEventClick,\n onTimeRangeSelect,\n onEventTimeChange,\n}: DayViewProps) {\n const dayStart = new Date(currentDate);\n dayStart.setHours(0, 0, 0, 0);\n const dayEnd = new Date(currentDate);\n dayEnd.setHours(23, 59, 59, 999);\n const expanded = expandRecurringEvents(events, dayStart, dayEnd);\n\n const dayEvents = expanded\n .filter((event) => {\n const startMatch =\n event.date.getDate() === currentDate.getDate() &&\n event.date.getMonth() === currentDate.getMonth() &&\n event.date.getFullYear() === currentDate.getFullYear();\n let inRange = startMatch;\n if (!inRange && event.endDate) {\n const check = new Date(\n currentDate.getFullYear(),\n currentDate.getMonth(),\n currentDate.getDate(),\n ).getTime();\n const s = new Date(\n event.date.getFullYear(),\n event.date.getMonth(),\n event.date.getDate(),\n ).getTime();\n const e = new Date(\n event.endDate.getFullYear(),\n event.endDate.getMonth(),\n event.endDate.getDate(),\n ).getTime();\n inRange = check >= s && check <= e;\n }\n return inRange;\n })\n .filter((event) => !event.categoryId || selectedCategoryIds.includes(event.categoryId));\n\n const dow = currentDate.getDay();\n const dayCls = dow === 0 ? 'sft-cal-sun' : dow === 6 ? 'sft-cal-sat' : undefined;\n\n const colRef = useRef<HTMLDivElement | null>(null);\n\n // drag-to-create: mousedown on empty grid area, drag to span a range\n const createRef = useRef<{ startMin: number } | null>(null);\n const [createPreview, setCreatePreview] = useState<{ startMin: number; endMin: number } | null>(\n null,\n );\n\n // drag-to-move / resize an existing (non-recurring) timed event\n const moveRef = useRef<{\n event: CalendarEvent;\n mode: MoveMode;\n startY: number;\n origStart: number;\n origEnd: number;\n moved: boolean;\n } | null>(null);\n const justMovedRef = useRef(false);\n const [livePreview, setLivePreview] = useState<{\n id: string;\n startMin: number;\n endMin: number;\n } | null>(null);\n // mirrors of the two preview states above, read (not written) in onUp — in\n // StrictMode, a functional setState updater runs twice, so any side effect\n // (calling onTimeRangeSelect/onEventTimeChange) must live outside of one\n const createPreviewRef = useRef<{ startMin: number; endMin: number } | null>(null);\n const livePreviewRef = useRef<{ id: string; startMin: number; endMin: number } | null>(null);\n\n const [interacting, setInteracting] = useState(false);\n\n useEffect(() => {\n if (!interacting) return;\n\n function onMove(e: PointerEvent) {\n const rect = colRef.current?.getBoundingClientRect();\n // a momentary zero-height rect (mid-layout) must not produce NaN/Infinity\n // math that then gets committed as garbage start/end times\n if (!rect || rect.height <= 0) return;\n\n if (createRef.current) {\n const m = snapMinutes(minutesFromY(e.clientY, rect));\n const next = { startMin: createRef.current.startMin, endMin: m };\n createPreviewRef.current = next;\n setCreatePreview(next);\n return;\n }\n\n const mv = moveRef.current;\n if (mv) {\n if (!mv.moved && Math.abs(e.clientY - mv.startY) > 4) mv.moved = true;\n if (!mv.moved) return;\n const deltaMin = snapMinutes(((e.clientY - mv.startY) / rect.height) * 24 * 60);\n let newStart = mv.origStart;\n let newEnd = mv.origEnd;\n if (mv.mode === 'move') {\n newStart = mv.origStart + deltaMin;\n newEnd = mv.origEnd + deltaMin;\n if (newStart < 0) {\n newEnd -= newStart;\n newStart = 0;\n }\n if (newEnd > 24 * 60) {\n newStart -= newEnd - 24 * 60;\n newEnd = 24 * 60;\n }\n } else if (mv.mode === 'resize-start') {\n newStart = Math.max(0, Math.min(mv.origEnd - MIN_EVENT_MINUTES, mv.origStart + deltaMin));\n } else {\n newEnd = Math.min(\n 24 * 60,\n Math.max(mv.origStart + MIN_EVENT_MINUTES, mv.origEnd + deltaMin),\n );\n }\n const next = { id: mv.event.id, startMin: newStart, endMin: newEnd };\n livePreviewRef.current = next;\n setLivePreview(next);\n }\n }\n\n function onUp() {\n if (createRef.current) {\n const p = createPreviewRef.current;\n if (p && Number.isFinite(p.startMin) && Number.isFinite(p.endMin)) {\n const s = Math.min(p.startMin, p.endMin);\n const e = Math.max(p.startMin, p.endMin);\n if (e - s >= MIN_EVENT_MINUTES) onTimeRangeSelect(currentDate, s, e);\n }\n createRef.current = null;\n createPreviewRef.current = null;\n setCreatePreview(null);\n }\n if (moveRef.current?.moved) {\n const mv = moveRef.current;\n const p = livePreviewRef.current;\n if (p && Number.isFinite(p.startMin) && Number.isFinite(p.endMin)) {\n justMovedRef.current = true;\n onEventTimeChange(mv.event, p.startMin, p.endMin);\n }\n }\n moveRef.current = null;\n livePreviewRef.current = null;\n setLivePreview(null);\n setInteracting(false);\n }\n\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n };\n }, [interacting, currentDate, onTimeRangeSelect, onEventTimeChange]);\n\n const beginCreate = (e: ReactPointerEvent) => {\n if ((e.target as HTMLElement).closest('[data-event=\"true\"]')) return;\n // drag-to-create starts on the vertically-scrollable timegrid column, so on\n // touch we let the column scroll instead (create a timed event via the modal)\n if (e.pointerType === 'touch') return;\n const rect = colRef.current?.getBoundingClientRect();\n if (!rect) return;\n const m = snapMinutes(minutesFromY(e.clientY, rect));\n createRef.current = { startMin: m };\n setCreatePreview({ startMin: m, endMin: m });\n setInteracting(true);\n };\n\n const beginMove = (e: ReactPointerEvent, event: CalendarEvent, mode: MoveMode) => {\n // move/resize track via column geometry (works under touch's implicit\n // capture), so they stay enabled for touch; the chip sets touch-action:none\n // recurring events can be moved (the host resolves this/following/all\n // via a scope dialog) but not resized — a resize only makes sense\n // against a single occurrence's concrete start/end time\n if ((event.recurrence || event.isRecurringInstance) && mode !== 'move') return;\n e.stopPropagation();\n e.preventDefault();\n const origStart = hhmmToMinutes(event.startTime);\n const origEnd = event.endTime ? hhmmToMinutes(event.endTime) : origStart + 60;\n moveRef.current = { event, mode, startY: e.clientY, origStart, origEnd, moved: false };\n setInteracting(true);\n };\n\n const handleEventItemClick = (e: ReactMouseEvent, event: CalendarEvent) => {\n e.stopPropagation();\n if (justMovedRef.current) {\n justMovedRef.current = false;\n return;\n }\n onEventClick(event, e.currentTarget as HTMLElement);\n };\n\n // keyboard navigation: one roving-tabindex hour slot, Up/Down moves it by\n // an hour — mirrors MonthView's focusedIndex/cellRefs pattern. Stays null\n // until the grid is actually focused, so mounting never steals focus.\n const [focusedHour, setFocusedHour] = useState<number | null>(null);\n const slotRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n useEffect(() => {\n if (focusedHour == null) return;\n slotRefs.current[focusedHour]?.focus();\n }, [focusedHour]);\n\n return (\n <div className=\"sft-cal-timegrid sft-cal-timegrid--day\">\n <div className=\"sft-cal-timegrid__corner\" />\n <div className=\"sft-cal-timegrid__colhead\">\n <span\n className={dayCls ? `sft-cal-timegrid__daylabel ${dayCls}` : 'sft-cal-timegrid__daylabel'}\n >\n {(dayNames[language] ?? dayNames.en ?? [])[dow]} ({currentDate.getDate()})\n </span>\n </div>\n\n <div className=\"sft-cal-timegrid__hours\">\n {HOURS.map((hour) => (\n <div key={hour} className=\"sft-cal-timegrid__hour\">\n <span className=\"sft-cal-timegrid__hourlabel\">\n {hour.toString().padStart(2, '0')}:00\n </span>\n </div>\n ))}\n </div>\n\n <div className=\"sft-cal-timegrid__col\" ref={colRef} onPointerDown={beginCreate}>\n {HOURS.map((hour) => (\n <button\n key={hour}\n ref={(el) => {\n slotRefs.current[hour] = el;\n }}\n type=\"button\"\n className=\"sft-cal-timegrid__slot\"\n tabIndex={(focusedHour ?? 9) === hour ? 0 : -1}\n aria-label={`${hour.toString().padStart(2, '0')}:00`}\n onFocus={() => setFocusedHour(hour)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedHour(Math.min(23, hour + 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedHour(Math.max(0, hour - 1));\n }\n }}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('[data-event=\"true\"]')) return;\n onAddEventClick(currentDate, hour, e.clientX, e.clientY);\n }}\n />\n ))}\n\n {dayEvents.map((event) => {\n const isEditing = selectedEvent?.id === event.id && previewEvent;\n const live = livePreview?.id === event.id ? livePreview : null;\n const data = isEditing\n ? {\n title: previewEvent.title,\n startTime: previewEvent.startTime,\n endTime: previewEvent.endTime,\n categoryId: previewEvent.categoryId,\n }\n : event;\n const color = categories.find((c) => c.id === data.categoryId)?.color || '#E30000';\n const startMin = live ? live.startMin : hhmmToMinutes(data.startTime);\n const endMin = live\n ? live.endMin\n : data.endTime\n ? hhmmToMinutes(data.endTime)\n : startMin + 60;\n const top = (startMin / (24 * 60)) * 100;\n const height = ((endMin - startMin) / (24 * 60)) * 100;\n const resizable = !event.recurrence && !event.isRecurringInstance;\n return (\n <div\n key={event.id}\n data-event=\"true\"\n data-movable=\"true\"\n className=\"sft-cal-timeevent\"\n data-editing={isEditing || undefined}\n role=\"button\"\n tabIndex={0}\n aria-label={data.title || pick(language, '(제목 없음)', '(No title)')}\n style={{\n top: `${top}%`,\n height: `${height}%`,\n left: '8px',\n width: 'calc(100% - 16px)',\n background: withAlpha(color, 0.12),\n borderLeft: `3px solid ${color}`,\n }}\n onPointerDown={(e) => beginMove(e, event, 'move')}\n onClick={(e) => handleEventItemClick(e, event)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n onEventClick(event, e.currentTarget);\n }\n }}\n >\n {resizable && (\n <span\n className=\"sft-cal-timeevent__resize sft-cal-timeevent__resize--top\"\n onPointerDown={(e) => beginMove(e, event, 'resize-start')}\n />\n )}\n <div className=\"sft-cal-timeevent__label\" style={{ color }}>\n {event.recurrence && <Repeat size={12} />}\n <span className=\"sft-cal-timeevent__title\">\n {data.title || pick(language, '(제목 없음)', '(No title)')}\n </span>\n </div>\n {resizable && (\n <span\n className=\"sft-cal-timeevent__resize sft-cal-timeevent__resize--bottom\"\n onPointerDown={(e) => beginMove(e, event, 'resize-end')}\n />\n )}\n </div>\n );\n })}\n\n {/* drag-to-create preview: a plain draft bar spanning the dragged range */}\n {createPreview &&\n (() => {\n const s = Math.min(createPreview.startMin, createPreview.endMin);\n const e = Math.max(createPreview.startMin, createPreview.endMin);\n const top = (s / (24 * 60)) * 100;\n const height = ((e - s) / (24 * 60)) * 100;\n return (\n <div\n className=\"sft-cal-timeevent sft-cal-timeevent--draft\"\n style={{\n top: `${top}%`,\n height: `${height}%`,\n left: '8px',\n width: 'calc(100% - 16px)',\n }}\n >\n <div className=\"sft-cal-timeevent__label\">\n <span className=\"sft-cal-timeevent__title\">\n {minutesToHHMM(s)}–{minutesToHHMM(e)}\n </span>\n </div>\n </div>\n );\n })()}\n </div>\n </div>\n );\n}\n","import { Plus, Repeat } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport { pick } from '../i18n';\nimport type { CalendarEvent, Category, Holiday, PreviewEvent } from '../types';\nimport { withAlpha } from '../utils/color';\nimport { dayNames, getDaysInMonth, isCurrentMonth, isSameDay, isToday } from '../utils/date';\nimport { expandRecurringEvents } from '../utils/events';\n\nexport interface MonthViewProps {\n currentDate: Date;\n events: CalendarEvent[];\n selectedCategoryIds: string[];\n categories: Category[];\n language: string;\n /** holidays/observances shown as a label next to the date number */\n holidays?: Holiday[];\n selectedEvent: CalendarEvent | null;\n previewEvent: PreviewEvent | null;\n expandedRows: Set<number>;\n setExpandedRows: (updater: (prev: Set<number>) => Set<number>) => void;\n onEventClick: (event: CalendarEvent, element?: HTMLElement) => void;\n /** open the create modal for a single day (the \"+ new\" hover button) */\n onAddEventClick: (date: Date, x?: number, y?: number) => void;\n /** open the create modal for a dragged multi-day range */\n onRangeSelect: (start: Date, end: Date, x: number, y: number) => void;\n /** drag an event chip/bar onto another day to move it — for a recurring\n * event, the host is expected to resolve a \"this/following/all\" scope\n * (e.g. via a dialog) before actually committing the move */\n onEventMove: (event: CalendarEvent, newDate: Date) => void;\n /** drag a non-recurring period bar's start/end edge onto another day to resize it */\n onEventResize: (event: CalendarEvent, edge: 'start' | 'end', newDate: Date) => void;\n}\n\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\n// every item inside a cell (date head, period bar, day chip, \"+N more\",\n// \"+ new event\") is one row of this height; ROW adds the 1px inter-row gap so\n// the absolutely-positioned period bars line up with the flex-stacked chips.\n// Keep in sync with --sft-cal-event-h in calendar.css.\nconst EVENT_H = 22;\nconst ROW = EVENT_H + 1;\n\n/** greedy lane packing so overlapping multi-day bars stack without colliding */\nfunction assignLayers(spanning: { id: string; start: Date; end: Date }[]): Map<string, number> {\n const layers = new Map<string, number>();\n const laneEnds: Date[] = []; // last end date occupying each lane\n const sorted = [...spanning].sort((a, b) => a.start.getTime() - b.start.getTime());\n for (const ev of sorted) {\n let lane = 0;\n while (lane < laneEnds.length && (laneEnds[lane] as Date) >= startOfDay(ev.start)) lane++;\n laneEnds[lane] = startOfDay(ev.end);\n layers.set(ev.id, lane);\n }\n return layers;\n}\n\n/** localized \"N시\" period-clock time, e.g. 오후 2시 / 2 PM */\nfunction formatTime(time: string, language: string): string {\n const h = Number(time.split(':')[0]) || 0;\n const period = h < 12 ? pick(language, '오전', 'AM') : pick(language, '오후', 'PM');\n const display = h % 12 === 0 ? 12 : h % 12;\n return pick(language, `${period} ${display}시`, `${display} ${period}`);\n}\n\nexport function MonthView({\n currentDate,\n events,\n selectedCategoryIds,\n categories,\n language,\n holidays = [],\n selectedEvent,\n previewEvent,\n expandedRows,\n setExpandedRows,\n onEventClick,\n onAddEventClick,\n onRangeSelect,\n onEventMove,\n onEventResize,\n}: MonthViewProps) {\n const { days, rows } = getDaysInMonth(currentDate);\n const maxEventsToShow = rows === 4 ? 8 : rows === 5 ? 6 : 5;\n\n const rangeStart = startOfDay(days[0] as Date);\n const rangeEnd = startOfDay(days[days.length - 1] as Date);\n const expanded = expandRecurringEvents(events, rangeStart, rangeEnd).filter(\n (e) => !e.categoryId || selectedCategoryIds.includes(e.categoryId),\n );\n\n // drag-to-create range selection (internal)\n const [dragStart, setDragStart] = useState<Date | null>(null);\n const [dragEnd, setDragEnd] = useState<Date | null>(null);\n const [dragging, setDragging] = useState(false);\n const dragXY = useRef({ x: 0, y: 0 });\n\n useEffect(() => {\n if (!dragging) return;\n const onUp = () => {\n setDragging(false);\n if (dragStart && dragEnd && !isSameDay(dragStart, dragEnd)) {\n const [s, e] = dragStart <= dragEnd ? [dragStart, dragEnd] : [dragEnd, dragStart];\n onRangeSelect(s, e, dragXY.current.x, dragXY.current.y);\n }\n setDragStart(null);\n setDragEnd(null);\n };\n window.addEventListener('pointerup', onUp);\n return () => window.removeEventListener('pointerup', onUp);\n }, [dragging, dragStart, dragEnd, onRangeSelect]);\n\n // drag an existing (non-recurring) event chip/bar onto another day to move\n // it, or drag a period bar's start/end edge to resize it. A mousedown on\n // the item just arms the drag; it only \"counts\" once the pointer actually\n // moves, so a plain click still opens the edit modal.\n type MoveMode = 'move' | 'resize-start' | 'resize-end';\n const moveRef = useRef<{\n event: CalendarEvent;\n mode: MoveMode;\n startX: number;\n startY: number;\n moved: boolean;\n } | null>(null);\n const justMovedRef = useRef(false);\n const [moveTargetDate, setMoveTargetDate] = useState<Date | null>(null);\n // mirrors moveTargetDate, read (not written) in onUp — a functional setState\n // updater runs twice under StrictMode, so the onEventMove/onEventResize side\n // effect must live outside of one (see CALENDAR_TASKS.md's C1-b note)\n const moveTargetDateRef = useRef<Date | null>(null);\n\n useEffect(() => {\n function onMove(e: PointerEvent) {\n const m = moveRef.current;\n if (!m || m.moved) return;\n if (Math.abs(e.clientX - m.startX) > 4 || Math.abs(e.clientY - m.startY) > 4) m.moved = true;\n }\n function onUp() {\n const m = moveRef.current;\n if (m?.moved) {\n const target = moveTargetDateRef.current;\n if (target) {\n justMovedRef.current = true;\n if (m.mode === 'move') onEventMove(m.event, target);\n else onEventResize(m.event, m.mode === 'resize-start' ? 'start' : 'end', target);\n }\n }\n moveRef.current = null;\n moveTargetDateRef.current = null;\n setMoveTargetDate(null);\n }\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n };\n }, [onEventMove, onEventResize]);\n\n const startEventMove = (e: React.PointerEvent, event: CalendarEvent, mode: MoveMode = 'move') => {\n // the drag tracks the hovered day via cell onMouseEnter, which fires for\n // mouse/pen but not touch (touch implicitly captures the pointer), so\n // chip/bar drag-move + resize stay a mouse/pen affordance — on touch a tap\n // still opens the event (click) or the \"+\" button creates one\n if (e.pointerType === 'touch') return;\n // recurring events can be moved (the host decides \"this/following/all\"\n // via a scope dialog, see onEventMove) but not resized — a resize only\n // makes sense against a single occurrence's concrete date range\n if ((event.recurrence || event.isRecurringInstance) && mode !== 'move') return;\n e.stopPropagation();\n moveRef.current = { event, mode, startX: e.clientX, startY: e.clientY, moved: false };\n };\n\n const handleEventItemClick = (e: React.MouseEvent, event: CalendarEvent) => {\n e.stopPropagation();\n if (justMovedRef.current) {\n justMovedRef.current = false;\n return;\n }\n onEventClick(event, e.currentTarget as HTMLElement);\n };\n\n // keyboard navigation: one roving-tabindex cell, arrow keys move it,\n // Enter/Space opens the create modal for the focused day\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n const cellRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n useEffect(() => {\n if (focusedIndex == null) return;\n cellRefs.current[focusedIndex]?.focus();\n }, [focusedIndex]);\n\n const handleGridKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const base = focusedIndex ?? days.findIndex((d) => isToday(d)) ?? 0;\n let next = base;\n if (e.key === 'ArrowRight') next = base + 1;\n else if (e.key === 'ArrowLeft') next = base - 1;\n else if (e.key === 'ArrowDown') next = base + 7;\n else if (e.key === 'ArrowUp') next = base - 7;\n else if (e.key === 'Enter' || e.key === ' ') {\n const d = days[base];\n if (d) onAddEventClick(d);\n e.preventDefault();\n return;\n } else return;\n e.preventDefault();\n setFocusedIndex(Math.max(0, Math.min(days.length - 1, next)));\n };\n\n // a multi-day drag renders as a single \"+ 새 일정\" bar that grows across the\n // dragged days (Google-Calendar style) — not a whole-cell background tint\n const dragPreview =\n dragging && dragStart && dragEnd && !isSameDay(dragStart, dragEnd)\n ? dragStart <= dragEnd\n ? { start: dragStart, end: dragEnd }\n : { start: dragEnd, end: dragStart }\n : null;\n\n const inRange = (date: Date, s: Date, e: Date) => {\n const t = startOfDay(date).getTime();\n return t >= startOfDay(s).getTime() && t <= startOfDay(e).getTime();\n };\n\n // spanning (multi-day) events + optional period / drag previews, lane-packed\n const spanning = expanded\n .filter((e) => e.endDate)\n .map((e) => ({ id: e.id, start: e.date, end: e.endDate as Date }));\n if (previewEvent?.isPeriod && previewEvent.startDate && previewEvent.endDate) {\n spanning.push({ id: 'preview-temp', start: previewEvent.startDate, end: previewEvent.endDate });\n }\n if (dragPreview) {\n spanning.push({ id: 'drag-temp', start: dragPreview.start, end: dragPreview.end });\n }\n const layers = assignLayers(spanning);\n const maxLayer = layers.size ? Math.max(...layers.values()) : -1;\n const periodEventsHeight = (maxLayer + 1) * ROW;\n\n return (\n <div className=\"sft-cal-month\">\n <div className=\"sft-cal-month__weekdays\">\n {(dayNames[language] ?? dayNames.en ?? []).map((label, i) => (\n <div\n key={label}\n className={`sft-cal-month__weekday${i === 0 ? ' sft-cal-sun' : i === 6 ? ' sft-cal-sat' : ''}`}\n >\n {label}\n </div>\n ))}\n </div>\n\n <div\n className=\"sft-cal-month__grid\"\n style={{ gridTemplateRows: `repeat(${rows}, 1fr)` }}\n role=\"grid\"\n aria-label={pick(language, '월간 캘린더', 'Month calendar')}\n onKeyDown={handleGridKeyDown}\n >\n {days.map((date, index) => {\n const rowIndex = Math.floor(index / 7);\n const isWeekend = index % 7 === 0 || index % 7 === 6;\n const dow = date.getDay();\n const dayEvents = expanded.filter((e) => {\n const t = startOfDay(date).getTime();\n const s = startOfDay(e.date).getTime();\n const en = e.endDate ? startOfDay(e.endDate).getTime() : s;\n return t >= s && t <= en;\n });\n const singles = dayEvents.filter((e) => !e.endDate);\n const periodsForDay = dayEvents.filter((e) => e.endDate);\n\n const rowExpanded = expandedRows.has(rowIndex);\n const effectiveMax = rowExpanded ? dayEvents.length : maxEventsToShow;\n const maxSingles = Math.max(0, effectiveMax - periodsForDay.length);\n let displaySingles = singles.slice(0, maxSingles);\n let remaining = singles.length - displaySingles.length;\n // \"+N more\" is its own same-height row, so reserve a slot for it\n // when collapsed and some singles are hidden\n if (!rowExpanded && remaining > 0 && maxSingles > 0) {\n displaySingles = singles.slice(0, maxSingles - 1);\n remaining = singles.length - displaySingles.length;\n }\n\n const holiday = holidays.find((h) => isSameDay(h.date, date));\n const dateNumCls = !isCurrentMonth(date, currentDate)\n ? 'sft-cal-month__num sft-cal-month__num--dim'\n : isToday(date)\n ? 'sft-cal-month__num sft-cal-month__num--today'\n : dow === 0 || holiday\n ? 'sft-cal-month__num sft-cal-sun'\n : dow === 6\n ? 'sft-cal-month__num sft-cal-sat'\n : 'sft-cal-month__num';\n\n return (\n <div\n key={date.toISOString()}\n ref={(el) => {\n cellRefs.current[index] = el;\n }}\n className=\"sft-cal-month__cell\"\n data-weekend={isWeekend || undefined}\n data-lastrow={index >= days.length - 7 || undefined}\n data-lastcol={index % 7 === 6 || undefined}\n data-movetarget={(moveTargetDate && isSameDay(moveTargetDate, date)) || undefined}\n role=\"gridcell\"\n tabIndex={(focusedIndex ?? days.findIndex((d) => isToday(d)) ?? 0) === index ? 0 : -1}\n aria-label={`${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}${holiday ? ` ${holiday.name}` : ''}`}\n aria-current={isToday(date) ? 'date' : undefined}\n onFocus={() => setFocusedIndex(index)}\n onPointerDown={(e) => {\n if ((e.target as HTMLElement).closest('[data-event=\"true\"],button')) return;\n // drag-to-create is a mouse/pen affordance (tracks the hovered\n // day via onMouseEnter); on touch the \"+ 새 일정\" button creates\n if (e.pointerType === 'touch') return;\n dragXY.current = { x: e.clientX, y: e.clientY };\n setDragging(true);\n setDragStart(date);\n setDragEnd(date);\n }}\n onMouseEnter={() => {\n if (dragging) setDragEnd(date);\n if (moveRef.current) {\n moveTargetDateRef.current = date;\n setMoveTargetDate(date);\n }\n }}\n >\n <div className=\"sft-cal-month__cellhead\">\n {holiday && <span className=\"sft-cal-month__holiday\">{holiday.name}</span>}\n <span className={dateNumCls}>{date.getDate()}</span>\n </div>\n\n <div className=\"sft-cal-month__events\">\n {/* spanning bars covering this day */}\n {periodsForDay.map((event) => {\n const layer = layers.get(event.id) ?? 0;\n const color =\n categories.find((c) => c.id === event.categoryId)?.color || '#E30000';\n const isStart = isSameDay(event.date, date);\n const isEnd = event.endDate ? isSameDay(event.endDate, date) : true;\n const firstOfWeek = index % 7 === 0;\n const lastOfWeek = index % 7 === 6;\n const roundLeft = isStart || firstOfWeek;\n const roundRight = isEnd || lastOfWeek;\n // all events can be dragged to move (recurring goes through\n // a scope dialog); only non-recurring can be resized, since\n // a resize edits a single concrete date range\n const resizable = !event.recurrence && !event.isRecurringInstance;\n return (\n <div\n key={event.id}\n data-event=\"true\"\n className=\"sft-cal-month__bar\"\n data-movable=\"true\"\n role=\"button\"\n tabIndex={isStart || firstOfWeek ? 0 : -1}\n aria-label={event.title || pick(language, '(제목 없음)', '(No title)')}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation(); // otherwise bubbles to the grid's own Enter handler\n onEventClick(event, e.currentTarget);\n }\n }}\n style={{\n top: `${layer * ROW}px`,\n background: withAlpha(color, 0.1),\n borderTopLeftRadius: roundLeft ? 4 : 0,\n borderBottomLeftRadius: roundLeft ? 4 : 0,\n borderTopRightRadius: roundRight ? 4 : 0,\n borderBottomRightRadius: roundRight ? 4 : 0,\n paddingLeft: roundLeft ? 8 : 4,\n paddingRight: roundRight ? 8 : 4,\n }}\n onPointerDown={(e) => startEventMove(e, event)}\n onClick={(e) => handleEventItemClick(e, event)}\n >\n {/* left/right edges: only on the bar's actual start/end day\n segment, so dragging them resizes the date range */}\n {resizable && isStart && (\n <span\n className=\"sft-cal-month__bar-resize sft-cal-month__bar-resize--left\"\n onPointerDown={(e) => startEventMove(e, event, 'resize-start')}\n />\n )}\n {(isStart || firstOfWeek) && (\n <span className=\"sft-cal-month__bar-title\" style={{ color }}>\n {event.recurrence && <Repeat size={11} />}\n {event.title || pick(language, '(제목 없음)', '(No title)')}\n </span>\n )}\n {resizable && isEnd && (\n <span\n className=\"sft-cal-month__bar-resize sft-cal-month__bar-resize--right\"\n onPointerDown={(e) => startEventMove(e, event, 'resize-end')}\n />\n )}\n </div>\n );\n })}\n\n {/* multi-day drag: a single \"+ 새 일정\" bar that grows across\n the dragged days, styled like the add button */}\n {dragPreview &&\n inRange(date, dragPreview.start, dragPreview.end) &&\n (() => {\n const layer = layers.get('drag-temp') ?? 0;\n const isStart = isSameDay(dragPreview.start, date);\n const isEnd = isSameDay(dragPreview.end, date);\n const firstOfWeek = index % 7 === 0;\n const lastOfWeek = index % 7 === 6;\n const roundLeft = isStart || firstOfWeek;\n const roundRight = isEnd || lastOfWeek;\n return (\n <div\n className=\"sft-cal-month__bar sft-cal-month__bar--drag\"\n style={{\n top: `${layer * ROW}px`,\n borderTopLeftRadius: roundLeft ? 4 : 0,\n borderBottomLeftRadius: roundLeft ? 4 : 0,\n borderTopRightRadius: roundRight ? 4 : 0,\n borderBottomRightRadius: roundRight ? 4 : 0,\n paddingLeft: roundLeft ? 8 : 4,\n paddingRight: roundRight ? 8 : 4,\n }}\n >\n {(isStart || firstOfWeek) && (\n <span className=\"sft-cal-month__bar-title\">\n <Plus size={12} />\n {pick(language, '새 일정', 'New event')}\n </span>\n )}\n </div>\n );\n })()}\n\n {/* single-day chips */}\n {displaySingles.map((event, i) => {\n const color =\n categories.find((c) => c.id === event.categoryId)?.color || '#E30000';\n return (\n <div\n key={event.id}\n data-event=\"true\"\n className=\"sft-cal-month__chip\"\n data-movable=\"true\"\n role=\"button\"\n tabIndex={0}\n aria-label={event.title || pick(language, '(제목 없음)', '(No title)')}\n style={{ marginTop: i === 0 ? periodEventsHeight : 1 }}\n onPointerDown={(e) => startEventMove(e, event)}\n onClick={(e) => handleEventItemClick(e, event)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation(); // otherwise bubbles to the grid's own Enter handler\n onEventClick(event, e.currentTarget);\n }\n }}\n >\n <span className=\"sft-cal-month__chip-bar\" style={{ background: color }} />\n <span className=\"sft-cal-month__chip-title\">\n {event.title || pick(language, '(제목 없음)', '(No title)')}\n </span>\n {event.recurrence && (\n <Repeat className=\"sft-cal-month__chip-icon\" size={12} />\n )}\n {event.startTime && (\n <span className=\"sft-cal-month__chip-time\">\n {formatTime(event.startTime, language)}\n </span>\n )}\n </div>\n );\n })}\n\n {/* \"+N more\" — its own same-height row, toggles the row open */}\n {remaining > 0 && (\n <button\n type=\"button\"\n className=\"sft-cal-month__more\"\n style={{ marginTop: displaySingles.length ? 1 : periodEventsHeight }}\n onClick={(e) => {\n e.stopPropagation();\n setExpandedRows((prev) => {\n const next = new Set(prev);\n if (next.has(rowIndex)) next.delete(rowIndex);\n else next.add(rowIndex);\n return next;\n });\n }}\n >\n {pick(language, `+${remaining}개`, `+${remaining} more`)}\n </button>\n )}\n\n {/* single preview chip */}\n {previewEvent &&\n !previewEvent.isPeriod &&\n isSameDay(previewEvent.startDate ?? currentDate, date) && (\n <div\n className=\"sft-cal-month__chip sft-cal-month__chip--preview\"\n style={{ marginTop: singles.length === 0 ? periodEventsHeight : 1 }}\n >\n <span\n className=\"sft-cal-month__chip-bar\"\n style={{\n background:\n categories.find((c) => c.id === previewEvent.categoryId)?.color ||\n '#000',\n }}\n />\n <span className=\"sft-cal-month__chip-title\">\n {previewEvent.title || pick(language, '(제목 없음)', '(No title)')}\n </span>\n {previewEvent.startTime && (\n <span className=\"sft-cal-month__chip-time\">\n {formatTime(previewEvent.startTime, language)}\n </span>\n )}\n </div>\n )}\n\n {/* hover \"+ new event\" button */}\n <button\n type=\"button\"\n className=\"sft-cal-month__add\"\n style={{ marginTop: singles.length === 0 ? periodEventsHeight : 1 }}\n onClick={(e) => {\n e.stopPropagation();\n onAddEventClick(date, e.clientX, e.clientY);\n }}\n >\n <Plus size={14} />\n {pick(language, '새 일정', 'New event')}\n </button>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { Repeat } from 'lucide-react';\nimport {\n type MouseEvent as ReactMouseEvent,\n type PointerEvent as ReactPointerEvent,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { pick } from '../i18n';\nimport type { CalendarEvent, Category, PreviewEvent } from '../types';\nimport { withAlpha } from '../utils/color';\nimport {\n dayNames,\n getWeekDays,\n hhmmToMinutes,\n isSameDay,\n isToday,\n minutesFromY,\n minutesToHHMM,\n snapMinutes,\n} from '../utils/date';\nimport { expandRecurringEvents } from '../utils/events';\n\nexport interface WeekViewProps {\n currentDate: Date;\n events: CalendarEvent[];\n selectedCategoryIds: string[];\n categories: Category[];\n language: string;\n selectedEvent: CalendarEvent | null;\n previewEvent: PreviewEvent | null;\n onEventClick: (event: CalendarEvent, element?: HTMLElement) => void;\n onAddEventClick: (date: Date, hour?: number, clientX?: number, clientY?: number) => void;\n /** drag an empty time-grid area (snapped to 15 min) to create a timed event */\n onTimeRangeSelect: (date: Date, startMin: number, endMin: number) => void;\n /** drag (any event) or resize (non-recurring only) to a new start/end\n * time; `newDate` is set only when a \"move\" drag also crossed into a\n * different day column. For a recurring event, the host is expected to\n * resolve a \"this/following/all\" scope before actually committing */\n onEventTimeChange: (\n event: CalendarEvent,\n startMin: number,\n endMin: number,\n newDate?: Date,\n ) => void;\n}\n\nconst HOURS = Array.from({ length: 24 }, (_, i) => i);\nconst MIN_EVENT_MINUTES = 15;\n\ntype MoveMode = 'move' | 'resize-start' | 'resize-end';\n\nfunction dayColorClass(dayOfWeek: number): string | undefined {\n if (dayOfWeek === 0) return 'sft-cal-sun';\n if (dayOfWeek === 6) return 'sft-cal-sat';\n return undefined;\n}\n\n/** WeekView — a 7-day × 24-hour time grid with absolutely-positioned event chips. */\nexport function WeekView({\n currentDate,\n events,\n selectedCategoryIds,\n categories,\n language,\n selectedEvent,\n previewEvent,\n onEventClick,\n onAddEventClick,\n onTimeRangeSelect,\n onEventTimeChange,\n}: WeekViewProps) {\n const weekDays = getWeekDays(currentDate);\n const weekStart = weekDays[0] as Date;\n const weekEnd = weekDays[weekDays.length - 1] as Date;\n const expanded = expandRecurringEvents(events, weekStart, weekEnd);\n\n const eventsForDay = (date: Date) =>\n expanded\n .filter((event) => {\n const startMatch =\n event.date.getDate() === date.getDate() &&\n event.date.getMonth() === date.getMonth() &&\n event.date.getFullYear() === date.getFullYear();\n let inRange = startMatch;\n if (!inRange && event.endDate) {\n const check = new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n const s = new Date(\n event.date.getFullYear(),\n event.date.getMonth(),\n event.date.getDate(),\n ).getTime();\n const e = new Date(\n event.endDate.getFullYear(),\n event.endDate.getMonth(),\n event.endDate.getDate(),\n ).getTime();\n inRange = check >= s && check <= e;\n }\n return inRange;\n })\n .filter((event) => !event.categoryId || selectedCategoryIds.includes(event.categoryId));\n\n // one ref per day column, keyed by column index — the drag math for\n // whichever column started the interaction reads its own rect\n const colRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n const createRef = useRef<{ dayIndex: number; startMin: number } | null>(null);\n const [createPreview, setCreatePreview] = useState<{\n dayIndex: number;\n startMin: number;\n endMin: number;\n } | null>(null);\n\n const moveRef = useRef<{\n event: CalendarEvent;\n dayIndex: number;\n mode: MoveMode;\n startY: number;\n origStart: number;\n origEnd: number;\n moved: boolean;\n } | null>(null);\n const justMovedRef = useRef(false);\n const [livePreview, setLivePreview] = useState<{\n id: string;\n startMin: number;\n endMin: number;\n } | null>(null);\n // mirrors of the two preview states above, read (not written) in onUp — in\n // StrictMode, a functional setState updater runs twice, so any side effect\n // (calling onTimeRangeSelect/onEventTimeChange) must live outside of one\n const createPreviewRef = useRef<{ dayIndex: number; startMin: number; endMin: number } | null>(\n null,\n );\n const livePreviewRef = useRef<{ id: string; startMin: number; endMin: number } | null>(null);\n // which day column a \"move\" drag is currently hovering — only 'move' can\n // cross columns; resizes stay within their original day\n const [moveDayIndex, setMoveDayIndex] = useState<number | null>(null);\n\n const [interacting, setInteracting] = useState(false);\n\n const findColIndexAtX = (x: number): number | null => {\n for (let i = 0; i < colRefs.current.length; i++) {\n const el = colRefs.current[i];\n if (!el) continue;\n const r = el.getBoundingClientRect();\n if (x >= r.left && x <= r.right) return i;\n }\n return null;\n };\n\n useEffect(() => {\n if (!interacting) return;\n\n function onMove(e: PointerEvent) {\n if (createRef.current) {\n const rect = colRefs.current[createRef.current.dayIndex]?.getBoundingClientRect();\n // a momentary zero-height rect (mid-layout) must not produce NaN/Infinity\n // math that then gets committed as garbage start/end times\n if (!rect || rect.height <= 0) return;\n const m = snapMinutes(minutesFromY(e.clientY, rect));\n const next = {\n dayIndex: createRef.current.dayIndex,\n startMin: createRef.current.startMin,\n endMin: m,\n };\n createPreviewRef.current = next;\n setCreatePreview(next);\n return;\n }\n\n const mv = moveRef.current;\n if (mv) {\n if (mv.mode === 'move') {\n const hoverIdx = findColIndexAtX(e.clientX);\n if (hoverIdx != null && hoverIdx !== mv.dayIndex) {\n mv.dayIndex = hoverIdx;\n setMoveDayIndex(hoverIdx);\n }\n }\n const rect = colRefs.current[mv.dayIndex]?.getBoundingClientRect();\n if (!rect || rect.height <= 0) return;\n if (!mv.moved && Math.abs(e.clientY - mv.startY) > 4) mv.moved = true;\n if (!mv.moved) return;\n const deltaMin = snapMinutes(((e.clientY - mv.startY) / rect.height) * 24 * 60);\n let newStart = mv.origStart;\n let newEnd = mv.origEnd;\n if (mv.mode === 'move') {\n newStart = mv.origStart + deltaMin;\n newEnd = mv.origEnd + deltaMin;\n if (newStart < 0) {\n newEnd -= newStart;\n newStart = 0;\n }\n if (newEnd > 24 * 60) {\n newStart -= newEnd - 24 * 60;\n newEnd = 24 * 60;\n }\n } else if (mv.mode === 'resize-start') {\n newStart = Math.max(0, Math.min(mv.origEnd - MIN_EVENT_MINUTES, mv.origStart + deltaMin));\n } else {\n newEnd = Math.min(\n 24 * 60,\n Math.max(mv.origStart + MIN_EVENT_MINUTES, mv.origEnd + deltaMin),\n );\n }\n const next = { id: mv.event.id, startMin: newStart, endMin: newEnd };\n livePreviewRef.current = next;\n setLivePreview(next);\n }\n }\n\n function onUp() {\n if (createRef.current) {\n const dayIndex = createRef.current.dayIndex;\n const day = weekDays[dayIndex];\n const p = createPreviewRef.current;\n if (p && day && Number.isFinite(p.startMin) && Number.isFinite(p.endMin)) {\n const s = Math.min(p.startMin, p.endMin);\n const e = Math.max(p.startMin, p.endMin);\n if (e - s >= MIN_EVENT_MINUTES) onTimeRangeSelect(day, s, e);\n }\n createRef.current = null;\n createPreviewRef.current = null;\n setCreatePreview(null);\n }\n if (moveRef.current?.moved) {\n const mv = moveRef.current;\n const p = livePreviewRef.current;\n if (p && Number.isFinite(p.startMin) && Number.isFinite(p.endMin)) {\n justMovedRef.current = true;\n const newDay = weekDays[mv.dayIndex];\n const dayChanged = newDay && !isSameDay(newDay, mv.event.date);\n onEventTimeChange(mv.event, p.startMin, p.endMin, dayChanged ? newDay : undefined);\n }\n }\n moveRef.current = null;\n livePreviewRef.current = null;\n setLivePreview(null);\n setMoveDayIndex(null);\n setInteracting(false);\n }\n\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [interacting, onTimeRangeSelect, onEventTimeChange]);\n\n const beginCreate = (e: ReactPointerEvent, dayIndex: number) => {\n if ((e.target as HTMLElement).closest('[data-event=\"true\"]')) return;\n // drag-to-create starts on the vertically-scrollable timegrid column, so on\n // touch we let the column scroll instead (create a timed event via the modal)\n if (e.pointerType === 'touch') return;\n const rect = colRefs.current[dayIndex]?.getBoundingClientRect();\n if (!rect) return;\n const m = snapMinutes(minutesFromY(e.clientY, rect));\n createRef.current = { dayIndex, startMin: m };\n setCreatePreview({ dayIndex, startMin: m, endMin: m });\n setInteracting(true);\n };\n\n const beginMove = (\n e: ReactPointerEvent,\n event: CalendarEvent,\n dayIndex: number,\n mode: MoveMode,\n ) => {\n // move/resize track via column geometry (getBoundingClientRect + clientX/Y),\n // which works under touch's implicit capture too — so this stays enabled for\n // touch; the event chip sets `touch-action: none` to claim the drag gesture\n // recurring events can be moved (the host resolves this/following/all\n // via a scope dialog) but not resized — a resize only makes sense\n // against a single occurrence's concrete start/end time\n if ((event.recurrence || event.isRecurringInstance) && mode !== 'move') return;\n e.stopPropagation();\n e.preventDefault();\n const origStart = hhmmToMinutes(event.startTime);\n const origEnd = event.endTime ? hhmmToMinutes(event.endTime) : origStart + 60;\n moveRef.current = {\n event,\n dayIndex,\n mode,\n startY: e.clientY,\n origStart,\n origEnd,\n moved: false,\n };\n setInteracting(true);\n };\n\n const handleEventItemClick = (e: ReactMouseEvent, event: CalendarEvent) => {\n e.stopPropagation();\n if (justMovedRef.current) {\n justMovedRef.current = false;\n return;\n }\n onEventClick(event, e.currentTarget as HTMLElement);\n };\n\n // keyboard navigation: one roving-tabindex hour slot, Up/Down moves it by\n // an hour, Left/Right moves it a day — mirrors MonthView's focusedIndex\n // pattern. Stays null until the grid is actually focused, so mounting\n // never steals focus.\n const [focusedCell, setFocusedCell] = useState<{ dayIndex: number; hour: number } | null>(null);\n const slotRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n\n useEffect(() => {\n if (!focusedCell) return;\n slotRefs.current[`${focusedCell.dayIndex}-${focusedCell.hour}`]?.focus();\n }, [focusedCell]);\n\n const defaultCell = { dayIndex: Math.max(0, weekDays.findIndex((d) => isToday(d))), hour: 9 };\n const activeCell = focusedCell ?? defaultCell;\n\n return (\n <div className=\"sft-cal-timegrid sft-cal-timegrid--week\">\n <div className=\"sft-cal-timegrid__corner\" />\n {weekDays.map((day, dayIndex) => {\n const cls = dayColorClass(day.getDay());\n return (\n <div\n key={day.toISOString()}\n className=\"sft-cal-timegrid__colhead\"\n data-movetarget={moveDayIndex === dayIndex || undefined}\n >\n <span\n className={cls ? `sft-cal-timegrid__daylabel ${cls}` : 'sft-cal-timegrid__daylabel'}\n data-today={isToday(day) || undefined}\n >\n {(dayNames[language] ?? dayNames.en ?? [])[day.getDay()]} ({day.getDate()})\n </span>\n </div>\n );\n })}\n\n <div className=\"sft-cal-timegrid__hours\">\n {HOURS.map((hour) => (\n <div key={hour} className=\"sft-cal-timegrid__hour\">\n <span className=\"sft-cal-timegrid__hourlabel\">\n {hour.toString().padStart(2, '0')}:00\n </span>\n </div>\n ))}\n </div>\n\n {weekDays.map((day, dayIndex) => (\n <div\n key={`col-${day.toISOString()}`}\n className=\"sft-cal-timegrid__col\"\n ref={(el) => {\n colRefs.current[dayIndex] = el;\n }}\n onPointerDown={(e) => beginCreate(e, dayIndex)}\n >\n {HOURS.map((hour) => (\n <button\n key={hour}\n ref={(el) => {\n slotRefs.current[`${dayIndex}-${hour}`] = el;\n }}\n type=\"button\"\n className=\"sft-cal-timegrid__slot\"\n tabIndex={activeCell.dayIndex === dayIndex && activeCell.hour === hour ? 0 : -1}\n aria-label={`${(dayNames[language] ?? dayNames.en ?? [])[day.getDay()]} ${day.getDate()}, ${hour.toString().padStart(2, '0')}:00`}\n onFocus={() => setFocusedCell({ dayIndex, hour })}\n onKeyDown={(e) => {\n let nd = dayIndex;\n let nh = hour;\n if (e.key === 'ArrowDown') nh = Math.min(23, hour + 1);\n else if (e.key === 'ArrowUp') nh = Math.max(0, hour - 1);\n else if (e.key === 'ArrowRight') nd = Math.min(weekDays.length - 1, dayIndex + 1);\n else if (e.key === 'ArrowLeft') nd = Math.max(0, dayIndex - 1);\n else return;\n e.preventDefault();\n setFocusedCell({ dayIndex: nd, hour: nh });\n }}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('[data-event=\"true\"]')) return;\n onAddEventClick(day, hour, e.clientX, e.clientY);\n }}\n />\n ))}\n\n {eventsForDay(day).map((event) => {\n // while cross-day dragging (mode 'move' hovering a different\n // column), hide the original — a ghost renders in the hovered\n // column instead, below\n if (\n moveRef.current?.event.id === event.id &&\n moveRef.current.mode === 'move' &&\n moveDayIndex != null &&\n moveDayIndex !== dayIndex\n ) {\n return null;\n }\n const isEditing = selectedEvent?.id === event.id && previewEvent;\n const live = livePreview?.id === event.id ? livePreview : null;\n const data = isEditing\n ? {\n title: previewEvent.title,\n startTime: previewEvent.startTime,\n endTime: previewEvent.endTime,\n categoryId: previewEvent.categoryId,\n }\n : event;\n const color = categories.find((c) => c.id === data.categoryId)?.color || '#E30000';\n const startMin = live ? live.startMin : hhmmToMinutes(data.startTime);\n const endMin = live\n ? live.endMin\n : data.endTime\n ? hhmmToMinutes(data.endTime)\n : startMin + 60;\n const top = (startMin / (24 * 60)) * 100;\n const height = ((endMin - startMin) / (24 * 60)) * 100;\n const resizable = !event.recurrence && !event.isRecurringInstance;\n return (\n <div\n key={event.id}\n data-event=\"true\"\n data-movable=\"true\"\n className=\"sft-cal-timeevent\"\n data-editing={isEditing || undefined}\n role=\"button\"\n tabIndex={0}\n aria-label={data.title || pick(language, '(제목 없음)', '(No title)')}\n style={{\n top: `${top}%`,\n height: `${height}%`,\n left: '4px',\n width: 'calc(100% - 8px)',\n background: withAlpha(color, 0.12),\n borderLeft: `3px solid ${color}`,\n }}\n onPointerDown={(e) => beginMove(e, event, dayIndex, 'move')}\n onClick={(e) => handleEventItemClick(e, event)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n onEventClick(event, e.currentTarget);\n }\n }}\n >\n {resizable && (\n <span\n className=\"sft-cal-timeevent__resize sft-cal-timeevent__resize--top\"\n onPointerDown={(e) => beginMove(e, event, dayIndex, 'resize-start')}\n />\n )}\n <div className=\"sft-cal-timeevent__label\" style={{ color }}>\n {event.recurrence && <Repeat size={12} />}\n <span className=\"sft-cal-timeevent__title\">\n {data.title || pick(language, '(제목 없음)', '(No title)')}\n </span>\n </div>\n {resizable && (\n <span\n className=\"sft-cal-timeevent__resize sft-cal-timeevent__resize--bottom\"\n onPointerDown={(e) => beginMove(e, event, dayIndex, 'resize-end')}\n />\n )}\n </div>\n );\n })}\n\n {/* drag-to-create preview: a plain draft bar spanning the dragged range */}\n {createPreview &&\n createPreview.dayIndex === dayIndex &&\n (() => {\n const s = Math.min(createPreview.startMin, createPreview.endMin);\n const e = Math.max(createPreview.startMin, createPreview.endMin);\n const top = (s / (24 * 60)) * 100;\n const height = ((e - s) / (24 * 60)) * 100;\n return (\n <div\n className=\"sft-cal-timeevent sft-cal-timeevent--draft\"\n style={{\n top: `${top}%`,\n height: `${height}%`,\n left: '4px',\n width: 'calc(100% - 8px)',\n }}\n >\n <div className=\"sft-cal-timeevent__label\">\n <span className=\"sft-cal-timeevent__title\">\n {minutesToHHMM(s)}–{minutesToHHMM(e)}\n </span>\n </div>\n </div>\n );\n })()}\n\n {/* cross-day drag ghost: only shown in the hovered column while a\n \"move\" drag has left the event's original day column */}\n {moveDayIndex === dayIndex &&\n livePreview &&\n (() => {\n const mv = moveRef.current;\n if (!mv || mv.mode !== 'move') return null;\n const originalDayIndex = weekDays.findIndex((d) => isSameDay(d, mv.event.date));\n if (originalDayIndex === dayIndex) return null; // same column — already rendered above\n const color =\n categories.find((c) => c.id === mv.event.categoryId)?.color || '#E30000';\n const top = (livePreview.startMin / (24 * 60)) * 100;\n const height = ((livePreview.endMin - livePreview.startMin) / (24 * 60)) * 100;\n return (\n <div\n className=\"sft-cal-timeevent\"\n style={{\n top: `${top}%`,\n height: `${height}%`,\n left: '4px',\n width: 'calc(100% - 8px)',\n background: withAlpha(color, 0.12),\n borderLeft: `3px solid ${color}`,\n pointerEvents: 'none',\n }}\n >\n <div className=\"sft-cal-timeevent__label\" style={{ color }}>\n {mv.event.recurrence && <Repeat size={12} />}\n <span className=\"sft-cal-timeevent__title\">\n {mv.event.title || pick(language, '(제목 없음)', '(No title)')}\n </span>\n </div>\n </div>\n );\n })()}\n </div>\n ))}\n </div>\n );\n}\n","import { useRef } from 'react';\nimport { pick } from '../i18n';\nimport type { CalendarEvent, Category } from '../types';\nimport { formatDate, isToday } from '../utils/date';\nimport { expandRecurringEvents } from '../utils/events';\n\nexport interface YearViewProps {\n currentDate: Date;\n events: CalendarEvent[];\n selectedCategoryIds: string[];\n categories: Category[];\n language: string;\n onDateClick: (date: Date) => void;\n onViewChange: (view: 'month') => void;\n}\n\nconst MINI_DAY_LABELS: Record<string, string[]> = {\n ko: ['일', '월', '화', '수', '목', '금', '토'],\n en: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n};\n\n/** YearView — a 12-up grid of mini month calendars with per-day event dots. */\nexport function YearView({\n currentDate,\n events,\n selectedCategoryIds,\n categories,\n language,\n onDateClick,\n onViewChange,\n}: YearViewProps) {\n const year = currentDate.getFullYear();\n const months = Array.from({ length: 12 }, (_, i) => i);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n // arrow-key day-to-day navigation across month boundaries — DOM lookup by\n // a data-daykey instead of tracked state, since a flat index across 12\n // variable-length mini-grids is awkward to maintain\n const handleDayKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>, date: Date) => {\n let delta = 0;\n if (e.key === 'ArrowRight') delta = 1;\n else if (e.key === 'ArrowLeft') delta = -1;\n else if (e.key === 'ArrowDown') delta = 7;\n else if (e.key === 'ArrowUp') delta = -7;\n else return;\n e.preventDefault();\n const next = new Date(date.getFullYear(), date.getMonth(), date.getDate() + delta);\n if (next.getFullYear() !== year) return; // stays within this year view\n const target = containerRef.current?.querySelector<HTMLButtonElement>(\n `[data-daykey=\"${formatDate(next)}\"]`,\n );\n target?.focus();\n };\n\n const expanded = expandRecurringEvents(\n events,\n new Date(year, 0, 1),\n new Date(year, 11, 31),\n ).filter((e) => !e.categoryId || selectedCategoryIds.includes(e.categoryId));\n\n const countForMonth = (monthIndex: number) => {\n const start = new Date(year, monthIndex, 1);\n const end = new Date(year, monthIndex + 1, 0);\n return expanded.filter((e) => {\n const s = e.date;\n const en = e.endDate ?? e.date;\n return (s >= start && s <= end) || (en >= start && en <= end) || (s < start && en > end);\n }).length;\n };\n\n const renderMini = (monthIndex: number) => {\n const firstDay = new Date(year, monthIndex, 1).getDay();\n const daysInMonth = new Date(year, monthIndex + 1, 0).getDate();\n const cells: (number | null)[] = [\n ...Array(firstDay).fill(null),\n ...Array.from({ length: daysInMonth }, (_, i) => i + 1),\n ];\n const labels = MINI_DAY_LABELS[language] ?? MINI_DAY_LABELS.en ?? [];\n\n return (\n <div className=\"sft-cal-mini\">\n <div className=\"sft-cal-mini__head\">\n <h3 className=\"sft-cal-mini__title\">\n {pick(\n language,\n `${monthIndex + 1}월`,\n new Date(year, monthIndex).toLocaleDateString('en-US', { month: 'long' }),\n )}\n </h3>\n <span className=\"sft-cal-mini__count\">\n {countForMonth(monthIndex)} {pick(language, '개 일정', 'events')}\n </span>\n </div>\n <div className=\"sft-cal-mini__weekdays\">\n {labels.map((d, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: fixed 7-item header\n <div key={i} className=\"sft-cal-mini__weekday\">\n {d}\n </div>\n ))}\n </div>\n <div className=\"sft-cal-mini__grid\">\n {cells.map((day, index) => {\n const date = day ? new Date(year, monthIndex, day) : null;\n const today = date ? isToday(date) : false;\n const dayEvents = date\n ? expanded.filter((e) => {\n const norm = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n ).getTime();\n const s = new Date(\n e.date.getFullYear(),\n e.date.getMonth(),\n e.date.getDate(),\n ).getTime();\n const en = e.endDate\n ? new Date(\n e.endDate.getFullYear(),\n e.endDate.getMonth(),\n e.endDate.getDate(),\n ).getTime()\n : s;\n return norm >= s && norm <= en;\n })\n : [];\n return (\n <button\n key={day ? `d${day}` : `empty-${index}`}\n type=\"button\"\n className=\"sft-cal-mini__day\"\n data-today={today || undefined}\n data-empty={!day || undefined}\n data-daykey={date ? formatDate(date) : undefined}\n disabled={!day}\n aria-label={date ? `${year}-${monthIndex + 1}-${day}` : undefined}\n onKeyDown={(e) => date && handleDayKeyDown(e, date)}\n onClick={() => {\n if (day) {\n onDateClick(new Date(year, monthIndex, 1));\n onViewChange('month');\n }\n }}\n >\n {day}\n {dayEvents.length > 0 && !today && (\n <span className=\"sft-cal-mini__dots\">\n {dayEvents.slice(0, 3).map((e, i) => (\n <span\n // biome-ignore lint/suspicious/noArrayIndexKey: at most 3 decorative dots\n key={i}\n className=\"sft-cal-mini__dot\"\n style={{\n background:\n categories.find((c) => c.id === e.categoryId)?.color || '#E30000',\n }}\n />\n ))}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n };\n\n return (\n <div className=\"sft-cal-year\" ref={containerRef}>\n <div className=\"sft-cal-year__grid\">\n {months.map((m) => (\n <div key={m} className=\"sft-cal-year__cell\">\n {renderMini(m)}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { ChevronLeft, ChevronRight, Redo2, Search, Undo2, X } from 'lucide-react';\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from 'react';\nimport { CategoryFilter } from './components/CategoryFilter';\nimport type { DeleteType } from './components/DeleteOptionsDialog';\nimport { EventModal, type EventSaveData } from './components/EventModal';\nimport { RecurrenceScopeDialog } from './components/RecurrenceScopeDialog';\nimport { SegmentTabs } from './components/SegmentTabs';\nimport { type CalendarController, useCalendar } from './hooks/useCalendar';\nimport { pick } from './i18n';\nimport type { CalendarEvent, Category, Holiday, PreviewEvent, ViewType } from './types';\nimport {\n getNextPeriodDate,\n getPreviousPeriodDate,\n getWeekDays,\n minutesToHHMM,\n monthNames,\n} from './utils/date';\nimport { getNextAvailableTime, occurrencesInRange } from './utils/events';\nimport { DayView } from './views/DayView';\nimport { MonthView } from './views/MonthView';\nimport { WeekView } from './views/WeekView';\nimport { YearView } from './views/YearView';\n\nexport interface CalendarProps {\n /** UI language for the calendar's own strings. Default 'ko'. */\n language?: string;\n /** an external controller (from useCalendar); one is created internally if omitted */\n controller?: CalendarController;\n initialEvents?: CalendarEvent[];\n initialCategories?: Category[];\n initialDate?: Date;\n initialView?: ViewType;\n /** holidays/observances shown as a label in the month view's date header */\n holidays?: Holiday[];\n className?: string;\n}\n\nconst startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\n\n/** a drag-move on a recurring event/instance, awaiting the user's \"this /\n * following / all\" scope choice before it's actually applied */\ninterface PendingMove {\n master: CalendarEvent;\n /** the dragged occurrence's original date (its identity within the series) */\n instanceDate: Date;\n /** target date (day-granular) the event was dropped on */\n newDate: Date;\n /** set only when the drag also changed the time (week/day view) */\n newStartTime?: string;\n newEndTime?: string;\n}\n\n/**\n * Calendar — the full calendar UI: a toolbar (title, prev/next/today, search,\n * category filter, view switcher) over month/week/day/year views, with an\n * event create/edit modal. Ported from the calendary project into softium\n * token CSS; server / Google-Calendar / today-task concerns removed. Runs off\n * local state (or a host-provided controller).\n */\nexport function Calendar({\n language = 'ko',\n controller,\n initialEvents,\n initialCategories,\n initialDate,\n initialView = 'month',\n holidays = [],\n className,\n}: CalendarProps): ReactNode {\n const internal = useCalendar({ initialEvents, initialCategories });\n const ctrl = controller ?? internal;\n const {\n events,\n addEvent,\n updateEvent,\n deleteEvent,\n setEvents,\n canUndo,\n canRedo,\n undo,\n redo,\n categories,\n selectedCategoryIds,\n toggleCategory,\n addCategory,\n updateCategory,\n deleteCategory,\n reorderCategories,\n } = ctrl;\n\n const [currentDate, setCurrentDate] = useState(initialDate ?? new Date());\n const [viewType, setViewType] = useState<ViewType>(initialView);\n const [modalOpen, setModalOpen] = useState(false);\n const [selectedEvent, setSelectedEvent] = useState<CalendarEvent | null>(null);\n const [selectedDate, setSelectedDate] = useState<Date | null>(null);\n const [selectedEndDate, setSelectedEndDate] = useState<Date | null>(null);\n const [previewEvent, setPreviewEvent] = useState<PreviewEvent | null>(null);\n const [expandedRows, setExpandedRows] = useState<Set<number>>(new Set());\n const [showSearch, setShowSearch] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [defaultStart, setDefaultStart] = useState('09:00');\n const [defaultEnd, setDefaultEnd] = useState('10:00');\n const instanceDateRef = useRef<Date | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n const [pendingMove, setPendingMove] = useState<PendingMove | null>(null);\n const [moveScope, setMoveScope] = useState<DeleteType>('this');\n\n const filteredEvents = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n if (!q) return events;\n return events.filter(\n (e) => e.title.toLowerCase().includes(q) || (e.description ?? '').toLowerCase().includes(q),\n );\n }, [events, searchQuery]);\n\n const previousPeriod = () => setCurrentDate(getPreviousPeriodDate(currentDate, viewType));\n const nextPeriod = () => setCurrentDate(getNextPeriodDate(currentDate, viewType));\n const goToToday = () => setCurrentDate(new Date());\n\n const headerTitle = useMemo(() => {\n const y = currentDate.getFullYear();\n const mn = monthNames[language] ?? (monthNames.en as string[]);\n const mon = (d: Date) => mn[d.getMonth()] ?? '';\n if (viewType === 'year') return `${y}`;\n if (viewType === 'day') {\n return pick(\n language,\n `${y}년 ${mon(currentDate)} ${currentDate.getDate()}일`,\n `${mon(currentDate)} ${currentDate.getDate()}, ${y}`,\n );\n }\n if (viewType === 'week') {\n const wd = getWeekDays(currentDate);\n const s = wd[0] ?? currentDate;\n const e = wd[6] ?? currentDate;\n return pick(\n language,\n `${mon(s)} ${s.getDate()}일 - ${mon(e)} ${e.getDate()}일`,\n `${mon(s)} ${s.getDate()} - ${mon(e)} ${e.getDate()}, ${y}`,\n );\n }\n return pick(language, `${y}년 ${mon(currentDate)}`, `${mon(currentDate)} ${y}`);\n }, [currentDate, viewType, language]);\n\n // ⌘Z / ⌘⇧Z (or Ctrl) undo/redo, plus single-key shortcuts (t/m/w/d/y) —\n // all disabled while typing in the modal/search box or with the event\n // modal open, so they don't fight native text-field editing\n useEffect(() => {\n function onKeyDown(e: KeyboardEvent) {\n const target = e.target as HTMLElement | null;\n const typing = !!target && /^(input|textarea)$/i.test(target.tagName);\n\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z') {\n if (typing) return;\n e.preventDefault();\n if (e.shiftKey) redo();\n else undo();\n return;\n }\n\n if (typing || e.metaKey || e.ctrlKey || e.altKey || modalOpen) return;\n switch (e.key.toLowerCase()) {\n case 't':\n goToToday();\n break;\n case 'm':\n setViewType('month');\n break;\n case 'w':\n setViewType('week');\n break;\n case 'd':\n setViewType('day');\n break;\n case 'y':\n setViewType('year');\n break;\n default:\n return;\n }\n e.preventDefault();\n }\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [undo, redo, modalOpen, goToToday, setViewType]);\n\n /** drag-to-move an event chip/bar onto a different day (month view); for a\n * recurring event/instance this defers to the scope dialog instead of\n * committing straight away */\n const handleEventMove = (event: CalendarEvent, newDate: Date) => {\n const deltaDays = Math.round(\n (startOfDay(newDate).getTime() - startOfDay(event.date).getTime()) / 86_400_000,\n );\n if (deltaDays === 0) return;\n const shift = (d: Date) =>\n new Date(\n d.getFullYear(),\n d.getMonth(),\n d.getDate() + deltaDays,\n d.getHours(),\n d.getMinutes(),\n );\n\n if (event.recurrence || event.isRecurringInstance) {\n const master = event.isRecurringInstance\n ? (events.find((e) => e.id === event.recurringEventId) ?? event)\n : event;\n setMoveScope('this');\n setPendingMove({ master, instanceDate: event.date, newDate: shift(event.date) });\n return;\n }\n\n updateEvent(event.id, {\n date: shift(event.date),\n endDate: event.endDate ? shift(event.endDate) : undefined,\n });\n };\n\n /** drag a period bar's start/end edge (month view) onto another day to resize it */\n const handleEventResize = (event: CalendarEvent, edge: 'start' | 'end', newDate: Date) => {\n const onDay = (base: Date, day: Date) =>\n new Date(\n day.getFullYear(),\n day.getMonth(),\n day.getDate(),\n base.getHours(),\n base.getMinutes(),\n );\n if (edge === 'start') {\n const end = event.endDate ?? event.date;\n if (startOfDay(newDate) > startOfDay(end)) return; // can't push start past the end\n updateEvent(event.id, { date: onDay(event.date, newDate) });\n } else {\n if (startOfDay(newDate) < startOfDay(event.date)) return; // can't pull end before the start\n updateEvent(event.id, { endDate: onDay(event.endDate ?? event.date, newDate) });\n }\n };\n\n const openCreate = (date: Date, endDate: Date | null, hour?: number) => {\n setSelectedEvent(null);\n instanceDateRef.current = null;\n setSelectedDate(date);\n setSelectedEndDate(endDate);\n if (hour != null) {\n setDefaultStart(`${String(hour).padStart(2, '0')}:00`);\n setDefaultEnd(`${String(Math.min(23, hour + 1)).padStart(2, '0')}:00`);\n } else {\n const s = getNextAvailableTime(date, events);\n const sh = Number.parseInt(s.split(':')[0] ?? '9', 10);\n setDefaultStart(s);\n setDefaultEnd(`${String(Math.min(23, sh + 1)).padStart(2, '0')}:00`);\n }\n setModalOpen(true);\n };\n\n const handleEventClick = (event: CalendarEvent) => {\n const master = event.isRecurringInstance\n ? (events.find((e) => e.id === event.recurringEventId) ?? event)\n : event;\n instanceDateRef.current = event.date;\n setSelectedEvent(master);\n setSelectedDate(master.date);\n setSelectedEndDate(master.endDate ?? null);\n setModalOpen(true);\n };\n\n const handleAddEventClick = (date: Date, hour?: number) => openCreate(date, null, hour);\n const handleRangeSelect = (start: Date, end: Date) => openCreate(start, end);\n\n /** drag an empty week/day timegrid area (week/day views) into a timed create */\n const handleTimeRangeSelect = (date: Date, startMin: number, endMin: number) => {\n setSelectedEvent(null);\n instanceDateRef.current = null;\n setSelectedDate(date);\n setSelectedEndDate(null);\n setDefaultStart(minutesToHHMM(startMin));\n setDefaultEnd(minutesToHHMM(endMin));\n setModalOpen(true);\n };\n\n /** drag/resize a timed event in week/day view onto a new start/end time;\n * `newDate` is set only when a week-view drag also moved the event to a\n * different day column. Recurring events/instances defer to the scope\n * dialog instead of committing straight away (resize is blocked for them\n * upstream in WeekView/DayView, so this only ever sees a move here). */\n const handleEventTimeChange = (\n event: CalendarEvent,\n startMin: number,\n endMin: number,\n newDate?: Date,\n ) => {\n if (event.recurrence || event.isRecurringInstance) {\n const master = event.isRecurringInstance\n ? (events.find((e) => e.id === event.recurringEventId) ?? event)\n : event;\n const resolvedDate = newDate\n ? new Date(newDate.getFullYear(), newDate.getMonth(), newDate.getDate())\n : startOfDay(event.date);\n setMoveScope('this');\n setPendingMove({\n master,\n instanceDate: event.date,\n newDate: resolvedDate,\n newStartTime: minutesToHHMM(startMin),\n newEndTime: minutesToHHMM(endMin),\n });\n return;\n }\n\n const patch: Partial<CalendarEvent> = {\n startTime: minutesToHHMM(startMin),\n endTime: minutesToHHMM(endMin),\n };\n if (newDate)\n patch.date = new Date(newDate.getFullYear(), newDate.getMonth(), newDate.getDate());\n updateEvent(event.id, patch);\n };\n\n const handleSave = (data: EventSaveData) => {\n const base: Omit<CalendarEvent, 'id'> = {\n title: data.title,\n date: data.startDate,\n endDate: data.endDate,\n startTime: data.startTime,\n endTime: data.endTime,\n description: data.description,\n categoryId: data.categoryId,\n recurrence: data.recurrence,\n };\n if (selectedEvent) updateEvent(selectedEvent.id, base);\n else addEvent(base);\n setPreviewEvent(null);\n };\n\n const handleDelete = (deleteType: DeleteType) => {\n if (!selectedEvent) return;\n const master = selectedEvent;\n const instanceDate = instanceDateRef.current;\n if (!master.recurrence || deleteType === 'all') {\n deleteEvent(master.id);\n } else if (deleteType === 'this' && instanceDate) {\n setEvents((prev) =>\n prev.map((e) =>\n e.id === master.id ? { ...e, exdate: [...(e.exdate ?? []), instanceDate] } : e,\n ),\n );\n } else if (deleteType === 'following' && instanceDate) {\n const until = startOfDay(instanceDate);\n until.setDate(until.getDate() - 1);\n setEvents((prev) =>\n prev.map((e) =>\n e.id === master.id && e.recurrence ? { ...e, recurrence: { ...e.recurrence, until } } : e,\n ),\n );\n }\n setPreviewEvent(null);\n };\n\n /** apply a pending recurring-event move once the user has picked a scope\n * ('this' occurrence only / 'this and following' / 'all') */\n const handleRecurrenceScopeConfirm = () => {\n if (!pendingMove) return;\n const { master, instanceDate, newDate, newStartTime, newEndTime } = pendingMove;\n\n if (moveScope === 'all' || !master.recurrence) {\n const deltaDays = Math.round(\n (startOfDay(newDate).getTime() - startOfDay(instanceDate).getTime()) / 86_400_000,\n );\n const shift = (d: Date) =>\n new Date(\n d.getFullYear(),\n d.getMonth(),\n d.getDate() + deltaDays,\n d.getHours(),\n d.getMinutes(),\n );\n updateEvent(master.id, {\n date: shift(master.date),\n endDate: master.endDate ? shift(master.endDate) : undefined,\n startTime: newStartTime ?? master.startTime,\n endTime: newEndTime ?? master.endTime,\n });\n } else if (moveScope === 'this') {\n // a single setEvents call so the exclusion + the new standalone event\n // land as one undo step, matching handleDelete's granularity\n setEvents((prev) => [\n ...prev.map((e) =>\n e.id === master.id ? { ...e, exdate: [...(e.exdate ?? []), instanceDate] } : e,\n ),\n {\n id: `${master.id}-moved-${instanceDate.getTime()}`,\n title: master.title,\n date: newDate,\n startTime: newStartTime ?? master.startTime,\n endTime: newEndTime ?? master.endTime,\n description: master.description,\n categoryId: master.categoryId,\n },\n ]);\n } else if (moveScope === 'following' && master.recurrence) {\n const recurrence = master.recurrence;\n const until = startOfDay(instanceDate);\n until.setDate(until.getDate() - 1);\n const elapsed = occurrencesInRange(master.date, recurrence, master.date, until).length;\n const remainingCount =\n recurrence.count != null ? Math.max(1, recurrence.count - elapsed) : undefined;\n setEvents((prev) => [\n ...prev.map((e) =>\n e.id === master.id && e.recurrence ? { ...e, recurrence: { ...e.recurrence, until } } : e,\n ),\n {\n id: `${master.id}-split-${instanceDate.getTime()}`,\n title: master.title,\n date: newDate,\n startTime: newStartTime ?? master.startTime,\n endTime: newEndTime ?? master.endTime,\n description: master.description,\n categoryId: master.categoryId,\n recurrence: { ...recurrence, count: remainingCount },\n },\n ]);\n }\n\n setPendingMove(null);\n };\n\n const handleRecurrenceScopeCancel = () => setPendingMove(null);\n\n const viewOptions: { value: ViewType; label: string }[] = [\n { value: 'day', label: pick(language, '일간', 'Day') },\n { value: 'week', label: pick(language, '주간', 'Week') },\n { value: 'month', label: pick(language, '월간', 'Month') },\n { value: 'year', label: pick(language, '연간', 'Year') },\n ];\n\n return (\n <div className={className ? `sft-cal ${className}` : 'sft-cal'}>\n <div className=\"sft-cal__toolbar\">\n <div className=\"sft-cal__toolbar-left\">\n <h2 className=\"sft-cal__title\">{headerTitle}</h2>\n <div className=\"sft-cal__nav\">\n <button\n type=\"button\"\n className=\"sft-cal__navbtn\"\n aria-label=\"previous\"\n onClick={previousPeriod}\n >\n <ChevronLeft size={16} />\n </button>\n <button\n type=\"button\"\n className=\"sft-cal__navbtn\"\n aria-label=\"next\"\n onClick={nextPeriod}\n >\n <ChevronRight size={16} />\n </button>\n </div>\n <button\n type=\"button\"\n className=\"sft-cal-btn sft-cal-btn--outline sft-cal-btn--sm\"\n onClick={goToToday}\n >\n {pick(language, '오늘', 'Today')}\n </button>\n <div className=\"sft-cal__nav\">\n <button\n type=\"button\"\n className=\"sft-cal__navbtn\"\n aria-label={pick(language, '실행 취소', 'Undo')}\n title={pick(language, '실행 취소 (⌘Z)', 'Undo (⌘Z)')}\n disabled={!canUndo}\n onClick={undo}\n >\n <Undo2 size={16} />\n </button>\n <button\n type=\"button\"\n className=\"sft-cal__navbtn\"\n aria-label={pick(language, '다시 실행', 'Redo')}\n title={pick(language, '다시 실행 (⌘⇧Z)', 'Redo (⌘⇧Z)')}\n disabled={!canRedo}\n onClick={redo}\n >\n <Redo2 size={16} />\n </button>\n </div>\n <div className=\"sft-cal__search\">\n {showSearch ? (\n <div className=\"sft-cal__searchbox\">\n <Search size={14} className=\"sft-cal__searchicon\" />\n <input\n ref={searchRef}\n className=\"sft-cal__searchinput\"\n placeholder={pick(language, '일정 검색...', 'Search events...')}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setSearchQuery('');\n setShowSearch(false);\n }\n }}\n />\n <button\n type=\"button\"\n className=\"sft-cal__searchclose\"\n aria-label=\"close search\"\n onClick={() => {\n setSearchQuery('');\n setShowSearch(false);\n }}\n >\n <X size={14} />\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"sft-cal__navbtn\"\n aria-label=\"search\"\n onClick={() => {\n setShowSearch(true);\n setTimeout(() => searchRef.current?.focus(), 30);\n }}\n >\n <Search size={16} />\n </button>\n )}\n </div>\n </div>\n\n <div className=\"sft-cal__toolbar-right\">\n <CategoryFilter\n categories={categories}\n selectedCategoryIds={selectedCategoryIds}\n language={language}\n onToggle={toggleCategory}\n onAdd={addCategory}\n onUpdate={updateCategory}\n onDelete={deleteCategory}\n onReorder={reorderCategories}\n />\n <SegmentTabs value={viewType} onValueChange={setViewType} options={viewOptions} />\n </div>\n </div>\n\n <div className=\"sft-cal__view\">\n {viewType === 'month' && (\n <MonthView\n currentDate={currentDate}\n events={filteredEvents}\n selectedCategoryIds={selectedCategoryIds}\n categories={categories}\n language={language}\n holidays={holidays}\n selectedEvent={selectedEvent}\n previewEvent={modalOpen ? previewEvent : null}\n expandedRows={expandedRows}\n setExpandedRows={setExpandedRows}\n onEventClick={handleEventClick}\n onAddEventClick={handleAddEventClick}\n onRangeSelect={handleRangeSelect}\n onEventMove={handleEventMove}\n onEventResize={handleEventResize}\n />\n )}\n {viewType === 'week' && (\n <WeekView\n currentDate={currentDate}\n events={filteredEvents}\n selectedCategoryIds={selectedCategoryIds}\n categories={categories}\n language={language}\n selectedEvent={selectedEvent}\n previewEvent={modalOpen ? previewEvent : null}\n onEventClick={handleEventClick}\n onAddEventClick={handleAddEventClick}\n onTimeRangeSelect={handleTimeRangeSelect}\n onEventTimeChange={handleEventTimeChange}\n />\n )}\n {viewType === 'day' && (\n <DayView\n currentDate={currentDate}\n events={filteredEvents}\n selectedCategoryIds={selectedCategoryIds}\n categories={categories}\n language={language}\n selectedEvent={selectedEvent}\n previewEvent={modalOpen ? previewEvent : null}\n onEventClick={handleEventClick}\n onAddEventClick={handleAddEventClick}\n onTimeRangeSelect={handleTimeRangeSelect}\n onEventTimeChange={handleEventTimeChange}\n />\n )}\n {viewType === 'year' && (\n <YearView\n currentDate={currentDate}\n events={filteredEvents}\n selectedCategoryIds={selectedCategoryIds}\n categories={categories}\n language={language}\n onDateClick={setCurrentDate}\n onViewChange={setViewType}\n />\n )}\n </div>\n\n <EventModal\n open={modalOpen}\n onOpenChange={(o) => {\n setModalOpen(o);\n if (!o) {\n setSelectedEvent(null);\n setPreviewEvent(null);\n }\n }}\n event={selectedEvent}\n selectedDate={selectedDate}\n selectedEndDate={selectedEndDate}\n defaultStartTime={defaultStart}\n defaultEndTime={defaultEnd}\n categories={categories}\n selectedCategoryIds={selectedCategoryIds}\n language={language}\n onSave={handleSave}\n onDelete={selectedEvent ? handleDelete : undefined}\n onChange={setPreviewEvent}\n onToggleCategory={toggleCategory}\n onAddCategory={addCategory}\n onUpdateCategory={updateCategory}\n onDeleteCategory={deleteCategory}\n onReorderCategories={reorderCategories}\n />\n\n {pendingMove && (\n <RecurrenceScopeDialog\n language={language}\n selectedScope={moveScope}\n setSelectedScope={setMoveScope}\n onCancel={handleRecurrenceScopeCancel}\n onConfirm={handleRecurrenceScopeConfirm}\n />\n )}\n </div>\n );\n}\n","/**\n * @softium/calendar\n *\n * A full calendar UI (month / week / day / year views + an event create/edit\n * modal with categories and recurrence), token-CSS themed. Import the stylesheet\n * once: import '@softium/calendar/styles.css';\n */\n\nexport const VERSION = '0.0.0';\n\nexport { Calendar } from './Calendar';\nexport type { CalendarProps } from './Calendar';\n\nexport { useCalendar } from './hooks/useCalendar';\nexport type { CalendarController, UseCalendarOptions } from './hooks/useCalendar';\n\n// views (advanced composition)\nexport { MonthView } from './views/MonthView';\nexport type { MonthViewProps } from './views/MonthView';\nexport { WeekView } from './views/WeekView';\nexport type { WeekViewProps } from './views/WeekView';\nexport { DayView } from './views/DayView';\nexport type { DayViewProps } from './views/DayView';\nexport { YearView } from './views/YearView';\nexport type { YearViewProps } from './views/YearView';\n\n// building blocks\nexport { EventModal } from './components/EventModal';\nexport type { EventModalProps, EventSaveData } from './components/EventModal';\nexport { RecurrenceSection } from './components/RecurrenceSection';\nexport type { RecurrenceSectionProps, RecurrenceEndType } from './components/RecurrenceSection';\nexport { DeleteOptionsDialog } from './components/DeleteOptionsDialog';\nexport type { DeleteOptionsDialogProps, DeleteType } from './components/DeleteOptionsDialog';\nexport { RecurrenceScopeDialog } from './components/RecurrenceScopeDialog';\nexport type { RecurrenceScopeDialogProps } from './components/RecurrenceScopeDialog';\nexport { CategoryItem } from './components/CategoryItem';\nexport type { CategoryItemProps } from './components/CategoryItem';\nexport { CategoryFilter } from './components/CategoryFilter';\nexport type { CategoryFilterProps } from './components/CategoryFilter';\nexport { SegmentTabs } from './components/SegmentTabs';\nexport type { SegmentTabsProps, SegmentOption } from './components/SegmentTabs';\n\n// utils\nexport { COLOR_PRESETS, findClosestPresetColor, withAlpha } from './utils/color';\nexport {\n expandRecurringEvents,\n getEventsForDate,\n getNextAvailableTime,\n eventCoversDate,\n occurrencesInRange,\n} from './utils/events';\nexport * from './utils/date';\n\n// types\nexport type {\n ViewType,\n RecurrenceFreq,\n Recurrence,\n Category,\n CalendarEvent,\n PreviewEvent,\n Holiday,\n} from './types';\nexport type { CalLocale } from './i18n';\n"]}