@g4rcez/components 2.2.9 → 2.3.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.
Files changed (126) hide show
  1. package/dist/components/core/button.d.ts.map +1 -1
  2. package/dist/components/core/polymorph.d.ts.map +1 -1
  3. package/dist/components/core/slot.d.ts +1 -1
  4. package/dist/components/core/slot.d.ts.map +1 -1
  5. package/dist/components/core/slot.jsx +28 -35
  6. package/dist/components/core/tag.jsx +1 -1
  7. package/dist/components/core/typography.d.ts.map +1 -1
  8. package/dist/components/core/typography.jsx +16 -20
  9. package/dist/components/display/alert.d.ts.map +1 -1
  10. package/dist/components/display/alert.jsx +22 -24
  11. package/dist/components/display/calendar.d.ts.map +1 -1
  12. package/dist/components/display/calendar.jsx +5 -7
  13. package/dist/components/display/card.d.ts.map +1 -1
  14. package/dist/components/display/card.jsx +5 -5
  15. package/dist/components/display/empty.jsx +1 -1
  16. package/dist/components/display/notifications.d.ts.map +1 -1
  17. package/dist/components/display/notifications.jsx +35 -35
  18. package/dist/components/display/progress.d.ts.map +1 -1
  19. package/dist/components/display/progress.jsx +6 -8
  20. package/dist/components/display/shortcut.jsx +1 -1
  21. package/dist/components/display/skeleton.d.ts.map +1 -1
  22. package/dist/components/display/skeleton.jsx +3 -5
  23. package/dist/components/display/step.d.ts.map +1 -1
  24. package/dist/components/display/step.jsx +27 -27
  25. package/dist/components/display/tabs.d.ts.map +1 -1
  26. package/dist/components/display/tabs.jsx +5 -7
  27. package/dist/components/floating/command-palette.d.ts.map +1 -1
  28. package/dist/components/floating/command-palette.jsx +40 -40
  29. package/dist/components/floating/dropdown.d.ts.map +1 -1
  30. package/dist/components/floating/dropdown.jsx +15 -15
  31. package/dist/components/floating/modal.d.ts.map +1 -1
  32. package/dist/components/floating/modal.jsx +73 -67
  33. package/dist/components/floating/tooltip.d.ts.map +1 -1
  34. package/dist/components/floating/tooltip.jsx +2 -8
  35. package/dist/components/floating/wizard.d.ts +1 -1
  36. package/dist/components/floating/wizard.d.ts.map +1 -1
  37. package/dist/components/floating/wizard.jsx +50 -53
  38. package/dist/components/form/autocomplete.d.ts.map +1 -1
  39. package/dist/components/form/autocomplete.jsx +38 -35
  40. package/dist/components/form/checkbox.jsx +2 -2
  41. package/dist/components/form/date-picker.d.ts.map +1 -1
  42. package/dist/components/form/date-picker.jsx +14 -14
  43. package/dist/components/form/file-upload.jsx +13 -13
  44. package/dist/components/form/free-text.d.ts.map +1 -1
  45. package/dist/components/form/free-text.jsx +2 -2
  46. package/dist/components/form/input-field.d.ts.map +1 -1
  47. package/dist/components/form/input-field.jsx +42 -41
  48. package/dist/components/form/multi-select.d.ts.map +1 -1
  49. package/dist/components/form/multi-select.jsx +56 -56
  50. package/dist/components/form/select.d.ts.map +1 -1
  51. package/dist/components/form/select.jsx +13 -13
  52. package/dist/components/form/slider.d.ts.map +1 -1
  53. package/dist/components/form/slider.jsx +10 -10
  54. package/dist/components/form/transfer-list.jsx +3 -3
  55. package/dist/components/index.d.ts +1 -0
  56. package/dist/components/index.d.ts.map +1 -1
  57. package/dist/components/index.js +1 -0
  58. package/dist/components/page-calendar/calendar-header.d.ts +16 -0
  59. package/dist/components/page-calendar/calendar-header.d.ts.map +1 -0
  60. package/dist/components/page-calendar/calendar-header.jsx +81 -0
  61. package/dist/components/page-calendar/day-view.d.ts +12 -0
  62. package/dist/components/page-calendar/day-view.d.ts.map +1 -0
  63. package/dist/components/page-calendar/day-view.jsx +84 -0
  64. package/dist/components/page-calendar/event-pill.d.ts +9 -0
  65. package/dist/components/page-calendar/event-pill.d.ts.map +1 -0
  66. package/dist/components/page-calendar/event-pill.jsx +23 -0
  67. package/dist/components/page-calendar/index.d.ts +4 -0
  68. package/dist/components/page-calendar/index.d.ts.map +1 -0
  69. package/dist/components/page-calendar/index.js +2 -0
  70. package/dist/components/page-calendar/month-view.d.ts +11 -0
  71. package/dist/components/page-calendar/month-view.d.ts.map +1 -0
  72. package/dist/components/page-calendar/month-view.jsx +47 -0
  73. package/dist/components/page-calendar/page-calendar.d.ts +18 -0
  74. package/dist/components/page-calendar/page-calendar.d.ts.map +1 -0
  75. package/dist/components/page-calendar/page-calendar.jsx +39 -0
  76. package/dist/components/page-calendar/page-calendar.types.d.ts +18 -0
  77. package/dist/components/page-calendar/page-calendar.types.d.ts.map +1 -0
  78. package/dist/components/page-calendar/page-calendar.types.js +1 -0
  79. package/dist/components/page-calendar/page-calendar.utils.d.ts +18 -0
  80. package/dist/components/page-calendar/page-calendar.utils.d.ts.map +1 -0
  81. package/dist/components/page-calendar/page-calendar.utils.js +71 -0
  82. package/dist/components/page-calendar/week-view.d.ts +11 -0
  83. package/dist/components/page-calendar/week-view.d.ts.map +1 -0
  84. package/dist/components/page-calendar/week-view.jsx +61 -0
  85. package/dist/components/table/filter.jsx +4 -4
  86. package/dist/components/table/index.d.ts.map +1 -1
  87. package/dist/components/table/index.jsx +10 -10
  88. package/dist/components/table/inner-table.d.ts.map +1 -1
  89. package/dist/components/table/inner-table.jsx +18 -18
  90. package/dist/components/table/metadata.d.ts.map +1 -1
  91. package/dist/components/table/metadata.jsx +29 -30
  92. package/dist/components/table/pagination.jsx +1 -1
  93. package/dist/components/table/row.d.ts.map +1 -1
  94. package/dist/components/table/row.jsx +17 -17
  95. package/dist/components/table/sort.jsx +1 -1
  96. package/dist/components/table/table-lib.d.ts.map +1 -1
  97. package/dist/components/table/table-lib.js +1 -2
  98. package/dist/components/table/thead.d.ts.map +1 -1
  99. package/dist/components/table/thead.jsx +5 -5
  100. package/dist/config/context.d.ts.map +1 -1
  101. package/dist/config/default-translations.d.ts +10 -0
  102. package/dist/config/default-translations.d.ts.map +1 -1
  103. package/dist/config/default-translations.jsx +11 -1
  104. package/dist/constants.d.ts.map +1 -1
  105. package/dist/hooks/use-components-provider.d.ts.map +1 -1
  106. package/dist/hooks/use-components-provider.jsx +2 -2
  107. package/dist/hooks/use-form.d.ts.map +1 -1
  108. package/dist/hooks/use-input-id.d.ts.map +1 -1
  109. package/dist/hooks/use-is-coarse-device.js +1 -1
  110. package/dist/hooks/use-preferences.d.ts.map +1 -1
  111. package/dist/hooks/use-resize-observer.d.ts.map +1 -1
  112. package/dist/hooks/use-translations.d.ts +10 -0
  113. package/dist/hooks/use-translations.d.ts.map +1 -1
  114. package/dist/index.css +1 -1
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js.map +1 -1
  117. package/dist/index.mjs +10121 -9704
  118. package/dist/index.mjs.map +1 -1
  119. package/dist/index.umd.js +14 -14
  120. package/dist/index.umd.js.map +1 -1
  121. package/dist/lib/dom.d.ts.map +1 -1
  122. package/dist/lib/fns.d.ts.map +1 -1
  123. package/dist/lib/fns.js +2 -2
  124. package/dist/preset/src/styles/theme.types.d.ts.map +1 -1
  125. package/dist/styles/theme.types.d.ts.map +1 -1
  126. package/package.json +289 -289
@@ -0,0 +1,47 @@
1
+ import { isSameMonth, isToday } from "date-fns";
2
+ import { useLocale } from "../../hooks/use-locale";
3
+ import { useTranslations } from "../../hooks/use-translations";
4
+ import { EventPill } from "./event-pill";
5
+ import { toDateKey, formatDay, getWeekDays, formatWeekDay } from "./page-calendar.utils";
6
+ import { useMemo } from "react";
7
+ export function MonthView({ days, eventsByDate, currentDate, onEventClick, onDayClick }) {
8
+ const locale = useLocale();
9
+ const t = useTranslations();
10
+ const WEEKDAY_LABELS = useMemo(() => getWeekDays(new Date()), []);
11
+ return (<div className="flex h-full flex-1 flex-col">
12
+ <ul className="grid grid-cols-7 border-b border-border">
13
+ {WEEKDAY_LABELS.map((date) => {
14
+ const day = formatWeekDay(date, locale);
15
+ return (<li key={day} className="py-2 text-center text-xs font-medium text-muted-foreground">
16
+ {day}
17
+ </li>);
18
+ })}
19
+ </ul>
20
+ <div className="grid flex-1 auto-rows-fr grid-cols-7">
21
+ {days.map((day, idx) => {
22
+ const key = toDateKey(day);
23
+ const events = eventsByDate.get(key) || [];
24
+ const isCurrentMonth = isSameMonth(day, currentDate);
25
+ const isCurrentDay = isToday(day);
26
+ const visible = events.slice(0, 2);
27
+ const overflow = events.length - 2;
28
+ return (<button key={idx} type="button" onClick={() => onDayClick(day)} className={`group flex min-h-32 cursor-pointer flex-col gap-1 border-b border-r border-border p-2 transition-colors hover:bg-muted hover:bg-opacity-20 ${!isCurrentMonth ? "opacity-50" : ""}`}>
29
+ <div className="flex items-center justify-between">
30
+ <span className={`flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium ${isCurrentDay ? "bg-primary text-primary-foreground" : "text-foreground"}`}>
31
+ {formatDay(day, locale)}
32
+ </span>
33
+ <span className="text-lg leading-none text-muted-foreground opacity-0 transition-opacity group-hover:opacity-40">
34
+ +
35
+ </span>
36
+ </div>
37
+ <div className="flex flex-col gap-0.5">
38
+ {visible.map((event) => (<div key={event.id} onClick={(e) => e.stopPropagation()}>
39
+ <EventPill compact event={event} onClick={() => onEventClick(event)}/>
40
+ </div>))}
41
+ {overflow > 0 && <span className="pl-1 text-xs text-muted-foreground">{t.pageCalendarMoreEvents(overflow)}</span>}
42
+ </div>
43
+ </button>);
44
+ })}
45
+ </div>
46
+ </div>);
47
+ }
@@ -0,0 +1,18 @@
1
+ import { type ReactNode } from "react";
2
+ import type { CalendarEvent, CalendarEventBase, CalendarFilter, ViewMode } from "./page-calendar.types";
3
+ type PageCalendarProps<T extends CalendarEventBase> = {
4
+ defaultDate?: Date;
5
+ defaultView?: ViewMode;
6
+ filterArea?: ReactNode;
7
+ onAddEvent?: () => void;
8
+ getFilterId?: () => void;
9
+ events: CalendarEvent<T>[];
10
+ filters?: CalendarFilter[];
11
+ onSlotClick?: (date: Date) => void;
12
+ onEventClick?: (event: CalendarEvent) => void;
13
+ renderEvent?: (event: CalendarEvent<T>) => ReactNode;
14
+ onChangeFilters?: (filters: CalendarFilter[]) => void;
15
+ };
16
+ export declare function PageCalendar<T extends CalendarEventBase>({ events, filterArea, onAddEvent, defaultDate, onSlotClick, getFilterId, renderEvent, onEventClick, filters, defaultView, onChangeFilters: onActiveFiltersChange, }: PageCalendarProps<T>): import("react").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=page-calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-calendar.d.ts","sourceRoot":"","sources":["../../../src/components/page-calendar/page-calendar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAOxG,KAAK,iBAAiB,CAAC,CAAC,SAAS,iBAAiB,IAAI;IAClD,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IACrD,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;CACzD,CAAC;AAIF,wBAAgB,YAAY,CAAC,CAAC,SAAS,iBAAiB,EAAE,EACtD,MAAM,EACN,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,OAAc,EACd,WAAqB,EACrB,eAAe,EAAE,qBAAqB,GACzC,EAAE,iBAAiB,CAAC,CAAC,CAAC,+BAwEtB"}
@@ -0,0 +1,39 @@
1
+ import { useMemo, useState } from "react";
2
+ import { groupEventsByDate, getMonthDays, getWeekDays } from "./page-calendar.utils";
3
+ import { CalendarHeader } from "./calendar-header";
4
+ import { MonthView } from "./month-view";
5
+ import { WeekView } from "./week-view";
6
+ import { DayView } from "./day-view";
7
+ const noop = [];
8
+ export function PageCalendar({ events, filterArea, onAddEvent, defaultDate, onSlotClick, getFilterId, renderEvent, onEventClick, filters = noop, defaultView = "month", onChangeFilters: onActiveFiltersChange, }) {
9
+ const [currentView, setCurrentView] = useState(defaultView);
10
+ const [currentDate, setCurrentDate] = useState(() => defaultDate ?? new Date());
11
+ const [internalFilters, setInternalFilters] = useState(filters);
12
+ const toggleFilter = (id) => {
13
+ setInternalFilters((prev) => {
14
+ const next = prev.map((f) => (f.id === id ? { ...f, enabled: !f.enabled } : f));
15
+ onActiveFiltersChange?.(next);
16
+ return next;
17
+ });
18
+ };
19
+ const filteredEvents = useMemo(() => {
20
+ if (filters.length === 0)
21
+ return events;
22
+ const get = getFilterId ?? ((e) => e?.filterId);
23
+ return events.filter((e) => internalFilters.find((f) => f.id === get(e))?.enabled ?? true);
24
+ }, [events, internalFilters, filters]);
25
+ const eventsByDate = useMemo(() => groupEventsByDate(filteredEvents), [filteredEvents]);
26
+ const monthDays = useMemo(() => getMonthDays(currentDate), [currentDate]);
27
+ const weekDays = useMemo(() => getWeekDays(currentDate), [currentDate]);
28
+ const handleEventClick = (event) => onEventClick?.(event);
29
+ const handleDayClick = (date) => {
30
+ setCurrentDate(date);
31
+ setCurrentView("day");
32
+ };
33
+ return (<div className="flex h-full flex-grow flex-col gap-4">
34
+ <CalendarHeader filters={internalFilters} filterArea={filterArea} onAddEvent={onAddEvent} currentDate={currentDate} currentView={currentView} setCurrentDate={setCurrentDate} setCurrentView={setCurrentView} onToggleFilter={toggleFilter}/>
35
+ {currentView === "month" && (<MonthView days={monthDays} currentDate={currentDate} eventsByDate={eventsByDate} onDayClick={handleDayClick} onEventClick={handleEventClick}/>)}
36
+ {currentView === "week" && (<WeekView days={weekDays} currentDate={currentDate} onSlotClick={onSlotClick} eventsByDate={eventsByDate} onEventClick={handleEventClick}/>)}
37
+ {currentView === "day" && (<DayView currentDate={currentDate} onSlotClick={onSlotClick} renderEvent={renderEvent} eventsByDate={eventsByDate} onDateChange={setCurrentDate} onEventClick={handleEventClick}/>)}
38
+ </div>);
39
+ }
@@ -0,0 +1,18 @@
1
+ import type { TagProps } from "../core/tag";
2
+ export type ViewMode = "month" | "week" | "day";
3
+ export type CalendarEventBase = {
4
+ date: Date;
5
+ id: string;
6
+ };
7
+ export type CalendarEvent<T extends CalendarEventBase = CalendarEventBase> = T & {
8
+ title: string;
9
+ filterId?: string;
10
+ className?: string;
11
+ };
12
+ export type CalendarFilter = {
13
+ id: string;
14
+ label: string;
15
+ enabled: boolean;
16
+ theme: TagProps["theme"];
17
+ };
18
+ //# sourceMappingURL=page-calendar.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-calendar.types.d.ts","sourceRoot":"","sources":["../../../src/components/page-calendar/page-calendar.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAEhD,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,IAAI,CAAC,GAAG;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;CAC5B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { CalendarEvent, CalendarEventBase } from "./page-calendar.types";
2
+ export declare function toDateKey(d: Date): string;
3
+ export declare function groupEventsByDate<T extends CalendarEventBase>(events: CalendarEvent<T>[]): Map<string, CalendarEvent<T>[]>;
4
+ export declare function getMonthDays(date: Date): Date[];
5
+ export declare function getWeekDays(date: Date): Date[];
6
+ export declare function getHourSlots(): number[];
7
+ export declare function formatEventTime(date: Date, locale?: string): string;
8
+ export declare function formatDay(date: Date, locale?: string): string;
9
+ export declare function formatWeekDay(date: Date, locale?: string): string;
10
+ export declare function formatWeekdayLong(date: Date, locale?: string): string;
11
+ export declare function formatWeekdayShort(date: Date, locale?: string): string;
12
+ export declare function formatMonthYear(date: Date, locale?: string): string;
13
+ export declare function formatMonthShort(date: Date, locale?: string): string;
14
+ export declare function formatHourLabel(hour: number, locale?: string): string;
15
+ export declare function formatFullDate(date: Date, locale?: string): string;
16
+ export declare function formatTime(date: Date, locale?: string): string;
17
+ export declare function getWeekNumber(date: Date): number;
18
+ //# sourceMappingURL=page-calendar.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-calendar.utils.d.ts","sourceRoot":"","sources":["../../../src/components/page-calendar/page-calendar.utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE9E,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,iBAAiB,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAY1H;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAQ/C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAO9C;AAED,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEhD"}
@@ -0,0 +1,71 @@
1
+ import { addDays, startOfMonth, startOfWeek, getISOWeek } from "date-fns";
2
+ export function toDateKey(d) {
3
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
4
+ }
5
+ export function groupEventsByDate(events) {
6
+ const map = new Map();
7
+ for (const event of events) {
8
+ const key = toDateKey(event.date);
9
+ const existing = map.get(key);
10
+ if (existing) {
11
+ existing.push(event);
12
+ }
13
+ else {
14
+ map.set(key, [event]);
15
+ }
16
+ }
17
+ return map;
18
+ }
19
+ export function getMonthDays(date) {
20
+ const monthStart = startOfMonth(date);
21
+ const gridStart = startOfWeek(monthStart, { weekStartsOn: 1 });
22
+ const days = [];
23
+ for (let i = 0; i < 42; i++) {
24
+ days.push(addDays(gridStart, i));
25
+ }
26
+ return days;
27
+ }
28
+ export function getWeekDays(date) {
29
+ const weekStart = startOfWeek(date, { weekStartsOn: 1 });
30
+ const days = [];
31
+ for (let i = 0; i < 7; i++) {
32
+ days.push(addDays(weekStart, i));
33
+ }
34
+ return days;
35
+ }
36
+ export function getHourSlots() {
37
+ return Array.from({ length: 24 }, (_, i) => i);
38
+ }
39
+ export function formatEventTime(date, locale) {
40
+ return new Intl.DateTimeFormat(locale, { hour: "2-digit", minute: "2-digit", hour12: false }).format(new Date(date));
41
+ }
42
+ export function formatDay(date, locale) {
43
+ return new Intl.DateTimeFormat(locale, { day: "numeric" }).format(date);
44
+ }
45
+ export function formatWeekDay(date, locale) {
46
+ return new Intl.DateTimeFormat(locale, { weekday: "short" }).format(date);
47
+ }
48
+ export function formatWeekdayLong(date, locale) {
49
+ return new Intl.DateTimeFormat(locale, { weekday: "long" }).format(date);
50
+ }
51
+ export function formatWeekdayShort(date, locale) {
52
+ return new Intl.DateTimeFormat(locale, { weekday: "short" }).format(date);
53
+ }
54
+ export function formatMonthYear(date, locale) {
55
+ return new Intl.DateTimeFormat(locale, { month: "long", year: "numeric" }).format(date);
56
+ }
57
+ export function formatMonthShort(date, locale) {
58
+ return new Intl.DateTimeFormat(locale, { month: "short" }).format(date);
59
+ }
60
+ export function formatHourLabel(hour, locale) {
61
+ return new Intl.DateTimeFormat(locale, { hour: "2-digit", minute: "2-digit", hour12: false }).format(new Date(0, 0, 0, hour));
62
+ }
63
+ export function formatFullDate(date, locale) {
64
+ return new Intl.DateTimeFormat(locale, { weekday: "long", month: "short", day: "numeric", year: "numeric" }).format(date);
65
+ }
66
+ export function formatTime(date, locale) {
67
+ return new Intl.DateTimeFormat(locale, { hour: "2-digit", minute: "2-digit", hour12: false }).format(date);
68
+ }
69
+ export function getWeekNumber(date) {
70
+ return getISOWeek(date);
71
+ }
@@ -0,0 +1,11 @@
1
+ import type { CalendarEvent } from "./page-calendar.types";
2
+ type WeekViewProps = {
3
+ days: Date[];
4
+ eventsByDate: Map<string, CalendarEvent[]>;
5
+ currentDate: Date;
6
+ onEventClick: (event: CalendarEvent) => void;
7
+ onSlotClick?: (date: Date) => void;
8
+ };
9
+ export declare function WeekView({ days, eventsByDate, onEventClick, onSlotClick }: WeekViewProps): import("react").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=week-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"week-view.d.ts","sourceRoot":"","sources":["../../../src/components/page-calendar/week-view.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAM3D,KAAK,aAAa,GAAG;IACjB,IAAI,EAAE,IAAI,EAAE,CAAC;IACb,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAC3C,WAAW,EAAE,IAAI,CAAC;IAClB,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;CACtC,CAAC;AAQF,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,aAAa,+BA2ExF"}
@@ -0,0 +1,61 @@
1
+ import { isToday } from "date-fns";
2
+ import { useEffect, useRef } from "react";
3
+ import { useLocale } from "../../hooks/use-locale";
4
+ import { EventPill } from "./event-pill";
5
+ import { getHourSlots, toDateKey, formatWeekdayShort, formatDay, formatHourLabel } from "./page-calendar.utils";
6
+ const HOUR_HEIGHT = 48;
7
+ function getTopOffset(event) {
8
+ const hour = event.date.getHours();
9
+ const minutes = event.date.getMinutes();
10
+ return hour * HOUR_HEIGHT + (minutes / 60) * HOUR_HEIGHT;
11
+ }
12
+ export function WeekView({ days, eventsByDate, onEventClick, onSlotClick }) {
13
+ const locale = useLocale();
14
+ const currentHourRef = useRef(null);
15
+ const scrollBodyRef = useRef(null);
16
+ const hours = getHourSlots();
17
+ useEffect(() => {
18
+ if (scrollBodyRef.current && currentHourRef.current) {
19
+ const top = currentHourRef.current.offsetTop;
20
+ scrollBodyRef.current.scrollTop = top - scrollBodyRef.current.clientHeight / 2;
21
+ }
22
+ }, []);
23
+ return (<div className="flex flex-1 flex-col overflow-hidden">
24
+ <div className="flex flex-shrink-0 border-b border-border">
25
+ <div className="w-[60px] flex-shrink-0"/>
26
+ {days.map((day, idx) => {
27
+ const isCurrentDay = isToday(day);
28
+ return (<div key={idx} className="flex-1 py-2 text-center text-xs font-medium text-muted-foreground">
29
+ <span className="block">{formatWeekdayShort(day, locale)}</span>
30
+ <span className={`inline-flex h-6 w-6 items-center justify-center rounded-full text-sm font-bold ${isCurrentDay ? "bg-primary text-primary-foreground" : "text-foreground"}`}>
31
+ {formatDay(day, locale)}
32
+ </span>
33
+ </div>);
34
+ })}
35
+ </div>
36
+ <div ref={scrollBodyRef} className="flex flex-1 items-start overflow-y-auto">
37
+ <div className="w-[60px] flex-shrink-0">
38
+ {hours.map((hour) => (<div key={hour} className="relative" style={{ height: HOUR_HEIGHT }}>
39
+ <span className="absolute -top-2.5 right-2 text-[10px] text-muted-foreground">
40
+ {hour === 0 ? "" : formatHourLabel(hour, locale)}
41
+ </span>
42
+ {hour === new Date().getHours() && <div ref={currentHourRef}/>}
43
+ </div>))}
44
+ </div>
45
+ {days.map((day, dayIdx) => {
46
+ const key = toDateKey(day);
47
+ const events = eventsByDate.get(key) || [];
48
+ return (<div key={dayIdx} className="relative flex-1 border-l border-card-border">
49
+ {hours.map((hour) => {
50
+ const slotDate = new Date(day);
51
+ slotDate.setHours(hour, 0, 0, 0);
52
+ return (<div key={hour} className="cursor-pointer border-b border-border/50 hover:bg-muted/20" style={{ height: HOUR_HEIGHT }} onClick={() => onSlotClick?.(slotDate)}/>);
53
+ })}
54
+ {events.map((event) => (<div key={event.id} className="absolute left-0.5 right-0.5" style={{ top: getTopOffset(event), height: HOUR_HEIGHT }} onClick={(e) => e.stopPropagation()}>
55
+ <EventPill event={event} onClick={() => onEventClick(event)}/>
56
+ </div>))}
57
+ </div>);
58
+ })}
59
+ </div>
60
+ </div>);
61
+ }
@@ -86,7 +86,7 @@ export const Filter = (props) => {
86
86
  props.set((prev) => prev.map((x) => (x.id === id ? { ...x, value } : x)));
87
87
  };
88
88
  return (<Fragment>
89
- <Dropdown arrow title={translation.tableFilterDropdownTitle} trigger={<span className="flex gap-1 items-center proportional-nums">
89
+ <Dropdown arrow title={translation.tableFilterDropdownTitle} trigger={<span className="flex items-center gap-1 proportional-nums">
90
90
  <ListFilterIcon size={14}/>
91
91
  {translation.tableFilterLabel} {props.filters.length === 0 ? "" : ` (${props.filters.length})`}
92
92
  </span>}>
@@ -97,7 +97,7 @@ export const Filter = (props) => {
97
97
  <Select options={props.options} title={translation.tableFilterColumnTitle} placeholder={translation.tableFilterColumnPlaceholder} value={filter.name} data-id={filter.id} onChange={onSelectProperty}/>
98
98
  <Select data-id={filter.id} onChange={onSelectOperation} value={filter.operation.value} options={options} title={translation.tableFilterOperatorTitle} placeholder={translation.tableFilterOperatorPlaceholder}/>
99
99
  <Input optionalText="" data-id={filter.id} onChange={onChangeValue} value={filter.value} type={filter.type} title={translation.tableFilterValueTitle} placeholder={translation.tableFilterValuePlaceholder}/>
100
- <div className="flex justify-center items-center mt-5">
100
+ <div className="mt-5 flex items-center justify-center">
101
101
  <button data-id={filter.id} type="button" onClick={onDelete}>
102
102
  <Trash2Icon className="text-danger" size={16}/>
103
103
  </button>
@@ -105,7 +105,7 @@ export const Filter = (props) => {
105
105
  </li>);
106
106
  })}
107
107
  <li>
108
- <button type="button" onClick={onAddFilter} className="flex gap-1 items-center text-primary">
108
+ <button type="button" onClick={onAddFilter} className="flex items-center gap-1 text-primary">
109
109
  <PlusIcon size={14}/> {translation.tableFilterNewFilter}
110
110
  </button>
111
111
  </li>
@@ -131,7 +131,7 @@ export const ColumnHeaderFilter = ({ filter, onDelete, set }) => {
131
131
  const value = valueFromType(e.target);
132
132
  set((prev) => prev.map((x) => (x.id === id ? { ...x, value } : x)));
133
133
  };
134
- return (<div className="flex flex-nowrap gap-4 items-center py-2">
134
+ return (<div className="flex flex-nowrap items-center gap-4 py-2">
135
135
  <Select data-id={filter.id} onChange={onSelectOperation} value={filter.operation.value} options={operators.options[filter.type]} title={translation.tableFilterColumnTitle} placeholder={translation.tableFilterColumnPlaceholder}/>
136
136
  <Input optionalText=" " data-id={filter.id} onChange={onChangeValue} value={filter.value} type={filter.type} title={translation.tableFilterValueTitle} placeholder={translation.tableFilterValueTitle}/>
137
137
  <button onClick={onDelete} data-id={filter.id} type="button" className="mt-4">
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/table/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAsB,MAAM,OAAO,CAAC;AAG3D,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,OAAO,EAAc,eAAe,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO,EAAyB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGzE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG;IACvH,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CACT,mBAAmB,CAAC,CAAC,CAAC,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAC7C,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC;CAC/C,CACF,CAAC;AASF,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,GAAG,EAAE,OAAO,UAAU,CAAC,CAAC,CAAC,gCAoHxD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/table/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAsB,MAAM,OAAO,CAAC;AAG3D,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,OAAO,EAAc,eAAe,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO,EAAyB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGzE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG;IACrH,IAAI,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CACH,mBAAmB,CAAC,CAAC,CAAC,GAAG;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAC7C,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC;CACjD,CACJ,CAAC;AASN,eAAO,MAAM,KAAK,GAAI,CAAC,SAAS,GAAG,EAAE,OAAO,UAAU,CAAC,CAAC,CAAC,gCAuHxD,CAAC"}
@@ -12,7 +12,7 @@ const compareAndExec = (prev, state, exec) => (prev === state ? undefined : exec
12
12
  export const Table = (props) => {
13
13
  const tweaks = useTweaks();
14
14
  const contextState = useMemo(() => ({
15
- sticky: props.sticky === undefined ? tweaks.table.sticky ?? undefined : props.sticky ?? undefined
15
+ sticky: props.sticky === undefined ? (tweaks.table.sticky ?? undefined) : (props.sticky ?? undefined),
16
16
  }), [props.sticky, tweaks.table.sticky]);
17
17
  const operations = props.operations ?? tweaks.table.operations ?? true;
18
18
  const optionCols = useMemo(() => createOptionCols(props.cols), [props.cols]);
@@ -48,13 +48,13 @@ export const Table = (props) => {
48
48
  dispatch.cols(props.cols);
49
49
  }, [props.cols]);
50
50
  return (<TableProvider value={contextState}>
51
- <AnimatePresence initial={false}>
52
- {operations ? (<Metadata cols={state.cols} rows={props.rows} options={optionCols} groups={state.groups} filters={state.filters} setCols={dispatch.cols} sorters={state.sorters} setGroups={dispatch.groups} setFilters={dispatch.filters} setSorters={dispatch.sorters} pagination={props.pagination ?? null} inlineFilter={props.inlineFilter ?? true} inlineSorter={props.inlineSorter ?? true}/>) : null}
53
- {state.groups.length === 0 ? (<InnerTable {...props} index={0} cols={state.cols} options={optionCols} groups={state.groups} filters={state.filters} optionCols={optionCols} setCols={dispatch.cols} sorters={state.sorters} setGroups={dispatch.groups} setFilters={dispatch.filters} setSorters={dispatch.sorters} onScrollEnd={props.onScrollEnd} pagination={props.pagination ?? null} inlineFilter={props.inlineFilter ?? true} inlineSorter={props.inlineSorter ?? true}/>) : (<div className="flex flex-wrap gap-4">
54
- {state.groups.map((group, index) => (<div className="min-w-full" key={`group-${group.groupId}`}>
55
- <InnerTable {...props} group={group} index={index} cols={state.cols} pagination={null} rows={group.rows} options={optionCols} groups={state.groups} filters={state.filters} optionCols={optionCols} setCols={dispatch.cols} sorters={state.sorters} setGroups={dispatch.groups} setFilters={dispatch.filters} setSorters={dispatch.sorters} onScrollEnd={props.onScrollEnd} inlineFilter={props.inlineFilter ?? true} inlineSorter={props.inlineSorter ?? true}/>
56
- </div>))}
57
- </div>)}
58
- </AnimatePresence>
59
- </TableProvider>);
51
+ <AnimatePresence initial={false}>
52
+ {operations ? (<Metadata cols={state.cols} rows={props.rows} options={optionCols} groups={state.groups} filters={state.filters} setCols={dispatch.cols} sorters={state.sorters} setGroups={dispatch.groups} setFilters={dispatch.filters} setSorters={dispatch.sorters} pagination={props.pagination ?? null} inlineFilter={props.inlineFilter ?? true} inlineSorter={props.inlineSorter ?? true}/>) : null}
53
+ {state.groups.length === 0 ? (<InnerTable {...props} index={0} cols={state.cols} options={optionCols} groups={state.groups} filters={state.filters} optionCols={optionCols} setCols={dispatch.cols} sorters={state.sorters} setGroups={dispatch.groups} setFilters={dispatch.filters} setSorters={dispatch.sorters} onScrollEnd={props.onScrollEnd} pagination={props.pagination ?? null} inlineFilter={props.inlineFilter ?? true} inlineSorter={props.inlineSorter ?? true}/>) : (<div className="flex flex-wrap gap-4">
54
+ {state.groups.map((group, index) => (<div className="min-w-full" key={`group-${group.groupId}`}>
55
+ <InnerTable {...props} group={group} index={index} cols={state.cols} pagination={null} rows={group.rows} options={optionCols} groups={state.groups} filters={state.filters} optionCols={optionCols} setCols={dispatch.cols} sorters={state.sorters} setGroups={dispatch.groups} setFilters={dispatch.filters} setSorters={dispatch.sorters} onScrollEnd={props.onScrollEnd} inlineFilter={props.inlineFilter ?? true} inlineSorter={props.inlineSorter ?? true}/>
56
+ </div>))}
57
+ </div>)}
58
+ </AnimatePresence>
59
+ </TableProvider>);
60
60
  };
@@ -1 +1 @@
1
- {"version":3,"file":"inner-table.d.ts","sourceRoot":"","sources":["../../../src/components/table/inner-table.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,cAAc,EAA2B,cAAc,EAAwC,MAAM,OAAO,CAAC;AAI7H,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,OAAO,EAAa,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAIzE,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,GAAG,IAAI,cAAc,CAAC,gBAAgB,CAAC,GAC3E,mBAAmB,CAAC,CAAC,CAAC,GAAG;IACvB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAC7C,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7C,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACjE,CAAC;AA8FJ,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,GAAG,EAAE,0HAYvC,eAAe,CAAC,CAAC,CAAC,sBA0EpB,CAAC"}
1
+ {"version":3,"file":"inner-table.d.ts","sourceRoot":"","sources":["../../../src/components/table/inner-table.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,cAAc,EAA2B,cAAc,EAAwC,MAAM,OAAO,CAAC;AAI7H,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,OAAO,EAAa,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAIzE,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,GAAG,IAAI,cAAc,CAAC,gBAAgB,CAAC,GACzE,mBAAmB,CAAC,CAAC,CAAC,GAAG;IACrB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAC7C,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7C,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACnE,CAAC;AAsFN,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,GAAG,EAAE,0HAYvC,eAAe,CAAC,CAAC,CAAC,sBA0EpB,CAAC"}
@@ -13,32 +13,32 @@ import { useTable } from "./table.context";
13
13
  import { TableHeader } from "./thead";
14
14
  const TableBody = React.forwardRef(({ context, className = "", ...props }, ref) => {
15
15
  return (<tbody {...props} role="rowgroup" className={`divide-y divide-table-border ${className}`} ref={ref}>
16
- <AnimatePresence>{props.children}</AnimatePresence>
17
- </tbody>);
16
+ <AnimatePresence>{props.children}</AnimatePresence>
17
+ </tbody>);
18
18
  });
19
- const VirtualTable = React.forwardRef(({ context, className = "", ...props }, ref) => (<table {...props} role="table" ref={ref} style={{ ...props.style, "--table-cell-padding": "0.75rem" }} className={`table w-full table-fixed border-spacing-0 border-separate text-left ${className ?? ""}`}/>));
19
+ const VirtualTable = React.forwardRef(({ context, className = "", ...props }, ref) => (<table {...props} role="table" ref={ref} style={{ ...props.style, "--table-cell-padding": "0.75rem" }} className={`table w-full table-fixed border-separate border-spacing-0 text-left ${className ?? ""}`}/>));
20
20
  const Thead = React.forwardRef(({ context, ...props }, ref) => {
21
21
  const ctx = useTable();
22
22
  const style = {
23
23
  ...props?.style,
24
24
  top: Is.number(ctx.sticky) ? `${ctx.sticky}px` : undefined,
25
25
  };
26
- return (<thead {...props} ref={ref} style={style} role="rowgroup" className="hidden top-0 bg-transparent md:table-header-group group:sticky"/>);
26
+ return <thead {...props} ref={ref} style={style} role="rowgroup" className="group:sticky top-0 hidden bg-transparent md:table-header-group"/>;
27
27
  });
28
28
  const TRow = React.forwardRef(({ context, item, ...props }, ref) => {
29
29
  const contextProps = context?.getRowProps?.(item);
30
30
  const innerProps = { ...props, ...contextProps };
31
- return (<tr {...innerProps} role="row" ref={ref} className={`group-table-row pb-4 flex h-fit flex-col flex-wrap justify-center gap-1 md:table-row ${props?.className ?? ""}`}/>);
31
+ return (<tr {...innerProps} role="row" ref={ref} className={`group-table-row flex h-fit flex-col flex-wrap justify-center gap-1 pb-4 md:table-row ${props?.className ?? ""}`}/>);
32
32
  });
33
33
  const TFoot = React.forwardRef((props, ref) => {
34
34
  if (props.context.loadingMore) {
35
35
  return (<tfoot {...props} ref={ref} className="bg-card-background">
36
- <tr role="row" className="bg-card-background">
37
- <td colSpan={999} className="px-2 h-14 bg-card-background">
38
- <span className="block w-full h-2 rounded opacity-60 animate-pulse bg-foreground"/>
39
- </td>
40
- </tr>
41
- </tfoot>);
36
+ <tr role="row" className="bg-card-background">
37
+ <td colSpan={999} className="h-14 bg-card-background px-2">
38
+ <span className="block h-2 w-full animate-pulse rounded bg-foreground opacity-60"/>
39
+ </td>
40
+ </tr>
41
+ </tfoot>);
42
42
  }
43
43
  return null;
44
44
  });
@@ -50,7 +50,7 @@ const components = {
50
50
  TableBody: TableBody,
51
51
  };
52
52
  const loadingArray = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
53
- const EmptyContent = (props) => (<div className="flex justify-center items-center px-2 w-full h-48">{props.loading ? SkeletonCell : <Empty />}</div>);
53
+ const EmptyContent = (props) => (<div className="flex h-48 w-full items-center justify-center px-2">{props.loading ? SkeletonCell : <Empty />}</div>);
54
54
  const EmptyCell = () => <Fragment />;
55
55
  const emptyRows = [];
56
56
  export const InnerTable = ({ cols, filters, setCols, sorters, setFilters, setSorters, onScrollEnd, getScrollRef, pagination = null, useControl = false, ...props }) => {
@@ -95,10 +95,10 @@ export const InnerTable = ({ cols, filters, setCols, sorters, setFilters, setSor
95
95
  getRowProps: props.getRowProps,
96
96
  loadingMore: props.loadingMore,
97
97
  };
98
- return (<div className="flex relative flex-col w-full whitespace-nowrap rounded-lg group">
99
- <TableVirtuoso components={components} context={context} totalCount={rows.length} itemContent={empty ? EmptyCell : Row} data={empty ? emptyRows : rows} useWindowScroll={getScrollRef ? false : true} customScrollParent={getScrollRef ? getScrollRef() : undefined} fixedHeaderContent={() => (<TableHeader headers={cols} filters={filters} setCols={setCols} sorters={sorters} setFilters={setFilters} setSorters={setSorters} loading={!!props.loading} inlineFilter={props.inlineFilter} inlineSorter={props.inlineSorter}/>)}/>
100
- {empty ? <EmptyContent loading={props.loading}/> : null}
101
- <div aria-hidden="true" ref={ref} className="w-full h-0.5"/>
102
- {pagination !== null ? <Pagination {...pagination}/> : null}
103
- </div>);
98
+ return (<div className="group relative flex w-full flex-col whitespace-nowrap rounded-lg">
99
+ <TableVirtuoso components={components} context={context} totalCount={rows.length} itemContent={empty ? EmptyCell : Row} data={empty ? emptyRows : rows} useWindowScroll={getScrollRef ? false : true} customScrollParent={getScrollRef ? getScrollRef() : undefined} fixedHeaderContent={() => (<TableHeader headers={cols} filters={filters} setCols={setCols} sorters={sorters} setFilters={setFilters} setSorters={setSorters} loading={!!props.loading} inlineFilter={props.inlineFilter} inlineSorter={props.inlineSorter}/>)}/>
100
+ {empty ? <EmptyContent loading={props.loading}/> : null}
101
+ <div aria-hidden="true" ref={ref} className="h-0.5 w-full"/>
102
+ {pagination !== null ? <Pagination {...pagination}/> : null}
103
+ </div>);
104
104
  };
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/components/table/metadata.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAIlC,OAAO,EAAE,mBAAmB,EAAiB,MAAM,aAAa,CAAC;AAEjE,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,GAAG,EAAE,OAAO,mBAAmB,CAAC,CAAC,CAAC,gCA6CpE,CAAC"}
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/components/table/metadata.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAIlC,OAAO,EAAE,mBAAmB,EAAiB,MAAM,aAAa,CAAC;AAEjE,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,GAAG,EAAE,OAAO,mBAAmB,CAAC,CAAC,CAAC,gCAwCpE,CAAC"}
@@ -3,35 +3,34 @@ import { Group } from "./group";
3
3
  import { Sort } from "./sort";
4
4
  import { valueFromType } from "./table-lib";
5
5
  export const Metadata = (props) => (<header className="mb-1 min-w-full">
6
- <div className="flex flex-wrap gap-y-1 gap-x-4 justify-between items-center min-w-full">
7
- <div className="flex gap-4 py-2 whitespace-nowrap w-fit items-centeend">
8
- <span>
9
- <Filter cols={props.cols} options={props.options} filters={props.filters} set={props.setFilters}/>
10
- </span>
11
- <span>
12
- <Sort options={props.options} cols={props.cols} sorters={props.sorters} set={props.setSorters}/>
13
- </span>
14
- <span>
15
- <Group rows={props.rows} groups={props.groups} setGroups={props.setGroups} options={props.options} cols={props.cols}/>
16
- </span>
17
- </div>
18
- <ul className="flex flex-row flex-wrap flex-1 flex-grow gap-4 items-center w-full md:justify-end">
19
- {props.filters.map((x) => (<li key={`filter-table-${x.id}`} className="flex gap-1 items-center py-0.5 px-4 rounded-xl border border-card-border">
20
- <span>
21
- <span className="inline-block mr-2 rounded-full size-3 aspect-square bg-primary" aria-hidden="true"/>
22
- {x.label} {x.operation.label.toLowerCase()}:
23
- </span>
24
- <div className="relative w-min min-w-[1ch]">
25
- <span aria-hidden="true" className="invisible p-0 whitespace-pre">
26
- {x.value || " "}
27
- </span>
28
- <input type={x.type} value={x.value} className="absolute left-0 top-0 m-0 inline-block w-full bg-transparent p-0 placeholder-primary/70 outline-none [appearance:textfield] after:empty:text-primary/70 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none" onChange={(e) => {
6
+ <div className="flex min-w-full flex-wrap items-center justify-between gap-x-4 gap-y-1">
7
+ <div className="items-centeend flex w-fit gap-4 whitespace-nowrap py-2">
8
+ <span>
9
+ <Filter cols={props.cols} options={props.options} filters={props.filters} set={props.setFilters}/>
10
+ </span>
11
+ <span>
12
+ <Sort options={props.options} cols={props.cols} sorters={props.sorters} set={props.setSorters}/>
13
+ </span>
14
+ <span>
15
+ <Group rows={props.rows} groups={props.groups} setGroups={props.setGroups} options={props.options} cols={props.cols}/>
16
+ </span>
17
+ </div>
18
+ <ul className="flex w-full flex-1 flex-grow flex-row flex-wrap items-center gap-4 md:justify-end">
19
+ {props.filters.map((x) => (<li key={`filter-table-${x.id}`} className="flex items-center gap-1 rounded-xl border border-card-border px-4 py-0.5">
20
+ <span>
21
+ <span className="mr-2 inline-block aspect-square size-3 rounded-full bg-primary" aria-hidden="true"/>
22
+ {x.label} {x.operation.label.toLowerCase()}:
23
+ </span>
24
+ <div className="relative w-min min-w-[1ch]">
25
+ <span aria-hidden="true" className="invisible whitespace-pre p-0">
26
+ {x.value || " "}
27
+ </span>
28
+ <input type={x.type} value={x.value} className="absolute left-0 top-0 m-0 inline-block w-full bg-transparent p-0 placeholder-primary/70 outline-none [appearance:textfield] after:empty:text-primary/70 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none" onChange={(e) => {
29
29
  const value = valueFromType(e.target);
30
- props.setFilters((prev) => prev.map((item) => x.id === item.id
31
- ? { ...item, value, } : item));
30
+ props.setFilters((prev) => prev.map((item) => (x.id === item.id ? { ...item, value } : item)));
32
31
  }}/>
33
- </div>
34
- </li>))}
35
- </ul>
36
- </div>
37
- </header>);
32
+ </div>
33
+ </li>))}
34
+ </ul>
35
+ </div>
36
+ </header>);
@@ -31,7 +31,7 @@ export const Pagination = (pagination) => {
31
31
  const translation = useTranslations();
32
32
  const pageNavigation = useMemo(() => createPaginationItems(pagination.current, pagination.pages), [pagination.current, pagination.pages]);
33
33
  const hasNext = pagination.current < pagination.pages;
34
- return (<footer className="flex flex-wrap items-center justify-center gap-4 p-3 border-t-muted text-sm lg:flex-nowrap lg:justify-between">
34
+ return (<footer className="flex flex-wrap items-center justify-center gap-4 border-t-muted p-3 text-sm lg:flex-nowrap lg:justify-between">
35
35
  <p>
36
36
  <translation.tablePaginationFooter {...pagination} sizes={pagination.sizes} select={pagination.onChangeSize && Array.isArray(pagination.sizes) ? (<Fragment>
37
37
  <label htmlFor={id}>{translation.tablePaginationSelectLabel}</label>
@@ -1 +1 @@
1
- {"version":3,"file":"row.d.ts","sourceRoot":"","sources":["../../../src/components/table/row.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmE,MAAM,OAAO,CAAC;AAGxF,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAoB,GAAG,EAAa,MAAM,aAAa,CAAC;AAEjF,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;CACzC,CAAC;AA6CF,eAAO,MAAM,GAAG,GAAI,OAAO,MAAM,EAAE,KAAK,GAAG,EAAE,SAAS,kBAAkB,sBAwCvE,CAAC"}
1
+ {"version":3,"file":"row.d.ts","sourceRoot":"","sources":["../../../src/components/table/row.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmE,MAAM,OAAO,CAAC;AAGxF,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAoB,GAAG,EAAa,MAAM,aAAa,CAAC;AAEjF,KAAK,kBAAkB,GAAG;IACtB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;CAC3C,CAAC;AA6CF,eAAO,MAAM,GAAG,GAAI,OAAO,MAAM,EAAE,KAAK,GAAG,EAAE,SAAS,kBAAkB,sBA0CvE,CAAC"}