remons-calendar 1.0.0-beta.1

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.
Files changed (37) hide show
  1. package/dist/components/AddScheduleModal.d.ts +16 -0
  2. package/dist/components/AddScheduleModal.d.ts.map +1 -0
  3. package/dist/components/AddTodoModal.d.ts +16 -0
  4. package/dist/components/AddTodoModal.d.ts.map +1 -0
  5. package/dist/components/Calendar/CalendarHeader.d.ts +16 -0
  6. package/dist/components/Calendar/CalendarHeader.d.ts.map +1 -0
  7. package/dist/components/Calendar/DayCell.d.ts +26 -0
  8. package/dist/components/Calendar/DayCell.d.ts.map +1 -0
  9. package/dist/components/Calendar/DayPanel.d.ts +21 -0
  10. package/dist/components/Calendar/DayPanel.d.ts.map +1 -0
  11. package/dist/components/Calendar/TodoLanes.d.ts +12 -0
  12. package/dist/components/Calendar/TodoLanes.d.ts.map +1 -0
  13. package/dist/components/Calendar/index.d.ts +5 -0
  14. package/dist/components/Calendar/index.d.ts.map +1 -0
  15. package/dist/components/Calendar/layout.d.ts +20 -0
  16. package/dist/components/Calendar/layout.d.ts.map +1 -0
  17. package/dist/components/Calendar/types.d.ts +46 -0
  18. package/dist/components/Calendar/types.d.ts.map +1 -0
  19. package/dist/components/index.d.ts +3 -0
  20. package/dist/components/index.d.ts.map +1 -0
  21. package/dist/hooks/useLocalStorage.d.ts +3 -0
  22. package/dist/hooks/useLocalStorage.d.ts.map +1 -0
  23. package/dist/index.cjs +1 -0
  24. package/dist/index.d.ts +8 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +755 -0
  27. package/dist/services/holiday.d.ts +8 -0
  28. package/dist/services/holiday.d.ts.map +1 -0
  29. package/dist/style.css +1 -0
  30. package/dist/types.d.ts +40 -0
  31. package/dist/types.d.ts.map +1 -0
  32. package/dist/utils/date.d.ts +24 -0
  33. package/dist/utils/date.d.ts.map +1 -0
  34. package/dist/utils/holidayDisplay.d.ts +18 -0
  35. package/dist/utils/holidayDisplay.d.ts.map +1 -0
  36. package/package.json +56 -0
  37. package/readme.md +62 -0
@@ -0,0 +1,16 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { DailySchedule } from '../types';
3
+ import './pickers.less';
4
+ export interface AddScheduleModalProps {
5
+ open: boolean;
6
+ editing: DailySchedule | null;
7
+ /** 新增时默认日期 */
8
+ initialDate?: string;
9
+ /** 外部传入的图标映射:key 为图标标识,value 为图片 DOM */
10
+ icons: Record<string, ReactNode>;
11
+ onClose: () => void;
12
+ onSave: (s: DailySchedule) => void;
13
+ onDelete: (id: string) => void;
14
+ }
15
+ export declare function AddScheduleModal({ open, editing, initialDate, icons, onClose, onSave, onDelete, }: AddScheduleModalProps): import("react").JSX.Element;
16
+ //# sourceMappingURL=AddScheduleModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddScheduleModal.d.ts","sourceRoot":"","sources":["../../src/components/AddScheduleModal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,gBAAgB,CAAC;AAoBxB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,cAAc;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACnC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,OAAO,EACP,WAAW,EACX,KAAK,EACL,OAAO,EACP,MAAM,EACN,QAAQ,GACT,EAAE,qBAAqB,+BA6FvB"}
@@ -0,0 +1,16 @@
1
+ import type { TodoRange } from '../types';
2
+ import './pickers.less';
3
+ export declare const PRESET_COLORS: string[];
4
+ export interface AddTodoModalProps {
5
+ open: boolean;
6
+ editing: TodoRange | null;
7
+ /** 新增时默认开始日期 */
8
+ initialStart?: string;
9
+ /** 新增时默认结束日期 */
10
+ initialEnd?: string;
11
+ onClose: () => void;
12
+ onSave: (t: TodoRange) => void;
13
+ onDelete: (id: string) => void;
14
+ }
15
+ export declare function AddTodoModal({ open, editing, initialStart, initialEnd, onClose, onSave, onDelete }: AddTodoModalProps): import("react").JSX.Element;
16
+ //# sourceMappingURL=AddTodoModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddTodoModal.d.ts","sourceRoot":"","sources":["../../src/components/AddTodoModal.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,gBAAgB,CAAC;AAExB,eAAO,MAAM,aAAa,UASzB,CAAC;AAsBF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,gBAAgB;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,iBAAiB,+BAoKrH"}
@@ -0,0 +1,16 @@
1
+ import type { ViewMode } from './types';
2
+ interface CalendarHeaderProps {
3
+ year: number;
4
+ month: number;
5
+ viewMode: ViewMode;
6
+ loading: boolean;
7
+ onViewModeChange: (m: ViewMode) => void;
8
+ onToday: () => void;
9
+ onPrevMonth: () => void;
10
+ onNextMonth: () => void;
11
+ isPreview?: boolean;
12
+ }
13
+ /** 日历头部:月份标题、视图模式切换、今日/翻月按钮 */
14
+ export declare function CalendarHeader({ year, month, viewMode, loading, onViewModeChange, onToday, onPrevMonth, onNextMonth, isPreview, }: CalendarHeaderProps): import("react").JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=CalendarHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalendarHeader.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/CalendarHeader.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,+BAA+B;AAC/B,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,OAAO,EACP,gBAAgB,EAChB,OAAO,EACP,WAAW,EACX,WAAW,EACX,SAAS,GACV,EAAE,mBAAmB,+BA+BrB"}
@@ -0,0 +1,26 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { DailySchedule } from '../../types';
3
+ import type { HolidayDisplay } from '../../utils/holidayDisplay';
4
+ import './styles/day-cell.less';
5
+ export interface DayCellProps {
6
+ dateStr: string;
7
+ day: number;
8
+ inMonth: boolean;
9
+ isToday: boolean;
10
+ isWeekend: boolean;
11
+ holiday?: HolidayDisplay;
12
+ /** 该日被待办横条占用的层数(用于格内预留高度) */
13
+ todoLanes: number;
14
+ schedules: DailySchedule[];
15
+ onEditSchedule: (s: DailySchedule, date: string) => void;
16
+ /** 是否被选中(下方展示当日详情) */
17
+ selected?: boolean;
18
+ /** 点击选中该日 */
19
+ onSelect?: (dateStr: string) => void;
20
+ /** 图标映射:key 为图标标识,value 为图片 DOM */
21
+ icons?: Record<string, ReactNode>;
22
+ }
23
+ /** 农历展示:节日 > 节气 > 当月月份名(初一)> 农历日 */
24
+ export declare function getLunarText(dateStr: string): string;
25
+ export declare function DayCell(props: DayCellProps): import("react").JSX.Element;
26
+ //# sourceMappingURL=DayCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DayCell.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/DayCell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,wBAAwB,CAAC;AAEhC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,cAAc,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,sBAAsB;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa;IACb,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACnC;AAID,oCAAoC;AACpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYpD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,+BAwD1C"}
@@ -0,0 +1,21 @@
1
+ import type { DailySchedule, TodoRange } from '../../types';
2
+ import type { HolidayDisplay } from '../../utils/holidayDisplay';
3
+ import './styles/day-panel.less';
4
+ interface DayPanelProps {
5
+ /** 选中日期 YYYY-MM-DD */
6
+ dateStr: string;
7
+ holiday?: HolidayDisplay;
8
+ /** 覆盖选中日的待办列表 */
9
+ todos: TodoRange[];
10
+ /** 选中日的日程列表 */
11
+ schedules: DailySchedule[];
12
+ onEditTodo: (t: TodoRange) => void;
13
+ onEditSchedule: (s: DailySchedule) => void;
14
+ onAddTodo: () => void;
15
+ onAddSchedule: () => void;
16
+ isPreview?: boolean;
17
+ }
18
+ /** 日历下方的选中日详情面板(完整展示当日待办与日程) */
19
+ export declare function DayPanel({ dateStr, holiday, todos, schedules, onEditTodo, onEditSchedule, onAddTodo, onAddSchedule, isPreview, }: DayPanelProps): import("react").JSX.Element;
20
+ export {};
21
+ //# sourceMappingURL=DayPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DayPanel.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/DayPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,yBAAyB,CAAC;AAYjC,UAAU,aAAa;IACrB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,iBAAiB;IACjB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,eAAe;IACf,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,UAAU,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACnC,cAAc,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAC3C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,gCAAgC;AAChC,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,OAAO,EACP,KAAK,EACL,SAAS,EACT,UAAU,EACV,cAAc,EACd,SAAS,EACT,aAAa,EACb,SAAS,GACV,EAAE,aAAa,+BAgFf"}
@@ -0,0 +1,12 @@
1
+ import type { TodoRange } from '../../types';
2
+ import type { TodoSeg } from './types';
3
+ import './styles/todo-bar.less';
4
+ interface TodoLanesProps {
5
+ /** 该周行的待办横条段 */
6
+ segs: TodoSeg[];
7
+ onEditTodo: (t: TodoRange) => void;
8
+ }
9
+ /** 单周行内的待办横条覆盖层 */
10
+ export declare function TodoLanes({ segs, onEditTodo }: TodoLanesProps): import("react").JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=TodoLanes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TodoLanes.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/TodoLanes.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,wBAAwB,CAAC;AAEhC,UAAU,cAAc;IACtB,gBAAgB;IAChB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,UAAU,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;CACpC;AAED,mBAAmB;AACnB,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,cAAc,+BAgC7D"}
@@ -0,0 +1,5 @@
1
+ import type { CalendarProps } from './types';
2
+ import './styles/calendar.less';
3
+ export type { CalendarProps, TodoSeg, ViewMode, VisibilityRange } from './types';
4
+ export declare function Calendar({ todos, schedules, onSaveTodo, onDeleteTodo, onSaveSchedule, onDeleteSchedule, isPreview, icons, }: CalendarProps): import("react").JSX.Element;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/index.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,SAAS,CAAC;AACvD,OAAO,wBAAwB,CAAC;AAEhC,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAIjF,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,SAAS,EACT,UAAU,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,KAAK,GACN,EAAE,aAAa,+BAoNf"}
@@ -0,0 +1,20 @@
1
+ import type { DailySchedule, TodoRange } from '../../types';
2
+ import type { DayItem } from '../../utils/date';
3
+ import type { TodoSeg, VisibilityRange, ViewMode } from './types';
4
+ /** 月网格中的一行(7 天) */
5
+ export type WeekRow = DayItem[];
6
+ /** 实际渲染的周行(保留全量网格中的原始行号,用于待办横条定位) */
7
+ export interface VisibleWeek {
8
+ week: WeekRow;
9
+ rowIndex: number;
10
+ }
11
+ /** 待办横条布局:按周行分段 + 每周独立分配泳道(感知时间:仅时间区间冲突才视为冲突) */
12
+ export declare function layoutTodos(todos: TodoRange[], grid: DayItem[]): {
13
+ todoSegs: TodoSeg[];
14
+ todoLanesByDate: Record<string, number>;
15
+ };
16
+ /** "仅待办和日程"模式:计算有内容的周行范围(首~尾,中间周照常展示),无内容返回 null */
17
+ export declare function computeVisibilityRange(todos: TodoRange[], schedules: DailySchedule[], dateIndexOf: Record<string, number>, year: number, month: number): VisibilityRange | null;
18
+ /** 实际渲染的周行:'all' 模式返回全部,'items' 模式按可见范围裁剪 */
19
+ export declare function getVisibleWeeks(weeks: WeekRow[], viewMode: ViewMode, visibilityRange: VisibilityRange | null): VisibleWeek[];
20
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/layout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAElE,mBAAmB;AACnB,MAAM,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;AAEhC,qCAAqC;AACrC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAmBD,iDAAiD;AACjD,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,EAAE,EAClB,IAAI,EAAE,OAAO,EAAE,GACd;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAmIlE;AAED,oDAAoD;AACpD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,SAAS,EAAE,EAClB,SAAS,EAAE,aAAa,EAAE,EAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,eAAe,GAAG,IAAI,CAwBxB;AAED,6CAA6C;AAC7C,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EAAE,EAChB,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,eAAe,GAAG,IAAI,GACtC,WAAW,EAAE,CAUf"}
@@ -0,0 +1,46 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { DailySchedule, TodoRange } from '../../types';
3
+ export interface CalendarProps {
4
+ /** 受控的待办列表数据源 */
5
+ todos: TodoRange[];
6
+ /** 受控的日程列表数据源 */
7
+ schedules: DailySchedule[];
8
+ /** 保存(新增或编辑)待办 */
9
+ onSaveTodo?: (t: TodoRange) => void;
10
+ /** 删除待办 */
11
+ onDeleteTodo?: (id: string) => void;
12
+ /** 保存(新增或编辑)日程 */
13
+ onSaveSchedule?: (s: DailySchedule) => void;
14
+ /** 删除日程 */
15
+ onDeleteSchedule?: (id: string) => void;
16
+ /** 是否预览模式(禁用新增/编辑操作) */
17
+ isPreview?: boolean;
18
+ /** 日程可用图标映射:key 为图标标识,value 为图片 DOM */
19
+ icons?: Record<string, ReactNode>;
20
+ }
21
+ /** 待办横条段(按周行分段渲染) */
22
+ export interface TodoSeg {
23
+ todo: TodoRange;
24
+ weekRow: number;
25
+ startCol: number;
26
+ endCol: number;
27
+ /** 横条左缘(天为单位的周 0-7 刻度,含当天 startTime 比例偏移) */
28
+ leftEdge: number;
29
+ /** 横条右缘(天为单位的周 0-7 刻度,至当天 endTime 为止) */
30
+ rightEdge: number;
31
+ lane: number;
32
+ /** 是否显示待办名称(仅包含范围起始日的段显示) */
33
+ showLabel: boolean;
34
+ /** 段左端是否为范围真实起始日(否则续接不圆角) */
35
+ roundLeft: boolean;
36
+ /** 段右端是否为范围真实结束日(否则续接不圆角) */
37
+ roundRight: boolean;
38
+ }
39
+ /** 视图模式:items=仅待办和日程,all=全部日期 */
40
+ export type ViewMode = 'items' | 'all';
41
+ /** 有内容的周行范围(首~尾行号) */
42
+ export interface VisibilityRange {
43
+ min: number;
44
+ max: number;
45
+ }
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,iBAAiB;IACjB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,kBAAkB;IAClB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,WAAW;IACX,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,kBAAkB;IAClB,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,WAAW;IACX,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,wBAAwB;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACnC;AAED,qBAAqB;AACrB,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,iCAAiC;AACjC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAEvC,sBAAsB;AACtB,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb"}
@@ -0,0 +1,3 @@
1
+ export { Calendar } from './Calendar';
2
+ export type { CalendarProps } from './Calendar';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** localStorage 持久化的 state */
2
+ export declare function useLocalStorage<T>(key: string, initial: T): readonly [T, import("react").Dispatch<import("react").SetStateAction<T>>];
3
+ //# sourceMappingURL=useLocalStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLocalStorage.d.ts","sourceRoot":"","sources":["../../src/hooks/useLocalStorage.ts"],"names":[],"mappings":"AAEA,8BAA8B;AAC9B,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,6EAmBzD"}
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),S=require("react"),c=require("antd"),g=require("dayjs"),re=require("lunar-javascript"),Q=require("@ant-design/icons"),oe="holiday_cache_v2_",le=n=>`${oe}${n}`;async function ce(n){const t=le(n),s=localStorage.getItem(t);if(s)try{return JSON.parse(s)}catch{localStorage.removeItem(t)}localStorage.removeItem(`holiday_cache_${n}`);const l=await fetch(`https://timor.tech/api/holiday/year/${n}`);if(!l.ok)throw new Error(`节假日接口请求失败: ${l.status}`);const a=await l.json(),d=(a==null?void 0:a.holiday)??(a==null?void 0:a.data)??{},o={};return Object.entries(d).forEach(([u,p])=>{if(!p||typeof p!="object")return;const[f,j]=u.split("-"),r=f==null?void 0:f.padStart(2,"0"),m=j==null?void 0:j.padStart(2,"0");!r||!m||r.length!==2||m.length!==2||(o[`${n}-${r}-${m}`]={holiday:!!p.holiday,name:String(p.name??""),target:p.target!=null?String(p.target):void 0})}),Object.keys(o).length>0?localStorage.setItem(t,JSON.stringify(o)):localStorage.removeItem(t),o}const D=n=>n.format("YYYY-MM-DD"),Z=n=>n.startTime??"00:00";function W(n){return n.startTime&&n.endTime?`${n.startTime}-${n.endTime}`:n.startTime??n.endTime??""}function ie(n,t){const l=g(`${n}-${t+1}-01`).startOf("week");return Array.from({length:42},(a,d)=>{const o=l.add(d,"day");return{date:o,inMonth:o.month()===t}})}function de(n,t){const s=new Date(`${n}T00:00:00`);s.setDate(s.getDate()+t);const l=s.getFullYear(),a=String(s.getMonth()+1).padStart(2,"0"),d=String(s.getDate()).padStart(2,"0");return`${l}-${a}-${d}`}function me(n){const t=Object.keys(n).sort(),s=d=>n[d],l=d=>{const o=de(d,-1),u=s(o);if(u)return!u.holiday;const p=n[d].target??"";return p?!t.some(f=>{if(f>=d)return!1;const j=s(f);return!!j&&j.holiday&&(j.target??"")===p}):!0},a={};return t.forEach(d=>{const o=n[d];if(o){if(!o.holiday){a[d]={name:"",off:!1};return}a[d]={name:l(d)?o.name:"",off:!0}}}),a}function ue(n,t){const[s,l]=S.useState(()=>{try{const a=localStorage.getItem(n);return a?JSON.parse(a):t}catch{return t}});return S.useEffect(()=>{try{localStorage.setItem(n,JSON.stringify(s))}catch{}},[n,s]),[s,l]}const J=["#f5222d","#fa8c16","#fadb14","#52c41a","#13c2c2","#1677ff","#722ed1","#eb2f96"];function he({value:n=J[5],onChange:t}){return e.jsx("div",{className:"color-swatches",children:J.map(s=>e.jsx("span",{className:`swatch ${n===s?"active":""}`,style:{background:s},onClick:()=>t==null?void 0:t(s)},s))})}function fe({open:n,editing:t,initialStart:s,initialEnd:l,onClose:a,onSave:d,onDelete:o}){const[u]=c.Form.useForm(),p=!!t;S.useEffect(()=>{n&&setTimeout(()=>{t?u.setFieldsValue({name:t.name,start:g(t.start),end:g(t.end),startTime:t.startTime?g(t.startTime,"HH:mm"):null,endTime:t.endTime?g(t.endTime,"HH:mm"):null,color:t.color}):(u.setFieldsValue({color:J[5],start:s?g(s):g(),end:l?g(l):g(),startTime:null,endTime:null}),u.resetFields(["name"]))},100)},[n,t,s,l,u]);const f={validator:(y,E)=>{const h=u.getFieldValue("start");return!E||!h||!E.isBefore(h,"day")?Promise.resolve():Promise.reject(new Error("结束日期不能早于开始日期"))}},j={validator:()=>{const y=u.getFieldValue("start"),E=u.getFieldValue("end");return!y||!E?Promise.resolve():E.isSame(y,"day")?Promise.reject(new Error("待办必须跨天(结束日期需晚于开始日期);单日事件请创建日程")):Promise.resolve()}},r={validator:(y,E)=>{var H;const h=u.getFieldValue("start"),k=u.getFieldValue("end");if(!h||!k||!k.isSame(h,"day"))return Promise.resolve();const b=((H=u.getFieldValue("startTime"))==null?void 0:H.format("HH:mm"))??"00:00";return((E==null?void 0:E.format("HH:mm"))??"24:00")<b?Promise.reject(new Error("结束时间不能早于开始时间")):Promise.resolve()}},m=async()=>{const y=await u.validateFields(),E=y.startTime,h=y.endTime;d({id:(t==null?void 0:t.id)??crypto.randomUUID(),name:y.name.trim(),start:y.start.format("YYYY-MM-DD"),end:y.end.format("YYYY-MM-DD"),startTime:E?E.format("HH:mm"):void 0,endTime:h?h.format("HH:mm"):void 0,color:y.color}),a()},x=()=>{t&&o(t.id),a()};return e.jsx(c.Modal,{title:p?"编辑待办":"添加待办",open:n,onCancel:a,okText:"保存",cancelText:"取消",destroyOnClose:!0,footer:e.jsxs(c.Space,{children:[p&&e.jsx(c.Button,{danger:!0,onClick:x,children:"删除"}),e.jsx(c.Button,{onClick:a,children:"取消"}),e.jsx(c.Button,{type:"primary",onClick:m,children:"保存"})]}),children:e.jsxs(c.Form,{form:u,layout:"vertical",preserve:!1,children:[e.jsx(c.Form.Item,{label:"事件名称",name:"name",rules:[{required:!0,message:"请输入事件名称"},{max:30}],children:e.jsx(c.Input,{placeholder:"如:年度项目冲刺",maxLength:30})}),e.jsxs(c.Row,{gutter:8,children:[e.jsx(c.Col,{span:12,children:e.jsx(c.Form.Item,{label:"开始日期",name:"start",dependencies:["end"],rules:[{required:!0,message:"请选择开始日期"},j],children:e.jsx(c.DatePicker,{style:{width:"100%"},format:"YYYY-MM-DD"})})}),e.jsx(c.Col,{span:12,children:e.jsx(c.Form.Item,{label:"开始时间",name:"startTime",children:e.jsx(c.TimePicker,{style:{width:"100%"},format:"HH:mm",minuteStep:30,placeholder:"首日开始时间,可选",allowClear:!0})})})]}),e.jsxs(c.Row,{gutter:8,children:[e.jsx(c.Col,{span:12,children:e.jsx(c.Form.Item,{label:"结束日期",name:"end",dependencies:["start"],rules:[{required:!0,message:"请选择结束日期"},f,j],children:e.jsx(c.DatePicker,{style:{width:"100%"},format:"YYYY-MM-DD"})})}),e.jsx(c.Col,{span:12,children:e.jsx(c.Form.Item,{label:"结束时间",name:"endTime",rules:[r],children:e.jsx(c.TimePicker,{style:{width:"100%"},format:"HH:mm",minuteStep:30,placeholder:"末日结束时间,可选",allowClear:!0})})})]}),e.jsx(c.Form.Item,{label:"颜色标记",name:"color",initialValue:J[5],children:e.jsx(he,{})})]})})}function pe({icons:n,onChange:t}){return e.jsx("div",{className:"emoji-grid",children:Object.entries(n).map(([s,l])=>e.jsx("span",{className:"emoji-item",onClick:()=>t==null?void 0:t(s),children:l},s))})}function xe({open:n,editing:t,initialDate:s,icons:l,onClose:a,onSave:d,onDelete:o}){const[u]=c.Form.useForm(),p=!!t,f=Object.keys(l);S.useEffect(()=>{n&&setTimeout(()=>{t?u.setFieldsValue({icon:t.icon,date:g(t.date),name:t.name,timeRange:t.startTime&&t.endTime?[g(t.startTime,"HH:mm"),g(t.endTime,"HH:mm")]:null}):(u.setFieldsValue({icon:f[0],date:s?g(s):g(),timeRange:null}),u.resetFields(["name"]))},100)},[n,t,s,u,l]);const j=async()=>{const m=await u.validateFields(),x=m.timeRange;d({id:(t==null?void 0:t.id)??crypto.randomUUID(),icon:m.icon,date:m.date.format("YYYY-MM-DD"),name:m.name.trim(),startTime:x!=null&&x[0]?x[0].format("HH:mm"):void 0,endTime:x!=null&&x[1]?x[1].format("HH:mm"):void 0}),a()},r=()=>{t&&o(t.id),a()};return e.jsx(c.Modal,{title:p?"编辑日程":"添加日程",open:n,onOk:j,onCancel:a,okText:"保存",cancelText:"取消",destroyOnClose:!0,footer:e.jsxs(c.Space,{children:[p&&e.jsx(c.Button,{danger:!0,onClick:r,children:"删除"}),e.jsx(c.Button,{onClick:a,children:"取消"}),e.jsx(c.Button,{type:"primary",onClick:j,children:"保存"})]}),children:e.jsxs(c.Form,{form:u,layout:"vertical",preserve:!1,children:[e.jsx(c.Form.Item,{label:"图标",name:"icon",initialValue:f[0],rules:[{required:!0}],children:e.jsx(pe,{icons:l})}),e.jsx(c.Form.Item,{label:"日期",name:"date",rules:[{required:!0,message:"请选择日期"}],children:e.jsx(c.DatePicker,{style:{width:"100%"},format:"YYYY-MM-DD"})}),e.jsx(c.Form.Item,{label:"时间范围",name:"timeRange",children:e.jsx(c.TimePicker.RangePicker,{style:{width:"100%"},format:"HH:mm",minuteStep:30,placeholder:["开始时间","结束时间"],allowClear:!0})}),e.jsx(c.Form.Item,{label:"名称",name:"name",rules:[{required:!0,message:"请输入名称"},{max:30}],children:e.jsx(c.Input,{placeholder:"如:牙医复诊",maxLength:30})})]})})}const je=2;function se(n){try{const[t,s,l]=n.split("-").map(Number),a=re.Solar.fromYmd(t,s,l).getLunar(),d=a.getFestivals();if(d.length>0)return d[0];const o=a.getJieQi();return o||(a.getDay()===1?`${a.getMonthInChinese()}月初一`:a.getDayInChinese())}catch{return""}}function ye(n){const{dateStr:t,day:s,inMonth:l,isToday:a,isWeekend:d,holiday:o,todoLanes:u,schedules:p,onEditSchedule:f,selected:j,onSelect:r,icons:m}=n,x=["day-cell"];l||x.push("out"),a&&x.push("today"),d&&x.push("weekend"),j&&x.push("selected"),o&&x.push(o!=null&&o.off?"holiday-off":"holiday-work");const y=p.slice(0,je),E=p.length-y.length;return e.jsxs("div",{className:x.join(" "),onClick:h=>{h.stopPropagation(),r==null||r(t)},children:[e.jsxs("div",{className:"day-top",children:[e.jsx("span",{className:"day-num",children:s}),e.jsxs("span",{className:"day-lunar",children:[(o==null?void 0:o.name)||se(t),o&&e.jsx("div",{className:`day-holiday ${o.off?"off":"work"}`,children:o.off?"休":"班"})]})]}),u>0&&e.jsx("div",{className:"todo-spacer",style:{height:u*22}}),e.jsxs("div",{className:"schedule-list",children:[y.map(h=>e.jsx(c.Tooltip,{title:[h.name,W(h)].filter(Boolean).join(" "),children:e.jsxs("span",{className:"schedule-item",onClick:k=>{k.stopPropagation(),f(h,t)},children:[e.jsx("span",{className:"schedule-icon",children:m==null?void 0:m[h.icon]}),e.jsx("span",{className:"schedule-name",children:h.name})]})},h.id)),E>0&&e.jsxs("span",{className:"schedule-more",children:["+",E," 更多"]})]})]})}function ge({year:n,month:t,viewMode:s,loading:l,onViewModeChange:a,onToday:d,onPrevMonth:o,onNextMonth:u,isPreview:p}){return e.jsxs("div",{className:"calendar-header",children:[e.jsxs("span",{className:"calendar-title",children:[n,"年",t+1,"月"]}),e.jsx(c.Segmented,{size:"small",options:[{label:"日历",value:"all"},{label:"事项",value:"items"}],value:s,onChange:f=>a(f)}),!p&&e.jsxs(c.Space,{children:[e.jsx(c.Button,{shape:"circle",size:"small",onClick:d,children:"今"}),e.jsx(c.Button,{shape:"circle",size:"small",onClick:o,children:e.jsx(Q.LeftOutlined,{})}),e.jsx(c.Button,{shape:"circle",size:"small",onClick:u,children:e.jsx(Q.RightOutlined,{})}),l&&e.jsx(c.Spin,{size:"small"})]})]})}function Te({segs:n,onEditTodo:t}){return e.jsx("div",{className:"todo-lanes",children:n.map((s,l)=>{const a=s.todo,d=`${a.start}${a.startTime?` ${a.startTime}`:""} ~ ${a.end}${a.endTime?` ${a.endTime}`:""}`,o=a.start===a.end?W(a):"";return e.jsx("span",{className:`todo-bar${s.roundLeft?" round-left":""}${s.roundRight?" round-right":""}`,title:`${a.name}(${d})`,style:{top:54+s.lane*22,left:`${s.leftEdge/7*100}%`,width:`${(Math.max(s.rightEdge,s.leftEdge)-s.leftEdge)/7*100}%`,background:a.color},onClick:u=>{u.stopPropagation(),t(a)},children:s.showLabel&&e.jsx("span",{className:"todo-bar-label",children:o?`${a.name} ${o}`:a.name})},`${a.id}-${l}`)})})}const Se=["周日","周一","周二","周三","周四","周五","周六"];function ee(n,t){const s=g(n);return s.year()===t?`${s.month()+1}月${s.date()}日`:`${s.year()}年${s.month()+1}月${s.date()}日`}function Ee({dateStr:n,holiday:t,todos:s,schedules:l,onEditTodo:a,onEditSchedule:d,onAddTodo:o,onAddSchedule:u,isPreview:p}){const f=g(n),j=f.year();return e.jsxs("div",{className:"day-panel",children:[e.jsxs("div",{className:"day-panel-header",children:[e.jsxs("div",{className:"day-panel-title",children:[f.year(),"年",f.month()+1,"月",f.date(),"日 ",Se[f.day()],!p&&e.jsxs("div",{className:"day-panel-actions",children:[e.jsx(c.Button,{size:"small",onClick:o,children:"添加待办"}),e.jsx(c.Button,{size:"small",onClick:u,children:"添加日程"})]})]}),e.jsx("span",{className:"day-panel-sub",children:t!=null&&t.name?t.name:se(n)||" "})]}),!!s.length&&e.jsxs("div",{className:"day-panel-section",children:[e.jsxs("div",{className:"day-panel-subtitle",children:["待办(",s.length,")"]}),s.map(r=>e.jsxs("div",{className:"day-panel-todo",onClick:()=>a(r),title:"点击编辑",children:[e.jsx("span",{className:"day-panel-todo-dot",style:{background:r.color}}),e.jsx("span",{className:"day-panel-todo-name",children:r.name}),e.jsxs("span",{className:"day-panel-todo-range",children:[ee(r.start,j),r.startTime?` ${r.startTime}`:""," ~ ",ee(r.end,j),r.endTime?` ${r.endTime}`:""]})]},r.id))]}),!!l.length&&e.jsxs("div",{className:"day-panel-section",children:[e.jsxs("div",{className:"day-panel-subtitle",children:["日程(",l.length,")"]}),l.map(r=>e.jsxs("div",{className:"day-panel-schedule",onClick:()=>d(r),title:"点击编辑",children:[e.jsx("span",{className:"day-panel-schedule-icon",children:r.icon}),e.jsx("span",{className:"day-panel-schedule-name",children:r.name}),W(r)&&e.jsx("span",{className:"day-panel-schedule-time",children:W(r)})]},r.id))]}),l.length===0&&e.jsx(c.Empty,{image:c.Empty.PRESENTED_IMAGE_SIMPLE,description:"本月暂无待办和日程"})]})}function te(n){const[t,s]=n.split(":").map(Number);return t*60+s}function ve(n,t){const s=n.startTime?te(n.startTime):0,l=n.endTime?te(n.endTime):1440,a=D(t);return n.start===n.end?[s,l]:a===n.start?[s,1440]:a===n.end?[0,l]:[0,1440]}function Me(n,t){const s={};t.forEach((r,m)=>{s[D(r.date)]=m});const l=D(t[0].date),a=D(t[t.length-1].date),d=new Array(t.length).fill(0),o=[],p=[...n].sort((r,m)=>{if(r.start!==m.start)return r.start.localeCompare(m.start);const x=r.startTime??"00:00",y=m.startTime??"00:00";return x!==y?x.localeCompare(y):r.end!==m.end?r.end.localeCompare(m.end):(r.endTime??"23:59").localeCompare(m.endTime??"23:59")}).filter(r=>!(r.end<l||r.start>a)).map(r=>({original:r,cs:r.start<l?l:r.start,ce:r.end>a?a:r.end})).filter(r=>{const m=s[r.cs],x=s[r.ce];return m!==void 0&&x!==void 0}),f=Math.ceil(t.length/7);for(let r=0;r<f;r++){const m=r*7,x=Math.min(m+6,t.length-1),y=Array.from({length:7},()=>[[],[],[]]),E=p.filter(h=>{const k=s[h.cs];return s[h.ce]>=m&&k<=x});for(const{original:h,cs:k,ce:b}of E){const P=s[k],H=s[b],M=Math.max(P,m)-m,C=Math.min(H,x)-m,I=[];for(let T=M;T<=C;T++)I.push(ve(h,t[m+T].date));let L=-1;for(let T=0;T<3;T++){let F=!0;for(let w=M;w<=C&&F;w++){const[R,_]=I[w-M];R>=_||(F=!y[w][T].some(A=>A.s<_&&R<A.e))}if(F){L=T;break}}if(L===-1)continue;const V=P>=m&&k===h.start,N=H<=x&&b===h.end,[Y]=I[0],[,O]=I[I.length-1],q=M+(V?Y/1440:0),z=N?C+O/1440:C+1;o.push({todo:h,weekRow:r,startCol:M,endCol:C,leftEdge:q,rightEdge:z,lane:L,showLabel:V,roundLeft:V,roundRight:N});for(let T=M;T<=C;T++){const[F,w]=I[T-M];F<w&&y[T][L].push({s:F,e:w})}for(let T=M;T<=C;T++){const[F,w]=I[T-M];if(F<w){const R=m+T;d[R]<L+1&&(d[R]=L+1)}}}}const j={};return t.forEach((r,m)=>{d[m]>0&&(j[D(r.date)]=d[m])}),{todoSegs:o,todoLanesByDate:j}}function ke(n,t,s,l,a){const d=`${l}-${String(a+1).padStart(2,"0")}-01`,o=g(new Date(l,a+1,0)),u=`${o.year()}-${String(o.month()+1).padStart(2,"0")}-${String(o.date()).padStart(2,"0")}`,p=new Set;return n.forEach(f=>{const j=f.start<d?d:f.start,r=f.end>u?u:f.end;if(r<j)return;let m=g(j);for(;D(m)<=r;){const x=s[D(m)];x!==void 0&&p.add(Math.floor(x/7)),m=m.add(1,"day")}}),t.forEach(f=>{if(f.date>=d&&f.date<=u){const j=s[f.date];j!==void 0&&p.add(Math.floor(j/7))}}),p.size===0?null:{min:Math.min(...p),max:Math.max(...p)}}function Ne(n,t,s){if(t==="all")return n.map((a,d)=>({week:a,rowIndex:d}));if(!s)return[];const l=[];for(let a=s.min;a<=s.max;a++)l.push({week:n[a],rowIndex:a});return l}const $e=["日","一","二","三","四","五","六"];function we({todos:n,schedules:t,onSaveTodo:s,onDeleteTodo:l,onSaveSchedule:a,onDeleteSchedule:d,isPreview:o,icons:u}){const[p,f]=S.useState(g()),[j,r]=S.useState({}),[m,x]=S.useState(!1),[y,E]=ue("calendar_view_mode",o?"items":"all"),[h,k]=S.useState(D(g())),[b,P]=S.useState({open:!1,editing:null}),[H,M]=S.useState({open:!1,editing:null}),C=i=>{o||P({open:!0,editing:i})},I=(i,v)=>{o||M({open:!0,editing:i})},L=i=>{o||P({open:!0,editing:null,initialStart:i,initialEnd:i})},V=i=>{o||M({open:!0,editing:null,initialDate:i})},N=p.year(),Y=p.month();S.useEffect(()=>{let i=!1;return x(!0),ce(N).then(v=>{i||r(v)}).catch(()=>{i||r({})}).finally(()=>{i||x(!1)}),()=>{i=!0}},[N]);const O=S.useMemo(()=>ie(N,Y),[N,Y]),q=S.useMemo(()=>me(j),[j]),z=S.useMemo(()=>{const i={};return t.forEach(v=>{var $;(i[$=v.date]??(i[$]=[])).push(v)}),Object.values(i).forEach(v=>v.sort(($,U)=>Z($).localeCompare(Z(U)))),i},[t]),T=S.useMemo(()=>{const i=[];for(let v=0;v<O.length;v+=7)i.push(O.slice(v,v+7));return i},[O]),{todoSegs:F,todoLanesByDate:w}=S.useMemo(()=>Me(n,O),[n,O]),R=D(g()),_=S.useMemo(()=>{const i={};return O.forEach((v,$)=>{i[D(v.date)]=$}),i},[O]),A=`${N}-${String(Y+1).padStart(2,"0")}-01`;S.useEffect(()=>{if(!h||_[h]!==void 0)return;const i=R;k(_[i]!==void 0&&i.startsWith(A.slice(0,8))?i:A)},[N,Y]);const ne=i=>{k(v=>v===i?null:i)},K=S.useMemo(()=>ke(n,t,_,N,Y),[n,t,N,Y,_]),G=S.useMemo(()=>Ne(T,y,K),[T,y,K]);return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"calendar",children:[e.jsx(ge,{isPreview:o,year:N,month:Y,viewMode:y,loading:m,onViewModeChange:E,onToday:()=>f(g()),onPrevMonth:()=>f(p.subtract(1,"month")),onNextMonth:()=>f(p.add(1,"month"))}),e.jsx("div",{className:"week-row",children:$e.map(i=>e.jsx("div",{className:"week-cell",children:i},i))}),e.jsx("div",{className:"day-grid",children:G.length===0?e.jsx("div",{className:"calendar-empty",children:e.jsx(c.Empty,{image:c.Empty.PRESENTED_IMAGE_SIMPLE,description:"本月暂无待办和日程"})}):G.map(({week:i,rowIndex:v})=>e.jsxs("div",{className:"day-week",children:[i.map(({date:$,inMonth:U})=>{const B=D($),X=$.day(),ae=X===0||X===6;return e.jsx(ye,{dateStr:B,day:$.date(),inMonth:U,isToday:B===R,isWeekend:ae,holiday:q[B],todoLanes:w[B]??0,schedules:z[B]??[],onEditSchedule:I,icons:u,selected:h===B,onSelect:ne},B)}),e.jsx(Te,{segs:F.filter($=>$.weekRow===v),onEditTodo:C})]},v))})]}),h&&e.jsx(Ee,{dateStr:h,holiday:q[h],todos:n.filter(i=>i.start<=h&&h<=i.end),schedules:z[h]??[],onEditTodo:C,onEditSchedule:i=>I(i),onAddTodo:()=>L(h),onAddSchedule:()=>V(h),isPreview:o}),e.jsx(fe,{open:b.open,editing:b.editing,initialStart:b.initialStart,initialEnd:b.initialEnd,onClose:()=>P({open:!1,editing:null}),onSave:i=>s==null?void 0:s(i),onDelete:i=>l==null?void 0:l(i)}),e.jsx(xe,{open:H.open,editing:H.editing,initialDate:H.initialDate,icons:u??{},onClose:()=>M({open:!1,editing:null}),onSave:i=>a==null?void 0:a(i),onDelete:i=>d==null?void 0:d(i)})]})}exports.Calendar=we;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 包入口:对外导出日历组件、数据类型与工具 Hook
3
+ * 弹窗等交互逻辑已内聚到 Calendar 组件内部,外部无需感知。
4
+ * 消费方需同时引入样式:import 'remons-calendar/style.css';
5
+ */
6
+ export { Calendar } from './components/Calendar';
7
+ export type { CalendarProps } from './components/Calendar';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}