@k2b/ui 0.20.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/actions/Button.js +20 -31
- package/dist/browser/actions/Button.js.map +1 -1
- package/dist/browser/actions/ContextMenu.js +7 -3
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/CopyButton.js +10 -8
- package/dist/browser/actions/CopyButton.js.map +1 -1
- package/dist/browser/actions/GestureMenu.js +4 -0
- package/dist/browser/actions/GestureMenu.js.map +1 -1
- package/dist/browser/content/Calendar.js +1951 -565
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/calendar-messages.js +83 -0
- package/dist/browser/content/calendar-messages.js.map +1 -0
- package/dist/browser/content/calendar-month-layout.js +108 -0
- package/dist/browser/content/calendar-month-layout.js.map +1 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +46 -10
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/date-picker.js +24 -0
- package/dist/browser/inputs/date-picker.js.map +1 -1
- package/dist/browser/intl/messages.js +6 -0
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/ssr/actions/Button.js +21 -32
- package/dist/ssr/actions/Button.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js +7 -3
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/CopyButton.js +9 -7
- package/dist/ssr/actions/CopyButton.js.map +1 -1
- package/dist/ssr/actions/GestureMenu.js +4 -0
- package/dist/ssr/actions/GestureMenu.js.map +1 -1
- package/dist/ssr/content/Calendar.js +1223 -105
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/calendar-messages.js +83 -0
- package/dist/ssr/content/calendar-messages.js.map +1 -0
- package/dist/ssr/content/calendar-month-layout.js +108 -0
- package/dist/ssr/content/calendar-month-layout.js.map +1 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +34 -4
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/date-picker.js +24 -0
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- package/dist/ssr/intl/messages.js +6 -0
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/GestureMenu.d.ts +2 -0
- package/dist/types/content/Calendar.d.ts +32 -0
- package/dist/types/content/calendar-messages.d.ts +41 -0
- package/dist/types/content/calendar-month-layout.d.ts +52 -0
- package/dist/types/content/index.d.ts +1 -1
- package/dist/types/inputs/date-picker.d.ts +7 -0
- package/dist/types/intl/messages.d.ts +3 -0
- package/package.json +1 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
import { useLocale } from "../intl/locale";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The month view's own strings. They live beside the calendar instead of in the shared catalog, so applications that
|
|
6
|
+
* never render a calendar do not ship them.
|
|
7
|
+
*/
|
|
8
|
+
const calendarMessages = i18n.define({
|
|
9
|
+
baseLocale: "en",
|
|
10
|
+
messages: {
|
|
11
|
+
en: {
|
|
12
|
+
calendarMoreEvents: ({
|
|
13
|
+
count
|
|
14
|
+
}) => `+${count} more`,
|
|
15
|
+
calendarMoreEventsOn: ({
|
|
16
|
+
count,
|
|
17
|
+
label
|
|
18
|
+
}) => `${count} more on ${label}`,
|
|
19
|
+
calendarSelectionActions: "Actions for the selected days",
|
|
20
|
+
calendarQuickCreate: "New entry",
|
|
21
|
+
calendarSelectedDays: ({
|
|
22
|
+
start,
|
|
23
|
+
end,
|
|
24
|
+
count
|
|
25
|
+
}) => `${start} – ${end} · ${count} days`,
|
|
26
|
+
calendarOpenDay: "Open day",
|
|
27
|
+
calendarOpenWeek: "Open week",
|
|
28
|
+
calendarOpenWeekNumber: ({
|
|
29
|
+
week
|
|
30
|
+
}) => `Week ${week}, open week`,
|
|
31
|
+
calendarClearSelection: "Clear selection",
|
|
32
|
+
calendarNewEvent: "New event",
|
|
33
|
+
calendarNothingPlanned: "Nothing planned.",
|
|
34
|
+
calendarContinuesFrom: ({
|
|
35
|
+
day,
|
|
36
|
+
month
|
|
37
|
+
}) => `from ${month ? `${month} ` : ""}${day}`,
|
|
38
|
+
calendarContinuesUntil: ({
|
|
39
|
+
day,
|
|
40
|
+
month
|
|
41
|
+
}) => `until ${month ? `${month} ` : ""}${day}`
|
|
42
|
+
},
|
|
43
|
+
de: {
|
|
44
|
+
calendarMoreEvents: ({
|
|
45
|
+
count
|
|
46
|
+
}) => `+${count} weitere`,
|
|
47
|
+
calendarMoreEventsOn: ({
|
|
48
|
+
count,
|
|
49
|
+
label
|
|
50
|
+
}) => `${count} weitere am ${label}`,
|
|
51
|
+
calendarSelectionActions: "Aktionen für die ausgewählten Tage",
|
|
52
|
+
calendarQuickCreate: "Neuer Eintrag",
|
|
53
|
+
calendarSelectedDays: ({
|
|
54
|
+
start,
|
|
55
|
+
end,
|
|
56
|
+
count
|
|
57
|
+
}) => `${start} – ${end} · ${count} Tage`,
|
|
58
|
+
calendarOpenDay: "Tag öffnen",
|
|
59
|
+
calendarOpenWeek: "Woche öffnen",
|
|
60
|
+
calendarOpenWeekNumber: ({
|
|
61
|
+
week
|
|
62
|
+
}) => `KW ${week}, Woche öffnen`,
|
|
63
|
+
calendarClearSelection: "Auswahl aufheben",
|
|
64
|
+
calendarNewEvent: "Neuer Termin",
|
|
65
|
+
calendarNothingPlanned: "Nichts geplant.",
|
|
66
|
+
calendarContinuesFrom: ({
|
|
67
|
+
day,
|
|
68
|
+
month
|
|
69
|
+
}) => `seit ${day}.${month ? ` ${month}` : ""}`,
|
|
70
|
+
calendarContinuesUntil: ({
|
|
71
|
+
day,
|
|
72
|
+
month
|
|
73
|
+
}) => `bis ${day}.${month ? ` ${month}` : ""}`
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
/** Resolved from the inherited render locale, like the rest of @k2b/ui. */
|
|
78
|
+
export const useCalendarMessages = () => {
|
|
79
|
+
const locale = useLocale();
|
|
80
|
+
return () => calendarMessages.resolve([locale()]).t;
|
|
81
|
+
};
|
|
82
|
+
export const checkCalendarMessages = () => calendarMessages.check();
|
|
83
|
+
//# sourceMappingURL=calendar-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/calendar-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\nimport { useLocale } from \"../intl/locale\";\n\n/**\n * The month view's own strings. They live beside the calendar instead of in the shared catalog, so applications that\n * never render a calendar do not ship them.\n */\nconst calendarMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n calendarMoreEvents: ({ count }: { count: number }) => `+${count} more`,\n calendarMoreEventsOn: ({ count, label }: { count: number; label: string }) => `${count} more on ${label}`,\n calendarSelectionActions: \"Actions for the selected days\",\n calendarQuickCreate: \"New entry\",\n calendarSelectedDays: ({ start, end, count }: { start: string; end: string; count: number }) => `${start} – ${end} · ${count} days`,\n calendarOpenDay: \"Open day\",\n calendarOpenWeek: \"Open week\",\n calendarOpenWeekNumber: ({ week }: { week: number }) => `Week ${week}, open week`,\n calendarClearSelection: \"Clear selection\",\n calendarNewEvent: \"New event\",\n calendarNothingPlanned: \"Nothing planned.\",\n calendarContinuesFrom: ({ day, month }: { day: number; month?: string }) => `from ${month ? `${month} ` : \"\"}${day}`,\n calendarContinuesUntil: ({ day, month }: { day: number; month?: string }) => `until ${month ? `${month} ` : \"\"}${day}`,\n },\n de: {\n calendarMoreEvents: ({ count }) => `+${count} weitere`,\n calendarMoreEventsOn: ({ count, label }) => `${count} weitere am ${label}`,\n calendarSelectionActions: \"Aktionen für die ausgewählten Tage\",\n calendarQuickCreate: \"Neuer Eintrag\",\n calendarSelectedDays: ({ start, end, count }) => `${start} – ${end} · ${count} Tage`,\n calendarOpenDay: \"Tag öffnen\",\n calendarOpenWeek: \"Woche öffnen\",\n calendarOpenWeekNumber: ({ week }) => `KW ${week}, Woche öffnen`,\n calendarClearSelection: \"Auswahl aufheben\",\n calendarNewEvent: \"Neuer Termin\",\n calendarNothingPlanned: \"Nichts geplant.\",\n calendarContinuesFrom: ({ day, month }) => `seit ${day}.${month ? ` ${month}` : \"\"}`,\n calendarContinuesUntil: ({ day, month }) => `bis ${day}.${month ? ` ${month}` : \"\"}`,\n },\n },\n});\n\nexport type CalendarMessages = ReturnType<(typeof calendarMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale, like the rest of @k2b/ui. */\nexport const useCalendarMessages = (): (() => CalendarMessages) => {\n const locale = useLocale();\n return () => calendarMessages.resolve([locale()]).t;\n};\n\nexport const checkCalendarMessages = () => calendarMessages.check();\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;AAClC,SAAS,SAAS,QAAQ,gBAAgB;;AAE1C;AACA;AACA;AACA;AACA,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;EACnC,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MACF,kBAAkB,EAAE,CAAC;QAAE;MAAyB,CAAC,KAAK,IAAI,KAAK,OAAO;MACtE,oBAAoB,EAAE,CAAC;QAAE,KAAK;QAAE;MAAwC,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,EAAE;MACzG,wBAAwB,EAAE,+BAA+B;MACzD,mBAAmB,EAAE,WAAW;MAChC,oBAAoB,EAAE,CAAC;QAAE,KAAK;QAAE,GAAG;QAAE;MAAqD,CAAC,KAAK,GAAG,KAAK,MAAM,GAAG,MAAM,KAAK,OAAO;MACnI,eAAe,EAAE,UAAU;MAC3B,gBAAgB,EAAE,WAAW;MAC7B,sBAAsB,EAAE,CAAC;QAAE;MAAuB,CAAC,KAAK,QAAQ,IAAI,aAAa;MACjF,sBAAsB,EAAE,iBAAiB;MACzC,gBAAgB,EAAE,WAAW;MAC7B,sBAAsB,EAAE,kBAAkB;MAC1C,qBAAqB,EAAE,CAAC;QAAE,GAAG;QAAE;MAAuC,CAAC,KAAK,QAAQ,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE;MACpH,sBAAsB,EAAE,CAAC;QAAE,GAAG;QAAE;MAAuC,CAAC,KAAK,SAAS,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,EAAE,GAAG,GAAG;IACtH,CAAC;IACD,EAAE,EAAE;MACF,kBAAkB,EAAE,CAAC;QAAE;MAAM,CAAC,KAAK,IAAI,KAAK,UAAU;MACtD,oBAAoB,EAAE,CAAC;QAAE,KAAK;QAAE;MAAM,CAAC,KAAK,GAAG,KAAK,eAAe,KAAK,EAAE;MAC1E,wBAAwB,EAAE,oCAAoC;MAC9D,mBAAmB,EAAE,eAAe;MACpC,oBAAoB,EAAE,CAAC;QAAE,KAAK;QAAE,GAAG;QAAE;MAAM,CAAC,KAAK,GAAG,KAAK,MAAM,GAAG,MAAM,KAAK,OAAO;MACpF,eAAe,EAAE,YAAY;MAC7B,gBAAgB,EAAE,cAAc;MAChC,sBAAsB,EAAE,CAAC;QAAE;MAAK,CAAC,KAAK,MAAM,IAAI,gBAAgB;MAChE,sBAAsB,EAAE,kBAAkB;MAC1C,gBAAgB,EAAE,cAAc;MAChC,sBAAsB,EAAE,iBAAiB;MACzC,qBAAqB,EAAE,CAAC;QAAE,GAAG;QAAE;MAAM,CAAC,KAAK,QAAQ,GAAG,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE,GAAG,EAAE,EAAE;MACpF,sBAAsB,EAAE,CAAC;QAAE,GAAG;QAAE;MAAM,CAAC,KAAK,OAAO,GAAG,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE,GAAG,EAAE;IACpF;EACF;AACF,CAAC,CAAC;AAIF;AACA,OAAO,MAAM,mBAAmB,GAAG,MAAgC;EACjE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,OAAO,MAAM,qBAAqB,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/** One entry of a month week row, with its first and last day as `YYYY-MM-DD` keys. */
|
|
2
|
+
|
|
3
|
+
/** The part of a bar inside one week row, from `startColumn` to `endColumn`, both inclusive. */
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Lays one week row out. Each bar is one piece over the days it covers in the row and keeps one lane on all of them,
|
|
7
|
+
* so a long entry never moves between its days: bars that start earlier come first, a longer bar before a shorter one
|
|
8
|
+
* with the same start, and otherwise the row's own order decides. Every lane is the lowest one free on all its days.
|
|
9
|
+
*/
|
|
10
|
+
export const layoutMonthWeek = (dayKeys, entries) => {
|
|
11
|
+
const singles = dayKeys.map(() => []);
|
|
12
|
+
const first = dayKeys[0];
|
|
13
|
+
const last = dayKeys[dayKeys.length - 1];
|
|
14
|
+
if (!first || !last) return {
|
|
15
|
+
bars: [],
|
|
16
|
+
singles
|
|
17
|
+
};
|
|
18
|
+
// Day keys sort as text, so the first day at or after a key is its column.
|
|
19
|
+
const column = key => {
|
|
20
|
+
const index = dayKeys.findIndex(dayKey => dayKey >= key);
|
|
21
|
+
return index < 0 ? dayKeys.length - 1 : index;
|
|
22
|
+
};
|
|
23
|
+
const pieces = [];
|
|
24
|
+
for (const entry of entries) {
|
|
25
|
+
if (entry.lastKey < first || entry.firstKey > last || entry.firstKey > entry.lastKey) continue;
|
|
26
|
+
if (!entry.bar) {
|
|
27
|
+
const index = dayKeys.indexOf(entry.firstKey);
|
|
28
|
+
if (index >= 0) singles[index].push(entry.item);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
pieces.push({
|
|
32
|
+
item: entry.item,
|
|
33
|
+
startColumn: column(entry.firstKey),
|
|
34
|
+
endColumn: entry.lastKey >= last ? dayKeys.length - 1 : column(entry.lastKey),
|
|
35
|
+
continuesBefore: entry.firstKey < first,
|
|
36
|
+
continuesAfter: entry.lastKey > last
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const ordered = pieces.map((piece, order) => ({
|
|
40
|
+
piece,
|
|
41
|
+
order
|
|
42
|
+
})).sort((left, right) => left.piece.startColumn - right.piece.startColumn || right.piece.endColumn - right.piece.startColumn - (left.piece.endColumn - left.piece.startColumn) || left.order - right.order);
|
|
43
|
+
const lanes = [];
|
|
44
|
+
const bars = ordered.map(({
|
|
45
|
+
piece
|
|
46
|
+
}) => {
|
|
47
|
+
const overlaps = other => other.startColumn <= piece.endColumn && other.endColumn >= piece.startColumn;
|
|
48
|
+
let lane = lanes.findIndex(taken => !taken.some(overlaps));
|
|
49
|
+
if (lane < 0) lane = lanes.push([]) - 1;
|
|
50
|
+
const bar = {
|
|
51
|
+
...piece,
|
|
52
|
+
lane
|
|
53
|
+
};
|
|
54
|
+
lanes[lane].push(bar);
|
|
55
|
+
return bar;
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
bars,
|
|
59
|
+
singles
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/** What one day cell of a week row draws: its entries from row `top` on, and how many it counts as "+N" below them. */
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Fits a week row into cells that have room for `capacity` rows each. A cell whose entries all fit draws them all;
|
|
67
|
+
* otherwise it gives its last row to "+N", which counts every entry of the day that is not drawn, hidden bars included.
|
|
68
|
+
* A bar is drawn only when it fits on every day it covers, so it is never cut off by a count.
|
|
69
|
+
*/
|
|
70
|
+
export const fitMonthWeek = (layout, capacity) => {
|
|
71
|
+
const room = Math.max(0, Math.floor(capacity));
|
|
72
|
+
const limits = layout.singles.map(() => room);
|
|
73
|
+
let bars = layout.bars;
|
|
74
|
+
let cells = [];
|
|
75
|
+
// Limits only ever drop from the capacity by one, so this settles after at most one pass per day.
|
|
76
|
+
for (let pass = 0; pass <= limits.length; pass++) {
|
|
77
|
+
bars = layout.bars.filter(bar => {
|
|
78
|
+
for (let day = bar.startColumn; day <= bar.endColumn; day++) if (bar.lane >= (limits[day] ?? 0)) return false;
|
|
79
|
+
return true;
|
|
80
|
+
});
|
|
81
|
+
let changed = false;
|
|
82
|
+
cells = layout.singles.map((singles, day) => {
|
|
83
|
+
const covers = bar => bar.startColumn <= day && day <= bar.endColumn;
|
|
84
|
+
const top = bars.reduce((rows, bar) => covers(bar) ? Math.max(rows, bar.lane + 1) : rows, 0);
|
|
85
|
+
const shown = singles.slice(0, Math.max(0, (limits[day] ?? 0) - top));
|
|
86
|
+
const hiddenBars = layout.bars.filter(bar => covers(bar) && !bars.includes(bar)).length;
|
|
87
|
+
const hidden = singles.length - shown.length + hiddenBars;
|
|
88
|
+
if (hidden > 0 && limits[day] === room && room > 0) {
|
|
89
|
+
limits[day] = room - 1;
|
|
90
|
+
changed = true;
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
top,
|
|
94
|
+
shown,
|
|
95
|
+
hidden
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
if (!changed) break;
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
bars,
|
|
102
|
+
cells
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/** How many rows of `lane` height with `gap` between them fit into `height`. */
|
|
107
|
+
export const monthLaneCapacity = (height, lane, gap) => lane > 0 && height > 0 ? Math.max(0, Math.floor((height + gap) / (lane + gap))) : 0;
|
|
108
|
+
//# sourceMappingURL=calendar-month-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/calendar-month-layout.ts"],"sourcesContent":["/** One entry of a month week row, with its first and last day as `YYYY-MM-DD` keys. */\nexport type MonthEntry<T> = {\n item: T;\n /** The entry's first day, which may lie before the row. */\n firstKey: string;\n /** The entry's last day, which may lie after the row. */\n lastKey: string;\n /** All-day and multi-day entries are bars that keep a lane; the others stack in their day below the bars. */\n bar: boolean;\n};\n\n/** The part of a bar inside one week row, from `startColumn` to `endColumn`, both inclusive. */\nexport type MonthBar<T> = {\n item: T;\n startColumn: number;\n endColumn: number;\n lane: number;\n /** The entry began before this row: the bar's start is torn. */\n continuesBefore: boolean;\n /** The entry goes on after this row: the bar's end is torn. */\n continuesAfter: boolean;\n};\n\nexport type MonthWeekLayout<T> = {\n bars: MonthBar<T>[];\n /** Per column, the entries that are not bars, in the order the row lists them. */\n singles: T[][];\n};\n\n/**\n * Lays one week row out. Each bar is one piece over the days it covers in the row and keeps one lane on all of them,\n * so a long entry never moves between its days: bars that start earlier come first, a longer bar before a shorter one\n * with the same start, and otherwise the row's own order decides. Every lane is the lowest one free on all its days.\n */\nexport const layoutMonthWeek = <T>(dayKeys: readonly string[], entries: readonly MonthEntry<T>[]): MonthWeekLayout<T> => {\n const singles: T[][] = dayKeys.map(() => []);\n const first = dayKeys[0];\n const last = dayKeys[dayKeys.length - 1];\n if (!first || !last) return { bars: [], singles };\n // Day keys sort as text, so the first day at or after a key is its column.\n const column = (key: string) => {\n const index = dayKeys.findIndex((dayKey) => dayKey >= key);\n return index < 0 ? dayKeys.length - 1 : index;\n };\n const pieces: Omit<MonthBar<T>, \"lane\">[] = [];\n for (const entry of entries) {\n if (entry.lastKey < first || entry.firstKey > last || entry.firstKey > entry.lastKey) continue;\n if (!entry.bar) {\n const index = dayKeys.indexOf(entry.firstKey);\n if (index >= 0) singles[index]!.push(entry.item);\n continue;\n }\n pieces.push({\n item: entry.item,\n startColumn: column(entry.firstKey),\n endColumn: entry.lastKey >= last ? dayKeys.length - 1 : column(entry.lastKey),\n continuesBefore: entry.firstKey < first,\n continuesAfter: entry.lastKey > last,\n });\n }\n const ordered = pieces\n .map((piece, order) => ({ piece, order }))\n .sort(\n (left, right) =>\n left.piece.startColumn - right.piece.startColumn ||\n right.piece.endColumn - right.piece.startColumn - (left.piece.endColumn - left.piece.startColumn) ||\n left.order - right.order,\n );\n const lanes: MonthBar<T>[][] = [];\n const bars = ordered.map(({ piece }) => {\n const overlaps = (other: MonthBar<T>) => other.startColumn <= piece.endColumn && other.endColumn >= piece.startColumn;\n let lane = lanes.findIndex((taken) => !taken.some(overlaps));\n if (lane < 0) lane = lanes.push([]) - 1;\n const bar = { ...piece, lane };\n lanes[lane]!.push(bar);\n return bar;\n });\n return { bars, singles };\n};\n\n/** What one day cell of a week row draws: its entries from row `top` on, and how many it counts as \"+N\" below them. */\nexport type MonthCellFit<T> = {\n /** The first row below the bars drawn over this day. */\n top: number;\n shown: T[];\n hidden: number;\n};\n\nexport type MonthWeekFit<T> = {\n /** The bars drawn whole; a bar that does not fit on one of its days is counted on each of them instead. */\n bars: MonthBar<T>[];\n cells: MonthCellFit<T>[];\n};\n\n/**\n * Fits a week row into cells that have room for `capacity` rows each. A cell whose entries all fit draws them all;\n * otherwise it gives its last row to \"+N\", which counts every entry of the day that is not drawn, hidden bars included.\n * A bar is drawn only when it fits on every day it covers, so it is never cut off by a count.\n */\nexport const fitMonthWeek = <T>(layout: MonthWeekLayout<T>, capacity: number): MonthWeekFit<T> => {\n const room = Math.max(0, Math.floor(capacity));\n const limits = layout.singles.map(() => room);\n let bars = layout.bars;\n let cells: MonthCellFit<T>[] = [];\n // Limits only ever drop from the capacity by one, so this settles after at most one pass per day.\n for (let pass = 0; pass <= limits.length; pass++) {\n bars = layout.bars.filter((bar) => {\n for (let day = bar.startColumn; day <= bar.endColumn; day++) if (bar.lane >= (limits[day] ?? 0)) return false;\n return true;\n });\n let changed = false;\n cells = layout.singles.map((singles, day) => {\n const covers = (bar: MonthBar<T>) => bar.startColumn <= day && day <= bar.endColumn;\n const top = bars.reduce((rows, bar) => (covers(bar) ? Math.max(rows, bar.lane + 1) : rows), 0);\n const shown = singles.slice(0, Math.max(0, (limits[day] ?? 0) - top));\n const hiddenBars = layout.bars.filter((bar) => covers(bar) && !bars.includes(bar)).length;\n const hidden = singles.length - shown.length + hiddenBars;\n if (hidden > 0 && limits[day] === room && room > 0) {\n limits[day] = room - 1;\n changed = true;\n }\n return { top, shown, hidden };\n });\n if (!changed) break;\n }\n return { bars, cells };\n};\n\n/** How many rows of `lane` height with `gap` between them fit into `height`. */\nexport const monthLaneCapacity = (height: number, lane: number, gap: number): number =>\n lane > 0 && height > 0 ? Math.max(0, Math.floor((height + gap) / (lane + gap))) : 0;\n"],"mappings":"AAAA;;AAWA;;AAkBA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,eAAe,GAAG,CAAI,OAA0B,EAAE,OAAiC,KAAyB;EACvH,MAAM,OAAc,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;EAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;EACxB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;EACxC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO;IAAE,IAAI,EAAE,EAAE;IAAE;EAAQ,CAAC;EACjD;EACA,MAAM,MAAM,GAAI,GAAW,IAAK;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAE,MAAM,IAAK,MAAM,IAAI,GAAG,CAAC;IAC1D,OAAO,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK;EAC/C,CAAC;EACD,MAAM,MAAmC,GAAG,EAAE;EAC9C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;IAC3B,IAAI,KAAK,CAAC,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,QAAQ,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE;IACtF,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;MACd,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;MAC7C,IAAI,KAAK,IAAI,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;MAChD;IACF;IACA,MAAM,CAAC,IAAI,CAAC;MACV,IAAI,EAAE,KAAK,CAAC,IAAI;MAChB,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;MACnC,SAAS,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;MAC7E,eAAe,EAAE,KAAK,CAAC,QAAQ,GAAG,KAAK;MACvC,cAAc,EAAE,KAAK,CAAC,OAAO,GAAG;IAClC,CAAC,CAAC;EACJ;EACA,MAAM,OAAO,GAAG,MAAM,CACnB,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,MAAM;IAAE,KAAK;IAAE;EAAM,CAAC,CAAC,CAAC,CACzC,IAAI,CACH,CAAC,IAAI,EAAE,KAAK,KACV,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,IAChD,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IACjG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KACvB,CAAC;EACH,MAAM,KAAsB,GAAG,EAAE;EACjC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAAE;EAAM,CAAC,KAAK;IACtC,MAAM,QAAQ,GAAI,KAAkB,IAAK,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,WAAW;IACrH,IAAI,IAAI,GAAG,KAAK,CAAC,SAAS,CAAE,KAAK,IAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5D,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;IACvC,MAAM,GAAG,GAAG;MAAE,GAAG,KAAK;MAAE;IAAK,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,CAAE,IAAI,CAAC,GAAG,CAAC;IACtB,OAAO,GAAG;EACZ,CAAC,CAAC;EACF,OAAO;IAAE,IAAI;IAAE;EAAQ,CAAC;AAC1B,CAAC;;AAED;;AAcA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,YAAY,GAAG,CAAI,MAA0B,EAAE,QAAgB,KAAsB;EAChG,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;EAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC;EAC7C,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI;EACtB,IAAI,KAAwB,GAAG,EAAE;EACjC;EACA,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;IAChD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAE,GAAG,IAAK;MACjC,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,KAAK;MAC7G,OAAO,IAAI;IACb,CAAC,CAAC;IACF,IAAI,OAAO,GAAG,KAAK;IACnB,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK;MAC3C,MAAM,MAAM,GAAI,GAAgB,IAAK,GAAG,CAAC,WAAW,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS;MACnF,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,KAAM,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAK,EAAE,CAAC,CAAC;MAC9F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;MACrE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAE,GAAG,IAAK,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;MACzF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,UAAU;MACzD,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,EAAE;QAClD,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QACtB,OAAO,GAAG,IAAI;MAChB;MACA,OAAO;QAAE,GAAG;QAAE,KAAK;QAAE;MAAO,CAAC;IAC/B,CAAC,CAAC;IACF,IAAI,CAAC,OAAO,EAAE;EAChB;EACA,OAAO;IAAE,IAAI;IAAE;EAAM,CAAC;AACxB,CAAC;;AAED;AACA,OAAO,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,IAAY,EAAE,GAAW,KACzE,IAAI,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/index.ts"],"sourcesContent":["export type {\n CalendarAttendee,\n CalendarCustomView,\n CalendarDayBadge,\n CalendarEvent,\n CalendarEventColor,\n CalendarEventRenderContext,\n CalendarEventTimeChange,\n CalendarLabels,\n CalendarProps,\n CalendarRecurrence,\n CalendarResource,\n CalendarView,\n} from \"./Calendar\";\nexport { default as Calendar } from \"./Calendar\";\n\nexport type { ChartKind, ChartLabels, ChartProps, ChartRenderOptions } from \"./Chart\";\nexport { default as Chart } from \"./Chart\";\nexport type { ChartExplorerColumn, ChartExplorerProps } from \"./ChartExplorer\";\nexport { ChartExplorer } from \"./ChartExplorer\";\nexport type { ChartExplorerControlsProps } from \"./ChartExplorerControls\";\nexport { ChartExplorerControls } from \"./ChartExplorerControls\";\nexport { ChartFilterControls, type ChartFilterControlsProps } from \"./ChartFilterControls\";\nexport { ChartSnapshotView } from \"./ChartSnapshotView\";\nexport type { CodeDisplayLanguage, CodeDisplayProps } from \"./CodeDisplay\";\nexport { default as CodeDisplay } from \"./CodeDisplay\";\nexport { type ChartCursor, createChartCursor } from \"./chart-cursor\";\nexport type {\n ChartExplorerCharts,\n ChartExplorerController,\n ChartExplorerData,\n ChartExplorerOptions,\n ChartExplorerRequest,\n ChartExplorerRow,\n ChartExplorerSnapshot,\n} from \"./chart-explorer\";\nexport { createChartExplorer } from \"./chart-explorer\";\nexport type { ChartDatumRef, ChartSelection, ChartTooltip, ChartTooltipFormatter } from \"./chart-inspection\";\nexport type { ChartSnapshot } from \"./chart-snapshot\";\nexport { prepareChartSnapshot } from \"./chart-snapshot\";\nexport type {\n StateTimelineChartOptions,\n StateTimelineDomain,\n StateTimelineInterval,\n StateTimelineRow,\n StateTimelineState,\n} from \"./chart-state-timeline\";\nexport { type CollectionSelection, createCollectionSelection, type SelectionModifiers } from \"./collection-selection\";\nexport type {\n DataTableColumn,\n DataTableControlsProps,\n DataTableFooter,\n DataTableHeaderProps,\n DataTablePanelFooterProps,\n DataTablePanelProps,\n DataTableProps,\n DataTableRenderCell,\n DataTableRenderHeader,\n DataTableSort,\n} from \"./DataTable\";\nexport { default as DataTable } from \"./DataTable\";\nexport type { DocCodeHighlighter, DocCodeProps, DocConcept, DocNoteVariant, DocRow } from \"./Docs\";\nexport { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocRows, DocSection } from \"./Docs\";\nexport { FileBrowserPanel, type FileBrowserPanelProps, type FileSource, openFileBrowser } from \"./FileBrowser\";\nexport { FileGrid, type FileGridProps } from \"./FileGrid\";\nexport { default as FileTree, type FileTreeActions, type FileTreeEntry, type FileTreeProps } from \"./FileTree\";\nexport {\n canPreviewFile,\n default as FileView,\n type FileViewContent,\n type FileViewFile,\n type FileViewPreviewKind,\n type FileViewProps,\n type FileViewRenderer,\n type FileViewRendererProps,\n formatFileViewSize,\n getFileViewPreviewKind,\n} from \"./FileView\";\nexport type { LightboxAction, LightboxImage } from \"./Lightbox\";\nexport { default as Lightbox } from \"./Lightbox\";\nexport type { LogTableEntry } from \"./LogEntriesTable\";\nexport { default as LogEntriesTable } from \"./LogEntriesTable\";\nexport { default as MarkdownView, type MarkdownRenderOptions, type MarkdownViewProps, renderSafeMarkdown } from \"./MarkdownView\";\nexport type {\n MessageGroupEntry,\n MessageRowAction,\n MessageRowAttachment,\n MessageRowAuthor,\n MessageRowFile,\n MessageRowMedia,\n MessageRowProgress,\n MessageRowProps,\n MessageRowQuote,\n MessageRowReaction,\n MessageRowStatus,\n MessageRowThread,\n MessageSystemRowProps,\n} from \"./MessageRow\";\nexport { MessageRow, MessageSystemRow, startsMessageGroup } from \"./MessageRow\";\nexport {\n type MarkdownInfoBlock,\n type MarkdownInfoBlockRenderInput,\n type MarkdownInfoBlockType,\n markdownInfoBlocks,\n renderMarkdownInfoBlock,\n scanMarkdownInfoBlock,\n} from \"./markdown-info-blocks\";\nexport {\n type MarkdownLinkInput,\n type MarkdownReference,\n type MarkdownReferenceKind,\n type MarkdownReferenceType,\n markdownLinkReference,\n markdownReferenceIcon,\n markdownReferenceType,\n markdownReferenceTypeLabel,\n markStandaloneLinks,\n renderMarkdownLink,\n} from \"./markdown-links\";\nexport { Pagination, type PaginationProps } from \"./Pagination\";\nexport type { PdfPreviewProps, PdfPreviewRequest } from \"./PdfPreview\";\nexport { default as PdfPreview } from \"./PdfPreview\";\nexport type { RangeOption, RangePickerProps } from \"./RangePicker\";\nexport { default as RangePicker } from \"./RangePicker\";\nexport type { StructuredDataPreviewMode, StructuredDataPreviewProps, StructuredDataValue } from \"./StructuredDataPreview\";\nexport { default as StructuredDataPreview, isStructuredDataValue } from \"./StructuredDataPreview\";\nexport type { TimelineColor, TimelineController, TimelineItem, TimelineProps } from \"./Timeline\";\nexport { default as Timeline } from \"./Timeline\";\nexport { VideoPlayer, type VideoPlayerProps } from \"./VideoPlayer\";\nexport type { VirtualFeedController, VirtualFeedProps, VirtualFeedScrollOptions } from \"./VirtualFeed\";\nexport { VirtualFeed } from \"./VirtualFeed\";\nexport type { ZoomPanAction, ZoomPanFullscreen, ZoomPanViewportProps } from \"./ZoomPanViewport\";\nexport { ZoomPanViewport } from \"./ZoomPanViewport\";\n"],"mappings":"
|
|
1
|
+
{"version":3,"names":[],"sources":["content/index.ts"],"sourcesContent":["export type {\n CalendarAttendee,\n CalendarCustomView,\n CalendarDayBadge,\n CalendarEvent,\n CalendarEventColor,\n CalendarEventRenderContext,\n CalendarEventTimeChange,\n CalendarLabels,\n CalendarProps,\n CalendarQuickCreateControls,\n CalendarRecurrence,\n CalendarResource,\n CalendarSelectionControls,\n CalendarView,\n} from \"./Calendar\";\nexport { default as Calendar } from \"./Calendar\";\n\nexport type { ChartKind, ChartLabels, ChartProps, ChartRenderOptions } from \"./Chart\";\nexport { default as Chart } from \"./Chart\";\nexport type { ChartExplorerColumn, ChartExplorerProps } from \"./ChartExplorer\";\nexport { ChartExplorer } from \"./ChartExplorer\";\nexport type { ChartExplorerControlsProps } from \"./ChartExplorerControls\";\nexport { ChartExplorerControls } from \"./ChartExplorerControls\";\nexport { ChartFilterControls, type ChartFilterControlsProps } from \"./ChartFilterControls\";\nexport { ChartSnapshotView } from \"./ChartSnapshotView\";\nexport type { CodeDisplayLanguage, CodeDisplayProps } from \"./CodeDisplay\";\nexport { default as CodeDisplay } from \"./CodeDisplay\";\nexport { type ChartCursor, createChartCursor } from \"./chart-cursor\";\nexport type {\n ChartExplorerCharts,\n ChartExplorerController,\n ChartExplorerData,\n ChartExplorerOptions,\n ChartExplorerRequest,\n ChartExplorerRow,\n ChartExplorerSnapshot,\n} from \"./chart-explorer\";\nexport { createChartExplorer } from \"./chart-explorer\";\nexport type { ChartDatumRef, ChartSelection, ChartTooltip, ChartTooltipFormatter } from \"./chart-inspection\";\nexport type { ChartSnapshot } from \"./chart-snapshot\";\nexport { prepareChartSnapshot } from \"./chart-snapshot\";\nexport type {\n StateTimelineChartOptions,\n StateTimelineDomain,\n StateTimelineInterval,\n StateTimelineRow,\n StateTimelineState,\n} from \"./chart-state-timeline\";\nexport { type CollectionSelection, createCollectionSelection, type SelectionModifiers } from \"./collection-selection\";\nexport type {\n DataTableColumn,\n DataTableControlsProps,\n DataTableFooter,\n DataTableHeaderProps,\n DataTablePanelFooterProps,\n DataTablePanelProps,\n DataTableProps,\n DataTableRenderCell,\n DataTableRenderHeader,\n DataTableSort,\n} from \"./DataTable\";\nexport { default as DataTable } from \"./DataTable\";\nexport type { DocCodeHighlighter, DocCodeProps, DocConcept, DocNoteVariant, DocRow } from \"./Docs\";\nexport { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocRows, DocSection } from \"./Docs\";\nexport { FileBrowserPanel, type FileBrowserPanelProps, type FileSource, openFileBrowser } from \"./FileBrowser\";\nexport { FileGrid, type FileGridProps } from \"./FileGrid\";\nexport { default as FileTree, type FileTreeActions, type FileTreeEntry, type FileTreeProps } from \"./FileTree\";\nexport {\n canPreviewFile,\n default as FileView,\n type FileViewContent,\n type FileViewFile,\n type FileViewPreviewKind,\n type FileViewProps,\n type FileViewRenderer,\n type FileViewRendererProps,\n formatFileViewSize,\n getFileViewPreviewKind,\n} from \"./FileView\";\nexport type { LightboxAction, LightboxImage } from \"./Lightbox\";\nexport { default as Lightbox } from \"./Lightbox\";\nexport type { LogTableEntry } from \"./LogEntriesTable\";\nexport { default as LogEntriesTable } from \"./LogEntriesTable\";\nexport { default as MarkdownView, type MarkdownRenderOptions, type MarkdownViewProps, renderSafeMarkdown } from \"./MarkdownView\";\nexport type {\n MessageGroupEntry,\n MessageRowAction,\n MessageRowAttachment,\n MessageRowAuthor,\n MessageRowFile,\n MessageRowMedia,\n MessageRowProgress,\n MessageRowProps,\n MessageRowQuote,\n MessageRowReaction,\n MessageRowStatus,\n MessageRowThread,\n MessageSystemRowProps,\n} from \"./MessageRow\";\nexport { MessageRow, MessageSystemRow, startsMessageGroup } from \"./MessageRow\";\nexport {\n type MarkdownInfoBlock,\n type MarkdownInfoBlockRenderInput,\n type MarkdownInfoBlockType,\n markdownInfoBlocks,\n renderMarkdownInfoBlock,\n scanMarkdownInfoBlock,\n} from \"./markdown-info-blocks\";\nexport {\n type MarkdownLinkInput,\n type MarkdownReference,\n type MarkdownReferenceKind,\n type MarkdownReferenceType,\n markdownLinkReference,\n markdownReferenceIcon,\n markdownReferenceType,\n markdownReferenceTypeLabel,\n markStandaloneLinks,\n renderMarkdownLink,\n} from \"./markdown-links\";\nexport { Pagination, type PaginationProps } from \"./Pagination\";\nexport type { PdfPreviewProps, PdfPreviewRequest } from \"./PdfPreview\";\nexport { default as PdfPreview } from \"./PdfPreview\";\nexport type { RangeOption, RangePickerProps } from \"./RangePicker\";\nexport { default as RangePicker } from \"./RangePicker\";\nexport type { StructuredDataPreviewMode, StructuredDataPreviewProps, StructuredDataValue } from \"./StructuredDataPreview\";\nexport { default as StructuredDataPreview, isStructuredDataValue } from \"./StructuredDataPreview\";\nexport type { TimelineColor, TimelineController, TimelineItem, TimelineProps } from \"./Timeline\";\nexport { default as Timeline } from \"./Timeline\";\nexport { VideoPlayer, type VideoPlayerProps } from \"./VideoPlayer\";\nexport type { VirtualFeedController, VirtualFeedProps, VirtualFeedScrollOptions } from \"./VirtualFeed\";\nexport { VirtualFeed } from \"./VirtualFeed\";\nexport type { ZoomPanAction, ZoomPanFullscreen, ZoomPanViewportProps } from \"./ZoomPanViewport\";\nexport { ZoomPanViewport } from \"./ZoomPanViewport\";\n"],"mappings":"AAgBA,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAGhD,SAAS,OAAO,IAAI,KAAK,QAAQ,SAAS;AAE1C,SAAS,aAAa,QAAQ,iBAAiB;AAE/C,SAAS,qBAAqB,QAAQ,yBAAyB;AAC/D,SAAS,mBAAmB,QAAuC,uBAAuB;AAC1F,SAAS,iBAAiB,QAAQ,qBAAqB;AAEvD,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AACtD,SAA2B,iBAAiB,QAAQ,gBAAgB;AAUpE,SAAS,mBAAmB,QAAQ,kBAAkB;AAGtD,SAAS,oBAAoB,QAAQ,kBAAkB;AAQvD,SAAmC,yBAAyB,QAAiC,wBAAwB;AAarH,SAAS,OAAO,IAAI,SAAS,QAAQ,aAAa;AAElD,SAAS,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,QAAQ,QAAQ;AAC/G,SAAS,gBAAgB,EAA+C,eAAe,QAAQ,eAAe;AAC9G,SAAS,QAAQ,QAA4B,YAAY;AACzD,SAAS,OAAO,IAAI,QAAQ,QAAsE,YAAY;AAC9G,SACE,cAAc,EACd,OAAO,IAAI,QAAQ,EAOnB,kBAAkB,EAClB,sBAAsB,QACjB,YAAY;AAEnB,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAEhD,SAAS,OAAO,IAAI,eAAe,QAAQ,mBAAmB;AAC9D,SAAS,OAAO,IAAI,YAAY,EAAsD,kBAAkB,QAAQ,gBAAgB;AAgBhI,SAAS,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,QAAQ,cAAc;AAC/E,SAIE,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,QAChB,wBAAwB;AAC/B,SAKE,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,QACb,kBAAkB;AACzB,SAAS,UAAU,QAA8B,cAAc;AAE/D,SAAS,OAAO,IAAI,UAAU,QAAQ,cAAc;AAEpD,SAAS,OAAO,IAAI,WAAW,QAAQ,eAAe;AAEtD,SAAS,OAAO,IAAI,qBAAqB,EAAE,qBAAqB,QAAQ,yBAAyB;AAEjG,SAAS,OAAO,IAAI,QAAQ,QAAQ,YAAY;AAChD,SAAS,WAAW,QAA+B,eAAe;AAElE,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,eAAe,QAAQ,mBAAmB","ignoreList":[]}
|
|
@@ -39,8 +39,8 @@ import { createEffect, createMemo, createSignal, For, onCleanup, onMount, Show }
|
|
|
39
39
|
import { createFieldMeta, Field, fieldControlAria, fieldDescribedBy } from "../internal/field";
|
|
40
40
|
import { returnFocus, ringOnReturn } from "../internal/focus-return";
|
|
41
41
|
import { useDateConfigLocale } from "../intl/locale";
|
|
42
|
-
import { useUiMessages } from "../intl/messages";
|
|
43
|
-
import { dateKey, displayDate, filterTimeInput, formatDateOnlyRangeDuration, formatDateTimeValue, inRange, isCompleteTime, isRangeEdge, monthDate, monthNames, normalizeTimeInput, orderedRange, parseDateValue, pickerContext, previewRange, resolveFocusDay, splitDateTime, toDateTimeValue, yearMonth } from "./date-picker";
|
|
42
|
+
import { resolveUiMessages, useUiMessages } from "../intl/messages";
|
|
43
|
+
import { dateKey, displayDate, filterTimeInput, formatDateOnlyRangeDuration, formatDateTimeValue, inRange, isCompleteTime, isRangeEdge, monthDate, monthNames, msUntilNextDay, normalizeTimeInput, orderedRange, parseDateValue, pickerContext, previewRange, resolveFocusDay, splitDateTime, toDateTimeValue, yearMonth } from "./date-picker";
|
|
44
44
|
import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
|
|
45
45
|
const popoverIsOpen = popover => {
|
|
46
46
|
if (!popover) return false;
|
|
@@ -346,13 +346,42 @@ function DatePickerPanel(props) {
|
|
|
346
346
|
number: dates.formatDayNumber(day, dateContext)
|
|
347
347
|
})));
|
|
348
348
|
});
|
|
349
|
+
// Today in the picker's time zone, the zone its values use. The browser reads
|
|
350
|
+
// the clock again at the next midnight there, when a hidden tab becomes visible
|
|
351
|
+
// again (timers may not fire on time while the device sleeps), and when the
|
|
352
|
+
// date config changes. The mark and its timer share each reading, so neither
|
|
353
|
+
// starts from an old one.
|
|
354
|
+
const [clockCheck, checkClock] = createSignal(undefined, {
|
|
355
|
+
equals: false
|
|
356
|
+
});
|
|
357
|
+
const now = createMemo(() => {
|
|
358
|
+
clockCheck();
|
|
359
|
+
context();
|
|
360
|
+
return new Date();
|
|
361
|
+
});
|
|
362
|
+
const todayKey = createMemo(() => dateKey(now(), context()));
|
|
363
|
+
// The day's name is formatted in the date locale, so "today" joins it in the same language.
|
|
364
|
+
const todayLabel = date => resolveUiMessages(context().locale).todayDate({
|
|
365
|
+
date
|
|
366
|
+
});
|
|
367
|
+
createEffect(() => {
|
|
368
|
+
const timer = window.setTimeout(() => checkClock(), msUntilNextDay(now(), context()));
|
|
369
|
+
onCleanup(() => window.clearTimeout(timer));
|
|
370
|
+
});
|
|
371
|
+
onMount(() => {
|
|
372
|
+
const refresh = () => {
|
|
373
|
+
if (document.visibilityState === "visible") checkClock();
|
|
374
|
+
};
|
|
375
|
+
document.addEventListener("visibilitychange", refresh);
|
|
376
|
+
onCleanup(() => document.removeEventListener("visibilitychange", refresh));
|
|
377
|
+
});
|
|
349
378
|
let calendar;
|
|
350
379
|
// Days that belong to the visible month; the roving tabindex must land on one
|
|
351
380
|
// of them or the grid becomes unreachable by keyboard after month navigation.
|
|
352
381
|
const monthDayKeys = createMemo(() => dayRows().flat().filter(day => !day.outside).map(day => day.key));
|
|
353
382
|
// Remembers where arrow-key navigation left off so Tab returns to that day.
|
|
354
383
|
const [focusedKey, setFocusedKey] = createSignal();
|
|
355
|
-
const defaultFocus = createMemo(() => resolveFocusDay(monthDayKeys(), focusedKey() || props.focusDate?.() || props.selected?.() ||
|
|
384
|
+
const defaultFocus = createMemo(() => resolveFocusDay(monthDayKeys(), focusedKey() || props.focusDate?.() || props.selected?.() || todayKey()));
|
|
356
385
|
const moveMonth = delta => props.setVisibleMonth(dates.addMonths(props.visibleMonth(), delta, context()));
|
|
357
386
|
const moveYear = delta => props.setVisibleMonth(monthDate(month().year + delta, month().month, context()));
|
|
358
387
|
const previousLabel = () => view() === "days" ? messages().previousMonth : messages().previousYear;
|
|
@@ -480,6 +509,7 @@ function DatePickerPanel(props) {
|
|
|
480
509
|
};
|
|
481
510
|
const active = () => selected() || isRangeEdge(cell.key, range());
|
|
482
511
|
const focusable = () => cell.key === defaultFocus();
|
|
512
|
+
const today = () => cell.key === todayKey();
|
|
483
513
|
return (() => {
|
|
484
514
|
var _el$40 = _$getNextElement(_tmpl$12);
|
|
485
515
|
_el$40.addEventListener("pointerleave", () => props.onDayPreview?.(null));
|
|
@@ -497,16 +527,20 @@ function DatePickerPanel(props) {
|
|
|
497
527
|
_v$11 = focusable() ? "true" : undefined,
|
|
498
528
|
_v$12 = cell.outside ? "true" : undefined,
|
|
499
529
|
_v$13 = inRange(cell.key, range()) && !active() ? "true" : undefined,
|
|
500
|
-
_v$14 =
|
|
501
|
-
_v$15 =
|
|
502
|
-
_v$16 =
|
|
530
|
+
_v$14 = today() ? "true" : undefined,
|
|
531
|
+
_v$15 = today() ? "date" : undefined,
|
|
532
|
+
_v$16 = today() ? todayLabel(cell.label) : cell.label,
|
|
533
|
+
_v$17 = active(),
|
|
534
|
+
_v$18 = focusable() ? 0 : -1;
|
|
503
535
|
_v$10 !== _p$.e && _$setAttribute(_el$40, "data-date-day", _p$.e = _v$10);
|
|
504
536
|
_v$11 !== _p$.t && _$setAttribute(_el$40, "data-date-focus", _p$.t = _v$11);
|
|
505
537
|
_v$12 !== _p$.a && _$setAttribute(_el$40, "data-outside", _p$.a = _v$12);
|
|
506
538
|
_v$13 !== _p$.o && _$setAttribute(_el$40, "data-in-range", _p$.o = _v$13);
|
|
507
|
-
_v$14 !== _p$.i && _$setAttribute(_el$40, "
|
|
508
|
-
_v$15 !== _p$.n && _$setAttribute(_el$40, "aria-
|
|
509
|
-
_v$16 !== _p$.s && _$setAttribute(_el$40, "
|
|
539
|
+
_v$14 !== _p$.i && _$setAttribute(_el$40, "data-today", _p$.i = _v$14);
|
|
540
|
+
_v$15 !== _p$.n && _$setAttribute(_el$40, "aria-current", _p$.n = _v$15);
|
|
541
|
+
_v$16 !== _p$.s && _$setAttribute(_el$40, "aria-label", _p$.s = _v$16);
|
|
542
|
+
_v$17 !== _p$.h && _$setAttribute(_el$40, "aria-selected", _p$.h = _v$17);
|
|
543
|
+
_v$18 !== _p$.r && _$setAttribute(_el$40, "tabindex", _p$.r = _v$18);
|
|
510
544
|
return _p$;
|
|
511
545
|
}, {
|
|
512
546
|
e: undefined,
|
|
@@ -515,7 +549,9 @@ function DatePickerPanel(props) {
|
|
|
515
549
|
o: undefined,
|
|
516
550
|
i: undefined,
|
|
517
551
|
n: undefined,
|
|
518
|
-
s: undefined
|
|
552
|
+
s: undefined,
|
|
553
|
+
h: undefined,
|
|
554
|
+
r: undefined
|
|
519
555
|
});
|
|
520
556
|
_$runHydrationEvents();
|
|
521
557
|
return _el$40;
|