@dxos/react-ui-calendar 0.8.4-main.548089c → 0.8.4-main.e8ec1fe
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.
- package/dist/lib/browser/index.mjs +25 -11
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +25 -11
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/components/Calendar/Calendar.d.ts +4 -4
- package/dist/types/src/components/Calendar/Calendar.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -12
- package/src/components/Calendar/Calendar.stories.tsx +4 -4
- package/src/components/Calendar/Calendar.tsx +40 -16
|
@@ -6,7 +6,7 @@ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo
|
|
|
6
6
|
import { useResizeDetector } from "react-resize-detector";
|
|
7
7
|
import { List } from "react-virtualized";
|
|
8
8
|
import { Event } from "@dxos/async";
|
|
9
|
-
import { IconButton, useTranslation } from "@dxos/react-ui";
|
|
9
|
+
import { Icon, IconButton, useTranslation } from "@dxos/react-ui";
|
|
10
10
|
import { mx } from "@dxos/react-ui-theme";
|
|
11
11
|
|
|
12
12
|
// src/translations.ts
|
|
@@ -79,11 +79,11 @@ var CalendarViewport = ({ children, classNames }) => {
|
|
|
79
79
|
}
|
|
80
80
|
};
|
|
81
81
|
CalendarViewport.displayName = "CalendarContent";
|
|
82
|
-
var
|
|
82
|
+
var CalendarToolbar = ({ classNames }) => {
|
|
83
83
|
var _effect = _useSignals();
|
|
84
84
|
try {
|
|
85
85
|
const { t } = useTranslation(translationKey);
|
|
86
|
-
const { weekStartsOn, event, index, selected } = useCalendarContext(
|
|
86
|
+
const { weekStartsOn, event, index, selected } = useCalendarContext(CalendarToolbar.displayName);
|
|
87
87
|
const top = useMemo(() => getDate(start, index ?? 0, 6, weekStartsOn), [
|
|
88
88
|
index,
|
|
89
89
|
weekStartsOn
|
|
@@ -101,7 +101,7 @@ var CalendarHeader = ({ classNames }) => {
|
|
|
101
101
|
]);
|
|
102
102
|
return /* @__PURE__ */ React.createElement("div", {
|
|
103
103
|
role: "none",
|
|
104
|
-
className: mx("shink-0 is-full grid grid-cols-3", classNames),
|
|
104
|
+
className: mx("shink-0 is-full grid grid-cols-3 items-center bg-barSurface", classNames),
|
|
105
105
|
style: {
|
|
106
106
|
width: defaultWidth
|
|
107
107
|
}
|
|
@@ -109,22 +109,22 @@ var CalendarHeader = ({ classNames }) => {
|
|
|
109
109
|
className: "flex justify-start"
|
|
110
110
|
}, /* @__PURE__ */ React.createElement(IconButton, {
|
|
111
111
|
variant: "ghost",
|
|
112
|
-
size:
|
|
112
|
+
size: 5,
|
|
113
113
|
icon: "ph--calendar--regular",
|
|
114
114
|
iconOnly: true,
|
|
115
115
|
classNames: "aspect-square",
|
|
116
116
|
label: t("today button"),
|
|
117
117
|
onClick: handleToday
|
|
118
|
-
})), /* @__PURE__ */ React.createElement("
|
|
119
|
-
className: "flex justify-center p-2"
|
|
120
|
-
}, format(selected ?? top, "MMMM")), /* @__PURE__ */ React.createElement("
|
|
121
|
-
className: "flex justify-end p-2"
|
|
118
|
+
})), /* @__PURE__ */ React.createElement("div", {
|
|
119
|
+
className: "flex justify-center p-2 text-description"
|
|
120
|
+
}, format(selected ?? top, "MMMM")), /* @__PURE__ */ React.createElement("div", {
|
|
121
|
+
className: "flex justify-end p-2 text-description"
|
|
122
122
|
}, (selected ?? top).getFullYear()));
|
|
123
123
|
} finally {
|
|
124
124
|
_effect.f();
|
|
125
125
|
}
|
|
126
126
|
};
|
|
127
|
-
|
|
127
|
+
CalendarToolbar.displayName = "CalendarHeader";
|
|
128
128
|
var CalendarGrid = ({ classNames, rows, onSelect }) => {
|
|
129
129
|
var _effect = _useSignals();
|
|
130
130
|
try {
|
|
@@ -166,6 +166,9 @@ var CalendarGrid = ({ classNames, rows, onSelect }) => {
|
|
|
166
166
|
return format(day, "EEE");
|
|
167
167
|
});
|
|
168
168
|
}, []);
|
|
169
|
+
const getNumAppointments = useCallback((_date) => {
|
|
170
|
+
return 0;
|
|
171
|
+
}, []);
|
|
169
172
|
const handleDaySelect = useCallback((date) => {
|
|
170
173
|
setSelected((current) => isSameDay(date, current) ? void 0 : date);
|
|
171
174
|
onSelect?.({
|
|
@@ -181,11 +184,14 @@ var CalendarGrid = ({ classNames, rows, onSelect }) => {
|
|
|
181
184
|
const getBgColor = (date) => date.getMonth() % 2 === 0 && "bg-modalSurface";
|
|
182
185
|
return /* @__PURE__ */ React.createElement("div", {
|
|
183
186
|
key,
|
|
187
|
+
role: "none",
|
|
184
188
|
style,
|
|
185
189
|
className: "is-full grid grid-cols-[1fr_max-content_1fr] snap-center"
|
|
186
190
|
}, /* @__PURE__ */ React.createElement("div", {
|
|
191
|
+
role: "none",
|
|
187
192
|
className: mx(getBgColor(getDate(start, index, 0, weekStartsOn)))
|
|
188
193
|
}), /* @__PURE__ */ React.createElement("div", {
|
|
194
|
+
role: "none",
|
|
189
195
|
className: "grid grid-cols-7",
|
|
190
196
|
style: {
|
|
191
197
|
gridTemplateColumns: `repeat(7, ${size}px)`
|
|
@@ -194,9 +200,11 @@ var CalendarGrid = ({ classNames, rows, onSelect }) => {
|
|
|
194
200
|
length: 7
|
|
195
201
|
}).map((_, i) => {
|
|
196
202
|
const date = getDate(start, index, i, weekStartsOn);
|
|
203
|
+
const num = getNumAppointments(date);
|
|
197
204
|
const border = isSameDay(date, selected) ? "border-primary-500" : isSameDay(date, today) ? "border-amber-500" : void 0;
|
|
198
205
|
return /* @__PURE__ */ React.createElement("div", {
|
|
199
206
|
key: i,
|
|
207
|
+
role: "none",
|
|
200
208
|
className: mx("relative flex justify-center items-center cursor-pointer", getBgColor(date)),
|
|
201
209
|
onClick: () => handleDaySelect(date)
|
|
202
210
|
}, /* @__PURE__ */ React.createElement("span", {
|
|
@@ -204,13 +212,19 @@ var CalendarGrid = ({ classNames, rows, onSelect }) => {
|
|
|
204
212
|
}, date.getDate()), !border && date.getDate() === 1 && /* @__PURE__ */ React.createElement("span", {
|
|
205
213
|
className: "absolute top-0 text-xs text-description"
|
|
206
214
|
}, format(date, "MMM")), border && /* @__PURE__ */ React.createElement("div", {
|
|
215
|
+
role: "none",
|
|
207
216
|
className: mx("absolute top-0 left-0 is-full bs-full border-2 rounded-full", border)
|
|
217
|
+
}), num > 0 && /* @__PURE__ */ React.createElement(Icon, {
|
|
218
|
+
classNames: "absolute bottom-0",
|
|
219
|
+
icon: num > 3 ? "ph--dots-three--regular" : "ph--dot--regular",
|
|
220
|
+
size: 5
|
|
208
221
|
}));
|
|
209
222
|
})), /* @__PURE__ */ React.createElement("div", {
|
|
210
223
|
className: mx(getBgColor(getDate(start, index, 6, weekStartsOn)))
|
|
211
224
|
}));
|
|
212
225
|
}, [
|
|
213
226
|
handleDaySelect,
|
|
227
|
+
getNumAppointments,
|
|
214
228
|
selected,
|
|
215
229
|
weekStartsOn
|
|
216
230
|
]);
|
|
@@ -256,7 +270,7 @@ CalendarGrid.displayName = "CalendarGrid";
|
|
|
256
270
|
var Calendar = {
|
|
257
271
|
Root: CalendarRoot,
|
|
258
272
|
Viewport: CalendarViewport,
|
|
259
|
-
|
|
273
|
+
Toolbar: CalendarToolbar,
|
|
260
274
|
Grid: CalendarGrid
|
|
261
275
|
};
|
|
262
276
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/Calendar/Calendar.tsx", "../../../src/translations.ts", "../../../src/components/Calendar/util.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport { type Day, addDays, differenceInWeeks, format, startOfWeek } from 'date-fns';\nimport React, {\n type Dispatch,\n type PropsWithChildren,\n type SetStateAction,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\nimport { List, type ListProps, type ListRowRenderer } from 'react-virtualized';\n\nimport { Event } from '@dxos/async';\nimport { IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { translationKey } from '../../translations';\n\nimport { getDate, isSameDay } from './util';\n\nconst maxRows = 50 * 100;\nconst start = new Date('1970-01-01');\nconst size = 48;\nconst defaultWidth = 7 * size;\n\n//\n// Context\n//\n\ntype CalendarEvent = {\n type: 'scroll';\n date: Date;\n};\n\ntype CalendarContextValue = {\n weekStartsOn: Day;\n event: Event<CalendarEvent>;\n index: number | undefined;\n setIndex: Dispatch<SetStateAction<number | undefined>>;\n selected: Date | undefined;\n setSelected: Dispatch<SetStateAction<Date | undefined>>;\n};\n\nconst [CalendarContextProvider, useCalendarContext] = createContext<CalendarContextValue>('Calendar');\n\n//\n// Controller\n//\n\ntype CalendarController = {\n scrollTo: (date: Date) => void;\n};\n\n//\n// Root\n//\n\ntype CalendarRootProps = PropsWithChildren<Partial<Pick<CalendarContextValue, 'weekStartsOn'>>>;\n\nconst CalendarRoot = forwardRef<CalendarController, CalendarRootProps>(\n ({ children, weekStartsOn = 1 }, forwardedRef) => {\n const event = useMemo(() => new Event<CalendarEvent>(), []);\n const [selected, setSelected] = useState<Date | undefined>();\n const [index, setIndex] = useState<number | undefined>();\n\n useImperativeHandle(\n forwardedRef,\n () => ({\n scrollTo: (date: Date) => {\n event.emit({ type: 'scroll', date });\n },\n }),\n [event],\n );\n\n return (\n <CalendarContextProvider\n weekStartsOn={weekStartsOn}\n event={event}\n index={index}\n setIndex={setIndex}\n selected={selected}\n setSelected={setSelected}\n >\n {children}\n </CalendarContextProvider>\n );\n },\n);\n\n//\n// Viewport\n//\n\ntype CalendarViewportProps = PropsWithChildren<ThemedClassName>;\n\nconst CalendarViewport = ({ children, classNames }: CalendarViewportProps) => {\n return (\n <div role='none' className={mx('flex flex-col items-center overflow-hidden bg-inputSurface', classNames)}>\n {children}\n </div>\n );\n};\n\nCalendarViewport.displayName = 'CalendarContent';\n\n//\n// Header\n//\n\ntype CalendarHeaderProps = ThemedClassName;\n\nconst CalendarHeader = ({ classNames }: CalendarHeaderProps) => {\n const { t } = useTranslation(translationKey);\n const { weekStartsOn, event, index, selected } = useCalendarContext(CalendarHeader.displayName);\n const top = useMemo(() => getDate(start, index ?? 0, 6, weekStartsOn), [index, weekStartsOn]);\n const today = useMemo(() => new Date(), []);\n\n const handleToday = useCallback(() => {\n event.emit({ type: 'scroll', date: today });\n }, [event, start, today]);\n\n return (\n <div role='none' className={mx('shink-0 is-full grid grid-cols-3', classNames)} style={{ width: defaultWidth }}>\n <div className='flex justify-start'>\n <IconButton\n variant='ghost'\n size={6}\n icon='ph--calendar--regular'\n iconOnly\n classNames='aspect-square'\n label={t('today button')}\n onClick={handleToday}\n />\n </div>\n <span className='flex justify-center p-2'>{format(selected ?? top, 'MMMM')}</span>\n <span className='flex justify-end p-2'>{(selected ?? top).getFullYear()}</span>\n </div>\n );\n};\n\nCalendarHeader.displayName = 'CalendarHeader';\n\n//\n// Grid\n// TODO(burdon): Key nav.\n// TODO(burdon): Drag range.\n//\n\ntype CalendarGridProps = ThemedClassName<{\n rows?: number;\n onSelect?: (event: { date: Date }) => void;\n}>;\n\nconst CalendarGrid = ({ classNames, rows, onSelect }: CalendarGridProps) => {\n const { weekStartsOn, event, setIndex, selected, setSelected } = useCalendarContext(CalendarGrid.displayName);\n const { ref: containerRef, width = 0, height = 0 } = useResizeDetector();\n const maxHeight = rows ? rows * size : undefined;\n const listRef = useRef<List>(null);\n const today = useMemo(() => new Date(), []);\n\n const [initialized, setInitialized] = useState(false);\n useEffect(() => {\n const index = differenceInWeeks(today, start);\n listRef.current?.scrollToRow(index);\n }, [initialized, start, today]);\n\n useEffect(() => {\n return event.on((event) => {\n switch (event.type) {\n case 'scroll': {\n const index = differenceInWeeks(event.date, start);\n listRef.current?.scrollToRow(index);\n break;\n }\n }\n });\n }, [event]);\n\n const days = useMemo(() => {\n const weekStart = startOfWeek(new Date(), { weekStartsOn });\n return Array.from({ length: 7 }, (_, i) => {\n const day = addDays(weekStart, i);\n return format(day, 'EEE'); // Short day name (Mon, Tue, etc.)\n });\n }, []);\n\n const handleDaySelect = useCallback(\n (date: Date) => {\n setSelected((current) => (isSameDay(date, current) ? undefined : date));\n onSelect?.({ date });\n },\n [onSelect],\n );\n\n const handleScroll = useCallback<NonNullable<ListProps['onScroll']>>((info) => {\n setIndex(Math.round(info.scrollTop / size));\n }, []);\n\n const rowRenderer = useCallback<ListRowRenderer>(\n ({ key, index, style }) => {\n const getBgColor = (date: Date) => date.getMonth() % 2 === 0 && 'bg-modalSurface';\n return (\n <div key={key} style={style} className='is-full grid grid-cols-[1fr_max-content_1fr] snap-center'>\n <div className={mx(getBgColor(getDate(start, index, 0, weekStartsOn)))} />\n <div className='grid grid-cols-7' style={{ gridTemplateColumns: `repeat(7, ${size}px)` }}>\n {Array.from({ length: 7 }).map((_, i) => {\n const date = getDate(start, index, i, weekStartsOn);\n const border = isSameDay(date, selected)\n ? 'border-primary-500'\n : isSameDay(date, today)\n ? 'border-amber-500'\n : undefined;\n\n return (\n <div\n key={i}\n className={mx('relative flex justify-center items-center cursor-pointer', getBgColor(date))}\n onClick={() => handleDaySelect(date)}\n >\n <span className='text-description'>{date.getDate()}</span>\n {!border && date.getDate() === 1 && (\n <span className='absolute top-0 text-xs text-description'>{format(date, 'MMM')}</span>\n )}\n {border && (\n <div className={mx('absolute top-0 left-0 is-full bs-full border-2 rounded-full', border)} />\n )}\n </div>\n );\n })}\n </div>\n <div className={mx(getBgColor(getDate(start, index, 6, weekStartsOn)))} />\n </div>\n );\n },\n [handleDaySelect, selected, weekStartsOn],\n );\n\n return (\n <div role='none' className={mx('flex flex-col bs-full is-full justify-center overflow-hidden', classNames)}>\n {/* Day labels */}\n <div role='none' className='flex justify-center bg-groupSurface'>\n <div role='none' className='flex is-full grid grid-cols-7' style={{ width: defaultWidth }}>\n {days.map((date, i) => (\n <div key={i} role='none' className='flex justify-center p-2 text-sm font-thin'>\n {date}\n </div>\n ))}\n </div>\n </div>\n {/* Grid */}\n <div role='none' className='flex flex-col bs-full is-full justify-center overflow-hidden' ref={containerRef}>\n <List\n ref={listRef}\n role='none'\n // TODO(burdon): Snap isn't working.\n className='[&>div]:snap-y scrollbar-none outline-none'\n width={width}\n height={maxHeight ?? height}\n rowCount={maxRows}\n rowHeight={size}\n rowRenderer={rowRenderer}\n scrollToAlignment='start'\n onScroll={handleScroll}\n onRowsRendered={() => setInitialized(true)}\n />\n </div>\n </div>\n );\n};\n\nCalendarGrid.displayName = 'CalendarGrid';\n\n//\n// Calendar\n//\n\nexport const Calendar = {\n Root: CalendarRoot,\n Viewport: CalendarViewport,\n Header: CalendarHeader,\n Grid: CalendarGrid,\n};\n\nexport type { CalendarController, CalendarRootProps, CalendarViewportProps, CalendarHeaderProps, CalendarGridProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = 'react-ui-calendar';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {\n 'today button': 'Today',\n },\n },\n },\n] as const satisfies Resource[];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Day } from 'date-fns';\n\nexport const getDate = (start: Date, weekNumber: number, dayOfWeek: number, weekStartsOn: Day): Date => {\n const result = new Date(start);\n const startDayOfWeek = start.getDay(); // 0 = Sunday, 1 = Monday, etc.\n const adjustedStartDay = (startDayOfWeek === 0 ? 7 : startDayOfWeek) - weekStartsOn; // Adjust for weekStartsOn.\n result.setDate(start.getDate() - adjustedStartDay + weekNumber * 7 + dayOfWeek);\n return result;\n};\n\nexport const isSameDay = (date1: Date, date2: Date | undefined): boolean => {\n return (\n !!date2 &&\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n"],
|
|
5
|
-
"mappings": ";;AAIA,SAASA,qBAAqB;AAC9B,SAAmBC,SAASC,mBAAmBC,QAAQC,mBAAmB;AAC1E,OAAOC,SAILC,YACAC,aACAC,WACAC,qBACAC,SACAC,QACAC,gBACK;AACP,SAASC,yBAAyB;AAClC,SAASC,YAAkD;AAE3D,SAASC,aAAa;AACtB,SAASC,YAAkCC,sBAAsB;
|
|
6
|
-
"names": ["createContext", "addDays", "differenceInWeeks", "format", "startOfWeek", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useMemo", "useRef", "useState", "useResizeDetector", "List", "Event", "IconButton", "useTranslation", "mx", "translationKey", "translations", "getDate", "start", "weekNumber", "dayOfWeek", "weekStartsOn", "result", "Date", "startDayOfWeek", "getDay", "adjustedStartDay", "setDate", "isSameDay", "date1", "date2", "getFullYear", "getMonth", "maxRows", "start", "Date", "size", "defaultWidth", "CalendarContextProvider", "useCalendarContext", "createContext", "CalendarRoot", "forwardRef", "children", "weekStartsOn", "forwardedRef", "event", "useMemo", "Event", "selected", "setSelected", "useState", "index", "setIndex", "useImperativeHandle", "scrollTo", "date", "emit", "type", "CalendarViewport", "classNames", "div", "role", "className", "mx", "displayName", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport { type Day, addDays, differenceInWeeks, format, startOfWeek } from 'date-fns';\nimport React, {\n type Dispatch,\n type PropsWithChildren,\n type SetStateAction,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\nimport { List, type ListProps, type ListRowRenderer } from 'react-virtualized';\n\nimport { Event } from '@dxos/async';\nimport { Icon, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { translationKey } from '../../translations';\n\nimport { getDate, isSameDay } from './util';\n\nconst maxRows = 50 * 100;\nconst start = new Date('1970-01-01');\nconst size = 48;\nconst defaultWidth = 7 * size;\n\n//\n// Context\n//\n\ntype CalendarEvent = {\n type: 'scroll';\n date: Date;\n};\n\ntype CalendarContextValue = {\n weekStartsOn: Day;\n event: Event<CalendarEvent>;\n index: number | undefined;\n setIndex: Dispatch<SetStateAction<number | undefined>>;\n selected: Date | undefined;\n setSelected: Dispatch<SetStateAction<Date | undefined>>;\n};\n\nconst [CalendarContextProvider, useCalendarContext] = createContext<CalendarContextValue>('Calendar');\n\n//\n// Controller\n//\n\ntype CalendarController = {\n scrollTo: (date: Date) => void;\n};\n\n//\n// Root\n//\n\ntype CalendarRootProps = PropsWithChildren<Partial<Pick<CalendarContextValue, 'weekStartsOn'>>>;\n\nconst CalendarRoot = forwardRef<CalendarController, CalendarRootProps>(\n ({ children, weekStartsOn = 1 }, forwardedRef) => {\n const event = useMemo(() => new Event<CalendarEvent>(), []);\n const [selected, setSelected] = useState<Date | undefined>();\n const [index, setIndex] = useState<number | undefined>();\n\n useImperativeHandle(\n forwardedRef,\n () => ({\n scrollTo: (date: Date) => {\n event.emit({ type: 'scroll', date });\n },\n }),\n [event],\n );\n\n return (\n <CalendarContextProvider\n weekStartsOn={weekStartsOn}\n event={event}\n index={index}\n setIndex={setIndex}\n selected={selected}\n setSelected={setSelected}\n >\n {children}\n </CalendarContextProvider>\n );\n },\n);\n\n//\n// Viewport\n//\n\ntype CalendarViewportProps = PropsWithChildren<ThemedClassName>;\n\nconst CalendarViewport = ({ children, classNames }: CalendarViewportProps) => {\n return (\n <div role='none' className={mx('flex flex-col items-center overflow-hidden bg-inputSurface', classNames)}>\n {children}\n </div>\n );\n};\n\nCalendarViewport.displayName = 'CalendarContent';\n\n//\n// Header\n//\n\ntype CalendarToolbarProps = ThemedClassName;\n\nconst CalendarToolbar = ({ classNames }: CalendarToolbarProps) => {\n const { t } = useTranslation(translationKey);\n const { weekStartsOn, event, index, selected } = useCalendarContext(CalendarToolbar.displayName);\n const top = useMemo(() => getDate(start, index ?? 0, 6, weekStartsOn), [index, weekStartsOn]);\n const today = useMemo(() => new Date(), []);\n\n const handleToday = useCallback(() => {\n event.emit({ type: 'scroll', date: today });\n }, [event, start, today]);\n\n return (\n <div\n role='none'\n className={mx('shink-0 is-full grid grid-cols-3 items-center bg-barSurface', classNames)}\n style={{ width: defaultWidth }}\n >\n <div className='flex justify-start'>\n <IconButton\n variant='ghost'\n size={5}\n icon='ph--calendar--regular'\n iconOnly\n classNames='aspect-square'\n label={t('today button')}\n onClick={handleToday}\n />\n </div>\n <div className='flex justify-center p-2 text-description'>{format(selected ?? top, 'MMMM')}</div>\n <div className='flex justify-end p-2 text-description'>{(selected ?? top).getFullYear()}</div>\n </div>\n );\n};\n\nCalendarToolbar.displayName = 'CalendarHeader';\n\n//\n// Grid\n// TODO(burdon): Key nav.\n// TODO(burdon): Drag range.\n//\n\ntype CalendarGridProps = ThemedClassName<{\n rows?: number;\n onSelect?: (event: { date: Date }) => void;\n}>;\n\nconst CalendarGrid = ({ classNames, rows, onSelect }: CalendarGridProps) => {\n const { weekStartsOn, event, setIndex, selected, setSelected } = useCalendarContext(CalendarGrid.displayName);\n const { ref: containerRef, width = 0, height = 0 } = useResizeDetector();\n const maxHeight = rows ? rows * size : undefined;\n const listRef = useRef<List>(null);\n const today = useMemo(() => new Date(), []);\n\n const [initialized, setInitialized] = useState(false);\n useEffect(() => {\n const index = differenceInWeeks(today, start);\n listRef.current?.scrollToRow(index);\n }, [initialized, start, today]);\n\n useEffect(() => {\n return event.on((event) => {\n switch (event.type) {\n case 'scroll': {\n const index = differenceInWeeks(event.date, start);\n listRef.current?.scrollToRow(index);\n break;\n }\n }\n });\n }, [event]);\n\n const days = useMemo(() => {\n const weekStart = startOfWeek(new Date(), { weekStartsOn });\n return Array.from({ length: 7 }, (_, i) => {\n const day = addDays(weekStart, i);\n return format(day, 'EEE'); // Short day name (Mon, Tue, etc.)\n });\n }, []);\n\n // TODO(burdon): Get info by range.\n // TODO(burdon): Border marker for \"all day events?\"\n const getNumAppointments = useCallback((_date: Date) => {\n // return Math.floor(Math.random() * 10);\n return 0;\n }, []);\n\n const handleDaySelect = useCallback(\n (date: Date) => {\n setSelected((current) => (isSameDay(date, current) ? undefined : date));\n onSelect?.({ date });\n },\n [onSelect],\n );\n\n const handleScroll = useCallback<NonNullable<ListProps['onScroll']>>((info) => {\n setIndex(Math.round(info.scrollTop / size));\n }, []);\n\n const rowRenderer = useCallback<ListRowRenderer>(\n ({ key, index, style }) => {\n const getBgColor = (date: Date) => date.getMonth() % 2 === 0 && 'bg-modalSurface';\n return (\n <div key={key} role='none' style={style} className='is-full grid grid-cols-[1fr_max-content_1fr] snap-center'>\n <div role='none' className={mx(getBgColor(getDate(start, index, 0, weekStartsOn)))} />\n <div role='none' className='grid grid-cols-7' style={{ gridTemplateColumns: `repeat(7, ${size}px)` }}>\n {Array.from({ length: 7 }).map((_, i) => {\n const date = getDate(start, index, i, weekStartsOn);\n const num = getNumAppointments(date);\n const border = isSameDay(date, selected)\n ? 'border-primary-500'\n : isSameDay(date, today)\n ? 'border-amber-500'\n : undefined;\n\n return (\n <div\n key={i}\n role='none'\n className={mx('relative flex justify-center items-center cursor-pointer', getBgColor(date))}\n onClick={() => handleDaySelect(date)}\n >\n <span className='text-description'>{date.getDate()}</span>\n {!border && date.getDate() === 1 && (\n <span className='absolute top-0 text-xs text-description'>{format(date, 'MMM')}</span>\n )}\n {border && (\n <div\n role='none'\n className={mx('absolute top-0 left-0 is-full bs-full border-2 rounded-full', border)}\n />\n )}\n {num > 0 && (\n <Icon\n classNames='absolute bottom-0'\n icon={num > 3 ? 'ph--dots-three--regular' : 'ph--dot--regular'}\n size={5}\n />\n )}\n </div>\n );\n })}\n </div>\n <div className={mx(getBgColor(getDate(start, index, 6, weekStartsOn)))} />\n </div>\n );\n },\n [handleDaySelect, getNumAppointments, selected, weekStartsOn],\n );\n\n return (\n <div role='none' className={mx('flex flex-col bs-full is-full justify-center overflow-hidden', classNames)}>\n {/* Day labels */}\n <div role='none' className='flex justify-center bg-groupSurface'>\n <div role='none' className='flex is-full grid grid-cols-7' style={{ width: defaultWidth }}>\n {days.map((date, i) => (\n <div key={i} role='none' className='flex justify-center p-2 text-sm font-thin'>\n {date}\n </div>\n ))}\n </div>\n </div>\n\n {/* Grid */}\n <div role='none' className='flex flex-col bs-full is-full justify-center overflow-hidden' ref={containerRef}>\n <List\n ref={listRef}\n role='none'\n // TODO(burdon): Snap isn't working.\n className='[&>div]:snap-y scrollbar-none outline-none'\n width={width}\n height={maxHeight ?? height}\n rowCount={maxRows}\n rowHeight={size}\n rowRenderer={rowRenderer}\n scrollToAlignment='start'\n onScroll={handleScroll}\n onRowsRendered={() => setInitialized(true)}\n />\n </div>\n </div>\n );\n};\n\nCalendarGrid.displayName = 'CalendarGrid';\n\n//\n// Calendar\n//\n\nexport const Calendar = {\n Root: CalendarRoot,\n Viewport: CalendarViewport,\n Toolbar: CalendarToolbar,\n Grid: CalendarGrid,\n};\n\nexport type { CalendarController, CalendarRootProps, CalendarViewportProps, CalendarToolbarProps, CalendarGridProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = 'react-ui-calendar';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {\n 'today button': 'Today',\n },\n },\n },\n] as const satisfies Resource[];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Day } from 'date-fns';\n\nexport const getDate = (start: Date, weekNumber: number, dayOfWeek: number, weekStartsOn: Day): Date => {\n const result = new Date(start);\n const startDayOfWeek = start.getDay(); // 0 = Sunday, 1 = Monday, etc.\n const adjustedStartDay = (startDayOfWeek === 0 ? 7 : startDayOfWeek) - weekStartsOn; // Adjust for weekStartsOn.\n result.setDate(start.getDate() - adjustedStartDay + weekNumber * 7 + dayOfWeek);\n return result;\n};\n\nexport const isSameDay = (date1: Date, date2: Date | undefined): boolean => {\n return (\n !!date2 &&\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["createContext", "addDays", "differenceInWeeks", "format", "startOfWeek", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useMemo", "useRef", "useState", "useResizeDetector", "List", "Event", "Icon", "IconButton", "useTranslation", "mx", "translationKey", "translations", "getDate", "start", "weekNumber", "dayOfWeek", "weekStartsOn", "result", "Date", "startDayOfWeek", "getDay", "adjustedStartDay", "setDate", "isSameDay", "date1", "date2", "getFullYear", "getMonth", "maxRows", "start", "Date", "size", "defaultWidth", "CalendarContextProvider", "useCalendarContext", "createContext", "CalendarRoot", "forwardRef", "children", "weekStartsOn", "forwardedRef", "event", "useMemo", "Event", "selected", "setSelected", "useState", "index", "setIndex", "useImperativeHandle", "scrollTo", "date", "emit", "type", "CalendarViewport", "classNames", "div", "role", "className", "mx", "displayName", "CalendarToolbar", "t", "useTranslation", "translationKey", "top", "getDate", "today", "handleToday", "useCallback", "style", "width", "IconButton", "variant", "icon", "iconOnly", "label", "onClick", "format", "getFullYear", "CalendarGrid", "rows", "onSelect", "ref", "containerRef", "height", "useResizeDetector", "maxHeight", "undefined", "listRef", "useRef", "initialized", "setInitialized", "useEffect", "differenceInWeeks", "current", "scrollToRow", "on", "days", "weekStart", "startOfWeek", "Array", "from", "length", "_", "i", "day", "addDays", "getNumAppointments", "_date", "handleDaySelect", "isSameDay", "handleScroll", "info", "Math", "round", "scrollTop", "rowRenderer", "key", "getBgColor", "getMonth", "gridTemplateColumns", "map", "num", "border", "span", "Icon", "List", "rowCount", "rowHeight", "scrollToAlignment", "onScroll", "onRowsRendered", "Calendar", "Root", "Viewport", "Toolbar", "Grid"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/translations.ts":{"bytes":1182,"imports":[],"format":"esm"},"src/components/Calendar/util.ts":{"bytes":2802,"imports":[],"format":"esm"},"src/components/Calendar/Calendar.tsx":{"bytes":
|
|
1
|
+
{"inputs":{"src/translations.ts":{"bytes":1182,"imports":[],"format":"esm"},"src/components/Calendar/util.ts":{"bytes":2802,"imports":[],"format":"esm"},"src/components/Calendar/Calendar.tsx":{"bytes":32136,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"date-fns","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react-resize-detector","kind":"import-statement","external":true},{"path":"react-virtualized","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"src/translations.ts","kind":"import-statement","original":"../../translations"},{"path":"src/components/Calendar/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"src/components/Calendar/index.ts":{"bytes":476,"imports":[{"path":"src/components/Calendar/Calendar.tsx","kind":"import-statement","original":"./Calendar"}],"format":"esm"},"src/components/index.ts":{"bytes":467,"imports":[{"path":"src/components/Calendar/index.ts","kind":"import-statement","original":"./Calendar"}],"format":"esm"},"src/index.ts":{"bytes":462,"imports":[{"path":"src/components/index.ts","kind":"import-statement","original":"./components"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":18581},"dist/lib/browser/index.mjs":{"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"date-fns","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react-resize-detector","kind":"import-statement","external":true},{"path":"react-virtualized","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"exports":["Calendar"],"entryPoint":"src/index.ts","inputs":{"src/components/Calendar/Calendar.tsx":{"bytesInOutput":8682},"src/translations.ts":{"bytesInOutput":161},"src/components/Calendar/util.ts":{"bytesInOutput":517},"src/components/Calendar/index.ts":{"bytesInOutput":0},"src/components/index.ts":{"bytesInOutput":0},"src/index.ts":{"bytesInOutput":0}},"bytes":9559}}}
|
|
@@ -8,7 +8,7 @@ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo
|
|
|
8
8
|
import { useResizeDetector } from "react-resize-detector";
|
|
9
9
|
import { List } from "react-virtualized";
|
|
10
10
|
import { Event } from "@dxos/async";
|
|
11
|
-
import { IconButton, useTranslation } from "@dxos/react-ui";
|
|
11
|
+
import { Icon, IconButton, useTranslation } from "@dxos/react-ui";
|
|
12
12
|
import { mx } from "@dxos/react-ui-theme";
|
|
13
13
|
|
|
14
14
|
// src/translations.ts
|
|
@@ -81,11 +81,11 @@ var CalendarViewport = ({ children, classNames }) => {
|
|
|
81
81
|
}
|
|
82
82
|
};
|
|
83
83
|
CalendarViewport.displayName = "CalendarContent";
|
|
84
|
-
var
|
|
84
|
+
var CalendarToolbar = ({ classNames }) => {
|
|
85
85
|
var _effect = _useSignals();
|
|
86
86
|
try {
|
|
87
87
|
const { t } = useTranslation(translationKey);
|
|
88
|
-
const { weekStartsOn, event, index, selected } = useCalendarContext(
|
|
88
|
+
const { weekStartsOn, event, index, selected } = useCalendarContext(CalendarToolbar.displayName);
|
|
89
89
|
const top = useMemo(() => getDate(start, index ?? 0, 6, weekStartsOn), [
|
|
90
90
|
index,
|
|
91
91
|
weekStartsOn
|
|
@@ -103,7 +103,7 @@ var CalendarHeader = ({ classNames }) => {
|
|
|
103
103
|
]);
|
|
104
104
|
return /* @__PURE__ */ React.createElement("div", {
|
|
105
105
|
role: "none",
|
|
106
|
-
className: mx("shink-0 is-full grid grid-cols-3", classNames),
|
|
106
|
+
className: mx("shink-0 is-full grid grid-cols-3 items-center bg-barSurface", classNames),
|
|
107
107
|
style: {
|
|
108
108
|
width: defaultWidth
|
|
109
109
|
}
|
|
@@ -111,22 +111,22 @@ var CalendarHeader = ({ classNames }) => {
|
|
|
111
111
|
className: "flex justify-start"
|
|
112
112
|
}, /* @__PURE__ */ React.createElement(IconButton, {
|
|
113
113
|
variant: "ghost",
|
|
114
|
-
size:
|
|
114
|
+
size: 5,
|
|
115
115
|
icon: "ph--calendar--regular",
|
|
116
116
|
iconOnly: true,
|
|
117
117
|
classNames: "aspect-square",
|
|
118
118
|
label: t("today button"),
|
|
119
119
|
onClick: handleToday
|
|
120
|
-
})), /* @__PURE__ */ React.createElement("
|
|
121
|
-
className: "flex justify-center p-2"
|
|
122
|
-
}, format(selected ?? top, "MMMM")), /* @__PURE__ */ React.createElement("
|
|
123
|
-
className: "flex justify-end p-2"
|
|
120
|
+
})), /* @__PURE__ */ React.createElement("div", {
|
|
121
|
+
className: "flex justify-center p-2 text-description"
|
|
122
|
+
}, format(selected ?? top, "MMMM")), /* @__PURE__ */ React.createElement("div", {
|
|
123
|
+
className: "flex justify-end p-2 text-description"
|
|
124
124
|
}, (selected ?? top).getFullYear()));
|
|
125
125
|
} finally {
|
|
126
126
|
_effect.f();
|
|
127
127
|
}
|
|
128
128
|
};
|
|
129
|
-
|
|
129
|
+
CalendarToolbar.displayName = "CalendarHeader";
|
|
130
130
|
var CalendarGrid = ({ classNames, rows, onSelect }) => {
|
|
131
131
|
var _effect = _useSignals();
|
|
132
132
|
try {
|
|
@@ -168,6 +168,9 @@ var CalendarGrid = ({ classNames, rows, onSelect }) => {
|
|
|
168
168
|
return format(day, "EEE");
|
|
169
169
|
});
|
|
170
170
|
}, []);
|
|
171
|
+
const getNumAppointments = useCallback((_date) => {
|
|
172
|
+
return 0;
|
|
173
|
+
}, []);
|
|
171
174
|
const handleDaySelect = useCallback((date) => {
|
|
172
175
|
setSelected((current) => isSameDay(date, current) ? void 0 : date);
|
|
173
176
|
onSelect?.({
|
|
@@ -183,11 +186,14 @@ var CalendarGrid = ({ classNames, rows, onSelect }) => {
|
|
|
183
186
|
const getBgColor = (date) => date.getMonth() % 2 === 0 && "bg-modalSurface";
|
|
184
187
|
return /* @__PURE__ */ React.createElement("div", {
|
|
185
188
|
key,
|
|
189
|
+
role: "none",
|
|
186
190
|
style,
|
|
187
191
|
className: "is-full grid grid-cols-[1fr_max-content_1fr] snap-center"
|
|
188
192
|
}, /* @__PURE__ */ React.createElement("div", {
|
|
193
|
+
role: "none",
|
|
189
194
|
className: mx(getBgColor(getDate(start, index, 0, weekStartsOn)))
|
|
190
195
|
}), /* @__PURE__ */ React.createElement("div", {
|
|
196
|
+
role: "none",
|
|
191
197
|
className: "grid grid-cols-7",
|
|
192
198
|
style: {
|
|
193
199
|
gridTemplateColumns: `repeat(7, ${size}px)`
|
|
@@ -196,9 +202,11 @@ var CalendarGrid = ({ classNames, rows, onSelect }) => {
|
|
|
196
202
|
length: 7
|
|
197
203
|
}).map((_, i) => {
|
|
198
204
|
const date = getDate(start, index, i, weekStartsOn);
|
|
205
|
+
const num = getNumAppointments(date);
|
|
199
206
|
const border = isSameDay(date, selected) ? "border-primary-500" : isSameDay(date, today) ? "border-amber-500" : void 0;
|
|
200
207
|
return /* @__PURE__ */ React.createElement("div", {
|
|
201
208
|
key: i,
|
|
209
|
+
role: "none",
|
|
202
210
|
className: mx("relative flex justify-center items-center cursor-pointer", getBgColor(date)),
|
|
203
211
|
onClick: () => handleDaySelect(date)
|
|
204
212
|
}, /* @__PURE__ */ React.createElement("span", {
|
|
@@ -206,13 +214,19 @@ var CalendarGrid = ({ classNames, rows, onSelect }) => {
|
|
|
206
214
|
}, date.getDate()), !border && date.getDate() === 1 && /* @__PURE__ */ React.createElement("span", {
|
|
207
215
|
className: "absolute top-0 text-xs text-description"
|
|
208
216
|
}, format(date, "MMM")), border && /* @__PURE__ */ React.createElement("div", {
|
|
217
|
+
role: "none",
|
|
209
218
|
className: mx("absolute top-0 left-0 is-full bs-full border-2 rounded-full", border)
|
|
219
|
+
}), num > 0 && /* @__PURE__ */ React.createElement(Icon, {
|
|
220
|
+
classNames: "absolute bottom-0",
|
|
221
|
+
icon: num > 3 ? "ph--dots-three--regular" : "ph--dot--regular",
|
|
222
|
+
size: 5
|
|
210
223
|
}));
|
|
211
224
|
})), /* @__PURE__ */ React.createElement("div", {
|
|
212
225
|
className: mx(getBgColor(getDate(start, index, 6, weekStartsOn)))
|
|
213
226
|
}));
|
|
214
227
|
}, [
|
|
215
228
|
handleDaySelect,
|
|
229
|
+
getNumAppointments,
|
|
216
230
|
selected,
|
|
217
231
|
weekStartsOn
|
|
218
232
|
]);
|
|
@@ -258,7 +272,7 @@ CalendarGrid.displayName = "CalendarGrid";
|
|
|
258
272
|
var Calendar = {
|
|
259
273
|
Root: CalendarRoot,
|
|
260
274
|
Viewport: CalendarViewport,
|
|
261
|
-
|
|
275
|
+
Toolbar: CalendarToolbar,
|
|
262
276
|
Grid: CalendarGrid
|
|
263
277
|
};
|
|
264
278
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/Calendar/Calendar.tsx", "../../../src/translations.ts", "../../../src/components/Calendar/util.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport { type Day, addDays, differenceInWeeks, format, startOfWeek } from 'date-fns';\nimport React, {\n type Dispatch,\n type PropsWithChildren,\n type SetStateAction,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\nimport { List, type ListProps, type ListRowRenderer } from 'react-virtualized';\n\nimport { Event } from '@dxos/async';\nimport { IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { translationKey } from '../../translations';\n\nimport { getDate, isSameDay } from './util';\n\nconst maxRows = 50 * 100;\nconst start = new Date('1970-01-01');\nconst size = 48;\nconst defaultWidth = 7 * size;\n\n//\n// Context\n//\n\ntype CalendarEvent = {\n type: 'scroll';\n date: Date;\n};\n\ntype CalendarContextValue = {\n weekStartsOn: Day;\n event: Event<CalendarEvent>;\n index: number | undefined;\n setIndex: Dispatch<SetStateAction<number | undefined>>;\n selected: Date | undefined;\n setSelected: Dispatch<SetStateAction<Date | undefined>>;\n};\n\nconst [CalendarContextProvider, useCalendarContext] = createContext<CalendarContextValue>('Calendar');\n\n//\n// Controller\n//\n\ntype CalendarController = {\n scrollTo: (date: Date) => void;\n};\n\n//\n// Root\n//\n\ntype CalendarRootProps = PropsWithChildren<Partial<Pick<CalendarContextValue, 'weekStartsOn'>>>;\n\nconst CalendarRoot = forwardRef<CalendarController, CalendarRootProps>(\n ({ children, weekStartsOn = 1 }, forwardedRef) => {\n const event = useMemo(() => new Event<CalendarEvent>(), []);\n const [selected, setSelected] = useState<Date | undefined>();\n const [index, setIndex] = useState<number | undefined>();\n\n useImperativeHandle(\n forwardedRef,\n () => ({\n scrollTo: (date: Date) => {\n event.emit({ type: 'scroll', date });\n },\n }),\n [event],\n );\n\n return (\n <CalendarContextProvider\n weekStartsOn={weekStartsOn}\n event={event}\n index={index}\n setIndex={setIndex}\n selected={selected}\n setSelected={setSelected}\n >\n {children}\n </CalendarContextProvider>\n );\n },\n);\n\n//\n// Viewport\n//\n\ntype CalendarViewportProps = PropsWithChildren<ThemedClassName>;\n\nconst CalendarViewport = ({ children, classNames }: CalendarViewportProps) => {\n return (\n <div role='none' className={mx('flex flex-col items-center overflow-hidden bg-inputSurface', classNames)}>\n {children}\n </div>\n );\n};\n\nCalendarViewport.displayName = 'CalendarContent';\n\n//\n// Header\n//\n\ntype CalendarHeaderProps = ThemedClassName;\n\nconst CalendarHeader = ({ classNames }: CalendarHeaderProps) => {\n const { t } = useTranslation(translationKey);\n const { weekStartsOn, event, index, selected } = useCalendarContext(CalendarHeader.displayName);\n const top = useMemo(() => getDate(start, index ?? 0, 6, weekStartsOn), [index, weekStartsOn]);\n const today = useMemo(() => new Date(), []);\n\n const handleToday = useCallback(() => {\n event.emit({ type: 'scroll', date: today });\n }, [event, start, today]);\n\n return (\n <div role='none' className={mx('shink-0 is-full grid grid-cols-3', classNames)} style={{ width: defaultWidth }}>\n <div className='flex justify-start'>\n <IconButton\n variant='ghost'\n size={6}\n icon='ph--calendar--regular'\n iconOnly\n classNames='aspect-square'\n label={t('today button')}\n onClick={handleToday}\n />\n </div>\n <span className='flex justify-center p-2'>{format(selected ?? top, 'MMMM')}</span>\n <span className='flex justify-end p-2'>{(selected ?? top).getFullYear()}</span>\n </div>\n );\n};\n\nCalendarHeader.displayName = 'CalendarHeader';\n\n//\n// Grid\n// TODO(burdon): Key nav.\n// TODO(burdon): Drag range.\n//\n\ntype CalendarGridProps = ThemedClassName<{\n rows?: number;\n onSelect?: (event: { date: Date }) => void;\n}>;\n\nconst CalendarGrid = ({ classNames, rows, onSelect }: CalendarGridProps) => {\n const { weekStartsOn, event, setIndex, selected, setSelected } = useCalendarContext(CalendarGrid.displayName);\n const { ref: containerRef, width = 0, height = 0 } = useResizeDetector();\n const maxHeight = rows ? rows * size : undefined;\n const listRef = useRef<List>(null);\n const today = useMemo(() => new Date(), []);\n\n const [initialized, setInitialized] = useState(false);\n useEffect(() => {\n const index = differenceInWeeks(today, start);\n listRef.current?.scrollToRow(index);\n }, [initialized, start, today]);\n\n useEffect(() => {\n return event.on((event) => {\n switch (event.type) {\n case 'scroll': {\n const index = differenceInWeeks(event.date, start);\n listRef.current?.scrollToRow(index);\n break;\n }\n }\n });\n }, [event]);\n\n const days = useMemo(() => {\n const weekStart = startOfWeek(new Date(), { weekStartsOn });\n return Array.from({ length: 7 }, (_, i) => {\n const day = addDays(weekStart, i);\n return format(day, 'EEE'); // Short day name (Mon, Tue, etc.)\n });\n }, []);\n\n const handleDaySelect = useCallback(\n (date: Date) => {\n setSelected((current) => (isSameDay(date, current) ? undefined : date));\n onSelect?.({ date });\n },\n [onSelect],\n );\n\n const handleScroll = useCallback<NonNullable<ListProps['onScroll']>>((info) => {\n setIndex(Math.round(info.scrollTop / size));\n }, []);\n\n const rowRenderer = useCallback<ListRowRenderer>(\n ({ key, index, style }) => {\n const getBgColor = (date: Date) => date.getMonth() % 2 === 0 && 'bg-modalSurface';\n return (\n <div key={key} style={style} className='is-full grid grid-cols-[1fr_max-content_1fr] snap-center'>\n <div className={mx(getBgColor(getDate(start, index, 0, weekStartsOn)))} />\n <div className='grid grid-cols-7' style={{ gridTemplateColumns: `repeat(7, ${size}px)` }}>\n {Array.from({ length: 7 }).map((_, i) => {\n const date = getDate(start, index, i, weekStartsOn);\n const border = isSameDay(date, selected)\n ? 'border-primary-500'\n : isSameDay(date, today)\n ? 'border-amber-500'\n : undefined;\n\n return (\n <div\n key={i}\n className={mx('relative flex justify-center items-center cursor-pointer', getBgColor(date))}\n onClick={() => handleDaySelect(date)}\n >\n <span className='text-description'>{date.getDate()}</span>\n {!border && date.getDate() === 1 && (\n <span className='absolute top-0 text-xs text-description'>{format(date, 'MMM')}</span>\n )}\n {border && (\n <div className={mx('absolute top-0 left-0 is-full bs-full border-2 rounded-full', border)} />\n )}\n </div>\n );\n })}\n </div>\n <div className={mx(getBgColor(getDate(start, index, 6, weekStartsOn)))} />\n </div>\n );\n },\n [handleDaySelect, selected, weekStartsOn],\n );\n\n return (\n <div role='none' className={mx('flex flex-col bs-full is-full justify-center overflow-hidden', classNames)}>\n {/* Day labels */}\n <div role='none' className='flex justify-center bg-groupSurface'>\n <div role='none' className='flex is-full grid grid-cols-7' style={{ width: defaultWidth }}>\n {days.map((date, i) => (\n <div key={i} role='none' className='flex justify-center p-2 text-sm font-thin'>\n {date}\n </div>\n ))}\n </div>\n </div>\n {/* Grid */}\n <div role='none' className='flex flex-col bs-full is-full justify-center overflow-hidden' ref={containerRef}>\n <List\n ref={listRef}\n role='none'\n // TODO(burdon): Snap isn't working.\n className='[&>div]:snap-y scrollbar-none outline-none'\n width={width}\n height={maxHeight ?? height}\n rowCount={maxRows}\n rowHeight={size}\n rowRenderer={rowRenderer}\n scrollToAlignment='start'\n onScroll={handleScroll}\n onRowsRendered={() => setInitialized(true)}\n />\n </div>\n </div>\n );\n};\n\nCalendarGrid.displayName = 'CalendarGrid';\n\n//\n// Calendar\n//\n\nexport const Calendar = {\n Root: CalendarRoot,\n Viewport: CalendarViewport,\n Header: CalendarHeader,\n Grid: CalendarGrid,\n};\n\nexport type { CalendarController, CalendarRootProps, CalendarViewportProps, CalendarHeaderProps, CalendarGridProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = 'react-ui-calendar';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {\n 'today button': 'Today',\n },\n },\n },\n] as const satisfies Resource[];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Day } from 'date-fns';\n\nexport const getDate = (start: Date, weekNumber: number, dayOfWeek: number, weekStartsOn: Day): Date => {\n const result = new Date(start);\n const startDayOfWeek = start.getDay(); // 0 = Sunday, 1 = Monday, etc.\n const adjustedStartDay = (startDayOfWeek === 0 ? 7 : startDayOfWeek) - weekStartsOn; // Adjust for weekStartsOn.\n result.setDate(start.getDate() - adjustedStartDay + weekNumber * 7 + dayOfWeek);\n return result;\n};\n\nexport const isSameDay = (date1: Date, date2: Date | undefined): boolean => {\n return (\n !!date2 &&\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n"],
|
|
5
|
-
"mappings": ";;;;AAIA,SAASA,qBAAqB;AAC9B,SAAmBC,SAASC,mBAAmBC,QAAQC,mBAAmB;AAC1E,OAAOC,SAILC,YACAC,aACAC,WACAC,qBACAC,SACAC,QACAC,gBACK;AACP,SAASC,yBAAyB;AAClC,SAASC,YAAkD;AAE3D,SAASC,aAAa;AACtB,SAASC,YAAkCC,sBAAsB;
|
|
6
|
-
"names": ["createContext", "addDays", "differenceInWeeks", "format", "startOfWeek", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useMemo", "useRef", "useState", "useResizeDetector", "List", "Event", "IconButton", "useTranslation", "mx", "translationKey", "translations", "getDate", "start", "weekNumber", "dayOfWeek", "weekStartsOn", "result", "Date", "startDayOfWeek", "getDay", "adjustedStartDay", "setDate", "isSameDay", "date1", "date2", "getFullYear", "getMonth", "maxRows", "start", "Date", "size", "defaultWidth", "CalendarContextProvider", "useCalendarContext", "createContext", "CalendarRoot", "forwardRef", "children", "weekStartsOn", "forwardedRef", "event", "useMemo", "Event", "selected", "setSelected", "useState", "index", "setIndex", "useImperativeHandle", "scrollTo", "date", "emit", "type", "CalendarViewport", "classNames", "div", "role", "className", "mx", "displayName", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport { type Day, addDays, differenceInWeeks, format, startOfWeek } from 'date-fns';\nimport React, {\n type Dispatch,\n type PropsWithChildren,\n type SetStateAction,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\nimport { List, type ListProps, type ListRowRenderer } from 'react-virtualized';\n\nimport { Event } from '@dxos/async';\nimport { Icon, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { translationKey } from '../../translations';\n\nimport { getDate, isSameDay } from './util';\n\nconst maxRows = 50 * 100;\nconst start = new Date('1970-01-01');\nconst size = 48;\nconst defaultWidth = 7 * size;\n\n//\n// Context\n//\n\ntype CalendarEvent = {\n type: 'scroll';\n date: Date;\n};\n\ntype CalendarContextValue = {\n weekStartsOn: Day;\n event: Event<CalendarEvent>;\n index: number | undefined;\n setIndex: Dispatch<SetStateAction<number | undefined>>;\n selected: Date | undefined;\n setSelected: Dispatch<SetStateAction<Date | undefined>>;\n};\n\nconst [CalendarContextProvider, useCalendarContext] = createContext<CalendarContextValue>('Calendar');\n\n//\n// Controller\n//\n\ntype CalendarController = {\n scrollTo: (date: Date) => void;\n};\n\n//\n// Root\n//\n\ntype CalendarRootProps = PropsWithChildren<Partial<Pick<CalendarContextValue, 'weekStartsOn'>>>;\n\nconst CalendarRoot = forwardRef<CalendarController, CalendarRootProps>(\n ({ children, weekStartsOn = 1 }, forwardedRef) => {\n const event = useMemo(() => new Event<CalendarEvent>(), []);\n const [selected, setSelected] = useState<Date | undefined>();\n const [index, setIndex] = useState<number | undefined>();\n\n useImperativeHandle(\n forwardedRef,\n () => ({\n scrollTo: (date: Date) => {\n event.emit({ type: 'scroll', date });\n },\n }),\n [event],\n );\n\n return (\n <CalendarContextProvider\n weekStartsOn={weekStartsOn}\n event={event}\n index={index}\n setIndex={setIndex}\n selected={selected}\n setSelected={setSelected}\n >\n {children}\n </CalendarContextProvider>\n );\n },\n);\n\n//\n// Viewport\n//\n\ntype CalendarViewportProps = PropsWithChildren<ThemedClassName>;\n\nconst CalendarViewport = ({ children, classNames }: CalendarViewportProps) => {\n return (\n <div role='none' className={mx('flex flex-col items-center overflow-hidden bg-inputSurface', classNames)}>\n {children}\n </div>\n );\n};\n\nCalendarViewport.displayName = 'CalendarContent';\n\n//\n// Header\n//\n\ntype CalendarToolbarProps = ThemedClassName;\n\nconst CalendarToolbar = ({ classNames }: CalendarToolbarProps) => {\n const { t } = useTranslation(translationKey);\n const { weekStartsOn, event, index, selected } = useCalendarContext(CalendarToolbar.displayName);\n const top = useMemo(() => getDate(start, index ?? 0, 6, weekStartsOn), [index, weekStartsOn]);\n const today = useMemo(() => new Date(), []);\n\n const handleToday = useCallback(() => {\n event.emit({ type: 'scroll', date: today });\n }, [event, start, today]);\n\n return (\n <div\n role='none'\n className={mx('shink-0 is-full grid grid-cols-3 items-center bg-barSurface', classNames)}\n style={{ width: defaultWidth }}\n >\n <div className='flex justify-start'>\n <IconButton\n variant='ghost'\n size={5}\n icon='ph--calendar--regular'\n iconOnly\n classNames='aspect-square'\n label={t('today button')}\n onClick={handleToday}\n />\n </div>\n <div className='flex justify-center p-2 text-description'>{format(selected ?? top, 'MMMM')}</div>\n <div className='flex justify-end p-2 text-description'>{(selected ?? top).getFullYear()}</div>\n </div>\n );\n};\n\nCalendarToolbar.displayName = 'CalendarHeader';\n\n//\n// Grid\n// TODO(burdon): Key nav.\n// TODO(burdon): Drag range.\n//\n\ntype CalendarGridProps = ThemedClassName<{\n rows?: number;\n onSelect?: (event: { date: Date }) => void;\n}>;\n\nconst CalendarGrid = ({ classNames, rows, onSelect }: CalendarGridProps) => {\n const { weekStartsOn, event, setIndex, selected, setSelected } = useCalendarContext(CalendarGrid.displayName);\n const { ref: containerRef, width = 0, height = 0 } = useResizeDetector();\n const maxHeight = rows ? rows * size : undefined;\n const listRef = useRef<List>(null);\n const today = useMemo(() => new Date(), []);\n\n const [initialized, setInitialized] = useState(false);\n useEffect(() => {\n const index = differenceInWeeks(today, start);\n listRef.current?.scrollToRow(index);\n }, [initialized, start, today]);\n\n useEffect(() => {\n return event.on((event) => {\n switch (event.type) {\n case 'scroll': {\n const index = differenceInWeeks(event.date, start);\n listRef.current?.scrollToRow(index);\n break;\n }\n }\n });\n }, [event]);\n\n const days = useMemo(() => {\n const weekStart = startOfWeek(new Date(), { weekStartsOn });\n return Array.from({ length: 7 }, (_, i) => {\n const day = addDays(weekStart, i);\n return format(day, 'EEE'); // Short day name (Mon, Tue, etc.)\n });\n }, []);\n\n // TODO(burdon): Get info by range.\n // TODO(burdon): Border marker for \"all day events?\"\n const getNumAppointments = useCallback((_date: Date) => {\n // return Math.floor(Math.random() * 10);\n return 0;\n }, []);\n\n const handleDaySelect = useCallback(\n (date: Date) => {\n setSelected((current) => (isSameDay(date, current) ? undefined : date));\n onSelect?.({ date });\n },\n [onSelect],\n );\n\n const handleScroll = useCallback<NonNullable<ListProps['onScroll']>>((info) => {\n setIndex(Math.round(info.scrollTop / size));\n }, []);\n\n const rowRenderer = useCallback<ListRowRenderer>(\n ({ key, index, style }) => {\n const getBgColor = (date: Date) => date.getMonth() % 2 === 0 && 'bg-modalSurface';\n return (\n <div key={key} role='none' style={style} className='is-full grid grid-cols-[1fr_max-content_1fr] snap-center'>\n <div role='none' className={mx(getBgColor(getDate(start, index, 0, weekStartsOn)))} />\n <div role='none' className='grid grid-cols-7' style={{ gridTemplateColumns: `repeat(7, ${size}px)` }}>\n {Array.from({ length: 7 }).map((_, i) => {\n const date = getDate(start, index, i, weekStartsOn);\n const num = getNumAppointments(date);\n const border = isSameDay(date, selected)\n ? 'border-primary-500'\n : isSameDay(date, today)\n ? 'border-amber-500'\n : undefined;\n\n return (\n <div\n key={i}\n role='none'\n className={mx('relative flex justify-center items-center cursor-pointer', getBgColor(date))}\n onClick={() => handleDaySelect(date)}\n >\n <span className='text-description'>{date.getDate()}</span>\n {!border && date.getDate() === 1 && (\n <span className='absolute top-0 text-xs text-description'>{format(date, 'MMM')}</span>\n )}\n {border && (\n <div\n role='none'\n className={mx('absolute top-0 left-0 is-full bs-full border-2 rounded-full', border)}\n />\n )}\n {num > 0 && (\n <Icon\n classNames='absolute bottom-0'\n icon={num > 3 ? 'ph--dots-three--regular' : 'ph--dot--regular'}\n size={5}\n />\n )}\n </div>\n );\n })}\n </div>\n <div className={mx(getBgColor(getDate(start, index, 6, weekStartsOn)))} />\n </div>\n );\n },\n [handleDaySelect, getNumAppointments, selected, weekStartsOn],\n );\n\n return (\n <div role='none' className={mx('flex flex-col bs-full is-full justify-center overflow-hidden', classNames)}>\n {/* Day labels */}\n <div role='none' className='flex justify-center bg-groupSurface'>\n <div role='none' className='flex is-full grid grid-cols-7' style={{ width: defaultWidth }}>\n {days.map((date, i) => (\n <div key={i} role='none' className='flex justify-center p-2 text-sm font-thin'>\n {date}\n </div>\n ))}\n </div>\n </div>\n\n {/* Grid */}\n <div role='none' className='flex flex-col bs-full is-full justify-center overflow-hidden' ref={containerRef}>\n <List\n ref={listRef}\n role='none'\n // TODO(burdon): Snap isn't working.\n className='[&>div]:snap-y scrollbar-none outline-none'\n width={width}\n height={maxHeight ?? height}\n rowCount={maxRows}\n rowHeight={size}\n rowRenderer={rowRenderer}\n scrollToAlignment='start'\n onScroll={handleScroll}\n onRowsRendered={() => setInitialized(true)}\n />\n </div>\n </div>\n );\n};\n\nCalendarGrid.displayName = 'CalendarGrid';\n\n//\n// Calendar\n//\n\nexport const Calendar = {\n Root: CalendarRoot,\n Viewport: CalendarViewport,\n Toolbar: CalendarToolbar,\n Grid: CalendarGrid,\n};\n\nexport type { CalendarController, CalendarRootProps, CalendarViewportProps, CalendarToolbarProps, CalendarGridProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Resource } from '@dxos/react-ui';\n\nexport const translationKey = 'react-ui-calendar';\n\nexport const translations = [\n {\n 'en-US': {\n [translationKey]: {\n 'today button': 'Today',\n },\n },\n },\n] as const satisfies Resource[];\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Day } from 'date-fns';\n\nexport const getDate = (start: Date, weekNumber: number, dayOfWeek: number, weekStartsOn: Day): Date => {\n const result = new Date(start);\n const startDayOfWeek = start.getDay(); // 0 = Sunday, 1 = Monday, etc.\n const adjustedStartDay = (startDayOfWeek === 0 ? 7 : startDayOfWeek) - weekStartsOn; // Adjust for weekStartsOn.\n result.setDate(start.getDate() - adjustedStartDay + weekNumber * 7 + dayOfWeek);\n return result;\n};\n\nexport const isSameDay = (date1: Date, date2: Date | undefined): boolean => {\n return (\n !!date2 &&\n date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate()\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["createContext", "addDays", "differenceInWeeks", "format", "startOfWeek", "React", "forwardRef", "useCallback", "useEffect", "useImperativeHandle", "useMemo", "useRef", "useState", "useResizeDetector", "List", "Event", "Icon", "IconButton", "useTranslation", "mx", "translationKey", "translations", "getDate", "start", "weekNumber", "dayOfWeek", "weekStartsOn", "result", "Date", "startDayOfWeek", "getDay", "adjustedStartDay", "setDate", "isSameDay", "date1", "date2", "getFullYear", "getMonth", "maxRows", "start", "Date", "size", "defaultWidth", "CalendarContextProvider", "useCalendarContext", "createContext", "CalendarRoot", "forwardRef", "children", "weekStartsOn", "forwardedRef", "event", "useMemo", "Event", "selected", "setSelected", "useState", "index", "setIndex", "useImperativeHandle", "scrollTo", "date", "emit", "type", "CalendarViewport", "classNames", "div", "role", "className", "mx", "displayName", "CalendarToolbar", "t", "useTranslation", "translationKey", "top", "getDate", "today", "handleToday", "useCallback", "style", "width", "IconButton", "variant", "icon", "iconOnly", "label", "onClick", "format", "getFullYear", "CalendarGrid", "rows", "onSelect", "ref", "containerRef", "height", "useResizeDetector", "maxHeight", "undefined", "listRef", "useRef", "initialized", "setInitialized", "useEffect", "differenceInWeeks", "current", "scrollToRow", "on", "days", "weekStart", "startOfWeek", "Array", "from", "length", "_", "i", "day", "addDays", "getNumAppointments", "_date", "handleDaySelect", "isSameDay", "handleScroll", "info", "Math", "round", "scrollTop", "rowRenderer", "key", "getBgColor", "getMonth", "gridTemplateColumns", "map", "num", "border", "span", "Icon", "List", "rowCount", "rowHeight", "scrollToAlignment", "onScroll", "onRowsRendered", "Calendar", "Root", "Viewport", "Toolbar", "Grid"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/translations.ts":{"bytes":1182,"imports":[],"format":"esm"},"src/components/Calendar/util.ts":{"bytes":2802,"imports":[],"format":"esm"},"src/components/Calendar/Calendar.tsx":{"bytes":
|
|
1
|
+
{"inputs":{"src/translations.ts":{"bytes":1182,"imports":[],"format":"esm"},"src/components/Calendar/util.ts":{"bytes":2802,"imports":[],"format":"esm"},"src/components/Calendar/Calendar.tsx":{"bytes":32136,"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"date-fns","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react-resize-detector","kind":"import-statement","external":true},{"path":"react-virtualized","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"src/translations.ts","kind":"import-statement","original":"../../translations"},{"path":"src/components/Calendar/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"src/components/Calendar/index.ts":{"bytes":476,"imports":[{"path":"src/components/Calendar/Calendar.tsx","kind":"import-statement","original":"./Calendar"}],"format":"esm"},"src/components/index.ts":{"bytes":467,"imports":[{"path":"src/components/Calendar/index.ts","kind":"import-statement","original":"./Calendar"}],"format":"esm"},"src/index.ts":{"bytes":462,"imports":[{"path":"src/components/index.ts","kind":"import-statement","original":"./components"}],"format":"esm"}},"outputs":{"dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":18583},"dist/lib/node-esm/index.mjs":{"imports":[{"path":"@preact-signals/safe-react/tracking","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"date-fns","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react-resize-detector","kind":"import-statement","external":true},{"path":"react-virtualized","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"exports":["Calendar"],"entryPoint":"src/index.ts","inputs":{"src/components/Calendar/Calendar.tsx":{"bytesInOutput":8682},"src/translations.ts":{"bytesInOutput":161},"src/components/Calendar/util.ts":{"bytesInOutput":517},"src/components/Calendar/index.ts":{"bytesInOutput":0},"src/components/index.ts":{"bytesInOutput":0},"src/index.ts":{"bytesInOutput":0}},"bytes":9652}}}
|
|
@@ -19,7 +19,7 @@ type CalendarController = {
|
|
|
19
19
|
};
|
|
20
20
|
type CalendarRootProps = PropsWithChildren<Partial<Pick<CalendarContextValue, 'weekStartsOn'>>>;
|
|
21
21
|
type CalendarViewportProps = PropsWithChildren<ThemedClassName>;
|
|
22
|
-
type
|
|
22
|
+
type CalendarToolbarProps = ThemedClassName;
|
|
23
23
|
type CalendarGridProps = ThemedClassName<{
|
|
24
24
|
rows?: number;
|
|
25
25
|
onSelect?: (event: {
|
|
@@ -34,8 +34,8 @@ export declare const Calendar: {
|
|
|
34
34
|
({ children, classNames }: CalendarViewportProps): React.JSX.Element;
|
|
35
35
|
displayName: string;
|
|
36
36
|
};
|
|
37
|
-
|
|
38
|
-
({ classNames }:
|
|
37
|
+
Toolbar: {
|
|
38
|
+
({ classNames }: CalendarToolbarProps): React.JSX.Element;
|
|
39
39
|
displayName: string;
|
|
40
40
|
};
|
|
41
41
|
Grid: {
|
|
@@ -43,5 +43,5 @@ export declare const Calendar: {
|
|
|
43
43
|
displayName: string;
|
|
44
44
|
};
|
|
45
45
|
};
|
|
46
|
-
export type { CalendarController, CalendarRootProps, CalendarViewportProps,
|
|
46
|
+
export type { CalendarController, CalendarRootProps, CalendarViewportProps, CalendarToolbarProps, CalendarGridProps };
|
|
47
47
|
//# sourceMappingURL=Calendar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../../../src/components/Calendar/Calendar.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,GAAG,EAAmD,MAAM,UAAU,CAAC;AACrF,OAAO,KAAK,EAAE,EACZ,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAQpB,MAAM,OAAO,CAAC;AAIf,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../../../src/components/Calendar/Calendar.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,GAAG,EAAmD,MAAM,UAAU,CAAC;AACrF,OAAO,KAAK,EAAE,EACZ,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAQpB,MAAM,OAAO,CAAC;AAIf,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAoB,KAAK,eAAe,EAAkB,MAAM,gBAAgB,CAAC;AAgBxF,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,YAAY,EAAE,GAAG,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACvD,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;IAC3B,WAAW,EAAE,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;CACzD,CAAC;AAQF,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CAChC,CAAC;AAMF,KAAK,iBAAiB,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;AAqChG,KAAK,qBAAqB,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;AAgBhE,KAAK,oBAAoB,GAAG,eAAe,CAAC;AA2C5C,KAAK,iBAAiB,GAAG,eAAe,CAAC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;CAC5C,CAAC,CAAC;AAiJH,eAAO,MAAM,QAAQ;;;;;mCA7M+B,qBAAqB;;;;yBAgBhC,oBAAoB;;;;yCA8CP,iBAAiB;;;CAoJtE,CAAC;AAEF,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,CAAC"}
|